From e48fe1095d25f663fed7c82751ebeae32012423e Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 30 May 2018 15:22:00 -0700 Subject: [PATCH] Deleting invalid icons when an app is restored When a app is restored, it may not be in exactly the same state as it was when backed up. Some components might be missing, and some shortcuts may be disabled or unavailable Bug: 63525806 Change-Id: I09e6c0e9a9d2c1e8ccd73430f94bd065bdf2718e --- .../graphics/PreloadIconDrawable.java | 6 +-- .../launcher3/model/PackageUpdatedTask.java | 38 ++++++++++++++----- .../shortcuts/DeepShortcutManager.java | 7 +++- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/com/android/launcher3/graphics/PreloadIconDrawable.java b/src/com/android/launcher3/graphics/PreloadIconDrawable.java index 42ba191c23..d3a7955b2f 100644 --- a/src/com/android/launcher3/graphics/PreloadIconDrawable.java +++ b/src/com/android/launcher3/graphics/PreloadIconDrawable.java @@ -77,7 +77,7 @@ public class PreloadIconDrawable extends FastBitmapDrawable { private final Matrix mTmpMatrix = new Matrix(); private final PathMeasure mPathMeasure = new PathMeasure(); - private final Context mContext; + private final ItemInfoWithIcon mItem; // Path in [0, 100] bounds. private final Path mProgressPath; @@ -106,7 +106,7 @@ public class PreloadIconDrawable extends FastBitmapDrawable { */ public PreloadIconDrawable(ItemInfoWithIcon info, Path progressPath, Context context) { super(info); - mContext = context; + mItem = info; mProgressPath = progressPath; mScaledTrackPath = new Path(); mScaledProgressPath = new Path(); @@ -274,7 +274,7 @@ public class PreloadIconDrawable extends FastBitmapDrawable { mTrackAlpha = MAX_PAINT_ALPHA; setIsDisabled(true); } else if (progress >= 1) { - setIsDisabled(false); + setIsDisabled(mItem.isDisabled()); mScaledTrackPath.set(mScaledProgressPath); float fraction = (progress - 1) / COMPLETE_ANIM_FRACTION; diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index 089303ecea..977dcd7d53 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -18,7 +18,6 @@ package com.android.launcher3.model; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.graphics.Bitmap; import android.os.Process; import android.os.UserHandle; import android.util.ArrayMap; @@ -42,6 +41,9 @@ import com.android.launcher3.compat.UserManagerCompat; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.graphics.BitmapInfo; import com.android.launcher3.graphics.LauncherIcons; +import com.android.launcher3.logging.FileLog; +import com.android.launcher3.shortcuts.DeepShortcutManager; +import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.util.FlagOp; import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.LongArrayMap; @@ -52,6 +54,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; +import java.util.List; /** * Handles updates due to changes in package manager (app installed/updated/removed) @@ -162,12 +165,7 @@ public class PackageUpdatedTask extends BaseModelUpdateTask { final ArrayMap addedOrUpdatedApps = new ArrayMap<>(); if (!addedOrModified.isEmpty()) { - scheduleCallbackTask(new CallbackTask() { - @Override - public void execute(Callbacks callbacks) { - callbacks.bindAppsAddedOrUpdated(addedOrModified); - } - }); + scheduleCallbackTask((callbacks) -> callbacks.bindAppsAddedOrUpdated(addedOrModified)); for (AppInfo ai : addedOrModified) { addedOrUpdatedApps.put(ai.componentName, ai); } @@ -213,11 +211,26 @@ public class PackageUpdatedTask extends BaseModelUpdateTask { } if (si.isPromise() && isNewApkAvailable) { + boolean isTargetValid = true; + if (si.itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT) { + List shortcut = DeepShortcutManager + .getInstance(context).queryForPinnedShortcuts( + cn.getPackageName(), + Arrays.asList(si.getDeepShortcutId()), mUser); + if (shortcut.isEmpty()) { + isTargetValid = false; + } else { + si.updateFromDeepShortcutInfo(shortcut.get(0), context); + infoUpdated = true; + } + } else if (!cn.getClassName().equals(IconCache.EMPTY_CLASS_NAME)) { + isTargetValid = LauncherAppsCompat.getInstance(context) + .isActivityEnabledForProfile(cn, mUser); + } + if (si.hasStatusFlag(ShortcutInfo.FLAG_AUTOINSTALL_ICON)) { // Auto install icon - LauncherAppsCompat launcherApps - = LauncherAppsCompat.getInstance(context); - if (!launcherApps.isActivityEnabledForProfile(cn, mUser)) { + if (!isTargetValid) { // Try to find the best match activity. Intent intent = new PackageManagerHelper(context) .getAppLaunchIntent(cn.getPackageName(), mUser); @@ -235,6 +248,11 @@ public class PackageUpdatedTask extends BaseModelUpdateTask { continue; } } + } else if (!isTargetValid) { + removedShortcuts.put(si.id, true); + FileLog.e(TAG, "Restored shortcut no longer valid " + + si.intent); + continue; } else { si.status = ShortcutInfo.DEFAULT; infoUpdated = true; diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutManager.java b/src/com/android/launcher3/shortcuts/DeepShortcutManager.java index f44f5c8d91..24e2e2f81f 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutManager.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutManager.java @@ -181,7 +181,12 @@ public class DeepShortcutManager { * If packageName is null, returns all pinned shortcuts regardless of package. */ public List queryForPinnedShortcuts(String packageName, UserHandle user) { - return query(ShortcutQuery.FLAG_MATCH_PINNED, packageName, null, null, user); + return queryForPinnedShortcuts(packageName, null, user); + } + + public List queryForPinnedShortcuts(String packageName, + List shortcutIds, UserHandle user) { + return query(ShortcutQuery.FLAG_MATCH_PINNED, packageName, null, shortcutIds, user); } public List queryForAllShortcuts(UserHandle user) {