Loading services/core/java/com/android/server/wm/DisplayContent.java +1 −1 Original line number Diff line number Diff line Loading @@ -522,7 +522,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp boolean mWaitingForConfig; // TODO(multi-display): remove some of the usages. @VisibleForTesting boolean isDefaultDisplay; /** Detect user tapping outside of current focused task bounds .*/ Loading Loading @@ -3358,6 +3357,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mRootWindowContainer.mTaskSupervisor .getKeyguardController().onDisplayRemoved(mDisplayId); mWallpaperController.resetLargestDisplay(mDisplay); mWmService.mDisplayWindowSettings.onDisplayRemoved(this); } finally { mDisplayReady = false; } Loading services/core/java/com/android/server/wm/DisplayWindowSettings.java +58 −30 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.view.Display; import android.view.DisplayInfo; import android.view.IWindowManager; import android.view.Surface; import android.view.WindowManager; import android.view.WindowManager.DisplayImePolicy; import com.android.server.policy.WindowManagerPolicy; Loading @@ -45,15 +46,20 @@ import java.util.Objects; * delegates the persistence and lookup of settings values to the supplied {@link SettingsProvider}. */ class DisplayWindowSettings { @NonNull private final WindowManagerService mService; @NonNull private final SettingsProvider mSettingsProvider; DisplayWindowSettings(WindowManagerService service, SettingsProvider settingsProvider) { DisplayWindowSettings(@NonNull WindowManagerService service, @NonNull SettingsProvider settingsProvider) { mService = service; mSettingsProvider = settingsProvider; } void setUserRotation(DisplayContent displayContent, int rotationMode, int rotation) { void setUserRotation(@NonNull DisplayContent displayContent, @WindowManagerPolicy.UserRotationMode int rotationMode, @Surface.Rotation int rotation) { final DisplayInfo displayInfo = displayContent.getDisplayInfo(); final SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getOverrideSettings(displayInfo); Loading @@ -62,7 +68,7 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } void setForcedSize(DisplayContent displayContent, int width, int height) { void setForcedSize(@NonNull DisplayContent displayContent, int width, int height) { if (displayContent.isDefaultDisplay) { final String sizeString = (width == 0 || height == 0) ? "" : (width + "," + height); Settings.Global.putString(mService.mContext.getContentResolver(), Loading @@ -77,21 +83,20 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } void setForcedDensity(DisplayInfo info, int density, int userId) { void setForcedDensity(@NonNull DisplayInfo info, int density, int userId) { if (info.displayId == Display.DEFAULT_DISPLAY) { final String densityString = density == 0 ? "" : Integer.toString(density); Settings.Secure.putStringForUser(mService.mContext.getContentResolver(), Settings.Secure.DISPLAY_DENSITY_FORCED, densityString, userId); } final DisplayInfo displayInfo = info; final SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getOverrideSettings(displayInfo); mSettingsProvider.getOverrideSettings(info); overrideSettings.mForcedDensity = density; mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); mSettingsProvider.updateOverrideSettings(info, overrideSettings); } void setForcedScalingMode(DisplayContent displayContent, @ForceScalingMode int mode) { void setForcedScalingMode(@NonNull DisplayContent displayContent, @ForceScalingMode int mode) { if (displayContent.isDefaultDisplay) { Settings.Global.putInt(mService.mContext.getContentResolver(), Settings.Global.DISPLAY_SCALING_FORCE, mode); Loading @@ -104,7 +109,7 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } void setFixedToUserRotation(DisplayContent displayContent, int fixedToUserRotation) { void setFixedToUserRotation(@NonNull DisplayContent displayContent, int fixedToUserRotation) { final DisplayInfo displayInfo = displayContent.getDisplayInfo(); final SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getOverrideSettings(displayInfo); Loading @@ -112,8 +117,8 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } void setIgnoreOrientationRequest( DisplayContent displayContent, boolean ignoreOrientationRequest) { void setIgnoreOrientationRequest(@NonNull DisplayContent displayContent, boolean ignoreOrientationRequest) { final DisplayInfo displayInfo = displayContent.getDisplayInfo(); final SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getOverrideSettings(displayInfo); Loading @@ -121,7 +126,9 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } private int getWindowingModeLocked(SettingsProvider.SettingsEntry settings, DisplayContent dc) { @WindowConfiguration.WindowingMode private int getWindowingModeLocked(@NonNull SettingsProvider.SettingsEntry settings, @NonNull DisplayContent dc) { int windowingMode = settings.mWindowingMode; // This display used to be in freeform, but we don't support freeform anymore, so fall // back to fullscreen. Loading @@ -139,13 +146,15 @@ class DisplayWindowSettings { return windowingMode; } int getWindowingModeLocked(DisplayContent dc) { @WindowConfiguration.WindowingMode int getWindowingModeLocked(@NonNull DisplayContent dc) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo); return getWindowingModeLocked(settings, dc); } void setWindowingModeLocked(DisplayContent dc, int mode) { void setWindowingModeLocked(@NonNull DisplayContent dc, @WindowConfiguration.WindowingMode int mode) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getOverrideSettings(displayInfo); Loading @@ -157,7 +166,8 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } int getRemoveContentModeLocked(DisplayContent dc) { @WindowManager.RemoveContentMode int getRemoveContentModeLocked(@NonNull DisplayContent dc) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo); if (settings.mRemoveContentMode == REMOVE_CONTENT_MODE_UNDEFINED) { Loading @@ -171,7 +181,8 @@ class DisplayWindowSettings { return settings.mRemoveContentMode; } void setRemoveContentModeLocked(DisplayContent dc, int mode) { void setRemoveContentModeLocked(@NonNull DisplayContent dc, @WindowManager.RemoveContentMode int mode) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getOverrideSettings(displayInfo); Loading @@ -179,14 +190,14 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } boolean shouldShowWithInsecureKeyguardLocked(DisplayContent dc) { boolean shouldShowWithInsecureKeyguardLocked(@NonNull DisplayContent dc) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo); return settings.mShouldShowWithInsecureKeyguard != null ? settings.mShouldShowWithInsecureKeyguard : false; } void setShouldShowWithInsecureKeyguardLocked(DisplayContent dc, boolean shouldShow) { void setShouldShowWithInsecureKeyguardLocked(@NonNull DisplayContent dc, boolean shouldShow) { if (!dc.isPrivate() && shouldShow) { throw new IllegalArgumentException("Public display can't be allowed to show content" + " when locked"); Loading @@ -199,7 +210,7 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } void setDontMoveToTop(DisplayContent dc, boolean dontMoveToTop) { void setDontMoveToTop(@NonNull DisplayContent dc, boolean dontMoveToTop) { DisplayInfo displayInfo = dc.getDisplayInfo(); SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getSettings(displayInfo); Loading @@ -207,7 +218,7 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } boolean shouldShowSystemDecorsLocked(DisplayContent dc) { boolean shouldShowSystemDecorsLocked(@NonNull DisplayContent dc) { if (dc.getDisplayId() == Display.DEFAULT_DISPLAY) { // Default display should show system decors. return true; Loading @@ -218,7 +229,7 @@ class DisplayWindowSettings { return settings.mShouldShowSystemDecors != null ? settings.mShouldShowSystemDecors : false; } void setShouldShowSystemDecorsLocked(DisplayContent dc, boolean shouldShow) { void setShouldShowSystemDecorsLocked(@NonNull DisplayContent dc, boolean shouldShow) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getOverrideSettings(displayInfo); Loading @@ -226,7 +237,8 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } @DisplayImePolicy int getImePolicyLocked(DisplayContent dc) { @DisplayImePolicy int getImePolicyLocked(@NonNull DisplayContent dc) { if (dc.getDisplayId() == Display.DEFAULT_DISPLAY) { // Default display should show IME. return DISPLAY_IME_POLICY_LOCAL; Loading @@ -238,7 +250,7 @@ class DisplayWindowSettings { : DISPLAY_IME_POLICY_FALLBACK_DISPLAY; } void setDisplayImePolicy(DisplayContent dc, @DisplayImePolicy int imePolicy) { void setDisplayImePolicy(@NonNull DisplayContent dc, @DisplayImePolicy int imePolicy) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getOverrideSettings(displayInfo); Loading @@ -246,11 +258,11 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } void applySettingsToDisplayLocked(DisplayContent dc) { void applySettingsToDisplayLocked(@NonNull DisplayContent dc) { applySettingsToDisplayLocked(dc, /* includeRotationSettings */ true); } void applySettingsToDisplayLocked(DisplayContent dc, boolean includeRotationSettings) { void applySettingsToDisplayLocked(@NonNull DisplayContent dc, boolean includeRotationSettings) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo); Loading @@ -274,9 +286,8 @@ class DisplayWindowSettings { dc.mIsDensityForced = hasDensityOverride; dc.mIsSizeForced = hasSizeOverride; final boolean ignoreDisplayCutout = settings.mIgnoreDisplayCutout != null dc.mIgnoreDisplayCutout = settings.mIgnoreDisplayCutout != null ? settings.mIgnoreDisplayCutout : false; dc.mIgnoreDisplayCutout = ignoreDisplayCutout; final int width = hasSizeOverride ? settings.mForcedWidth : dc.mInitialDisplayWidth; final int height = hasSizeOverride ? settings.mForcedHeight : dc.mInitialDisplayHeight; Loading @@ -296,7 +307,7 @@ class DisplayWindowSettings { if (includeRotationSettings) applyRotationSettingsToDisplayLocked(dc); } void applyRotationSettingsToDisplayLocked(DisplayContent dc) { void applyRotationSettingsToDisplayLocked(@NonNull DisplayContent dc) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo); Loading @@ -315,7 +326,7 @@ class DisplayWindowSettings { * @return {@code true} if any settings for this display has changed; {@code false} if nothing * changed. */ boolean updateSettingsForDisplay(DisplayContent dc) { boolean updateSettingsForDisplay(@NonNull DisplayContent dc) { final TaskDisplayArea defaultTda = dc.getDefaultTaskDisplayArea(); if (defaultTda != null && defaultTda.getWindowingMode() != getWindowingModeLocked(dc)) { // For the time being the only thing that may change is windowing mode, so just update Loading @@ -326,6 +337,13 @@ class DisplayWindowSettings { return false; } /** * Called when the given {@link DisplayContent} is removed to cleanup. */ void onDisplayRemoved(@NonNull DisplayContent dc) { mSettingsProvider.onDisplayRemoved(dc.getDisplayInfo()); } /** * Provides the functionality to lookup the {@link SettingsEntry settings} for a given * {@link DisplayInfo}. Loading Loading @@ -363,20 +381,30 @@ class DisplayWindowSettings { */ void updateOverrideSettings(@NonNull DisplayInfo info, @NonNull SettingsEntry overrides); /** * Called when a display is removed to cleanup. */ void onDisplayRemoved(@NonNull DisplayInfo info); /** * Settings for a display. */ class SettingsEntry { @WindowConfiguration.WindowingMode int mWindowingMode = WindowConfiguration.WINDOWING_MODE_UNDEFINED; @Nullable @WindowManagerPolicy.UserRotationMode Integer mUserRotationMode; @Nullable @Surface.Rotation Integer mUserRotation; int mForcedWidth; int mForcedHeight; int mForcedDensity; @Nullable @ForceScalingMode Integer mForcedScalingMode; @WindowManager.RemoveContentMode int mRemoveContentMode = REMOVE_CONTENT_MODE_UNDEFINED; @Nullable Boolean mShouldShowWithInsecureKeyguard; Loading @@ -395,7 +423,7 @@ class DisplayWindowSettings { SettingsEntry() {} SettingsEntry(SettingsEntry copyFrom) { SettingsEntry(@NonNull SettingsEntry copyFrom) { setTo(copyFrom); } Loading services/core/java/com/android/server/wm/DisplayWindowSettingsProvider.java +71 −22 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.wm; import static android.view.Display.TYPE_VIRTUAL; import static android.view.WindowManager.DISPLAY_IME_POLICY_FALLBACK_DISPLAY; import static android.view.WindowManager.DISPLAY_IME_POLICY_LOCAL; import static android.view.WindowManager.REMOVE_CONTENT_MODE_UNDEFINED; Loading @@ -28,6 +29,8 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.WindowConfiguration; import android.os.Environment; import android.util.ArrayMap; import android.util.ArraySet; import android.util.AtomicFile; import android.util.Slog; import android.util.Xml; Loading @@ -49,7 +52,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; /** Loading Loading @@ -86,7 +88,9 @@ class DisplayWindowSettingsProvider implements SettingsProvider { void finishWrite(OutputStream os, boolean success); } @NonNull private ReadableSettings mBaseSettings; @NonNull private final WritableSettings mOverrideSettings; DisplayWindowSettingsProvider() { Loading Loading @@ -155,6 +159,16 @@ class DisplayWindowSettingsProvider implements SettingsProvider { mOverrideSettings.updateSettingsEntry(info, overrides); } @Override public void onDisplayRemoved(@NonNull DisplayInfo info) { mOverrideSettings.onDisplayRemoved(info); } @VisibleForTesting int getOverrideSettingsSize() { return mOverrideSettings.mSettings.size(); } /** * Class that allows reading {@link SettingsEntry entries} from a * {@link ReadableSettingsStorage}. Loading @@ -168,14 +182,15 @@ class DisplayWindowSettingsProvider implements SettingsProvider { */ @DisplayIdentifierType protected int mIdentifierType; protected final Map<String, SettingsEntry> mSettings = new HashMap<>(); @NonNull protected final ArrayMap<String, SettingsEntry> mSettings = new ArrayMap<>(); ReadableSettings(ReadableSettingsStorage settingsStorage) { ReadableSettings(@NonNull ReadableSettingsStorage settingsStorage) { loadSettings(settingsStorage); } @Nullable final SettingsEntry getSettingsEntry(DisplayInfo info) { final SettingsEntry getSettingsEntry(@NonNull DisplayInfo info) { final String identifier = getIdentifier(info); SettingsEntry settings; // Try to get corresponding settings using preferred identifier for the current config. Loading @@ -193,7 +208,8 @@ class DisplayWindowSettingsProvider implements SettingsProvider { } /** Gets the identifier of choice for the current config. */ protected final String getIdentifier(DisplayInfo displayInfo) { @NonNull protected final String getIdentifier(@NonNull DisplayInfo displayInfo) { if (mIdentifierType == IDENTIFIER_PORT && displayInfo.address != null) { // Config suggests using port as identifier for physical displays. if (displayInfo.address instanceof DisplayAddress.Physical) { Loading @@ -203,7 +219,7 @@ class DisplayWindowSettingsProvider implements SettingsProvider { return displayInfo.uniqueId; } private void loadSettings(ReadableSettingsStorage settingsStorage) { private void loadSettings(@NonNull ReadableSettingsStorage settingsStorage) { FileData fileData = readSettings(settingsStorage); if (fileData != null) { mIdentifierType = fileData.mIdentifierType; Loading @@ -217,15 +233,18 @@ class DisplayWindowSettingsProvider implements SettingsProvider { * {@link WritableSettingsStorage}. */ private static final class WritableSettings extends ReadableSettings { @NonNull private final WritableSettingsStorage mSettingsStorage; @NonNull private final ArraySet<String> mVirtualDisplayIdentifiers = new ArraySet<>(); WritableSettings(WritableSettingsStorage settingsStorage) { WritableSettings(@NonNull WritableSettingsStorage settingsStorage) { super(settingsStorage); mSettingsStorage = settingsStorage; } @NonNull SettingsEntry getOrCreateSettingsEntry(DisplayInfo info) { SettingsEntry getOrCreateSettingsEntry(@NonNull DisplayInfo info) { final String identifier = getIdentifier(info); SettingsEntry settings; // Try to get corresponding settings using preferred identifier for the current config. Loading @@ -243,21 +262,47 @@ class DisplayWindowSettingsProvider implements SettingsProvider { settings = new SettingsEntry(); mSettings.put(identifier, settings); if (info.type == TYPE_VIRTUAL) { // Keep track of virtual display. We don't want to write virtual display settings to // file. mVirtualDisplayIdentifiers.add(identifier); } return settings; } void updateSettingsEntry(DisplayInfo info, SettingsEntry settings) { void updateSettingsEntry(@NonNull DisplayInfo info, @NonNull SettingsEntry settings) { final SettingsEntry overrideSettings = getOrCreateSettingsEntry(info); final boolean changed = overrideSettings.setTo(settings); if (changed) { if (changed && info.type != TYPE_VIRTUAL) { writeSettings(); } } void onDisplayRemoved(@NonNull DisplayInfo info) { final String identifier = getIdentifier(info); if (!mSettings.containsKey(identifier)) { return; } if (mVirtualDisplayIdentifiers.remove(identifier) || mSettings.get(identifier).isEmpty()) { // Don't keep track of virtual display or empty settings to avoid growing the cached // map. mSettings.remove(identifier); } } private void writeSettings() { FileData fileData = new FileData(); final FileData fileData = new FileData(); fileData.mIdentifierType = mIdentifierType; fileData.mSettings.putAll(mSettings); final int size = mSettings.size(); for (int i = 0; i < size; i++) { final String identifier = mSettings.keyAt(i); if (mVirtualDisplayIdentifiers.contains(identifier)) { // Do not write virtual display settings to file. continue; } fileData.mSettings.put(identifier, mSettings.get(identifier)); } DisplayWindowSettingsProvider.writeSettings(mSettingsStorage, fileData); } } Loading @@ -283,7 +328,7 @@ class DisplayWindowSettingsProvider implements SettingsProvider { } @Nullable private static FileData readSettings(ReadableSettingsStorage storage) { private static FileData readSettings(@NonNull ReadableSettingsStorage storage) { InputStream stream; try { stream = storage.openRead(); Loading Loading @@ -348,13 +393,14 @@ class DisplayWindowSettingsProvider implements SettingsProvider { return fileData; } private static int getIntAttribute(TypedXmlPullParser parser, String name, int defaultValue) { private static int getIntAttribute(@NonNull TypedXmlPullParser parser, @NonNull String name, int defaultValue) { return parser.getAttributeInt(null, name, defaultValue); } @Nullable private static Integer getIntegerAttribute(TypedXmlPullParser parser, String name, @Nullable Integer defaultValue) { private static Integer getIntegerAttribute(@NonNull TypedXmlPullParser parser, @NonNull String name, @Nullable Integer defaultValue) { try { return parser.getAttributeInt(null, name); } catch (Exception ignored) { Loading @@ -363,8 +409,8 @@ class DisplayWindowSettingsProvider implements SettingsProvider { } @Nullable private static Boolean getBooleanAttribute(TypedXmlPullParser parser, String name, @Nullable Boolean defaultValue) { private static Boolean getBooleanAttribute(@NonNull TypedXmlPullParser parser, @NonNull String name, @Nullable Boolean defaultValue) { try { return parser.getAttributeBoolean(null, name); } catch (Exception ignored) { Loading @@ -372,7 +418,7 @@ class DisplayWindowSettingsProvider implements SettingsProvider { } } private static void readDisplay(TypedXmlPullParser parser, FileData fileData) private static void readDisplay(@NonNull TypedXmlPullParser parser, @NonNull FileData fileData) throws NumberFormatException, XmlPullParserException, IOException { String name = parser.getAttributeValue(null, "name"); if (name != null) { Loading Loading @@ -420,7 +466,7 @@ class DisplayWindowSettingsProvider implements SettingsProvider { XmlUtils.skipCurrentTag(parser); } private static void readConfig(TypedXmlPullParser parser, FileData fileData) private static void readConfig(@NonNull TypedXmlPullParser parser, @NonNull FileData fileData) throws NumberFormatException, XmlPullParserException, IOException { fileData.mIdentifierType = getIntAttribute(parser, "identifier", Loading @@ -428,7 +474,8 @@ class DisplayWindowSettingsProvider implements SettingsProvider { XmlUtils.skipCurrentTag(parser); } private static void writeSettings(WritableSettingsStorage storage, FileData data) { private static void writeSettings(@NonNull WritableSettingsStorage storage, @NonNull FileData data) { OutputStream stream; try { stream = storage.startWrite(); Loading Loading @@ -525,7 +572,8 @@ class DisplayWindowSettingsProvider implements SettingsProvider { private static final class FileData { int mIdentifierType; final Map<String, SettingsEntry> mSettings = new HashMap<>(); @NonNull final Map<String, SettingsEntry> mSettings = new ArrayMap<>(); @Override public String toString() { Loading @@ -537,6 +585,7 @@ class DisplayWindowSettingsProvider implements SettingsProvider { } private static final class AtomicFileStorage implements WritableSettingsStorage { @NonNull private final AtomicFile mAtomicFile; AtomicFileStorage(@NonNull AtomicFile atomicFile) { Loading services/core/java/com/android/server/wm/WindowManagerService.java +2 −0 Original line number Diff line number Diff line Loading @@ -552,7 +552,9 @@ public class WindowManagerService extends IWindowManager.Stub final PackageManagerInternal mPmInternal; private final TestUtilityService mTestUtilityService; @NonNull final DisplayWindowSettingsProvider mDisplayWindowSettingsProvider; @NonNull final DisplayWindowSettings mDisplayWindowSettings; /** If the system should display notifications for apps displaying an alert window. */ Loading services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsProviderTests.java +66 −0 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
services/core/java/com/android/server/wm/DisplayContent.java +1 −1 Original line number Diff line number Diff line Loading @@ -522,7 +522,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp boolean mWaitingForConfig; // TODO(multi-display): remove some of the usages. @VisibleForTesting boolean isDefaultDisplay; /** Detect user tapping outside of current focused task bounds .*/ Loading Loading @@ -3358,6 +3357,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mRootWindowContainer.mTaskSupervisor .getKeyguardController().onDisplayRemoved(mDisplayId); mWallpaperController.resetLargestDisplay(mDisplay); mWmService.mDisplayWindowSettings.onDisplayRemoved(this); } finally { mDisplayReady = false; } Loading
services/core/java/com/android/server/wm/DisplayWindowSettings.java +58 −30 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.view.Display; import android.view.DisplayInfo; import android.view.IWindowManager; import android.view.Surface; import android.view.WindowManager; import android.view.WindowManager.DisplayImePolicy; import com.android.server.policy.WindowManagerPolicy; Loading @@ -45,15 +46,20 @@ import java.util.Objects; * delegates the persistence and lookup of settings values to the supplied {@link SettingsProvider}. */ class DisplayWindowSettings { @NonNull private final WindowManagerService mService; @NonNull private final SettingsProvider mSettingsProvider; DisplayWindowSettings(WindowManagerService service, SettingsProvider settingsProvider) { DisplayWindowSettings(@NonNull WindowManagerService service, @NonNull SettingsProvider settingsProvider) { mService = service; mSettingsProvider = settingsProvider; } void setUserRotation(DisplayContent displayContent, int rotationMode, int rotation) { void setUserRotation(@NonNull DisplayContent displayContent, @WindowManagerPolicy.UserRotationMode int rotationMode, @Surface.Rotation int rotation) { final DisplayInfo displayInfo = displayContent.getDisplayInfo(); final SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getOverrideSettings(displayInfo); Loading @@ -62,7 +68,7 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } void setForcedSize(DisplayContent displayContent, int width, int height) { void setForcedSize(@NonNull DisplayContent displayContent, int width, int height) { if (displayContent.isDefaultDisplay) { final String sizeString = (width == 0 || height == 0) ? "" : (width + "," + height); Settings.Global.putString(mService.mContext.getContentResolver(), Loading @@ -77,21 +83,20 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } void setForcedDensity(DisplayInfo info, int density, int userId) { void setForcedDensity(@NonNull DisplayInfo info, int density, int userId) { if (info.displayId == Display.DEFAULT_DISPLAY) { final String densityString = density == 0 ? "" : Integer.toString(density); Settings.Secure.putStringForUser(mService.mContext.getContentResolver(), Settings.Secure.DISPLAY_DENSITY_FORCED, densityString, userId); } final DisplayInfo displayInfo = info; final SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getOverrideSettings(displayInfo); mSettingsProvider.getOverrideSettings(info); overrideSettings.mForcedDensity = density; mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); mSettingsProvider.updateOverrideSettings(info, overrideSettings); } void setForcedScalingMode(DisplayContent displayContent, @ForceScalingMode int mode) { void setForcedScalingMode(@NonNull DisplayContent displayContent, @ForceScalingMode int mode) { if (displayContent.isDefaultDisplay) { Settings.Global.putInt(mService.mContext.getContentResolver(), Settings.Global.DISPLAY_SCALING_FORCE, mode); Loading @@ -104,7 +109,7 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } void setFixedToUserRotation(DisplayContent displayContent, int fixedToUserRotation) { void setFixedToUserRotation(@NonNull DisplayContent displayContent, int fixedToUserRotation) { final DisplayInfo displayInfo = displayContent.getDisplayInfo(); final SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getOverrideSettings(displayInfo); Loading @@ -112,8 +117,8 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } void setIgnoreOrientationRequest( DisplayContent displayContent, boolean ignoreOrientationRequest) { void setIgnoreOrientationRequest(@NonNull DisplayContent displayContent, boolean ignoreOrientationRequest) { final DisplayInfo displayInfo = displayContent.getDisplayInfo(); final SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getOverrideSettings(displayInfo); Loading @@ -121,7 +126,9 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } private int getWindowingModeLocked(SettingsProvider.SettingsEntry settings, DisplayContent dc) { @WindowConfiguration.WindowingMode private int getWindowingModeLocked(@NonNull SettingsProvider.SettingsEntry settings, @NonNull DisplayContent dc) { int windowingMode = settings.mWindowingMode; // This display used to be in freeform, but we don't support freeform anymore, so fall // back to fullscreen. Loading @@ -139,13 +146,15 @@ class DisplayWindowSettings { return windowingMode; } int getWindowingModeLocked(DisplayContent dc) { @WindowConfiguration.WindowingMode int getWindowingModeLocked(@NonNull DisplayContent dc) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo); return getWindowingModeLocked(settings, dc); } void setWindowingModeLocked(DisplayContent dc, int mode) { void setWindowingModeLocked(@NonNull DisplayContent dc, @WindowConfiguration.WindowingMode int mode) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getOverrideSettings(displayInfo); Loading @@ -157,7 +166,8 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } int getRemoveContentModeLocked(DisplayContent dc) { @WindowManager.RemoveContentMode int getRemoveContentModeLocked(@NonNull DisplayContent dc) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo); if (settings.mRemoveContentMode == REMOVE_CONTENT_MODE_UNDEFINED) { Loading @@ -171,7 +181,8 @@ class DisplayWindowSettings { return settings.mRemoveContentMode; } void setRemoveContentModeLocked(DisplayContent dc, int mode) { void setRemoveContentModeLocked(@NonNull DisplayContent dc, @WindowManager.RemoveContentMode int mode) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getOverrideSettings(displayInfo); Loading @@ -179,14 +190,14 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } boolean shouldShowWithInsecureKeyguardLocked(DisplayContent dc) { boolean shouldShowWithInsecureKeyguardLocked(@NonNull DisplayContent dc) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo); return settings.mShouldShowWithInsecureKeyguard != null ? settings.mShouldShowWithInsecureKeyguard : false; } void setShouldShowWithInsecureKeyguardLocked(DisplayContent dc, boolean shouldShow) { void setShouldShowWithInsecureKeyguardLocked(@NonNull DisplayContent dc, boolean shouldShow) { if (!dc.isPrivate() && shouldShow) { throw new IllegalArgumentException("Public display can't be allowed to show content" + " when locked"); Loading @@ -199,7 +210,7 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } void setDontMoveToTop(DisplayContent dc, boolean dontMoveToTop) { void setDontMoveToTop(@NonNull DisplayContent dc, boolean dontMoveToTop) { DisplayInfo displayInfo = dc.getDisplayInfo(); SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getSettings(displayInfo); Loading @@ -207,7 +218,7 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } boolean shouldShowSystemDecorsLocked(DisplayContent dc) { boolean shouldShowSystemDecorsLocked(@NonNull DisplayContent dc) { if (dc.getDisplayId() == Display.DEFAULT_DISPLAY) { // Default display should show system decors. return true; Loading @@ -218,7 +229,7 @@ class DisplayWindowSettings { return settings.mShouldShowSystemDecors != null ? settings.mShouldShowSystemDecors : false; } void setShouldShowSystemDecorsLocked(DisplayContent dc, boolean shouldShow) { void setShouldShowSystemDecorsLocked(@NonNull DisplayContent dc, boolean shouldShow) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getOverrideSettings(displayInfo); Loading @@ -226,7 +237,8 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } @DisplayImePolicy int getImePolicyLocked(DisplayContent dc) { @DisplayImePolicy int getImePolicyLocked(@NonNull DisplayContent dc) { if (dc.getDisplayId() == Display.DEFAULT_DISPLAY) { // Default display should show IME. return DISPLAY_IME_POLICY_LOCAL; Loading @@ -238,7 +250,7 @@ class DisplayWindowSettings { : DISPLAY_IME_POLICY_FALLBACK_DISPLAY; } void setDisplayImePolicy(DisplayContent dc, @DisplayImePolicy int imePolicy) { void setDisplayImePolicy(@NonNull DisplayContent dc, @DisplayImePolicy int imePolicy) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry overrideSettings = mSettingsProvider.getOverrideSettings(displayInfo); Loading @@ -246,11 +258,11 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } void applySettingsToDisplayLocked(DisplayContent dc) { void applySettingsToDisplayLocked(@NonNull DisplayContent dc) { applySettingsToDisplayLocked(dc, /* includeRotationSettings */ true); } void applySettingsToDisplayLocked(DisplayContent dc, boolean includeRotationSettings) { void applySettingsToDisplayLocked(@NonNull DisplayContent dc, boolean includeRotationSettings) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo); Loading @@ -274,9 +286,8 @@ class DisplayWindowSettings { dc.mIsDensityForced = hasDensityOverride; dc.mIsSizeForced = hasSizeOverride; final boolean ignoreDisplayCutout = settings.mIgnoreDisplayCutout != null dc.mIgnoreDisplayCutout = settings.mIgnoreDisplayCutout != null ? settings.mIgnoreDisplayCutout : false; dc.mIgnoreDisplayCutout = ignoreDisplayCutout; final int width = hasSizeOverride ? settings.mForcedWidth : dc.mInitialDisplayWidth; final int height = hasSizeOverride ? settings.mForcedHeight : dc.mInitialDisplayHeight; Loading @@ -296,7 +307,7 @@ class DisplayWindowSettings { if (includeRotationSettings) applyRotationSettingsToDisplayLocked(dc); } void applyRotationSettingsToDisplayLocked(DisplayContent dc) { void applyRotationSettingsToDisplayLocked(@NonNull DisplayContent dc) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo); Loading @@ -315,7 +326,7 @@ class DisplayWindowSettings { * @return {@code true} if any settings for this display has changed; {@code false} if nothing * changed. */ boolean updateSettingsForDisplay(DisplayContent dc) { boolean updateSettingsForDisplay(@NonNull DisplayContent dc) { final TaskDisplayArea defaultTda = dc.getDefaultTaskDisplayArea(); if (defaultTda != null && defaultTda.getWindowingMode() != getWindowingModeLocked(dc)) { // For the time being the only thing that may change is windowing mode, so just update Loading @@ -326,6 +337,13 @@ class DisplayWindowSettings { return false; } /** * Called when the given {@link DisplayContent} is removed to cleanup. */ void onDisplayRemoved(@NonNull DisplayContent dc) { mSettingsProvider.onDisplayRemoved(dc.getDisplayInfo()); } /** * Provides the functionality to lookup the {@link SettingsEntry settings} for a given * {@link DisplayInfo}. Loading Loading @@ -363,20 +381,30 @@ class DisplayWindowSettings { */ void updateOverrideSettings(@NonNull DisplayInfo info, @NonNull SettingsEntry overrides); /** * Called when a display is removed to cleanup. */ void onDisplayRemoved(@NonNull DisplayInfo info); /** * Settings for a display. */ class SettingsEntry { @WindowConfiguration.WindowingMode int mWindowingMode = WindowConfiguration.WINDOWING_MODE_UNDEFINED; @Nullable @WindowManagerPolicy.UserRotationMode Integer mUserRotationMode; @Nullable @Surface.Rotation Integer mUserRotation; int mForcedWidth; int mForcedHeight; int mForcedDensity; @Nullable @ForceScalingMode Integer mForcedScalingMode; @WindowManager.RemoveContentMode int mRemoveContentMode = REMOVE_CONTENT_MODE_UNDEFINED; @Nullable Boolean mShouldShowWithInsecureKeyguard; Loading @@ -395,7 +423,7 @@ class DisplayWindowSettings { SettingsEntry() {} SettingsEntry(SettingsEntry copyFrom) { SettingsEntry(@NonNull SettingsEntry copyFrom) { setTo(copyFrom); } Loading
services/core/java/com/android/server/wm/DisplayWindowSettingsProvider.java +71 −22 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.wm; import static android.view.Display.TYPE_VIRTUAL; import static android.view.WindowManager.DISPLAY_IME_POLICY_FALLBACK_DISPLAY; import static android.view.WindowManager.DISPLAY_IME_POLICY_LOCAL; import static android.view.WindowManager.REMOVE_CONTENT_MODE_UNDEFINED; Loading @@ -28,6 +29,8 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.WindowConfiguration; import android.os.Environment; import android.util.ArrayMap; import android.util.ArraySet; import android.util.AtomicFile; import android.util.Slog; import android.util.Xml; Loading @@ -49,7 +52,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; /** Loading Loading @@ -86,7 +88,9 @@ class DisplayWindowSettingsProvider implements SettingsProvider { void finishWrite(OutputStream os, boolean success); } @NonNull private ReadableSettings mBaseSettings; @NonNull private final WritableSettings mOverrideSettings; DisplayWindowSettingsProvider() { Loading Loading @@ -155,6 +159,16 @@ class DisplayWindowSettingsProvider implements SettingsProvider { mOverrideSettings.updateSettingsEntry(info, overrides); } @Override public void onDisplayRemoved(@NonNull DisplayInfo info) { mOverrideSettings.onDisplayRemoved(info); } @VisibleForTesting int getOverrideSettingsSize() { return mOverrideSettings.mSettings.size(); } /** * Class that allows reading {@link SettingsEntry entries} from a * {@link ReadableSettingsStorage}. Loading @@ -168,14 +182,15 @@ class DisplayWindowSettingsProvider implements SettingsProvider { */ @DisplayIdentifierType protected int mIdentifierType; protected final Map<String, SettingsEntry> mSettings = new HashMap<>(); @NonNull protected final ArrayMap<String, SettingsEntry> mSettings = new ArrayMap<>(); ReadableSettings(ReadableSettingsStorage settingsStorage) { ReadableSettings(@NonNull ReadableSettingsStorage settingsStorage) { loadSettings(settingsStorage); } @Nullable final SettingsEntry getSettingsEntry(DisplayInfo info) { final SettingsEntry getSettingsEntry(@NonNull DisplayInfo info) { final String identifier = getIdentifier(info); SettingsEntry settings; // Try to get corresponding settings using preferred identifier for the current config. Loading @@ -193,7 +208,8 @@ class DisplayWindowSettingsProvider implements SettingsProvider { } /** Gets the identifier of choice for the current config. */ protected final String getIdentifier(DisplayInfo displayInfo) { @NonNull protected final String getIdentifier(@NonNull DisplayInfo displayInfo) { if (mIdentifierType == IDENTIFIER_PORT && displayInfo.address != null) { // Config suggests using port as identifier for physical displays. if (displayInfo.address instanceof DisplayAddress.Physical) { Loading @@ -203,7 +219,7 @@ class DisplayWindowSettingsProvider implements SettingsProvider { return displayInfo.uniqueId; } private void loadSettings(ReadableSettingsStorage settingsStorage) { private void loadSettings(@NonNull ReadableSettingsStorage settingsStorage) { FileData fileData = readSettings(settingsStorage); if (fileData != null) { mIdentifierType = fileData.mIdentifierType; Loading @@ -217,15 +233,18 @@ class DisplayWindowSettingsProvider implements SettingsProvider { * {@link WritableSettingsStorage}. */ private static final class WritableSettings extends ReadableSettings { @NonNull private final WritableSettingsStorage mSettingsStorage; @NonNull private final ArraySet<String> mVirtualDisplayIdentifiers = new ArraySet<>(); WritableSettings(WritableSettingsStorage settingsStorage) { WritableSettings(@NonNull WritableSettingsStorage settingsStorage) { super(settingsStorage); mSettingsStorage = settingsStorage; } @NonNull SettingsEntry getOrCreateSettingsEntry(DisplayInfo info) { SettingsEntry getOrCreateSettingsEntry(@NonNull DisplayInfo info) { final String identifier = getIdentifier(info); SettingsEntry settings; // Try to get corresponding settings using preferred identifier for the current config. Loading @@ -243,21 +262,47 @@ class DisplayWindowSettingsProvider implements SettingsProvider { settings = new SettingsEntry(); mSettings.put(identifier, settings); if (info.type == TYPE_VIRTUAL) { // Keep track of virtual display. We don't want to write virtual display settings to // file. mVirtualDisplayIdentifiers.add(identifier); } return settings; } void updateSettingsEntry(DisplayInfo info, SettingsEntry settings) { void updateSettingsEntry(@NonNull DisplayInfo info, @NonNull SettingsEntry settings) { final SettingsEntry overrideSettings = getOrCreateSettingsEntry(info); final boolean changed = overrideSettings.setTo(settings); if (changed) { if (changed && info.type != TYPE_VIRTUAL) { writeSettings(); } } void onDisplayRemoved(@NonNull DisplayInfo info) { final String identifier = getIdentifier(info); if (!mSettings.containsKey(identifier)) { return; } if (mVirtualDisplayIdentifiers.remove(identifier) || mSettings.get(identifier).isEmpty()) { // Don't keep track of virtual display or empty settings to avoid growing the cached // map. mSettings.remove(identifier); } } private void writeSettings() { FileData fileData = new FileData(); final FileData fileData = new FileData(); fileData.mIdentifierType = mIdentifierType; fileData.mSettings.putAll(mSettings); final int size = mSettings.size(); for (int i = 0; i < size; i++) { final String identifier = mSettings.keyAt(i); if (mVirtualDisplayIdentifiers.contains(identifier)) { // Do not write virtual display settings to file. continue; } fileData.mSettings.put(identifier, mSettings.get(identifier)); } DisplayWindowSettingsProvider.writeSettings(mSettingsStorage, fileData); } } Loading @@ -283,7 +328,7 @@ class DisplayWindowSettingsProvider implements SettingsProvider { } @Nullable private static FileData readSettings(ReadableSettingsStorage storage) { private static FileData readSettings(@NonNull ReadableSettingsStorage storage) { InputStream stream; try { stream = storage.openRead(); Loading Loading @@ -348,13 +393,14 @@ class DisplayWindowSettingsProvider implements SettingsProvider { return fileData; } private static int getIntAttribute(TypedXmlPullParser parser, String name, int defaultValue) { private static int getIntAttribute(@NonNull TypedXmlPullParser parser, @NonNull String name, int defaultValue) { return parser.getAttributeInt(null, name, defaultValue); } @Nullable private static Integer getIntegerAttribute(TypedXmlPullParser parser, String name, @Nullable Integer defaultValue) { private static Integer getIntegerAttribute(@NonNull TypedXmlPullParser parser, @NonNull String name, @Nullable Integer defaultValue) { try { return parser.getAttributeInt(null, name); } catch (Exception ignored) { Loading @@ -363,8 +409,8 @@ class DisplayWindowSettingsProvider implements SettingsProvider { } @Nullable private static Boolean getBooleanAttribute(TypedXmlPullParser parser, String name, @Nullable Boolean defaultValue) { private static Boolean getBooleanAttribute(@NonNull TypedXmlPullParser parser, @NonNull String name, @Nullable Boolean defaultValue) { try { return parser.getAttributeBoolean(null, name); } catch (Exception ignored) { Loading @@ -372,7 +418,7 @@ class DisplayWindowSettingsProvider implements SettingsProvider { } } private static void readDisplay(TypedXmlPullParser parser, FileData fileData) private static void readDisplay(@NonNull TypedXmlPullParser parser, @NonNull FileData fileData) throws NumberFormatException, XmlPullParserException, IOException { String name = parser.getAttributeValue(null, "name"); if (name != null) { Loading Loading @@ -420,7 +466,7 @@ class DisplayWindowSettingsProvider implements SettingsProvider { XmlUtils.skipCurrentTag(parser); } private static void readConfig(TypedXmlPullParser parser, FileData fileData) private static void readConfig(@NonNull TypedXmlPullParser parser, @NonNull FileData fileData) throws NumberFormatException, XmlPullParserException, IOException { fileData.mIdentifierType = getIntAttribute(parser, "identifier", Loading @@ -428,7 +474,8 @@ class DisplayWindowSettingsProvider implements SettingsProvider { XmlUtils.skipCurrentTag(parser); } private static void writeSettings(WritableSettingsStorage storage, FileData data) { private static void writeSettings(@NonNull WritableSettingsStorage storage, @NonNull FileData data) { OutputStream stream; try { stream = storage.startWrite(); Loading Loading @@ -525,7 +572,8 @@ class DisplayWindowSettingsProvider implements SettingsProvider { private static final class FileData { int mIdentifierType; final Map<String, SettingsEntry> mSettings = new HashMap<>(); @NonNull final Map<String, SettingsEntry> mSettings = new ArrayMap<>(); @Override public String toString() { Loading @@ -537,6 +585,7 @@ class DisplayWindowSettingsProvider implements SettingsProvider { } private static final class AtomicFileStorage implements WritableSettingsStorage { @NonNull private final AtomicFile mAtomicFile; AtomicFileStorage(@NonNull AtomicFile atomicFile) { Loading
services/core/java/com/android/server/wm/WindowManagerService.java +2 −0 Original line number Diff line number Diff line Loading @@ -552,7 +552,9 @@ public class WindowManagerService extends IWindowManager.Stub final PackageManagerInternal mPmInternal; private final TestUtilityService mTestUtilityService; @NonNull final DisplayWindowSettingsProvider mDisplayWindowSettingsProvider; @NonNull final DisplayWindowSettings mDisplayWindowSettings; /** If the system should display notifications for apps displaying an alert window. */ Loading
services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsProviderTests.java +66 −0 File changed.Preview size limit exceeded, changes collapsed. Show changes