From 747a5bc486a7c8335fc4a481cab1567369570c24 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Mon, 8 Feb 2016 11:31:33 -0800 Subject: [PATCH] WidgetsModel clone method should be called in worker thread b/24582368 Change-Id: I7b1d2ccfa7d7ac8235e4aeccc2b6b1a8eeea6461 --- src/com/android/launcher3/LauncherModel.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index be745202b..d8bc63176 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -138,6 +138,8 @@ public class LauncherModel extends BroadcastReceiver AllAppsList mBgAllAppsList; // Entire list of widgets. WidgetsModel mBgWidgetsModel; + // Keep a clone of widgets that can be accessed from non-worker thread. + WidgetsModel mFgWidgetsModel; // The lock that must be acquired before referencing any static bg data structures. Unlike // other locks, this one can generally be held long-term because we never expect any of these @@ -241,6 +243,7 @@ public class LauncherModel extends BroadcastReceiver mApp = app; mBgAllAppsList = new AllAppsList(iconCache, appFilter); mBgWidgetsModel = new WidgetsModel(context, iconCache, appFilter); + mFgWidgetsModel = mBgWidgetsModel.clone(); mIconCache = iconCache; mLauncherApps = LauncherAppsCompat.getInstance(context); @@ -2684,18 +2687,17 @@ public class LauncherModel extends BroadcastReceiver @SuppressWarnings("unchecked") final ArrayList list = (ArrayList) mBgAllAppsList.data.clone(); - final WidgetsModel widgetList = mBgWidgetsModel.clone(); Runnable r = new Runnable() { public void run() { final long t = SystemClock.uptimeMillis(); final Callbacks callbacks = tryGetCallbacks(oldCallbacks); if (callbacks != null) { callbacks.bindAllApplications(list); - callbacks.bindAllPackages(widgetList); + callbacks.bindAllPackages(mFgWidgetsModel); } if (DEBUG_LOADERS) { Log.d(TAG, "bound all " + list.size() + " apps from cache in " - + (SystemClock.uptimeMillis()-t) + "ms"); + + (SystemClock.uptimeMillis() - t) + "ms"); } } }; @@ -3336,20 +3338,18 @@ public class LauncherModel extends BroadcastReceiver @Override public void run() { updateWidgetsModel(refresh); - final WidgetsModel model = mBgWidgetsModel.clone(); - mHandler.post(new Runnable() { @Override public void run() { Callbacks cb = getCallback(); if (callbacks == cb && cb != null) { - callbacks.bindAllPackages(model); + callbacks.bindAllPackages(mFgWidgetsModel); } } }); // update the Widget entries inside DB on the worker thread. LauncherAppState.getInstance().getWidgetCache().removeObsoletePreviews( - model.getRawList()); + mFgWidgetsModel.getRawList()); } }); } @@ -3360,6 +3360,7 @@ public class LauncherModel extends BroadcastReceiver * @see #loadAndBindWidgetsAndShortcuts */ @Thunk void updateWidgetsModel(boolean refresh) { + Utilities.assertWorkerThread(); PackageManager packageManager = mApp.getContext().getPackageManager(); final ArrayList widgetsAndShortcuts = new ArrayList(); widgetsAndShortcuts.addAll(getWidgetProviders(mApp.getContext(), refresh)); @@ -3387,6 +3388,7 @@ public class LauncherModel extends BroadcastReceiver } } mBgWidgetsModel.setWidgetsAndShortcuts(widgetsAndShortcuts); + mFgWidgetsModel = mBgWidgetsModel.clone(); } @Thunk static boolean isPackageDisabled(Context context, String packageName, -- 2.11.0