Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopDisplayModeController.kt +32 −10 Original line number Diff line number Diff line Loading @@ -114,21 +114,36 @@ class DesktopDisplayModeController( transitions.startTransition(TRANSIT_CHANGE, wct, /* handler= */ null) } @VisibleForTesting fun getTargetWindowingModeForDefaultDisplay(): Int { // Do not directly use this method to check the state of desktop-first mode. Check the display // windowing mode instead. private fun canDesktopFirstModeBeEnabledOnDefaultDisplay(): Boolean { if (isDefaultDisplayDesktopEligible()) { if (isExtendedDisplayEnabled() && hasExternalDisplay()) { return WINDOWING_MODE_FREEFORM return true } if (DesktopExperienceFlags.FORM_FACTOR_BASED_DESKTOP_FIRST_SWITCH.isTrue) { if (isInClamshellMode()) { return WINDOWING_MODE_FREEFORM return true } return WINDOWING_MODE_FULLSCREEN } } return false } // If form factor-based desktop first switch is disabled, use the default display windowing // mode here to keep the freeform mode for some form factors (e.g., FEATURE_PC). return windowManager.getWindowingMode(DEFAULT_DISPLAY) @VisibleForTesting fun getTargetWindowingModeForDefaultDisplay(): Int { if (canDesktopFirstModeBeEnabledOnDefaultDisplay()) { return WINDOWING_MODE_FREEFORM } return if (DesktopExperienceFlags.FORM_FACTOR_BASED_DESKTOP_FIRST_SWITCH.isTrue) { WINDOWING_MODE_FULLSCREEN } else { // If form factor-based desktop first switch is disabled, use the default display // windowing mode here to keep the freeform mode for some form factors (e.g., // FEATURE_PC). windowManager.getWindowingMode(DEFAULT_DISPLAY) } } private fun isExtendedDisplayEnabled(): Boolean { Loading Loading @@ -156,6 +171,13 @@ class DesktopDisplayModeController( private fun isInClamshellMode() = inputManager.isInTabletMode() == InputManager.SWITCH_STATE_OFF private fun isDefaultDisplayDesktopEligible(): Boolean { val display = requireNotNull(displayController.getDisplay(DEFAULT_DISPLAY)) { "Display object of DEFAULT_DISPLAY must be non-null." } return DesktopModeStatus.isDesktopModeSupportedOnDisplay(context, display) } private fun logV(msg: String, vararg arguments: Any?) { ProtoLog.v(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments) } Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopDisplayModeControllerTest.kt +209 −25 Original line number Diff line number Diff line Loading @@ -37,7 +37,6 @@ import android.view.WindowManager.TRANSIT_CHANGE import android.window.DisplayAreaInfo import android.window.WindowContainerTransaction import androidx.test.filters.SmallTest import com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession import com.android.dx.mockito.inline.extended.ExtendedMockito.never import com.android.dx.mockito.inline.extended.StaticMockitoSession Loading Loading @@ -102,6 +101,7 @@ class DesktopDisplayModeControllerTest( TestRunningTaskInfoBuilder().setWindowingMode(WINDOWING_MODE_FULLSCREEN).build() private val defaultTDA = DisplayAreaInfo(MockToken().token(), DEFAULT_DISPLAY, 0) private val wallpaperToken = MockToken().token() private val defaultDisplay = mock<Display>() private val externalDisplay = mock<Display>() private lateinit var extendedDisplaySettingsRestoreSession: Loading @@ -118,7 +118,7 @@ class DesktopDisplayModeControllerTest( mockitoSession = mockitoSession() .strictness(Strictness.LENIENT) .spyStatic(DesktopModeStatus::class.java) .mockStatic(DesktopModeStatus::class.java) .startMocking() extendedDisplaySettingsRestoreSession = ExtendedDisplaySettingsRestoreSession(context.contentResolver) Loading @@ -141,8 +141,15 @@ class DesktopDisplayModeControllerTest( runningTasks.add(fullscreenTask) whenever(shellTaskOrganizer.getRunningTasks(anyInt())).thenReturn(ArrayList(runningTasks)) whenever(desktopWallpaperActivityTokenProvider.getToken()).thenReturn(wallpaperToken) whenever(displayController.getDisplay(DEFAULT_DISPLAY)).thenReturn(defaultDisplay) whenever(displayController.getDisplay(EXTERNAL_DISPLAY_ID)).thenReturn(externalDisplay) setTabletModeStatus(SwitchState.UNKNOWN) whenever( DesktopModeStatus.isDesktopModeSupportedOnDisplay( context, defaultDisplay ) ).thenReturn(true) } @After Loading Loading @@ -210,6 +217,12 @@ class DesktopDisplayModeControllerTest( } setTabletModeStatus(tabletModeStatus) setExtendedMode(param.extendedDisplayEnabled) whenever( DesktopModeStatus.isDesktopModeSupportedOnDisplay( context, defaultDisplay ) ).thenReturn(param.isDefaultDisplayDesktopEligible) assertThat(controller.getTargetWindowingModeForDefaultDisplay()) .isEqualTo(param.expectedWindowingMode) Loading @@ -228,6 +241,12 @@ class DesktopDisplayModeControllerTest( } setTabletModeStatus(param.tabletModeStatus) setExtendedMode(param.extendedDisplayEnabled) whenever( DesktopModeStatus.isDesktopModeSupportedOnDisplay( context, defaultDisplay ) ).thenReturn(param.isDefaultDisplayDesktopEligible) assertThat(controller.getTargetWindowingModeForDefaultDisplay()) .isEqualTo(param.expectedWindowingMode) Loading Loading @@ -287,9 +306,12 @@ class DesktopDisplayModeControllerTest( private fun setExtendedMode(enabled: Boolean) { if (DisplayFlags.enableDisplayContentModeManagement()) { doReturn(enabled).`when` { DesktopModeStatus.isDesktopModeSupportedOnDisplay(context, externalDisplay) } whenever( DesktopModeStatus.isDesktopModeSupportedOnDisplay( context, externalDisplay ) ).thenReturn(enabled) } else { Settings.Global.putInt( context.contentResolver, Loading Loading @@ -334,54 +356,119 @@ class DesktopDisplayModeControllerTest( val defaultWindowingMode: Int, val hasExternalDisplay: Boolean, val extendedDisplayEnabled: Boolean, val isDefaultDisplayDesktopEligible: Boolean, val expectedWindowingMode: Int, ) { FREEFORM_EXTERNAL_EXTENDED( FREEFORM_EXTERNAL_EXTENDED_NO_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FREEFORM, hasExternalDisplay = true, extendedDisplayEnabled = true, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FULLSCREEN_EXTERNAL_EXTENDED( FULLSCREEN_EXTERNAL_EXTENDED_NO_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FULLSCREEN, hasExternalDisplay = true, extendedDisplayEnabled = true, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FREEFORM_NO_EXTERNAL_EXTENDED( FREEFORM_NO_EXTERNAL_EXTENDED_NO_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FREEFORM, hasExternalDisplay = false, extendedDisplayEnabled = true, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FULLSCREEN_NO_EXTERNAL_EXTENDED( FULLSCREEN_NO_EXTERNAL_EXTENDED_NO_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FULLSCREEN, hasExternalDisplay = false, extendedDisplayEnabled = true, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), FREEFORM_EXTERNAL_MIRROR( FREEFORM_EXTERNAL_MIRROR_NO_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FREEFORM, hasExternalDisplay = true, extendedDisplayEnabled = false, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FULLSCREEN_EXTERNAL_MIRROR( FULLSCREEN_EXTERNAL_MIRROR_NO_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FULLSCREEN, hasExternalDisplay = true, extendedDisplayEnabled = false, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), FREEFORM_NO_EXTERNAL_MIRROR( FREEFORM_NO_EXTERNAL_MIRROR_NO_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FREEFORM, hasExternalDisplay = false, extendedDisplayEnabled = false, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FULLSCREEN_NO_EXTERNAL_MIRROR( FULLSCREEN_NO_EXTERNAL_MIRROR_NO_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FULLSCREEN, hasExternalDisplay = false, extendedDisplayEnabled = false, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), FREEFORM_EXTERNAL_EXTENDED_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FREEFORM, hasExternalDisplay = true, extendedDisplayEnabled = true, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FULLSCREEN_EXTERNAL_EXTENDED_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FULLSCREEN, hasExternalDisplay = true, extendedDisplayEnabled = true, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), FREEFORM_NO_EXTERNAL_EXTENDED_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FREEFORM, hasExternalDisplay = false, extendedDisplayEnabled = true, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FULLSCREEN_NO_EXTERNAL_EXTENDED_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FULLSCREEN, hasExternalDisplay = false, extendedDisplayEnabled = true, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), FREEFORM_EXTERNAL_MIRROR_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FREEFORM, hasExternalDisplay = true, extendedDisplayEnabled = false, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FULLSCREEN_EXTERNAL_MIRROR_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FULLSCREEN, hasExternalDisplay = true, extendedDisplayEnabled = false, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), FREEFORM_NO_EXTERNAL_MIRROR_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FREEFORM, hasExternalDisplay = false, extendedDisplayEnabled = false, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FULLSCREEN_NO_EXTERNAL_MIRROR_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FULLSCREEN, hasExternalDisplay = false, extendedDisplayEnabled = false, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), } Loading @@ -390,78 +477,175 @@ class DesktopDisplayModeControllerTest( val hasExternalDisplay: Boolean, val extendedDisplayEnabled: Boolean, val tabletModeStatus: SwitchState, val isDefaultDisplayDesktopEligible: Boolean, val expectedWindowingMode: Int, ) { EXTERNAL_EXTENDED_TABLET( EXTERNAL_EXTENDED_TABLET_NO_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.ON, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), NO_EXTERNAL_EXTENDED_TABLET( NO_EXTERNAL_EXTENDED_TABLET_NO_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.ON, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_MIRROR_TABLET( EXTERNAL_MIRROR_TABLET_NO_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.ON, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), NO_EXTERNAL_MIRROR_TABLET( NO_EXTERNAL_MIRROR_TABLET_NO_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.ON, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_EXTENDED_CLAMSHELL( EXTERNAL_EXTENDED_CLAMSHELL_NO_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.OFF, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), NO_EXTERNAL_EXTENDED_CLAMSHELL( NO_EXTERNAL_EXTENDED_CLAMSHELL_NO_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.OFF, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), EXTERNAL_MIRROR_CLAMSHELL( EXTERNAL_MIRROR_CLAMSHELL_NO_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.OFF, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), NO_EXTERNAL_MIRROR_CLAMSHELL( NO_EXTERNAL_MIRROR_CLAMSHELL_NO_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.OFF, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), EXTERNAL_EXTENDED_UNKNOWN( EXTERNAL_EXTENDED_UNKNOWN_NO_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.UNKNOWN, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), NO_EXTERNAL_EXTENDED_UNKNOWN( NO_EXTERNAL_EXTENDED_UNKNOWN_NO_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.UNKNOWN, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_MIRROR_UNKNOWN_NO_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.UNKNOWN, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), NO_EXTERNAL_MIRROR_UNKNOWN_NO_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.UNKNOWN, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_EXTENDED_TABLET_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.ON, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), NO_EXTERNAL_EXTENDED_TABLET_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.ON, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_MIRROR_TABLET_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.ON, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), NO_EXTERNAL_MIRROR_TABLET_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.ON, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_EXTENDED_CLAMSHELL_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.OFF, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), NO_EXTERNAL_EXTENDED_CLAMSHELL_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.OFF, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_MIRROR_CLAMSHELL_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.OFF, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), NO_EXTERNAL_MIRROR_CLAMSHELL_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.OFF, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_EXTENDED_UNKNOWN_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.UNKNOWN, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), NO_EXTERNAL_EXTENDED_UNKNOWN_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.UNKNOWN, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_MIRROR_UNKNOWN( EXTERNAL_MIRROR_UNKNOWN_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.UNKNOWN, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), NO_EXTERNAL_MIRROR_UNKNOWN( NO_EXTERNAL_MIRROR_UNKNOWN_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.UNKNOWN, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), } Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopDisplayModeController.kt +32 −10 Original line number Diff line number Diff line Loading @@ -114,21 +114,36 @@ class DesktopDisplayModeController( transitions.startTransition(TRANSIT_CHANGE, wct, /* handler= */ null) } @VisibleForTesting fun getTargetWindowingModeForDefaultDisplay(): Int { // Do not directly use this method to check the state of desktop-first mode. Check the display // windowing mode instead. private fun canDesktopFirstModeBeEnabledOnDefaultDisplay(): Boolean { if (isDefaultDisplayDesktopEligible()) { if (isExtendedDisplayEnabled() && hasExternalDisplay()) { return WINDOWING_MODE_FREEFORM return true } if (DesktopExperienceFlags.FORM_FACTOR_BASED_DESKTOP_FIRST_SWITCH.isTrue) { if (isInClamshellMode()) { return WINDOWING_MODE_FREEFORM return true } return WINDOWING_MODE_FULLSCREEN } } return false } // If form factor-based desktop first switch is disabled, use the default display windowing // mode here to keep the freeform mode for some form factors (e.g., FEATURE_PC). return windowManager.getWindowingMode(DEFAULT_DISPLAY) @VisibleForTesting fun getTargetWindowingModeForDefaultDisplay(): Int { if (canDesktopFirstModeBeEnabledOnDefaultDisplay()) { return WINDOWING_MODE_FREEFORM } return if (DesktopExperienceFlags.FORM_FACTOR_BASED_DESKTOP_FIRST_SWITCH.isTrue) { WINDOWING_MODE_FULLSCREEN } else { // If form factor-based desktop first switch is disabled, use the default display // windowing mode here to keep the freeform mode for some form factors (e.g., // FEATURE_PC). windowManager.getWindowingMode(DEFAULT_DISPLAY) } } private fun isExtendedDisplayEnabled(): Boolean { Loading Loading @@ -156,6 +171,13 @@ class DesktopDisplayModeController( private fun isInClamshellMode() = inputManager.isInTabletMode() == InputManager.SWITCH_STATE_OFF private fun isDefaultDisplayDesktopEligible(): Boolean { val display = requireNotNull(displayController.getDisplay(DEFAULT_DISPLAY)) { "Display object of DEFAULT_DISPLAY must be non-null." } return DesktopModeStatus.isDesktopModeSupportedOnDisplay(context, display) } private fun logV(msg: String, vararg arguments: Any?) { ProtoLog.v(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments) } Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopDisplayModeControllerTest.kt +209 −25 Original line number Diff line number Diff line Loading @@ -37,7 +37,6 @@ import android.view.WindowManager.TRANSIT_CHANGE import android.window.DisplayAreaInfo import android.window.WindowContainerTransaction import androidx.test.filters.SmallTest import com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession import com.android.dx.mockito.inline.extended.ExtendedMockito.never import com.android.dx.mockito.inline.extended.StaticMockitoSession Loading Loading @@ -102,6 +101,7 @@ class DesktopDisplayModeControllerTest( TestRunningTaskInfoBuilder().setWindowingMode(WINDOWING_MODE_FULLSCREEN).build() private val defaultTDA = DisplayAreaInfo(MockToken().token(), DEFAULT_DISPLAY, 0) private val wallpaperToken = MockToken().token() private val defaultDisplay = mock<Display>() private val externalDisplay = mock<Display>() private lateinit var extendedDisplaySettingsRestoreSession: Loading @@ -118,7 +118,7 @@ class DesktopDisplayModeControllerTest( mockitoSession = mockitoSession() .strictness(Strictness.LENIENT) .spyStatic(DesktopModeStatus::class.java) .mockStatic(DesktopModeStatus::class.java) .startMocking() extendedDisplaySettingsRestoreSession = ExtendedDisplaySettingsRestoreSession(context.contentResolver) Loading @@ -141,8 +141,15 @@ class DesktopDisplayModeControllerTest( runningTasks.add(fullscreenTask) whenever(shellTaskOrganizer.getRunningTasks(anyInt())).thenReturn(ArrayList(runningTasks)) whenever(desktopWallpaperActivityTokenProvider.getToken()).thenReturn(wallpaperToken) whenever(displayController.getDisplay(DEFAULT_DISPLAY)).thenReturn(defaultDisplay) whenever(displayController.getDisplay(EXTERNAL_DISPLAY_ID)).thenReturn(externalDisplay) setTabletModeStatus(SwitchState.UNKNOWN) whenever( DesktopModeStatus.isDesktopModeSupportedOnDisplay( context, defaultDisplay ) ).thenReturn(true) } @After Loading Loading @@ -210,6 +217,12 @@ class DesktopDisplayModeControllerTest( } setTabletModeStatus(tabletModeStatus) setExtendedMode(param.extendedDisplayEnabled) whenever( DesktopModeStatus.isDesktopModeSupportedOnDisplay( context, defaultDisplay ) ).thenReturn(param.isDefaultDisplayDesktopEligible) assertThat(controller.getTargetWindowingModeForDefaultDisplay()) .isEqualTo(param.expectedWindowingMode) Loading @@ -228,6 +241,12 @@ class DesktopDisplayModeControllerTest( } setTabletModeStatus(param.tabletModeStatus) setExtendedMode(param.extendedDisplayEnabled) whenever( DesktopModeStatus.isDesktopModeSupportedOnDisplay( context, defaultDisplay ) ).thenReturn(param.isDefaultDisplayDesktopEligible) assertThat(controller.getTargetWindowingModeForDefaultDisplay()) .isEqualTo(param.expectedWindowingMode) Loading Loading @@ -287,9 +306,12 @@ class DesktopDisplayModeControllerTest( private fun setExtendedMode(enabled: Boolean) { if (DisplayFlags.enableDisplayContentModeManagement()) { doReturn(enabled).`when` { DesktopModeStatus.isDesktopModeSupportedOnDisplay(context, externalDisplay) } whenever( DesktopModeStatus.isDesktopModeSupportedOnDisplay( context, externalDisplay ) ).thenReturn(enabled) } else { Settings.Global.putInt( context.contentResolver, Loading Loading @@ -334,54 +356,119 @@ class DesktopDisplayModeControllerTest( val defaultWindowingMode: Int, val hasExternalDisplay: Boolean, val extendedDisplayEnabled: Boolean, val isDefaultDisplayDesktopEligible: Boolean, val expectedWindowingMode: Int, ) { FREEFORM_EXTERNAL_EXTENDED( FREEFORM_EXTERNAL_EXTENDED_NO_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FREEFORM, hasExternalDisplay = true, extendedDisplayEnabled = true, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FULLSCREEN_EXTERNAL_EXTENDED( FULLSCREEN_EXTERNAL_EXTENDED_NO_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FULLSCREEN, hasExternalDisplay = true, extendedDisplayEnabled = true, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FREEFORM_NO_EXTERNAL_EXTENDED( FREEFORM_NO_EXTERNAL_EXTENDED_NO_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FREEFORM, hasExternalDisplay = false, extendedDisplayEnabled = true, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FULLSCREEN_NO_EXTERNAL_EXTENDED( FULLSCREEN_NO_EXTERNAL_EXTENDED_NO_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FULLSCREEN, hasExternalDisplay = false, extendedDisplayEnabled = true, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), FREEFORM_EXTERNAL_MIRROR( FREEFORM_EXTERNAL_MIRROR_NO_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FREEFORM, hasExternalDisplay = true, extendedDisplayEnabled = false, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FULLSCREEN_EXTERNAL_MIRROR( FULLSCREEN_EXTERNAL_MIRROR_NO_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FULLSCREEN, hasExternalDisplay = true, extendedDisplayEnabled = false, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), FREEFORM_NO_EXTERNAL_MIRROR( FREEFORM_NO_EXTERNAL_MIRROR_NO_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FREEFORM, hasExternalDisplay = false, extendedDisplayEnabled = false, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FULLSCREEN_NO_EXTERNAL_MIRROR( FULLSCREEN_NO_EXTERNAL_MIRROR_NO_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FULLSCREEN, hasExternalDisplay = false, extendedDisplayEnabled = false, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), FREEFORM_EXTERNAL_EXTENDED_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FREEFORM, hasExternalDisplay = true, extendedDisplayEnabled = true, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FULLSCREEN_EXTERNAL_EXTENDED_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FULLSCREEN, hasExternalDisplay = true, extendedDisplayEnabled = true, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), FREEFORM_NO_EXTERNAL_EXTENDED_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FREEFORM, hasExternalDisplay = false, extendedDisplayEnabled = true, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FULLSCREEN_NO_EXTERNAL_EXTENDED_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FULLSCREEN, hasExternalDisplay = false, extendedDisplayEnabled = true, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), FREEFORM_EXTERNAL_MIRROR_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FREEFORM, hasExternalDisplay = true, extendedDisplayEnabled = false, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FULLSCREEN_EXTERNAL_MIRROR_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FULLSCREEN, hasExternalDisplay = true, extendedDisplayEnabled = false, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), FREEFORM_NO_EXTERNAL_MIRROR_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FREEFORM, hasExternalDisplay = false, extendedDisplayEnabled = false, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), FULLSCREEN_NO_EXTERNAL_MIRROR_PROJECTED( defaultWindowingMode = WINDOWING_MODE_FULLSCREEN, hasExternalDisplay = false, extendedDisplayEnabled = false, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), } Loading @@ -390,78 +477,175 @@ class DesktopDisplayModeControllerTest( val hasExternalDisplay: Boolean, val extendedDisplayEnabled: Boolean, val tabletModeStatus: SwitchState, val isDefaultDisplayDesktopEligible: Boolean, val expectedWindowingMode: Int, ) { EXTERNAL_EXTENDED_TABLET( EXTERNAL_EXTENDED_TABLET_NO_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.ON, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), NO_EXTERNAL_EXTENDED_TABLET( NO_EXTERNAL_EXTENDED_TABLET_NO_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.ON, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_MIRROR_TABLET( EXTERNAL_MIRROR_TABLET_NO_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.ON, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), NO_EXTERNAL_MIRROR_TABLET( NO_EXTERNAL_MIRROR_TABLET_NO_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.ON, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_EXTENDED_CLAMSHELL( EXTERNAL_EXTENDED_CLAMSHELL_NO_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.OFF, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), NO_EXTERNAL_EXTENDED_CLAMSHELL( NO_EXTERNAL_EXTENDED_CLAMSHELL_NO_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.OFF, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), EXTERNAL_MIRROR_CLAMSHELL( EXTERNAL_MIRROR_CLAMSHELL_NO_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.OFF, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), NO_EXTERNAL_MIRROR_CLAMSHELL( NO_EXTERNAL_MIRROR_CLAMSHELL_NO_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.OFF, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), EXTERNAL_EXTENDED_UNKNOWN( EXTERNAL_EXTENDED_UNKNOWN_NO_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.UNKNOWN, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FREEFORM, ), NO_EXTERNAL_EXTENDED_UNKNOWN( NO_EXTERNAL_EXTENDED_UNKNOWN_NO_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.UNKNOWN, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_MIRROR_UNKNOWN_NO_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.UNKNOWN, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), NO_EXTERNAL_MIRROR_UNKNOWN_NO_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.UNKNOWN, isDefaultDisplayDesktopEligible = true, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_EXTENDED_TABLET_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.ON, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), NO_EXTERNAL_EXTENDED_TABLET_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.ON, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_MIRROR_TABLET_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.ON, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), NO_EXTERNAL_MIRROR_TABLET_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.ON, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_EXTENDED_CLAMSHELL_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.OFF, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), NO_EXTERNAL_EXTENDED_CLAMSHELL_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.OFF, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_MIRROR_CLAMSHELL_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.OFF, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), NO_EXTERNAL_MIRROR_CLAMSHELL_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.OFF, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_EXTENDED_UNKNOWN_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.UNKNOWN, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), NO_EXTERNAL_EXTENDED_UNKNOWN_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = true, tabletModeStatus = SwitchState.UNKNOWN, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), EXTERNAL_MIRROR_UNKNOWN( EXTERNAL_MIRROR_UNKNOWN_PROJECTED( hasExternalDisplay = true, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.UNKNOWN, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), NO_EXTERNAL_MIRROR_UNKNOWN( NO_EXTERNAL_MIRROR_UNKNOWN_PROJECTED( hasExternalDisplay = false, extendedDisplayEnabled = false, tabletModeStatus = SwitchState.UNKNOWN, isDefaultDisplayDesktopEligible = false, expectedWindowingMode = WINDOWING_MODE_FULLSCREEN, ), } Loading