From 562659db694b38810568a50c87f2ce59ef05df65 Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Thu, 26 Nov 2020 18:53:22 +0800 Subject: Fix max bounds doesn't get updated on dual TDA build Previously ConfigurationContainer only respects provideMaxBounds in #setBounds, which leads to set bounds from WindowTransaction doesn't work because it invokes onRequestedOverrideConfiguration. This CL move the logic to override max bounds to onRequestedOverrideConfiguration. It also modifies DC#onRequestedOverrideConfiguration a bit because ConfigurationContainer changes requestedOverrideConfiguration on-the-fly. Test: atest ConfigurationContainerTests#testOnRequestedOverrideConfigurationChangedOverrideMaxBounds Test: atest WindowMetricsTests on Dual TDA test build fixes: 173770528 Change-Id: Ibc0a98d21291bc3f04d2d4ba981b8a5dc3ab5312 --- .../android/server/wm/ConfigurationContainer.java | 8 +++++--- .../java/com/android/server/wm/DisplayContent.java | 2 +- .../server/wm/ConfigurationContainerTests.java | 24 ++++++++++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/ConfigurationContainer.java b/services/core/java/com/android/server/wm/ConfigurationContainer.java index 60a62dc0b64c..36a1ef9f49b4 100644 --- a/services/core/java/com/android/server/wm/ConfigurationContainer.java +++ b/services/core/java/com/android/server/wm/ConfigurationContainer.java @@ -182,6 +182,11 @@ public abstract class ConfigurationContainer { // writing to proto (which has significant cost if we write a lot of empty configurations). mHasOverrideConfiguration = !Configuration.EMPTY.equals(overrideConfiguration); mRequestedOverrideConfiguration.setTo(overrideConfiguration); + final Rect newBounds = mRequestedOverrideConfiguration.windowConfiguration.getBounds(); + if (mHasOverrideConfiguration && providesMaxBounds() + && diffRequestedOverrideMaxBounds(newBounds) != BOUNDS_CHANGE_NONE) { + mRequestedOverrideConfiguration.windowConfiguration.setMaxBounds(newBounds); + } // Update full configuration of this container and all its children. final ConfigurationContainer parent = getParent(); onConfigurationChanged(parent != null ? parent.getConfiguration() : Configuration.EMPTY); @@ -341,9 +346,6 @@ public abstract class ConfigurationContainer { mRequestsTmpConfig.setTo(getRequestedOverrideConfiguration()); mRequestsTmpConfig.windowConfiguration.setBounds(bounds); - if (overrideMaxBounds) { - mRequestsTmpConfig.windowConfiguration.setMaxBounds(bounds); - } onRequestedOverrideConfigurationChanged(mRequestsTmpConfig); return boundsChange; diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 4133ea2b2a7b..cf1ac390f521 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -5188,7 +5188,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mCurrentOverrideConfigurationChanges = currOverrideConfig.diff(overrideConfiguration); super.onRequestedOverrideConfigurationChanged(overrideConfiguration); mCurrentOverrideConfigurationChanges = 0; - mWmService.setNewDisplayOverrideConfiguration(overrideConfiguration, this); + mWmService.setNewDisplayOverrideConfiguration(currOverrideConfig, this); mAtmService.addWindowLayoutReasons( ActivityTaskManagerService.LAYOUT_REASON_CONFIG_CHANGED); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ConfigurationContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/ConfigurationContainerTests.java index 5828d02948a1..59b12e406d70 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ConfigurationContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ConfigurationContainerTests.java @@ -366,6 +366,30 @@ public class ConfigurationContainerTests { assertTrue(child.getConfiguration().windowConfiguration.getMaxBounds().isEmpty()); } + @Test + public void testOnRequestedOverrideConfigurationChangedOverrideMaxBounds() { + final TestConfigurationContainer root = + new TestConfigurationContainer(true /* providesMaxBounds */); + final Rect bounds = new Rect(0, 0, 10, 10); + final TestConfigurationContainer child = new TestConfigurationContainer(); + root.addChild(child); + final Configuration configuration = new Configuration(); + configuration.windowConfiguration.setBounds(bounds); + + root.onRequestedOverrideConfigurationChanged(configuration); + + assertEquals(bounds, root.getBounds()); + assertEquals(bounds, root.getConfiguration().windowConfiguration.getBounds()); + assertEquals(bounds, child.getBounds()); + assertEquals(bounds, child.getConfiguration().windowConfiguration.getBounds()); + + assertEquals(bounds, root.getMaxBounds()); + assertEquals(bounds, root.getConfiguration().windowConfiguration.getMaxBounds()); + assertEquals(bounds, child.getMaxBounds()); + assertEquals(bounds, child.getConfiguration().windowConfiguration.getMaxBounds()); + } + + /** * Contains minimal implementation of {@link ConfigurationContainer}'s abstract behavior needed * for testing. -- cgit v1.2.3-59-g8ed1b