Loading src/com/android/launcher3/AppInfo.java +12 −7 Original line number Diff line number Diff line Loading @@ -84,16 +84,11 @@ public class AppInfo extends ItemInfo { flags = initFlags(info); firstInstallTime = info.getFirstInstallTime(); iconCache.getTitleAndIcon(this, info, labelCache); intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setComponent(info.getComponentName()); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); long serialNumber = UserManagerCompat.getInstance(context).getSerialNumberForUser(user); intent.putExtra(EXTRA_PROFILE, serialNumber); intent = makeLaunchIntent(context, info, user); this.user = user; } private static int initFlags(LauncherActivityInfoCompat info) { public static int initFlags(LauncherActivityInfoCompat info) { int appFlags = info.getApplicationInfo().flags; int flags = 0; if ((appFlags & android.content.pm.ApplicationInfo.FLAG_SYSTEM) == 0) { Loading Loading @@ -137,4 +132,14 @@ public class AppInfo extends ItemInfo { public ShortcutInfo makeShortcut() { return new ShortcutInfo(this); } public static Intent makeLaunchIntent(Context context, LauncherActivityInfoCompat info, UserHandleCompat user) { long serialNumber = UserManagerCompat.getInstance(context).getSerialNumberForUser(user); return new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_LAUNCHER) .setComponent(info.getComponentName()) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) .putExtra(EXTRA_PROFILE, serialNumber); } } src/com/android/launcher3/InstallShortcutReceiver.java +212 −165 File changed.Preview size limit exceeded, changes collapsed. Show changes src/com/android/launcher3/LauncherAppState.java +7 −8 Original line number Diff line number Diff line Loading @@ -46,12 +46,14 @@ public class LauncherAppState implements DeviceProfile.DeviceProfileCallbacks { private final AppFilter mAppFilter; private final BuildInfo mBuildInfo; private LauncherModel mModel; private IconCache mIconCache; private final LauncherModel mModel; private final IconCache mIconCache; private final boolean mIsScreenLarge; private final float mScreenDensity; private final int mLongPressTimeout = 300; private WidgetPreviewLoader.CacheDb mWidgetPreviewCacheDb; private boolean mIsScreenLarge; private float mScreenDensity; private int mLongPressTimeout = 300; private boolean mWallpaperChangedSinceLastCheck; private static WeakReference<LauncherProvider> sLauncherProvider; Loading Loading @@ -159,9 +161,6 @@ public class LauncherAppState implements DeviceProfile.DeviceProfileCallbacks { }; LauncherModel setLauncher(Launcher launcher) { if (mModel == null) { throw new IllegalStateException("setLauncher() called before init()"); } mModel.initialize(launcher); return mModel; } Loading src/com/android/launcher3/LauncherModel.java +101 −37 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -75,7 +76,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 Loading Loading @@ -110,6 +110,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; Loading Loading @@ -343,7 +348,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); } Loading @@ -356,7 +361,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); } Loading @@ -366,7 +371,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"); Loading @@ -380,7 +385,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); } Loading @@ -393,7 +398,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"); Loading Loading @@ -425,7 +430,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; } Loading Loading @@ -484,7 +489,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>(); Loading Loading @@ -844,7 +849,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; Loading @@ -863,16 +869,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; } /** Loading Loading @@ -1285,14 +1293,12 @@ 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(); Callbacks callbacks = getCallback(); if (callbacks != null) { callbacks.bindSearchablesChanged(); } } } } void forceReload() { resetLoadedState(true, true); Loading Loading @@ -1321,15 +1327,13 @@ public class LauncherModel extends BroadcastReceiver */ public void startLoaderFromBackground() { boolean runLoader = false; if (mCallbacks != null) { Callbacks callbacks = mCallbacks.get(); Callbacks callbacks = getCallback(); if (callbacks != null) { // Only actually run the loader if they're not paused. if (!callbacks.setLoadOnResume()) { runLoader = true; } } } if (runLoader) { startLoader(false, PagedView.INVALID_RESTORE_PAGE); } Loading Loading @@ -2811,6 +2815,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; Loading @@ -2821,6 +2827,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; } Loading @@ -2839,6 +2846,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; Loading Loading @@ -2953,6 +2979,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++) { Loading @@ -2963,6 +3013,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++) { Loading Loading @@ -2991,7 +3054,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; Loading Loading @@ -3021,7 +3084,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); } Loading Loading @@ -3134,7 +3197,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); Loading @@ -3148,7 +3211,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); } Loading Loading @@ -3189,14 +3252,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); Loading @@ -3210,7 +3270,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); } Loading @@ -3220,7 +3280,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(); } Loading Loading @@ -3754,4 +3814,8 @@ public class LauncherModel extends BroadcastReceiver Log.d(TAG, "mLoaderTask=null"); } } public Callbacks getCallback() { return mCallbacks != null ? mCallbacks.get() : null; } } Loading
src/com/android/launcher3/AppInfo.java +12 −7 Original line number Diff line number Diff line Loading @@ -84,16 +84,11 @@ public class AppInfo extends ItemInfo { flags = initFlags(info); firstInstallTime = info.getFirstInstallTime(); iconCache.getTitleAndIcon(this, info, labelCache); intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setComponent(info.getComponentName()); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); long serialNumber = UserManagerCompat.getInstance(context).getSerialNumberForUser(user); intent.putExtra(EXTRA_PROFILE, serialNumber); intent = makeLaunchIntent(context, info, user); this.user = user; } private static int initFlags(LauncherActivityInfoCompat info) { public static int initFlags(LauncherActivityInfoCompat info) { int appFlags = info.getApplicationInfo().flags; int flags = 0; if ((appFlags & android.content.pm.ApplicationInfo.FLAG_SYSTEM) == 0) { Loading Loading @@ -137,4 +132,14 @@ public class AppInfo extends ItemInfo { public ShortcutInfo makeShortcut() { return new ShortcutInfo(this); } public static Intent makeLaunchIntent(Context context, LauncherActivityInfoCompat info, UserHandleCompat user) { long serialNumber = UserManagerCompat.getInstance(context).getSerialNumberForUser(user); return new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_LAUNCHER) .setComponent(info.getComponentName()) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) .putExtra(EXTRA_PROFILE, serialNumber); } }
src/com/android/launcher3/InstallShortcutReceiver.java +212 −165 File changed.Preview size limit exceeded, changes collapsed. Show changes
src/com/android/launcher3/LauncherAppState.java +7 −8 Original line number Diff line number Diff line Loading @@ -46,12 +46,14 @@ public class LauncherAppState implements DeviceProfile.DeviceProfileCallbacks { private final AppFilter mAppFilter; private final BuildInfo mBuildInfo; private LauncherModel mModel; private IconCache mIconCache; private final LauncherModel mModel; private final IconCache mIconCache; private final boolean mIsScreenLarge; private final float mScreenDensity; private final int mLongPressTimeout = 300; private WidgetPreviewLoader.CacheDb mWidgetPreviewCacheDb; private boolean mIsScreenLarge; private float mScreenDensity; private int mLongPressTimeout = 300; private boolean mWallpaperChangedSinceLastCheck; private static WeakReference<LauncherProvider> sLauncherProvider; Loading Loading @@ -159,9 +161,6 @@ public class LauncherAppState implements DeviceProfile.DeviceProfileCallbacks { }; LauncherModel setLauncher(Launcher launcher) { if (mModel == null) { throw new IllegalStateException("setLauncher() called before init()"); } mModel.initialize(launcher); return mModel; } Loading
src/com/android/launcher3/LauncherModel.java +101 −37 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -75,7 +76,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 Loading Loading @@ -110,6 +110,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; Loading Loading @@ -343,7 +348,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); } Loading @@ -356,7 +361,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); } Loading @@ -366,7 +371,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"); Loading @@ -380,7 +385,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); } Loading @@ -393,7 +398,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"); Loading Loading @@ -425,7 +430,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; } Loading Loading @@ -484,7 +489,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>(); Loading Loading @@ -844,7 +849,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; Loading @@ -863,16 +869,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; } /** Loading Loading @@ -1285,14 +1293,12 @@ 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(); Callbacks callbacks = getCallback(); if (callbacks != null) { callbacks.bindSearchablesChanged(); } } } } void forceReload() { resetLoadedState(true, true); Loading Loading @@ -1321,15 +1327,13 @@ public class LauncherModel extends BroadcastReceiver */ public void startLoaderFromBackground() { boolean runLoader = false; if (mCallbacks != null) { Callbacks callbacks = mCallbacks.get(); Callbacks callbacks = getCallback(); if (callbacks != null) { // Only actually run the loader if they're not paused. if (!callbacks.setLoadOnResume()) { runLoader = true; } } } if (runLoader) { startLoader(false, PagedView.INVALID_RESTORE_PAGE); } Loading Loading @@ -2811,6 +2815,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; Loading @@ -2821,6 +2827,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; } Loading @@ -2839,6 +2846,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; Loading Loading @@ -2953,6 +2979,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++) { Loading @@ -2963,6 +3013,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++) { Loading Loading @@ -2991,7 +3054,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; Loading Loading @@ -3021,7 +3084,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); } Loading Loading @@ -3134,7 +3197,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); Loading @@ -3148,7 +3211,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); } Loading Loading @@ -3189,14 +3252,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); Loading @@ -3210,7 +3270,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); } Loading @@ -3220,7 +3280,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(); } Loading Loading @@ -3754,4 +3814,8 @@ public class LauncherModel extends BroadcastReceiver Log.d(TAG, "mLoaderTask=null"); } } public Callbacks getCallback() { return mCallbacks != null ? mCallbacks.get() : null; } }