Merge "Do not use top running activities in other tasks when reset tasks"
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index 186f838..ba166ea 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -3596,6 +3596,16 @@
return taskInsertionPoint;
}
+ /**
+ * Reset the task by reparenting the activities that have same affinity to the task or
+ * reparenting the activities that have different affinityies out of the task, while these
+ * activities allow task reparenting.
+ *
+ * @param taskTop Top activity of the task might be reset.
+ * @param newActivity The activity that going to be started.
+ * @return The non-finishing top activity of the task after reset or the original task top
+ * activity if all activities within the task are finishing.
+ */
final ActivityRecord resetTaskIfNeededLocked(ActivityRecord taskTop,
ActivityRecord newActivity) {
final boolean forceReset =
@@ -3626,9 +3636,10 @@
int taskNdx = mTaskHistory.indexOf(task);
if (taskNdx >= 0) {
- do {
- taskTop = mTaskHistory.get(taskNdx--).getTopActivity();
- } while (taskTop == null && taskNdx >= 0);
+ ActivityRecord newTop = mTaskHistory.get(taskNdx).getTopActivity();
+ if (newTop != null) {
+ taskTop = newTop;
+ }
}
if (topOptions != null) {
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
index fd552fc..d3194508 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
@@ -1109,6 +1109,19 @@
assertTrue(listener.mChanged);
}
+ @Test
+ public void testResetTaskWithFinishingActivities() {
+ final ActivityRecord taskTop =
+ new ActivityBuilder(mService).setStack(mStack).setCreateTask(true).build();
+ // Make all activities in the task are finishing to simulate TaskRecord#getTopActivity
+ // returns null.
+ taskTop.finishing = true;
+
+ final ActivityRecord newR = new ActivityBuilder(mService).build();
+ final ActivityRecord result = mStack.resetTaskIfNeededLocked(taskTop, newR);
+ assertThat(result).isEqualTo(taskTop);
+ }
+
private void verifyShouldSleepActivities(boolean focusedStack,
boolean keyguardGoingAway, boolean displaySleeping, boolean expected) {
final ActivityDisplay display = mock(ActivityDisplay.class);