diff --git a/src/com/android/launcher3/model/AllAppsList.java b/src/com/android/launcher3/model/AllAppsList.java index 39c1243bd1..9234b67e7b 100644 --- a/src/com/android/launcher3/model/AllAppsList.java +++ b/src/com/android/launcher3/model/AllAppsList.java @@ -60,7 +60,7 @@ public class AllAppsList { private static final String TAG = "AllAppsList"; private static final Consumer NO_OP_CONSUMER = a -> { }; - + private static final boolean DEBUG = true; public static final int DEFAULT_APPLICATIONS_NUMBER = 42; @@ -220,6 +220,11 @@ public class AllAppsList { updatedAppInfos.add(appInfo); } else if (installInfo.state == PackageInstallInfo.STATUS_FAILED && !appInfo.isAppStartable()) { + if (DEBUG) { + Log.w(TAG, "updatePromiseInstallInfo: removing app due to install" + + " failure and appInfo not startable." + + " package=" + appInfo.getTargetPackage()); + } removeApp(i); } } @@ -311,7 +316,10 @@ public class AllAppsList { if (user.equals(applicationInfo.user) && packageName.equals(applicationInfo.componentName.getPackageName())) { if (!findActivity(matches, applicationInfo.componentName)) { - Log.w(TAG, "Changing shortcut target due to app component name change."); + if (DEBUG) { + Log.w(TAG, "Changing shortcut target due to app component name change." + + " package=" + packageName); + } removeApp(i); } } @@ -336,6 +344,10 @@ public class AllAppsList { } } else { // Remove all data for this package. + if (DEBUG) { + Log.w(TAG, "updatePromiseInstallInfo: no Activities matched updated package," + + " removing all apps from package=" + packageName); + } for (int i = data.size() - 1; i >= 0; i--) { final AppInfo applicationInfo = data.get(i); if (user.equals(applicationInfo.user) diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java index 802faae136..414fa41151 100644 --- a/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -74,8 +74,8 @@ import java.util.stream.Collectors; public class PackageUpdatedTask implements ModelUpdateTask { // TODO(b/290090023): Set to false after root causing is done. - private static final boolean DEBUG = true; private static final String TAG = "PackageUpdatedTask"; + private static final boolean DEBUG = true; public static final int OP_NONE = 0; public static final int OP_ADD = 1; @@ -117,13 +117,19 @@ public class PackageUpdatedTask implements ModelUpdateTask { : ItemInfoMatcher.ofPackages(packageSet, mUser); final HashSet removedComponents = new HashSet<>(); final HashMap> activitiesLists = new HashMap<>(); - + if (DEBUG) { + Log.d(TAG, "Package updated: mOp=" + getOpString() + + " packages=" + Arrays.toString(packages)); + } switch (mOp) { case OP_ADD: { for (int i = 0; i < N; i++) { - if (DEBUG) Log.d(TAG, "mAllAppsList.addPackage " + packages[i]); iconCache.updateIconsForPkg(packages[i], mUser); if (FeatureFlags.PROMISE_APPS_IN_ALL_APPS.get()) { + if (DEBUG) { + Log.d(TAG, "OP_ADD: PROMISE_APPS_IN_ALL_APPS enabled:" + + " removing promise icon apps from package=" + packages[i]); + } appsList.removePackage(packages[i], mUser); } activitiesLists.put( @@ -133,10 +139,14 @@ public class PackageUpdatedTask implements ModelUpdateTask { break; } case OP_UPDATE: - try (SafeCloseable t = - appsList.trackRemoves(a -> removedComponents.add(a.componentName))) { + try (SafeCloseable t = appsList.trackRemoves(a -> { + Log.d(TAG, "OP_UPDATE - AllAppsList.trackRemoves callback:" + + " removed component=" + a.componentName + + " id=" + a.id + + " Look for earlier AllAppsList logs to find more information."); + removedComponents.add(a.componentName); + })) { for (int i = 0; i < N; i++) { - if (DEBUG) Log.d(TAG, "mAllAppsList.updatePackage " + packages[i]); iconCache.updateIconsForPkg(packages[i], mUser); activitiesLists.put( packages[i], appsList.updatePackage(context, packages[i], mUser)); @@ -147,14 +157,15 @@ public class PackageUpdatedTask implements ModelUpdateTask { break; case OP_REMOVE: { for (int i = 0; i < N; i++) { - FileLog.d(TAG, "Removing app icon: " + packages[i]); iconCache.removeIconsForPkg(packages[i], mUser); } // Fall through } case OP_UNAVAILABLE: for (int i = 0; i < N; i++) { - if (DEBUG) Log.d(TAG, "mAllAppsList.removePackage " + packages[i]); + if (DEBUG) { + Log.d(TAG, getOpString() + ": removing package=" + packages[i]); + } appsList.removePackage(packages[i], mUser); } flagOp = FlagOp.NO_OP.addFlag(WorkspaceItemInfo.FLAG_DISABLED_NOT_AVAILABLE); @@ -163,7 +174,6 @@ public class PackageUpdatedTask implements ModelUpdateTask { case OP_UNSUSPEND: flagOp = FlagOp.NO_OP.setFlag( WorkspaceItemInfo.FLAG_DISABLED_SUSPENDED, mOp == OP_SUSPEND); - if (DEBUG) Log.d(TAG, "mAllAppsList.(un)suspend " + N); appsList.updateDisabledFlags(matcher, flagOp); break; case OP_USER_AVAILABILITY_CHANGE: { @@ -249,12 +259,21 @@ public class PackageUpdatedTask implements ModelUpdateTask { infoUpdated = true; } else if (si.hasPromiseIconUi()) { removedShortcuts.add(si.id); + if (DEBUG) { + Log.d(TAG, "Removing restored shortcut promise icon" + + " that no longer points to valid component." + + " id=" + si.id + + ", package=" + si.getTargetPackage()); + } return; } } else if (!isTargetValid) { removedShortcuts.add(si.id); - FileLog.e(TAG, "Restored shortcut no longer valid " - + si.getIntent()); + FileLog.e(TAG, "Removing shortcut that no longer points to" + + " valid component." + + " id=" + si.id + + " package=" + si.getTargetPackage() + + " status=" + si.status); return; } else { si.status = WorkspaceItemInfo.DEFAULT; @@ -334,7 +353,8 @@ public class PackageUpdatedTask implements ModelUpdateTask { if (!removedShortcuts.isEmpty()) { taskController.deleteAndBindComponentsRemoved( ItemInfoMatcher.ofItemIds(removedShortcuts), - "removed because the target component is invalid"); + "removing shortcuts with invalid target components." + + " ids=" + removedShortcuts); } if (!widgets.isEmpty()) { @@ -346,6 +366,9 @@ public class PackageUpdatedTask implements ModelUpdateTask { if (mOp == OP_REMOVE) { // Mark all packages in the broadcast to be removed Collections.addAll(removedPackages, packages); + if (DEBUG) { + Log.d(TAG, "OP_REMOVE: removing packages=" + Arrays.toString(packages)); + } // No need to update the removedComponents as // removedPackages is a super-set of removedComponents @@ -354,6 +377,10 @@ public class PackageUpdatedTask implements ModelUpdateTask { final LauncherApps launcherApps = context.getSystemService(LauncherApps.class); for (int i=0; i "NONE"; + case OP_ADD -> "ADD"; + case OP_UPDATE -> "UPDATE"; + case OP_REMOVE -> "REMOVE"; + case OP_UNAVAILABLE -> "UNAVAILABLE"; + case OP_SUSPEND -> "SUSPEND"; + case OP_UNSUSPEND -> "UNSUSPEND"; + case OP_USER_AVAILABILITY_CHANGE -> "USER_AVAILABILITY_CHANGE"; + default -> "UNKNOWN"; + }; + } } diff --git a/src/com/android/launcher3/touch/ItemClickHandler.java b/src/com/android/launcher3/touch/ItemClickHandler.java index d925629822..f46dcd328c 100644 --- a/src/com/android/launcher3/touch/ItemClickHandler.java +++ b/src/com/android/launcher3/touch/ItemClickHandler.java @@ -85,6 +85,7 @@ import java.util.function.Consumer; public class ItemClickHandler { private static final String TAG = "ItemClickHandler"; + private static final boolean DEBUG = true; /** * Instance used for click handling on items @@ -110,7 +111,19 @@ public class ItemClickHandler { startAppShortcutOrInfoActivity(v, (AppInfo) tag, launcher); } else if (tag instanceof LauncherAppWidgetInfo) { if (v instanceof PendingAppWidgetHostView) { + if (DEBUG) { + String targetPackage = ((LauncherAppWidgetInfo) tag).getTargetPackage(); + Log.d(TAG, "onClick: PendingAppWidgetHostView clicked for" + + " package=" + targetPackage); + } onClickPendingWidget((PendingAppWidgetHostView) v, launcher); + } else { + if (DEBUG) { + String targetPackage = ((LauncherAppWidgetInfo) tag).getTargetPackage(); + Log.d(TAG, "onClick: LauncherAppWidgetInfo clicked," + + " but not instance of PendingAppWidgetHostView. Returning." + + " package=" + targetPackage); + } } } else if (tag instanceof ItemClickProxy) { ((ItemClickProxy) tag).onItemClicked(v); @@ -120,6 +133,10 @@ public class ItemClickHandler { launcher.getString(R.string.long_accessible_way_to_add_shortcut)); Snackbar.show(launcher, msg, null); } else if (tag instanceof PendingAddWidgetInfo) { + if (DEBUG) { + String targetPackage = ((PendingAddWidgetInfo) tag).getTargetPackage(); + Log.d(TAG, "onClick: PendingAddWidgetInfo clicked for package=" + targetPackage); + } CharSequence msg = Utilities.wrapForTts( launcher.getText(R.string.long_press_widget_to_add), launcher.getString(R.string.long_accessible_way_to_add)); @@ -199,6 +216,9 @@ public class ItemClickHandler { LauncherAppWidgetProviderInfo appWidgetInfo = new WidgetManagerHelper(launcher) .findProvider(info.providerName, info.user); if (appWidgetInfo == null) { + Log.e(TAG, "onClickPendingWidget: Pending widget ready for click setup," + + " but LauncherAppWidgetProviderInfo was null. Returning." + + " component=" + info.getTargetComponent()); return; } WidgetAddFlowHandler addFlowHandler = new WidgetAddFlowHandler(appWidgetInfo); @@ -206,6 +226,10 @@ public class ItemClickHandler { if (info.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_ID_NOT_VALID)) { if (!info.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_ID_ALLOCATED)) { // This should not happen, as we make sure that an Id is allocated during bind. + Log.e(TAG, "onClickPendingWidget: Pending widget ready for click setup," + + " and LauncherAppWidgetProviderInfo was found. However," + + " no appWidgetId was allocated. Returning." + + " component=" + info.getTargetComponent()); return; } addFlowHandler.startBindFlow(launcher, info.appWidgetId, info, diff --git a/src/com/android/launcher3/widget/WidgetManagerHelper.java b/src/com/android/launcher3/widget/WidgetManagerHelper.java index d293d15f38..9132b4f18c 100644 --- a/src/com/android/launcher3/widget/WidgetManagerHelper.java +++ b/src/com/android/launcher3/widget/WidgetManagerHelper.java @@ -26,6 +26,7 @@ import android.content.Context; import android.os.Build; import android.os.Bundle; import android.os.UserHandle; +import android.util.Log; import android.widget.RemoteViews; import androidx.annotation.NonNull; @@ -104,6 +105,8 @@ public class WidgetManagerHelper { // If exception is thrown because of device is locked, it means a race condition occurs // that the user got locked again while launcher is processing the event. In this case // we should return empty list. + Log.e(TAG, "getAllProviders: Error getting installed providers for" + + " package=" + packageUser.mPackageName, e); return Collections.emptyList(); } } @@ -133,6 +136,8 @@ public class WidgetManagerHelper { return LauncherAppWidgetProviderInfo.fromProviderInfo(mContext, info); } } + Log.w(TAG, "findProvider: No App Widget Provider found for component=" + provider + + " user=" + user); return null; }