Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f235025a authored by Pierre Barbier de Reuille's avatar Pierre Barbier de Reuille
Browse files

canEnterDesktopMode is only true if desktop mode can be started.

ag/33290267 corrected isDeviceEligibleForDesktopMode to allow the
developer option to be enabled. But doing so, it enabled desktop mode
on all devices that support projected mode, while it's not launched yet.

Fix: 415214580
Bug: 389092752
Flag: com.android.window.flags.enable_projected_display_desktop_mode
Test: Manual
Test: atest DesktopModeStatusTest DesktopStateImplTest
Change-Id: Ib799ee486b8f52108cd753cc3c6ca0eb354383d5
parent d0876bb1
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -133,9 +133,12 @@ public class DesktopModeStatus {
     * Return {@code true} if desktop mode is enabled and can be entered on the current device.
     */
    public static boolean canEnterDesktopMode(@NonNull Context context) {
        return (isDeviceEligibleForDesktopMode(context)
                && DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODE.isTrue())
                || isDesktopModeEnabledByDevOption(context);
        boolean isEligibleForDesktopMode = isDeviceEligibleForDesktopMode(context) && (
                DesktopExperienceFlags.ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE.isTrue()
                        || canInternalDisplayHostDesktops(context));
        boolean desktopModeEnabled =
                isEligibleForDesktopMode && DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODE.isTrue();
        return desktopModeEnabled || isDesktopModeEnabledByDevOption(context);
    }

    /**
+5 −1
Original line number Diff line number Diff line
@@ -64,8 +64,12 @@ class DesktopStateImpl(context: Context) : DesktopState {
        DesktopModeFlags.isDesktopModeForcedEnabled() && canShowDesktopModeDevOption

    override val canEnterDesktopMode: Boolean = run {
        val isEligibleForDesktopMode =
            isDeviceEligibleForDesktopMode &&
                    (DesktopExperienceFlags.ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE.isTrue ||
                            canInternalDisplayHostDesktops)
        val desktopModeEnabled =
            isDeviceEligibleForDesktopMode && DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODE.isTrue
            isEligibleForDesktopMode && DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_MODE.isTrue
        desktopModeEnabled || isDesktopModeEnabledByDevOption
    }

+42 −2
Original line number Diff line number Diff line
@@ -54,10 +54,11 @@ class DesktopModeStatusTest : ShellTestCase() {
    @Before
    fun setUp() {
        doReturn(mockResources).whenever(mockContext).getResources()
        doReturn(false).whenever(mockResources).getBoolean(eq(R.bool.config_isDesktopModeSupported))
        setDeviceEligibleForDesktopMode(false)
        doReturn(false).whenever(mockResources).getBoolean(
            eq(R.bool.config_isDesktopModeDevOptionSupported)
        )
        setCanInternalDisplayHostDesktops(false)
        doReturn(context.contentResolver).whenever(mockContext).contentResolver
        resetDesktopModeFlagsCache()
        resetEnforceDeviceRestriction()
@@ -85,6 +86,7 @@ class DesktopModeStatusTest : ShellTestCase() {
    @Test
    fun canEnterDesktopMode_DWFlagDisabled_deviceEligible_configDevOptionOn_returnsFalse() {
        setDeviceEligibleForDesktopMode(true)
        setCanInternalDisplayHostDesktops(true)
        doReturn(true).whenever(mockResources).getBoolean(
            eq(R.bool.config_isDesktopModeDevOptionSupported)
        )
@@ -131,15 +133,48 @@ class DesktopModeStatusTest : ShellTestCase() {
        assertThat(DesktopModeStatus.canEnterDesktopMode(mockContext)).isFalse()
    }

    @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION)
    @DisableFlags(
        Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION,
        Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE,
    )
    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
    @Test
    fun canEnterDesktopMode_DWFlagEnabled_deviceEligible_returnsTrue() {
        setDeviceEligibleForDesktopMode(true)
        setCanInternalDisplayHostDesktops(true)

        assertThat(DesktopModeStatus.canEnterDesktopMode(mockContext)).isTrue()
    }

    @DisableFlags(
        Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION,
        Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE,
    )
    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
    @Test
    fun canEnterDesktopMode_DWFlagEnabled_deviceEligibleWithoutInternalDisplay_returnsFalse() {
        setDeviceEligibleForDesktopMode(true)
        setCanInternalDisplayHostDesktops(false)

        assertThat(DesktopModeStatus.canEnterDesktopMode(mockContext)).isFalse()
    }

    @DisableFlags(
        Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION,
    )
    @EnableFlags(
        Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE,
        Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE,
    )
    @Test
    fun canEnterDesktopMode_DWAndProjectedFlagEnabled_eligibleWithoutInternalDisplay_returnsTrue() {
        setDeviceEligibleForDesktopMode(true)
        setCanInternalDisplayHostDesktops(false)

        assertThat(DesktopModeStatus.canEnterDesktopMode(mockContext)).isTrue()
    }


    @EnableFlags(
        Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE,
        Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION
@@ -281,6 +316,11 @@ class DesktopModeStatusTest : ShellTestCase() {
            .getBoolean(eq(R.bool.config_isDesktopModeSupported))
    }

    private fun setCanInternalDisplayHostDesktops(eligible: Boolean) {
        doReturn(eligible).whenever(mockResources)
            .getBoolean(eq(R.bool.config_canInternalDisplayHostDesktops))
    }

    private fun setIsVeiledResizeEnabled(enabled: Boolean) {
        val deviceRestrictions =
            DesktopModeStatus::class.java.getDeclaredField("IS_VEILED_RESIZE_ENABLED")
+17 −1
Original line number Diff line number Diff line
@@ -194,7 +194,23 @@ class DesktopStateImplTest : ShellTestCase() {
    )
    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
    @Test
    fun canEnterDesktopMode_DWFlagEnabled_deviceEligibleWithoutInternalDisplay_returnsTrue() {
    fun canEnterDesktopMode_DWFlagEnabled_deviceEligibleWithoutInternalDisplay_returnsFalse() {
        setDeviceEligibleForDesktopMode(true)
        setCanInternalDisplayHostDesktops(false)
        val desktopState = DesktopStateImpl(context)

        assertThat(desktopState.canEnterDesktopMode).isFalse()
    }

    @DisableFlags(
        Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION,
    )
    @EnableFlags(
        Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE,
        Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE,
    )
    @Test
    fun canEnterDesktopMode_DWAndProjectedFlagEnabled_eligibleWithoutInternalDisplay_returnsTrue() {
        setDeviceEligibleForDesktopMode(true)
        setCanInternalDisplayHostDesktops(false)
        val desktopState = DesktopStateImpl(context)