diff options
author | Anushree Ganjam <ganjam@google.com> | 2023-05-18 22:03:16 +0000 |
---|---|---|
committer | Anushree Ganjam <ganjam@google.com> | 2023-06-01 22:45:19 +0000 |
commit | 97434eea536259cab0615910b11865f4d911839a (patch) | |
tree | 53407acdf73efcbcae1c7858e4958a6ee8279cfa /src | |
parent | 57eaf86f8ded70c9bb448459e33621c4696a8755 (diff) | |
download | Launcher3-97434eea536259cab0615910b11865f4d911839a.tar.gz |
Add UID in AppInfo.
Create a reverse hashmap of PackageUserKey to Uid in AllAppsStore for
faster lookup of uid based on packageName and userHandle.
Log Uid in Impression Logging.
Bug: 282849559
Test: Manual. See various usecases documented in http://shortn/_UcvAYOmLIP
Flag: NA
Change-Id: I416426214f6b6efc45f7d4c0433bbbfca9056adf
Diffstat (limited to 'src')
8 files changed, 84 insertions, 10 deletions
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 0b75c4509e..098a76f2c5 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -133,6 +133,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.annotation.StringRes; +import androidx.annotation.UiThread; import androidx.annotation.VisibleForTesting; import com.android.launcher3.DropTarget.DragObject; @@ -205,6 +206,7 @@ import com.android.launcher3.util.LockedUserState; import com.android.launcher3.util.OnboardingPrefs; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.PendingRequestArgs; +import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.RunnableList; import com.android.launcher3.util.SafeCloseable; import com.android.launcher3.util.ScreenOnTracker; @@ -246,6 +248,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.function.Predicate; import java.util.function.Supplier; @@ -2970,8 +2973,12 @@ public class Launcher extends StatefulActivity<LauncherState> */ @Override @TargetApi(Build.VERSION_CODES.S) - public void bindAllApplications(AppInfo[] apps, int flags) { - mAppsView.getAppsStore().setApps(apps, flags); + @UiThread + public void bindAllApplications(AppInfo[] apps, int flags, + Map<PackageUserKey, Integer> packageUserKeytoUidMap) { + Preconditions.assertUIThread(); + AllAppsStore appsStore = mAppsView.getAppsStore(); + appsStore.setApps(apps, flags, packageUserKeytoUidMap); PopupContainerWithArrow.dismissInvalidPopup(this); if (Utilities.ATLEAST_S) { Trace.endAsyncSection(DISPLAY_ALL_APPS_TRACE_METHOD_NAME, diff --git a/src/com/android/launcher3/allapps/AllAppsStore.java b/src/com/android/launcher3/allapps/AllAppsStore.java index a977b3a2d9..06af970cfc 100644 --- a/src/com/android/launcher3/allapps/AllAppsStore.java +++ b/src/com/android/launcher3/allapps/AllAppsStore.java @@ -20,6 +20,7 @@ import static com.android.launcher3.model.data.AppInfo.EMPTY_ARRAY; import static com.android.launcher3.model.data.ItemInfoWithIcon.FLAG_SHOW_DOWNLOAD_PROGRESS_MASK; import static com.android.launcher3.testing.shared.TestProtocol.WORK_TAB_MISSING; +import android.os.UserHandle; import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -35,7 +36,9 @@ import com.android.launcher3.util.PackageUserKey; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; import java.util.function.Predicate; @@ -57,8 +60,8 @@ public class AllAppsStore { private final List<OnUpdateListener> mUpdateListeners = new CopyOnWriteArrayList<>(); private final ArrayList<ViewGroup> mIconContainers = new ArrayList<>(); + private Map<PackageUserKey, Integer> mPackageUserKeytoUidMap = Collections.emptyMap(); private int mModelFlags; - private int mDeferUpdatesFlags = 0; private boolean mUpdatePending = false; @@ -67,12 +70,21 @@ public class AllAppsStore { } /** - * Sets the current set of apps. + * Sets the current set of apps and sets mapping for {@link PackageUserKey} to Uid for + * the current set of apps. */ - public void setApps(AppInfo[] apps, int flags) { + public void setApps(AppInfo[] apps, int flags, Map<PackageUserKey, Integer> map) { mApps = apps; mModelFlags = flags; notifyUpdate(); + mPackageUserKeytoUidMap = map; + } + + /** + * Look up for Uid using package name and user handle for the current set of apps. + */ + public int lookUpForUid(String packageName, UserHandle user) { + return mPackageUserKeytoUidMap.getOrDefault(new PackageUserKey(packageName, user), -1); } /** diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java index 15f353827e..88d3ea4375 100644 --- a/src/com/android/launcher3/logging/StatsLogManager.java +++ b/src/com/android/launcher3/logging/StatsLogManager.java @@ -976,6 +976,14 @@ public class StatsLogManager implements ResourceBasedOverride { } /** + * Sets list of uid for each of {@link com.android.app.search.ResultType} that indicates + * package name for the impression event. + */ + default StatsImpressionLogger withUids(IntArray uid) { + return this; + } + + /** * Builds the final message and logs it as {@link EventEnum}. */ default void log(EventEnum event) { diff --git a/src/com/android/launcher3/model/BaseLauncherBinder.java b/src/com/android/launcher3/model/BaseLauncherBinder.java index 85def73885..dcd61a85be 100644 --- a/src/com/android/launcher3/model/BaseLauncherBinder.java +++ b/src/com/android/launcher3/model/BaseLauncherBinder.java @@ -23,6 +23,8 @@ import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; import android.os.Process; import android.util.Log; +import androidx.annotation.WorkerThread; + import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel.CallbackTask; @@ -39,15 +41,20 @@ import com.android.launcher3.util.IntArray; import com.android.launcher3.util.IntSet; import com.android.launcher3.util.LooperExecutor; import com.android.launcher3.util.LooperIdleLock; +import com.android.launcher3.util.PackageUserKey; +import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.RunnableList; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.concurrent.Executor; +import java.util.stream.Collectors; /** * Binds the results of {@link com.android.launcher3.model.LoaderTask} to the Callbacks objects. @@ -143,11 +150,18 @@ public abstract class BaseLauncherBinder { /** * Binds the all apps results from LoaderTask to the callbacks UX. */ + @WorkerThread public void bindAllApps() { + Preconditions.assertWorkerThread(); // shallow copy AppInfo[] apps = mBgAllAppsList.copyData(); int flags = mBgAllAppsList.getFlags(); - executeCallbacksTask(c -> c.bindAllApplications(apps, flags), mUiExecutor); + Map<PackageUserKey, Integer> packageUserKeytoUidMap = Arrays.stream(apps).collect( + Collectors.toMap( + appInfo -> new PackageUserKey(appInfo.componentName.getPackageName(), + appInfo.user), appInfo -> appInfo.uid, (a, b) -> a)); + executeCallbacksTask(c -> c.bindAllApplications(apps, flags, packageUserKeytoUidMap), + mUiExecutor); } /** diff --git a/src/com/android/launcher3/model/BaseModelUpdateTask.java b/src/com/android/launcher3/model/BaseModelUpdateTask.java index 44d32d902a..1ba015a63e 100644 --- a/src/com/android/launcher3/model/BaseModelUpdateTask.java +++ b/src/com/android/launcher3/model/BaseModelUpdateTask.java @@ -22,6 +22,7 @@ import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; @@ -35,11 +36,15 @@ import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.testing.shared.TestProtocol; import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.PackageUserKey; +import com.android.launcher3.util.Preconditions; import com.android.launcher3.widget.model.WidgetsListBaseEntry; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.concurrent.Executor; import java.util.function.Predicate; @@ -153,7 +158,9 @@ public abstract class BaseModelUpdateTask implements ModelUpdateTask { scheduleCallbackTask(c -> c.bindWorkspaceComponentsRemoved(matcher)); } + @WorkerThread public void bindApplicationsIfNeeded() { + Preconditions.assertWorkerThread(); boolean changeFlag = mAllAppsList.getAndResetChangeFlag(); if (TestProtocol.sDebugTracing) { Log.d(WORK_TAB_MISSING, "bindApplicationsIfNeeded changeFlag? " + @@ -162,7 +169,11 @@ public abstract class BaseModelUpdateTask implements ModelUpdateTask { if (changeFlag) { AppInfo[] apps = mAllAppsList.copyData(); int flags = mAllAppsList.getFlags(); - scheduleCallbackTask(c -> c.bindAllApplications(apps, flags)); + Map<PackageUserKey, Integer> packageUserKeytoUidMap = Arrays.stream(apps).collect( + Collectors.toMap( + appInfo -> new PackageUserKey(appInfo.componentName.getPackageName(), + appInfo.user), appInfo -> appInfo.uid, (a, b) -> a)); + scheduleCallbackTask(c -> c.bindAllApplications(apps, flags, packageUserKeytoUidMap)); } } } diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java index 0861e9d51a..d94df51c39 100644 --- a/src/com/android/launcher3/model/BgDataModel.java +++ b/src/com/android/launcher3/model/BgDataModel.java @@ -51,6 +51,7 @@ import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.IntArray; import com.android.launcher3.util.IntSet; import com.android.launcher3.util.IntSparseArrayMap; +import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.RunnableList; import com.android.launcher3.widget.model.WidgetsListBaseEntry; @@ -497,7 +498,9 @@ public class BgDataModel { */ default void bindExtraContainerItems(FixedContainerItems item) { } - default void bindAllApplications(AppInfo[] apps, int flags) { } + default void bindAllApplications(AppInfo[] apps, int flags, + Map<PackageUserKey, Integer> packageUserKeytoUidMap) { + } /** * Binds the cache of string resources diff --git a/src/com/android/launcher3/model/data/AppInfo.java b/src/com/android/launcher3/model/data/AppInfo.java index 34972e71ff..7e6cbef8d5 100644 --- a/src/com/android/launcher3/model/data/AppInfo.java +++ b/src/com/android/launcher3/model/data/AppInfo.java @@ -61,6 +61,13 @@ public class AppInfo extends ItemInfoWithIcon implements WorkspaceItemFactory { // Section name used for indexing. public String sectionName = ""; + /** + * The uid of the application. + * The kernel user-ID that has been assigned to this application. Currently this is not a unique + * ID (multiple applications can have the same uid). + */ + public int uid = -1; + public AppInfo() { itemType = LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; } @@ -87,6 +94,7 @@ public class AppInfo extends ItemInfoWithIcon implements WorkspaceItemFactory { if (quietModeEnabled) { runtimeStatusFlags |= FLAG_DISABLED_QUIET_USER; } + uid = info.getApplicationInfo().uid; updateRuntimeFlagsForActivityTarget(this, info); } @@ -95,6 +103,7 @@ public class AppInfo extends ItemInfoWithIcon implements WorkspaceItemFactory { componentName = info.componentName; title = Utilities.trim(info.title); intent = new Intent(info.intent); + uid = info.uid; } @VisibleForTesting diff --git a/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java b/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java index fcc62a705f..458f137949 100644 --- a/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java +++ b/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java @@ -26,6 +26,8 @@ import android.view.View.OnClickListener; import android.view.ViewAnimationUtils; import android.view.inputmethod.InputMethodManager; +import androidx.annotation.UiThread; + import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.BubbleTextView; @@ -38,6 +40,7 @@ import com.android.launcher3.LauncherPrefs; import com.android.launcher3.LauncherSettings; import com.android.launcher3.R; import com.android.launcher3.allapps.ActivityAllAppsContainerView; +import com.android.launcher3.allapps.AllAppsStore; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.dragndrop.DraggableView; @@ -54,10 +57,13 @@ import com.android.launcher3.touch.ItemClickHandler.ItemClickProxy; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.IntSet; import com.android.launcher3.util.OnboardingPrefs; +import com.android.launcher3.util.PackageUserKey; +import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.Themes; import com.android.launcher3.views.BaseDragLayer; import java.util.HashMap; +import java.util.Map; /** * Launcher activity for secondary displays @@ -291,9 +297,13 @@ public class SecondaryDisplayLauncher extends BaseDraggingActivity mPopupDataProvider.setDeepShortcutMap(deepShortcutMap); } + @UiThread @Override - public void bindAllApplications(AppInfo[] apps, int flags) { - mAppsView.getAppsStore().setApps(apps, flags); + public void bindAllApplications(AppInfo[] apps, int flags, + Map<PackageUserKey, Integer> packageUserKeytoUidMap) { + Preconditions.assertUIThread(); + AllAppsStore appsStore = mAppsView.getAppsStore(); + appsStore.setApps(apps, flags, packageUserKeytoUidMap); PopupContainerWithArrow.dismissInvalidPopup(this); } |