From 1192afbc0d59a615910ba3f8d76c7fdae4c9b63b Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Mon, 22 Mar 2021 11:39:57 +0800 Subject: [PATCH] Fixes few corner issues of multi-window windowing mode split-screen - Updates the preferred top focused root task when a root task was added on top. - Also updates the resumed activity (so as the focused app) while root task position changed. - Do not resume the top activities of the tasks that are visible, but is behind other visible tasks (TASK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT). Bug: 177190100 Test: ActivityLifecycleLegacySplitScreenTests Test: MultiWindowTests#testLaunchToSideAndBringToFront Change-Id: Ied5041f3987a964931cdab508955759671336af4 --- services/core/java/com/android/server/wm/Task.java | 8 +++----- .../java/com/android/server/wm/TaskDisplayArea.java | 11 +++++++++++ .../com/android/server/wm/ActivityRecordTests.java | 4 ++++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index a4a0866d846af..b36c25c0cae19 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -6060,12 +6060,10 @@ class Task extends WindowContainer { int idx = mChildren.size() - 1; while (idx >= 0) { final Task child = (Task) getChildAt(idx--); - if (!child.isFocusableAndVisible()) { - break; + if (!child.isTopActivityFocusable()) { + continue; } - - // Only allow one activity to be resumed among sibling tasks in split-screen. - if (inSplitScreenWindowingMode() && someActivityResumed) { + if (child.getVisibility(null /* starting */) != TASK_VISIBILITY_VISIBLE) { break; } diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 88e9ae9179c91..379906709a2ea 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -346,6 +346,12 @@ final class TaskDisplayArea extends DisplayArea { position = findPositionForRootTask(position, task, true /* adding */); super.addChild(task, position); + if (mPreferredTopFocusableRootTask != null + && task.isFocusable() + && mPreferredTopFocusableRootTask.compareTo(task) < 0) { + // Clear preferred top because the adding focusable task has a higher z-order. + mPreferredTopFocusableRootTask = null; + } mAtmService.updateSleepIfNeededLocked(); onRootTaskOrderChanged(task); } @@ -439,6 +445,11 @@ final class TaskDisplayArea extends DisplayArea { // Update the top resumed activity because the preferred top focusable task may be changed. mAtmService.mTaskSupervisor.updateTopResumedActivityIfNeeded(); + final ActivityRecord r = child.getResumedActivity(); + if (r != null && r == mRootWindowContainer.getTopResumedActivity()) { + mAtmService.setResumedActivityUncheckLocked(r, "positionChildAt"); + } + if (mChildren.indexOf(child) != oldPosition) { onRootTaskOrderChanged(child); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 027c2f7be05d3..ab9aa26f0e8c0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -2157,6 +2157,8 @@ public class ActivityRecordTests extends WindowTestsBase { attrs.setTitle("AppWindow"); final TestWindowState appWindow = createWindowState(attrs, activity); activity.addWindow(appWindow); + spyOn(appWindow); + doNothing().when(appWindow).onStartFreezingScreen(); // Set initial orientation and update. activity.setOrientation(SCREEN_ORIENTATION_LANDSCAPE); @@ -2193,6 +2195,8 @@ public class ActivityRecordTests extends WindowTestsBase { attrs.setTitle("RotationByPolicy"); final TestWindowState appWindow = createWindowState(attrs, activity); activity.addWindow(appWindow); + spyOn(appWindow); + doNothing().when(appWindow).onStartFreezingScreen(); // Set initial orientation and update. performRotation(displayRotation, Surface.ROTATION_90);