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

Commit 777c13eb authored by Pinyao Ting's avatar Pinyao Ting
Browse files

Explicit Nullbility in Launcher (Part 5)

This CL addresses the nullbility in LauncherModel and update tasks.

Bug: 242895652
Test: manual
Change-Id: Ied635c944c3656f0d493b295f772aa0329b354b9
parent af2fe7fd
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -27,6 +27,8 @@ import android.content.pm.LauncherApps;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutInfo;
import android.os.UserHandle;
import android.os.UserHandle;


import androidx.annotation.NonNull;

import com.android.launcher3.LauncherAppState;
import com.android.launcher3.LauncherAppState;
import com.android.launcher3.Utilities;
import com.android.launcher3.Utilities;
import com.android.launcher3.model.BgDataModel.FixedContainerItems;
import com.android.launcher3.model.BgDataModel.FixedContainerItems;
@@ -52,7 +54,8 @@ public class PredictionUpdateTask extends BaseModelUpdateTask {
    }
    }


    @Override
    @Override
    public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
    public void execute(@NonNull final LauncherAppState app, @NonNull final BgDataModel dataModel,
            @NonNull final AllAppsList apps) {
        Context context = app.getContext();
        Context context = app.getContext();


        // TODO: remove this
        // TODO: remove this
+4 −1
Original line number Original line Diff line number Diff line
@@ -21,6 +21,8 @@ import android.app.prediction.AppTarget;
import android.content.ComponentName;
import android.content.ComponentName;
import android.text.TextUtils;
import android.text.TextUtils;


import androidx.annotation.NonNull;

import com.android.launcher3.LauncherAppState;
import com.android.launcher3.LauncherAppState;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.model.BgDataModel.FixedContainerItems;
import com.android.launcher3.model.BgDataModel.FixedContainerItems;
@@ -52,7 +54,8 @@ public final class WidgetsPredictionUpdateTask extends BaseModelUpdateTask {
     * workspace.
     * workspace.
     */
     */
    @Override
    @Override
    public void execute(LauncherAppState appState, BgDataModel dataModel, AllAppsList apps) {
    public void execute(@NonNull final LauncherAppState appState,
            @NonNull final BgDataModel dataModel, @NonNull final AllAppsList apps) {
        Set<ComponentKey> widgetsInWorkspace = dataModel.appWidgets.stream().map(
        Set<ComponentKey> widgetsInWorkspace = dataModel.appWidgets.stream().map(
                widget -> new ComponentKey(widget.providerName, widget.user)).collect(
                widget -> new ComponentKey(widget.providerName, widget.user)).collect(
                Collectors.toSet());
                Collectors.toSet());
+3 −2
Original line number Original line Diff line number Diff line
@@ -336,8 +336,9 @@ public class StatsLogCompatManager extends StatsLogManager {
                appState.getModel().enqueueModelUpdateTask(
                appState.getModel().enqueueModelUpdateTask(
                        new BaseModelUpdateTask() {
                        new BaseModelUpdateTask() {
                            @Override
                            @Override
                            public void execute(LauncherAppState app, BgDataModel dataModel,
                            public void execute(@NonNull final LauncherAppState app,
                                    AllAppsList apps) {
                                    @NonNull final BgDataModel dataModel,
                                    @NonNull final AllAppsList apps) {
                                FolderInfo folderInfo = dataModel.folders.get(mItemInfo.container);
                                FolderInfo folderInfo = dataModel.folders.get(mItemInfo.container);
                                write(event, applyOverwrites(mItemInfo.buildProto(folderInfo)));
                                write(event, applyOverwrites(mItemInfo.buildProto(folderInfo)));
                            }
                            }
+81 −47
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@ import android.text.TextUtils;
import android.util.Log;
import android.util.Log;
import android.util.Pair;
import android.util.Pair;


import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import androidx.annotation.WorkerThread;


@@ -89,9 +90,11 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi


    static final String TAG = "Launcher.Model";
    static final String TAG = "Launcher.Model";


    @NonNull
    private final LauncherAppState mApp;
    private final LauncherAppState mApp;
    @NonNull
    private final Object mLock = new Object();
    private final Object mLock = new Object();

    @Nullable
    private LoaderTask mLoaderTask;
    private LoaderTask mLoaderTask;
    private boolean mIsLoaderTaskRunning;
    private boolean mIsLoaderTaskRunning;


@@ -107,20 +110,25 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
        }
        }
    }
    }


    @NonNull
    private final ArrayList<Callbacks> mCallbacksList = new ArrayList<>(1);
    private final ArrayList<Callbacks> mCallbacksList = new ArrayList<>(1);


    // < only access in worker thread >
    // < only access in worker thread >
    @NonNull
    private final AllAppsList mBgAllAppsList;
    private final AllAppsList mBgAllAppsList;


    /**
    /**
     * All the static data should be accessed on the background thread, A lock should be acquired
     * All the static data should be accessed on the background thread, A lock should be acquired
     * on this object when accessing any data from this model.
     * on this object when accessing any data from this model.
     */
     */
    @NonNull
    private final BgDataModel mBgDataModel = new BgDataModel();
    private final BgDataModel mBgDataModel = new BgDataModel();


    @NonNull
    private final ModelDelegate mModelDelegate;
    private final ModelDelegate mModelDelegate;


    // Runnable to check if the shortcuts permission has changed.
    // Runnable to check if the shortcuts permission has changed.
    @NonNull
    private final Runnable mDataValidationCheck = new Runnable() {
    private final Runnable mDataValidationCheck = new Runnable() {
        @Override
        @Override
        public void run() {
        public void run() {
@@ -130,14 +138,16 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
        }
        }
    };
    };


    LauncherModel(Context context, LauncherAppState app, IconCache iconCache, AppFilter appFilter,
    LauncherModel(@NonNull final Context context, @NonNull final LauncherAppState app,
            boolean isPrimaryInstance) {
            @NonNull final IconCache iconCache, @NonNull final AppFilter appFilter,
            final boolean isPrimaryInstance) {
        mApp = app;
        mApp = app;
        mBgAllAppsList = new AllAppsList(iconCache, appFilter);
        mBgAllAppsList = new AllAppsList(iconCache, appFilter);
        mModelDelegate = ModelDelegate.newInstance(context, app, mBgAllAppsList, mBgDataModel,
        mModelDelegate = ModelDelegate.newInstance(context, app, mBgAllAppsList, mBgDataModel,
                isPrimaryInstance);
                isPrimaryInstance);
    }
    }


    @NonNull
    public ModelDelegate getModelDelegate() {
    public ModelDelegate getModelDelegate() {
        return mModelDelegate;
        return mModelDelegate;
    }
    }
@@ -145,52 +155,57 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
    /**
    /**
     * Adds the provided items to the workspace.
     * Adds the provided items to the workspace.
     */
     */
    public void addAndBindAddedWorkspaceItems(List<Pair<ItemInfo, Object>> itemList) {
    public void addAndBindAddedWorkspaceItems(
            @NonNull final List<Pair<ItemInfo, Object>> itemList) {
        for (Callbacks cb : getCallbacks()) {
        for (Callbacks cb : getCallbacks()) {
            cb.preAddApps();
            cb.preAddApps();
        }
        }
        enqueueModelUpdateTask(new AddWorkspaceItemsTask(itemList));
        enqueueModelUpdateTask(new AddWorkspaceItemsTask(itemList));
    }
    }


    public ModelWriter getWriter(boolean hasVerticalHotseat, boolean verifyChanges,
    @NonNull
            @Nullable Callbacks owner) {
    public ModelWriter getWriter(final boolean hasVerticalHotseat, final boolean verifyChanges,
            @Nullable final Callbacks owner) {
        return new ModelWriter(mApp.getContext(), this, mBgDataModel,
        return new ModelWriter(mApp.getContext(), this, mBgDataModel,
                hasVerticalHotseat, verifyChanges, owner);
                hasVerticalHotseat, verifyChanges, owner);
    }
    }


    @Override
    @Override
    public void onPackageChanged(String packageName, UserHandle user) {
    public void onPackageChanged(
            @NonNull final String packageName, @NonNull final UserHandle user) {
        int op = PackageUpdatedTask.OP_UPDATE;
        int op = PackageUpdatedTask.OP_UPDATE;
        enqueueModelUpdateTask(new PackageUpdatedTask(op, user, packageName));
        enqueueModelUpdateTask(new PackageUpdatedTask(op, user, packageName));
    }
    }


    @Override
    @Override
    public void onPackageRemoved(String packageName, UserHandle user) {
    public void onPackageRemoved(
            @NonNull final String packageName, @NonNull final UserHandle user) {
        onPackagesRemoved(user, packageName);
        onPackagesRemoved(user, packageName);
    }
    }


    public void onPackagesRemoved(UserHandle user, String... packages) {
    public void onPackagesRemoved(
            @NonNull final UserHandle user, @NonNull final String... packages) {
        int op = PackageUpdatedTask.OP_REMOVE;
        int op = PackageUpdatedTask.OP_REMOVE;
        FileLog.d(TAG, "package removed received " + TextUtils.join(",", packages));
        FileLog.d(TAG, "package removed received " + TextUtils.join(",", packages));
        enqueueModelUpdateTask(new PackageUpdatedTask(op, user, packages));
        enqueueModelUpdateTask(new PackageUpdatedTask(op, user, packages));
    }
    }


    @Override
    @Override
    public void onPackageAdded(String packageName, UserHandle user) {
    public void onPackageAdded(@NonNull final String packageName, @NonNull final UserHandle user) {
        int op = PackageUpdatedTask.OP_ADD;
        int op = PackageUpdatedTask.OP_ADD;
        enqueueModelUpdateTask(new PackageUpdatedTask(op, user, packageName));
        enqueueModelUpdateTask(new PackageUpdatedTask(op, user, packageName));
    }
    }


    @Override
    @Override
    public void onPackagesAvailable(String[] packageNames, UserHandle user,
    public void onPackagesAvailable(@NonNull final String[] packageNames,
            boolean replacing) {
            @NonNull final UserHandle user, final boolean replacing) {
        enqueueModelUpdateTask(
        enqueueModelUpdateTask(
                new PackageUpdatedTask(PackageUpdatedTask.OP_UPDATE, user, packageNames));
                new PackageUpdatedTask(PackageUpdatedTask.OP_UPDATE, user, packageNames));
    }
    }


    @Override
    @Override
    public void onPackagesUnavailable(String[] packageNames, UserHandle user,
    public void onPackagesUnavailable(@NonNull final String[] packageNames,
            boolean replacing) {
            @NonNull final UserHandle user, final boolean replacing) {
        if (!replacing) {
        if (!replacing) {
            enqueueModelUpdateTask(new PackageUpdatedTask(
            enqueueModelUpdateTask(new PackageUpdatedTask(
                    PackageUpdatedTask.OP_UNAVAILABLE, user, packageNames));
                    PackageUpdatedTask.OP_UNAVAILABLE, user, packageNames));
@@ -198,20 +213,22 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
    }
    }


    @Override
    @Override
    public void onPackagesSuspended(String[] packageNames, UserHandle user) {
    public void onPackagesSuspended(
            @NonNull final String[] packageNames, @NonNull final UserHandle user) {
        enqueueModelUpdateTask(new PackageUpdatedTask(
        enqueueModelUpdateTask(new PackageUpdatedTask(
                PackageUpdatedTask.OP_SUSPEND, user, packageNames));
                PackageUpdatedTask.OP_SUSPEND, user, packageNames));
    }
    }


    @Override
    @Override
    public void onPackagesUnsuspended(String[] packageNames, UserHandle user) {
    public void onPackagesUnsuspended(
            @NonNull final String[] packageNames, @NonNull final UserHandle user) {
        enqueueModelUpdateTask(new PackageUpdatedTask(
        enqueueModelUpdateTask(new PackageUpdatedTask(
                PackageUpdatedTask.OP_UNSUSPEND, user, packageNames));
                PackageUpdatedTask.OP_UNSUSPEND, user, packageNames));
    }
    }


    @Override
    @Override
    public void onPackageLoadingProgressChanged(
    public void onPackageLoadingProgressChanged(@NonNull final String packageName,
                String packageName, UserHandle user, float progress) {
            @NonNull final UserHandle user, final float progress) {
        if (Utilities.ATLEAST_S) {
        if (Utilities.ATLEAST_S) {
            enqueueModelUpdateTask(new PackageIncrementalDownloadUpdatedTask(
            enqueueModelUpdateTask(new PackageIncrementalDownloadUpdatedTask(
                    packageName, user, progress));
                    packageName, user, progress));
@@ -219,8 +236,8 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
    }
    }


    @Override
    @Override
    public void onShortcutsChanged(String packageName, List<ShortcutInfo> shortcuts,
    public void onShortcutsChanged(@NonNull final String packageName,
            UserHandle user) {
            @NonNull final List<ShortcutInfo> shortcuts, @NonNull final UserHandle user) {
        enqueueModelUpdateTask(new ShortcutsChangedTask(packageName, shortcuts, user, true));
        enqueueModelUpdateTask(new ShortcutsChangedTask(packageName, shortcuts, user, true));
    }
    }


@@ -228,7 +245,8 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
     * Called when the icon for an app changes, outside of package event
     * Called when the icon for an app changes, outside of package event
     */
     */
    @WorkerThread
    @WorkerThread
    public void onAppIconChanged(String packageName, UserHandle user) {
    public void onAppIconChanged(@NonNull final String packageName,
            @NonNull final UserHandle user) {
        // Update the icon for the calendar package
        // Update the icon for the calendar package
        Context context = mApp.getContext();
        Context context = mApp.getContext();
        onPackageChanged(packageName, user);
        onPackageChanged(packageName, user);
@@ -256,7 +274,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
        MODEL_EXECUTOR.execute(mModelDelegate::destroy);
        MODEL_EXECUTOR.execute(mModelDelegate::destroy);
    }
    }


    public void onBroadcastIntent(Intent intent) {
    public void onBroadcastIntent(@NonNull final Intent intent) {
        if (DEBUG_RECEIVER) Log.d(TAG, "onReceive intent=" + intent);
        if (DEBUG_RECEIVER) Log.d(TAG, "onReceive intent=" + intent);
        final String action = intent.getAction();
        final String action = intent.getAction();
        if (Intent.ACTION_LOCALE_CHANGED.equals(action)) {
        if (Intent.ACTION_LOCALE_CHANGED.equals(action)) {
@@ -322,7 +340,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
    /**
    /**
     * Removes an existing callback
     * Removes an existing callback
     */
     */
    public void removeCallbacks(Callbacks callbacks) {
    public void removeCallbacks(@NonNull final Callbacks callbacks) {
        synchronized (mCallbacksList) {
        synchronized (mCallbacksList) {
            Preconditions.assertUIThread();
            Preconditions.assertUIThread();
            if (mCallbacksList.remove(callbacks)) {
            if (mCallbacksList.remove(callbacks)) {
@@ -338,7 +356,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
     * Adds a callbacks to receive model updates
     * Adds a callbacks to receive model updates
     * @return true if workspace load was performed synchronously
     * @return true if workspace load was performed synchronously
     */
     */
    public boolean addCallbacksAndLoad(Callbacks callbacks) {
    public boolean addCallbacksAndLoad(@NonNull final Callbacks callbacks) {
        synchronized (mLock) {
        synchronized (mLock) {
            addCallbacks(callbacks);
            addCallbacks(callbacks);
            return startLoader(new Callbacks[] { callbacks });
            return startLoader(new Callbacks[] { callbacks });
@@ -349,7 +367,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
    /**
    /**
     * Adds a callbacks to receive model updates
     * Adds a callbacks to receive model updates
     */
     */
    public void addCallbacks(Callbacks callbacks) {
    public void addCallbacks(@NonNull final Callbacks callbacks) {
        Preconditions.assertUIThread();
        Preconditions.assertUIThread();
        synchronized (mCallbacksList) {
        synchronized (mCallbacksList) {
            if (TestProtocol.sDebugTracing) {
            if (TestProtocol.sDebugTracing) {
@@ -370,7 +388,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
        return startLoader(new Callbacks[0]);
        return startLoader(new Callbacks[0]);
    }
    }


    private boolean startLoader(Callbacks[] newCallbacks) {
    private boolean startLoader(@NonNull final Callbacks[] newCallbacks) {
        // Enable queue before starting loader. It will get disabled in Launcher#finishBindingItems
        // Enable queue before starting loader. It will get disabled in Launcher#finishBindingItems
        ItemInstallQueue.INSTANCE.get(mApp.getContext())
        ItemInstallQueue.INSTANCE.get(mApp.getContext())
                .pauseModelPush(ItemInstallQueue.FLAG_LOADER_RUNNING);
                .pauseModelPush(ItemInstallQueue.FLAG_LOADER_RUNNING);
@@ -433,7 +451,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
     * Loads the model if not loaded
     * Loads the model if not loaded
     * @param callback called with the data model upon successful load or null on model thread.
     * @param callback called with the data model upon successful load or null on model thread.
     */
     */
    public void loadAsync(Consumer<BgDataModel> callback) {
    public void loadAsync(@NonNull final Consumer<BgDataModel> callback) {
        synchronized (mLock) {
        synchronized (mLock) {
            if (!mModelLoaded && !mIsLoaderTaskRunning) {
            if (!mModelLoaded && !mIsLoaderTaskRunning) {
                startLoader();
                startLoader();
@@ -443,11 +461,12 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
    }
    }


    @Override
    @Override
    public void onInstallSessionCreated(final PackageInstallInfo sessionInfo) {
    public void onInstallSessionCreated(@NonNull final PackageInstallInfo sessionInfo) {
        if (FeatureFlags.PROMISE_APPS_IN_ALL_APPS.get()) {
        if (FeatureFlags.PROMISE_APPS_IN_ALL_APPS.get()) {
            enqueueModelUpdateTask(new BaseModelUpdateTask() {
            enqueueModelUpdateTask(new BaseModelUpdateTask() {
                @Override
                @Override
                public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
                public void execute(@NonNull final LauncherAppState app,
                        @NonNull final BgDataModel dataModel, @NonNull final AllAppsList apps) {
                    apps.addPromiseApp(app.getContext(), sessionInfo);
                    apps.addPromiseApp(app.getContext(), sessionInfo);
                    bindApplicationsIfNeeded();
                    bindApplicationsIfNeeded();
                }
                }
@@ -456,10 +475,12 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
    }
    }


    @Override
    @Override
    public void onSessionFailure(String packageName, UserHandle user) {
    public void onSessionFailure(@NonNull final String packageName,
            @NonNull final UserHandle user) {
        enqueueModelUpdateTask(new BaseModelUpdateTask() {
        enqueueModelUpdateTask(new BaseModelUpdateTask() {
            @Override
            @Override
            public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
            public void execute(@NonNull final LauncherAppState app,
                    @NonNull final BgDataModel dataModel, @NonNull final AllAppsList apps) {
                final IntSet removedIds = new IntSet();
                final IntSet removedIds = new IntSet();
                synchronized (dataModel) {
                synchronized (dataModel) {
                    for (ItemInfo info : dataModel.itemsIdMap) {
                    for (ItemInfo info : dataModel.itemsIdMap) {
@@ -483,7 +504,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
    }
    }


    @Override
    @Override
    public void onPackageStateChanged(PackageInstallInfo installInfo) {
    public void onPackageStateChanged(@NonNull final PackageInstallInfo installInfo) {
        enqueueModelUpdateTask(new PackageInstallStateChangedTask(installInfo));
        enqueueModelUpdateTask(new PackageInstallStateChangedTask(installInfo));
    }
    }


@@ -491,7 +512,8 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
     * Updates the icons and label of all pending icons for the provided package name.
     * Updates the icons and label of all pending icons for the provided package name.
     */
     */
    @Override
    @Override
    public void onUpdateSessionDisplay(PackageUserKey key, PackageInstaller.SessionInfo info) {
    public void onUpdateSessionDisplay(@NonNull final PackageUserKey key,
            @NonNull final PackageInstaller.SessionInfo info) {
        mApp.getIconCache().updateSessionCache(key, info);
        mApp.getIconCache().updateSessionCache(key, info);


        HashSet<String> packages = new HashSet<>();
        HashSet<String> packages = new HashSet<>();
@@ -502,9 +524,10 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi


    public class LoaderTransaction implements AutoCloseable {
    public class LoaderTransaction implements AutoCloseable {


        @NonNull
        private final LoaderTask mTask;
        private final LoaderTask mTask;


        private LoaderTransaction(LoaderTask task) throws CancellationException {
        private LoaderTransaction(@NonNull final LoaderTask task) throws CancellationException {
            synchronized (mLock) {
            synchronized (mLock) {
                if (mLoaderTask != task) {
                if (mLoaderTask != task) {
                    throw new CancellationException("Loader already stopped");
                    throw new CancellationException("Loader already stopped");
@@ -534,7 +557,8 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
        }
        }
    }
    }


    public LoaderTransaction beginLoader(LoaderTask task) throws CancellationException {
    public LoaderTransaction beginLoader(@NonNull final LoaderTask task)
            throws CancellationException {
        return new LoaderTransaction(task);
        return new LoaderTransaction(task);
    }
    }


@@ -551,7 +575,8 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
    /**
    /**
     * Called when the icons for packages have been updated in the icon cache.
     * Called when the icons for packages have been updated in the icon cache.
     */
     */
    public void onPackageIconsUpdated(HashSet<String> updatedPackages, UserHandle user) {
    public void onPackageIconsUpdated(@NonNull final HashSet<String> updatedPackages,
            @NonNull final UserHandle user) {
        // If any package icon has changed (app was updated while launcher was dead),
        // If any package icon has changed (app was updated while launcher was dead),
        // update the corresponding shortcuts.
        // update the corresponding shortcuts.
        enqueueModelUpdateTask(new CacheDataUpdatedTask(
        enqueueModelUpdateTask(new CacheDataUpdatedTask(
@@ -561,17 +586,19 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
    /**
    /**
     * Called when the labels for the widgets has updated in the icon cache.
     * Called when the labels for the widgets has updated in the icon cache.
     */
     */
    public void onWidgetLabelsUpdated(HashSet<String> updatedPackages, UserHandle user) {
    public void onWidgetLabelsUpdated(@NonNull final HashSet<String> updatedPackages,
            @NonNull final UserHandle user) {
        enqueueModelUpdateTask(new BaseModelUpdateTask() {
        enqueueModelUpdateTask(new BaseModelUpdateTask() {
            @Override
            @Override
            public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
            public void execute(@NonNull final LauncherAppState app,
                    @NonNull final BgDataModel dataModel, @NonNull final AllAppsList apps) {
                dataModel.widgetsModel.onPackageIconsUpdated(updatedPackages, user, app);
                dataModel.widgetsModel.onPackageIconsUpdated(updatedPackages, user, app);
                bindUpdatedWidgets(dataModel);
                bindUpdatedWidgets(dataModel);
            }
            }
        });
        });
    }
    }


    public void enqueueModelUpdateTask(ModelUpdateTask task) {
    public void enqueueModelUpdateTask(@NonNull final ModelUpdateTask task) {
        if (mModelDestroyed) {
        if (mModelDestroyed) {
            return;
            return;
        }
        }
@@ -585,7 +612,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
     */
     */
    public interface CallbackTask {
    public interface CallbackTask {


        void execute(Callbacks callbacks);
        void execute(@NonNull Callbacks callbacks);
    }
    }


    /**
    /**
@@ -596,12 +623,14 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
        /**
        /**
         * Called before the task is posted to initialize the internal state.
         * Called before the task is posted to initialize the internal state.
         */
         */
        void init(LauncherAppState app, LauncherModel model,
        void init(@NonNull LauncherAppState app, @NonNull LauncherModel model,
                BgDataModel dataModel, AllAppsList allAppsList, Executor uiExecutor);
                @NonNull BgDataModel dataModel, @NonNull AllAppsList allAppsList,
                @NonNull Executor uiExecutor);


    }
    }


    public void updateAndBindWorkspaceItem(WorkspaceItemInfo si, ShortcutInfo info) {
    public void updateAndBindWorkspaceItem(@NonNull final WorkspaceItemInfo si,
            @NonNull final ShortcutInfo info) {
        updateAndBindWorkspaceItem(() -> {
        updateAndBindWorkspaceItem(() -> {
            si.updateFromDeepShortcutInfo(info, mApp.getContext());
            si.updateFromDeepShortcutInfo(info, mApp.getContext());
            mApp.getIconCache().getShortcutIcon(si, info);
            mApp.getIconCache().getShortcutIcon(si, info);
@@ -612,10 +641,12 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
    /**
    /**
     * Utility method to update a shortcut on the background thread.
     * Utility method to update a shortcut on the background thread.
     */
     */
    public void updateAndBindWorkspaceItem(final Supplier<WorkspaceItemInfo> itemProvider) {
    public void updateAndBindWorkspaceItem(
            @NonNull final Supplier<WorkspaceItemInfo> itemProvider) {
        enqueueModelUpdateTask(new BaseModelUpdateTask() {
        enqueueModelUpdateTask(new BaseModelUpdateTask() {
            @Override
            @Override
            public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
            public void execute(@NonNull final LauncherAppState app,
                    @NonNull final BgDataModel dataModel, @NonNull final AllAppsList apps) {
                WorkspaceItemInfo info = itemProvider.get();
                WorkspaceItemInfo info = itemProvider.get();
                getModelWriter().updateItemInDatabase(info);
                getModelWriter().updateItemInDatabase(info);
                ArrayList<WorkspaceItemInfo> update = new ArrayList<>();
                ArrayList<WorkspaceItemInfo> update = new ArrayList<>();
@@ -628,14 +659,16 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
    public void refreshAndBindWidgetsAndShortcuts(@Nullable final PackageUserKey packageUser) {
    public void refreshAndBindWidgetsAndShortcuts(@Nullable final PackageUserKey packageUser) {
        enqueueModelUpdateTask(new BaseModelUpdateTask() {
        enqueueModelUpdateTask(new BaseModelUpdateTask() {
            @Override
            @Override
            public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
            public void execute(@NonNull final LauncherAppState app,
                    @NonNull final BgDataModel dataModel, @NonNull final AllAppsList apps) {
                dataModel.widgetsModel.update(app, packageUser);
                dataModel.widgetsModel.update(app, packageUser);
                bindUpdatedWidgets(dataModel);
                bindUpdatedWidgets(dataModel);
            }
            }
        });
        });
    }
    }


    public void dumpState(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
    public void dumpState(@Nullable final String prefix, @Nullable final FileDescriptor fd,
            @NonNull final PrintWriter writer, @NonNull final String[] args) {
        if (args.length > 0 && TextUtils.equals(args[0], "--all")) {
        if (args.length > 0 && TextUtils.equals(args[0], "--all")) {
            writer.println(prefix + "All apps list: size=" + mBgAllAppsList.data.size());
            writer.println(prefix + "All apps list: size=" + mBgAllAppsList.data.size());
            for (AppInfo info : mBgAllAppsList.data) {
            for (AppInfo info : mBgAllAppsList.data) {
@@ -661,6 +694,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
    /**
    /**
     * Returns an array of currently attached callbacks
     * Returns an array of currently attached callbacks
     */
     */
    @NonNull
    public Callbacks[] getCallbacks() {
    public Callbacks[] getCallbacks() {
        synchronized (mCallbacksList) {
        synchronized (mCallbacksList) {
            return mCallbacksList.toArray(new Callbacks[mCallbacksList.size()]);
            return mCallbacksList.toArray(new Callbacks[mCallbacksList.size()]);
+3 −1
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@ import android.content.Context;
import android.os.Handler;
import android.os.Handler;


import androidx.annotation.AnyThread;
import androidx.annotation.AnyThread;
import androidx.annotation.NonNull;


import com.android.launcher3.LauncherAppState;
import com.android.launcher3.LauncherAppState;
import com.android.launcher3.allapps.BaseAllAppsAdapter.AdapterItem;
import com.android.launcher3.allapps.BaseAllAppsAdapter.AdapterItem;
@@ -68,7 +69,8 @@ public class DefaultAppSearchAlgorithm implements SearchAlgorithm<AdapterItem> {
    public void doSearch(String query, SearchCallback<AdapterItem> callback) {
    public void doSearch(String query, SearchCallback<AdapterItem> callback) {
        mAppState.getModel().enqueueModelUpdateTask(new BaseModelUpdateTask() {
        mAppState.getModel().enqueueModelUpdateTask(new BaseModelUpdateTask() {
            @Override
            @Override
            public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
            public void execute(@NonNull final LauncherAppState app,
                    @NonNull final BgDataModel dataModel, @NonNull final AllAppsList apps) {
                ArrayList<AdapterItem> result = getTitleMatchResult(apps.data, query);
                ArrayList<AdapterItem> result = getTitleMatchResult(apps.data, query);
                if (mAddNoResultsMessage && result.isEmpty()) {
                if (mAddNoResultsMessage && result.isEmpty()) {
                    result.add(getEmptyMessageAdapterItem(query));
                    result.add(getEmptyMessageAdapterItem(query));
Loading