Merge "Update usages of icon shapes in Launcher" into main
diff --git a/aconfig/Android.bp b/aconfig/Android.bp
index 5413601..bca7494 100644
--- a/aconfig/Android.bp
+++ b/aconfig/Android.bp
@@ -20,7 +20,7 @@
aconfig_declarations {
name: "com_android_launcher3_flags",
package: "com.android.launcher3",
- container: "system",
+ container: "system_ext",
srcs: ["**/*.aconfig"],
}
diff --git a/aconfig/launcher.aconfig b/aconfig/launcher.aconfig
index c3fb150..06809d7 100644
--- a/aconfig/launcher.aconfig
+++ b/aconfig/launcher.aconfig
@@ -1,5 +1,5 @@
package: "com.android.launcher3"
-container: "system"
+container: "system_ext"
flag {
name: "enable_expanding_pause_work_button"
diff --git a/aconfig/launcher_overview.aconfig b/aconfig/launcher_overview.aconfig
index 5f082db..30b0d40 100644
--- a/aconfig/launcher_overview.aconfig
+++ b/aconfig/launcher_overview.aconfig
@@ -1,5 +1,5 @@
package: "com.android.launcher3"
-container: "system"
+container: "system_ext"
flag {
name: "enable_grid_only_overview"
diff --git a/aconfig/launcher_search.aconfig b/aconfig/launcher_search.aconfig
index 72f654e..b98eee6 100644
--- a/aconfig/launcher_search.aconfig
+++ b/aconfig/launcher_search.aconfig
@@ -1,5 +1,5 @@
package: "com.android.launcher3"
-container: "system"
+container: "system_ext"
flag {
name: "enable_private_space"
diff --git a/quickstep/AndroidManifest.xml b/quickstep/AndroidManifest.xml
index 201c5f6..5ca7143 100644
--- a/quickstep/AndroidManifest.xml
+++ b/quickstep/AndroidManifest.xml
@@ -119,6 +119,7 @@
android:autoRemoveFromRecents="true"
android:excludeFromRecents="true"
android:theme="@style/GestureTutorialActivity"
+ android:label="@string/gesture_tutorial_title"
android:exported="true"
android:configChanges="orientation">
<intent-filter>
diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml
index 324ea31..0474000 100644
--- a/quickstep/res/values/strings.xml
+++ b/quickstep/res/values/strings.xml
@@ -98,6 +98,9 @@
<!-- content description for hotseat items -->
<string name="hotseat_prediction_content_description">Predicted app: <xliff:g id="title" example="Chrome">%1$s</xliff:g></string>
+ <!-- Title of the Gesture Navigation Tutorial page [CHAR LIMIT=NONE] -->
+ <string name="gesture_tutorial_title">Gesture Navigation Tutorial</string>
+
<!-- Title of prompt shown before the gesture navigation tutorial to users who need to rotate their screen. [CHAR LIMIT=100] -->
<string name="gesture_tutorial_rotation_prompt_title">Rotate your device</string>
<!-- Prompt shown before the gesture navigation tutorial to users who need to rotate their screen to begin. [CHAR LIMIT=100] -->
diff --git a/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt b/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt
index 82fd415..bfd93dd 100644
--- a/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt
@@ -70,7 +70,7 @@
val packageDesktopTasks =
(desktopTask?.tasks ?: emptyList()).filter(isTargetPackageTask)
val nonDesktopPackageTasks =
- tasks.filter { isTargetPackageTask(it.task1) }.map { it.task1 }
+ tasks.flatMap { it.tasks }.filter { isTargetPackageTask(it) }
// Add tasks from the fetched tasks, deduplicating by task ID
val packageTasks =
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.kt
index e654fe8..4afabde 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.kt
@@ -266,8 +266,8 @@
}
private fun updateOrderedRunningTaskIds(): MutableList<Int> {
- val desktopTaskAsList = getOrderedAndWrappedDesktopTasks()
- val desktopTaskIds = desktopTaskAsList.map { it.task1.key.id }
+ val desktopTasksAsList = getOrderedAndWrappedDesktopTasks().flatMap { it.tasks }
+ val desktopTaskIds = desktopTasksAsList.map { it.key.id }
var newOrder =
orderedRunningTaskIds
.filter { it in desktopTaskIds } // Only keep the tasks that are still running
@@ -383,11 +383,13 @@
itemInfo
} else {
val foundTask =
- groupTasks.find { task ->
- task.task1.key.packageName == itemInfo.targetPackage &&
- task.task1.key.userId == itemInfo.user.identifier
- } ?: return@map itemInfo
- TaskItemInfo(foundTask.task1.key.id, itemInfo as WorkspaceItemInfo)
+ groupTasks
+ .flatMap { it.tasks }
+ .find { task ->
+ task.key.packageName == itemInfo.targetPackage &&
+ task.key.userId == itemInfo.user.identifier
+ } ?: return@map itemInfo
+ TaskItemInfo(foundTask.key.id, itemInfo as WorkspaceItemInfo)
}
}
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 26957db..b5d9936 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -3230,7 +3230,7 @@
Map<TaskView, Float> gridTranslations = new HashMap<>();
TaskView lastLargeTaskView = mUtils.getLastLargeTaskView();
- int focusedTaskShift = 0;
+ int focusedTaskViewShift = 0;
int largeTaskWidthAndSpacing = 0;
int snappedTaskRowWidth = 0;
int snappedPage = isKeyboardTaskFocusPending() ? mKeyboardTaskFocusIndex : getNextPage();
@@ -3275,7 +3275,7 @@
topRowWidth += taskWidthAndSpacing;
bottomRowWidth += taskWidthAndSpacing;
}
- gridTranslation += focusedTaskShift;
+ gridTranslation += focusedTaskViewShift;
gridTranslation += mIsRtl ? taskWidthAndSpacing : -taskWidthAndSpacing;
// Center view vertically in case it's from different orientation.
@@ -3294,9 +3294,12 @@
gridTranslation +=
mIsRtl ? largeTaskWidthAndSpacing : -largeTaskWidthAndSpacing;
} else {
- // For task before the focused task, accumulate the width and spacing to
- // calculate the distance focused task need to shift.
- focusedTaskShift += mIsRtl ? taskWidthAndSpacing : -taskWidthAndSpacing;
+ // For TaskViews before the new focused TaskView, accumulate the width and
+ // spacing to calculate the distance the new focused TaskView needs to shift.
+ // This could happen for example after multiple times of dismissing the
+ // focused TaskView, the triggered rebalance might set a non-first TaskView
+ // inside `mChildren` as the new focused TaskView.
+ focusedTaskViewShift += mIsRtl ? taskWidthAndSpacing : -taskWidthAndSpacing;
}
int taskViewId = taskView.getTaskViewId();
@@ -3367,7 +3370,7 @@
if (snappedTaskView != null) {
snappedTaskNonGridScrollAdjustment = snappedTaskView.getScrollAdjustment(
/*gridEnabled=*/false);
- snappedTaskGridTranslationX = gridTranslations.get(snappedTaskView);
+ snappedTaskGridTranslationX = gridTranslations.getOrDefault(snappedTaskView, 0f);
}
// Use the accumulated translation of the row containing the last task.
@@ -3448,14 +3451,22 @@
for (TaskView taskView : getTaskViews()) {
taskView.setGridTranslationX(
- gridTranslations.get(taskView) - snappedTaskGridTranslationX
+ gridTranslations.getOrDefault(taskView, 0f) - snappedTaskGridTranslationX
+ snappedTaskNonGridScrollAdjustment);
}
if (mAddDesktopButton != null) {
- mAddDesktopButton.setTranslationX(
- gridTranslations.get(getFirstTaskView()) - snappedTaskGridTranslationX
- + snappedTaskNonGridScrollAdjustment);
+ TaskView firstTaskView = getFirstTaskView();
+ float translationX = 0f;
+ if (firstTaskView != null) {
+ translationX += firstTaskView.getGridTranslationX();
+ }
+ if (focusedTaskViewShift != 0) {
+ // If the focused task is inserted between `firstTaskView` and
+ // `mAddDesktopButton`, shift `mAddDesktopButton` to accommodate.
+ translationX += largeTaskWidthAndSpacing;
+ }
+ mAddDesktopButton.setTranslationX(translationX);
}
final TaskView runningTask = getRunningTaskView();
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
index 0bae42c..8d8e62e 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
@@ -91,6 +91,9 @@
private var canShowRunningAndRecentAppsAtInit = true
private var recentTasksChangedListener: RecentTasksChangedListener? = null
+ val recentShownTasks: List<Task>
+ get() = recentAppsController.shownTasks.flatMap { it.tasks }
+
@Before
fun setUp() {
super.setup()
@@ -354,9 +357,8 @@
val hotseatItem1 = newHotseatItems[0] as TaskItemInfo
assertThat(hotseatItem1.targetPackage).isEqualTo(HOTSEAT_PACKAGE_1)
- // The other task of the same package is not in shownTasks
- val shownTasks = recentAppsController.shownTasks.map { it.task1 }
- assertThat(shownTasks).isEmpty()
+ // The other task of the same package is not in recentShownTasks
+ assertThat(recentShownTasks).isEmpty()
}
@Test
@@ -439,8 +441,7 @@
runningTasks = listOf(task1, task2),
recentTaskPackages = emptyList(),
)
- val shownTasks = recentAppsController.shownTasks.map { it.task1 }
- assertThat(shownTasks).containsExactlyElementsIn(listOf(task1, task2))
+ assertThat(recentShownTasks).containsExactlyElementsIn(listOf(task1, task2))
}
@Test
@@ -535,8 +536,7 @@
recentTaskPackages = emptyList(),
)
- val shownTasks = recentAppsController.shownTasks.map { it.task1 }
- assertThat(shownTasks).isEqualTo(listOf(task1, task2))
+ assertThat(recentShownTasks).isEqualTo(listOf(task1, task2))
}
/**
@@ -554,10 +554,9 @@
recentTaskPackages = emptyList(),
)
- // Assert that shownTasks contains only one instance of the app
- val shownTasks = recentAppsController.shownTasks.map { it.task1 }
- assertThat(shownTasks).hasSize(1)
- assertThat(shownTasks[0].key.packageName).isEqualTo(RUNNING_APP_PACKAGE_1)
+ // Assert that recentShownTasks contains only one instance of the app
+ assertThat(recentShownTasks).hasSize(1)
+ assertThat(recentShownTasks[0].key.packageName).isEqualTo(RUNNING_APP_PACKAGE_1)
}
@Test
@@ -839,8 +838,7 @@
runningTasks = runningTasks,
recentTaskPackages = emptyList(),
)
- val shownTasks = recentAppsController.shownTasks.map { it.task1 }
- assertThat(shownTasks).contains(runningTask)
+ assertThat(recentShownTasks).contains(runningTask)
assertThat(recentAppsController.runningTaskIds).containsExactlyElementsIn(listOf(1))
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt
index f2dcf77..e7f3523 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt
@@ -99,9 +99,9 @@
/** Verifies that recents from [startIndex] have IDs that match [expectedIds] in order. */
fun hasRecentsOrder(startIndex: Int, expectedIds: List<Int>) {
val actualIds =
- view.iconViews.slice(startIndex..<startIndex + expectedIds.size).map {
+ view.iconViews.slice(startIndex..<startIndex + expectedIds.size).flatMap {
assertThat(it.tag).isInstanceOf(GroupTask::class.java)
- (it.tag as? GroupTask)?.task1?.key?.id
+ (it.tag as GroupTask).tasks.map { task -> task.key.id }
}
assertThat(actualIds).containsExactlyElementsIn(expectedIds).inOrder()
}
diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsOverviewDesktop.kt b/quickstep/tests/src/com/android/quickstep/TaplTestsOverviewDesktop.kt
index b744039..75947ab 100644
--- a/quickstep/tests/src/com/android/quickstep/TaplTestsOverviewDesktop.kt
+++ b/quickstep/tests/src/com/android/quickstep/TaplTestsOverviewDesktop.kt
@@ -122,25 +122,25 @@
val desktop = moveTaskToDesktop(TEST_ACTIVITY_EXTRA)
var overview = desktop.switchToOverview()
- // Open focused task and go back to Overview to validate whether it has adjacent tasks in
- // its both sides (grid task on left and desktop tasks at its right side)
- val focusedTaskOpened = overview.getTestActivityTask(TEST_ACTIVITY_2).open()
+ // Open first fullscreen task and go back to Overview to validate whether it has adjacent
+ // tasks in its both sides (grid task on left and desktop tasks at its right side)
+ val firstFullscreenTaskOpened = overview.getTestActivityTask(TEST_ACTIVITY_2).open()
- // Fling to desktop task and dismiss the focused task to check repositioning of
+ // Fling to desktop task and dismiss the first fullscreen task to check repositioning of
// grid tasks.
- overview = focusedTaskOpened.switchToOverview().apply { flingBackward() }
+ overview = firstFullscreenTaskOpened.switchToOverview().apply { flingBackward() }
val desktopTask = overview.currentTask
assertWithMessage("The current task is not a Desktop.").that(desktopTask.isDesktop).isTrue()
- // Get focused task (previously opened task) then dismiss this task
- val focusedTaskInOverview = overview.getTestActivityTask(TEST_ACTIVITY_2)
- assertTaskContentDescription(focusedTaskInOverview, TEST_ACTIVITY_2)
- focusedTaskInOverview.dismiss()
+ // Get first fullscreen task (previously opened task) then dismiss this task
+ val firstFullscreenTaskInOverview = overview.getTestActivityTask(TEST_ACTIVITY_2)
+ assertTaskContentDescription(firstFullscreenTaskInOverview, TEST_ACTIVITY_2)
+ firstFullscreenTaskInOverview.dismiss()
- // Dismiss DesktopTask to validate whether the new focused task will take its position
+ // Dismiss DesktopTask to validate whether the new task will take its position
desktopTask.dismiss()
- // Dismiss last focused task
+ // Dismiss last fullscreen task
val lastFocusedTask = overview.currentTask
assertTaskContentDescription(lastFocusedTask, TEST_ACTIVITY_1)
lastFocusedTask.dismiss()
diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
index 70bfb60..2431ef5 100644
--- a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
+++ b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
@@ -157,6 +157,7 @@
}
boolean taskWasFocused = mLauncher.isTablet()
+ && !isDesktop()
&& getVisibleHeight() == mLauncher.getOverviewTaskSize().height();
List<Integer> originalTasksCenterX =
getCurrentTasksCenterXList().stream().sorted().toList();