Merge "Gracefully fallback to new ComponentName if one is renamed/removed" into ub-launcher3-master

This commit is contained in:
Tony Wickham
2018-09-06 19:21:35 +00:00
committed by Android (Google) Code Review
4 changed files with 38 additions and 44 deletions
+1 -1
View File
@@ -186,7 +186,7 @@ public class AllAppsList {
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);
}
-1
View File
@@ -26,7 +26,6 @@ import android.os.Process;
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;
@@ -381,24 +381,16 @@ public class LoaderTask implements Runnable {
// 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;
}
}
@@ -20,7 +20,6 @@ import android.content.Context;
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 @@ public class PackageUpdatedTask extends BaseModelUpdateTask {
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 @@ public class PackageUpdatedTask extends BaseModelUpdateTask {
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 @@ public class PackageUpdatedTask extends BaseModelUpdateTask {
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 @@ public class PackageUpdatedTask extends BaseModelUpdateTask {
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 @@ public class PackageUpdatedTask extends BaseModelUpdateTask {
}
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 @@ public class PackageUpdatedTask extends BaseModelUpdateTask {
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 @@ public class PackageUpdatedTask extends BaseModelUpdateTask {
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;
}
}