Loading libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopState.kt +7 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,13 @@ interface DesktopState { */ fun isDesktopModeSupportedOnDisplay(display: Display): Boolean /** * Check if the current device is in projected display mode. * * Note, if the device is not connected to any display, this will return false. */ fun isProjectedMode(): Boolean /** * Whether the app handle should be shown on this device. */ Loading libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopStateImpl.kt +14 −0 Original line number Diff line number Diff line Loading @@ -123,6 +123,20 @@ class DesktopStateImpl(context: Context) : DesktopState { return false } override fun isProjectedMode(): Boolean { if (!DesktopExperienceFlags.ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE.isTrue) { return false } if (isDesktopModeSupportedOnDisplay(Display.DEFAULT_DISPLAY)) { return false } return displayManager.displays ?.any { display -> isDesktopModeSupportedOnDisplay(display) } ?: false } private val deviceHasLargeScreen = displayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED) ?.filter { display -> display.type == Display.TYPE_INTERNAL } Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopStateImplTest.kt +75 −0 Original line number Diff line number Diff line Loading @@ -16,10 +16,13 @@ package com.android.wm.shell.shared.desktopmode import android.hardware.display.DisplayManager import android.os.SystemProperties import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.platform.test.annotations.Presubmit import android.view.Display import android.view.WindowManager import android.window.DesktopModeFlags import androidx.test.filters.SmallTest import com.android.dx.mockito.inline.extended.ExtendedMockito Loading @@ -32,8 +35,11 @@ import com.google.common.truth.Truth.assertThat import org.junit.After import org.junit.Before import org.junit.Test import org.mockito.ArgumentMatchers.anyInt import org.mockito.Mock import org.mockito.kotlin.any import org.mockito.kotlin.eq import org.mockito.kotlin.whenever import org.mockito.quality.Strictness /** Loading @@ -44,6 +50,10 @@ import org.mockito.quality.Strictness class DesktopStateImplTest : ShellTestCase() { private lateinit var mockitoSession: StaticMockitoSession @Mock private lateinit var displayManager: DisplayManager @Mock private lateinit var windowManager: WindowManager @Mock private lateinit var defaultDisplay: Display @Mock private lateinit var extendedDisplay: Display @Before fun setUp() { Loading @@ -54,11 +64,20 @@ class DesktopStateImplTest : ShellTestCase() { .startMocking() val resources = mContext.getOrCreateTestableResources() mContext.addMockSystemService(DisplayManager::class.java, displayManager) mContext.addMockSystemService(WindowManager::class.java, windowManager) resources.apply { addOverride(R.bool.config_isDesktopModeSupported, false) addOverride(R.bool.config_isDesktopModeDevOptionSupported, false) addOverride(R.bool.config_canInternalDisplayHostDesktops, false) } whenever(defaultDisplay.type).thenReturn(Display.TYPE_INTERNAL) whenever(defaultDisplay.displayId).thenReturn(Display.DEFAULT_DISPLAY) whenever(extendedDisplay.type).thenReturn(Display.TYPE_EXTERNAL) whenever(extendedDisplay.displayId).thenReturn(Display.DEFAULT_DISPLAY + 1) whenever(displayManager.displays).thenReturn(arrayOf(defaultDisplay, extendedDisplay)) whenever(displayManager.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(defaultDisplay) setEnforceDeviceRestriction(true) setEnterDesktopByDefaultOnFreeformDisplay(false) Loading Loading @@ -265,6 +284,62 @@ class DesktopStateImplTest : ShellTestCase() { assertThat(desktopState.isDeviceEligibleForDesktopMode).isTrue() } @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION, Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE) @Test fun isProjectedMode_oneDisplay_returnsFalse() { val resources = mContext.getOrCreateTestableResources() resources.addOverride(R.bool.config_isDesktopModeSupported, true) whenever(displayManager.displays).thenReturn(arrayOf(defaultDisplay)) val desktopState = DesktopStateImpl(context) assertThat(desktopState.isProjectedMode()).isFalse() } @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION, Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE) @Test fun isProjectedMode_twoDisplay_bothSupportDesktopMode_returnsFalse() { whenever(displayManager .getDisplays(DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED)) .thenReturn(arrayOf(defaultDisplay, extendedDisplay)) val resources = mContext.getOrCreateTestableResources() resources.addOverride(R.bool.config_isDesktopModeSupported, true) resources.addOverride(R.bool.config_canInternalDisplayHostDesktops, true) whenever(windowManager.isEligibleForDesktopMode(anyInt())).thenReturn(true) val desktopState = DesktopStateImpl(context) assertThat(desktopState.isProjectedMode()).isFalse() } @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION, Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE) @Test fun isProjectedMode_twoDisplay_onlyExternalSupportDesktopMode_returnsTrue() { whenever(displayManager .getDisplays(DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED)) .thenReturn(arrayOf(defaultDisplay, extendedDisplay)) val resources = mContext.getOrCreateTestableResources() resources.addOverride(R.bool.config_isDesktopModeSupported, true) resources.addOverride(R.bool.config_canInternalDisplayHostDesktops, false) whenever(windowManager.isEligibleForDesktopMode(anyInt())).thenReturn(true) val desktopState = DesktopStateImpl(context) assertThat(desktopState.isProjectedMode()).isTrue() } @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION, Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE) @Test fun isProjectedMode_twoDisplay_neitherSupportDesktopMode_returnsFalse() { whenever(displayManager .getDisplays(DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED)) .thenReturn(arrayOf(defaultDisplay, extendedDisplay)) val resources = mContext.getOrCreateTestableResources() resources.addOverride(R.bool.config_isDesktopModeSupported, true) resources.addOverride(R.bool.config_canInternalDisplayHostDesktops, false) whenever(windowManager.isEligibleForDesktopMode(anyInt())).thenReturn(false) val desktopState = DesktopStateImpl(context) assertThat(desktopState.isProjectedMode()).isFalse() } @DisableFlags(Flags.FLAG_SHOW_DESKTOP_EXPERIENCE_DEV_OPTION) @Test fun canShowDesktopExperienceDevOption_flagDisabled_returnsFalse() { Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/FakeDesktopState.kt +4 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,10 @@ class FakeDesktopState : DesktopState { return isDesktopModeSupportedOnDisplay(display.displayId) } override fun isProjectedMode(): Boolean { return false } override var overridesShowAppHandle: Boolean = false override var isFreeformEnabled: Boolean = false Loading Loading
libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopState.kt +7 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,13 @@ interface DesktopState { */ fun isDesktopModeSupportedOnDisplay(display: Display): Boolean /** * Check if the current device is in projected display mode. * * Note, if the device is not connected to any display, this will return false. */ fun isProjectedMode(): Boolean /** * Whether the app handle should be shown on this device. */ Loading
libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopStateImpl.kt +14 −0 Original line number Diff line number Diff line Loading @@ -123,6 +123,20 @@ class DesktopStateImpl(context: Context) : DesktopState { return false } override fun isProjectedMode(): Boolean { if (!DesktopExperienceFlags.ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE.isTrue) { return false } if (isDesktopModeSupportedOnDisplay(Display.DEFAULT_DISPLAY)) { return false } return displayManager.displays ?.any { display -> isDesktopModeSupportedOnDisplay(display) } ?: false } private val deviceHasLargeScreen = displayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED) ?.filter { display -> display.type == Display.TYPE_INTERNAL } Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopStateImplTest.kt +75 −0 Original line number Diff line number Diff line Loading @@ -16,10 +16,13 @@ package com.android.wm.shell.shared.desktopmode import android.hardware.display.DisplayManager import android.os.SystemProperties import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.platform.test.annotations.Presubmit import android.view.Display import android.view.WindowManager import android.window.DesktopModeFlags import androidx.test.filters.SmallTest import com.android.dx.mockito.inline.extended.ExtendedMockito Loading @@ -32,8 +35,11 @@ import com.google.common.truth.Truth.assertThat import org.junit.After import org.junit.Before import org.junit.Test import org.mockito.ArgumentMatchers.anyInt import org.mockito.Mock import org.mockito.kotlin.any import org.mockito.kotlin.eq import org.mockito.kotlin.whenever import org.mockito.quality.Strictness /** Loading @@ -44,6 +50,10 @@ import org.mockito.quality.Strictness class DesktopStateImplTest : ShellTestCase() { private lateinit var mockitoSession: StaticMockitoSession @Mock private lateinit var displayManager: DisplayManager @Mock private lateinit var windowManager: WindowManager @Mock private lateinit var defaultDisplay: Display @Mock private lateinit var extendedDisplay: Display @Before fun setUp() { Loading @@ -54,11 +64,20 @@ class DesktopStateImplTest : ShellTestCase() { .startMocking() val resources = mContext.getOrCreateTestableResources() mContext.addMockSystemService(DisplayManager::class.java, displayManager) mContext.addMockSystemService(WindowManager::class.java, windowManager) resources.apply { addOverride(R.bool.config_isDesktopModeSupported, false) addOverride(R.bool.config_isDesktopModeDevOptionSupported, false) addOverride(R.bool.config_canInternalDisplayHostDesktops, false) } whenever(defaultDisplay.type).thenReturn(Display.TYPE_INTERNAL) whenever(defaultDisplay.displayId).thenReturn(Display.DEFAULT_DISPLAY) whenever(extendedDisplay.type).thenReturn(Display.TYPE_EXTERNAL) whenever(extendedDisplay.displayId).thenReturn(Display.DEFAULT_DISPLAY + 1) whenever(displayManager.displays).thenReturn(arrayOf(defaultDisplay, extendedDisplay)) whenever(displayManager.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(defaultDisplay) setEnforceDeviceRestriction(true) setEnterDesktopByDefaultOnFreeformDisplay(false) Loading Loading @@ -265,6 +284,62 @@ class DesktopStateImplTest : ShellTestCase() { assertThat(desktopState.isDeviceEligibleForDesktopMode).isTrue() } @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION, Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE) @Test fun isProjectedMode_oneDisplay_returnsFalse() { val resources = mContext.getOrCreateTestableResources() resources.addOverride(R.bool.config_isDesktopModeSupported, true) whenever(displayManager.displays).thenReturn(arrayOf(defaultDisplay)) val desktopState = DesktopStateImpl(context) assertThat(desktopState.isProjectedMode()).isFalse() } @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION, Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE) @Test fun isProjectedMode_twoDisplay_bothSupportDesktopMode_returnsFalse() { whenever(displayManager .getDisplays(DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED)) .thenReturn(arrayOf(defaultDisplay, extendedDisplay)) val resources = mContext.getOrCreateTestableResources() resources.addOverride(R.bool.config_isDesktopModeSupported, true) resources.addOverride(R.bool.config_canInternalDisplayHostDesktops, true) whenever(windowManager.isEligibleForDesktopMode(anyInt())).thenReturn(true) val desktopState = DesktopStateImpl(context) assertThat(desktopState.isProjectedMode()).isFalse() } @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION, Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE) @Test fun isProjectedMode_twoDisplay_onlyExternalSupportDesktopMode_returnsTrue() { whenever(displayManager .getDisplays(DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED)) .thenReturn(arrayOf(defaultDisplay, extendedDisplay)) val resources = mContext.getOrCreateTestableResources() resources.addOverride(R.bool.config_isDesktopModeSupported, true) resources.addOverride(R.bool.config_canInternalDisplayHostDesktops, false) whenever(windowManager.isEligibleForDesktopMode(anyInt())).thenReturn(true) val desktopState = DesktopStateImpl(context) assertThat(desktopState.isProjectedMode()).isTrue() } @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION, Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE) @Test fun isProjectedMode_twoDisplay_neitherSupportDesktopMode_returnsFalse() { whenever(displayManager .getDisplays(DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED)) .thenReturn(arrayOf(defaultDisplay, extendedDisplay)) val resources = mContext.getOrCreateTestableResources() resources.addOverride(R.bool.config_isDesktopModeSupported, true) resources.addOverride(R.bool.config_canInternalDisplayHostDesktops, false) whenever(windowManager.isEligibleForDesktopMode(anyInt())).thenReturn(false) val desktopState = DesktopStateImpl(context) assertThat(desktopState.isProjectedMode()).isFalse() } @DisableFlags(Flags.FLAG_SHOW_DESKTOP_EXPERIENCE_DEV_OPTION) @Test fun canShowDesktopExperienceDevOption_flagDisabled_returnsFalse() { Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/FakeDesktopState.kt +4 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,10 @@ class FakeDesktopState : DesktopState { return isDesktopModeSupportedOnDisplay(display.displayId) } override fun isProjectedMode(): Boolean { return false } override var overridesShowAppHandle: Boolean = false override var isFreeformEnabled: Boolean = false Loading