Merge "Keep initial override configuration from display settings"
diff --git a/services/core/java/com/android/server/wm/ActivityDisplay.java b/services/core/java/com/android/server/wm/ActivityDisplay.java
index 33584d4..84750b3 100644
--- a/services/core/java/com/android/server/wm/ActivityDisplay.java
+++ b/services/core/java/com/android/server/wm/ActivityDisplay.java
@@ -181,6 +181,11 @@
         mWindowContainerController.onDisplayChanged();
     }
 
+    @Override
+    public void onInitializeOverrideConfiguration(Configuration config) {
+        getOverrideConfiguration().updateFrom(config);
+    }
+
     void addChild(ActivityStack stack, int position) {
         if (position == POSITION_BOTTOM) {
             position = 0;
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index c2bc677..80d1368 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -233,6 +233,7 @@
         final DisplayContent existing = getDisplayContent(displayId);
 
         if (existing != null) {
+            initializeDisplayOverrideConfiguration(controller, existing);
             existing.setController(controller);
             return existing;
         }
@@ -242,6 +243,7 @@
         if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Adding display=" + display);
 
         mService.mDisplayWindowSettings.applySettingsToDisplayLocked(dc);
+        initializeDisplayOverrideConfiguration(controller, dc);
 
         if (mService.mDisplayManagerInternal != null) {
             mService.mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager(
@@ -254,6 +256,19 @@
         return dc;
     }
 
+    /**
+     * The display content may have configuration set from {@link #DisplayWindowSettings}. This
+     * callback let the owner of container know there is existing configuration to prevent the
+     * values from being replaced by the initializing {@link #ActivityDisplay}.
+     */
+    private void initializeDisplayOverrideConfiguration(DisplayWindowController controller,
+            DisplayContent displayContent) {
+        if (controller != null && controller.mListener != null) {
+            controller.mListener.onInitializeOverrideConfiguration(
+                    displayContent.getOverrideConfiguration());
+        }
+    }
+
     boolean isLayoutNeeded() {
         final int numDisplays = mChildren.size();
         for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
diff --git a/services/core/java/com/android/server/wm/WindowContainerListener.java b/services/core/java/com/android/server/wm/WindowContainerListener.java
index 4b3cd36..3d3d2e0 100644
--- a/services/core/java/com/android/server/wm/WindowContainerListener.java
+++ b/services/core/java/com/android/server/wm/WindowContainerListener.java
@@ -16,6 +16,8 @@
 
 package com.android.server.wm;
 
+import android.content.res.Configuration;
+
 /**
  * Interface used by the owner/creator of the container to listen to changes with the container.
  * @see WindowContainerController
@@ -23,4 +25,5 @@
 public interface WindowContainerListener {
     void registerConfigurationChangeListener(ConfigurationContainerListener listener);
     void unregisterConfigurationChangeListener(ConfigurationContainerListener listener);
+    default void onInitializeOverrideConfiguration(Configuration config) {}
 }