Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5cac07dd authored by Sunny Goyal's avatar Sunny Goyal Committed by Android Build Coastguard Worker
Browse files

Fixing icon cache thrashing due to an unsupported icon

Bug: 284032965
Test: Verified by reproducing the use case
Flag: N/A
(cherry picked from commit 41737b3e)
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:c42f37627c800c66974737e33eb4bf1a34dc04ce)
Merged-In: I835dd545a01eb2fd7990e0fd5ad51bac0e4b1f33
Change-Id: I835dd545a01eb2fd7990e0fd5ad51bac0e4b1f33
parent 3336f0f9
Loading
Loading
Loading
Loading
+23 −11
Original line number Diff line number Diff line
@@ -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;

@@ -121,6 +122,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
@@ -176,23 +181,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;
    }