From 777c13eb0062c31be8c496ebe8b8985a5d28a24f Mon Sep 17 00:00:00 2001 From: Pinyao Ting Date: Fri, 16 Sep 2022 09:44:26 -0700 Subject: [PATCH] Explicit Nullbility in Launcher (Part 5) This CL addresses the nullbility in LauncherModel and update tasks. Bug: 242895652 Test: manual Change-Id: Ied635c944c3656f0d493b295f772aa0329b354b9 --- .../launcher3/model/PredictionUpdateTask.java | 5 +- .../model/WidgetsPredictionUpdateTask.java | 5 +- .../logging/StatsLogCompatManager.java | 5 +- src/com/android/launcher3/LauncherModel.java | 128 +++++++++++------- .../search/DefaultAppSearchAlgorithm.java | 4 +- .../launcher3/folder/FolderNameProvider.java | 4 +- .../model/AddWorkspaceItemsTask.java | 25 ++-- .../android/launcher3/model/AllAppsList.java | 3 + .../launcher3/model/BaseModelUpdateTask.java | 24 ++-- .../launcher3/model/CacheDataUpdatedTask.java | 14 +- ...PackageIncrementalDownloadUpdatedTask.java | 13 +- .../model/PackageInstallStateChangedTask.java | 8 +- .../launcher3/model/PackageUpdatedTask.java | 12 +- .../model/ReloadStringCacheTask.java | 9 +- .../launcher3/model/ShortcutsChangedTask.java | 16 ++- .../model/UserLockStateChangedTask.java | 8 +- .../model/data/WorkspaceItemInfo.java | 7 +- .../launcher3/pm/InstallSessionHelper.java | 39 ++++-- .../launcher3/pm/InstallSessionTracker.java | 47 ++++--- .../launcher3/util/PackageManagerHelper.java | 38 ++++-- .../launcher3/util/LauncherModelHelper.java | 6 +- 21 files changed, 290 insertions(+), 130 deletions(-) diff --git a/quickstep/src/com/android/launcher3/model/PredictionUpdateTask.java b/quickstep/src/com/android/launcher3/model/PredictionUpdateTask.java index 7e3ee7dada..bc3253fcfb 100644 --- a/quickstep/src/com/android/launcher3/model/PredictionUpdateTask.java +++ b/quickstep/src/com/android/launcher3/model/PredictionUpdateTask.java @@ -27,6 +27,8 @@ import android.content.pm.LauncherApps; import android.content.pm.ShortcutInfo; import android.os.UserHandle; +import androidx.annotation.NonNull; + import com.android.launcher3.LauncherAppState; import com.android.launcher3.Utilities; import com.android.launcher3.model.BgDataModel.FixedContainerItems; @@ -52,7 +54,8 @@ public class PredictionUpdateTask extends BaseModelUpdateTask { } @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(); // TODO: remove this diff --git a/quickstep/src/com/android/launcher3/model/WidgetsPredictionUpdateTask.java b/quickstep/src/com/android/launcher3/model/WidgetsPredictionUpdateTask.java index 9cd9d8597c..7a483a808a 100644 --- a/quickstep/src/com/android/launcher3/model/WidgetsPredictionUpdateTask.java +++ b/quickstep/src/com/android/launcher3/model/WidgetsPredictionUpdateTask.java @@ -21,6 +21,8 @@ import android.app.prediction.AppTarget; import android.content.ComponentName; import android.text.TextUtils; +import androidx.annotation.NonNull; + import com.android.launcher3.LauncherAppState; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.model.BgDataModel.FixedContainerItems; @@ -52,7 +54,8 @@ public final class WidgetsPredictionUpdateTask extends BaseModelUpdateTask { * workspace. */ @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 widgetsInWorkspace = dataModel.appWidgets.stream().map( widget -> new ComponentKey(widget.providerName, widget.user)).collect( Collectors.toSet()); diff --git a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java index 45c80366f4..37a28e554b 100644 --- a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java +++ b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java @@ -336,8 +336,9 @@ public class StatsLogCompatManager extends StatsLogManager { appState.getModel().enqueueModelUpdateTask( new BaseModelUpdateTask() { @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) { FolderInfo folderInfo = dataModel.folders.get(mItemInfo.container); write(event, applyOverwrites(mItemInfo.buildProto(folderInfo))); } diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 68b77011f2..20df89763b 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -33,6 +33,7 @@ import android.text.TextUtils; import android.util.Log; import android.util.Pair; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; @@ -89,9 +90,11 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi static final String TAG = "Launcher.Model"; + @NonNull private final LauncherAppState mApp; + @NonNull private final Object mLock = new Object(); - + @Nullable private LoaderTask mLoaderTask; private boolean mIsLoaderTaskRunning; @@ -107,20 +110,25 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi } } + @NonNull private final ArrayList mCallbacksList = new ArrayList<>(1); // < only access in worker thread > + @NonNull private final AllAppsList mBgAllAppsList; /** * 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. */ + @NonNull private final BgDataModel mBgDataModel = new BgDataModel(); + @NonNull private final ModelDelegate mModelDelegate; // Runnable to check if the shortcuts permission has changed. + @NonNull private final Runnable mDataValidationCheck = new Runnable() { @Override public void run() { @@ -130,14 +138,16 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi } }; - LauncherModel(Context context, LauncherAppState app, IconCache iconCache, AppFilter appFilter, - boolean isPrimaryInstance) { + LauncherModel(@NonNull final Context context, @NonNull final LauncherAppState app, + @NonNull final IconCache iconCache, @NonNull final AppFilter appFilter, + final boolean isPrimaryInstance) { mApp = app; mBgAllAppsList = new AllAppsList(iconCache, appFilter); mModelDelegate = ModelDelegate.newInstance(context, app, mBgAllAppsList, mBgDataModel, isPrimaryInstance); } + @NonNull public ModelDelegate getModelDelegate() { return mModelDelegate; } @@ -145,52 +155,57 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi /** * Adds the provided items to the workspace. */ - public void addAndBindAddedWorkspaceItems(List> itemList) { + public void addAndBindAddedWorkspaceItems( + @NonNull final List> itemList) { for (Callbacks cb : getCallbacks()) { cb.preAddApps(); } enqueueModelUpdateTask(new AddWorkspaceItemsTask(itemList)); } - public ModelWriter getWriter(boolean hasVerticalHotseat, boolean verifyChanges, - @Nullable Callbacks owner) { + @NonNull + public ModelWriter getWriter(final boolean hasVerticalHotseat, final boolean verifyChanges, + @Nullable final Callbacks owner) { return new ModelWriter(mApp.getContext(), this, mBgDataModel, hasVerticalHotseat, verifyChanges, owner); } @Override - public void onPackageChanged(String packageName, UserHandle user) { + public void onPackageChanged( + @NonNull final String packageName, @NonNull final UserHandle user) { int op = PackageUpdatedTask.OP_UPDATE; enqueueModelUpdateTask(new PackageUpdatedTask(op, user, packageName)); } @Override - public void onPackageRemoved(String packageName, UserHandle user) { + public void onPackageRemoved( + @NonNull final String packageName, @NonNull final UserHandle user) { 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; FileLog.d(TAG, "package removed received " + TextUtils.join(",", packages)); enqueueModelUpdateTask(new PackageUpdatedTask(op, user, packages)); } @Override - public void onPackageAdded(String packageName, UserHandle user) { + public void onPackageAdded(@NonNull final String packageName, @NonNull final UserHandle user) { int op = PackageUpdatedTask.OP_ADD; enqueueModelUpdateTask(new PackageUpdatedTask(op, user, packageName)); } @Override - public void onPackagesAvailable(String[] packageNames, UserHandle user, - boolean replacing) { + public void onPackagesAvailable(@NonNull final String[] packageNames, + @NonNull final UserHandle user, final boolean replacing) { enqueueModelUpdateTask( new PackageUpdatedTask(PackageUpdatedTask.OP_UPDATE, user, packageNames)); } @Override - public void onPackagesUnavailable(String[] packageNames, UserHandle user, - boolean replacing) { + public void onPackagesUnavailable(@NonNull final String[] packageNames, + @NonNull final UserHandle user, final boolean replacing) { if (!replacing) { enqueueModelUpdateTask(new PackageUpdatedTask( PackageUpdatedTask.OP_UNAVAILABLE, user, packageNames)); @@ -198,20 +213,22 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi } @Override - public void onPackagesSuspended(String[] packageNames, UserHandle user) { + public void onPackagesSuspended( + @NonNull final String[] packageNames, @NonNull final UserHandle user) { enqueueModelUpdateTask(new PackageUpdatedTask( PackageUpdatedTask.OP_SUSPEND, user, packageNames)); } @Override - public void onPackagesUnsuspended(String[] packageNames, UserHandle user) { + public void onPackagesUnsuspended( + @NonNull final String[] packageNames, @NonNull final UserHandle user) { enqueueModelUpdateTask(new PackageUpdatedTask( PackageUpdatedTask.OP_UNSUSPEND, user, packageNames)); } @Override - public void onPackageLoadingProgressChanged( - String packageName, UserHandle user, float progress) { + public void onPackageLoadingProgressChanged(@NonNull final String packageName, + @NonNull final UserHandle user, final float progress) { if (Utilities.ATLEAST_S) { enqueueModelUpdateTask(new PackageIncrementalDownloadUpdatedTask( packageName, user, progress)); @@ -219,8 +236,8 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi } @Override - public void onShortcutsChanged(String packageName, List shortcuts, - UserHandle user) { + public void onShortcutsChanged(@NonNull final String packageName, + @NonNull final List shortcuts, @NonNull final UserHandle user) { 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 */ @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 Context context = mApp.getContext(); onPackageChanged(packageName, user); @@ -256,7 +274,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi 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); final String action = intent.getAction(); if (Intent.ACTION_LOCALE_CHANGED.equals(action)) { @@ -322,7 +340,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi /** * Removes an existing callback */ - public void removeCallbacks(Callbacks callbacks) { + public void removeCallbacks(@NonNull final Callbacks callbacks) { synchronized (mCallbacksList) { Preconditions.assertUIThread(); if (mCallbacksList.remove(callbacks)) { @@ -338,7 +356,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi * Adds a callbacks to receive model updates * @return true if workspace load was performed synchronously */ - public boolean addCallbacksAndLoad(Callbacks callbacks) { + public boolean addCallbacksAndLoad(@NonNull final Callbacks callbacks) { synchronized (mLock) { addCallbacks(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 */ - public void addCallbacks(Callbacks callbacks) { + public void addCallbacks(@NonNull final Callbacks callbacks) { Preconditions.assertUIThread(); synchronized (mCallbacksList) { if (TestProtocol.sDebugTracing) { @@ -370,7 +388,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi 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 ItemInstallQueue.INSTANCE.get(mApp.getContext()) .pauseModelPush(ItemInstallQueue.FLAG_LOADER_RUNNING); @@ -433,7 +451,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi * Loads the model if not loaded * @param callback called with the data model upon successful load or null on model thread. */ - public void loadAsync(Consumer callback) { + public void loadAsync(@NonNull final Consumer callback) { synchronized (mLock) { if (!mModelLoaded && !mIsLoaderTaskRunning) { startLoader(); @@ -443,11 +461,12 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi } @Override - public void onInstallSessionCreated(final PackageInstallInfo sessionInfo) { + public void onInstallSessionCreated(@NonNull final PackageInstallInfo sessionInfo) { if (FeatureFlags.PROMISE_APPS_IN_ALL_APPS.get()) { enqueueModelUpdateTask(new BaseModelUpdateTask() { @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); bindApplicationsIfNeeded(); } @@ -456,10 +475,12 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi } @Override - public void onSessionFailure(String packageName, UserHandle user) { + public void onSessionFailure(@NonNull final String packageName, + @NonNull final UserHandle user) { enqueueModelUpdateTask(new BaseModelUpdateTask() { @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(); synchronized (dataModel) { for (ItemInfo info : dataModel.itemsIdMap) { @@ -483,7 +504,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi } @Override - public void onPackageStateChanged(PackageInstallInfo installInfo) { + public void onPackageStateChanged(@NonNull final PackageInstallInfo 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. */ @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); HashSet packages = new HashSet<>(); @@ -502,9 +524,10 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi public class LoaderTransaction implements AutoCloseable { + @NonNull private final LoaderTask mTask; - private LoaderTransaction(LoaderTask task) throws CancellationException { + private LoaderTransaction(@NonNull final LoaderTask task) throws CancellationException { synchronized (mLock) { if (mLoaderTask != task) { 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); } @@ -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. */ - public void onPackageIconsUpdated(HashSet updatedPackages, UserHandle user) { + public void onPackageIconsUpdated(@NonNull final HashSet updatedPackages, + @NonNull final UserHandle user) { // If any package icon has changed (app was updated while launcher was dead), // update the corresponding shortcuts. 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. */ - public void onWidgetLabelsUpdated(HashSet updatedPackages, UserHandle user) { + public void onWidgetLabelsUpdated(@NonNull final HashSet updatedPackages, + @NonNull final UserHandle user) { enqueueModelUpdateTask(new BaseModelUpdateTask() { @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); bindUpdatedWidgets(dataModel); } }); } - public void enqueueModelUpdateTask(ModelUpdateTask task) { + public void enqueueModelUpdateTask(@NonNull final ModelUpdateTask task) { if (mModelDestroyed) { return; } @@ -585,7 +612,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi */ 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. */ - void init(LauncherAppState app, LauncherModel model, - BgDataModel dataModel, AllAppsList allAppsList, Executor uiExecutor); + void init(@NonNull LauncherAppState app, @NonNull LauncherModel model, + @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(() -> { si.updateFromDeepShortcutInfo(info, mApp.getContext()); 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. */ - public void updateAndBindWorkspaceItem(final Supplier itemProvider) { + public void updateAndBindWorkspaceItem( + @NonNull final Supplier itemProvider) { enqueueModelUpdateTask(new BaseModelUpdateTask() { @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(); getModelWriter().updateItemInDatabase(info); ArrayList update = new ArrayList<>(); @@ -628,14 +659,16 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi public void refreshAndBindWidgetsAndShortcuts(@Nullable final PackageUserKey packageUser) { enqueueModelUpdateTask(new BaseModelUpdateTask() { @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); 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")) { writer.println(prefix + "All apps list: size=" + mBgAllAppsList.data.size()); for (AppInfo info : mBgAllAppsList.data) { @@ -661,6 +694,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi /** * Returns an array of currently attached callbacks */ + @NonNull public Callbacks[] getCallbacks() { synchronized (mCallbacksList) { return mCallbacksList.toArray(new Callbacks[mCallbacksList.size()]); diff --git a/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithm.java b/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithm.java index d2d7a6cff6..ab47097697 100644 --- a/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithm.java +++ b/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithm.java @@ -22,6 +22,7 @@ import android.content.Context; import android.os.Handler; import androidx.annotation.AnyThread; +import androidx.annotation.NonNull; import com.android.launcher3.LauncherAppState; import com.android.launcher3.allapps.BaseAllAppsAdapter.AdapterItem; @@ -68,7 +69,8 @@ public class DefaultAppSearchAlgorithm implements SearchAlgorithm { public void doSearch(String query, SearchCallback callback) { mAppState.getModel().enqueueModelUpdateTask(new BaseModelUpdateTask() { @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 result = getTitleMatchResult(apps.data, query); if (mAddNoResultsMessage && result.isEmpty()) { result.add(getEmptyMessageAdapterItem(query)); diff --git a/src/com/android/launcher3/folder/FolderNameProvider.java b/src/com/android/launcher3/folder/FolderNameProvider.java index 502164473f..bf5959442d 100644 --- a/src/com/android/launcher3/folder/FolderNameProvider.java +++ b/src/com/android/launcher3/folder/FolderNameProvider.java @@ -24,6 +24,7 @@ import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; +import androidx.annotation.NonNull; import androidx.annotation.WorkerThread; import com.android.launcher3.LauncherAppState; @@ -192,7 +193,8 @@ public class FolderNameProvider implements ResourceBasedOverride { private class FolderNameWorker extends BaseModelUpdateTask { @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) { mFolderInfos = dataModel.folders.clone(); mAppInfos = Arrays.asList(apps.copyData()); } diff --git a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java index 4c0f1ae802..0d978e1b23 100644 --- a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java +++ b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java @@ -23,6 +23,9 @@ import android.os.UserHandle; import android.util.Log; import android.util.Pair; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel.CallbackTask; import com.android.launcher3.LauncherSettings; @@ -42,6 +45,7 @@ import com.android.launcher3.util.PackageManagerHelper; import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * Task to add auto-created workspace items. @@ -50,14 +54,16 @@ public class AddWorkspaceItemsTask extends BaseModelUpdateTask { private static final String LOG = "AddWorkspaceItemsTask"; + @NonNull private final List> mItemList; + @NonNull private final WorkspaceItemSpaceFinder mItemSpaceFinder; /** * @param itemList items to add on the workspace */ - public AddWorkspaceItemsTask(List> itemList) { + public AddWorkspaceItemsTask(@NonNull final List> itemList) { this(itemList, new WorkspaceItemSpaceFinder()); } @@ -65,14 +71,15 @@ public class AddWorkspaceItemsTask extends BaseModelUpdateTask { * @param itemList items to add on the workspace * @param itemSpaceFinder inject WorkspaceItemSpaceFinder dependency for testing */ - public AddWorkspaceItemsTask(List> itemList, - WorkspaceItemSpaceFinder itemSpaceFinder) { + public AddWorkspaceItemsTask(@NonNull final List> itemList, + @NonNull final WorkspaceItemSpaceFinder itemSpaceFinder) { mItemList = itemList; mItemSpaceFinder = itemSpaceFinder; } @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) { if (mItemList.isEmpty()) { return; } @@ -98,7 +105,8 @@ public class AddWorkspaceItemsTask extends BaseModelUpdateTask { } // b/139663018 Short-circuit this logic if the icon is a system app - if (PackageManagerHelper.isSystemApp(app.getContext(), item.getIntent())) { + if (PackageManagerHelper.isSystemApp(app.getContext(), + Objects.requireNonNull(item.getIntent()))) { if (TestProtocol.sDebugTracing) { Log.d(TestProtocol.MISSING_PROMISE_ICON, LOG + " Item is a system app."); @@ -159,7 +167,7 @@ public class AddWorkspaceItemsTask extends BaseModelUpdateTask { continue; } - List activities = launcherApps + List activities = Objects.requireNonNull(launcherApps) .getActivityList(packageName, item.user); boolean hasActivity = activities != null && !activities.isEmpty(); @@ -218,7 +226,7 @@ public class AddWorkspaceItemsTask extends BaseModelUpdateTask { if (!addedItemsFinal.isEmpty()) { scheduleCallbackTask(new CallbackTask() { @Override - public void execute(Callbacks callbacks) { + public void execute(@NonNull Callbacks callbacks) { final ArrayList addAnimated = new ArrayList<>(); final ArrayList addNotAnimated = new ArrayList<>(); if (!addedItemsFinal.isEmpty()) { @@ -243,7 +251,8 @@ public class AddWorkspaceItemsTask extends BaseModelUpdateTask { * Returns true if the shortcuts already exists on the workspace. This must be called after * the workspace has been loaded. We identify a shortcut by its intent. */ - protected boolean shortcutExists(BgDataModel dataModel, Intent intent, UserHandle user) { + protected boolean shortcutExists(@NonNull final BgDataModel dataModel, + @Nullable final Intent intent, @NonNull final UserHandle user) { final String compPkgName, intentWithPkg, intentWithoutPkg; if (intent == null) { // Skip items with null intents diff --git a/src/com/android/launcher3/model/AllAppsList.java b/src/com/android/launcher3/model/AllAppsList.java index 95150dc526..6da948ce9d 100644 --- a/src/com/android/launcher3/model/AllAppsList.java +++ b/src/com/android/launcher3/model/AllAppsList.java @@ -66,7 +66,10 @@ public class AllAppsList { /** The list off all apps. */ public final ArrayList data = new ArrayList<>(DEFAULT_APPLICATIONS_NUMBER); + @NonNull private IconCache mIconCache; + + @NonNull private AppFilter mAppFilter; private boolean mDataChanged = false; diff --git a/src/com/android/launcher3/model/BaseModelUpdateTask.java b/src/com/android/launcher3/model/BaseModelUpdateTask.java index 2a6a6919e0..5b6f9f62a5 100644 --- a/src/com/android/launcher3/model/BaseModelUpdateTask.java +++ b/src/com/android/launcher3/model/BaseModelUpdateTask.java @@ -17,6 +17,7 @@ package com.android.launcher3.model; import android.util.Log; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.launcher3.LauncherAppState; @@ -47,14 +48,17 @@ public abstract class BaseModelUpdateTask implements ModelUpdateTask { private static final boolean DEBUG_TASKS = false; private static final String TAG = "BaseModelUpdateTask"; + // Nullabilities are explicitly omitted here because these are late-init fields, + // They will be non-null after init(), which is always the case in enqueueModelUpdateTask(). private LauncherAppState mApp; private LauncherModel mModel; private BgDataModel mDataModel; private AllAppsList mAllAppsList; private Executor mUiExecutor; - public void init(LauncherAppState app, LauncherModel model, - BgDataModel dataModel, AllAppsList allAppsList, Executor uiExecutor) { + public void init(@NonNull final LauncherAppState app, @NonNull final LauncherModel model, + @NonNull final BgDataModel dataModel, @NonNull final AllAppsList allAppsList, + @NonNull final Executor uiExecutor) { mApp = app; mModel = model; mDataModel = dataModel; @@ -64,7 +68,7 @@ public abstract class BaseModelUpdateTask implements ModelUpdateTask { @Override public final void run() { - if (!mModel.isModelLoaded()) { + if (!Objects.requireNonNull(mModel).isModelLoaded()) { if (DEBUG_TASKS) { Log.d(TAG, "Ignoring model task since loader is pending=" + this); } @@ -77,13 +81,13 @@ public abstract class BaseModelUpdateTask implements ModelUpdateTask { /** * Execute the actual task. Called on the worker thread. */ - public abstract void execute( - LauncherAppState app, BgDataModel dataModel, AllAppsList apps); + public abstract void execute(@NonNull LauncherAppState app, + @NonNull BgDataModel dataModel, @NonNull AllAppsList apps); /** * Schedules a {@param task} to be executed on the current callbacks. */ - public final void scheduleCallbackTask(final CallbackTask task) { + public final void scheduleCallbackTask(@NonNull final CallbackTask task) { for (final Callbacks cb : mModel.getCallbacks()) { mUiExecutor.execute(() -> task.execute(cb)); } @@ -95,7 +99,7 @@ public abstract class BaseModelUpdateTask implements ModelUpdateTask { return mModel.getWriter(false /* hasVerticalHotseat */, false /* verifyChanges */, null); } - public void bindUpdatedWorkspaceItems(List allUpdates) { + public void bindUpdatedWorkspaceItems(@NonNull final List allUpdates) { // Bind workspace items List workspaceUpdates = allUpdates.stream() .filter(info -> info.id != ItemInfo.NO_ID) @@ -113,18 +117,18 @@ public abstract class BaseModelUpdateTask implements ModelUpdateTask { .forEach(this::bindExtraContainerItems); } - public void bindExtraContainerItems(FixedContainerItems item) { + public void bindExtraContainerItems(@NonNull final FixedContainerItems item) { FixedContainerItems copy = item.clone(); scheduleCallbackTask(c -> c.bindExtraContainerItems(copy)); } - public void bindDeepShortcuts(BgDataModel dataModel) { + public void bindDeepShortcuts(@NonNull final BgDataModel dataModel) { final HashMap shortcutMapCopy = new HashMap<>(dataModel.deepShortcutMap); scheduleCallbackTask(callbacks -> callbacks.bindDeepShortcutMap(shortcutMapCopy)); } - public void bindUpdatedWidgets(BgDataModel dataModel) { + public void bindUpdatedWidgets(@NonNull final BgDataModel dataModel) { final ArrayList widgets = dataModel.widgetsModel.getWidgetsListForPicker(mApp.getContext()); scheduleCallbackTask(c -> c.bindAllWidgets(widgets)); diff --git a/src/com/android/launcher3/model/CacheDataUpdatedTask.java b/src/com/android/launcher3/model/CacheDataUpdatedTask.java index f644d49276..57fefaa8e1 100644 --- a/src/com/android/launcher3/model/CacheDataUpdatedTask.java +++ b/src/com/android/launcher3/model/CacheDataUpdatedTask.java @@ -18,6 +18,8 @@ package com.android.launcher3.model; import android.content.ComponentName; import android.os.UserHandle; +import androidx.annotation.NonNull; + import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherSettings; import com.android.launcher3.icons.IconCache; @@ -35,17 +37,23 @@ public class CacheDataUpdatedTask extends BaseModelUpdateTask { public static final int OP_SESSION_UPDATE = 2; private final int mOp; + + @NonNull private final UserHandle mUser; + + @NonNull private final HashSet mPackages; - public CacheDataUpdatedTask(int op, UserHandle user, HashSet packages) { + public CacheDataUpdatedTask(final int op, @NonNull final UserHandle user, + @NonNull final HashSet packages) { mOp = op; mUser = user; mPackages = packages; } @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) { IconCache iconCache = app.getIconCache(); ArrayList updatedShortcuts = new ArrayList<>(); @@ -65,7 +73,7 @@ public class CacheDataUpdatedTask extends BaseModelUpdateTask { bindApplicationsIfNeeded(); } - public boolean isValidShortcut(WorkspaceItemInfo si) { + public boolean isValidShortcut(@NonNull final WorkspaceItemInfo si) { switch (mOp) { case OP_CACHE_UPDATE: return true; diff --git a/src/com/android/launcher3/model/PackageIncrementalDownloadUpdatedTask.java b/src/com/android/launcher3/model/PackageIncrementalDownloadUpdatedTask.java index c0dc34abb5..b9fba9db61 100644 --- a/src/com/android/launcher3/model/PackageIncrementalDownloadUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageIncrementalDownloadUpdatedTask.java @@ -17,6 +17,8 @@ package com.android.launcher3.model; import android.os.UserHandle; +import androidx.annotation.NonNull; + import com.android.launcher3.LauncherAppState; import com.android.launcher3.model.data.AppInfo; import com.android.launcher3.model.data.ItemInfoWithIcon; @@ -31,19 +33,24 @@ import java.util.List; */ public class PackageIncrementalDownloadUpdatedTask extends BaseModelUpdateTask { + @NonNull private final UserHandle mUser; + private final int mProgress; + + @NonNull private final String mPackageName; - public PackageIncrementalDownloadUpdatedTask( - String packageName, UserHandle user, float progress) { + public PackageIncrementalDownloadUpdatedTask(@NonNull final String packageName, + @NonNull final UserHandle user, final float progress) { mUser = user; mProgress = 1 - progress > 0.001 ? (int) (100 * progress) : 100; mPackageName = packageName; } @Override - public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList appsList) { + public void execute(@NonNull LauncherAppState app, @NonNull final BgDataModel dataModel, + @NonNull final AllAppsList appsList) { PackageInstallInfo downloadInfo = new PackageInstallInfo( mPackageName, PackageInstallInfo.STATUS_INSTALLED_DOWNLOADING, diff --git a/src/com/android/launcher3/model/PackageInstallStateChangedTask.java b/src/com/android/launcher3/model/PackageInstallStateChangedTask.java index b74d0fc482..76a87ed1da 100644 --- a/src/com/android/launcher3/model/PackageInstallStateChangedTask.java +++ b/src/com/android/launcher3/model/PackageInstallStateChangedTask.java @@ -18,6 +18,8 @@ package com.android.launcher3.model; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import androidx.annotation.NonNull; + import com.android.launcher3.LauncherAppState; import com.android.launcher3.model.data.AppInfo; import com.android.launcher3.model.data.ItemInfo; @@ -33,14 +35,16 @@ import java.util.List; */ public class PackageInstallStateChangedTask extends BaseModelUpdateTask { + @NonNull private final PackageInstallInfo mInstallInfo; - public PackageInstallStateChangedTask(PackageInstallInfo installInfo) { + public PackageInstallStateChangedTask(@NonNull final PackageInstallInfo installInfo) { mInstallInfo = installInfo; } @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) { if (mInstallInfo.state == PackageInstallInfo.STATUS_INSTALLED) { try { // For instant apps we do not get package-add. Use setting events to update diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index a9d272e8cb..3d9d81ff4e 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -29,6 +29,8 @@ import android.os.UserHandle; import android.os.UserManager; import android.util.Log; +import androidx.annotation.NonNull; + import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherSettings; @@ -80,17 +82,23 @@ public class PackageUpdatedTask extends BaseModelUpdateTask { public static final int OP_USER_AVAILABILITY_CHANGE = 7; // user available/unavailable private final int mOp; + + @NonNull private final UserHandle mUser; + + @NonNull private final String[] mPackages; - public PackageUpdatedTask(int op, UserHandle user, String... packages) { + public PackageUpdatedTask(final int op, @NonNull final UserHandle user, + @NonNull final String... packages) { mOp = op; mUser = user; mPackages = packages; } @Override - public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList appsList) { + public void execute(@NonNull final LauncherAppState app, @NonNull final BgDataModel dataModel, + @NonNull final AllAppsList appsList) { final Context context = app.getContext(); final IconCache iconCache = app.getIconCache(); diff --git a/src/com/android/launcher3/model/ReloadStringCacheTask.java b/src/com/android/launcher3/model/ReloadStringCacheTask.java index f4d42988bf..34f7057dad 100644 --- a/src/com/android/launcher3/model/ReloadStringCacheTask.java +++ b/src/com/android/launcher3/model/ReloadStringCacheTask.java @@ -15,6 +15,8 @@ */ package com.android.launcher3.model; +import androidx.annotation.NonNull; + import com.android.launcher3.LauncherAppState; /** @@ -22,14 +24,17 @@ import com.android.launcher3.LauncherAppState; * {@link android.app.admin.DevicePolicyManager#ACTION_DEVICE_POLICY_RESOURCE_UPDATED}. */ public class ReloadStringCacheTask extends BaseModelUpdateTask { + + @NonNull private ModelDelegate mModelDelegate; - public ReloadStringCacheTask(ModelDelegate modelDelegate) { + public ReloadStringCacheTask(@NonNull final ModelDelegate modelDelegate) { mModelDelegate = modelDelegate; } @Override - public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList appsList) { + public void execute(@NonNull final LauncherAppState app, @NonNull final BgDataModel dataModel, + @NonNull final AllAppsList appsList) { synchronized (dataModel) { mModelDelegate.loadStringCache(dataModel.stringCache); StringCache cloneSC = dataModel.stringCache.clone(); diff --git a/src/com/android/launcher3/model/ShortcutsChangedTask.java b/src/com/android/launcher3/model/ShortcutsChangedTask.java index 1026e0bd5b..a6a04a7291 100644 --- a/src/com/android/launcher3/model/ShortcutsChangedTask.java +++ b/src/com/android/launcher3/model/ShortcutsChangedTask.java @@ -19,6 +19,8 @@ import android.content.Context; import android.content.pm.ShortcutInfo; import android.os.UserHandle; +import androidx.annotation.NonNull; + import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherSettings; import com.android.launcher3.model.data.WorkspaceItemInfo; @@ -38,13 +40,20 @@ import java.util.stream.Collectors; */ public class ShortcutsChangedTask extends BaseModelUpdateTask { + @NonNull private final String mPackageName; + + @NonNull private final List mShortcuts; + + @NonNull private final UserHandle mUser; + private final boolean mUpdateIdMap; - public ShortcutsChangedTask(String packageName, List shortcuts, - UserHandle user, boolean updateIdMap) { + public ShortcutsChangedTask(@NonNull final String packageName, + @NonNull final List shortcuts, @NonNull final UserHandle user, + final boolean updateIdMap) { mPackageName = packageName; mShortcuts = shortcuts; mUser = user; @@ -52,7 +61,8 @@ public class ShortcutsChangedTask extends BaseModelUpdateTask { } @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 Context context = app.getContext(); // Find WorkspaceItemInfo's that have changed on the workspace. ArrayList matchingWorkspaceItems = new ArrayList<>(); diff --git a/src/com/android/launcher3/model/UserLockStateChangedTask.java b/src/com/android/launcher3/model/UserLockStateChangedTask.java index 1565b19f4c..63ca35b79c 100644 --- a/src/com/android/launcher3/model/UserLockStateChangedTask.java +++ b/src/com/android/launcher3/model/UserLockStateChangedTask.java @@ -21,6 +21,8 @@ import android.content.Context; import android.content.pm.ShortcutInfo; import android.os.UserHandle; +import androidx.annotation.NonNull; + import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherSettings; import com.android.launcher3.model.data.WorkspaceItemInfo; @@ -40,16 +42,18 @@ import java.util.Iterator; */ public class UserLockStateChangedTask extends BaseModelUpdateTask { + @NonNull private final UserHandle mUser; private boolean mIsUserUnlocked; - public UserLockStateChangedTask(UserHandle user, boolean isUserUnlocked) { + public UserLockStateChangedTask(@NonNull final UserHandle user, final boolean isUserUnlocked) { mUser = user; mIsUserUnlocked = isUserUnlocked; } @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(); HashMap pinnedShortcuts = new HashMap<>(); diff --git a/src/com/android/launcher3/model/data/WorkspaceItemInfo.java b/src/com/android/launcher3/model/data/WorkspaceItemInfo.java index 1f16474503..59ef320120 100644 --- a/src/com/android/launcher3/model/data/WorkspaceItemInfo.java +++ b/src/com/android/launcher3/model/data/WorkspaceItemInfo.java @@ -24,7 +24,6 @@ import android.content.pm.ShortcutInfo; import android.text.TextUtils; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import com.android.launcher3.LauncherSettings; import com.android.launcher3.LauncherSettings.Favorites; @@ -76,6 +75,7 @@ public class WorkspaceItemInfo extends ItemInfoWithIcon { /** * The intent used to start the application. */ + @NonNull public Intent intent; /** @@ -148,7 +148,7 @@ public class WorkspaceItemInfo extends ItemInfoWithIcon { } @Override - @Nullable + @NonNull public Intent getIntent() { return intent; } @@ -166,7 +166,8 @@ public class WorkspaceItemInfo extends ItemInfoWithIcon { return isPromise() && !hasStatusFlag(FLAG_SUPPORTS_WEB_UI); } - public void updateFromDeepShortcutInfo(ShortcutInfo shortcutInfo, Context context) { + public void updateFromDeepShortcutInfo(@NonNull final ShortcutInfo shortcutInfo, + @NonNull final Context context) { // {@link ShortcutInfo#getActivity} can change during an update. Recreate the intent intent = ShortcutKey.makeIntent(shortcutInfo); title = shortcutInfo.getShortLabel(); diff --git a/src/com/android/launcher3/pm/InstallSessionHelper.java b/src/com/android/launcher3/pm/InstallSessionHelper.java index b695194aee..16bb868f65 100644 --- a/src/com/android/launcher3/pm/InstallSessionHelper.java +++ b/src/com/android/launcher3/pm/InstallSessionHelper.java @@ -30,6 +30,7 @@ import android.text.TextUtils; import android.util.Log; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.annotation.WorkerThread; @@ -51,38 +52,50 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Objects; /** * Utility class to tracking install sessions */ public class InstallSessionHelper { + @NonNull private static final String LOG = "InstallSessionHelper"; // Set of session ids of promise icons that have been added to the home screen // as FLAG_PROMISE_NEW_INSTALLS. + @NonNull protected static final String PROMISE_ICON_IDS = "promise_icon_ids"; private static final boolean DEBUG = false; + @NonNull public static final MainThreadInitializedObject INSTANCE = new MainThreadInitializedObject<>(InstallSessionHelper::new); + @Nullable private final LauncherApps mLauncherApps; + + @NonNull private final Context mAppContext; + @NonNull private final PackageInstaller mInstaller; + + @NonNull private final HashMap mSessionVerifiedMap = new HashMap<>(); + @Nullable private IntSet mPromiseIconIds; - public InstallSessionHelper(Context context) { + public InstallSessionHelper(@NonNull final Context context) { mInstaller = context.getPackageManager().getPackageInstaller(); mAppContext = context.getApplicationContext(); mLauncherApps = context.getSystemService(LauncherApps.class); } @WorkerThread + @NonNull private IntSet getPromiseIconIds() { Preconditions.assertWorkerThread(); if (mPromiseIconIds != null) { @@ -108,6 +121,7 @@ public class InstallSessionHelper { return mPromiseIconIds; } + @NonNull public HashMap getActiveSessions() { HashMap activePackages = new HashMap<>(); for (SessionInfo info : getAllVerifiedSessions()) { @@ -117,6 +131,7 @@ public class InstallSessionHelper { return activePackages; } + @Nullable public SessionInfo getActiveSessionInfo(UserHandle user, String pkg) { for (SessionInfo info : getAllVerifiedSessions()) { boolean match = pkg.equals(info.getAppPackageName()); @@ -136,11 +151,13 @@ public class InstallSessionHelper { .apply(); } - SessionInfo getVerifiedSessionInfo(int sessionId) { + @Nullable + SessionInfo getVerifiedSessionInfo(final int sessionId) { return verify(mInstaller.getSessionInfo(sessionId)); } - private SessionInfo verify(SessionInfo sessionInfo) { + @Nullable + private SessionInfo verify(@Nullable final SessionInfo sessionInfo) { if (sessionInfo == null || sessionInfo.getInstallerPackageName() == null || TextUtils.isEmpty(sessionInfo.getAppPackageName())) { @@ -167,9 +184,10 @@ public class InstallSessionHelper { return mSessionVerifiedMap.get(pkg) ? sessionInfo : null; } + @NonNull public List getAllVerifiedSessions() { List list = new ArrayList<>(Utilities.ATLEAST_Q - ? mLauncherApps.getAllPackageInstallerSessions() + ? Objects.requireNonNull(mLauncherApps).getAllPackageInstallerSessions() : mInstaller.getAllSessions()); Iterator it = list.iterator(); while (it.hasNext()) { @@ -201,12 +219,12 @@ public class InstallSessionHelper { } @WorkerThread - public boolean promiseIconAddedForId(int sessionId) { + public boolean promiseIconAddedForId(final int sessionId) { return getPromiseIconIds().contains(sessionId); } @WorkerThread - public void removePromiseIconId(int sessionId) { + public void removePromiseIconId(final int sessionId) { if (promiseIconAddedForId(sessionId)) { getPromiseIconIds().getArray().removeValue(sessionId); updatePromiseIconPrefs(); @@ -222,7 +240,7 @@ public class InstallSessionHelper { * - A promise icon for the session has not already been created */ @WorkerThread - void tryQueuePromiseAppIcon(PackageInstaller.SessionInfo sessionInfo) { + void tryQueuePromiseAppIcon(@Nullable final PackageInstaller.SessionInfo sessionInfo) { if (TestProtocol.sDebugTracing) { Log.d(TestProtocol.MISSING_PROMISE_ICON, LOG + " tryQueuePromiseAppIcon" + ", SessionCommitReceiveEnabled" + SessionCommitReceiver.isEnabled(mAppContext) @@ -244,7 +262,7 @@ public class InstallSessionHelper { } } - public boolean verifySessionInfo(PackageInstaller.SessionInfo sessionInfo) { + public boolean verifySessionInfo(@Nullable final PackageInstaller.SessionInfo sessionInfo) { if (TestProtocol.sDebugTracing) { boolean appNotInstalled = sessionInfo == null || !new PackageManagerHelper(mAppContext) @@ -267,14 +285,15 @@ public class InstallSessionHelper { sessionInfo.getAppPackageName(), getUserHandle(sessionInfo)); } - public InstallSessionTracker registerInstallTracker(InstallSessionTracker.Callback callback) { + public InstallSessionTracker registerInstallTracker( + @Nullable final InstallSessionTracker.Callback callback) { InstallSessionTracker tracker = new InstallSessionTracker( this, callback, mInstaller, mLauncherApps); tracker.register(); return tracker; } - public static UserHandle getUserHandle(SessionInfo info) { + public static UserHandle getUserHandle(@NonNull final SessionInfo info) { return Utilities.ATLEAST_Q ? info.getUser() : Process.myUserHandle(); } } diff --git a/src/com/android/launcher3/pm/InstallSessionTracker.java b/src/com/android/launcher3/pm/InstallSessionTracker.java index b16aaa2357..aeaa320ec9 100644 --- a/src/com/android/launcher3/pm/InstallSessionTracker.java +++ b/src/com/android/launcher3/pm/InstallSessionTracker.java @@ -28,12 +28,15 @@ import android.os.UserHandle; import android.util.Log; import android.util.SparseArray; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; import com.android.launcher3.testing.shared.TestProtocol; import com.android.launcher3.util.PackageUserKey; import java.lang.ref.WeakReference; +import java.util.Objects; @WorkerThread public class InstallSessionTracker extends PackageInstaller.SessionCallback { @@ -41,14 +44,22 @@ public class InstallSessionTracker extends PackageInstaller.SessionCallback { // Lazily initialized private SparseArray mActiveSessions = null; + @NonNull private final WeakReference mWeakHelper; + + @NonNull private final WeakReference mWeakCallback; + + @NonNull private final PackageInstaller mInstaller; + + @Nullable private final LauncherApps mLauncherApps; - InstallSessionTracker(InstallSessionHelper installerCompat, Callback callback, - PackageInstaller installer, LauncherApps launcherApps) { + InstallSessionTracker(@Nullable final InstallSessionHelper installerCompat, + @Nullable final Callback callback, @NonNull final PackageInstaller installer, + @Nullable LauncherApps launcherApps) { mWeakHelper = new WeakReference<>(installerCompat); mWeakCallback = new WeakReference<>(callback); mInstaller = installer; @@ -56,7 +67,7 @@ public class InstallSessionTracker extends PackageInstaller.SessionCallback { } @Override - public void onCreated(int sessionId) { + public void onCreated(final int sessionId) { InstallSessionHelper helper = mWeakHelper.get(); Callback callback = mWeakCallback.get(); if (TestProtocol.sDebugTracing) { @@ -80,7 +91,7 @@ public class InstallSessionTracker extends PackageInstaller.SessionCallback { } @Override - public void onFinished(int sessionId, boolean success) { + public void onFinished(final int sessionId, final boolean success) { InstallSessionHelper helper = mWeakHelper.get(); Callback callback = mWeakCallback.get(); if (callback == null || helper == null) { @@ -108,7 +119,7 @@ public class InstallSessionTracker extends PackageInstaller.SessionCallback { } @Override - public void onProgressChanged(int sessionId, float progress) { + public void onProgressChanged(final int sessionId, final float progress) { InstallSessionHelper helper = mWeakHelper.get(); Callback callback = mWeakCallback.get(); if (callback == null || helper == null) { @@ -121,10 +132,10 @@ public class InstallSessionTracker extends PackageInstaller.SessionCallback { } @Override - public void onActiveChanged(int sessionId, boolean active) { } + public void onActiveChanged(final int sessionId, final boolean active) { } @Override - public void onBadgingChanged(int sessionId) { + public void onBadgingChanged(final int sessionId) { InstallSessionHelper helper = mWeakHelper.get(); Callback callback = mWeakCallback.get(); if (callback == null || helper == null) { @@ -136,8 +147,9 @@ public class InstallSessionTracker extends PackageInstaller.SessionCallback { } } - private SessionInfo pushSessionDisplayToLauncher( - int sessionId, InstallSessionHelper helper, Callback callback) { + @Nullable + private SessionInfo pushSessionDisplayToLauncher(final int sessionId, + @NonNull final InstallSessionHelper helper, @NonNull final Callback callback) { SessionInfo session = helper.getVerifiedSessionInfo(sessionId); if (session != null && session.getAppPackageName() != null) { PackageUserKey key = @@ -149,7 +161,9 @@ public class InstallSessionTracker extends PackageInstaller.SessionCallback { return null; } - private SparseArray getActiveSessionMap(InstallSessionHelper helper) { + @NonNull + private SparseArray getActiveSessionMap( + @NonNull final InstallSessionHelper helper) { if (mActiveSessions == null) { mActiveSessions = new SparseArray<>(); helper.getActiveSessions().forEach( @@ -162,7 +176,8 @@ public class InstallSessionTracker extends PackageInstaller.SessionCallback { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { mInstaller.registerSessionCallback(this, MODEL_EXECUTOR.getHandler()); } else { - mLauncherApps.registerPackageInstallerSessionCallback(MODEL_EXECUTOR, this); + Objects.requireNonNull(mLauncherApps).registerPackageInstallerSessionCallback( + MODEL_EXECUTOR, this); } } @@ -170,18 +185,18 @@ public class InstallSessionTracker extends PackageInstaller.SessionCallback { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { mInstaller.unregisterSessionCallback(this); } else { - mLauncherApps.unregisterPackageInstallerSessionCallback(this); + Objects.requireNonNull(mLauncherApps).unregisterPackageInstallerSessionCallback(this); } } public interface Callback { - void onSessionFailure(String packageName, UserHandle user); + void onSessionFailure(@NonNull String packageName, @NonNull UserHandle user); - void onUpdateSessionDisplay(PackageUserKey key, SessionInfo info); + void onUpdateSessionDisplay(@NonNull PackageUserKey key, @NonNull SessionInfo info); - void onPackageStateChanged(PackageInstallInfo info); + void onPackageStateChanged(@NonNull PackageInstallInfo info); - void onInstallSessionCreated(PackageInstallInfo info); + void onInstallSessionCreated(@NonNull PackageInstallInfo info); } } diff --git a/src/com/android/launcher3/util/PackageManagerHelper.java b/src/com/android/launcher3/util/PackageManagerHelper.java index f42d30453b..12e8b54547 100644 --- a/src/com/android/launcher3/util/PackageManagerHelper.java +++ b/src/com/android/launcher3/util/PackageManagerHelper.java @@ -43,6 +43,9 @@ import android.util.Log; import android.util.Pair; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import com.android.launcher3.PendingAddItemInfo; import com.android.launcher3.R; import com.android.launcher3.Utilities; @@ -54,6 +57,7 @@ import com.android.launcher3.model.data.WorkspaceItemInfo; import java.net.URISyntaxException; import java.util.List; +import java.util.Objects; /** * Utility methods using package manager @@ -62,22 +66,28 @@ public class PackageManagerHelper { private static final String TAG = "PackageManagerHelper"; + @NonNull private final Context mContext; + + @NonNull private final PackageManager mPm; + + @NonNull private final LauncherApps mLauncherApps; - public PackageManagerHelper(Context context) { + public PackageManagerHelper(@NonNull final Context context) { mContext = context; mPm = context.getPackageManager(); - mLauncherApps = context.getSystemService(LauncherApps.class); + mLauncherApps = Objects.requireNonNull(context.getSystemService(LauncherApps.class)); } /** * Returns true if the app can possibly be on the SDCard. This is just a workaround and doesn't * guarantee that the app is on SD card. */ - public boolean isAppOnSdcard(String packageName, UserHandle user) { - ApplicationInfo info = getApplicationInfo( + public boolean isAppOnSdcard(@NonNull final String packageName, + @NonNull final UserHandle user) { + final ApplicationInfo info = getApplicationInfo( packageName, user, PackageManager.MATCH_UNINSTALLED_PACKAGES); return info != null && (info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0; } @@ -86,23 +96,27 @@ public class PackageManagerHelper { * Returns whether the target app is suspended for a given user as per * {@link android.app.admin.DevicePolicyManager#isPackageSuspended}. */ - public boolean isAppSuspended(String packageName, UserHandle user) { - ApplicationInfo info = getApplicationInfo(packageName, user, 0); + public boolean isAppSuspended(@NonNull final String packageName, + @NonNull final UserHandle user) { + final ApplicationInfo info = getApplicationInfo(packageName, user, 0); return info != null && isAppSuspended(info); } /** * Returns whether the target app is installed for a given user */ - public boolean isAppInstalled(String packageName, UserHandle user) { - ApplicationInfo info = getApplicationInfo(packageName, user, 0); + public boolean isAppInstalled(@NonNull final String packageName, + @NonNull final UserHandle user) { + final ApplicationInfo info = getApplicationInfo(packageName, user, 0); return info != null; } /** * Returns the application info for the provided package or null */ - public ApplicationInfo getApplicationInfo(String packageName, UserHandle user, int flags) { + @Nullable + public ApplicationInfo getApplicationInfo(@NonNull final String packageName, + @NonNull final UserHandle user, final int flags) { try { ApplicationInfo info = mLauncherApps.getApplicationInfo(packageName, flags, user); return (info.flags & ApplicationInfo.FLAG_INSTALLED) == 0 || !info.enabled @@ -116,7 +130,8 @@ public class PackageManagerHelper { return mPm.isSafeMode(); } - public Intent getAppLaunchIntent(String pkg, UserHandle user) { + @Nullable + public Intent getAppLaunchIntent(@Nullable final String pkg, @NonNull final UserHandle user) { List activities = mLauncherApps.getActivityList(pkg, user); return activities.isEmpty() ? null : AppInfo.makeLaunchIntent(activities.get(0)); @@ -251,7 +266,8 @@ public class PackageManagerHelper { return packageFilter; } - public static boolean isSystemApp(Context context, Intent intent) { + public static boolean isSystemApp(@NonNull final Context context, + @NonNull final Intent intent) { PackageManager pm = context.getPackageManager(); ComponentName cn = intent.getComponent(); String packageName = null; diff --git a/tests/src/com/android/launcher3/util/LauncherModelHelper.java b/tests/src/com/android/launcher3/util/LauncherModelHelper.java index 33249592c2..e7e551fd0d 100644 --- a/tests/src/com/android/launcher3/util/LauncherModelHelper.java +++ b/tests/src/com/android/launcher3/util/LauncherModelHelper.java @@ -47,6 +47,7 @@ import android.provider.Settings; import android.test.mock.MockContentResolver; import android.util.ArrayMap; +import androidx.annotation.NonNull; import androidx.test.core.app.ApplicationProvider; import androidx.test.uiautomator.UiDevice; @@ -194,8 +195,9 @@ public class LauncherModelHelper { Executor mockExecutor = mock(Executor.class); model.enqueueModelUpdateTask(new ModelUpdateTask() { @Override - public void init(LauncherAppState app, LauncherModel model, BgDataModel dataModel, - AllAppsList allAppsList, Executor uiExecutor) { + public void init(@NonNull final LauncherAppState app, + @NonNull final LauncherModel model, @NonNull final BgDataModel dataModel, + @NonNull final AllAppsList allAppsList, @NonNull final Executor uiExecutor) { task.init(app, model, dataModel, allAppsList, mockExecutor); }