diff options
Diffstat (limited to 'src/com/android/launcher3/LauncherModel.java')
-rw-r--r-- | src/com/android/launcher3/LauncherModel.java | 137 |
1 files changed, 100 insertions, 37 deletions
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 7f7dbc93c..f3da7c49c 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -30,6 +30,7 @@ import android.content.Intent; import android.content.Intent.ShortcutIconResource; import android.content.IntentFilter; import android.content.SharedPreferences; +import android.content.pm.LauncherApps.Callback; import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; import android.content.pm.ResolveInfo; @@ -78,7 +79,6 @@ import java.util.List; import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; -import java.util.concurrent.atomic.AtomicBoolean; /** * Maintains in-memory state of the Launcher. It is expected that there should be only one @@ -115,6 +115,11 @@ public class LauncherModel extends BroadcastReceiver private boolean mIsLoaderTaskRunning; private volatile boolean mFlushingWorkerThread; + /** + * Maintain a set of packages per user, for which we added a shortcut on the workspace. + */ + private static final String INSTALLED_SHORTCUTS_SET_PREFIX = "installed_shortcuts_set_for_user_"; + // Specific runnable types that are run on the main thread deferred handler, this allows us to // clear all queued binding runnables when the Launcher activity is destroyed. private static final int MAIN_THREAD_NORMAL_RUNNABLE = 0; @@ -403,7 +408,7 @@ public class LauncherModel extends BroadcastReceiver // Process the updated package state Runnable r = new Runnable() { public void run() { - Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null; + Callbacks callbacks = getCallback(); if (callbacks != null) { callbacks.updatePackageState(installInfo); } @@ -416,7 +421,7 @@ public class LauncherModel extends BroadcastReceiver // Process the updated package badge Runnable r = new Runnable() { public void run() { - Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null; + Callbacks callbacks = getCallback(); if (callbacks != null) { callbacks.updatePackageBadge(packageName); } @@ -426,7 +431,7 @@ public class LauncherModel extends BroadcastReceiver } public void addAppsToAllApps(final Context ctx, final ArrayList<AppInfo> allAppsApps) { - final Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null; + final Callbacks callbacks = getCallback(); if (allAppsApps == null) { throw new RuntimeException("allAppsApps must not be null"); @@ -440,7 +445,7 @@ public class LauncherModel extends BroadcastReceiver public void run() { runOnMainThread(new Runnable() { public void run() { - Callbacks cb = mCallbacks != null ? mCallbacks.get() : null; + Callbacks cb = getCallback(); if (callbacks == cb && cb != null) { callbacks.bindAppsAdded(null, null, null, allAppsApps); } @@ -453,7 +458,7 @@ public class LauncherModel extends BroadcastReceiver public void addAndBindAddedWorkspaceApps(final Context context, final ArrayList<ItemInfo> workspaceApps) { - final Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null; + final Callbacks callbacks = getCallback(); if (workspaceApps == null) { throw new RuntimeException("workspaceApps and allAppsApps must not be null"); @@ -485,7 +490,7 @@ public class LauncherModel extends BroadcastReceiver final Intent launchIntent = a.getIntent(); // Short-circuit this logic if the icon exists somewhere on the workspace - if (shortcutExists(context, name, launchIntent)) { + if (shortcutExists(context, name, launchIntent, a.user)) { continue; } @@ -544,7 +549,7 @@ public class LauncherModel extends BroadcastReceiver if (!addedShortcutsFinal.isEmpty()) { runOnMainThread(new Runnable() { public void run() { - Callbacks cb = mCallbacks != null ? mCallbacks.get() : null; + Callbacks cb = getCallback(); if (callbacks == cb && cb != null) { final ArrayList<ItemInfo> addAnimated = new ArrayList<ItemInfo>(); final ArrayList<ItemInfo> addNotAnimated = new ArrayList<ItemInfo>(); @@ -904,7 +909,8 @@ public class LauncherModel extends BroadcastReceiver * Returns true if the shortcuts already exists in the database. * we identify a shortcut by its title and intent. */ - static boolean shortcutExists(Context context, String title, Intent intent) { + static boolean shortcutExists(Context context, String title, Intent intent, + UserHandleCompat user) { final ContentResolver cr = context.getContentResolver(); final Intent intentWithPkg, intentWithoutPkg; @@ -923,16 +929,18 @@ public class LauncherModel extends BroadcastReceiver intentWithPkg = intent; intentWithoutPkg = intent; } + String userSerial = Long.toString(UserManagerCompat.getInstance(context) + .getSerialNumberForUser(user)); Cursor c = cr.query(LauncherSettings.Favorites.CONTENT_URI, - new String[]{"title", "intent"}, "title=? and (intent=? or intent=?)", - new String[]{title, intentWithPkg.toUri(0), intentWithoutPkg.toUri(0) }, null); - boolean result = false; + new String[] { "title", "intent", "profileId" }, + "title=? and (intent=? or intent=?) and profileId=?", + new String[] { title, intentWithPkg.toUri(0), intentWithoutPkg.toUri(0), userSerial }, + null); try { - result = c.moveToFirst(); + return c.moveToFirst(); } finally { c.close(); } - return result; } /** @@ -1374,11 +1382,9 @@ public class LauncherModel extends BroadcastReceiver mPreviousConfigMcc = currentConfig.mcc; } else if (SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED.equals(action) || SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED.equals(action)) { - if (mCallbacks != null) { - Callbacks callbacks = mCallbacks.get(); - if (callbacks != null) { - callbacks.bindSearchablesChanged(); - } + Callbacks callbacks = getCallback(); + if (callbacks != null) { + callbacks.bindSearchablesChanged(); } } else if (ACTION_UNREAD_CHANGED.equals(action)) { ComponentName componentName = intent.getParcelableExtra("component_name"); @@ -1425,13 +1431,11 @@ public class LauncherModel extends BroadcastReceiver */ public void startLoaderFromBackground() { boolean runLoader = false; - if (mCallbacks != null) { - Callbacks callbacks = mCallbacks.get(); - if (callbacks != null) { - // Only actually run the loader if they're not paused. - if (!callbacks.setLoadOnResume()) { - runLoader = true; - } + Callbacks callbacks = getCallback(); + if (callbacks != null) { + // Only actually run the loader if they're not paused. + if (!callbacks.setLoadOnResume()) { + runLoader = true; } } if (runLoader) { @@ -3149,6 +3153,8 @@ public class LauncherModel extends BroadcastReceiver // Clear the list of apps mBgAllAppsList.clear(); + SharedPreferences prefs = mContext.getSharedPreferences( + LauncherAppState.getSharedPreferencesKey(), Context.MODE_PRIVATE); for (UserHandleCompat user : profiles) { // Query for the set of apps final long qiaTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0; @@ -3159,6 +3165,7 @@ public class LauncherModel extends BroadcastReceiver Log.d(TAG, "getActivityList got " + apps.size() + " apps for user " + user); } // Fail if we don't have any apps + // TODO: Fix this. Only fail for the current user. if (apps == null || apps.isEmpty()) { return; } @@ -3177,6 +3184,25 @@ public class LauncherModel extends BroadcastReceiver // This builds the icon bitmaps. mBgAllAppsList.add(new AppInfo(mContext, app, user, mIconCache, mLabelCache)); } + + if (!user.equals(UserHandleCompat.myUserHandle())) { + // Add shortcuts for packages which were installed while launcher was dead. + String shortcutsSetKey = INSTALLED_SHORTCUTS_SET_PREFIX + + mUserManager.getSerialNumberForUser(user); + Set<String> packagesAdded = prefs.getStringSet(shortcutsSetKey, Collections.EMPTY_SET); + HashSet<String> newPackageSet = new HashSet<String>(); + + for (LauncherActivityInfoCompat info : apps) { + String packageName = info.getComponentName().getPackageName(); + if (!packagesAdded.contains(packageName) + && !newPackageSet.contains(packageName)) { + InstallShortcutReceiver.queueInstallShortcut(info, mContext); + } + newPackageSet.add(packageName); + } + + prefs.edit().putStringSet(shortcutsSetKey, newPackageSet).commit(); + } } // Huh? Shouldn't this be inside the Runnable below? final ArrayList<AppInfo> added = mBgAllAppsList.added; @@ -3349,6 +3375,30 @@ public class LauncherModel extends BroadcastReceiver mIconCache.remove(packages[i], mUser); mBgAllAppsList.addPackage(context, packages[i], mUser); } + + // Auto add shortcuts for added packages. + if (!UserHandleCompat.myUserHandle().equals(mUser)) { + SharedPreferences prefs = context.getSharedPreferences( + LauncherAppState.getSharedPreferencesKey(), Context.MODE_PRIVATE); + String shortcutsSetKey = INSTALLED_SHORTCUTS_SET_PREFIX + + mUserManager.getSerialNumberForUser(mUser); + Set<String> shortcutSet = new HashSet<String>( + prefs.getStringSet(shortcutsSetKey,Collections.EMPTY_SET)); + + for (int i=0; i<N; i++) { + if (!shortcutSet.contains(packages[i])) { + shortcutSet.add(packages[i]); + List<LauncherActivityInfoCompat> activities = + mLauncherApps.getActivityList(packages[i], mUser); + if (activities != null && !activities.isEmpty()) { + InstallShortcutReceiver.queueInstallShortcut( + activities.get(0), context); + } + } + } + + prefs.edit().putStringSet(shortcutsSetKey, shortcutSet).commit(); + } break; case OP_UPDATE: for (int i=0; i<N; i++) { @@ -3359,6 +3409,19 @@ public class LauncherModel extends BroadcastReceiver } break; case OP_REMOVE: + // Remove the packageName for the set of auto-installed shortcuts. This + // will ensure that the shortcut when the app is installed again. + if (!UserHandleCompat.myUserHandle().equals(mUser)) { + SharedPreferences prefs = context.getSharedPreferences( + LauncherAppState.getSharedPreferencesKey(), Context.MODE_PRIVATE); + String shortcutsSetKey = INSTALLED_SHORTCUTS_SET_PREFIX + + mUserManager.getSerialNumberForUser(mUser); + HashSet<String> shortcutSet = new HashSet<String>( + prefs.getStringSet(shortcutsSetKey, Collections.EMPTY_SET)); + shortcutSet.removeAll(Arrays.asList(mPackages)); + prefs.edit().putStringSet(shortcutsSetKey, shortcutSet).commit(); + } + // Fall through case OP_UNAVAILABLE: boolean clearCache = mOp == OP_REMOVE; for (int i=0; i<N; i++) { @@ -3387,7 +3450,7 @@ public class LauncherModel extends BroadcastReceiver mBgAllAppsList.removed.clear(); } - final Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null; + final Callbacks callbacks = getCallback(); if (callbacks == null) { Log.w(TAG, "Nobody to tell about the new app. Launcher is probably loading."); return; @@ -3417,7 +3480,7 @@ public class LauncherModel extends BroadcastReceiver mHandler.post(new Runnable() { public void run() { - Callbacks cb = mCallbacks != null ? mCallbacks.get() : null; + Callbacks cb = getCallback(); if (callbacks == cb && cb != null) { callbacks.bindAppsUpdated(modifiedFinal); } @@ -3530,7 +3593,7 @@ public class LauncherModel extends BroadcastReceiver mHandler.post(new Runnable() { public void run() { - Callbacks cb = mCallbacks != null ? mCallbacks.get() : null; + Callbacks cb = getCallback(); if (callbacks == cb && cb != null) { callbacks.bindShortcutsChanged( updatedShortcuts, removedShortcuts, mUser); @@ -3544,7 +3607,7 @@ public class LauncherModel extends BroadcastReceiver if (!widgets.isEmpty()) { mHandler.post(new Runnable() { public void run() { - Callbacks cb = mCallbacks != null ? mCallbacks.get() : null; + Callbacks cb = getCallback(); if (callbacks == cb && cb != null) { callbacks.bindWidgetsRestored(widgets); } @@ -3585,14 +3648,11 @@ public class LauncherModel extends BroadcastReceiver } // Remove any queued items from the install queue - String spKey = LauncherAppState.getSharedPreferencesKey(); - SharedPreferences sp = - context.getSharedPreferences(spKey, Context.MODE_PRIVATE); - InstallShortcutReceiver.removeFromInstallQueue(sp, removedPackageNames); + InstallShortcutReceiver.removeFromInstallQueue(context, removedPackageNames, mUser); // Call the components-removed callback mHandler.post(new Runnable() { public void run() { - Callbacks cb = mCallbacks != null ? mCallbacks.get() : null; + Callbacks cb = getCallback(); if (callbacks == cb && cb != null) { callbacks.bindComponentsRemoved( removedPackageNames, removedApps, mUser, removeReason); @@ -3606,7 +3666,7 @@ public class LauncherModel extends BroadcastReceiver mHandler.post(new Runnable() { @Override public void run() { - Callbacks cb = mCallbacks != null ? mCallbacks.get() : null; + Callbacks cb = getCallback(); if (callbacks == cb && cb != null) { callbacks.bindPackagesUpdated(widgetsAndShortcuts); } @@ -3616,7 +3676,7 @@ public class LauncherModel extends BroadcastReceiver // Write all the logs to disk mHandler.post(new Runnable() { public void run() { - Callbacks cb = mCallbacks != null ? mCallbacks.get() : null; + Callbacks cb = getCallback(); if (callbacks == cb && cb != null) { callbacks.dumpLogsToLocalData(); } @@ -4179,4 +4239,7 @@ public class LauncherModel extends BroadcastReceiver return null; } + public Callbacks getCallback() { + return mCallbacks != null ? mCallbacks.get() : null; + } } |