Loading services/core/java/com/android/server/wm/Task.java +0 −11 Original line number Diff line number Diff line Loading @@ -486,8 +486,6 @@ class Task extends TaskFragment { private boolean mForceShowForAllUsers; private boolean mForceTranslucent = false; // The display category name for this task. String mRequiredDisplayCategory; Loading Loading @@ -4502,10 +4500,6 @@ class Task extends TaskFragment { return true; } void setForceTranslucent(boolean set) { mForceTranslucent = set; } @Override public boolean isAlwaysOnTop() { return !isForceHidden() && super.isAlwaysOnTop(); Loading @@ -4522,11 +4516,6 @@ class Task extends TaskFragment { return (mForceHiddenFlags & FLAG_FORCE_HIDDEN_FOR_PINNED_TASK) != 0; } @Override protected boolean isForceTranslucent() { return mForceTranslucent; } @Override long getProtoFieldId() { return TASK; Loading services/core/java/com/android/server/wm/TaskFragment.java +8 −2 Original line number Diff line number Diff line Loading @@ -374,6 +374,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(); Loading Loading @@ -843,8 +845,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() { Loading services/core/java/com/android/server/wm/WindowOrganizerController.java +10 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -768,8 +769,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; } Loading Loading @@ -877,6 +877,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)) { Loading Loading @@ -2022,9 +2027,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. Loading services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +31 −10 Original line number Diff line number Diff line Loading @@ -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}. Loading Loading @@ -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(); Loading @@ -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 */); Loading @@ -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 */); Loading @@ -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(); Loading @@ -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, Loading Loading
services/core/java/com/android/server/wm/Task.java +0 −11 Original line number Diff line number Diff line Loading @@ -486,8 +486,6 @@ class Task extends TaskFragment { private boolean mForceShowForAllUsers; private boolean mForceTranslucent = false; // The display category name for this task. String mRequiredDisplayCategory; Loading Loading @@ -4502,10 +4500,6 @@ class Task extends TaskFragment { return true; } void setForceTranslucent(boolean set) { mForceTranslucent = set; } @Override public boolean isAlwaysOnTop() { return !isForceHidden() && super.isAlwaysOnTop(); Loading @@ -4522,11 +4516,6 @@ class Task extends TaskFragment { return (mForceHiddenFlags & FLAG_FORCE_HIDDEN_FOR_PINNED_TASK) != 0; } @Override protected boolean isForceTranslucent() { return mForceTranslucent; } @Override long getProtoFieldId() { return TASK; Loading
services/core/java/com/android/server/wm/TaskFragment.java +8 −2 Original line number Diff line number Diff line Loading @@ -374,6 +374,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(); Loading Loading @@ -843,8 +845,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() { Loading
services/core/java/com/android/server/wm/WindowOrganizerController.java +10 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -768,8 +769,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; } Loading Loading @@ -877,6 +877,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)) { Loading Loading @@ -2022,9 +2027,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. Loading
services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +31 −10 Original line number Diff line number Diff line Loading @@ -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}. Loading Loading @@ -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(); Loading @@ -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 */); Loading @@ -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 */); Loading @@ -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(); Loading @@ -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, Loading