diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/TaskFragment.java | 6 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java | 25 |
2 files changed, 29 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index c6c3b14bf98b..0c1f33ccedbc 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -1017,8 +1017,11 @@ class TaskFragment extends WindowContainer<WindowContainer> { if (isTopActivityLaunchedBehind()) { return TASK_FRAGMENT_VISIBILITY_VISIBLE; } + final WindowContainer<?> parent = getParent(); final Task thisTask = asTask(); - if (thisTask != null && mTransitionController.isTransientHide(thisTask)) { + if (thisTask != null && parent.asTask() == null + && mTransitionController.isTransientHide(thisTask)) { + // Keep transient-hide root tasks visible. Non-root tasks still follow standard rule. return TASK_FRAGMENT_VISIBILITY_VISIBLE; } @@ -1028,7 +1031,6 @@ class TaskFragment extends WindowContainer<WindowContainer> { // This TaskFragment is only considered visible if all its parent TaskFragments are // considered visible, so check the visibility of all ancestor TaskFragment first. - final WindowContainer parent = getParent(); if (parent.asTaskFragment() != null) { final int parentVisibility = parent.asTaskFragment().getVisibility(starting); if (parentVisibility == TASK_FRAGMENT_VISIBILITY_INVISIBLE) { diff --git a/services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java b/services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java index fb29d3adb52b..abf21a57dd40 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java @@ -641,6 +641,31 @@ public class RootTaskTests extends WindowTestsBase { // Home split secondary and home task should be invisible. assertEquals(TASK_FRAGMENT_VISIBILITY_INVISIBLE, splitSecondary.getVisibility(null /* starting */)); + + // Put another task on top of primary split. + final Task topSplitPrimary = new TaskBuilder(mSupervisor).setParentTask(organizer.mPrimary) + .setCreateActivity(true).build(); + doReturn(false).when(topSplitPrimary).isTranslucent(any()); + // Convert the fullscreen translucent task to opaque. + doReturn(false).when(translucentRootTask).isTranslucent(any()); + translucentRootTask.moveToFront("test"); + // The tasks of primary split are occluded by the fullscreen opaque task. + assertEquals(TASK_FRAGMENT_VISIBILITY_INVISIBLE, + organizer.mPrimary.getVisibility(null /* starting */)); + assertEquals(TASK_FRAGMENT_VISIBILITY_INVISIBLE, + topSplitPrimary.getVisibility(null /* starting */)); + // Make primary split root transient-hide. + spyOn(splitPrimary.mTransitionController); + doReturn(true).when(splitPrimary.mTransitionController).isTransientHide( + organizer.mPrimary); + // The split root and its top become visible. + assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE, + organizer.mPrimary.getVisibility(null /* starting */)); + assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE, + topSplitPrimary.getVisibility(null /* starting */)); + // The bottom of primary split becomes invisible because it is occluded by topSplitPrimary. + assertEquals(TASK_FRAGMENT_VISIBILITY_INVISIBLE, + splitPrimary.getVisibility(null /* starting */)); } @Test |