diff options
Diffstat (limited to 'src/com/android/launcher3/util/ManagedProfileHeuristic.java')
-rw-r--r-- | src/com/android/launcher3/util/ManagedProfileHeuristic.java | 277 |
1 files changed, 128 insertions, 149 deletions
diff --git a/src/com/android/launcher3/util/ManagedProfileHeuristic.java b/src/com/android/launcher3/util/ManagedProfileHeuristic.java index ce603c4c2..091dd84bc 100644 --- a/src/com/android/launcher3/util/ManagedProfileHeuristic.java +++ b/src/com/android/launcher3/util/ManagedProfileHeuristic.java @@ -19,23 +19,23 @@ package com.android.launcher3.util; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.LauncherActivityInfo; +import android.os.Handler; import android.os.Process; import android.os.UserHandle; -import android.support.v4.os.BuildCompat; -import com.android.launcher3.AppInfo; import com.android.launcher3.FolderInfo; -import com.android.launcher3.IconCache; +import com.android.launcher3.InstallShortcutReceiver; import com.android.launcher3.ItemInfo; -import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherFiles; import com.android.launcher3.LauncherModel; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.R; import com.android.launcher3.SessionCommitReceiver; import com.android.launcher3.ShortcutInfo; +import com.android.launcher3.Utilities; import com.android.launcher3.compat.UserManagerCompat; -import com.android.launcher3.shortcuts.ShortcutInfoCompat; +import com.android.launcher3.model.BgDataModel; +import com.android.launcher3.model.ModelWriter; import java.util.ArrayList; import java.util.HashSet; @@ -47,11 +47,6 @@ import java.util.List; */ public class ManagedProfileHeuristic { - /** - * Maintain a set of packages installed per user. - */ - private static final String INSTALLED_PACKAGES_PREFIX = "installed_packages_for_user_"; - private static final String USER_FOLDER_ID_PREFIX = "user_folder_"; /** @@ -59,165 +54,154 @@ public class ManagedProfileHeuristic { */ private static final long AUTO_ADD_TO_FOLDER_DURATION = 8 * 60 * 60 * 1000; - public static ManagedProfileHeuristic get(Context context, UserHandle user) { - if (!Process.myUserHandle().equals(user)) { - return new ManagedProfileHeuristic(context, user); + public static void onAllAppsLoaded(final Context context, + List<LauncherActivityInfo> apps, UserHandle user) { + if (Process.myUserHandle().equals(user)) { + return; } - return null; - } - private final Context mContext; - private final LauncherModel mModel; - private final UserHandle mUser; - private final IconCache mIconCache; - private final boolean mAddIconsToHomescreen; - - private ManagedProfileHeuristic(Context context, UserHandle user) { - mContext = context; - mUser = user; - mModel = LauncherAppState.getInstance(context).getModel(); - mIconCache = LauncherAppState.getInstance(context).getIconCache(); - mAddIconsToHomescreen = - !BuildCompat.isAtLeastO() || SessionCommitReceiver.isEnabled(context); - } + UserFolderInfo ufi = new UserFolderInfo(context, user, null); + // We only handle folder creation once. Later icon additions are handled using package + // or session events. + if (ufi.folderAlreadyCreated) { + return; + } - public void processPackageRemoved(String[] packages) { - Preconditions.assertWorkerThread(); - ManagedProfilePackageHandler handler = new ManagedProfilePackageHandler(); - for (String pkg : packages) { - handler.onPackageRemoved(pkg, mUser); + if (Utilities.isAtLeastO() && !SessionCommitReceiver.isEnabled(context)) { + // Just mark the folder id preference to avoid new folder creation later. + ufi.prefs.edit().putLong(ufi.folderIdKey, ItemInfo.NO_ID).apply(); + return; } - } - public void processPackageAdd(String[] packages) { - Preconditions.assertWorkerThread(); - ManagedProfilePackageHandler handler = new ManagedProfilePackageHandler(); - for (String pkg : packages) { - handler.onPackageAdded(pkg, mUser); + InstallShortcutReceiver.enableInstallQueue(InstallShortcutReceiver.FLAG_BULK_ADD); + for (LauncherActivityInfo app : apps) { + // Queue all items which should go in the work folder. + if (app.getFirstInstallTime() < ufi.addIconToFolderTime) { + InstallShortcutReceiver.queueActivityInfo(app, context); + } } + // Post the queue update on next frame, so that the loader gets finished. + new Handler(LauncherModel.getWorkerLooper()).post(new Runnable() { + @Override + public void run() { + InstallShortcutReceiver.disableAndFlushInstallQueue( + InstallShortcutReceiver.FLAG_BULK_ADD, context); + } + }); } - public void processUserApps(List<LauncherActivityInfo> apps) { - Preconditions.assertWorkerThread(); - new ManagedProfilePackageHandler().processUserApps(apps, mUser); - } - private class ManagedProfilePackageHandler extends CachedPackageTracker { + /** + * Utility class to help workspace icon addition. + */ + public static class UserFolderInfo { - private ManagedProfilePackageHandler() { - super(mContext, LauncherFiles.MANAGED_USER_PREFERENCES_KEY); - } + final ArrayList<ShortcutInfo> pendingShortcuts = new ArrayList<>(); - protected void onLauncherAppsAdded( - List<LauncherActivityInstallInfo> apps, UserHandle user, boolean userAppsExisted) { - ArrayList<ShortcutInfo> workFolderApps = new ArrayList<>(); - ArrayList<ShortcutInfo> homescreenApps = new ArrayList<>(); - - int count = apps.size(); - long folderCreationTime = - mUserManager.getUserCreationTime(user) + AUTO_ADD_TO_FOLDER_DURATION; - - boolean quietModeEnabled = UserManagerCompat.getInstance(mContext) - .isQuietModeEnabled(user); - for (int i = 0; i < count; i++) { - LauncherActivityInstallInfo info = apps.get(i); - AppInfo appInfo = new AppInfo(info.info, user, quietModeEnabled); - mIconCache.getTitleAndIcon(appInfo, info.info, false /* useLowResIcon */); - ShortcutInfo si = appInfo.makeShortcut(); - ((info.installTime <= folderCreationTime) ? workFolderApps : homescreenApps).add(si); - } + final UserHandle user; - finalizeWorkFolder(user, workFolderApps, homescreenApps); + final long userSerial; + // Time until which icons will be added to folder instead. + final long addIconToFolderTime; - // Do not add shortcuts on the homescreen for the first time. This prevents the launcher - // getting filled with the managed user apps, when it start with a fresh DB (or after - // a very long time). - if (userAppsExisted && !homescreenApps.isEmpty() && mAddIconsToHomescreen) { - mModel.addAndBindAddedWorkspaceItems(new ArrayList<ItemInfo>(homescreenApps)); - } - } + final String folderIdKey; + final SharedPreferences prefs; + + final boolean folderAlreadyCreated; + final FolderInfo folderInfo; + + boolean folderPendingAddition; + + public UserFolderInfo(Context context, UserHandle user, BgDataModel dataModel) { + this.user = user; + + UserManagerCompat um = UserManagerCompat.getInstance(context); + userSerial = um.getSerialNumberForUser(user); + addIconToFolderTime = um.getUserCreationTime(user) + AUTO_ADD_TO_FOLDER_DURATION; - @Override - protected void onLauncherPackageRemoved(String packageName, UserHandle user) { + folderIdKey = USER_FOLDER_ID_PREFIX + userSerial; + prefs = prefs(context); + + folderAlreadyCreated = prefs.contains(folderIdKey); + if (dataModel != null) { + if (folderAlreadyCreated) { + long folderId = prefs.getLong(folderIdKey, ItemInfo.NO_ID); + folderInfo = dataModel.folders.get(folderId); + } else { + folderInfo = new FolderInfo(); + folderInfo.title = context.getText(R.string.work_folder_name); + folderInfo.setOption(FolderInfo.FLAG_WORK_FOLDER, true, null); + folderPendingAddition = true; + } + } else { + folderInfo = null; + } } /** - * Adds and binds shortcuts marked to be added to the work folder. + * Returns the ItemInfo which should be added to the workspace. In case the the provided + * {@link ShortcutInfo} or a wrapped {@link FolderInfo} or null. */ - private void finalizeWorkFolder( - UserHandle user, final ArrayList<ShortcutInfo> workFolderApps, - ArrayList<ShortcutInfo> homescreenApps) { - if (workFolderApps.isEmpty()) { - return; + public ItemInfo convertToWorkspaceItem( + ShortcutInfo shortcut, LauncherActivityInfo activityInfo) { + if (activityInfo.getFirstInstallTime() >= addIconToFolderTime) { + return shortcut; } - // Try to get a work folder. - String folderIdKey = USER_FOLDER_ID_PREFIX + mUserManager.getSerialNumberForUser(user); - if (!mAddIconsToHomescreen) { - if (!mPrefs.contains(folderIdKey)) { - // Just mark the folder id preference to avoid new folder creation later. - mPrefs.edit().putLong(folderIdKey, -1).apply(); + + if (folderAlreadyCreated) { + if (folderInfo == null) { + // Work folder was deleted by user, add icon to home screen. + return shortcut; + } else { + // Add item to work folder instead. Nothing needs to be added + // on the homescreen. + pendingShortcuts.add(shortcut); + return null; } + } + + pendingShortcuts.add(shortcut); + folderInfo.add(shortcut, false); + if (folderPendingAddition) { + folderPendingAddition = false; + return folderInfo; + } else { + // WorkFolder already requested to be added. Nothing new needs to be added. + return null; + } + } + + public void applyPendingState(ModelWriter writer) { + if (folderInfo == null) { return; } - if (mPrefs.contains(folderIdKey)) { - long folderId = mPrefs.getLong(folderIdKey, 0); - final FolderInfo workFolder = mModel.findFolderById(folderId); - - if (workFolder == null || !workFolder.hasOption(FolderInfo.FLAG_WORK_FOLDER)) { - // Could not get a work folder. Add all the icons to homescreen. - homescreenApps.addAll(0, workFolderApps); - return; - } - saveWorkFolderShortcuts(folderId, workFolder.contents.size(), workFolderApps); + int startingRank = 0; + if (folderAlreadyCreated) { + startingRank = folderInfo.contents.size(); + } + + for (ShortcutInfo info : pendingShortcuts) { + info.rank = startingRank++; + writer.addItemToDatabase(info, folderInfo.id, 0, 0, 0); + } + + if (folderAlreadyCreated) { // FolderInfo could already be bound. We need to add shortcuts on the UI thread. new MainThreadExecutor().execute(new Runnable() { @Override public void run() { - workFolder.prepareAutoUpdate(); - for (ShortcutInfo info : workFolderApps) { - workFolder.add(info, false); + folderInfo.prepareAutoUpdate(); + for (ShortcutInfo info : pendingShortcuts) { + folderInfo.add(info, false); } } }); } else { - // Create a new folder. - final FolderInfo workFolder = new FolderInfo(); - workFolder.title = mContext.getText(R.string.work_folder_name); - workFolder.setOption(FolderInfo.FLAG_WORK_FOLDER, true, null); - - // Add all shortcuts before adding it to the UI, as an empty folder might get deleted. - for (ShortcutInfo info : workFolderApps) { - workFolder.add(info, false); - } - - // Add the item to home screen and DB. This also generates an item id synchronously. - ArrayList<ItemInfo> itemList = new ArrayList<>(1); - itemList.add(workFolder); - mModel.addAndBindAddedWorkspaceItems(itemList); - mPrefs.edit().putLong(folderIdKey, workFolder.id).apply(); - - saveWorkFolderShortcuts(workFolder.id, 0, workFolderApps); + prefs.edit().putLong(folderIdKey, folderInfo.id).apply(); } } - - @Override - public void onShortcutsChanged(String packageName, List<ShortcutInfoCompat> shortcuts, - UserHandle user) { - // Do nothing - } - } - - /** - * Add work folder shortcuts to the DB. - */ - private void saveWorkFolderShortcuts( - long workFolderId, int startingRank, ArrayList<ShortcutInfo> workFolderApps) { - for (ItemInfo info : workFolderApps) { - info.rank = startingRank++; - mModel.getWriter(false).addItemToDatabase(info, workFolderId, 0, 0, 0); - } } /** @@ -225,14 +209,12 @@ public class ManagedProfileHeuristic { */ public static void processAllUsers(List<UserHandle> users, Context context) { UserManagerCompat userManager = UserManagerCompat.getInstance(context); - HashSet<String> validKeys = new HashSet<String>(); + HashSet<String> validKeys = new HashSet<>(); for (UserHandle user : users) { - addAllUserKeys(userManager.getSerialNumberForUser(user), validKeys); + validKeys.add(USER_FOLDER_ID_PREFIX + userManager.getSerialNumberForUser(user)); } - SharedPreferences prefs = context.getSharedPreferences( - LauncherFiles.MANAGED_USER_PREFERENCES_KEY, - Context.MODE_PRIVATE); + SharedPreferences prefs = prefs(context); SharedPreferences.Editor editor = prefs.edit(); for (String key : prefs.getAll().keySet()) { if (!validKeys.contains(key)) { @@ -242,11 +224,6 @@ public class ManagedProfileHeuristic { editor.apply(); } - private static void addAllUserKeys(long userSerial, HashSet<String> keysOut) { - keysOut.add(INSTALLED_PACKAGES_PREFIX + userSerial); - keysOut.add(USER_FOLDER_ID_PREFIX + userSerial); - } - /** * For each user, if a work folder has not been created, mark it such that the folder will * never get created. @@ -260,11 +237,8 @@ public class ManagedProfileHeuristic { if (myUser.equals(user)) { continue; } - if (prefs == null) { - prefs = context.getSharedPreferences( - LauncherFiles.MANAGED_USER_PREFERENCES_KEY, - Context.MODE_PRIVATE); + prefs = prefs(context); } String folderIdKey = USER_FOLDER_ID_PREFIX + userManager.getSerialNumberForUser(user); if (!prefs.contains(folderIdKey)) { @@ -272,4 +246,9 @@ public class ManagedProfileHeuristic { } } } + + public static SharedPreferences prefs(Context context) { + return context.getSharedPreferences( + LauncherFiles.MANAGED_USER_PREFERENCES_KEY, Context.MODE_PRIVATE); + } } |