Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca928564 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

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
parent 2f6c5fe3
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -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.
+12 −7
Original line number Diff line number Diff line
@@ -2046,15 +2046,20 @@ class Task extends WindowContainer<ActivityRecord> 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
+4 −2
Original line number Diff line number Diff line
@@ -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);