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

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

Correct showing desktop experience dev option

1. Update isDesktopModeSupported to always ignore the availability on
   the internal display. If a device shouldn't be supported, let's not
   label it as supported at all.
2. Add the necessary method to DesktopModeHelper
3. Update WindowManagerService to force-disable the old developer option
   when the new one is shown
4. For consistency, don't test the developer option in DesktopModeFlags
   if DesktopExperienceFlags is disabled (e.g. when content mode
   management is enabled).

Bug: 389092752
Test: manual
Flag: com.android.window.flags.show_desktop_experience_dev_option
Change-Id: Ib8a6c8bf236a1c04e60ed26ea7ecb5a93176de61
parent 207534fa
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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}")
+2 −8
Original line number Diff line number Diff line
@@ -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;
@@ -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;
    }

    /**
+2 −21
Original line number Diff line number Diff line
@@ -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

@@ -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 =
@@ -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
+29 −14
Original line number Diff line number Diff line
@@ -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
@@ -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()
@@ -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(
@@ -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)
@@ -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