Merge "Explicit Nullbility in Launcher (Part 5)" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
69c04c21c5
@@ -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)));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user