diff options
21 files changed, 240 insertions, 119 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 90b33c567..591d9b612 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -20,7 +20,7 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.launcher3"> - <uses-sdk android:targetSdkVersion="19" android:minSdkVersion="16"/> + <uses-sdk android:targetSdkVersion="21" android:minSdkVersion="16"/> <permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" diff --git a/src/com/android/launcher3/AutoInstallsLayout.java b/src/com/android/launcher3/AutoInstallsLayout.java index 931501c6a..00f0cf36f 100644 --- a/src/com/android/launcher3/AutoInstallsLayout.java +++ b/src/com/android/launcher3/AutoInstallsLayout.java @@ -57,7 +57,7 @@ public class AutoInstallsLayout implements WorkspaceLoader { /** Marker action used to discover a package which defines launcher customization */ static final String ACTION_LAUNCHER_CUSTOMIZATION = - "com.android.launcher3.action.LAUNCHER_CUSTOMIZATION"; + "android.autoinstalls.config.action.PLAY_AUTO_INSTALL"; private static final String LAYOUT_RES = "default_layout"; diff --git a/src/com/android/launcher3/Folder.java b/src/com/android/launcher3/Folder.java index a27e51986..1890af47d 100644 --- a/src/com/android/launcher3/Folder.java +++ b/src/com/android/launcher3/Folder.java @@ -461,7 +461,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList Animator openFolderAnim = null; final Runnable onCompleteRunnable; - if (!Utilities.isLmp()) { + if (!Utilities.isLmpOrAbove()) { positionAndSizeAsIcon(); centerAboutIcon(); diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index ddc1bd949..bb71d776c 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -29,6 +29,7 @@ import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.util.Log; @@ -229,7 +230,8 @@ public class IconCache { Iterator<Entry<CacheKey, CacheEntry>> it = mCache.entrySet().iterator(); while (it.hasNext()) { final CacheEntry e = it.next().getValue(); - if (e.icon.getWidth() < grid.iconSizePx || e.icon.getHeight() < grid.iconSizePx) { + if ((e.icon != null) && (e.icon.getWidth() < grid.iconSizePx + || e.icon.getHeight() < grid.iconSizePx)) { it.remove(); } } @@ -381,12 +383,15 @@ public class IconCache { */ public void cachePackageInstallInfo(String packageName, UserHandleCompat user, Bitmap icon, CharSequence title) { + remove(packageName, user); + CacheEntry entry = getEntryForPackage(packageName, user); if (!TextUtils.isEmpty(title)) { entry.title = title; } if (icon != null) { - entry.icon = Utilities.createIconBitmap(icon, mContext); + entry.icon = Utilities.createIconBitmap( + new BitmapDrawable(mContext.getResources(), icon), mContext); } } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 1b95c2b3f..eb505a372 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1650,7 +1650,7 @@ public class Launcher extends Activity // TODO(sansid): use the APIs directly when compiling against L sdk. // Currently we use reflection to access the flags and the API to set the transparency // on the System bars. - if (Utilities.isLmp()) { + if (Utilities.isLmpOrAbove()) { try { getWindow().getAttributes().systemUiVisibility |= (View.SYSTEM_UI_FLAG_LAYOUT_STABLE @@ -2809,7 +2809,7 @@ public class Launcher extends Activity Bundle optsBundle = null; if (useLaunchAnimation) { - ActivityOptions opts = Utilities.isLmp() ? + ActivityOptions opts = Utilities.isLmpOrAbove() ? ActivityOptions.makeCustomAnimation(this, R.anim.task_open_enter, R.anim.no_anim) : ActivityOptions.makeScaleUpAnimation(v, 0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); optsBundle = opts.toBundle(); @@ -2920,7 +2920,7 @@ public class Launcher extends Activity ObjectAnimator oa = LauncherAnimUtils.ofPropertyValuesHolder(mFolderIconImageView, alpha, scaleX, scaleY); - if (Utilities.isLmp()) { + if (Utilities.isLmpOrAbove()) { oa.setInterpolator(new LogDecelerateInterpolator(100, 0)); } oa.setDuration(getResources().getInteger(R.integer.config_folderExpandDuration)); @@ -3194,7 +3194,7 @@ public class Launcher extends Activity mStateAnimation = null; } - boolean material = Utilities.isLmp(); + boolean material = Utilities.isLmpOrAbove(); final Resources res = getResources(); @@ -3376,7 +3376,7 @@ public class Launcher extends Activity dispatchOnLauncherTransitionStart(toView, animated, false); revealView.setAlpha(initAlpha); - if (Utilities.isLmp()) { + if (Utilities.isLmpOrAbove()) { for (int i = 0; i < layerViews.size(); i++) { View v = layerViews.get(i); if (v != null) { @@ -3431,7 +3431,7 @@ public class Launcher extends Activity mStateAnimation = null; } - boolean material = Utilities.isLmp(); + boolean material = Utilities.isLmpOrAbove(); Resources res = getResources(); final int duration = res.getInteger(R.integer.config_appsCustomizeZoomOutTime); @@ -3632,9 +3632,11 @@ public class Launcher extends Activity } // Reset page transforms - page.setTranslationX(0); - page.setTranslationY(0); - page.setAlpha(1); + if (page != null) { + page.setTranslationX(0); + page.setTranslationY(0); + page.setAlpha(1); + } content.setCurrentPage(content.getNextPage()); mAppsCustomizeContent.updateCurrentPageScroll(); @@ -3651,7 +3653,7 @@ public class Launcher extends Activity dispatchOnLauncherTransitionStart(fromView, animated, false); dispatchOnLauncherTransitionStart(toView, animated, false); - if (Utilities.isLmp()) { + if (Utilities.isLmpOrAbove()) { for (int i = 0; i < layerViews.size(); i++) { View v = layerViews.get(i); if (v != null) { @@ -4710,6 +4712,18 @@ public class Launcher extends Activity } /** + * Update the label and icon of all the icons in a package + * + * Implementation of the method from LauncherModel.Callbacks. + */ + @Override + public void updatePackageBadge(String packageName) { + if (mWorkspace != null) { + mWorkspace.updatePackageBadge(packageName, UserHandleCompat.myUserHandle()); + } + } + + /** * A package was uninstalled. We take both the super set of packageNames * in addition to specific applications to remove, the reason being that * this can be called when a package is updated as well. In that scenario, @@ -4991,7 +5005,7 @@ public class Launcher extends Activity if (mModel.canMigrateFromOldLauncherDb(this)) { launcherClings.showMigrationCling(); } else { - launcherClings.showLongPressCling(false); + launcherClings.showLongPressCling(true); } } } diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java index b6144f4ac..246278fa2 100644 --- a/src/com/android/launcher3/LauncherAppState.java +++ b/src/com/android/launcher3/LauncherAppState.java @@ -260,4 +260,11 @@ public class LauncherAppState implements DeviceProfile.DeviceProfileCallbacks { public void setPackageState(ArrayList<PackageInstallInfo> installInfo) { mModel.setPackageState(installInfo); } + + /** + * Updates the icons and label of all icons for the provided package name. + */ + public void updatePackageBadge(String packageName) { + mModel.updatePackageBadge(packageName); + } } diff --git a/src/com/android/launcher3/LauncherAppWidgetInfo.java b/src/com/android/launcher3/LauncherAppWidgetInfo.java index 50528b1bd..5c6535a24 100644 --- a/src/com/android/launcher3/LauncherAppWidgetInfo.java +++ b/src/com/android/launcher3/LauncherAppWidgetInfo.java @@ -46,6 +46,11 @@ public class LauncherAppWidgetInfo extends ItemInfo { public static final int FLAG_UI_NOT_READY = 4; /** + * Indicates that the widget restore has started. + */ + public static final int FLAG_RESTORE_STARTED = 8; + + /** * Indicates that the widget hasn't been instantiated yet. */ static final int NO_ID = -1; diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 29cd9e36a..d2cf8f50b 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -86,6 +86,7 @@ public class LauncherModel extends BroadcastReceiver implements LauncherAppsCompat.OnAppsChangedCallbackCompat { static final boolean DEBUG_LOADERS = false; private static final boolean DEBUG_RECEIVER = false; + private static final boolean REMOVE_UNRESTORED_ICONS = true; static final String TAG = "Launcher.Model"; @@ -198,6 +199,7 @@ public class LauncherModel extends BroadcastReceiver ArrayList<AppInfo> addedApps); public void bindAppsUpdated(ArrayList<AppInfo> apps); public void updatePackageState(ArrayList<PackageInstallInfo> installInfo); + public void updatePackageBadge(String packageName); public void bindComponentsRemoved(ArrayList<String> packageNames, ArrayList<AppInfo> appInfos, UserHandleCompat user); public void bindPackagesUpdated(ArrayList<Object> widgetsAndShortcuts); @@ -347,6 +349,19 @@ public class LauncherModel extends BroadcastReceiver mHandler.post(r); } + public void updatePackageBadge(final String packageName) { + // Process the updated package badge + Runnable r = new Runnable() { + public void run() { + Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null; + if (callbacks != null) { + callbacks.updatePackageBadge(packageName); + } + } + }; + mHandler.post(r); + } + public void addAppsToAllApps(final Context ctx, final ArrayList<AppInfo> allAppsApps) { final Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null; @@ -1885,7 +1900,8 @@ public class LauncherModel extends BroadcastReceiver synchronized (sBgLock) { clearSBgDataStructures(); - PackageInstallerCompat.getInstance(mContext).updateActiveSessionCache(); + final HashSet<String> installingPkgs = PackageInstallerCompat + .getInstance(mContext).updateAndGetActiveSessionCache(); final ArrayList<Long> itemsToRemove = new ArrayList<Long>(); final ArrayList<Long> restoredRows = new ArrayList<Long>(); @@ -2014,6 +2030,25 @@ public class LauncherModel extends BroadcastReceiver // installed later. Launcher.addDumpLog(TAG, "package not yet restored: " + cn, true); + + if ((promiseType & ShortcutInfo.FLAG_RESTORE_STARTED) != 0) { + // Restore has started once. + } else if (installingPkgs.contains(cn.getPackageName())) { + // App restore has started. Update the flag + promiseType |= ShortcutInfo.FLAG_RESTORE_STARTED; + ContentValues values = new ContentValues(); + values.put(LauncherSettings.Favorites.RESTORED, + promiseType); + String where = BaseColumns._ID + "= ?"; + String[] args = {Long.toString(id)}; + contentResolver.update(contentUri, values, where, args); + + } else if (REMOVE_UNRESTORED_ICONS) { + Launcher.addDumpLog(TAG, + "Unrestored package removed: " + cn, true); + itemsToRemove.add(id); + continue; + } } else if (isSdCardReady) { // Do not wait for external media load anymore. // Log the invalid package, and remove it @@ -2221,6 +2256,19 @@ public class LauncherModel extends BroadcastReceiver appWidgetInfo = new LauncherAppWidgetInfo(appWidgetId, component); appWidgetInfo.restoreStatus = restoreStatus; + + if ((restoreStatus & LauncherAppWidgetInfo.FLAG_RESTORE_STARTED) != 0) { + // Restore has started once. + } else if (installingPkgs.contains(component.getPackageName())) { + // App restore has started. Update the flag + appWidgetInfo.restoreStatus |= + LauncherAppWidgetInfo.FLAG_RESTORE_STARTED; + } else if (REMOVE_UNRESTORED_ICONS) { + Launcher.addDumpLog(TAG, + "Unrestored package removed: " + component, true); + itemsToRemove.add(id); + continue; + } } appWidgetInfo.id = id; @@ -2249,19 +2297,17 @@ public class LauncherModel extends BroadcastReceiver break; } - if (isProviderReady) { - String providerName = provider.provider.flattenToString(); - if (!providerName.equals(savedProvider) || - (appWidgetInfo.restoreStatus != restoreStatus)) { - ContentValues values = new ContentValues(); - values.put(LauncherSettings.Favorites.APPWIDGET_PROVIDER, - providerName); - values.put(LauncherSettings.Favorites.RESTORED, - appWidgetInfo.restoreStatus); - String where = BaseColumns._ID + "= ?"; - String[] args = {Long.toString(id)}; - contentResolver.update(contentUri, values, where, args); - } + String providerName = appWidgetInfo.providerName.flattenToString(); + if (!providerName.equals(savedProvider) || + (appWidgetInfo.restoreStatus != restoreStatus)) { + ContentValues values = new ContentValues(); + values.put(LauncherSettings.Favorites.APPWIDGET_PROVIDER, + providerName); + values.put(LauncherSettings.Favorites.RESTORED, + appWidgetInfo.restoreStatus); + String where = BaseColumns._ID + "= ?"; + String[] args = {Long.toString(id)}; + contentResolver.update(contentUri, values, where, args); } sBgItemsIdMap.put(appWidgetInfo.id, appWidgetInfo); sBgAppWidgets.add(appWidgetInfo); diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index 9abfb7f86..5b27f845e 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -55,6 +55,11 @@ public class ShortcutInfo extends ItemInfo { public static final int FLAG_INSTALL_SESSION_ACTIVE = 4; /** + * Indicates that the widget restore has started. + */ + public static final int FLAG_RESTORE_STARTED = 8; + + /** * The intent used to start the application. */ Intent intent; diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index f20f261f9..80d4b22ce 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -103,11 +103,10 @@ public final class Utilities { } /** - * Indicates if the device is running LMP or not. - * TODO(sansid): Change the check to a VERSION_CODES code check once we have a version for L. + * Indicates if the device is running LMP or higher. */ - public static boolean isLmp() { - return "L".equals(Build.VERSION.CODENAME); + public static boolean isLmpOrAbove() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.L; } /** diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index f7a0df681..774996e56 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -1107,7 +1107,7 @@ public class Workspace extends SmoothPagedView case MotionEvent.ACTION_UP: if (mTouchState == TOUCH_STATE_REST) { final CellLayout currentPage = (CellLayout) getChildAt(mCurrentPage); - if (!currentPage.lastDownOnOccupiedCell()) { + if (currentPage != null && !currentPage.lastDownOnOccupiedCell()) { onWallpaperTap(ev); } } @@ -4801,6 +4801,25 @@ public class Workspace extends SmoothPagedView } void updateShortcutsAndWidgets(ArrayList<AppInfo> apps) { + // Break the appinfo list per user + final HashMap<UserHandleCompat, ArrayList<AppInfo>> appsPerUser = + new HashMap<UserHandleCompat, ArrayList<AppInfo>>(); + for (AppInfo info : apps) { + ArrayList<AppInfo> filtered = appsPerUser.get(info.user); + if (filtered == null) { + filtered = new ArrayList<AppInfo>(); + appsPerUser.put(info.user, filtered); + } + filtered.add(info); + } + + for (Map.Entry<UserHandleCompat, ArrayList<AppInfo>> entry : appsPerUser.entrySet()) { + updateShortcutsAndWidgetsPerUser(entry.getValue(), entry.getKey()); + } + } + + private void updateShortcutsAndWidgetsPerUser(ArrayList<AppInfo> apps, + final UserHandleCompat user) { // Create a map of the apps to test against final HashMap<ComponentName, AppInfo> appsMap = new HashMap<ComponentName, AppInfo>(); final HashSet<String> pkgNames = new HashSet<String>(); @@ -4808,9 +4827,8 @@ public class Workspace extends SmoothPagedView appsMap.put(ai.componentName, ai); pkgNames.add(ai.componentName.getPackageName()); } + final HashSet<ComponentName> iconsToRemove = new HashSet<ComponentName>(); - final HashMap<UserHandleCompat, HashSet<ComponentName>> iconsToRemove = - new HashMap<UserHandleCompat, HashSet<ComponentName>>(); mapOverItems(MAP_RECURSE, new ItemOperator() { @Override public boolean evaluate(ItemInfo info, View v, View parent) { @@ -4818,7 +4836,8 @@ public class Workspace extends SmoothPagedView ShortcutInfo shortcutInfo = (ShortcutInfo) info; ComponentName cn = shortcutInfo.getTargetComponent(); AppInfo appInfo = appsMap.get(cn); - if (cn != null && LauncherModel.isShortcutInfoUpdateable(info) + if (user.equals(shortcutInfo.user) && cn != null + && LauncherModel.isShortcutInfoUpdateable(info) && pkgNames.contains(cn.getPackageName())) { boolean promiseStateChanged = false; boolean infoUpdated = false; @@ -4841,13 +4860,7 @@ public class Workspace extends SmoothPagedView if ((intent == null) || (appsMap == null)) { // Could not find a default activity. Remove this item. - HashSet<ComponentName> cnSet = iconsToRemove - .get(shortcutInfo.user); - if (cnSet == null) { - cnSet = new HashSet<>(); - iconsToRemove.put(shortcutInfo.user, cnSet); - } - cnSet.add(shortcutInfo.getTargetComponent()); + iconsToRemove.add(shortcutInfo.getTargetComponent()); // process next shortcut. return false; @@ -4894,12 +4907,11 @@ public class Workspace extends SmoothPagedView }); if (!iconsToRemove.isEmpty()) { - for (Map.Entry<UserHandleCompat, HashSet<ComponentName>> entry : - iconsToRemove.entrySet()) { - removeItemsByComponentName(entry.getValue(), entry.getKey()); - } + removeItemsByComponentName(iconsToRemove, user); + } + if (user.equals(UserHandleCompat.myUserHandle())) { + restorePendingWidgets(pkgNames); } - restorePendingWidgets(pkgNames); } public void removeAbandonedPromise(String packageName, UserHandleCompat user) { @@ -4909,6 +4921,38 @@ public class Workspace extends SmoothPagedView removeItemsByPackageName(packages, user); } + public void updatePackageBadge(final String packageName, final UserHandleCompat user) { + mapOverItems(MAP_RECURSE, new ItemOperator() { + @Override + public boolean evaluate(ItemInfo info, View v, View parent) { + if (info instanceof ShortcutInfo && v instanceof BubbleTextView) { + ShortcutInfo shortcutInfo = (ShortcutInfo) info; + ComponentName cn = shortcutInfo.getTargetComponent(); + if (user.equals(shortcutInfo.user) && cn != null + && shortcutInfo.isPromise() + && packageName.equals(cn.getPackageName())) { + if (shortcutInfo.hasStatusFlag(ShortcutInfo.FLAG_AUTOINTALL_ICON)) { + // For auto install apps update the icon as well as label. + mIconCache.getTitleAndIcon(shortcutInfo, + shortcutInfo.promisedIntent, user, true); + } else { + // Only update the icon for restored apps. + shortcutInfo.updateIcon(mIconCache); + } + BubbleTextView shortcut = (BubbleTextView) v; + shortcut.applyFromShortcutInfo(shortcutInfo, mIconCache, true, false); + + if (parent != null) { + parent.invalidate(); + } + } + } + // process all the shortcuts + return false; + } + }); + } + public void updatePackageState(ArrayList<PackageInstallInfo> installInfos) { HashSet<String> completedPackages = new HashSet<String>(); @@ -4946,6 +4990,7 @@ public class Workspace extends SmoothPagedView } } + // Note that package states are sent only for myUser if (!completedPackages.isEmpty()) { restorePendingWidgets(completedPackages); } diff --git a/src/com/android/launcher3/compat/AppWidgetManagerCompat.java b/src/com/android/launcher3/compat/AppWidgetManagerCompat.java index 57fac7f8f..6512d427e 100644 --- a/src/com/android/launcher3/compat/AppWidgetManagerCompat.java +++ b/src/com/android/launcher3/compat/AppWidgetManagerCompat.java @@ -38,12 +38,11 @@ public abstract class AppWidgetManagerCompat { public static AppWidgetManagerCompat getInstance(Context context) { synchronized (sInstanceLock) { - // TODO change this to use api version once L gets an API number. if (sInstance == null) { - if (Utilities.isLmp()) { - sInstance = new AppWidgetManagerCompatVL(context); + if (Utilities.isLmpOrAbove()) { + sInstance = new AppWidgetManagerCompatVL(context.getApplicationContext()); } else { - sInstance = new AppWidgetManagerCompatV16(context); + sInstance = new AppWidgetManagerCompatV16(context.getApplicationContext()); } } return sInstance; diff --git a/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java b/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java index 7ca35b72d..c3853ab62 100644 --- a/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java +++ b/src/com/android/launcher3/compat/AppWidgetManagerCompatVL.java @@ -121,15 +121,9 @@ class AppWidgetManagerCompatVL extends AppWidgetManagerCompat { } else { badgeLocation.offset(bitmap.getWidth() - badgeSize - badgeMargin, top); } - Drawable drawable = null; - // STOPSHIP(mokani): Remove catch block once dogfood build is bigger than LRW70. - // This hack is just to prevent crash in older builds. - try { - drawable = mPm.getUserBadgedDrawableForDensity(new BitmapDrawable(res, bitmap), - info.getProfile(), badgeLocation, 0); - } catch (Throwable e) { - return bitmap; - } + + Drawable drawable = mPm.getUserBadgedDrawableForDensity( + new BitmapDrawable(res, bitmap), info.getProfile(), badgeLocation, 0); if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable) drawable).getBitmap(); diff --git a/src/com/android/launcher3/compat/LauncherAppsCompat.java b/src/com/android/launcher3/compat/LauncherAppsCompat.java index de8c669e7..6efcc00fd 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompat.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompat.java @@ -23,6 +23,8 @@ import android.graphics.Rect; import android.os.Build; import android.os.Bundle; +import com.android.launcher3.Utilities; + import java.util.List; public abstract class LauncherAppsCompat { @@ -48,12 +50,11 @@ public abstract class LauncherAppsCompat { public static LauncherAppsCompat getInstance(Context context) { synchronized (sInstanceLock) { - // STOPSHIP(kennyguy) change this to use api version once L gets an API number. if (sInstance == null) { - if ("L".equals(Build.VERSION.CODENAME)) { - sInstance = new LauncherAppsCompatVL(context); + if (Utilities.isLmpOrAbove()) { + sInstance = new LauncherAppsCompatVL(context.getApplicationContext()); } else { - sInstance = new LauncherAppsCompatV16(context); + sInstance = new LauncherAppsCompatV16(context.getApplicationContext()); } } return sInstance; diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatV16.java b/src/com/android/launcher3/compat/LauncherAppsCompatV16.java index c47f223f3..7e5e6bf2c 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompatV16.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompatV16.java @@ -22,19 +22,17 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; +import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.PackageInfo; import android.content.pm.ResolveInfo; import android.graphics.Rect; import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.os.UserHandle; import android.provider.Settings; import java.util.ArrayList; -import java.util.Collections; import java.util.List; /** diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java index c4a97836c..e0d28b566 100644 --- a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java +++ b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java @@ -82,11 +82,7 @@ public class LauncherAppsCompatVL extends LauncherAppsCompat { synchronized (mCallbacks) { mCallbacks.put(callback, wrappedCallback); } - try { - mLauncherApps.registerCallback(wrappedCallback); - } catch (Throwable e) { - // STOPSHIP(kennyguy): Remove when LRW71 hits googlefood - } + mLauncherApps.registerCallback(wrappedCallback); } public void removeOnAppsChangedCallback( @@ -96,11 +92,7 @@ public class LauncherAppsCompatVL extends LauncherAppsCompat { wrappedCallback = mCallbacks.remove(callback); } if (wrappedCallback != null) { - try { - mLauncherApps.unregisterCallback(wrappedCallback); - } catch (Throwable e) { - // STOPSHIP(kennyguy): Remove when LRW71 hits googlefood - } + mLauncherApps.unregisterCallback(wrappedCallback); } } diff --git a/src/com/android/launcher3/compat/PackageInstallerCompat.java b/src/com/android/launcher3/compat/PackageInstallerCompat.java index 0ae52bd23..0eb8754e8 100644 --- a/src/com/android/launcher3/compat/PackageInstallerCompat.java +++ b/src/com/android/launcher3/compat/PackageInstallerCompat.java @@ -20,6 +20,8 @@ import android.content.Context; import com.android.launcher3.Utilities; +import java.util.HashSet; + public abstract class PackageInstallerCompat { public static final int STATUS_INSTALLED = 0; @@ -32,7 +34,7 @@ public abstract class PackageInstallerCompat { public static PackageInstallerCompat getInstance(Context context) { synchronized (sInstanceLock) { if (sInstance == null) { - if (Utilities.isLmp()) { + if (Utilities.isLmpOrAbove()) { sInstance = new PackageInstallerCompatVL(context); } else { sInstance = new PackageInstallerCompatV16(context) { }; @@ -42,7 +44,7 @@ public abstract class PackageInstallerCompat { } } - public abstract void updateActiveSessionCache(); + public abstract HashSet<String> updateAndGetActiveSessionCache(); public abstract void onPause(); diff --git a/src/com/android/launcher3/compat/PackageInstallerCompatV16.java b/src/com/android/launcher3/compat/PackageInstallerCompatV16.java index 4cc6fc12f..1910d22ae 100644 --- a/src/com/android/launcher3/compat/PackageInstallerCompatV16.java +++ b/src/com/android/launcher3/compat/PackageInstallerCompatV16.java @@ -29,6 +29,7 @@ import org.json.JSONStringer; import org.json.JSONTokener; import java.util.ArrayList; +import java.util.HashSet; public class PackageInstallerCompatV16 extends PackageInstallerCompat { @@ -76,9 +77,6 @@ public class PackageInstallerCompatV16 extends PackageInstallerCompat { @Override public void onStop() { } - @Override - public void updateActiveSessionCache() { } - private void replayUpdates() { if (DEBUG) Log.d(TAG, "updates resumed"); LauncherAppState app = LauncherAppState.getInstanceNoCreate(); @@ -169,4 +167,9 @@ public class PackageInstallerCompatV16 extends PackageInstallerCompat { } return value; } + + @Override + public HashSet<String> updateAndGetActiveSessionCache() { + return new HashSet<String>(); + } } diff --git a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java index 9a0831f0e..a84bf0224 100644 --- a/src/com/android/launcher3/compat/PackageInstallerCompatVL.java +++ b/src/com/android/launcher3/compat/PackageInstallerCompatVL.java @@ -27,6 +27,7 @@ import com.android.launcher3.IconCache; import com.android.launcher3.LauncherAppState; import java.util.ArrayList; +import java.util.HashSet; public class PackageInstallerCompatVL extends PackageInstallerCompat { @@ -34,6 +35,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { private static final boolean DEBUG = false; private final SparseArray<SessionInfo> mPendingReplays = new SparseArray<SessionInfo>(); + private final HashSet<String> mPendingBadgeUpdates = new HashSet<String>(); private final PackageInstaller mInstaller; private final IconCache mCache; @@ -42,16 +44,13 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { PackageInstallerCompatVL(Context context) { mInstaller = context.getPackageManager().getPackageInstaller(); + LauncherAppState.setApplicationContext(context.getApplicationContext()); mCache = LauncherAppState.getInstance().getIconCache(); mResumed = false; mBound = false; - // STOPSHIP(mokani): Remove catch block once dogfood build is bigger than LRW70. - // This hack is just to prevent crash in older builds. - try { - mInstaller.registerSessionCallback(mCallback); - } catch (Throwable e) { } + mInstaller.registerSessionCallback(mCallback); // On start, send updates for all active sessions for (SessionInfo info : mInstaller.getAllSessions()) { @@ -60,11 +59,16 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { } @Override - public void updateActiveSessionCache() { + public HashSet<String> updateAndGetActiveSessionCache() { + HashSet<String> activePackages = new HashSet<String>(); UserHandleCompat user = UserHandleCompat.myUserHandle(); for (SessionInfo info : mInstaller.getAllSessions()) { addSessionInfoToCahce(info, user); + if (info.getAppPackageName() != null) { + activePackages.add(info.getAppPackageName()); + } } + return activePackages; } private void addSessionInfoToCahce(SessionInfo info, UserHandleCompat user) { @@ -77,11 +81,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { @Override public void onStop() { - // STOPSHIP(mokani): Remove catch block once dogfood build is bigger than LRW70. - // This hack is just to prevent crash in older builds. - try { - mInstaller.unregisterSessionCallback(mCallback); - } catch (Throwable e) { } + mInstaller.unregisterSessionCallback(mCallback); } @Override @@ -140,18 +140,20 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { if (!updates.isEmpty()) { app.setPackageState(updates); } + + if (!mPendingBadgeUpdates.isEmpty()) { + for (String pkg : mPendingBadgeUpdates) { + app.updatePackageBadge(pkg); + } + mPendingBadgeUpdates.clear(); + } } private final SessionCallback mCallback = new SessionCallback() { @Override public void onCreated(int sessionId) { - SessionInfo session = mInstaller.getSessionInfo(sessionId); - if (session != null) { - addSessionInfoToCahce(session, UserHandleCompat.myUserHandle()); - mPendingReplays.put(sessionId, session); - replayUpdates(null); - } + pushSessionBadgeToLauncher(sessionId); } @Override @@ -159,6 +161,7 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { mPendingReplays.remove(sessionId); SessionInfo session = mInstaller.getSessionInfo(sessionId); if ((session != null) && (session.getAppPackageName() != null)) { + mPendingBadgeUpdates.remove(session.getAppPackageName()); // Replay all updates with a one time update for this installed package. No // need to store this record for future updates, as the app list will get // refreshed on resume. @@ -180,6 +183,20 @@ public class PackageInstallerCompatVL extends PackageInstallerCompat { public void onActiveChanged(int sessionId, boolean active) { } @Override - public void onBadgingChanged(int sessionId) { } + public void onBadgingChanged(int sessionId) { + pushSessionBadgeToLauncher(sessionId); + } + + private void pushSessionBadgeToLauncher(int sessionId) { + SessionInfo session = mInstaller.getSessionInfo(sessionId); + if (session != null) { + addSessionInfoToCahce(session, UserHandleCompat.myUserHandle()); + if (session.getAppPackageName() != null) { + mPendingBadgeUpdates.add(session.getAppPackageName()); + } + mPendingReplays.put(sessionId, session); + replayUpdates(null); + } + } }; } diff --git a/src/com/android/launcher3/compat/UserManagerCompat.java b/src/com/android/launcher3/compat/UserManagerCompat.java index 8effb81a1..1374b4e49 100644 --- a/src/com/android/launcher3/compat/UserManagerCompat.java +++ b/src/com/android/launcher3/compat/UserManagerCompat.java @@ -20,6 +20,8 @@ import android.content.Context; import android.graphics.drawable.Drawable; import android.os.Build; +import com.android.launcher3.Utilities; + import java.util.List; public abstract class UserManagerCompat { @@ -27,8 +29,7 @@ public abstract class UserManagerCompat { } public static UserManagerCompat getInstance(Context context) { - // TODO change this to use api version once L gets an API number. - if ("L".equals(Build.VERSION.CODENAME)) { + if (Utilities.isLmpOrAbove()) { return new UserManagerCompatVL(context); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { return new UserManagerCompatV17(context); diff --git a/src/com/android/launcher3/compat/UserManagerCompatVL.java b/src/com/android/launcher3/compat/UserManagerCompatVL.java index ddef43148..19eeabdcf 100644 --- a/src/com/android/launcher3/compat/UserManagerCompatVL.java +++ b/src/com/android/launcher3/compat/UserManagerCompatVL.java @@ -51,13 +51,7 @@ public class UserManagerCompatVL extends UserManagerCompatV17 { @Override public Drawable getBadgedDrawableForUser(Drawable unbadged, UserHandleCompat user) { - // STOPSHIP(mokani): Remove catch block once dogfood build is bigger than LRW70. - // This hack is just to prevent crash in older builds. - try { - return mPm.getUserBadgedIcon(unbadged, user.getUser()); - } catch (Throwable e) { - return unbadged; - } + return mPm.getUserBadgedIcon(unbadged, user.getUser()); } @Override @@ -65,13 +59,7 @@ public class UserManagerCompatVL extends UserManagerCompatV17 { if (user == null) { return label; } - // STOPSHIP(mokani): Remove catch block once dogfood build is bigger than LRW70. - // This hack is just to prevent crash in older builds. - try { - return mPm.getUserBadgedLabel(label, user.getUser()); - } catch (Throwable e) { - return label; - } + return mPm.getUserBadgedLabel(label, user.getUser()); } } |