diff options
| author | Peiyong Lin <lpy@google.com> | 2021-02-02 16:30:40 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2021-02-02 16:30:40 +0000 |
| commit | 277cfb354dc76da33cb7c2cfaa914cedf73e130c (patch) | |
| tree | 4d4c9973e0854d7e017fa80a6b5fd24503b71918 /core/java/android | |
| parent | f4144ddde74d005f007b600734a161637b91d515 (diff) | |
| parent | 6aba2b0bd5a0b8bde0cc4e5bcc2d3a59231a0984 (diff) | |
Merge "Implement per-app window resizing override." into sc-dev
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/content/res/CompatibilityInfo.java | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/core/java/android/content/res/CompatibilityInfo.java b/core/java/android/content/res/CompatibilityInfo.java index f6edb2edc5ff..abf694f9742e 100644 --- a/core/java/android/content/res/CompatibilityInfo.java +++ b/core/java/android/content/res/CompatibilityInfo.java @@ -89,6 +89,11 @@ public class CompatibilityInfo implements Parcelable { private static final int NEEDS_COMPAT_RES = 16; /** + * Set if the application needs to be forcibly downscaled + */ + private static final int HAS_OVERRIDE_SCALING = 32; + + /** * The effective screen density we have selected for this application. */ public final int applicationDensity; @@ -107,6 +112,11 @@ public class CompatibilityInfo implements Parcelable { @UnsupportedAppUsage public CompatibilityInfo(ApplicationInfo appInfo, int screenLayout, int sw, boolean forceCompat) { + this(appInfo, screenLayout, sw, forceCompat, 1f); + } + + public CompatibilityInfo(ApplicationInfo appInfo, int screenLayout, int sw, + boolean forceCompat, float overrideScale) { int compatFlags = 0; if (appInfo.targetSdkVersion < VERSION_CODES.O) { @@ -241,7 +251,12 @@ public class CompatibilityInfo implements Parcelable { compatFlags |= NEVER_NEEDS_COMPAT; } - if ((appInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) { + if (overrideScale != 1.0f) { + applicationDensity = DisplayMetrics.DENSITY_DEFAULT; + applicationScale = overrideScale; + applicationInvertedScale = 1.0f / overrideScale; + compatFlags |= HAS_OVERRIDE_SCALING; + } else if ((appInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) { applicationDensity = DisplayMetrics.DENSITY_DEVICE; applicationScale = 1.0f; applicationInvertedScale = 1.0f; @@ -277,7 +292,7 @@ public class CompatibilityInfo implements Parcelable { */ @UnsupportedAppUsage public boolean isScalingRequired() { - return (mCompatibilityFlags&SCALING_REQUIRED) != 0; + return (mCompatibilityFlags & (SCALING_REQUIRED | HAS_OVERRIDE_SCALING)) != 0; } @UnsupportedAppUsage @@ -303,7 +318,7 @@ public class CompatibilityInfo implements Parcelable { */ @UnsupportedAppUsage public Translator getTranslator() { - return isScalingRequired() ? new Translator() : null; + return (mCompatibilityFlags & SCALING_REQUIRED) != 0 ? new Translator() : null; } /** @@ -504,6 +519,16 @@ public class CompatibilityInfo implements Parcelable { if (isScalingRequired()) { float invertedRatio = applicationInvertedScale; inoutConfig.densityDpi = (int)((inoutConfig.densityDpi * invertedRatio) + .5f); + inoutConfig.screenWidthDp = (int) ((inoutConfig.screenWidthDp * invertedRatio) + .5f); + inoutConfig.screenHeightDp = (int) ((inoutConfig.screenHeightDp * invertedRatio) + .5f); + inoutConfig.smallestScreenWidthDp = + (int) ((inoutConfig.smallestScreenWidthDp * invertedRatio) + .5f); + inoutConfig.windowConfiguration.getMaxBounds().scale(invertedRatio); + inoutConfig.windowConfiguration.getBounds().scale(invertedRatio); + final Rect appBounds = inoutConfig.windowConfiguration.getAppBounds(); + if (appBounds != null) { + appBounds.scale(invertedRatio); + } } } |
