Loading services/core/java/com/android/server/wm/TaskFragment.java +4 −2 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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) { Loading services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java +25 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading
services/core/java/com/android/server/wm/TaskFragment.java +4 −2 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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) { Loading
services/tests/wmtests/src/com/android/server/wm/RootTaskTests.java +25 −0 Original line number Diff line number Diff line Loading @@ -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 Loading