Loading core/java/android/window/DesktopModeFlags.java +6 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package android.window; import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; import android.annotation.Nullable; import android.app.ActivityThread; import android.app.Application; Loading Loading @@ -214,6 +216,10 @@ public enum DesktopModeFlags { boolean shouldOverrideByDevOption) { if (!shouldOverrideByDevOption) return flagFunction.getAsBoolean(); if (Flags.showDesktopExperienceDevOption()) { // If the feature is enabled, just return the flag's value. if (enableDisplayContentModeManagement()) { return flagFunction.getAsBoolean(); } return switch (getToggleOverride()) { case OVERRIDE_UNSET, OVERRIDE_OFF -> flagFunction.getAsBoolean(); case OVERRIDE_ON -> true; Loading core/tests/coretests/src/android/window/DesktopModeFlagsTest.java +2 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static android.window.DesktopModeFlags.ToggleOverride.OVERRIDE_ON; import static android.window.DesktopModeFlags.ToggleOverride.OVERRIDE_UNSET; import static android.window.DesktopModeFlags.ToggleOverride.fromSetting; import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT; import static com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE; import static com.android.window.flags.Flags.FLAG_SHOW_DESKTOP_EXPERIENCE_DEV_OPTION; import static com.android.window.flags.Flags.FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPTION; Loading Loading @@ -67,6 +68,7 @@ import java.util.List; @SmallTest @Presubmit @RunWith(ParameterizedAndroidJunit4.class) @DisableFlags(FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT) public class DesktopModeFlagsTest { @Parameters(name = "{0}") Loading libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java +2 −8 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.wm.shell.shared.desktopmode; import static android.hardware.display.DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED; import static android.window.DesktopExperienceFlags.ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE; import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; import static com.android.wm.shell.shared.bubbles.BubbleAnythingFlagHelper.enableBubbleToFullscreen; Loading Loading @@ -207,15 +206,10 @@ public class DesktopModeStatus { if (!enforceDeviceRestrictions()) { return true; } // If projected display is enabled, #canInternalDisplayHostDesktops is no longer a // requirement. final boolean desktopModeSupported = ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE.isTrue() ? isDesktopModeSupported(context) : (isDesktopModeSupported(context) && canInternalDisplayHostDesktops(context)); final boolean desktopModeSupportedByDevOptions = Flags.enableDesktopModeThroughDevOption() && isDesktopModeDevOptionSupported(context); return desktopModeSupported || desktopModeSupportedByDevOptions; return isDesktopModeSupported(context) || desktopModeSupportedByDevOptions; } /** Loading libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopStateImpl.kt +2 −21 Original line number Diff line number Diff line Loading @@ -27,7 +27,6 @@ import android.window.DesktopExperienceFlags import android.window.DesktopModeFlags import com.android.internal.R import com.android.internal.annotations.VisibleForTesting import com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement import com.android.window.flags.Flags import com.android.wm.shell.shared.bubbles.BubbleAnythingFlagHelper Loading Loading @@ -85,18 +84,9 @@ class DesktopStateImpl(context: Context) : DesktopState { override val isDeviceEligibleForDesktopMode: Boolean get() { if (!enforceDeviceRestrictions) return true // If projected display is enabled, [canInternalDisplayHostDesktops] is no longer a // requirement. val desktopModeSupported = if (DesktopExperienceFlags.ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE.isTrue) { isDesktopModeSupported } else { isDesktopModeSupported && canInternalDisplayHostDesktops } val desktopModeSupportedByDevOptions = Flags.enableDesktopModeThroughDevOption() && isDesktopModeDevOptionSupported return desktopModeSupported || desktopModeSupportedByDevOptions return isDesktopModeSupported || desktopModeSupportedByDevOptions } override val enableMultipleDesktops: Boolean = Loading @@ -111,18 +101,9 @@ class DesktopStateImpl(context: Context) : DesktopState { if (!canEnterDesktopMode) return false if (!enforceDeviceRestrictions) return true if (display.type == Display.TYPE_INTERNAL) return canInternalDisplayHostDesktops // TODO (b/395014779): Change this to use WM API if ( (display.type == Display.TYPE_EXTERNAL || display.type == Display.TYPE_OVERLAY) && enableDisplayContentModeManagement() ) { return windowManager?.isEligibleForDesktopMode(display.displayId) ?: false } return false } override fun isProjectedMode(): Boolean { if (!DesktopExperienceFlags.ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE.isTrue) { return false Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatusTest.kt +29 −14 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.platform.test.annotations.Presubmit import android.platform.test.flag.junit.SetFlagsRule import android.window.DesktopExperienceFlags import android.window.DesktopModeFlags import androidx.test.filters.SmallTest import com.android.internal.R Loading Loading @@ -57,7 +58,6 @@ class DesktopModeStatusTest : ShellTestCase() { doReturn(false).whenever(mockResources).getBoolean( eq(R.bool.config_isDesktopModeDevOptionSupported) ) setDeviceEligibleForDesktopMode(false) doReturn(context.contentResolver).whenever(mockContext).contentResolver resetDesktopModeFlagsCache() resetEnforceDeviceRestriction() Loading Loading @@ -140,8 +140,10 @@ class DesktopModeStatusTest : ShellTestCase() { assertThat(DesktopModeStatus.canEnterDesktopMode(mockContext)).isTrue() } @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION) @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE) @EnableFlags( Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE, Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION ) @Test fun canEnterDesktopMode_DWFlagEnabled_deviceNotEligible_forceUsingDevOption_returnsTrue() { doReturn(true).whenever(mockResources).getBoolean( Loading Loading @@ -170,12 +172,12 @@ class DesktopModeStatusTest : ShellTestCase() { @DisableFlags(Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE) @Test fun isDeviceEligibleForDesktopMode_configDEModeOnAndIntDispHostsDesktopOff_returnsFalse() { fun isDeviceEligibleForDesktopMode_configDEModeOnAndIntDispHostsDesktopOff_returnsTrue() { doReturn(true).whenever(mockResources).getBoolean(eq(R.bool.config_isDesktopModeSupported)) doReturn(false).whenever(mockResources) .getBoolean(eq(R.bool.config_canInternalDisplayHostDesktops)) assertThat(DesktopModeStatus.isDeviceEligibleForDesktopMode(mockContext)).isFalse() assertThat(DesktopModeStatus.isDeviceEligibleForDesktopMode(mockContext)).isTrue() } @EnableFlags(Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE) Loading Loading @@ -247,23 +249,36 @@ class DesktopModeStatusTest : ShellTestCase() { } private fun resetDesktopModeFlagsCache() { val cachedToggleOverride = // Toggle override cache for DesktopModeFlags val cachedToggleOverride1 = DesktopModeFlags::class.java.getDeclaredField("sCachedToggleOverride") cachedToggleOverride.isAccessible = true cachedToggleOverride.set(null, null) cachedToggleOverride1.isAccessible = true cachedToggleOverride1.set(null, DesktopModeFlags.ToggleOverride.OVERRIDE_OFF) // Toggle override cache for DesktopExperienceFlags val cachedToggleOverride2 = DesktopExperienceFlags::class.java.getDeclaredField("sCachedToggleOverride") cachedToggleOverride2.isAccessible = true cachedToggleOverride2.set(null, false) } private fun setFlagOverride(override: DesktopModeFlags.ToggleOverride) { val cachedToggleOverride = // Toggle override cache for DesktopModeFlags can be on/off/unset val cachedToggleOverride1 = DesktopModeFlags::class.java.getDeclaredField("sCachedToggleOverride") cachedToggleOverride.isAccessible = true cachedToggleOverride.set(null, override) cachedToggleOverride1.isAccessible = true cachedToggleOverride1.set(null, override) // Toggle override cache for DesktopExperienceFlags can be true or false val cachedToggleOverride2 = DesktopExperienceFlags::class.java.getDeclaredField("sCachedToggleOverride") cachedToggleOverride2.isAccessible = true cachedToggleOverride2.set(null, override == DesktopModeFlags.ToggleOverride.OVERRIDE_ON) } private fun setDeviceEligibleForDesktopMode(eligible: Boolean) { val deviceRestrictions = DesktopModeStatus::class.java.getDeclaredField("ENFORCE_DEVICE_RESTRICTIONS") deviceRestrictions.isAccessible = true deviceRestrictions.setBoolean(/* obj= */ null, /* z= */ !eligible) doReturn(eligible).whenever(mockResources) .getBoolean(eq(R.bool.config_isDesktopModeSupported)) } private fun setIsVeiledResizeEnabled(enabled: Boolean) { Loading Loading
core/java/android/window/DesktopModeFlags.java +6 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package android.window; import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; import android.annotation.Nullable; import android.app.ActivityThread; import android.app.Application; Loading Loading @@ -214,6 +216,10 @@ public enum DesktopModeFlags { boolean shouldOverrideByDevOption) { if (!shouldOverrideByDevOption) return flagFunction.getAsBoolean(); if (Flags.showDesktopExperienceDevOption()) { // If the feature is enabled, just return the flag's value. if (enableDisplayContentModeManagement()) { return flagFunction.getAsBoolean(); } return switch (getToggleOverride()) { case OVERRIDE_UNSET, OVERRIDE_OFF -> flagFunction.getAsBoolean(); case OVERRIDE_ON -> true; Loading
core/tests/coretests/src/android/window/DesktopModeFlagsTest.java +2 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static android.window.DesktopModeFlags.ToggleOverride.OVERRIDE_ON; import static android.window.DesktopModeFlags.ToggleOverride.OVERRIDE_UNSET; import static android.window.DesktopModeFlags.ToggleOverride.fromSetting; import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT; import static com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE; import static com.android.window.flags.Flags.FLAG_SHOW_DESKTOP_EXPERIENCE_DEV_OPTION; import static com.android.window.flags.Flags.FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPTION; Loading Loading @@ -67,6 +68,7 @@ import java.util.List; @SmallTest @Presubmit @RunWith(ParameterizedAndroidJunit4.class) @DisableFlags(FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT) public class DesktopModeFlagsTest { @Parameters(name = "{0}") Loading
libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java +2 −8 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.wm.shell.shared.desktopmode; import static android.hardware.display.DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED; import static android.window.DesktopExperienceFlags.ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE; import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement; import static com.android.wm.shell.shared.bubbles.BubbleAnythingFlagHelper.enableBubbleToFullscreen; Loading Loading @@ -207,15 +206,10 @@ public class DesktopModeStatus { if (!enforceDeviceRestrictions()) { return true; } // If projected display is enabled, #canInternalDisplayHostDesktops is no longer a // requirement. final boolean desktopModeSupported = ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE.isTrue() ? isDesktopModeSupported(context) : (isDesktopModeSupported(context) && canInternalDisplayHostDesktops(context)); final boolean desktopModeSupportedByDevOptions = Flags.enableDesktopModeThroughDevOption() && isDesktopModeDevOptionSupported(context); return desktopModeSupported || desktopModeSupportedByDevOptions; return isDesktopModeSupported(context) || desktopModeSupportedByDevOptions; } /** Loading
libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopStateImpl.kt +2 −21 Original line number Diff line number Diff line Loading @@ -27,7 +27,6 @@ import android.window.DesktopExperienceFlags import android.window.DesktopModeFlags import com.android.internal.R import com.android.internal.annotations.VisibleForTesting import com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement import com.android.window.flags.Flags import com.android.wm.shell.shared.bubbles.BubbleAnythingFlagHelper Loading Loading @@ -85,18 +84,9 @@ class DesktopStateImpl(context: Context) : DesktopState { override val isDeviceEligibleForDesktopMode: Boolean get() { if (!enforceDeviceRestrictions) return true // If projected display is enabled, [canInternalDisplayHostDesktops] is no longer a // requirement. val desktopModeSupported = if (DesktopExperienceFlags.ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE.isTrue) { isDesktopModeSupported } else { isDesktopModeSupported && canInternalDisplayHostDesktops } val desktopModeSupportedByDevOptions = Flags.enableDesktopModeThroughDevOption() && isDesktopModeDevOptionSupported return desktopModeSupported || desktopModeSupportedByDevOptions return isDesktopModeSupported || desktopModeSupportedByDevOptions } override val enableMultipleDesktops: Boolean = Loading @@ -111,18 +101,9 @@ class DesktopStateImpl(context: Context) : DesktopState { if (!canEnterDesktopMode) return false if (!enforceDeviceRestrictions) return true if (display.type == Display.TYPE_INTERNAL) return canInternalDisplayHostDesktops // TODO (b/395014779): Change this to use WM API if ( (display.type == Display.TYPE_EXTERNAL || display.type == Display.TYPE_OVERLAY) && enableDisplayContentModeManagement() ) { return windowManager?.isEligibleForDesktopMode(display.displayId) ?: false } return false } override fun isProjectedMode(): Boolean { if (!DesktopExperienceFlags.ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE.isTrue) { return false Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatusTest.kt +29 −14 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.platform.test.annotations.Presubmit import android.platform.test.flag.junit.SetFlagsRule import android.window.DesktopExperienceFlags import android.window.DesktopModeFlags import androidx.test.filters.SmallTest import com.android.internal.R Loading Loading @@ -57,7 +58,6 @@ class DesktopModeStatusTest : ShellTestCase() { doReturn(false).whenever(mockResources).getBoolean( eq(R.bool.config_isDesktopModeDevOptionSupported) ) setDeviceEligibleForDesktopMode(false) doReturn(context.contentResolver).whenever(mockContext).contentResolver resetDesktopModeFlagsCache() resetEnforceDeviceRestriction() Loading Loading @@ -140,8 +140,10 @@ class DesktopModeStatusTest : ShellTestCase() { assertThat(DesktopModeStatus.canEnterDesktopMode(mockContext)).isTrue() } @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION) @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE) @EnableFlags( Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE, Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION ) @Test fun canEnterDesktopMode_DWFlagEnabled_deviceNotEligible_forceUsingDevOption_returnsTrue() { doReturn(true).whenever(mockResources).getBoolean( Loading Loading @@ -170,12 +172,12 @@ class DesktopModeStatusTest : ShellTestCase() { @DisableFlags(Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE) @Test fun isDeviceEligibleForDesktopMode_configDEModeOnAndIntDispHostsDesktopOff_returnsFalse() { fun isDeviceEligibleForDesktopMode_configDEModeOnAndIntDispHostsDesktopOff_returnsTrue() { doReturn(true).whenever(mockResources).getBoolean(eq(R.bool.config_isDesktopModeSupported)) doReturn(false).whenever(mockResources) .getBoolean(eq(R.bool.config_canInternalDisplayHostDesktops)) assertThat(DesktopModeStatus.isDeviceEligibleForDesktopMode(mockContext)).isFalse() assertThat(DesktopModeStatus.isDeviceEligibleForDesktopMode(mockContext)).isTrue() } @EnableFlags(Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE) Loading Loading @@ -247,23 +249,36 @@ class DesktopModeStatusTest : ShellTestCase() { } private fun resetDesktopModeFlagsCache() { val cachedToggleOverride = // Toggle override cache for DesktopModeFlags val cachedToggleOverride1 = DesktopModeFlags::class.java.getDeclaredField("sCachedToggleOverride") cachedToggleOverride.isAccessible = true cachedToggleOverride.set(null, null) cachedToggleOverride1.isAccessible = true cachedToggleOverride1.set(null, DesktopModeFlags.ToggleOverride.OVERRIDE_OFF) // Toggle override cache for DesktopExperienceFlags val cachedToggleOverride2 = DesktopExperienceFlags::class.java.getDeclaredField("sCachedToggleOverride") cachedToggleOverride2.isAccessible = true cachedToggleOverride2.set(null, false) } private fun setFlagOverride(override: DesktopModeFlags.ToggleOverride) { val cachedToggleOverride = // Toggle override cache for DesktopModeFlags can be on/off/unset val cachedToggleOverride1 = DesktopModeFlags::class.java.getDeclaredField("sCachedToggleOverride") cachedToggleOverride.isAccessible = true cachedToggleOverride.set(null, override) cachedToggleOverride1.isAccessible = true cachedToggleOverride1.set(null, override) // Toggle override cache for DesktopExperienceFlags can be true or false val cachedToggleOverride2 = DesktopExperienceFlags::class.java.getDeclaredField("sCachedToggleOverride") cachedToggleOverride2.isAccessible = true cachedToggleOverride2.set(null, override == DesktopModeFlags.ToggleOverride.OVERRIDE_ON) } private fun setDeviceEligibleForDesktopMode(eligible: Boolean) { val deviceRestrictions = DesktopModeStatus::class.java.getDeclaredField("ENFORCE_DEVICE_RESTRICTIONS") deviceRestrictions.isAccessible = true deviceRestrictions.setBoolean(/* obj= */ null, /* z= */ !eligible) doReturn(eligible).whenever(mockResources) .getBoolean(eq(R.bool.config_isDesktopModeSupported)) } private fun setIsVeiledResizeEnabled(enabled: Boolean) { Loading