OSDN Git Service

Make usage of Configuration.EMPTY safe
authorAndrii Kulian <akulian@google.com>
Fri, 14 Oct 2016 18:00:13 +0000 (11:00 -0700)
committerAndrii Kulian <akulian@google.com>
Fri, 14 Oct 2016 18:00:13 +0000 (11:00 -0700)
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
core/java/android/view/DisplayAdjustments.java
services/core/java/com/android/server/am/TaskRecord.java
services/core/java/com/android/server/policy/PhoneWindowManager.java

index 64b6bf1..b03ed1e 100644 (file)
@@ -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;
index dd86062..790029b 100644 (file)
@@ -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() {
index 7762697..77d0db3 100644 (file)
@@ -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;
     }
 
     /**
index 1c00cc3..577ca10 100644 (file)
@@ -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);