Loading src/com/android/launcher3/IconCache.java +35 −14 Original line number Diff line number Diff line Loading @@ -107,6 +107,8 @@ public class IconCache { private final BitmapFactory.Options mLowResOptions; private final BitmapFactory.Options mHighResOptions; private int mPendingIconRequestCount = 0; public IconCache(Context context, InvariantDeviceProfile inv) { mContext = context; mPackageManager = context.getPackageManager(); Loading Loading @@ -411,8 +413,13 @@ public class IconCache { */ public IconLoadRequest updateIconInBackground(final ItemInfoUpdateReceiver caller, final ItemInfoWithIcon info) { Runnable request = new Runnable() { Preconditions.assertUIThread(); if (mPendingIconRequestCount <= 0) { LauncherModel.setWorkerPriority(Process.THREAD_PRIORITY_FOREGROUND); } mPendingIconRequestCount ++; IconLoadRequest request = new IconLoadRequest(mWorkerHandler, this::onIconRequestEnd) { @Override public void run() { if (info instanceof AppInfo || info instanceof ShortcutInfo) { Loading @@ -420,17 +427,21 @@ public class IconCache { } else if (info instanceof PackageItemInfo) { getTitleAndIconForApp((PackageItemInfo) info, false); } mMainThreadExecutor.execute(new Runnable() { @Override public void run() { mMainThreadExecutor.execute(() -> { caller.reapplyItemInfo(info); } onEnd(); }); } }; mWorkerHandler.post(request); return new IconLoadRequest(request, mWorkerHandler); Utilities.postAsyncCallback(mWorkerHandler, request); return request; } private void onIconRequestEnd() { mPendingIconRequestCount --; if (mPendingIconRequestCount <= 0) { LauncherModel.setWorkerPriority(Process.THREAD_PRIORITY_BACKGROUND); } } /** Loading Loading @@ -707,17 +718,27 @@ public class IconCache { return false; } public static class IconLoadRequest { private final Runnable mRunnable; public static abstract class IconLoadRequest implements Runnable { private final Handler mHandler; private final Runnable mEndRunnable; private boolean mEnded = false; IconLoadRequest(Runnable runnable, Handler handler) { mRunnable = runnable; IconLoadRequest(Handler handler, Runnable endRunnable) { mHandler = handler; mEndRunnable = endRunnable; } public void cancel() { mHandler.removeCallbacks(mRunnable); mHandler.removeCallbacks(this); onEnd(); } public void onEnd() { if (!mEnded) { mEnded = true; mEndRunnable.run(); } } } Loading Loading
src/com/android/launcher3/IconCache.java +35 −14 Original line number Diff line number Diff line Loading @@ -107,6 +107,8 @@ public class IconCache { private final BitmapFactory.Options mLowResOptions; private final BitmapFactory.Options mHighResOptions; private int mPendingIconRequestCount = 0; public IconCache(Context context, InvariantDeviceProfile inv) { mContext = context; mPackageManager = context.getPackageManager(); Loading Loading @@ -411,8 +413,13 @@ public class IconCache { */ public IconLoadRequest updateIconInBackground(final ItemInfoUpdateReceiver caller, final ItemInfoWithIcon info) { Runnable request = new Runnable() { Preconditions.assertUIThread(); if (mPendingIconRequestCount <= 0) { LauncherModel.setWorkerPriority(Process.THREAD_PRIORITY_FOREGROUND); } mPendingIconRequestCount ++; IconLoadRequest request = new IconLoadRequest(mWorkerHandler, this::onIconRequestEnd) { @Override public void run() { if (info instanceof AppInfo || info instanceof ShortcutInfo) { Loading @@ -420,17 +427,21 @@ public class IconCache { } else if (info instanceof PackageItemInfo) { getTitleAndIconForApp((PackageItemInfo) info, false); } mMainThreadExecutor.execute(new Runnable() { @Override public void run() { mMainThreadExecutor.execute(() -> { caller.reapplyItemInfo(info); } onEnd(); }); } }; mWorkerHandler.post(request); return new IconLoadRequest(request, mWorkerHandler); Utilities.postAsyncCallback(mWorkerHandler, request); return request; } private void onIconRequestEnd() { mPendingIconRequestCount --; if (mPendingIconRequestCount <= 0) { LauncherModel.setWorkerPriority(Process.THREAD_PRIORITY_BACKGROUND); } } /** Loading Loading @@ -707,17 +718,27 @@ public class IconCache { return false; } public static class IconLoadRequest { private final Runnable mRunnable; public static abstract class IconLoadRequest implements Runnable { private final Handler mHandler; private final Runnable mEndRunnable; private boolean mEnded = false; IconLoadRequest(Runnable runnable, Handler handler) { mRunnable = runnable; IconLoadRequest(Handler handler, Runnable endRunnable) { mHandler = handler; mEndRunnable = endRunnable; } public void cancel() { mHandler.removeCallbacks(mRunnable); mHandler.removeCallbacks(this); onEnd(); } public void onEnd() { if (!mEnded) { mEnded = true; mEndRunnable.run(); } } } Loading