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

Commit bb53f321 authored by Roman Birg's avatar Roman Birg
Browse files

Density scaling: scale compatibility apps, wm command support



Density scaling should work across all apps and different density
configurations. It should also pass CTS.

- force compatibility density if calculated compatibility density is
  different than what the user has requested

- hook in "wm density" support, should behave the same as setting the
  density from Settings

- clean up some logic

Change-Id: I52c7c2ca200b78f9a5ee9170871ca62e1cab3bcb
Signed-off-by: default avatarRoman Birg <roman@cyngn.com>
parent 449590b5
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -272,7 +272,6 @@ public class Resources {
            CompatibilityInfo compatInfo, IBinder token) {
        mAssets = assets;
        mMetrics.setToDefaults();
        mMetrics.updateDensity();
        if (compatInfo != null) {
            mCompatibilityInfo = compatInfo;
        }
@@ -1915,10 +1914,11 @@ public class Resources {
                mConfiguration.setLayoutDirection(mConfiguration.locale);
            }
            if (mConfiguration.densityDpi != Configuration.DENSITY_DPI_UNDEFINED) {
                mMetrics.densityDpi = mConfiguration.densityDpi;
                mMetrics.density = mConfiguration.densityDpi * DisplayMetrics.DENSITY_DEFAULT_SCALE;
                if (mCompatibilityInfo.equals(CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO)) {
                    mMetrics.updateDensity();
                if (DisplayMetrics.DENSITY_DEVICE_DEFAULT
                        == mCompatibilityInfo.applicationDensity) {
                    mMetrics.setDensity(DisplayMetrics.DENSITY_PREFERRED);
                } else {
                    mMetrics.setDensity(mCompatibilityInfo.applicationDensity);
                }
            }
            mMetrics.scaledDensity = mMetrics.density * mConfiguration.fontScale;
@@ -2401,7 +2401,7 @@ public class Resources {
            }
            sPreloaded = true;
            mPreloading = true;
            sPreloadedDensity = DisplayMetrics.getDeviceDensity();
            sPreloadedDensity = DisplayMetrics.DENSITY_PREFERRED;
            mConfiguration.densityDpi = sPreloadedDensity;
            updateConfiguration(null, null);
        }
+15 −17
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.util;

import android.graphics.Bitmap;
import android.os.SystemProperties;


@@ -125,12 +126,16 @@ public class DisplayMetrics {
    public static int DENSITY_DEVICE;

    /** @hide */
    public static int DENSITY_CURRENT;
    public static int DENSITY_PREFERRED;

    /** @hide */
    public static int DENSITY_DEVICE_DEFAULT;

    static {
        DENSITY_DEVICE = SystemProperties.getInt("qemu.sf.lcd_density", SystemProperties
            .getInt("ro.sf.lcd_density", DENSITY_DEFAULT));
        DENSITY_CURRENT = SystemProperties.getInt("persist.sys.lcd_density", DENSITY_DEVICE);
        DENSITY_DEVICE_DEFAULT = DENSITY_DEVICE;
        DENSITY_PREFERRED = SystemProperties.getInt("persist.sys.lcd_density", DENSITY_DEVICE);
    }

    /**
@@ -223,17 +228,15 @@ public class DisplayMetrics {
    public float noncompatYdpi;

    /** @hide */
    public void updateDensity() {
        density = DENSITY_CURRENT / (float) DENSITY_DEFAULT;
        densityDpi = DENSITY_CURRENT;
    public void setDensity(int inDensity) {
        density = inDensity / (float) DENSITY_DEFAULT;
        densityDpi = inDensity;
        scaledDensity = density;
        xdpi = DENSITY_CURRENT;
        ydpi = DENSITY_CURRENT;
        noncompatDensity = density;
        noncompatDensityDpi = densityDpi;
        noncompatScaledDensity = scaledDensity;
        noncompatXdpi = xdpi;
        noncompatYdpi = ydpi;
        xdpi = inDensity;
        ydpi = inDensity;

        DENSITY_DEVICE = inDensity;
        Bitmap.setDefaultDensity(inDensity);
    }

    public DisplayMetrics() {
@@ -326,9 +329,4 @@ public class DisplayMetrics {
            ", height=" + heightPixels + ", scaledDensity=" + scaledDensity +
            ", xdpi=" + xdpi + ", ydpi=" + ydpi + "}";
    }

    /** @hide */
    public static int getDeviceDensity() {
        return DENSITY_CURRENT;
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -445,7 +445,7 @@ public final class DisplayInfo implements Parcelable {
        if (!compatInfo.equals(CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO)) {
            compatInfo.applyToDisplayMetrics(outMetrics);
        } else if (type == Display.TYPE_BUILT_IN) {
            outMetrics.updateDensity();
            outMetrics.setDensity(DisplayMetrics.DENSITY_PREFERRED);
        }
    }

+9 −2
Original line number Diff line number Diff line
@@ -81,17 +81,24 @@ public final class Bitmap implements Parcelable {

    private static volatile Matrix sScaleMatrix;

    private static volatile int sDefaultDensity = -1;

    /**
     * For backwards compatibility, allows the app layer to change the default
     * density when running old apps.
     * @hide
     */
    public static void setDefaultDensity(int density) {
        // Ignore
        sDefaultDensity = density;
    }

    static int getDefaultDensity() {
        return DisplayMetrics.getDeviceDensity();
        if (sDefaultDensity >= 0) {
            return sDefaultDensity;
        }
        //noinspection deprecation
        sDefaultDensity = DisplayMetrics.DENSITY_DEVICE;
        return sDefaultDensity;
    }

    /**
+1 −1
Original line number Diff line number Diff line
@@ -984,7 +984,7 @@ public abstract class Drawable {
        // drawn to the screen.
        if (opts == null) opts = new BitmapFactory.Options();
        opts.inScreenDensity = res != null
                ? res.getDisplayMetrics().noncompatDensityDpi : DisplayMetrics.getDeviceDensity();
                ? res.getDisplayMetrics().noncompatDensityDpi : DisplayMetrics.DENSITY_DEFAULT;
        Bitmap  bm = BitmapFactory.decodeResourceStream(res, value, is, pad, opts);
        if (bm != null) {
            byte[] np = bm.getNinePatchChunk();
Loading