Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +26 −12 Original line number Diff line number Diff line Loading @@ -1099,10 +1099,15 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, mSplitScreenController.moveTaskToFullscreen(getOtherSplitTask(mTaskId).taskId, SplitScreenController.EXIT_REASON_DESKTOP_MODE); } else { if (DesktopExperienceFlags .ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS.isTrue()) { final int nextFocusedTaskId = mDesktopTasksController.getNextFocusedTask(decoration.mTaskInfo); if (nextFocusedTaskId != INVALID_TASK_ID) { mWindowDecorByTaskId.get(nextFocusedTaskId).a11yAnnounceNewFocusedWindow(); DesktopModeWindowDecoration nextFocusedWindow = mWindowDecorByTaskId.get(nextFocusedTaskId); if (nextFocusedWindow != null) { nextFocusedWindow.a11yAnnounceNewFocusedWindow(); } } WindowContainerTransaction wct = new WindowContainerTransaction(); final Function1<IBinder, Unit> runOnTransitionStart = Loading Loading @@ -1146,10 +1151,15 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, getInputMethod(mMotionEvent)); } } else if (id == R.id.minimize_window) { if (DesktopExperienceFlags .ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS.isTrue()) { final int nextFocusedTaskId = mDesktopTasksController .getNextFocusedTask(decoration.mTaskInfo); if (nextFocusedTaskId != INVALID_TASK_ID) { mWindowDecorByTaskId.get(nextFocusedTaskId).a11yAnnounceNewFocusedWindow(); DesktopModeWindowDecoration nextFocusedWindow = mWindowDecorByTaskId.get(nextFocusedTaskId); if (nextFocusedWindow != null) { nextFocusedWindow.a11yAnnounceNewFocusedWindow(); } } mDesktopTasksController.minimizeTask( decoration.mTaskInfo, MinimizeReason.MINIMIZE_BUTTON); Loading Loading @@ -2201,10 +2211,14 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, @Override public void onMinimize(@NonNull RunningTaskInfo taskInfo) { if (DesktopExperienceFlags .ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS.isTrue()) { final int nextFocusedTaskId = mDesktopTasksController.getNextFocusedTask(taskInfo); if (nextFocusedTaskId != INVALID_TASK_ID) { mViewModel.mWindowDecorByTaskId.get(nextFocusedTaskId) .a11yAnnounceNewFocusedWindow(); DesktopModeWindowDecoration nextFocusedWindow = mViewModel.mWindowDecorByTaskId.get(nextFocusedTaskId); if (nextFocusedWindow != null) { nextFocusedWindow.a11yAnnounceNewFocusedWindow(); } } mDesktopTasksController.minimizeTask(taskInfo, MinimizeReason.MINIMIZE_BUTTON); } Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt +59 −1 Original line number Diff line number Diff line Loading @@ -264,6 +264,7 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest } @Test @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS) fun testCloseButtonInFreeform_closeWindow() { val onClickListenerCaptor = argumentCaptor<View.OnClickListener>() val decor = createOpenTaskDecoration( Loading @@ -280,6 +281,36 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest onClickListenerCaptor.firstValue.onClick(view) verify(mockDesktopTasksController, never()).getNextFocusedTask(decor.mTaskInfo) val transactionCaptor = argumentCaptor<WindowContainerTransaction>() verify(mockFreeformTaskTransitionStarter).startRemoveTransition(transactionCaptor.capture()) val wct = transactionCaptor.firstValue assertThat(wct.hierarchyOps).hasSize(1) val hierarchyOp = wct.hierarchyOps[0] assertThat(hierarchyOp.type).isEqualTo(HierarchyOp.HIERARCHY_OP_TYPE_REMOVE_TASK) assertThat(hierarchyOp.container).isEqualTo(decor.mTaskInfo.token.asBinder()) } @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS) fun testCloseButtonInFreeform_withStateChangeAnnouncementFlag_closeWindow() { val onClickListenerCaptor = argumentCaptor<View.OnClickListener>() val decor = createOpenTaskDecoration( windowingMode = WINDOWING_MODE_FREEFORM, onCaptionButtonClickListener = onClickListenerCaptor, ) val view = mock<View> { on { id } doReturn R.id.close_window } desktopModeWindowDecorViewModel .setFreeformTaskTransitionStarter(mockFreeformTaskTransitionStarter) onClickListenerCaptor.firstValue.onClick(view) verify(mockDesktopTasksController).getNextFocusedTask(decor.mTaskInfo) val transactionCaptor = argumentCaptor<WindowContainerTransaction>() Loading @@ -294,7 +325,34 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest @Test @EnableFlags(Flags.FLAG_ENABLE_MINIMIZE_BUTTON) fun testMinimizeButtonInFreefrom_minimizeWindow() { @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS) fun testMinimizeButtonInFreeform_minimizeWindow() { val onClickListenerCaptor = argumentCaptor<View.OnClickListener>() val decor = createOpenTaskDecoration( windowingMode = WINDOWING_MODE_FREEFORM, onCaptionButtonClickListener = onClickListenerCaptor, ) val view = mock<View> { on { id } doReturn R.id.minimize_window } desktopModeWindowDecorViewModel .setFreeformTaskTransitionStarter(mockFreeformTaskTransitionStarter) onClickListenerCaptor.firstValue.onClick(view) verify(mockDesktopTasksController, never()).getNextFocusedTask(decor.mTaskInfo) verify(mockDesktopTasksController) .minimizeTask(decor.mTaskInfo, MinimizeReason.MINIMIZE_BUTTON) } @Test @EnableFlags( Flags.FLAG_ENABLE_MINIMIZE_BUTTON, Flags.FLAG_ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS ) fun testMinimizeButtonInFreeform_withStateChangeAnnouncementFlag_minimizeWindow() { val onClickListenerCaptor = argumentCaptor<View.OnClickListener>() val decor = createOpenTaskDecoration( windowingMode = WINDOWING_MODE_FREEFORM, Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +26 −12 Original line number Diff line number Diff line Loading @@ -1099,10 +1099,15 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, mSplitScreenController.moveTaskToFullscreen(getOtherSplitTask(mTaskId).taskId, SplitScreenController.EXIT_REASON_DESKTOP_MODE); } else { if (DesktopExperienceFlags .ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS.isTrue()) { final int nextFocusedTaskId = mDesktopTasksController.getNextFocusedTask(decoration.mTaskInfo); if (nextFocusedTaskId != INVALID_TASK_ID) { mWindowDecorByTaskId.get(nextFocusedTaskId).a11yAnnounceNewFocusedWindow(); DesktopModeWindowDecoration nextFocusedWindow = mWindowDecorByTaskId.get(nextFocusedTaskId); if (nextFocusedWindow != null) { nextFocusedWindow.a11yAnnounceNewFocusedWindow(); } } WindowContainerTransaction wct = new WindowContainerTransaction(); final Function1<IBinder, Unit> runOnTransitionStart = Loading Loading @@ -1146,10 +1151,15 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, getInputMethod(mMotionEvent)); } } else if (id == R.id.minimize_window) { if (DesktopExperienceFlags .ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS.isTrue()) { final int nextFocusedTaskId = mDesktopTasksController .getNextFocusedTask(decoration.mTaskInfo); if (nextFocusedTaskId != INVALID_TASK_ID) { mWindowDecorByTaskId.get(nextFocusedTaskId).a11yAnnounceNewFocusedWindow(); DesktopModeWindowDecoration nextFocusedWindow = mWindowDecorByTaskId.get(nextFocusedTaskId); if (nextFocusedWindow != null) { nextFocusedWindow.a11yAnnounceNewFocusedWindow(); } } mDesktopTasksController.minimizeTask( decoration.mTaskInfo, MinimizeReason.MINIMIZE_BUTTON); Loading Loading @@ -2201,10 +2211,14 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, @Override public void onMinimize(@NonNull RunningTaskInfo taskInfo) { if (DesktopExperienceFlags .ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS.isTrue()) { final int nextFocusedTaskId = mDesktopTasksController.getNextFocusedTask(taskInfo); if (nextFocusedTaskId != INVALID_TASK_ID) { mViewModel.mWindowDecorByTaskId.get(nextFocusedTaskId) .a11yAnnounceNewFocusedWindow(); DesktopModeWindowDecoration nextFocusedWindow = mViewModel.mWindowDecorByTaskId.get(nextFocusedTaskId); if (nextFocusedWindow != null) { nextFocusedWindow.a11yAnnounceNewFocusedWindow(); } } mDesktopTasksController.minimizeTask(taskInfo, MinimizeReason.MINIMIZE_BUTTON); } Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt +59 −1 Original line number Diff line number Diff line Loading @@ -264,6 +264,7 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest } @Test @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS) fun testCloseButtonInFreeform_closeWindow() { val onClickListenerCaptor = argumentCaptor<View.OnClickListener>() val decor = createOpenTaskDecoration( Loading @@ -280,6 +281,36 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest onClickListenerCaptor.firstValue.onClick(view) verify(mockDesktopTasksController, never()).getNextFocusedTask(decor.mTaskInfo) val transactionCaptor = argumentCaptor<WindowContainerTransaction>() verify(mockFreeformTaskTransitionStarter).startRemoveTransition(transactionCaptor.capture()) val wct = transactionCaptor.firstValue assertThat(wct.hierarchyOps).hasSize(1) val hierarchyOp = wct.hierarchyOps[0] assertThat(hierarchyOp.type).isEqualTo(HierarchyOp.HIERARCHY_OP_TYPE_REMOVE_TASK) assertThat(hierarchyOp.container).isEqualTo(decor.mTaskInfo.token.asBinder()) } @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS) fun testCloseButtonInFreeform_withStateChangeAnnouncementFlag_closeWindow() { val onClickListenerCaptor = argumentCaptor<View.OnClickListener>() val decor = createOpenTaskDecoration( windowingMode = WINDOWING_MODE_FREEFORM, onCaptionButtonClickListener = onClickListenerCaptor, ) val view = mock<View> { on { id } doReturn R.id.close_window } desktopModeWindowDecorViewModel .setFreeformTaskTransitionStarter(mockFreeformTaskTransitionStarter) onClickListenerCaptor.firstValue.onClick(view) verify(mockDesktopTasksController).getNextFocusedTask(decor.mTaskInfo) val transactionCaptor = argumentCaptor<WindowContainerTransaction>() Loading @@ -294,7 +325,34 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest @Test @EnableFlags(Flags.FLAG_ENABLE_MINIMIZE_BUTTON) fun testMinimizeButtonInFreefrom_minimizeWindow() { @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS) fun testMinimizeButtonInFreeform_minimizeWindow() { val onClickListenerCaptor = argumentCaptor<View.OnClickListener>() val decor = createOpenTaskDecoration( windowingMode = WINDOWING_MODE_FREEFORM, onCaptionButtonClickListener = onClickListenerCaptor, ) val view = mock<View> { on { id } doReturn R.id.minimize_window } desktopModeWindowDecorViewModel .setFreeformTaskTransitionStarter(mockFreeformTaskTransitionStarter) onClickListenerCaptor.firstValue.onClick(view) verify(mockDesktopTasksController, never()).getNextFocusedTask(decor.mTaskInfo) verify(mockDesktopTasksController) .minimizeTask(decor.mTaskInfo, MinimizeReason.MINIMIZE_BUTTON) } @Test @EnableFlags( Flags.FLAG_ENABLE_MINIMIZE_BUTTON, Flags.FLAG_ENABLE_DESKTOP_APP_HEADER_STATE_CHANGE_ANNOUNCEMENTS ) fun testMinimizeButtonInFreeform_withStateChangeAnnouncementFlag_minimizeWindow() { val onClickListenerCaptor = argumentCaptor<View.OnClickListener>() val decor = createOpenTaskDecoration( windowingMode = WINDOWING_MODE_FREEFORM, Loading