summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/util/ManagedProfileHeuristic.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/launcher3/util/ManagedProfileHeuristic.java')
-rw-r--r--src/com/android/launcher3/util/ManagedProfileHeuristic.java277
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);
+ }
}