diff --git a/src/com/android/launcher3/AllAppsList.java b/src/com/android/launcher3/AllAppsList.java index 34a44fc052..2bf014ad55 100644 --- a/src/com/android/launcher3/AllAppsList.java +++ b/src/com/android/launcher3/AllAppsList.java @@ -65,13 +65,15 @@ public class AllAppsList { * * If the app is already in the list, doesn't add it. */ - public void add(AppInfo info) { + public void add(AppInfo info, LauncherActivityInfoCompat activityInfo) { if (!mAppFilter.shouldShowApp(info.componentName)) { return; } if (findActivity(data, info.componentName, info.user)) { return; } + mIconCache.getTitleAndIcon(info, activityInfo, true /* useLowResIcon */); + data.add(info); added.add(info); } @@ -101,7 +103,7 @@ public class AllAppsList { user); for (LauncherActivityInfoCompat info : matches) { - add(new AppInfo(context, info, user, mIconCache)); + add(new AppInfo(context, info, user), info); } } @@ -171,7 +173,7 @@ public class AllAppsList { info.getComponentName().getPackageName(), user, info.getComponentName().getClassName()); if (applicationInfo == null) { - add(new AppInfo(context, info, user, mIconCache)); + add(new AppInfo(context, info, user), info); } else { mIconCache.getTitleAndIcon(applicationInfo, info, true /* useLowResIcon */); modified.add(applicationInfo); diff --git a/src/com/android/launcher3/AppInfo.java b/src/com/android/launcher3/AppInfo.java index 9c9dcc5f91..9b23df391c 100644 --- a/src/com/android/launcher3/AppInfo.java +++ b/src/com/android/launcher3/AppInfo.java @@ -58,19 +58,12 @@ public class AppInfo extends ItemInfoWithIcon { /** * Must not hold the Context. */ - public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandle user, - IconCache iconCache) { - this(context, info, user, iconCache, - UserManagerCompat.getInstance(context).isQuietModeEnabled(user)); + public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandle user) { + this(context, info, user, UserManagerCompat.getInstance(context).isQuietModeEnabled(user)); } public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandle user, - IconCache iconCache, boolean quietModeEnabled) { - this(context, info, user, iconCache, quietModeEnabled, true /* useLowResIcon */); - } - - public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandle user, - IconCache iconCache, boolean quietModeEnabled, boolean useLowResIcon) { + boolean quietModeEnabled) { this.componentName = info.getComponentName(); this.container = ItemInfo.NO_ID; this.user = user; @@ -82,7 +75,6 @@ public class AppInfo extends ItemInfoWithIcon { } intent = makeLaunchIntent(context, info, user); - iconCache.getTitleAndIcon(this, info, useLowResIcon); } public AppInfo(AppInfo info) { diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index 7c50a5c2a0..603d25a740 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -52,6 +52,7 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.Provider; import com.android.launcher3.util.SQLiteCacheHelper; import com.android.launcher3.util.Thunk; @@ -188,7 +189,7 @@ public class IconCache { return getFullResDefaultActivityIcon(); } - private Bitmap makeDefaultIcon(UserHandle user) { + protected Bitmap makeDefaultIcon(UserHandle user) { Drawable unbadged = getFullResDefaultActivityIcon(); return LauncherIcons.createBadgedIconBitmap(unbadged, user, mContext); } @@ -517,6 +518,7 @@ public class IconCache { @NonNull ComponentName componentName, @NonNull Provider infoProvider, UserHandle user, boolean usePackageIcon, boolean useLowResIcon) { + Preconditions.assertWorkerThread(); ComponentKey cacheKey = new ComponentKey(componentName, user); CacheEntry entry = mCache.get(cacheKey); if (entry == null || (entry.isLowResIcon && !useLowResIcon)) { @@ -604,6 +606,7 @@ public class IconCache { */ private CacheEntry getEntryForPackageLocked(String packageName, UserHandle user, boolean useLowResIcon) { + Preconditions.assertWorkerThread(); ComponentKey cacheKey = getPackageKey(packageName, user); CacheEntry entry = mCache.get(cacheKey); diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index ecbfe38235..cba7cfe4f2 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -26,6 +26,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.os.Looper; import android.os.Parcelable; import android.os.Process; import android.os.UserHandle; @@ -436,10 +437,25 @@ public class InstallShortcutReceiver extends BroadcastReceiver { public ItemInfo getItemInfo() { if (activityInfo != null) { - return new AppInfo(mContext, activityInfo, user, - LauncherAppState.getInstance().getIconCache(), - UserManagerCompat.getInstance(mContext).isQuietModeEnabled(user), - false /* useLowResIcon */).makeShortcut(); + AppInfo appInfo = new AppInfo(mContext, activityInfo, user); + final LauncherAppState app = LauncherAppState.getInstance(); + // Set default values until proper values is loaded. + appInfo.title = ""; + appInfo.iconBitmap = app.getIconCache().getDefaultIcon(user); + final ShortcutInfo si = appInfo.makeShortcut(); + if (Looper.myLooper() == LauncherModel.getWorkerLooper()) { + app.getIconCache().getTitleAndIcon(si, activityInfo, false /* useLowResIcon */); + } else { + app.getModel().updateAndBindShortcutInfo(new Provider() { + @Override + public ShortcutInfo get() { + app.getIconCache().getTitleAndIcon( + si, activityInfo, false /* useLowResIcon */); + return si; + } + }); + } + return si; } else if (shortcutInfo != null) { return new ShortcutInfo(shortcutInfo, mContext); } else if (providerInfo != null) { diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 616b2c7dda..56892ff214 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -2029,7 +2029,7 @@ public class LauncherModel extends BroadcastReceiver for (int i = 0; i < apps.size(); i++) { LauncherActivityInfoCompat app = apps.get(i); // This builds the icon bitmaps. - mBgAllAppsList.add(new AppInfo(mContext, app, user, mIconCache, quietMode)); + mBgAllAppsList.add(new AppInfo(mContext, app, user, quietMode), app); } final ManagedProfileHeuristic heuristic = ManagedProfileHeuristic.get(mContext, user); @@ -2221,17 +2221,16 @@ public class LauncherModel extends BroadcastReceiver } /** - * Repopulates the shortcut info, possibly updating any icon already on the workspace. + * Utility method to update a shortcut on the background thread. */ - public void updateShortcutInfo(final ShortcutInfoCompat fullDetail, final ShortcutInfo info) { + public void updateAndBindShortcutInfo(final Provider shortcutProvider) { enqueueModelUpdateTask(new ExtendedModelTask() { @Override public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) { - info.updateFromDeepShortcutInfo(fullDetail, app.getContext()); - + ShortcutInfo info = shortcutProvider.get(); ArrayList update = new ArrayList<>(); update.add(info); - bindUpdatedShortcuts(update, fullDetail.getUserHandle()); + bindUpdatedShortcuts(update, info.user); } }); } diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutView.java b/src/com/android/launcher3/shortcuts/DeepShortcutView.java index 6796137894..04c71ecd2d 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutView.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutView.java @@ -34,6 +34,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.shortcuts.DeepShortcutsContainer.UnbadgedShortcutInfo; import com.android.launcher3.util.PillRevealOutlineProvider; import com.android.launcher3.util.PillWidthRevealOutlineProvider; +import com.android.launcher3.util.Provider; /** * A {@link android.widget.FrameLayout} that contains a {@link DeepShortcutView}. @@ -114,10 +115,17 @@ public class DeepShortcutView extends FrameLayout implements ValueAnimator.Anima * Returns the shortcut info that is suitable to be added on the homescreen */ public ShortcutInfo getFinalInfo() { - ShortcutInfo badged = new ShortcutInfo(mInfo); + final ShortcutInfo badged = new ShortcutInfo(mInfo); // Queue an update task on the worker thread. This ensures that the badged // shortcut eventually gets its icon updated. - Launcher.getLauncher(getContext()).getModel().updateShortcutInfo(mInfo.mDetail, badged); + Launcher.getLauncher(getContext()).getModel().updateAndBindShortcutInfo( + new Provider() { + @Override + public ShortcutInfo get() { + badged.updateFromDeepShortcutInfo(mInfo.mDetail, getContext()); + return badged; + } + }); return badged; } diff --git a/src/com/android/launcher3/util/ManagedProfileHeuristic.java b/src/com/android/launcher3/util/ManagedProfileHeuristic.java index ce42bcd60a..c27a3b5460 100644 --- a/src/com/android/launcher3/util/ManagedProfileHeuristic.java +++ b/src/com/android/launcher3/util/ManagedProfileHeuristic.java @@ -116,8 +116,9 @@ public class ManagedProfileHeuristic { .isQuietModeEnabled(user); for (int i = 0; i < count; i++) { LauncherActivityInstallInfo info = apps.get(i); - ShortcutInfo si = new AppInfo(mContext, info.info, user, mIconCache, - quietModeEnabled, false /* useLowResIcon */).makeShortcut(); + AppInfo appInfo = new AppInfo(mContext, info.info, user, quietModeEnabled); + mIconCache.getTitleAndIcon(appInfo, info.info, false /* useLowResIcon */); + ShortcutInfo si = appInfo.makeShortcut(); ((info.installTime <= folderCreationTime) ? workFolderApps : homescreenApps).add(si); } diff --git a/tests/res/raw/cache_data_updated_task_data.txt b/tests/res/raw/cache_data_updated_task_data.txt index 9095476f66..8199687090 100644 --- a/tests/res/raw/cache_data_updated_task_data.txt +++ b/tests/res/raw/cache_data_updated_task_data.txt @@ -22,7 +22,7 @@ bgItem s itemType=1 title=app4-shrt intent=component=app4/class1 id=8 bgItem s itemType=1 status=1 title=app3-shrt intent=component=app3/class3 id=9 bgItem s itemType=1 status=1 title=app5-shrt intent=component=app5/class1 id=10 -allApps componentName=app1/class1 -allApps componentName=app1/class2 -allApps componentName=app2/class1 -allApps componentName=app2/class2 \ No newline at end of file +allApps componentName=app1/class1 intent=component=app1/class1 +allApps componentName=app1/class2 intent=component=app1/class2 +allApps componentName=app2/class1 intent=component=app2/class1 +allApps componentName=app2/class2 intent=component=app2/class2 \ No newline at end of file diff --git a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java index 1d092ab043..3a27d0dbf0 100644 --- a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java +++ b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java @@ -13,6 +13,7 @@ import android.support.test.InstrumentationRegistry; import android.test.ProviderTestCase2; import com.android.launcher3.AllAppsList; +import com.android.launcher3.AppFilter; import com.android.launcher3.AppInfo; import com.android.launcher3.DeferredHandler; import com.android.launcher3.IconCache; @@ -76,7 +77,7 @@ public class BaseModelUpdateTaskTestCase extends ProviderTestCase2