diff options
Diffstat (limited to 'src/com/android/launcher3/model/LoaderTask.java')
-rw-r--r-- | src/com/android/launcher3/model/LoaderTask.java | 115 |
1 files changed, 91 insertions, 24 deletions
diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java index 0e68db29e8..a98ec6484a 100644 --- a/src/com/android/launcher3/model/LoaderTask.java +++ b/src/com/android/launcher3/model/LoaderTask.java @@ -16,10 +16,17 @@ package com.android.launcher3.model; +import static com.android.launcher3.BuildConfig.WIDGET_ON_FIRST_SCREEN; +import static com.android.launcher3.LauncherPrefs.SHOULD_SHOW_SMARTSPACE; +import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APP_PAIR; import static com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME; +import static com.android.launcher3.config.FeatureFlags.ENABLE_SMARTSPACE_REMOVAL; +import static com.android.launcher3.config.FeatureFlags.SMARTSPACE_AS_A_WIDGET; import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_HAS_SHORTCUT_PERMISSION; +import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_PRIVATE_PROFILE_QUIET_MODE_ENABLED; import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_QUIET_MODE_CHANGE_PERMISSION; import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_QUIET_MODE_ENABLED; +import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_WORK_PROFILE_QUIET_MODE_ENABLED; import static com.android.launcher3.model.ModelUtils.filterCurrentWorkspaceItems; import static com.android.launcher3.model.data.ItemInfoWithIcon.FLAG_DISABLED_LOCKED_USER; import static com.android.launcher3.model.data.ItemInfoWithIcon.FLAG_DISABLED_SAFEMODE; @@ -52,11 +59,14 @@ import android.util.LongSparseArray; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import com.android.launcher3.DeviceProfile; +import com.android.launcher3.Flags; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; +import com.android.launcher3.LauncherPrefs; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; @@ -95,6 +105,7 @@ import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.TraceHelper; import com.android.launcher3.widget.LauncherAppWidgetProviderInfo; import com.android.launcher3.widget.WidgetManagerHelper; +import com.android.launcher3.widget.custom.CustomWidgetManager; import java.util.ArrayList; import java.util.Collections; @@ -114,6 +125,7 @@ import java.util.concurrent.CancellationException; */ public class LoaderTask implements Runnable { private static final String TAG = "LoaderTask"; + public static final String SMARTSPACE_ON_HOME_SCREEN = "pref_smartspace_home_screen"; private static final boolean DEBUG = true; @@ -135,7 +147,7 @@ public class LoaderTask implements Runnable { private final InstallSessionHelper mSessionHelper; private final IconCache mIconCache; - private final UserManagerState mUserManagerState = new UserManagerState(); + private final UserManagerState mUserManagerState; protected final Map<ComponentKey, AppWidgetProviderInfo> mWidgetProvidersMap = new ArrayMap<>(); private Map<ShortcutKey, ShortcutInfo> mShortcutKeyToPinnedShortcuts; @@ -148,6 +160,13 @@ public class LoaderTask implements Runnable { public LoaderTask(@NonNull LauncherAppState app, AllAppsList bgAllAppsList, BgDataModel bgModel, ModelDelegate modelDelegate, @NonNull LauncherBinder launcherBinder) { + this(app, bgAllAppsList, bgModel, modelDelegate, launcherBinder, new UserManagerState()); + } + + @VisibleForTesting + LoaderTask(@NonNull LauncherAppState app, AllAppsList bgAllAppsList, BgDataModel bgModel, + ModelDelegate modelDelegate, @NonNull LauncherBinder launcherBinder, + UserManagerState userManagerState) { mApp = app; mBgAllAppsList = bgAllAppsList; mBgDataModel = bgModel; @@ -156,9 +175,10 @@ public class LoaderTask implements Runnable { mLauncherApps = mApp.getContext().getSystemService(LauncherApps.class); mUserManager = mApp.getContext().getSystemService(UserManager.class); - mUserCache = UserCache.INSTANCE.get(mApp.getContext()); + mUserCache = UserCache.getInstance(mApp.getContext()); mSessionHelper = InstallSessionHelper.INSTANCE.get(mApp.getContext()); mIconCache = mApp.getIconCache(); + mUserManagerState = userManagerState; } protected synchronized void waitForIdle() { @@ -295,6 +315,19 @@ public class LoaderTask implements Runnable { logASplit("bindWidgets"); verifyNotStopped(); + LauncherPrefs prefs = LauncherPrefs.get(mApp.getContext()); + if (SMARTSPACE_AS_A_WIDGET.get() && prefs.get(SHOULD_SHOW_SMARTSPACE)) { + mLauncherBinder.bindSmartspaceWidget(); + // Turn off pref. + prefs.putSync(SHOULD_SHOW_SMARTSPACE.to(false)); + logASplit("bindSmartspaceWidget"); + verifyNotStopped(); + } else if (!SMARTSPACE_AS_A_WIDGET.get() && WIDGET_ON_FIRST_SCREEN + && !prefs.get(LauncherPrefs.SHOULD_SHOW_SMARTSPACE)) { + // Turn on pref. + prefs.putSync(SHOULD_SHOW_SMARTSPACE.to(true)); + } + if (FeatureFlags.CHANGE_MODEL_DELEGATE_LOADING_ORDER.get()) { mModelDelegate.loadAndBindOtherItems(mLauncherBinder.mCallbacksList); logASplit("otherDelegateItems"); @@ -350,6 +383,9 @@ public class LoaderTask implements Runnable { mModelDelegate.markActive(); logASplit("workspaceDelegateItems"); } + mBgDataModel.isFirstPagePinnedItemEnabled = FeatureFlags.QSB_ON_FIRST_SCREEN + && (!ENABLE_SMARTSPACE_REMOVAL.get() || LauncherPrefs.getPrefs( + mApp.getContext()).getBoolean(SMARTSPACE_ON_HOME_SCREEN, true)); } private void loadWorkspaceImpl( @@ -375,7 +411,7 @@ public class LoaderTask implements Runnable { mSessionHelper.getActiveSessions(); installingPkgs.forEach(mApp.getIconCache()::updateSessionCache); FileLog.d(TAG, "loadWorkspace: Packages with active install sessions: " - + installingPkgs.values()); + + installingPkgs.keySet().stream().map(info -> info.mPackageName).toList()); final PackageUserKey tempPackageKey = new PackageUserKey(null, null); mFirstScreenBroadcast = new FirstScreenBroadcast(installingPkgs); @@ -404,10 +440,15 @@ public class LoaderTask implements Runnable { mShortcutKeyToPinnedShortcuts.put(ShortcutKey.fromInfo(shortcut), shortcut); } + if (pinnedShortcuts.isEmpty()) { + FileLog.d(TAG, "No pinned shortcuts found for user " + user); + } } else { // Shortcut manager can fail due to some race condition when the // lock state changes too frequently. For the purpose of the loading // shortcuts, consider the user is still locked. + FileLog.d(TAG, "Shortcut request failed for user " + + user + ", user may still be locked."); userUnlocked = false; } } @@ -445,23 +486,27 @@ public class LoaderTask implements Runnable { mItemsDeleted = c.commitDeleted(); // Sort the folder items, update ranks, and make sure all preview items are high res. - FolderGridOrganizer verifier = - new FolderGridOrganizer(mApp.getInvariantDeviceProfile()); + List<FolderGridOrganizer> verifiers = + mApp.getInvariantDeviceProfile().supportedProfiles.stream().map( + FolderGridOrganizer::new).toList(); for (FolderInfo folder : mBgDataModel.folders) { Collections.sort(folder.contents, Folder.ITEM_POS_COMPARATOR); - verifier.setFolderInfo(folder); + verifiers.forEach(verifier -> verifier.setFolderInfo(folder)); int size = folder.contents.size(); // Update ranks here to ensure there are no gaps caused by removed folder items. - // Ranks are the source of truth for folder items, so cellX and cellY can be ignored - // for now. Database will be updated once user manually modifies folder. + // Ranks are the source of truth for folder items, so cellX and cellY can be + // ignored for now. Database will be updated once user manually modifies folder. for (int rank = 0; rank < size; ++rank) { WorkspaceItemInfo info = folder.contents.get(rank); - info.rank = rank; + // rank is used differently in app pairs, so don't reset + if (folder.itemType != ITEM_TYPE_APP_PAIR) { + info.rank = rank; + } - if (info.usingLowResIcon() - && info.itemType == Favorites.ITEM_TYPE_APPLICATION - && verifier.isItemInPreview(info.rank)) { + if (info.usingLowResIcon() && info.itemType == Favorites.ITEM_TYPE_APPLICATION + && verifiers.stream().anyMatch( + verifier -> verifier.isItemInPreview(info.rank))) { mIconCache.getTitleAndIcon(info, false); } } @@ -550,17 +595,17 @@ public class LoaderTask implements Runnable { // Package is not yet available but might be // installed later. FileLog.d(TAG, "package not yet restored: " + targetPkg); - tempPackageKey.update(targetPkg, c.user); if (c.hasRestoreFlag(WorkspaceItemInfo.FLAG_RESTORE_STARTED)) { // Restore has started once. } else if (installingPkgs.containsKey(tempPackageKey)) { // App restore has started. Update the flag c.restoreFlag |= WorkspaceItemInfo.FLAG_RESTORE_STARTED; - c.updater().put(Favorites.RESTORED, - c.restoreFlag).commit(); + FileLog.d(TAG, "restore started for installing app: " + targetPkg); + c.updater().put(Favorites.RESTORED, c.restoreFlag).commit(); } else { - c.markDeleted("Unrestored app removed: " + targetPkg); + c.markDeleted("removing app that is not restored and not " + + "installing. package: " + targetPkg); return; } } else if (pmHelper.isAppOnSdcard(targetPkg, c.user)) { @@ -571,7 +616,7 @@ public class LoaderTask implements Runnable { } else if (!isSdCardReady) { // SdCard is not ready yet. Package might get available, // once it is ready. - Log.d(TAG, "Missing pkg, will check later: " + targetPkg); + Log.d(TAG, "Missing package, will check later: " + targetPkg); mPendingPackages.add(new PackageUserKey(targetPkg, c.user)); // Add the icon on the workspace anyway. allowMissingTarget = true; @@ -607,7 +652,8 @@ public class LoaderTask implements Runnable { ShortcutInfo pinnedShortcut = mShortcutKeyToPinnedShortcuts.get(key); if (pinnedShortcut == null) { // The shortcut is no longer valid. - c.markDeleted("Pinned shortcut not found"); + c.markDeleted("Pinned shortcut not found for package: " + + key.getPackageName()); return; } info = new WorkspaceItemInfo(pinnedShortcut, mApp.getContext()); @@ -740,8 +786,13 @@ public class LoaderTask implements Runnable { ComponentKey providerKey = new ComponentKey(component, c.user); if (!mWidgetProvidersMap.containsKey(providerKey)) { - mWidgetProvidersMap.put(providerKey, - widgetHelper.findProvider(component, c.user)); + if (customWidget) { + mWidgetProvidersMap.put(providerKey, CustomWidgetManager.INSTANCE + .get(mApp.getContext()).getWidgetProvider(component)); + } else { + mWidgetProvidersMap.put(providerKey, + widgetHelper.findProvider(component, c.user)); + } } final AppWidgetProviderInfo provider = mWidgetProvidersMap.get(providerKey); @@ -772,7 +823,7 @@ public class LoaderTask implements Runnable { } else { Log.v(TAG, "Widget restore pending id=" + c.id + " appWidgetId=" + appWidgetId - + " status =" + c.restoreFlag); + + " status=" + c.restoreFlag); appWidgetInfo = new LauncherAppWidgetInfo(appWidgetId, component); appWidgetInfo.restoreStatus = c.restoreFlag; @@ -814,7 +865,8 @@ public class LoaderTask implements Runnable { return; } LauncherAppWidgetProviderInfo widgetProviderInfo = - widgetHelper.getLauncherAppWidgetInfo(appWidgetId); + widgetHelper.getLauncherAppWidgetInfo(appWidgetId, + appWidgetInfo.getTargetComponent()); if (widgetProviderInfo != null && (appWidgetInfo.spanX < widgetProviderInfo.minSpanX || appWidgetInfo.spanY < widgetProviderInfo.minSpanY)) { @@ -940,6 +992,8 @@ public class LoaderTask implements Runnable { mBgAllAppsList.clear(); List<IconRequestInfo<AppInfo>> iconRequestInfos = new ArrayList<>(); + boolean isWorkProfileQuiet = false; + boolean isPrivateProfileQuiet = false; for (UserHandle user : profiles) { // Query for the set of apps final List<LauncherActivityInfo> apps = mLauncherApps.getActivityList(null, user); @@ -949,6 +1003,14 @@ public class LoaderTask implements Runnable { return allActivityList; } boolean quietMode = mUserManagerState.isUserQuiet(user); + + if (Flags.enablePrivateSpace()) { + if (mUserCache.getUserInfo(user).isWork()) { + isWorkProfileQuiet = quietMode; + } else if (mUserCache.getUserInfo(user).isPrivate()) { + isPrivateProfileQuiet = quietMode; + } + } // Create the ApplicationInfos for (int i = 0; i < apps.size(); i++) { LauncherActivityInfo app = apps.get(i); @@ -990,8 +1052,13 @@ public class LoaderTask implements Runnable { Trace.endSection(); } - mBgAllAppsList.setFlags(FLAG_QUIET_MODE_ENABLED, - mUserManagerState.isAnyProfileQuietModeEnabled()); + if (Flags.enablePrivateSpace()) { + mBgAllAppsList.setFlags(FLAG_WORK_PROFILE_QUIET_MODE_ENABLED, isWorkProfileQuiet); + mBgAllAppsList.setFlags(FLAG_PRIVATE_PROFILE_QUIET_MODE_ENABLED, isPrivateProfileQuiet); + } else { + mBgAllAppsList.setFlags(FLAG_QUIET_MODE_ENABLED, + mUserManagerState.isAnyProfileQuietModeEnabled()); + } mBgAllAppsList.setFlags(FLAG_HAS_SHORTCUT_PERMISSION, hasShortcutsPermission(mApp.getContext())); mBgAllAppsList.setFlags(FLAG_QUIET_MODE_CHANGE_PERMISSION, |