Merge "Explicit Nullbility in Launcher (Part 5)" into tm-qpr-dev am: 69c04c21c5

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/19976255

Change-Id: Id7d92e7b4c432e8caafb92b62956387bd0c1e42e
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
TreeHugger Robot
2022-09-19 17:45:38 +00:00
committed by Automerger Merge Worker
21 changed files with 290 additions and 130 deletions
@@ -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
@@ -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<ComponentKey> widgetsInWorkspace = dataModel.appWidgets.stream().map(
widget -> new ComponentKey(widget.providerName, widget.user)).collect(
Collectors.toSet());
@@ -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)));
}
+81 -47
View File
@@ -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<Callbacks> 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<Pair<ItemInfo, Object>> itemList) {
public void addAndBindAddedWorkspaceItems(
@NonNull final List<Pair<ItemInfo, Object>> 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<ShortcutInfo> shortcuts,
UserHandle user) {
public void onShortcutsChanged(@NonNull final String packageName,
@NonNull final List<ShortcutInfo> 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<BgDataModel> callback) {
public void loadAsync(@NonNull final Consumer<BgDataModel> 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<String> 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<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),
// 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<String> updatedPackages, UserHandle user) {
public void onWidgetLabelsUpdated(@NonNull final HashSet<String> 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<WorkspaceItemInfo> itemProvider) {
public void updateAndBindWorkspaceItem(
@NonNull final Supplier<WorkspaceItemInfo> 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<WorkspaceItemInfo> 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()]);
@@ -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<AdapterItem> {
public void doSearch(String query, SearchCallback<AdapterItem> 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<AdapterItem> result = getTitleMatchResult(apps.data, query);
if (mAddNoResultsMessage && result.isEmpty()) {
result.add(getEmptyMessageAdapterItem(query));
@@ -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());
}
@@ -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<Pair<ItemInfo, Object>> mItemList;
@NonNull
private final WorkspaceItemSpaceFinder mItemSpaceFinder;
/**
* @param itemList items to add on the workspace
*/
public AddWorkspaceItemsTask(List<Pair<ItemInfo, Object>> itemList) {
public AddWorkspaceItemsTask(@NonNull final List<Pair<ItemInfo, Object>> 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<Pair<ItemInfo, Object>> itemList,
WorkspaceItemSpaceFinder itemSpaceFinder) {
public AddWorkspaceItemsTask(@NonNull final List<Pair<ItemInfo, Object>> 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<LauncherActivityInfo> activities = launcherApps
List<LauncherActivityInfo> 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<ItemInfo> addAnimated = new ArrayList<>();
final ArrayList<ItemInfo> 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
@@ -66,7 +66,10 @@ public class AllAppsList {
/** The list off all apps. */
public final ArrayList<AppInfo> data = new ArrayList<>(DEFAULT_APPLICATIONS_NUMBER);
@NonNull
private IconCache mIconCache;
@NonNull
private AppFilter mAppFilter;
private boolean mDataChanged = false;
@@ -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<WorkspaceItemInfo> allUpdates) {
public void bindUpdatedWorkspaceItems(@NonNull final List<WorkspaceItemInfo> allUpdates) {
// Bind workspace items
List<WorkspaceItemInfo> 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<ComponentKey, Integer> shortcutMapCopy =
new HashMap<>(dataModel.deepShortcutMap);
scheduleCallbackTask(callbacks -> callbacks.bindDeepShortcutMap(shortcutMapCopy));
}
public void bindUpdatedWidgets(BgDataModel dataModel) {
public void bindUpdatedWidgets(@NonNull final BgDataModel dataModel) {
final ArrayList<WidgetsListBaseEntry> widgets =
dataModel.widgetsModel.getWidgetsListForPicker(mApp.getContext());
scheduleCallbackTask(c -> c.bindAllWidgets(widgets));
@@ -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<String> mPackages;
public CacheDataUpdatedTask(int op, UserHandle user, HashSet<String> packages) {
public CacheDataUpdatedTask(final int op, @NonNull final UserHandle user,
@NonNull final HashSet<String> 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<WorkspaceItemInfo> 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;
@@ -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,
@@ -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
@@ -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();
@@ -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();
@@ -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<ShortcutInfo> mShortcuts;
@NonNull
private final UserHandle mUser;
private final boolean mUpdateIdMap;
public ShortcutsChangedTask(String packageName, List<ShortcutInfo> shortcuts,
UserHandle user, boolean updateIdMap) {
public ShortcutsChangedTask(@NonNull final String packageName,
@NonNull final List<ShortcutInfo> 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<WorkspaceItemInfo> matchingWorkspaceItems = new ArrayList<>();
@@ -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<ShortcutKey, ShortcutInfo> pinnedShortcuts = new HashMap<>();
@@ -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();
@@ -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<String> 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<InstallSessionHelper> INSTANCE =
new MainThreadInitializedObject<>(InstallSessionHelper::new);
@Nullable
private final LauncherApps mLauncherApps;
@NonNull
private final Context mAppContext;
@NonNull
private final PackageInstaller mInstaller;
@NonNull
private final HashMap<String, Boolean> 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<PackageUserKey, SessionInfo> getActiveSessions() {
HashMap<PackageUserKey, SessionInfo> 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<SessionInfo> getAllVerifiedSessions() {
List<SessionInfo> list = new ArrayList<>(Utilities.ATLEAST_Q
? mLauncherApps.getAllPackageInstallerSessions()
? Objects.requireNonNull(mLauncherApps).getAllPackageInstallerSessions()
: mInstaller.getAllSessions());
Iterator<SessionInfo> 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();
}
}
@@ -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<PackageUserKey> mActiveSessions = null;
@NonNull
private final WeakReference<InstallSessionHelper> mWeakHelper;
@NonNull
private final WeakReference<Callback> 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<PackageUserKey> getActiveSessionMap(InstallSessionHelper helper) {
@NonNull
private SparseArray<PackageUserKey> 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);
}
}
@@ -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<LauncherActivityInfo> 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;
@@ -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);
}