From a8a9bc5860c5d6139366f01b2f66e3f592da92e1 Mon Sep 17 00:00:00 2001 From: Andrii Kulian Date: Fri, 14 Oct 2016 11:00:13 -0700 Subject: [PATCH] Make usage of Configuration.EMPTY safe With current approach there is a high chance of making a programming error and altering the state of singleton Configuration.EMPTY object, because previously configuration was usually set by link to it. This CL changes the behavior to create Configuration member objects only once and alter their state afterwards. Test: Manual and existing tests still pass. Change-Id: Ie267c2fbf555f137670b7bd2cd251b817c69bc8e --- core/java/android/content/res/ResourcesKey.java | 3 ++- core/java/android/view/DisplayAdjustments.java | 10 ++++++---- .../core/java/com/android/server/am/TaskRecord.java | 5 ++--- .../com/android/server/policy/PhoneWindowManager.java | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/core/java/android/content/res/ResourcesKey.java b/core/java/android/content/res/ResourcesKey.java index 64b6bf1b6dcd3..b03ed1eee7685 100644 --- a/core/java/android/content/res/ResourcesKey.java +++ b/core/java/android/content/res/ResourcesKey.java @@ -59,7 +59,8 @@ public final class ResourcesKey { mOverlayDirs = overlayDirs; mLibDirs = libDirs; mDisplayId = displayId; - mOverrideConfiguration = overrideConfig != null ? overrideConfig : Configuration.EMPTY; + mOverrideConfiguration = new Configuration(overrideConfig != null + ? overrideConfig : Configuration.EMPTY); mCompatInfo = compatInfo != null ? compatInfo : CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO; int hash = 17; diff --git a/core/java/android/view/DisplayAdjustments.java b/core/java/android/view/DisplayAdjustments.java index dd86062f2d1d2..790029b9c09f8 100644 --- a/core/java/android/view/DisplayAdjustments.java +++ b/core/java/android/view/DisplayAdjustments.java @@ -26,18 +26,20 @@ public class DisplayAdjustments { public static final DisplayAdjustments DEFAULT_DISPLAY_ADJUSTMENTS = new DisplayAdjustments(); private volatile CompatibilityInfo mCompatInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO; - private Configuration mConfiguration = Configuration.EMPTY; + private Configuration mConfiguration; public DisplayAdjustments() { } public DisplayAdjustments(Configuration configuration) { - mConfiguration = configuration; + mConfiguration = new Configuration(configuration != null + ? configuration : Configuration.EMPTY); } public DisplayAdjustments(DisplayAdjustments daj) { setCompatibilityInfo(daj.mCompatInfo); - mConfiguration = daj.mConfiguration; + mConfiguration = new Configuration(daj.mConfiguration != null + ? daj.mConfiguration : Configuration.EMPTY); } public void setCompatibilityInfo(CompatibilityInfo compatInfo) { @@ -62,7 +64,7 @@ public class DisplayAdjustments { throw new IllegalArgumentException( "setConfiguration: Cannot modify DEFAULT_DISPLAY_ADJUSTMENTS"); } - mConfiguration = configuration != null ? configuration : Configuration.EMPTY; + mConfiguration.setTo(configuration != null ? configuration : Configuration.EMPTY); } public Configuration getConfiguration() { diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index 77626975c385b..77d0db3bff246 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -1558,8 +1558,8 @@ final class TaskRecord extends ConfigurationContainer { } /** Clears passed config and fills it with new override values. */ - private Configuration calculateOverrideConfig(Configuration config, Rect bounds, - Rect insetBounds, boolean overrideWidth, boolean overrideHeight) { + private void calculateOverrideConfig(Configuration config, Rect bounds, Rect insetBounds, + boolean overrideWidth, boolean overrideHeight) { mTmpNonDecorBounds.set(bounds); mTmpStableBounds.set(bounds); subtractNonDecorInsets( @@ -1599,7 +1599,6 @@ final class TaskRecord extends ConfigurationContainer { config.smallestScreenWidthDp = mService.mWindowManager.getSmallestWidthForTaskBounds( insetBounds != null ? insetBounds : bounds); - return config; } /** diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 1c00cc36f34b3..577ca10a49055 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2734,7 +2734,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } - if (overrideConfig != null && overrideConfig != EMPTY) { + if (overrideConfig != null && !overrideConfig.equals(EMPTY)) { if (DEBUG_STARTING_WINDOW) Slog.d(TAG, "addStartingWindow: creating context based" + " on overrideConfig" + overrideConfig + " for starting window"); final Context overrideContext = context.createConfigurationContext(overrideConfig);