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

Commit d91e612f authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[dev_options] Move DesktopModeFlags util from...

Merge "[dev_options] Move DesktopModeFlags util from frameworks/base/services/core to frameworks/base/core." into main
parents 6bc10392 301fac6c
Loading
Loading
Loading
Loading
+13 −15
Original line number Diff line number Diff line
@@ -14,9 +14,7 @@
 * limitations under the License.
 */

package com.android.server.wm.utils;

import static com.android.server.wm.utils.DesktopModeFlagsUtil.ToggleOverride.OVERRIDE_UNSET;
package android.window.flags;

import android.annotation.Nullable;
import android.content.Context;
@@ -28,18 +26,18 @@ import com.android.window.flags.Flags;
import java.util.function.Supplier;

/**
 * Util to check desktop mode flags state.
 * Checks desktop mode flag state.
 *
 * This utility is used to allow developer option toggles to override flags related to desktop
 * windowing.
 * <p>This enum provides a centralized way to control the behavior of flags related to desktop
 * windowing features which are aiming for developer preview before their release. It allows
 * developer option to override the default behavior of these flags.
 *
 * Computes whether Desktop Windowing related flags should be enabled by using the aconfig flag
 * value and the developer option override state (if applicable).
 * <p>NOTE: Flags should only be added to this enum when they have received Product and UX
 * alignment that the feature is ready for developer preview, otherwise just do a flag check.
 *
 * This is a partial copy of {@link com.android.wm.shell.shared.desktopmode.DesktopModeFlags} which
 * is to be used in WM core.
 * @hide
 */
public enum DesktopModeFlagsUtil {
public enum DesktopModeFlags {
    // All desktop mode related flags to be overridden by developer option toggle will be added here
    DESKTOP_WINDOWING_MODE(
            Flags::enableDesktopWindowingMode, /* shouldOverrideByDevOption= */ true),
@@ -55,7 +53,7 @@ public enum DesktopModeFlagsUtil {
    // be refreshed only on reboots as overridden state is expected to take effect on reboots.
    private static ToggleOverride sCachedToggleOverride;

    DesktopModeFlagsUtil(Supplier<Boolean> flagFunction, boolean shouldOverrideByDevOption) {
    DesktopModeFlags(Supplier<Boolean> flagFunction, boolean shouldOverrideByDevOption) {
        this.mFlagFunction = flagFunction;
        this.mShouldOverrideByDevOption = shouldOverrideByDevOption;
    }
@@ -101,13 +99,13 @@ public enum DesktopModeFlagsUtil {
        int settingValue = Settings.Global.getInt(
                context.getContentResolver(),
                Settings.Global.DEVELOPMENT_OVERRIDE_DESKTOP_MODE_FEATURES,
                OVERRIDE_UNSET.getSetting()
                ToggleOverride.OVERRIDE_UNSET.getSetting()
        );
        return ToggleOverride.fromSetting(settingValue, OVERRIDE_UNSET);
        return ToggleOverride.fromSetting(settingValue, ToggleOverride.OVERRIDE_UNSET);
    }

    /** Override state of desktop mode developer option toggle. */
    enum ToggleOverride {
    private enum ToggleOverride {
        OVERRIDE_UNSET,
        OVERRIDE_OFF,
        OVERRIDE_ON;
+52 −46
Original line number Diff line number Diff line
@@ -14,11 +14,10 @@
 * limitations under the License.
 */

package com.android.server.wm.utils;
package android.window.flags;

import static android.window.flags.DesktopModeFlags.DESKTOP_WINDOWING_MODE;

import static com.android.server.wm.utils.DesktopModeFlagsUtil.DESKTOP_WINDOWING_MODE;
import static com.android.server.wm.utils.DesktopModeFlagsUtil.ToggleOverride.OVERRIDE_OFF;
import static com.android.server.wm.utils.DesktopModeFlagsUtil.ToggleOverride.OVERRIDE_ON;
import static com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE;
import static com.android.window.flags.Flags.FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS;
import static com.android.window.flags.Flags.FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPTION;
@@ -26,16 +25,16 @@ import static com.android.window.flags.Flags.FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPT
import static com.google.common.truth.Truth.assertThat;

import android.content.ContentResolver;
import android.content.Context;
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.provider.Settings;

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;

import com.android.server.wm.WindowTestRunner;
import com.android.server.wm.WindowTestsBase;
import androidx.test.platform.app.InstrumentationRegistry;

import org.junit.Before;
import org.junit.Rule;
@@ -45,21 +44,28 @@ import org.junit.runner.RunWith;
import java.lang.reflect.Field;

/**
 * Test class for [DesktopModeFlagsUtil]
 * Test class for {@link DesktopModeFlags}
 *
 * Build/Install/Run:
 * atest WmTests:DesktopModeFlagsUtilTest
 * atest FrameworksCoreTests:DesktopModeFlagsTest
 */
@SmallTest
@Presubmit
@RunWith(WindowTestRunner.class)
public class DesktopModeFlagsUtilTest extends WindowTestsBase {
@RunWith(AndroidJUnit4.class)
public class DesktopModeFlagsTest {

    @Rule
    public SetFlagsRule setFlagsRule = new SetFlagsRule();

    private Context mContext;

    private static final int OVERRIDE_OFF_SETTING = 0;
    private static final int OVERRIDE_ON_SETTING = 1;
    private static final int OVERRIDE_UNSET_SETTING = -1;

    @Before
    public void setUp() throws Exception {
        mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
        resetCache();
    }

@@ -67,7 +73,7 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
    @DisableFlags(FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPTION)
    @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
    public void isEnabled_devOptionFlagDisabled_overrideOff_featureFlagOn_returnsTrue() {
        setOverride(OVERRIDE_OFF.getSetting());
        setOverride(OVERRIDE_OFF_SETTING);
        // In absence of dev options, follow flag
        assertThat(DESKTOP_WINDOWING_MODE.isEnabled(mContext)).isTrue();
    }
@@ -76,7 +82,7 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
    @Test
    @DisableFlags({FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPTION, FLAG_ENABLE_DESKTOP_WINDOWING_MODE})
    public void isEnabled_devOptionFlagDisabled_overrideOn_featureFlagOff_returnsFalse() {
        setOverride(OVERRIDE_ON.getSetting());
        setOverride(OVERRIDE_ON_SETTING);

        assertThat(DESKTOP_WINDOWING_MODE.isEnabled(mContext)).isFalse();
    }
@@ -84,7 +90,7 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
    @Test
    @EnableFlags({FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPTION, FLAG_ENABLE_DESKTOP_WINDOWING_MODE})
    public void isEnabled_overrideUnset_featureFlagOn_returnsTrue() {
        setOverride(DesktopModeFlagsUtil.ToggleOverride.OVERRIDE_UNSET.getSetting());
        setOverride(OVERRIDE_UNSET_SETTING);

        // For overridableFlag, for unset overrides, follow flag
        assertThat(DESKTOP_WINDOWING_MODE.isEnabled(mContext)).isTrue();
@@ -94,7 +100,7 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
    @EnableFlags(FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPTION)
    @DisableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
    public void isEnabled_overrideUnset_featureFlagOff_returnsFalse() {
        setOverride(DesktopModeFlagsUtil.ToggleOverride.OVERRIDE_UNSET.getSetting());
        setOverride(OVERRIDE_UNSET_SETTING);

        // For overridableFlag, for unset overrides, follow flag
        assertThat(DESKTOP_WINDOWING_MODE.isEnabled(mContext)).isFalse();
@@ -141,7 +147,7 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
    @Test
    @EnableFlags({FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPTION, FLAG_ENABLE_DESKTOP_WINDOWING_MODE})
    public void isEnabled_overrideOff_featureFlagOn_returnsFalse() {
        setOverride(OVERRIDE_OFF.getSetting());
        setOverride(OVERRIDE_OFF_SETTING);

        // For overridableFlag, follow override if they exist
        assertThat(DESKTOP_WINDOWING_MODE.isEnabled(mContext)).isFalse();
@@ -151,7 +157,7 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
    @EnableFlags(FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPTION)
    @DisableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
    public void isEnabled_overrideOn_featureFlagOff_returnsTrue() {
        setOverride(OVERRIDE_ON.getSetting());
        setOverride(OVERRIDE_ON_SETTING);

        // For overridableFlag, follow override if they exist
        assertThat(DESKTOP_WINDOWING_MODE.isEnabled(mContext)).isTrue();
@@ -160,12 +166,12 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
    @Test
    @EnableFlags({FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPTION, FLAG_ENABLE_DESKTOP_WINDOWING_MODE})
    public void isEnabled_overrideOffThenOn_featureFlagOn_returnsFalseAndFalse() {
        setOverride(OVERRIDE_OFF.getSetting());
        setOverride(OVERRIDE_OFF_SETTING);

        // For overridableFlag, follow override if they exist
        assertThat(DESKTOP_WINDOWING_MODE.isEnabled(mContext)).isFalse();

        setOverride(OVERRIDE_ON.getSetting());
        setOverride(OVERRIDE_ON_SETTING);

        // Keep overrides constant through the process
        assertThat(DESKTOP_WINDOWING_MODE.isEnabled(mContext)).isFalse();
@@ -175,12 +181,12 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
    @EnableFlags(FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPTION)
    @DisableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
    public void isEnabled_overrideOnThenOff_featureFlagOff_returnsTrueAndTrue() {
        setOverride(OVERRIDE_ON.getSetting());
        setOverride(OVERRIDE_ON_SETTING);

        // For overridableFlag, follow override if they exist
        assertThat(DESKTOP_WINDOWING_MODE.isEnabled(mContext)).isTrue();

        setOverride(OVERRIDE_OFF.getSetting());
        setOverride(OVERRIDE_OFF_SETTING);

        // Keep overrides constant through the process
        assertThat(DESKTOP_WINDOWING_MODE.isEnabled(mContext)).isTrue();
@@ -190,19 +196,19 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
    @EnableFlags({FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPTION, FLAG_ENABLE_DESKTOP_WINDOWING_MODE,
            FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS})
    public void isEnabled_dwFlagOn_overrideUnset_featureFlagOn_returnsTrue() {
        setOverride(DesktopModeFlagsUtil.ToggleOverride.OVERRIDE_UNSET.getSetting());
        setOverride(OVERRIDE_UNSET_SETTING);

        // For unset overrides, follow flag
        assertThat(DesktopModeFlagsUtil.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isTrue();
        assertThat(DesktopModeFlags.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isTrue();
    }

    @Test
    @EnableFlags({FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPTION, FLAG_ENABLE_DESKTOP_WINDOWING_MODE})
    @DisableFlags(FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS)
    public void isEnabled_dwFlagOn_overrideUnset_featureFlagOff_returnsFalse() {
        setOverride(DesktopModeFlagsUtil.ToggleOverride.OVERRIDE_UNSET.getSetting());
        setOverride(OVERRIDE_UNSET_SETTING);
        // For unset overrides, follow flag
        assertThat(DesktopModeFlagsUtil.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isFalse();
        assertThat(DesktopModeFlags.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isFalse();
    }

    @Test
@@ -212,20 +218,20 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
            FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS
    })
    public void isEnabled_dwFlagOn_overrideOn_featureFlagOn_returnsTrue() {
        setOverride(OVERRIDE_ON.getSetting());
        setOverride(OVERRIDE_ON_SETTING);

        // When toggle override matches its default state (dw flag), don't override flags
        assertThat(DesktopModeFlagsUtil.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isTrue();
        assertThat(DesktopModeFlags.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isTrue();
    }

    @Test
    @EnableFlags({FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPTION, FLAG_ENABLE_DESKTOP_WINDOWING_MODE})
    @DisableFlags(FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS)
    public void isEnabled_dwFlagOn_overrideOn_featureFlagOff_returnsFalse() {
        setOverride(OVERRIDE_ON.getSetting());
        setOverride(OVERRIDE_ON_SETTING);

        // When toggle override matches its default state (dw flag), don't override flags
        assertThat(DesktopModeFlagsUtil.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isFalse();
        assertThat(DesktopModeFlags.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isFalse();
    }

    @Test
@@ -235,20 +241,20 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
            FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS
    })
    public void isEnabled_dwFlagOn_overrideOff_featureFlagOn_returnsTrue() {
        setOverride(OVERRIDE_OFF.getSetting());
        setOverride(OVERRIDE_OFF_SETTING);

        // Follow override if they exist, and is not equal to default toggle state (dw flag)
        assertThat(DesktopModeFlagsUtil.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isTrue();
        assertThat(DesktopModeFlags.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isTrue();
    }

    @Test
    @EnableFlags({FLAG_SHOW_DESKTOP_WINDOWING_DEV_OPTION, FLAG_ENABLE_DESKTOP_WINDOWING_MODE})
    @DisableFlags(FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS)
    public void isEnabled_dwFlagOn_overrideOff_featureFlagOff_returnsFalse() {
        setOverride(OVERRIDE_OFF.getSetting());
        setOverride(OVERRIDE_OFF_SETTING);

        // Follow override if they exist, and is not equal to default toggle state (dw flag)
        assertThat(DesktopModeFlagsUtil.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isFalse();
        assertThat(DesktopModeFlags.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isFalse();
    }

    @Test
@@ -258,10 +264,10 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
    })
    @DisableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
    public void isEnabled_dwFlagOff_overrideUnset_featureFlagOn_returnsTrue() {
        setOverride(DesktopModeFlagsUtil.ToggleOverride.OVERRIDE_UNSET.getSetting());
        setOverride(OVERRIDE_UNSET_SETTING);

        // For unset overrides, follow flag
        assertThat(DesktopModeFlagsUtil.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isTrue();
        assertThat(DesktopModeFlags.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isTrue();
    }

    @Test
@@ -271,10 +277,10 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
            FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS
    })
    public void isEnabled_dwFlagOff_overrideUnset_featureFlagOff_returnsFalse() {
        setOverride(DesktopModeFlagsUtil.ToggleOverride.OVERRIDE_UNSET.getSetting());
        setOverride(OVERRIDE_UNSET_SETTING);

        // For unset overrides, follow flag
        assertThat(DesktopModeFlagsUtil.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isFalse();
        assertThat(DesktopModeFlags.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isFalse();
    }

    @Test
@@ -284,10 +290,10 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
    })
    @DisableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
    public void isEnabled_dwFlagOff_overrideOn_featureFlagOn_returnsTrue() {
        setOverride(OVERRIDE_ON.getSetting());
        setOverride(OVERRIDE_ON_SETTING);

        // Follow override if they exist, and is not equal to default toggle state (dw flag)
        assertThat(DesktopModeFlagsUtil.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isTrue();
        assertThat(DesktopModeFlags.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isTrue();
    }

    @Test
@@ -297,10 +303,10 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
            FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS
    })
    public void isEnabled_dwFlagOff_overrideOn_featureFlagOff_returnFalse() {
        setOverride(OVERRIDE_ON.getSetting());
        setOverride(OVERRIDE_ON_SETTING);

        // Follow override if they exist, and is not equal to default toggle state (dw flag)
        assertThat(DesktopModeFlagsUtil.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isFalse();
        assertThat(DesktopModeFlags.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isFalse();
    }

    @Test
@@ -310,10 +316,10 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
    })
    @DisableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
    public void isEnabled_dwFlagOff_overrideOff_featureFlagOn_returnsTrue() {
        setOverride(OVERRIDE_OFF.getSetting());
        setOverride(OVERRIDE_OFF_SETTING);

        // When toggle override matches its default state (dw flag), don't override flags
        assertThat(DesktopModeFlagsUtil.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isTrue();
        assertThat(DesktopModeFlags.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isTrue();
    }

    @Test
@@ -323,10 +329,10 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
            FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS
    })
    public void isEnabled_dwFlagOff_overrideOff_featureFlagOff_returnsFalse() {
        setOverride(OVERRIDE_OFF.getSetting());
        setOverride(OVERRIDE_OFF_SETTING);

        // When toggle override matches its default state (dw flag), don't override flags
        assertThat(DesktopModeFlagsUtil.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isFalse();
        assertThat(DesktopModeFlags.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)).isFalse();
    }

    private void setOverride(Integer setting) {
@@ -341,7 +347,7 @@ public class DesktopModeFlagsUtilTest extends WindowTestsBase {
    }

    private void resetCache() throws Exception {
        Field cachedToggleOverride = DesktopModeFlagsUtil.class.getDeclaredField(
        Field cachedToggleOverride = DesktopModeFlags.class.getDeclaredField(
                "sCachedToggleOverride");
        cachedToggleOverride.setAccessible(true);
        cachedToggleOverride.set(null, null);
+2 −3
Original line number Diff line number Diff line
@@ -37,8 +37,7 @@ import android.graphics.Rect;
import android.os.SystemProperties;
import android.util.Size;
import android.view.Gravity;

import com.android.server.wm.utils.DesktopModeFlagsUtil;
import android.window.flags.DesktopModeFlags;

import java.util.function.Consumer;

@@ -104,7 +103,7 @@ public final class DesktopModeBoundsCalculator {
        final TaskDisplayArea displayArea = task.getDisplayArea();
        final Rect screenBounds = displayArea.getBounds();
        final Size idealSize = calculateIdealSize(screenBounds, DESKTOP_MODE_INITIAL_BOUNDS_SCALE);
        if (!DesktopModeFlagsUtil.DYNAMIC_INITIAL_BOUNDS.isEnabled(activity.mWmService.mContext)) {
        if (!DesktopModeFlags.DYNAMIC_INITIAL_BOUNDS.isEnabled(activity.mWmService.mContext)) {
            return centerInScreen(idealSize, screenBounds);
        }
        if (activity.mAppCompatController.getAppCompatAspectRatioOverrides()
+2 −2
Original line number Diff line number Diff line
@@ -19,10 +19,10 @@ package com.android.server.wm;
import android.annotation.NonNull;
import android.content.Context;
import android.os.SystemProperties;
import android.window.flags.DesktopModeFlags;

import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.wm.utils.DesktopModeFlagsUtil;

/**
 * Constants for desktop mode feature
@@ -36,7 +36,7 @@ public final class DesktopModeHelper {

    /** Whether desktop mode is enabled. */
    static boolean isDesktopModeEnabled(@NonNull Context context) {
        return DesktopModeFlagsUtil.DESKTOP_WINDOWING_MODE.isEnabled(context);
        return DesktopModeFlags.DESKTOP_WINDOWING_MODE.isEnabled(context);
    }

    /**