Loading services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +7 −4 Original line number Diff line number Diff line Loading @@ -2952,13 +2952,16 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { } private boolean isOpaqueInner(@NonNull WindowContainer<?> container) { // If it's a leaf task fragment, then opacity is calculated based on its activities. if (container.asTaskFragment() != null && ((TaskFragment) container).isLeafTaskFragment()) { final boolean isActivity = container.asActivityRecord() != null; final boolean isLeafTaskFragment = container.asTaskFragment() != null && ((TaskFragment) container).isLeafTaskFragment(); if (isActivity || isLeafTaskFragment) { // When it is an activity or leaf task fragment, then opacity is calculated based // on itself or its activities. return container.getActivity(this, true /* traverseTopToBottom */, null /* boundary */) != null; } // When not a leaf, it's considered opaque if any of its opaque children fill this // Otherwise, it's considered opaque if any of its opaque children fill this // container, unless the children are adjacent fragments, in which case as long as they // are all opaque then |container| is also considered opaque, even if the adjacent // task fragment aren't filling. Loading services/tests/wmtests/src/com/android/server/wm/ActivityTaskSupervisorTests.java +26 −0 Original line number Diff line number Diff line Loading @@ -509,6 +509,32 @@ public class ActivityTaskSupervisorTests extends WindowTestsBase { assertThat(mSupervisor.mOpaqueContainerHelper.isOpaque(rootTask)).isTrue(); } @Test public void testOpaque_nonLeafTaskFragmentWithDirectActivity_opaque() { final ActivityRecord directChildActivity = new ActivityBuilder(mAtm).setCreateTask(true) .build(); directChildActivity.setOccludesParent(true); final Task nonLeafTask = directChildActivity.getTask(); final TaskFragment directChildFragment = new TaskFragment(mAtm, new Binder(), true /* createdByOrganizer */, false /* isEmbedded */); nonLeafTask.addChild(directChildFragment, 0); assertThat(mSupervisor.mOpaqueContainerHelper.isOpaque(nonLeafTask)).isTrue(); } @Test public void testOpaque_nonLeafTaskFragmentWithDirectActivity_transparent() { final ActivityRecord directChildActivity = new ActivityBuilder(mAtm).setCreateTask(true) .build(); directChildActivity.setOccludesParent(false); final Task nonLeafTask = directChildActivity.getTask(); final TaskFragment directChildFragment = new TaskFragment(mAtm, new Binder(), true /* createdByOrganizer */, false /* isEmbedded */); nonLeafTask.addChild(directChildFragment, 0); assertThat(mSupervisor.mOpaqueContainerHelper.isOpaque(nonLeafTask)).isFalse(); } @NonNull private TaskFragment createChildTaskFragment(@NonNull Task parent, @WindowConfiguration.WindowingMode int windowingMode, Loading Loading
services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +7 −4 Original line number Diff line number Diff line Loading @@ -2952,13 +2952,16 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { } private boolean isOpaqueInner(@NonNull WindowContainer<?> container) { // If it's a leaf task fragment, then opacity is calculated based on its activities. if (container.asTaskFragment() != null && ((TaskFragment) container).isLeafTaskFragment()) { final boolean isActivity = container.asActivityRecord() != null; final boolean isLeafTaskFragment = container.asTaskFragment() != null && ((TaskFragment) container).isLeafTaskFragment(); if (isActivity || isLeafTaskFragment) { // When it is an activity or leaf task fragment, then opacity is calculated based // on itself or its activities. return container.getActivity(this, true /* traverseTopToBottom */, null /* boundary */) != null; } // When not a leaf, it's considered opaque if any of its opaque children fill this // Otherwise, it's considered opaque if any of its opaque children fill this // container, unless the children are adjacent fragments, in which case as long as they // are all opaque then |container| is also considered opaque, even if the adjacent // task fragment aren't filling. Loading
services/tests/wmtests/src/com/android/server/wm/ActivityTaskSupervisorTests.java +26 −0 Original line number Diff line number Diff line Loading @@ -509,6 +509,32 @@ public class ActivityTaskSupervisorTests extends WindowTestsBase { assertThat(mSupervisor.mOpaqueContainerHelper.isOpaque(rootTask)).isTrue(); } @Test public void testOpaque_nonLeafTaskFragmentWithDirectActivity_opaque() { final ActivityRecord directChildActivity = new ActivityBuilder(mAtm).setCreateTask(true) .build(); directChildActivity.setOccludesParent(true); final Task nonLeafTask = directChildActivity.getTask(); final TaskFragment directChildFragment = new TaskFragment(mAtm, new Binder(), true /* createdByOrganizer */, false /* isEmbedded */); nonLeafTask.addChild(directChildFragment, 0); assertThat(mSupervisor.mOpaqueContainerHelper.isOpaque(nonLeafTask)).isTrue(); } @Test public void testOpaque_nonLeafTaskFragmentWithDirectActivity_transparent() { final ActivityRecord directChildActivity = new ActivityBuilder(mAtm).setCreateTask(true) .build(); directChildActivity.setOccludesParent(false); final Task nonLeafTask = directChildActivity.getTask(); final TaskFragment directChildFragment = new TaskFragment(mAtm, new Binder(), true /* createdByOrganizer */, false /* isEmbedded */); nonLeafTask.addChild(directChildFragment, 0); assertThat(mSupervisor.mOpaqueContainerHelper.isOpaque(nonLeafTask)).isFalse(); } @NonNull private TaskFragment createChildTaskFragment(@NonNull Task parent, @WindowConfiguration.WindowingMode int windowingMode, Loading