From c2639e464fc6215dddf13532c08ccea8b33d68f5 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 26 Dec 2024 16:14:29 -0800 Subject: [PATCH] Replacing some fixed lookup flags with specific constant flag This would make it easier to customize flags used on desktop icons Bug: 366237794 Flag: EXEMPT refactor Test: atest CacheLookupFlagTest Change-Id: I0f3f04ddbe73abea207a5b58a65714ff172b2726 --- .../launcher3/model/PredictionUpdateTask.java | 2 +- .../model/QuickstepModelDelegate.java | 26 ++++++++++++------- .../WidgetsPredicationUpdateTaskTest.java | 4 ++- .../android/launcher3/LauncherSettings.java | 8 ++++++ .../android/launcher3/icons/IconCache.java | 15 ++++++----- .../model/AddWorkspaceItemsTask.java | 4 ++- .../launcher3/model/ItemInstallQueue.java | 4 +-- .../android/launcher3/model/LoaderTask.java | 6 ++--- .../launcher3/model/data/AppPairInfo.kt | 6 ++--- .../icons/cache/CacheLookupFlagTest.kt | 21 +++++++++++++++ 10 files changed, 68 insertions(+), 28 deletions(-) diff --git a/quickstep/src/com/android/launcher3/model/PredictionUpdateTask.java b/quickstep/src/com/android/launcher3/model/PredictionUpdateTask.java index cd08897320..fd71151bbe 100644 --- a/quickstep/src/com/android/launcher3/model/PredictionUpdateTask.java +++ b/quickstep/src/com/android/launcher3/model/PredictionUpdateTask.java @@ -96,7 +96,7 @@ public class PredictionUpdateTask implements ModelUpdateTask { itemInfo = apps.data.stream() .filter(info -> user.equals(info.user) && cn.equals(info.componentName)) .map(ai -> { - app.getIconCache().getTitleAndIcon(ai, DEFAULT_LOOKUP_FLAG); + app.getIconCache().getTitleAndIcon(ai, mPredictorState.lookupFlag); return ai.makeWorkspaceItem(context); }) .findAny() diff --git a/quickstep/src/com/android/launcher3/model/QuickstepModelDelegate.java b/quickstep/src/com/android/launcher3/model/QuickstepModelDelegate.java index daba0dd68e..25e181312d 100644 --- a/quickstep/src/com/android/launcher3/model/QuickstepModelDelegate.java +++ b/quickstep/src/com/android/launcher3/model/QuickstepModelDelegate.java @@ -23,6 +23,7 @@ import static com.android.launcher3.LauncherPrefs.nonRestorableItem; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT_PREDICTION; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_PREDICTION; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_WIDGETS_PREDICTION; +import static com.android.launcher3.LauncherSettings.Favorites.DESKTOP_ICON_FLAG; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT; import static com.android.launcher3.hybridhotseat.HotseatPredictionModel.convertDataModelToAppTargetBundle; @@ -60,6 +61,7 @@ import com.android.launcher3.ConstantItem; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherPrefs; +import com.android.launcher3.icons.cache.CacheLookupFlag; import com.android.launcher3.logger.LauncherAtom; import com.android.launcher3.logging.InstanceId; import com.android.launcher3.logging.InstanceIdSequence; @@ -102,14 +104,14 @@ public class QuickstepModelDelegate extends ModelDelegate { nonRestorableItem("LAST_SNAPSHOT_TIME_MILLIS", 0L, ENCRYPTED); @VisibleForTesting - final PredictorState mAllAppsState = - new PredictorState(CONTAINER_PREDICTION, "all_apps_predictions"); + final PredictorState mAllAppsState = new PredictorState( + CONTAINER_PREDICTION, "all_apps_predictions", DEFAULT_LOOKUP_FLAG); @VisibleForTesting - final PredictorState mHotseatState = - new PredictorState(CONTAINER_HOTSEAT_PREDICTION, "hotseat_predictions"); + final PredictorState mHotseatState = new PredictorState( + CONTAINER_HOTSEAT_PREDICTION, "hotseat_predictions", DESKTOP_ICON_FLAG); @VisibleForTesting - final PredictorState mWidgetsRecommendationState = - new PredictorState(CONTAINER_WIDGETS_PREDICTION, "widgets_prediction"); + final PredictorState mWidgetsRecommendationState = new PredictorState( + CONTAINER_WIDGETS_PREDICTION, "widgets_prediction", DESKTOP_ICON_FLAG); private final InvariantDeviceProfile mIDP; private final AppEventProducer mAppEventProducer; @@ -153,7 +155,7 @@ public class QuickstepModelDelegate extends ModelDelegate { WorkspaceItemFactory factory = new WorkspaceItemFactory(mApp, ums, mPmHelper, pinnedShortcuts, numColumns, - state.containerId); + state.containerId, state.lookupFlag); FixedContainerItems fci = new FixedContainerItems(state.containerId, state.storage.read(mApp.getContext(), factory, ums.allUsers::get)); mDataModel.extraItems.put(state.containerId, fci); @@ -479,13 +481,15 @@ public class QuickstepModelDelegate extends ModelDelegate { public final int containerId; public final PersistedItemArray storage; public AppPredictor predictor; + public CacheLookupFlag lookupFlag; private List mLastTargets; - PredictorState(int containerId, String storageName) { + PredictorState(int containerId, String storageName, CacheLookupFlag lookupFlag) { this.containerId = containerId; storage = new PersistedItemArray<>(storageName); mLastTargets = Collections.emptyList(); + this.lookupFlag = lookupFlag; } public void destroyPredictor() { @@ -538,18 +542,20 @@ public class QuickstepModelDelegate extends ModelDelegate { private final Map mPinnedShortcuts; private final int mMaxCount; private final int mContainer; + private final CacheLookupFlag mLookupFlag; private int mReadCount = 0; protected WorkspaceItemFactory(LauncherAppState appState, UserManagerState ums, PackageManagerHelper pmHelper, Map pinnedShortcuts, - int maxCount, int container) { + int maxCount, int container, CacheLookupFlag lookupFlag) { mAppState = appState; mUMS = ums; mPmHelper = pmHelper; mPinnedShortcuts = pinnedShortcuts; mMaxCount = maxCount; mContainer = container; + mLookupFlag = lookupFlag; } @Nullable @@ -573,7 +579,7 @@ public class QuickstepModelDelegate extends ModelDelegate { mPmHelper, mUMS.isUserQuiet(user)); info.container = mContainer; - mAppState.getIconCache().getTitleAndIcon(info, lai, DEFAULT_LOOKUP_FLAG); + mAppState.getIconCache().getTitleAndIcon(info, lai, mLookupFlag); mReadCount++; return info.makeWorkspaceItem(mAppState.getContext()); } diff --git a/quickstep/tests/src/com/android/launcher3/model/WidgetsPredicationUpdateTaskTest.java b/quickstep/tests/src/com/android/launcher3/model/WidgetsPredicationUpdateTaskTest.java index 1c4ce74349..fa2eb1ee14 100644 --- a/quickstep/tests/src/com/android/launcher3/model/WidgetsPredicationUpdateTaskTest.java +++ b/quickstep/tests/src/com/android/launcher3/model/WidgetsPredicationUpdateTaskTest.java @@ -20,6 +20,7 @@ import static android.content.pm.ApplicationInfo.FLAG_INSTALLED; import static android.os.Process.myUserHandle; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_WIDGETS_PREDICTION; +import static com.android.launcher3.icons.cache.CacheLookupFlag.DEFAULT_LOOKUP_FLAG; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; import static com.android.launcher3.util.TestUtil.runOnExecutorSync; @@ -277,7 +278,8 @@ public final class WidgetsPredicationUpdateTaskTest { private WidgetsPredictionUpdateTask newWidgetsPredicationTask(List appTargets) { return new WidgetsPredictionUpdateTask( - new PredictorState(CONTAINER_WIDGETS_PREDICTION, "test_widgets_prediction"), + new PredictorState(CONTAINER_WIDGETS_PREDICTION, "test_widgets_prediction", + DEFAULT_LOOKUP_FLAG), appTargets); } diff --git a/src/com/android/launcher3/LauncherSettings.java b/src/com/android/launcher3/LauncherSettings.java index 1d2d1611de..5dc5d31ceb 100644 --- a/src/com/android/launcher3/LauncherSettings.java +++ b/src/com/android/launcher3/LauncherSettings.java @@ -19,12 +19,15 @@ package com.android.launcher3; import static android.util.Base64.NO_PADDING; import static android.util.Base64.NO_WRAP; +import static com.android.launcher3.icons.cache.CacheLookupFlag.DEFAULT_LOOKUP_FLAG; + import android.database.sqlite.SQLiteDatabase; import android.provider.BaseColumns; import android.util.Base64; import androidx.annotation.NonNull; +import com.android.launcher3.icons.cache.CacheLookupFlag; import com.android.launcher3.model.data.ItemInfo; import java.util.LinkedHashMap; @@ -352,6 +355,11 @@ public class LauncherSettings { public static String getColumns(long profileId) { return String.join(", ", getColumnsToTypes(profileId).keySet()); } + + /** + * Lookup flag to be used for items which are visible on the home screen + */ + public static final CacheLookupFlag DESKTOP_ICON_FLAG = DEFAULT_LOOKUP_FLAG; } /** diff --git a/src/com/android/launcher3/icons/IconCache.java b/src/com/android/launcher3/icons/IconCache.java index 0ebd69f9c3..88a60ea38d 100644 --- a/src/com/android/launcher3/icons/IconCache.java +++ b/src/com/android/launcher3/icons/IconCache.java @@ -349,10 +349,10 @@ public class IconCache extends BaseIconCache { * * @param iconRequestInfos List of IconRequestInfos representing titles and icons to query. * @param user UserHandle all the given iconRequestInfos share - * @param useLowResIcons whether we should exclude the icon column from the sql results. + * @param lookupFlag what flags to use when loading the icon. */ private Cursor createBulkQueryCursor( - List> iconRequestInfos, UserHandle user, boolean useLowResIcons) + List> iconRequestInfos, UserHandle user, CacheLookupFlag lookupFlag) throws SQLiteException { String[] queryParams = Stream.concat( iconRequestInfos.stream() @@ -365,7 +365,7 @@ public class IconCache extends BaseIconCache { ",", Collections.nCopies(queryParams.length - 1, "?")); return iconDb.query( - useLowResIcons ? COLUMNS_LOW_RES : COLUMNS_HIGH_RES, + toLookupColumns(lookupFlag), COLUMN_COMPONENT + " IN ( " + componentNameQuery + " )" + " AND " + COLUMN_USER + " = ?", @@ -423,10 +423,11 @@ public class IconCache extends BaseIconCache { List> filteredList, Map>> duplicateIconRequestsMap) { Trace.beginSection("loadIconSubsectionWithDatabase"); + CacheLookupFlag lookupFlag = DEFAULT_LOOKUP_FLAG.withUseLowRes(sectionKey.second); try (Cursor c = createBulkQueryCursor( filteredList, /* user = */ sectionKey.first, - /* useLowResIcons = */ sectionKey.second)) { + lookupFlag)) { // Database title and icon loading int componentNameColumnIndex = c.getColumnIndexOrThrow(COLUMN_COMPONENT); while (c.moveToNext()) { @@ -442,7 +443,7 @@ public class IconCache extends BaseIconCache { /* user = */ sectionKey.first, () -> duplicateIconRequests.get(0).launcherActivityInfo, LauncherActivityCachingLogic.INSTANCE, - DEFAULT_LOOKUP_FLAG.withUseLowRes(sectionKey.second), + lookupFlag, c); for (IconRequestInfo iconRequest : duplicateIconRequests) { @@ -519,7 +520,7 @@ public class IconCache extends BaseIconCache { @NonNull final PackageItemInfo infoInOut, @NonNull CacheLookupFlag lookupFlag) { CacheEntry entry = getEntryForPackageLocked( - infoInOut.packageName, infoInOut.user, lookupFlag.useLowRes()); + infoInOut.packageName, infoInOut.user, lookupFlag); applyCacheEntry(entry, infoInOut); if (infoInOut.widgetCategory == NO_CATEGORY) { return; @@ -593,7 +594,7 @@ public class IconCache extends BaseIconCache { @VisibleForTesting synchronized boolean isItemInDb(ComponentKey cacheKey) { - return getEntryFromDBLocked(cacheKey, new CacheEntry(), false); + return getEntryFromDBLocked(cacheKey, new CacheEntry(), DEFAULT_LOOKUP_FLAG); } /** diff --git a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java index b936adf22c..ddbbdc722a 100644 --- a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java +++ b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java @@ -15,6 +15,8 @@ */ package com.android.launcher3.model; +import static com.android.launcher3.LauncherSettings.Favorites.DESKTOP_ICON_FLAG; + import android.content.Context; import android.content.Intent; import android.content.pm.LauncherActivityInfo; @@ -194,7 +196,7 @@ public class AddWorkspaceItemsTask implements ModelUpdateTask { WorkspaceItemInfo wii = (WorkspaceItemInfo) itemInfo; wii.title = ""; wii.bitmap = cache.getDefaultIcon(item.user); - cache.getTitleAndIcon(wii, wii.getMatchingLookupFlag()); + cache.getTitleAndIcon(wii, DESKTOP_ICON_FLAG); } } diff --git a/src/com/android/launcher3/model/ItemInstallQueue.java b/src/com/android/launcher3/model/ItemInstallQueue.java index c4f222fc38..8acd7e22fc 100644 --- a/src/com/android/launcher3/model/ItemInstallQueue.java +++ b/src/com/android/launcher3/model/ItemInstallQueue.java @@ -18,10 +18,10 @@ package com.android.launcher3.model; import static android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID; +import static com.android.launcher3.LauncherSettings.Favorites.DESKTOP_ICON_FLAG; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT; -import static com.android.launcher3.icons.cache.CacheLookupFlag.DEFAULT_LOOKUP_FLAG; import static com.android.launcher3.model.data.AppInfo.makeLaunchIntent; import static com.android.launcher3.model.data.ItemInfoWithIcon.FLAG_ARCHIVED; import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; @@ -310,7 +310,7 @@ public class ItemInstallQueue { } LauncherAppState.getInstance(context).getIconCache() .getTitleAndIcon(si, () -> lai, - DEFAULT_LOOKUP_FLAG.withUsePackageIcon(usePackageIcon)); + DESKTOP_ICON_FLAG.withUsePackageIcon(usePackageIcon)); return Pair.create(si, null); } case ITEM_TYPE_DEEP_SHORTCUT: { diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java index bc0d776f99..4e57944f98 100644 --- a/src/com/android/launcher3/model/LoaderTask.java +++ b/src/com/android/launcher3/model/LoaderTask.java @@ -23,9 +23,9 @@ import static com.android.launcher3.Flags.enableSmartspaceRemovalToggle; import static com.android.launcher3.Flags.enableTieredWidgetsByDefaultInPicker; import static com.android.launcher3.LauncherPrefs.IS_FIRST_LOAD_AFTER_RESTORE; import static com.android.launcher3.LauncherPrefs.SHOULD_SHOW_SMARTSPACE; +import static com.android.launcher3.LauncherSettings.Favorites.DESKTOP_ICON_FLAG; import static com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME; import static com.android.launcher3.icons.CacheableShortcutInfo.convertShortcutsToCacheableShortcuts; -import static com.android.launcher3.icons.cache.CacheLookupFlag.DEFAULT_LOOKUP_FLAG; import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_HAS_SHORTCUT_PERMISSION; import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_PRIVATE_PROFILE_QUIET_MODE_ENABLED; import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_QUIET_MODE_CHANGE_PERMISSION; @@ -603,10 +603,10 @@ public class LoaderTask implements Runnable { info.rank = rank; if (info instanceof WorkspaceItemInfo wii - && wii.getMatchingLookupFlag().useLowRes() + && wii.getMatchingLookupFlag().isVisuallyLessThan(DESKTOP_ICON_FLAG) && wii.itemType == Favorites.ITEM_TYPE_APPLICATION && verifiers.stream().anyMatch(it -> it.isItemInPreview(info.rank))) { - mIconCache.getTitleAndIcon(wii, DEFAULT_LOOKUP_FLAG); + mIconCache.getTitleAndIcon(wii, DESKTOP_ICON_FLAG); } else if (info instanceof AppPairInfo api) { api.fetchHiResIconsIfNeeded(mIconCache); } diff --git a/src/com/android/launcher3/model/data/AppPairInfo.kt b/src/com/android/launcher3/model/data/AppPairInfo.kt index 073d0e0efe..e620ac9de9 100644 --- a/src/com/android/launcher3/model/data/AppPairInfo.kt +++ b/src/com/android/launcher3/model/data/AppPairInfo.kt @@ -18,9 +18,9 @@ package com.android.launcher3.model.data import android.content.Context import com.android.launcher3.LauncherSettings +import com.android.launcher3.LauncherSettings.Favorites.DESKTOP_ICON_FLAG import com.android.launcher3.R import com.android.launcher3.icons.IconCache -import com.android.launcher3.icons.cache.CacheLookupFlag.Companion.DEFAULT_LOOKUP_FLAG import com.android.launcher3.logger.LauncherAtom import com.android.launcher3.views.ActivityContext @@ -82,8 +82,8 @@ class AppPairInfo() : CollectionInfo() { fun fetchHiResIconsIfNeeded(iconCache: IconCache) { getAppContents() .stream() - .filter { it.matchingLookupFlag.useLowRes() } - .forEach { member -> iconCache.getTitleAndIcon(member, DEFAULT_LOOKUP_FLAG) } + .filter { it.matchingLookupFlag.isVisuallyLessThan(DESKTOP_ICON_FLAG) } + .forEach { member -> iconCache.getTitleAndIcon(member, DESKTOP_ICON_FLAG) } } /** diff --git a/tests/multivalentTests/src/com/android/launcher3/icons/cache/CacheLookupFlagTest.kt b/tests/multivalentTests/src/com/android/launcher3/icons/cache/CacheLookupFlagTest.kt index 7b1851d3ee..8218181468 100644 --- a/tests/multivalentTests/src/com/android/launcher3/icons/cache/CacheLookupFlagTest.kt +++ b/tests/multivalentTests/src/com/android/launcher3/icons/cache/CacheLookupFlagTest.kt @@ -78,4 +78,25 @@ class CacheLookupFlagTest { assertTrue(flag.useLowRes()) assertFalse(flag.usePackageIcon()) } + + @Test + fun `isVisuallyLessThan does not depend on package icon`() { + assertFalse(DEFAULT_LOOKUP_FLAG.isVisuallyLessThan(DEFAULT_LOOKUP_FLAG)) + assertFalse( + DEFAULT_LOOKUP_FLAG.withUsePackageIcon().isVisuallyLessThan(DEFAULT_LOOKUP_FLAG) + ) + assertFalse( + DEFAULT_LOOKUP_FLAG.isVisuallyLessThan(DEFAULT_LOOKUP_FLAG.withUsePackageIcon()) + ) + } + + @Test + fun `isVisuallyLessThan depends on low res`() { + assertTrue(DEFAULT_LOOKUP_FLAG.withUseLowRes().isVisuallyLessThan(DEFAULT_LOOKUP_FLAG)) + assertFalse(DEFAULT_LOOKUP_FLAG.isVisuallyLessThan(DEFAULT_LOOKUP_FLAG.withUseLowRes())) + assertTrue( + DEFAULT_LOOKUP_FLAG.withUseLowRes() + .isVisuallyLessThan(DEFAULT_LOOKUP_FLAG.withUsePackageIcon()) + ) + } }