OSDN Git Service

Fix widget tray crash on screen rotation introduced by
authorHyunyoung Song <hyunyoungs@google.com>
Fri, 22 May 2015 21:49:23 +0000 (14:49 -0700)
committerHyunyoung Song <hyunyoungs@google.com>
Fri, 22 May 2015 21:49:23 +0000 (14:49 -0700)
ag/694693

b/21402209

Change-Id: Idae97fca971d90f5fbba658411491147cb023c8d

src/com/android/launcher3/LauncherModel.java
src/com/android/launcher3/model/WidgetsModel.java

index 5002538..e293c2a 100644 (file)
@@ -139,6 +139,8 @@ public class LauncherModel extends BroadcastReceiver
 
     // < only access in worker thread >
     AllAppsList mBgAllAppsList;
+    // Entire list of widgets.
+    WidgetsModel mBgWidgetsModel;
 
     // 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
@@ -2779,12 +2781,14 @@ 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);
                     }
                     if (DEBUG_LOADERS) {
                         Log.d(TAG, "bound all " + list.size() + " apps from cache in "
@@ -2798,8 +2802,6 @@ public class LauncherModel extends BroadcastReceiver
             } else {
                 mHandler.post(r);
             }
-            loadAndBindWidgetsAndShortcuts(mApp.getContext(), tryGetCallbacks(oldCallbacks),
-                    false /* refresh */);
         }
 
         private void loadAllApps() {
@@ -3342,6 +3344,7 @@ public class LauncherModel extends BroadcastReceiver
 
     public void loadAndBindWidgetsAndShortcuts(final Context context, final Callbacks callbacks,
             final boolean refresh) {
+
         runOnWorkerThread(new Runnable(){
             @Override
             public void run() {
@@ -3355,6 +3358,7 @@ public class LauncherModel extends BroadcastReceiver
                         }
                     }
                 });
+                mBgWidgetsModel = model;
                 // update the Widget entries inside DB on the worker thread.
                 LauncherAppState.getInstance().getWidgetCache().removeObsoletePreviews(
                         model.getRawList());
@@ -3363,9 +3367,9 @@ public class LauncherModel extends BroadcastReceiver
     }
 
     /**
-     *  Returns a list of ResolveInfos/AppWidgetInfos.
+     * Returns a list of ResolveInfos/AppWidgetInfos.
      *
-     *  @see #loadAndBindWidgetsAndShortcuts
+     * @see #loadAndBindWidgetsAndShortcuts
      */
     private WidgetsModel createWidgetsModel(Context context, boolean refresh) {
         PackageManager packageManager = context.getPackageManager();
index b72b981..fdb9795 100644 (file)
@@ -3,15 +3,12 @@ package com.android.launcher3.model;
 
 import android.content.Context;
 import android.content.pm.ResolveInfo;
-import android.os.Handler;
-import android.os.Process;
 import android.util.Log;
 
 import com.android.launcher3.IconCache;
 import com.android.launcher3.LauncherAppState;
 import com.android.launcher3.LauncherAppWidgetProviderInfo;
 
-import com.android.launcher3.LauncherModel;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.compat.UserHandleCompat;
 
@@ -20,7 +17,6 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 /**
  * Widgets data model that is used by the adapters of the widget views and controllers.
@@ -33,24 +29,30 @@ public class WidgetsModel {
     private static final boolean DEBUG = false;
 
     /* List of packages that is tracked by this model. */
-    private List<PackageItemInfo> mPackageItemInfos = new ArrayList<>();
+    private ArrayList<PackageItemInfo> mPackageItemInfos = new ArrayList<>();
 
     /* Map of widgets and shortcuts that are tracked per package. */
-    private Map<PackageItemInfo, ArrayList<Object>> mWidgetsList = new HashMap<>();
+    private HashMap<PackageItemInfo, ArrayList<Object>> mWidgetsList = new HashMap<>();
 
     private ArrayList<Object> mRawList;
 
     private final Comparator mWidgetAndShortcutNameComparator;
     private final Comparator mAppNameComparator;
-
     private final IconCache mIconCache;
-    private final Handler mWorkerHandler;
 
     public WidgetsModel(Context context) {
         mWidgetAndShortcutNameComparator = new WidgetsAndShortcutNameComparator(context);
         mAppNameComparator = (new AppNameComparator(context)).getAppInfoComparator();
         mIconCache = LauncherAppState.getInstance().getIconCache();
-        mWorkerHandler = new Handler(LauncherModel.getWorkerLooper());
+    }
+
+    private WidgetsModel(WidgetsModel model) {
+        mPackageItemInfos = (ArrayList<PackageItemInfo>) model.mPackageItemInfos.clone();
+        mWidgetsList = (HashMap<PackageItemInfo, ArrayList<Object>>) model.mWidgetsList.clone();
+        // mRawList is not copied as should not be needed.
+        mWidgetAndShortcutNameComparator = model.mWidgetAndShortcutNameComparator;
+        mAppNameComparator = model.mAppNameComparator;
+        mIconCache = model.mIconCache;
     }
 
     // Access methods that may be deleted if the private fields are made package-private.
@@ -122,4 +124,14 @@ public class WidgetsModel {
             Collections.sort(mWidgetsList.get(p), mWidgetAndShortcutNameComparator);
         }
     }
+
+    /**
+     * Create a snapshot of the widgets model.
+     * <p>
+     * Usage case: view binding without being modified from package updates.
+     */
+    @Override
+    public WidgetsModel clone(){
+        return new WidgetsModel(this);
+    }
 }
\ No newline at end of file