Merge "Gracefully fallback to new ComponentName if one is renamed/removed" into ub-launcher3-master
diff --git a/src/com/android/launcher3/AllAppsList.java b/src/com/android/launcher3/AllAppsList.java
index 45859ca..3d60605 100644
--- a/src/com/android/launcher3/AllAppsList.java
+++ b/src/com/android/launcher3/AllAppsList.java
@@ -186,7 +186,7 @@
                 if (user.equals(applicationInfo.user)
                         && packageName.equals(applicationInfo.componentName.getPackageName())) {
                     if (!findActivity(matches, applicationInfo.componentName)) {
-                        Log.w(TAG, "Shortcut will be removed due to app component name change.");
+                        Log.w(TAG, "Changing shortcut target due to app component name change.");
                         removed.add(applicationInfo);
                         data.remove(i);
                     }
diff --git a/src/com/android/launcher3/AppInfo.java b/src/com/android/launcher3/AppInfo.java
index 4d1bedc..ed79914 100644
--- a/src/com/android/launcher3/AppInfo.java
+++ b/src/com/android/launcher3/AppInfo.java
@@ -26,7 +26,6 @@
 import android.os.UserHandle;
 
 import com.android.launcher3.compat.UserManagerCompat;
-import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.util.ComponentKey;
 import com.android.launcher3.util.PackageManagerHelper;
 
diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java
index 85faf4f..8f8bc09 100644
--- a/src/com/android/launcher3/model/LoaderTask.java
+++ b/src/com/android/launcher3/model/LoaderTask.java
@@ -381,24 +381,16 @@
                                     // no special handling necessary for this item
                                     c.markRestored();
                                 } else {
-                                    if (c.hasRestoreFlag(ShortcutInfo.FLAG_AUTOINSTALL_ICON)) {
-                                        // We allow auto install apps to have their intent
-                                        // updated after an install.
-                                        intent = pmHelper.getAppLaunchIntent(targetPkg, c.user);
-                                        if (intent != null) {
-                                            c.restoreFlag = 0;
-                                            c.updater().put(
-                                                    LauncherSettings.Favorites.INTENT,
-                                                    intent.toUri(0)).commit();
-                                            cn = intent.getComponent();
-                                        } else {
-                                            c.markDeleted("Unable to find a launch target");
-                                            continue;
-                                        }
+                                    // Gracefully try to find a fallback activity.
+                                    intent = pmHelper.getAppLaunchIntent(targetPkg, c.user);
+                                    if (intent != null) {
+                                        c.restoreFlag = 0;
+                                        c.updater().put(
+                                                LauncherSettings.Favorites.INTENT,
+                                                intent.toUri(0)).commit();
+                                        cn = intent.getComponent();
                                     } else {
-                                        // The app is installed but the component is no
-                                        // longer available.
-                                        c.markDeleted("Invalid component removed: " + cn);
+                                        c.markDeleted("Unable to find a launch target");
                                         continue;
                                     }
                                 }
diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java
index ccb1f09..1c0732e 100644
--- a/src/com/android/launcher3/model/PackageUpdatedTask.java
+++ b/src/com/android/launcher3/model/PackageUpdatedTask.java
@@ -20,7 +20,6 @@
 import android.content.Intent;
 import android.os.Process;
 import android.os.UserHandle;
-import android.util.ArrayMap;
 import android.util.Log;
 
 import com.android.launcher3.AllAppsList;
@@ -159,15 +158,16 @@
         appsList.added.clear();
         addedOrModified.addAll(appsList.modified);
         appsList.modified.clear();
+        if (!addedOrModified.isEmpty()) {
+            scheduleCallbackTask((callbacks) -> callbacks.bindAppsAddedOrUpdated(addedOrModified));
+        }
 
         final ArrayList<AppInfo> removedApps = new ArrayList<>(appsList.removed);
         appsList.removed.clear();
-
-        final ArrayMap<ComponentName, AppInfo> addedOrUpdatedApps = new ArrayMap<>();
-        if (!addedOrModified.isEmpty()) {
-            scheduleCallbackTask((callbacks) -> callbacks.bindAppsAddedOrUpdated(addedOrModified));
-            for (AppInfo ai : addedOrModified) {
-                addedOrUpdatedApps.put(ai.componentName, ai);
+        final HashSet<ComponentName> removedComponents = new HashSet<>();
+        if (mOp == OP_UPDATE) {
+            for (AppInfo ai : removedApps) {
+                removedComponents.add(ai.componentName);
             }
         }
 
@@ -201,7 +201,7 @@
 
                         ComponentName cn = si.getTargetComponent();
                         if (cn != null && matcher.matches(si, cn)) {
-                            AppInfo appInfo = addedOrUpdatedApps.get(cn);
+                            String packageName = cn.getPackageName();
 
                             if (si.hasStatusFlag(ShortcutInfo.FLAG_SUPPORTS_WEB_UI)) {
                                 removedShortcuts.put(si.id, false);
@@ -231,17 +231,7 @@
                                 if (si.hasStatusFlag(ShortcutInfo.FLAG_AUTOINSTALL_ICON)) {
                                     // Auto install icon
                                     if (!isTargetValid) {
-                                        // Try to find the best match activity.
-                                        Intent intent = new PackageManagerHelper(context)
-                                                .getAppLaunchIntent(cn.getPackageName(), mUser);
-                                        if (intent != null) {
-                                            cn = intent.getComponent();
-                                            appInfo = addedOrUpdatedApps.get(cn);
-                                        }
-
-                                        if (intent != null && appInfo != null) {
-                                            si.intent = intent;
-                                            si.status = ShortcutInfo.DEFAULT;
+                                        if (updateShortcutIntent(context, si, packageName)) {
                                             infoUpdated = true;
                                         } else if (si.hasPromiseIconUi()) {
                                             removedShortcuts.put(si.id, true);
@@ -257,6 +247,10 @@
                                     si.status = ShortcutInfo.DEFAULT;
                                     infoUpdated = true;
                                 }
+                            } else if (isNewApkAvailable && removedComponents.contains(cn)) {
+                                if (updateShortcutIntent(context, si, packageName)) {
+                                    infoUpdated = true;
+                                }
                             }
 
                             if (isNewApkAvailable &&
@@ -315,7 +309,6 @@
         }
 
         final HashSet<String> removedPackages = new HashSet<>();
-        final HashSet<ComponentName> removedComponents = new HashSet<>();
         if (mOp == OP_REMOVE) {
             // Mark all packages in the broadcast to be removed
             Collections.addAll(removedPackages, packages);
@@ -330,11 +323,6 @@
                     removedPackages.add(packages[i]);
                 }
             }
-
-            // Update removedComponents as some components can get removed during package update
-            for (AppInfo info : removedApps) {
-                removedComponents.add(info.componentName);
-            }
         }
 
         if (!removedPackages.isEmpty() || !removedComponents.isEmpty()) {
@@ -366,4 +354,19 @@
             bindUpdatedWidgets(dataModel);
         }
     }
+
+    /**
+     * Updates {@param si}'s intent to point to a new ComponentName.
+     * @return Whether the shortcut intent was changed.
+     */
+    private boolean updateShortcutIntent(Context context, ShortcutInfo si, String packageName) {
+        // Try to find the best match activity.
+        Intent intent = new PackageManagerHelper(context).getAppLaunchIntent(packageName, mUser);
+        if (intent != null) {
+            si.intent = intent;
+            si.status = ShortcutInfo.DEFAULT;
+            return true;
+        }
+        return false;
+    }
 }