summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSunny Goyal <sunnygoyal@google.com>2023-05-31 10:18:52 -0700
committerSunny Goyal <sunnygoyal@google.com>2023-05-31 23:21:13 +0000
commit41737b3e8bbe4c72ed8570771b7d64fdbcfcebbb (patch)
treee9210686cf5f11cc68c29c7b490dfd60c0e1e85c /src
parentc0f24b4e7ee7735c43d590724a6db5d6f8ec8acd (diff)
downloadLauncher3-41737b3e8bbe4c72ed8570771b7d64fdbcfcebbb.tar.gz
Fixing icon cache thrashing due to an unsupported icon
Bug: 284032965 Test: Verified by reproducing the use case Flag: N/A Change-Id: I835dd545a01eb2fd7990e0fd5ad51bac0e4b1f33
Diffstat (limited to 'src')
-rw-r--r--src/com/android/launcher3/icons/IconCache.java34
1 files changed, 23 insertions, 11 deletions
diff --git a/src/com/android/launcher3/icons/IconCache.java b/src/com/android/launcher3/icons/IconCache.java
index 1e3b0030b8..2f7f51e6f7 100644
--- a/src/com/android/launcher3/icons/IconCache.java
+++ b/src/com/android/launcher3/icons/IconCache.java
@@ -100,6 +100,7 @@ public class IconCache extends BaseIconCache {
private final UserCache mUserManager;
private final InstantAppResolver mInstantAppResolver;
private final IconProvider mIconProvider;
+ private final HandlerRunnable mCancelledRunnable;
private final SparseArray<BitmapInfo> mWidgetCategoryBitmapInfos;
@@ -117,6 +118,10 @@ public class IconCache extends BaseIconCache {
mInstantAppResolver = InstantAppResolver.newInstance(mContext);
mIconProvider = iconProvider;
mWidgetCategoryBitmapInfos = new SparseArray<>();
+
+ mCancelledRunnable = new HandlerRunnable(
+ mWorkerHandler, () -> null, MAIN_EXECUTOR, c -> { });
+ mCancelledRunnable.cancel();
}
@Override
@@ -172,23 +177,30 @@ public class IconCache extends BaseIconCache {
public HandlerRunnable updateIconInBackground(final ItemInfoUpdateReceiver caller,
final ItemInfoWithIcon info) {
Preconditions.assertUIThread();
+ Supplier<ItemInfoWithIcon> task;
+ if (info instanceof AppInfo || info instanceof WorkspaceItemInfo) {
+ task = () -> {
+ getTitleAndIcon(info, false);
+ return info;
+ };
+ } else if (info instanceof PackageItemInfo pii) {
+ task = () -> {
+ getTitleAndIconForApp(pii, false);
+ return pii;
+ };
+ } else {
+ Log.i(TAG, "Icon update not supported for "
+ + info == null ? "null" : info.getClass().getName());
+ return mCancelledRunnable;
+ }
+
if (mPendingIconRequestCount <= 0) {
MODEL_EXECUTOR.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
}
mPendingIconRequestCount++;
HandlerRunnable<ItemInfoWithIcon> request = new HandlerRunnable<>(mWorkerHandler,
- () -> {
- if (info instanceof AppInfo || info instanceof WorkspaceItemInfo) {
- getTitleAndIcon(info, false);
- } else if (info instanceof PackageItemInfo) {
- getTitleAndIconForApp((PackageItemInfo) info, false);
- }
- return info;
- },
- MAIN_EXECUTOR,
- caller::reapplyItemInfo,
- this::onIconRequestEnd);
+ task, MAIN_EXECUTOR, caller::reapplyItemInfo, this::onIconRequestEnd);
Utilities.postAsyncCallback(mWorkerHandler, request);
return request;
}