Merge "Increasing thread priority while loading high res icons" into ub-launcher3-edmonton

This commit is contained in:
TreeHugger Robot 2018-05-14 18:41:42 +00:00 committed by Android (Google) Code Review
commit 7c86a1ad42
1 changed files with 35 additions and 14 deletions

View File

@ -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();
@ -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) {
@ -420,17 +427,21 @@ public class IconCache {
} else if (info instanceof PackageItemInfo) {
getTitleAndIconForApp((PackageItemInfo) info, false);
}
mMainThreadExecutor.execute(new Runnable() {
@Override
public void run() {
caller.reapplyItemInfo(info);
}
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);
}
}
/**
@ -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;
IconLoadRequest(Runnable runnable, Handler handler) {
mRunnable = runnable;
private boolean mEnded = false;
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();
}
}
}