From ca928564099674609a41a89210a8789528d8272a Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Fri, 22 Nov 2019 01:04:14 +0800 Subject: [PATCH] Compute screen layout for compat size app Instead of fixing screen layout manually, it should be able to update according to current resolved configuration. That also keeps its other bits of original screen layout. Fix: 144723538 Test: atest SizeCompatTests#testFixedScreenLayoutSizeBits Change-Id: Id0e7a067167af2bb4b0257b3845b3cc1b9c64547 --- .../com/android/server/wm/ActivityRecord.java | 7 ++++--- .../core/java/com/android/server/wm/Task.java | 19 ++++++++++++------- .../android/server/wm/SizeCompatTests.java | 6 ++++-- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index fcdb3b065ae6d..3c8c5abd0a064 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -6215,9 +6215,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // relatively fixed. overrideConfig.colorMode = fullConfig.colorMode; overrideConfig.densityDpi = fullConfig.densityDpi; - overrideConfig.screenLayout = fullConfig.screenLayout - & (Configuration.SCREENLAYOUT_LONG_MASK - | Configuration.SCREENLAYOUT_SIZE_MASK); // The smallest screen width is the short side of screen bounds. Because the bounds // and density won't be changed, smallestScreenWidthDp is also fixed. overrideConfig.smallestScreenWidthDp = fullConfig.smallestScreenWidthDp; @@ -6352,6 +6349,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Use resolvedBounds to compute other override configurations such as appBounds task.computeConfigResourceOverrides(resolvedConfig, newParentConfiguration, mCompatDisplayInsets); + // Use current screen layout as source because the size of app is independent to parent. + resolvedConfig.screenLayout = Task.computeScreenLayoutOverride( + getConfiguration().screenLayout, resolvedConfig.screenWidthDp, + resolvedConfig.screenHeightDp); // Use parent orientation if it cannot be decided by bounds, so the activity can fit inside // the parent bounds appropriately. diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index ba3b8b7d6787e..94477dd398c35 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -2046,17 +2046,22 @@ class Task extends WindowContainer implements ConfigurationConta // could never go away in Honeycomb. final int compatScreenWidthDp = (int) (mTmpNonDecorBounds.width() / density); final int compatScreenHeightDp = (int) (mTmpNonDecorBounds.height() / density); - // We're only overriding LONG, SIZE and COMPAT parts of screenLayout, so we start - // override calculation with partial default. // Reducing the screen layout starting from its parent config. - final int sl = parentConfig.screenLayout - & (Configuration.SCREENLAYOUT_LONG_MASK | Configuration.SCREENLAYOUT_SIZE_MASK); - final int longSize = Math.max(compatScreenHeightDp, compatScreenWidthDp); - final int shortSize = Math.min(compatScreenHeightDp, compatScreenWidthDp); - inOutConfig.screenLayout = Configuration.reduceScreenLayout(sl, longSize, shortSize); + inOutConfig.screenLayout = computeScreenLayoutOverride(parentConfig.screenLayout, + compatScreenWidthDp, compatScreenHeightDp); } } + /** Computes LONG, SIZE and COMPAT parts of {@link Configuration#screenLayout}. */ + static int computeScreenLayoutOverride(int sourceScreenLayout, int screenWidthDp, + int screenHeightDp) { + sourceScreenLayout = sourceScreenLayout + & (Configuration.SCREENLAYOUT_LONG_MASK | Configuration.SCREENLAYOUT_SIZE_MASK); + final int longSize = Math.max(screenWidthDp, screenHeightDp); + final int shortSize = Math.min(screenWidthDp, screenHeightDp); + return Configuration.reduceScreenLayout(sourceScreenLayout, longSize, shortSize); + } + @Override void resolveOverrideConfiguration(Configuration newParentConfig) { mTmpBounds.set(getResolvedOverrideConfiguration().windowConfiguration.getBounds()); diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index ecd9a834d5b31..1454c8e86a459 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -290,10 +290,12 @@ public class SizeCompatTests extends ActivityTestsBase { public void testFixedScreenLayoutSizeBits() { setUpApp(new TestActivityDisplay.Builder(mService, 1000, 2500).build()); final int fixedScreenLayout = Configuration.SCREENLAYOUT_LONG_NO - | Configuration.SCREENLAYOUT_SIZE_NORMAL; + | Configuration.SCREENLAYOUT_SIZE_NORMAL + | Configuration.SCREENLAYOUT_COMPAT_NEEDED; final int layoutMask = Configuration.SCREENLAYOUT_LONG_MASK | Configuration.SCREENLAYOUT_SIZE_MASK - | Configuration.SCREENLAYOUT_LAYOUTDIR_MASK; + | Configuration.SCREENLAYOUT_LAYOUTDIR_MASK + | Configuration.SCREENLAYOUT_COMPAT_NEEDED; Configuration c = new Configuration(mTask.getRequestedOverrideConfiguration()); c.screenLayout = fixedScreenLayout | Configuration.SCREENLAYOUT_LAYOUTDIR_LTR; mTask.onRequestedOverrideConfigurationChanged(c);