Merge "Fix task movement if top running activity of focused stack is null" into qt-dev
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 6976aa9..b6840fa 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -2081,8 +2081,8 @@
final ActivityRecord curTop = (focusStack == null)
? null : focusStack.topRunningNonDelayedActivityLocked(mNotTop);
final TaskRecord topTask = curTop != null ? curTop.getTaskRecord() : null;
- differentTopTask = topTask != null
- && (topTask != intentActivity.getTaskRecord() || topTask != focusStack.topTask());
+ differentTopTask = topTask != intentActivity.getTaskRecord()
+ || (focusStack != null && topTask != focusStack.topTask());
} else {
// The existing task should always be different from those in other displays.
differentTopTask = true;
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
index a9807fb..5803385 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
@@ -699,6 +699,36 @@
}
/**
+ * This test ensures that {@link ActivityStarter#setTargetStackAndMoveToFrontIfNeeded} will
+ * move the existing task to front if the current focused stack doesn't have running task.
+ */
+ @Test
+ public void testBringTaskToFrontWhenFocusedStackIsFinising() {
+ // Put 2 tasks in the same stack (simulate the behavior of home stack).
+ final ActivityRecord activity = new ActivityBuilder(mService)
+ .setCreateTask(true).build();
+ new ActivityBuilder(mService)
+ .setStack(activity.getActivityStack())
+ .setCreateTask(true).build();
+
+ // Create a top finishing activity.
+ final ActivityRecord finishingTopActivity = new ActivityBuilder(mService)
+ .setCreateTask(true).build();
+ finishingTopActivity.getActivityStack().moveToFront("finishingTopActivity");
+
+ assertEquals(finishingTopActivity, mRootActivityContainer.topRunningActivity());
+ finishingTopActivity.finishing = true;
+
+ // Launch the bottom task of the target stack.
+ prepareStarter(FLAG_ACTIVITY_NEW_TASK, false /* mockGetLaunchStack */)
+ .setReason("testBringTaskToFrontWhenTopStackIsFinising")
+ .setIntent(activity.intent)
+ .execute();
+ // The hierarchies of the activity should move to front.
+ assertEquals(activity, mRootActivityContainer.topRunningActivity());
+ }
+
+ /**
* This test ensures that when starting an existing single task activity on secondary display
* which is not the top focused display, it should deliver new intent to the activity and not
* create a new stack.