summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHyunyoung Song <hyunyoungs@google.com>2016-02-08 11:31:33 -0800
committerHyunyoung Song <hyunyoungs@google.com>2016-02-09 02:19:59 +0000
commitf97083245c440e0c09e2485094157bb8389cdd95 (patch)
tree5b2f74512bae810fb74c46f69cf978ce072b260a
parenta27d7a5a194846a3c98fa69495e627db2343f6db (diff)
downloadandroid_packages_apps_Trebuchet-f97083245c440e0c09e2485094157bb8389cdd95.tar.gz
android_packages_apps_Trebuchet-f97083245c440e0c09e2485094157bb8389cdd95.tar.bz2
android_packages_apps_Trebuchet-f97083245c440e0c09e2485094157bb8389cdd95.zip
WidgetsModel clone method should be called in worker thread
b/24582368 Change-Id: I7b1d2ccfa7d7ac8235e4aeccc2b6b1a8eeea6461 (cherry picked from commit 747a5bc486a7c8335fc4a481cab1567369570c24)
-rw-r--r--src/com/android/launcher3/LauncherModel.java16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index a34e00127..774cca459 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -141,6 +141,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
@@ -243,6 +245,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);
@@ -2757,18 +2760,17 @@ public class LauncherModel extends BroadcastReceiver
@SuppressWarnings("unchecked")
final ArrayList<AppInfo> list
= (ArrayList<AppInfo>) 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");
}
}
};
@@ -3403,20 +3405,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());
}
});
}
@@ -3427,6 +3427,7 @@ public class LauncherModel extends BroadcastReceiver
* @see #loadAndBindWidgetsAndShortcuts
*/
@Thunk void updateWidgetsModel(boolean refresh) {
+ Utilities.assertWorkerThread();
PackageManager packageManager = mApp.getContext().getPackageManager();
final ArrayList<Object> widgetsAndShortcuts = new ArrayList<Object>();
widgetsAndShortcuts.addAll(getWidgetProviders(mApp.getContext(), refresh));
@@ -3454,6 +3455,7 @@ public class LauncherModel extends BroadcastReceiver
}
}
mBgWidgetsModel.setWidgetsAndShortcuts(widgetsAndShortcuts);
+ mFgWidgetsModel = mBgWidgetsModel.clone();
}
@Thunk static boolean isPackageDisabled(Context context, String packageName,