OSDN Git Service

WidgetsModel clone method should be called in worker thread
authorHyunyoung Song <hyunyoungs@google.com>
Mon, 8 Feb 2016 19:31:33 +0000 (11:31 -0800)
committerHyunyoung Song <hyunyoungs@google.com>
Tue, 9 Feb 2016 02:19:59 +0000 (02:19 +0000)
b/24582368

Change-Id: I7b1d2ccfa7d7ac8235e4aeccc2b6b1a8eeea6461
(cherry picked from commit 747a5bc486a7c8335fc4a481cab1567369570c24)

src/com/android/launcher3/LauncherModel.java

index a34e001..774cca4 100644 (file)
@@ -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,