From a75a9458e07ad65a767651d34298e7ac37941248 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Fri, 23 Nov 2018 20:12:31 +0800 Subject: [PATCH] Keep initial override configuration from display settings During register configuration change listener, the override configuration will update from the container to listener. When linking ActivityDisplay to an existing DisplayConent, the empty configuration will replace the applied override configuration which should be kept. Bug: 119919497 Test: Enable freeform, desktop mode and simulate secondary displays in developer options. Launch an resizable activity in that display and check if the activity is freeform style. Change-Id: Ic7d38dc1b9a551b78f41de43c38fac2caeab33d4 --- .../com/android/server/wm/ActivityDisplay.java | 5 +++++ .../android/server/wm/RootWindowContainer.java | 15 +++++++++++++++ .../server/wm/WindowContainerListener.java | 3 +++ 3 files changed, 23 insertions(+) diff --git a/services/core/java/com/android/server/wm/ActivityDisplay.java b/services/core/java/com/android/server/wm/ActivityDisplay.java index ed366453028e7..94ab2077d3b0a 100644 --- a/services/core/java/com/android/server/wm/ActivityDisplay.java +++ b/services/core/java/com/android/server/wm/ActivityDisplay.java @@ -179,6 +179,11 @@ class ActivityDisplay extends ConfigurationContainer 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 b483fd3bc6420..17e2c541c720b 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -224,6 +224,7 @@ class RootWindowContainer extends WindowContainer { final DisplayContent existing = getDisplayContent(displayId); if (existing != null) { + initializeDisplayOverrideConfiguration(controller, existing); existing.setController(controller); return existing; } @@ -233,6 +234,7 @@ class RootWindowContainer extends WindowContainer { if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Adding display=" + display); mService.mDisplayWindowSettings.applySettingsToDisplayLocked(dc); + initializeDisplayOverrideConfiguration(controller, dc); if (mService.mDisplayManagerInternal != null) { mService.mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager( @@ -245,6 +247,19 @@ class RootWindowContainer extends WindowContainer { 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 4b3cd36040c62..3d3d2e02693c6 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 @@ package com.android.server.wm; public interface WindowContainerListener { void registerConfigurationChangeListener(ConfigurationContainerListener listener); void unregisterConfigurationChangeListener(ConfigurationContainerListener listener); + default void onInitializeOverrideConfiguration(Configuration config) {} }