Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9110d485 authored by Hyunyoung Song's avatar Hyunyoung Song
Browse files

Fix widget tray crash on screen rotation introduced by

ag/694693

b/21402209

Change-Id: Idae97fca971d90f5fbba658411491147cb023c8d
parent dd721f86
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -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());
+21 −9
Original line number Diff line number Diff line
@@ -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