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

Commit 7bbe64f9 authored by Darryl L Johnson's avatar Darryl L Johnson
Browse files

Add global development setting to enable/disable vendor display settings.

(2/n)

This change introduces the DEVELOPMENT_IGNORE_VENDOR_DISPLAY_SETTINGS
setting which controls whether or not WindowManagerService should return
display vendor settings provided in the vendor/ partition. This will be
added as an entry in Developer Options to allow ignoring vendor settings
and using the default settings.

Test: atest WmTests:WindowManagerSettingsTests
Bug: 168808369
Change-Id: Iece0b76e4861be56186333134d7d5b25cab5c7e0
parent 759f1370
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -9773,6 +9773,14 @@ public final class Settings {
        public static final String DEVELOPMENT_USE_BLAST_ADAPTER_SV =
        public static final String DEVELOPMENT_USE_BLAST_ADAPTER_SV =
                "use_blast_adapter_sv";
                "use_blast_adapter_sv";
        /**
         * If {@code true}, vendor provided window manager display settings will be ignored.
         * (0 = false, 1 = true)
         * @hide
         */
        public static final String DEVELOPMENT_IGNORE_VENDOR_DISPLAY_SETTINGS =
                "ignore_vendor_display_settings";
       /**
       /**
        * Whether user has enabled development settings.
        * Whether user has enabled development settings.
        */
        */
+1 −0
Original line number Original line Diff line number Diff line
@@ -230,6 +230,7 @@ public class SettingsBackupTest {
                    Settings.Global.DEVELOPMENT_RENDER_SHADOWS_IN_COMPOSITOR,
                    Settings.Global.DEVELOPMENT_RENDER_SHADOWS_IN_COMPOSITOR,
                    Settings.Global.DEVELOPMENT_USE_BLAST_ADAPTER_SV,
                    Settings.Global.DEVELOPMENT_USE_BLAST_ADAPTER_SV,
                    Settings.Global.DEVELOPMENT_USE_BLAST_ADAPTER_VR,
                    Settings.Global.DEVELOPMENT_USE_BLAST_ADAPTER_VR,
                    Settings.Global.DEVELOPMENT_IGNORE_VENDOR_DISPLAY_SETTINGS,
                    Settings.Global.DEVICE_DEMO_MODE,
                    Settings.Global.DEVICE_DEMO_MODE,
                    Settings.Global.BATTERY_SAVER_ADAPTIVE_CONSTANTS,
                    Settings.Global.BATTERY_SAVER_ADAPTIVE_CONSTANTS,
                    Settings.Global.BATTERY_SAVER_CONSTANTS,
                    Settings.Global.BATTERY_SAVER_CONSTANTS,
+50 −18
Original line number Original line Diff line number Diff line
@@ -85,7 +85,7 @@ class DisplayWindowSettingsProvider implements SettingsProvider {
        void finishWrite(OutputStream os, boolean success);
        void finishWrite(OutputStream os, boolean success);
    }
    }


    private final ReadableSettingsStorage mBaseSettingsStorage;
    private final ReadableSettingsStorage mVendorSettingsStorage;
    /**
    /**
     * The preferred type of a display identifier to use when storing and retrieving entries from
     * The preferred type of a display identifier to use when storing and retrieving entries from
     * the base (vendor) settings file.
     * the base (vendor) settings file.
@@ -93,8 +93,8 @@ class DisplayWindowSettingsProvider implements SettingsProvider {
     * @see #getIdentifier(DisplayInfo, int)
     * @see #getIdentifier(DisplayInfo, int)
     */
     */
    @DisplayIdentifierType
    @DisplayIdentifierType
    private int mBaseIdentifierType;
    private int mVendorIdentifierType;
    private final Map<String, SettingsEntry> mBaseSettings = new HashMap<>();
    private final Map<String, SettingsEntry> mVendorSettings = new HashMap<>();


    private final WritableSettingsStorage mOverrideSettingsStorage;
    private final WritableSettingsStorage mOverrideSettingsStorage;
    /**
    /**
@@ -107,28 +107,56 @@ class DisplayWindowSettingsProvider implements SettingsProvider {
    private int mOverrideIdentifierType;
    private int mOverrideIdentifierType;
    private final Map<String, SettingsEntry> mOverrideSettings = new HashMap<>();
    private final Map<String, SettingsEntry> mOverrideSettings = new HashMap<>();


    /**
     * Enables or disables settings provided from the vendor settings storage.
     *
     * @see #setVendorSettingsIgnored(boolean)
     */
    private boolean mIgnoreVendorSettings = true;

    DisplayWindowSettingsProvider() {
    DisplayWindowSettingsProvider() {
        this(new AtomicFileStorage(getVendorSettingsFile()),
        this(new AtomicFileStorage(getVendorSettingsFile()),
                new AtomicFileStorage(getOverrideSettingsFile()));
                new AtomicFileStorage(getOverrideSettingsFile()));
    }
    }


    @VisibleForTesting
    @VisibleForTesting
    DisplayWindowSettingsProvider(@NonNull ReadableSettingsStorage baseSettingsStorage,
    DisplayWindowSettingsProvider(@NonNull ReadableSettingsStorage vendorSettingsStorage,
            @NonNull WritableSettingsStorage overrideSettingsStorage) {
            @NonNull WritableSettingsStorage overrideSettingsStorage) {
        mBaseSettingsStorage = baseSettingsStorage;
        mVendorSettingsStorage = vendorSettingsStorage;
        mOverrideSettingsStorage = overrideSettingsStorage;
        mOverrideSettingsStorage = overrideSettingsStorage;
        readSettings();
        readSettings();
    }
    }


    /**
     * Enables or disables settings provided from the vendor settings storage. If {@code true}, the
     * vendor settings will be ignored and only the override settings will be returned from
     * {@link #getSettings(DisplayInfo)}. If {@code false}, settings returned from
     * {@link #getSettings(DisplayInfo)} will be a merged result of the vendor settings and the
     * override settings.
     */
    void setVendorSettingsIgnored(boolean ignored) {
        mIgnoreVendorSettings = ignored;
    }

    /**
     * Returns whether or not the vendor settings are being ignored.
     *
     * @see #setVendorSettingsIgnored(boolean)
     */
    @VisibleForTesting
    boolean getVendorSettingsIgnored() {
        return mIgnoreVendorSettings;
    }

    @Override
    @Override
    @NonNull
    @NonNull
    public SettingsEntry getSettings(@NonNull DisplayInfo info) {
    public SettingsEntry getSettings(@NonNull DisplayInfo info) {
        SettingsEntry baseSettings = getBaseSettingsEntry(info);
        SettingsEntry vendorSettings = getVendorSettingsEntry(info);
        SettingsEntry overrideSettings = getOrCreateOverrideSettingsEntry(info);
        SettingsEntry overrideSettings = getOrCreateOverrideSettingsEntry(info);
        if (baseSettings == null) {
        if (vendorSettings == null) {
            return new SettingsEntry(overrideSettings);
            return new SettingsEntry(overrideSettings);
        } else {
        } else {
            SettingsEntry mergedSettings = new SettingsEntry(baseSettings);
            SettingsEntry mergedSettings = new SettingsEntry(vendorSettings);
            mergedSettings.updateFrom(overrideSettings);
            mergedSettings.updateFrom(overrideSettings);
            return mergedSettings;
            return mergedSettings;
        }
        }
@@ -151,18 +179,22 @@ class DisplayWindowSettingsProvider implements SettingsProvider {
    }
    }


    @Nullable
    @Nullable
    private SettingsEntry getBaseSettingsEntry(DisplayInfo info) {
    private SettingsEntry getVendorSettingsEntry(DisplayInfo info) {
        final String identifier = getIdentifier(info, mBaseIdentifierType);
        if (mIgnoreVendorSettings) {
            return null;
        }

        final String identifier = getIdentifier(info, mVendorIdentifierType);
        SettingsEntry settings;
        SettingsEntry settings;
        // Try to get corresponding settings using preferred identifier for the current config.
        // Try to get corresponding settings using preferred identifier for the current config.
        if ((settings = mBaseSettings.get(identifier)) != null) {
        if ((settings = mVendorSettings.get(identifier)) != null) {
            return settings;
            return settings;
        }
        }
        // Else, fall back to the display name.
        // Else, fall back to the display name.
        if ((settings = mBaseSettings.get(info.name)) != null) {
        if ((settings = mVendorSettings.get(info.name)) != null) {
            // Found an entry stored with old identifier.
            // Found an entry stored with old identifier.
            mBaseSettings.remove(info.name);
            mVendorSettings.remove(info.name);
            mBaseSettings.put(identifier, settings);
            mVendorSettings.put(identifier, settings);
            return settings;
            return settings;
        }
        }
        return null;
        return null;
@@ -191,10 +223,10 @@ class DisplayWindowSettingsProvider implements SettingsProvider {
    }
    }


    private void readSettings() {
    private void readSettings() {
        FileData baseFileData = readSettings(mBaseSettingsStorage);
        FileData vendorFileData = readSettings(mVendorSettingsStorage);
        if (baseFileData != null) {
        if (vendorFileData != null) {
            mBaseIdentifierType = baseFileData.mIdentifierType;
            mVendorIdentifierType = vendorFileData.mIdentifierType;
            mBaseSettings.putAll(baseFileData.mSettings);
            mVendorSettings.putAll(vendorFileData.mSettings);
        }
        }


        FileData overrideFileData = readSettings(mOverrideSettingsStorage);
        FileData overrideFileData = readSettings(mOverrideSettingsStorage);
+30 −2
Original line number Original line Diff line number Diff line
@@ -44,6 +44,7 @@ import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDO
import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_SIZECOMPAT_FREEFORM;
import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_SIZECOMPAT_FREEFORM;
import static android.provider.Settings.Global.DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS;
import static android.provider.Settings.Global.DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS;
import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES;
import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES;
import static android.provider.Settings.Global.DEVELOPMENT_IGNORE_VENDOR_DISPLAY_SETTINGS;
import static android.provider.Settings.Global.DEVELOPMENT_RENDER_SHADOWS_IN_COMPOSITOR;
import static android.provider.Settings.Global.DEVELOPMENT_RENDER_SHADOWS_IN_COMPOSITOR;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
@@ -575,6 +576,7 @@ public class WindowManagerService extends IWindowManager.Stub
    final PackageManagerInternal mPmInternal;
    final PackageManagerInternal mPmInternal;
    private final TestUtilityService mTestUtilityService;
    private final TestUtilityService mTestUtilityService;


    final DisplayWindowSettingsProvider mDisplayWindowSettingsProvider;
    final DisplayWindowSettings mDisplayWindowSettings;
    final DisplayWindowSettings mDisplayWindowSettings;


    /** If the system should display notifications for apps displaying an alert window. */
    /** If the system should display notifications for apps displaying an alert window. */
@@ -798,6 +800,8 @@ public class WindowManagerService extends IWindowManager.Stub
                DEVELOPMENT_ENABLE_SIZECOMPAT_FREEFORM);
                DEVELOPMENT_ENABLE_SIZECOMPAT_FREEFORM);
        private final Uri mRenderShadowsInCompositorUri = Settings.Global.getUriFor(
        private final Uri mRenderShadowsInCompositorUri = Settings.Global.getUriFor(
                DEVELOPMENT_RENDER_SHADOWS_IN_COMPOSITOR);
                DEVELOPMENT_RENDER_SHADOWS_IN_COMPOSITOR);
        private final Uri mIgnoreVendorDisplaySettingsUri = Settings.Global.getUriFor(
                DEVELOPMENT_IGNORE_VENDOR_DISPLAY_SETTINGS);


        public SettingsObserver() {
        public SettingsObserver() {
            super(new Handler());
            super(new Handler());
@@ -822,6 +826,8 @@ public class WindowManagerService extends IWindowManager.Stub
                    UserHandle.USER_ALL);
                    UserHandle.USER_ALL);
            resolver.registerContentObserver(mRenderShadowsInCompositorUri, false, this,
            resolver.registerContentObserver(mRenderShadowsInCompositorUri, false, this,
                    UserHandle.USER_ALL);
                    UserHandle.USER_ALL);
            resolver.registerContentObserver(mIgnoreVendorDisplaySettingsUri, false, this,
                    UserHandle.USER_ALL);
        }
        }


        @Override
        @Override
@@ -865,6 +871,11 @@ public class WindowManagerService extends IWindowManager.Stub
                return;
                return;
            }
            }


            if (mIgnoreVendorDisplaySettingsUri.equals(uri)) {
                updateIgnoreVendorDisplaySettings();
                return;
            }

            @UpdateAnimationScaleMode
            @UpdateAnimationScaleMode
            final int mode;
            final int mode;
            if (mWindowAnimationScaleUri.equals(uri)) {
            if (mWindowAnimationScaleUri.equals(uri)) {
@@ -954,6 +965,19 @@ public class WindowManagerService extends IWindowManager.Stub


            mAtmService.mSizeCompatFreeform = sizeCompatFreeform;
            mAtmService.mSizeCompatFreeform = sizeCompatFreeform;
        }
        }

        void updateIgnoreVendorDisplaySettings() {
            final ContentResolver resolver = mContext.getContentResolver();
            final boolean ignoreVendorSettings = Settings.Global.getInt(resolver,
                    DEVELOPMENT_IGNORE_VENDOR_DISPLAY_SETTINGS, 0) != 0;
            synchronized (mGlobalLock) {
                mDisplayWindowSettingsProvider.setVendorSettingsIgnored(ignoreVendorSettings);
                mRoot.forAllDisplays(display -> {
                    mDisplayWindowSettings.applySettingsToDisplayLocked(display);
                    display.reconfigureDisplayLocked();
                });
            }
        }
    }
    }


    private void setShadowRenderer() {
    private void setShadowRenderer() {
@@ -1212,8 +1236,6 @@ public class WindowManagerService extends IWindowManager.Stub
        mSurfaceFactory = surfaceFactory;
        mSurfaceFactory = surfaceFactory;
        mTransaction = mTransactionFactory.get();
        mTransaction = mTransactionFactory.get();


        final DisplayWindowSettingsProvider settingsProvider = new DisplayWindowSettingsProvider();
        mDisplayWindowSettings = new DisplayWindowSettings(this, settingsProvider);
        mPolicy = policy;
        mPolicy = policy;
        mAnimator = new WindowAnimator(this);
        mAnimator = new WindowAnimator(this);
        mRoot = new RootWindowContainer(this);
        mRoot = new RootWindowContainer(this);
@@ -1312,6 +1334,12 @@ public class WindowManagerService extends IWindowManager.Stub
        mForceDesktopModeOnExternalDisplays = Settings.Global.getInt(resolver,
        mForceDesktopModeOnExternalDisplays = Settings.Global.getInt(resolver,
                DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS, 0) != 0;
                DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS, 0) != 0;


        final boolean ignoreVendorDisplaySettings = Settings.Global.getInt(resolver,
                DEVELOPMENT_IGNORE_VENDOR_DISPLAY_SETTINGS, 0) != 0;
        mDisplayWindowSettingsProvider = new DisplayWindowSettingsProvider();
        mDisplayWindowSettingsProvider.setVendorSettingsIgnored(ignoreVendorDisplaySettings);
        mDisplayWindowSettings = new DisplayWindowSettings(this, mDisplayWindowSettingsProvider);

        IntentFilter filter = new IntentFilter();
        IntentFilter filter = new IntentFilter();
        // Track changes to DevicePolicyManager state so we can enable/disable keyguard.
        // Track changes to DevicePolicyManager state so we can enable/disable keyguard.
        filter.addAction(ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
        filter.addAction(ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
+1 −0
Original line number Original line Diff line number Diff line
@@ -296,6 +296,7 @@ public class SystemServicesTestRule implements TestRule {
        // Called when moving activity to pinned stack.
        // Called when moving activity to pinned stack.
        doNothing().when(mWmService.mRoot).ensureActivitiesVisible(any(),
        doNothing().when(mWmService.mRoot).ensureActivitiesVisible(any(),
                anyInt(), anyBoolean(), anyBoolean());
                anyInt(), anyBoolean(), anyBoolean());
        spyOn(mWmService.mDisplayWindowSettings);


        // Setup factory classes to prevent calls to native code.
        // Setup factory classes to prevent calls to native code.
        mTransaction = spy(StubTransaction.class);
        mTransaction = spy(StubTransaction.class);
Loading