diff options
4 files changed, 49 insertions, 26 deletions
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 1d5d2794e851..70d9a044e7da 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -489,8 +489,6 @@ class Task extends TaskFragment { private boolean mForceShowForAllUsers; - private boolean mForceTranslucent = false; - // The display category name for this task. String mRequiredDisplayCategory; @@ -4512,10 +4510,6 @@ class Task extends TaskFragment { return true; } - void setForceTranslucent(boolean set) { - mForceTranslucent = set; - } - @Override public boolean isAlwaysOnTop() { return !isForceHidden() && super.isAlwaysOnTop(); @@ -4533,11 +4527,6 @@ class Task extends TaskFragment { } @Override - protected boolean isForceTranslucent() { - return mForceTranslucent; - } - - @Override long getProtoFieldId() { return TASK; } diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 906b3b55e015..87d6fd9286ab 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -375,6 +375,8 @@ class TaskFragment extends WindowContainer<WindowContainer> { @interface FlagForceHidden {} protected int mForceHiddenFlags = 0; + private boolean mForceTranslucent = false; + final Point mLastSurfaceSize = new Point(); private final Rect mTmpBounds = new Rect(); @@ -879,8 +881,12 @@ class TaskFragment extends WindowContainer<WindowContainer> { return true; } - protected boolean isForceTranslucent() { - return false; + boolean isForceTranslucent() { + return mForceTranslucent; + } + + void setForceTranslucent(boolean set) { + mForceTranslucent = set; } boolean isLeafTaskFragment() { diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 5ed6caffe1fb..0a733f66b69e 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -37,6 +37,7 @@ import static android.window.TaskFragmentOperation.OP_TYPE_SET_RELATIVE_BOUNDS; import static android.window.TaskFragmentOperation.OP_TYPE_START_ACTIVITY_IN_TASK_FRAGMENT; import static android.window.TaskFragmentOperation.OP_TYPE_UNKNOWN; import static android.window.WindowContainerTransaction.Change.CHANGE_FOCUSABLE; +import static android.window.WindowContainerTransaction.Change.CHANGE_FORCE_TRANSLUCENT; import static android.window.WindowContainerTransaction.Change.CHANGE_HIDDEN; import static android.window.WindowContainerTransaction.Change.CHANGE_RELATIVE_BOUNDS; import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_ADD_INSETS_FRAME_PROVIDER; @@ -746,8 +747,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub } } - if ((c.getChangeMask() - & WindowContainerTransaction.Change.CHANGE_FORCE_TRANSLUCENT) != 0) { + if ((c.getChangeMask() & CHANGE_FORCE_TRANSLUCENT) != 0) { tr.setForceTranslucent(c.getForceTranslucent()); effects = TRANSACT_EFFECTS_LIFECYCLE; } @@ -855,6 +855,11 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub effects |= TRANSACT_EFFECTS_LIFECYCLE; } } + if ((c.getChangeMask() & CHANGE_FORCE_TRANSLUCENT) != 0) { + taskFragment.setForceTranslucent(c.getForceTranslucent()); + effects = TRANSACT_EFFECTS_LIFECYCLE; + } + effects |= applyChanges(taskFragment, c); if (taskFragment.shouldStartChangeTransition(mTmpBounds0, mTmpBounds1)) { @@ -1996,9 +2001,11 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub if (mTaskFragmentOrganizerController.isSystemOrganizer(organizer.asBinder())) { // System organizer is allowed to update the hidden and focusable state. - // We unset the CHANGE_HIDDEN and CHANGE_FOCUSABLE bits because they are checked here. + // We unset the CHANGE_HIDDEN, CHANGE_FOCUSABLE, and CHANGE_FORCE_TRANSLUCENT bits + // because they are checked here. changeMaskToBeChecked &= ~CHANGE_HIDDEN; changeMaskToBeChecked &= ~CHANGE_FOCUSABLE; + changeMaskToBeChecked &= ~CHANGE_FORCE_TRANSLUCENT; } // setRelativeBounds is allowed. diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java index 0b77fd828745..fe562402769d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -101,6 +101,7 @@ import org.mockito.ArgumentCaptor; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.function.BiConsumer; /** * Test class for {@link ITaskOrganizer} and {@link android.window.ITaskOrganizerController}. @@ -583,7 +584,7 @@ public class WindowOrganizerTests extends WindowTestsBase { } @Test - public void testTaskFragmentHiddenAndFocusableChanges() { + public void testTaskFragmentHiddenFocusableTranslucentChanges() { removeGlobalMinSizeRestriction(); final Task rootTask = new TaskBuilder(mSupervisor).setCreateActivity(true) .setWindowingMode(WINDOWING_MODE_FULLSCREEN).build(); @@ -605,10 +606,12 @@ public class WindowOrganizerTests extends WindowTestsBase { assertTrue(taskFragment.shouldBeVisible(null)); assertTrue(taskFragment.isFocusable()); assertTrue(taskFragment.isTopActivityFocusable()); + assertFalse(taskFragment.isForceTranslucent()); // Apply transaction to the TaskFragment hidden and not focusable. t.setHidden(taskFragment.mRemoteToken.toWindowContainerToken(), true); t.setFocusable(taskFragment.mRemoteToken.toWindowContainerToken(), false); + t.setForceTranslucent(taskFragment.mRemoteToken.toWindowContainerToken(), true); mWm.mAtmService.mWindowOrganizerController.applyTaskFragmentTransactionLocked( t, TaskFragmentOrganizer.TASK_FRAGMENT_TRANSIT_CHANGE, false /* shouldApplyIndependently */); @@ -617,10 +620,12 @@ public class WindowOrganizerTests extends WindowTestsBase { assertFalse(taskFragment.shouldBeVisible(null)); assertFalse(taskFragment.isFocusable()); assertFalse(taskFragment.isTopActivityFocusable()); + assertTrue(taskFragment.isForceTranslucent()); // Apply transaction to the TaskFragment not hidden and focusable. t.setHidden(taskFragment.mRemoteToken.toWindowContainerToken(), false); t.setFocusable(taskFragment.mRemoteToken.toWindowContainerToken(), true); + t.setForceTranslucent(taskFragment.mRemoteToken.toWindowContainerToken(), false); mWm.mAtmService.mWindowOrganizerController.applyTaskFragmentTransactionLocked( t, TaskFragmentOrganizer.TASK_FRAGMENT_TRANSIT_CHANGE, false /* shouldApplyIndependently */); @@ -629,10 +634,32 @@ public class WindowOrganizerTests extends WindowTestsBase { assertTrue(taskFragment.shouldBeVisible(null)); assertTrue(taskFragment.isFocusable()); assertTrue(taskFragment.isTopActivityFocusable()); + assertFalse(taskFragment.isForceTranslucent()); } @Test - public void testTaskFragmentHiddenAndFocusableChanges_throwsWhenNotSystemOrganizer() { + public void testTaskFragmentChangeHidden_throwsWhenNotSystemOrganizer() { + // Non-system organizers are not allow to update the hidden state. + testTaskFragmentChangesWithoutSystemOrganizerThrowException( + (t, windowContainerToken) -> t.setHidden(windowContainerToken, true)); + } + + @Test + public void testTaskFragmentChangeFocusable_throwsWhenNotSystemOrganizer() { + // Non-system organizers are not allow to update the focusable state. + testTaskFragmentChangesWithoutSystemOrganizerThrowException( + (t, windowContainerToken) -> t.setFocusable(windowContainerToken, false)); + } + + @Test + public void testTaskFragmentChangeTranslucent_throwsWhenNotSystemOrganizer() { + // Non-system organizers are not allow to update the translucent state. + testTaskFragmentChangesWithoutSystemOrganizerThrowException( + (t, windowContainerToken) -> t.setForceTranslucent(windowContainerToken, true)); + } + + private void testTaskFragmentChangesWithoutSystemOrganizerThrowException( + BiConsumer<WindowContainerTransaction, WindowContainerToken> addOp) { removeGlobalMinSizeRestriction(); final Task rootTask = new TaskBuilder(mSupervisor).setCreateActivity(true) .setWindowingMode(WINDOWING_MODE_FULLSCREEN).build(); @@ -641,21 +668,15 @@ public class WindowOrganizerTests extends WindowTestsBase { final TaskFragmentOrganizer organizer = createTaskFragmentOrganizer(t, false /* isSystemOrganizer */); - final IBinder token = new Binder(); final TaskFragment taskFragment = new TaskFragmentBuilder(mAtm) .setParentTask(rootTask) - .setFragmentToken(token) + .setFragmentToken(new Binder()) .setOrganizer(organizer) .createActivityCount(1) .build(); - assertTrue(rootTask.shouldBeVisible(null)); - assertTrue(taskFragment.shouldBeVisible(null)); - - t.setHidden(taskFragment.mRemoteToken.toWindowContainerToken(), true); - t.setFocusable(taskFragment.mRemoteToken.toWindowContainerToken(), false); + addOp.accept(t, taskFragment.mRemoteToken.toWindowContainerToken()); - // Non-system organizers are not allow to update the hidden and focusable states. assertThrows(SecurityException.class, () -> mWm.mAtmService.mWindowOrganizerController.applyTaskFragmentTransactionLocked( t, TaskFragmentOrganizer.TASK_FRAGMENT_TRANSIT_CHANGE, |