Merge "Convert DesktopTaskView to Kotlin" into main
diff --git a/quickstep/res/values/config.xml b/quickstep/res/values/config.xml
index b3502db..fd12210 100644
--- a/quickstep/res/values/config.xml
+++ b/quickstep/res/values/config.xml
@@ -17,8 +17,7 @@
<string name="overscroll_plugin_factory_class" translatable="false" />
<string name="task_overlay_factory_class" translatable="false"/>
- <!-- Activities which block home gesture -->
- <string-array name="gesture_blocking_activities" translatable="false">
+ <string-array name="back_gesture_blocking_activities" translatable="false">
<item>com.android.launcher3/com.android.quickstep.interaction.GestureSandboxActivity</item>
</string-array>
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
index 189b687..39f6fb2 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
@@ -163,11 +163,6 @@
return false;
}
TestLogging.recordEvent(TestProtocol.SEQUENCE_MAIN, "onTaskbarItemLongClick");
- if (TestProtocol.sDebugTracing) {
- Log.d(TestProtocol.TWO_TASKBAR_LONG_CLICKS,
- "TaskbarDragController.startDragOnLongClick",
- new Throwable());
- }
BubbleTextView btv = (BubbleTextView) view;
mActivity.onDragStart();
btv.post(() -> {
diff --git a/src/com/android/launcher3/apppairs/AppPairIcon.java b/src/com/android/launcher3/apppairs/AppPairIcon.java
index 1f73241..32445ec 100644
--- a/src/com/android/launcher3/apppairs/AppPairIcon.java
+++ b/src/com/android/launcher3/apppairs/AppPairIcon.java
@@ -30,6 +30,8 @@
import com.android.launcher3.BubbleTextView;
import com.android.launcher3.DeviceProfile;
+import com.android.launcher3.Flags;
+import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherAppState;
import com.android.launcher3.R;
import com.android.launcher3.Reorderable;
@@ -85,6 +87,11 @@
: activity.getLayoutInflater();
AppPairIcon icon = (AppPairIcon) inflater.inflate(resId, group, false);
+ if (Flags.enableFocusOutline() && activity instanceof Launcher) {
+ icon.setOnFocusChangeListener(((Launcher) activity).getFocusHandler());
+ icon.setDefaultFocusHighlightEnabled(false);
+ }
+
// Sort contents, so that left-hand app comes first
appPairInfo.getContents().sort(Comparator.comparingInt(a -> a.rank));
diff --git a/src/com/android/launcher3/model/AllAppsList.java b/src/com/android/launcher3/model/AllAppsList.java
index bcd6ad2..64ebbf3 100644
--- a/src/com/android/launcher3/model/AllAppsList.java
+++ b/src/com/android/launcher3/model/AllAppsList.java
@@ -60,7 +60,7 @@
private static final String TAG = "AllAppsList";
private static final Consumer<AppInfo> NO_OP_CONSUMER = a -> { };
-
+ private static final boolean DEBUG = true;
public static final int DEFAULT_APPLICATIONS_NUMBER = 42;
@@ -220,6 +220,11 @@
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);
}
}
@@ -312,7 +317,10 @@
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);
}
}
@@ -337,6 +345,10 @@
}
} 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 6275ed0..29d2269 100644
--- a/src/com/android/launcher3/model/PackageUpdatedTask.java
+++ b/src/com/android/launcher3/model/PackageUpdatedTask.java
@@ -74,8 +74,8 @@
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 @@
: ItemInfoMatcher.ofPackages(packageSet, mUser);
final HashSet<ComponentName> removedComponents = new HashSet<>();
final HashMap<String, List<LauncherActivityInfo>> 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(packages[i],
@@ -133,10 +139,14 @@
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 @@
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 @@
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 @@
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;
@@ -336,7 +355,8 @@
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()) {
@@ -348,6 +368,9 @@
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
@@ -356,6 +379,10 @@
final LauncherApps launcherApps = context.getSystemService(LauncherApps.class);
for (int i=0; i<N; i++) {
if (!launcherApps.isPackageEnabled(packages[i], mUser)) {
+ if (DEBUG) {
+ Log.d(TAG, "OP_UPDATE:"
+ + " package " + packages[i] + " is disabled, removing package.");
+ }
removedPackages.add(packages[i]);
}
}
@@ -410,4 +437,18 @@
}
return false;
}
+
+ private String getOpString() {
+ return switch (mOp) {
+ case OP_NONE -> "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 d925629..f46dcd3 100644
--- a/src/com/android/launcher3/touch/ItemClickHandler.java
+++ b/src/com/android/launcher3/touch/ItemClickHandler.java
@@ -85,6 +85,7 @@
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 @@
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 @@
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 @@
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 @@
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 d293d15..9132b4f 100644
--- a/src/com/android/launcher3/widget/WidgetManagerHelper.java
+++ b/src/com/android/launcher3/widget/WidgetManagerHelper.java
@@ -26,6 +26,7 @@
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 @@
// 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 @@
return LauncherAppWidgetProviderInfo.fromProviderInfo(mContext, info);
}
}
+ Log.w(TAG, "findProvider: No App Widget Provider found for component=" + provider
+ + " user=" + user);
return null;
}
diff --git a/src/com/android/launcher3/widget/picker/WidgetsTwoPaneSheet.java b/src/com/android/launcher3/widget/picker/WidgetsTwoPaneSheet.java
index 9c4db60..f835e18 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsTwoPaneSheet.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsTwoPaneSheet.java
@@ -36,6 +36,7 @@
import android.widget.ScrollView;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.Px;
import com.android.launcher3.DeviceProfile;
@@ -78,6 +79,7 @@
private boolean mOldIsSwipeToDismissInProgress;
private int mActivePage = -1;
+ @Nullable
private PackageUserKey mSelectedHeader;
public WidgetsTwoPaneSheet(Context context, AttributeSet attrs, int defStyleAttr) {
@@ -230,7 +232,8 @@
if (mSuggestedWidgetsContainer == null && mRecommendedWidgetsCount > 0) {
setupSuggestedWidgets(LayoutInflater.from(getContext()));
mSuggestedWidgetsHeader.callOnClick();
- } else if (mSelectedHeader.equals(mSuggestedWidgetsPackageUserKey)) {
+ } else if (mSelectedHeader != null
+ && mSelectedHeader.equals(mSuggestedWidgetsPackageUserKey)) {
// Reselect widget if we are reloading recommendations while it is currently showing.
selectWidgetCell(mWidgetRecommendationsContainer, getLastSelectedWidgetItem());
}
@@ -280,8 +283,8 @@
mRightPaneScrollView.setScrollY(0);
mRightPane.setAccessibilityPaneTitle(suggestionsRightPaneTitle);
mSuggestedWidgetsPackageUserKey = PackageUserKey.fromPackageItemInfo(packageItemInfo);
- final boolean isChangingHeaders =
- !mSelectedHeader.equals(mSuggestedWidgetsPackageUserKey);
+ final boolean isChangingHeaders = mSelectedHeader == null
+ || !mSelectedHeader.equals(mSuggestedWidgetsPackageUserKey);
if (isChangingHeaders) {
// If switching from another header, unselect any WidgetCells. This is necessary
// because we do not clear/recycle the WidgetCells in the recommendations container
diff --git a/tests/multivalentTests/shared/com/android/launcher3/testing/shared/TestProtocol.java b/tests/multivalentTests/shared/com/android/launcher3/testing/shared/TestProtocol.java
index 4a04953..c3b7a2a 100644
--- a/tests/multivalentTests/shared/com/android/launcher3/testing/shared/TestProtocol.java
+++ b/tests/multivalentTests/shared/com/android/launcher3/testing/shared/TestProtocol.java
@@ -170,21 +170,13 @@
public static final String PERMANENT_DIAG_TAG = "TaplTarget";
public static final String TWO_NEXUS_LAUNCHER_ACTIVITY_WHILE_UNLOCKING = "b/273347463";
- public static final String TWO_TASKBAR_LONG_CLICKS = "b/262282528";
public static final String ICON_MISSING = "b/282963545";
- public static final String OVERVIEW_OVER_HOME = "b/279059025";
public static final String UIOBJECT_STALE_ELEMENT = "b/319501259";
public static final String TEST_DRAG_APP_ICON_TO_MULTIPLE_WORKSPACES_FAILURE = "b/326908466";
public static final String WIDGET_CONFIG_NULL_EXTRA_INTENT = "b/324419890";
- public static final String ACTIVITY_NOT_RESUMED_AFTER_BACK = "b/322823209";
public static final String OVERVIEW_SELECT_TOOLTIP_MISALIGNED = "b/332485341";
public static final String CLOCK_ICON_DRAWABLE_LEAKING = "b/319168409";
- public static final String REQUEST_EMULATE_DISPLAY = "emulate-display";
- public static final String REQUEST_STOP_EMULATE_DISPLAY = "stop-emulate-display";
- public static final String REQUEST_IS_EMULATE_DISPLAY_RUNNING = "is-emulate-display-running";
- public static final String REQUEST_EMULATE_PRINT_DEVICE = "emulate-print-device";
-
public static final String REQUEST_FLAG_ENABLE_GRID_ONLY_OVERVIEW = "enable-grid-only-overview";
public static final String REQUEST_FLAG_ENABLE_APP_PAIRS = "enable-app-pairs";
diff --git a/tests/src/com/android/launcher3/allapps/PrivateProfileManagerTest.java b/tests/src/com/android/launcher3/allapps/PrivateProfileManagerTest.java
index b6b2261..4cd2a07 100644
--- a/tests/src/com/android/launcher3/allapps/PrivateProfileManagerTest.java
+++ b/tests/src/com/android/launcher3/allapps/PrivateProfileManagerTest.java
@@ -202,6 +202,7 @@
}
@Test
+ @TestStabilityRule.Stability(flavors = LOCAL | PLATFORM_POSTSUBMIT) // b/339109319
public void openPrivateSpaceSettings_triggersCorrectIntent() {
Intent expectedIntent = ApiWrapper.INSTANCE.get(mContext).getPrivateSpaceSettingsIntent();
ArgumentCaptor<Intent> acIntent = ArgumentCaptor.forClass(Intent.class);