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

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

Add adb commands to update the set of dev option

The adb command will be:

```
adb shell setprop
persist.wm.debug.desktop_experience.add_dev_option.BASENAME
```

Where `BASENAME` is the last part of the flag (after the last dot), for
example the base name of
`com.android.window.flags.enable_connected_displays_dnd` is
`enable_connected_displays_dnd`.

Test: atest DesktopExperienceFlagsTest
Test: atest WMShellUnitTests
Fix: 408432634
Flag: com.android.window.flags.show_desktop_experience_dev_option
Change-Id: Iead0c2754300fb8a8b1a59bae724e9098f3dc041
parent 6eaccc02
Loading
Loading
Loading
Loading
+43 −11
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package android.window;

import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT;
import static com.android.server.display.feature.flags.Flags.enableDisplayContentModeManagement;

import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -150,31 +151,46 @@ public enum DesktopExperienceFlags {
    public static class DesktopExperienceFlag {
        // Function called to obtain aconfig flag value.
        private final BooleanSupplier mFlagFunction;
        // Name of the flag, used for adb commands.
        private final String mFlagName;
        // Whether the flag state should be affected by developer option.
        private final boolean mShouldOverrideByDevOption;
        private final boolean mShouldOverrideByDevOptionDefault;
        // Cached value for that flag: null if not read yet.
        private Boolean mCachedIsOverrideByDevOption;

        public DesktopExperienceFlag(BooleanSupplier flagFunction,
                boolean shouldOverrideByDevOption,
                @Nullable String flagName) {
            this.mFlagFunction = flagFunction;
            this.mShouldOverrideByDevOption = checkIfFlagShouldBeOverridden(flagName,
                    shouldOverrideByDevOption);
            this.mFlagName = flagName;
            this.mShouldOverrideByDevOptionDefault = shouldOverrideByDevOption;
        }

        /**
         * Determines state of flag based on the actual flag and desktop experience developer option
         * overrides.
         *
         * The assumption is that the flag's value doesn't change at runtime, or if it changes the
         * user will reboot very soon so being inconsistent across threads is ok.
         */
        public boolean isTrue() {
            return isFlagTrue(mFlagFunction, mShouldOverrideByDevOption);
            if (mCachedIsOverrideByDevOption == null) {
                mCachedIsOverrideByDevOption = checkIfFlagShouldBeOverridden(mFlagName,
                        mShouldOverrideByDevOptionDefault);
            }
            return isFlagTrue(mFlagFunction, mCachedIsOverrideByDevOption);
        }
    }

    private static final String TAG = "DesktopExperienceFlags";
    // Function called to obtain aconfig flag value.
    private final BooleanSupplier mFlagFunction;
    // Name of the flag, used for adb commands.
    private final String mFlagName;
    // Whether the flag state should be affected by developer option.
    private final boolean mShouldOverrideByDevOption;
    private final boolean mShouldOverrideByDevOptionDefault;
    // Cached value for that flag: null if not read yet.
    private Boolean mCachedIsOverrideByDevOption;

    // Local cache for toggle override, which is initialized once on its first access. It needs to
    // be refreshed only on reboots as overridden state is expected to take effect on reboots.
@@ -188,22 +204,29 @@ public enum DesktopExperienceFlags {
    DesktopExperienceFlags(BooleanSupplier flagFunction, boolean shouldOverrideByDevOption,
            @NonNull String flagName) {
        this.mFlagFunction = flagFunction;
        this.mShouldOverrideByDevOption = checkIfFlagShouldBeOverridden(flagName,
                shouldOverrideByDevOption);
        this.mFlagName = flagName;
        this.mShouldOverrideByDevOptionDefault = shouldOverrideByDevOption;
    }

    /**
     * Determines state of flag based on the actual flag and desktop experience developer option
     * overrides.
     *
     * The assumption is that the flag's value doesn't change at runtime, or if it changes the
     * user will reboot very soon so being inconsistent across threads is ok.
     */
    public boolean isTrue() {
        return isFlagTrue(mFlagFunction, mShouldOverrideByDevOption);
        if (mCachedIsOverrideByDevOption == null) {
            mCachedIsOverrideByDevOption = checkIfFlagShouldBeOverridden(mFlagName,
                    mShouldOverrideByDevOptionDefault);
        }
        return isFlagTrue(mFlagFunction, mCachedIsOverrideByDevOption);
    }

    private static boolean isFlagTrue(
            BooleanSupplier flagFunction, boolean shouldOverrideByDevOption) {
        if (shouldOverrideByDevOption
                && Flags.showDesktopExperienceDevOption()
        if (Flags.showDesktopExperienceDevOption()
                && shouldOverrideByDevOption
                && getToggleOverride()) {
            return true;
        }
@@ -212,8 +235,17 @@ public enum DesktopExperienceFlags {

    private static boolean checkIfFlagShouldBeOverridden(@Nullable String flagName,
            boolean defaultValue) {
        if (!Flags.showDesktopExperienceDevOption() || enableDisplayContentModeManagement()) {
            return false;
        }
        if (flagName == null || flagName.isEmpty()) {
            return defaultValue;
        }
        int lastDot = flagName.lastIndexOf('.');
        String baseName = lastDot >= 0 ? flagName.substring(lastDot + 1) : flagName;
        return SystemProperties.getBoolean(SYSTEM_PROPERTY_OVERRIDE_PREFIX + baseName,
                defaultValue);
    }

    private static boolean getToggleOverride() {
        // If cached, return it
+3 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.window;

import static com.android.server.display.feature.flags.Flags.FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT;
import static com.android.window.flags.Flags.FLAG_SHOW_DESKTOP_EXPERIENCE_DEV_OPTION;

import static com.google.common.truth.Truth.assertThat;
@@ -23,6 +24,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assume.assumeFalse;
import static org.junit.Assume.assumeTrue;

import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.Presubmit;
import android.platform.test.flag.junit.FlagsParameterization;
import android.platform.test.flag.junit.SetFlagsRule;
@@ -57,6 +59,7 @@ import java.util.Objects;
@SmallTest
@Presubmit
@RunWith(ParameterizedAndroidJunit4.class)
@DisableFlags(FLAG_ENABLE_DISPLAY_CONTENT_MODE_MANAGEMENT)
public class DesktopExperienceFlagsTest {

    @Parameters(name = "{0}")