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

Commit 11ea3347 authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Allow for screen density drawables in compatibility mode.

This change allows us to use drawables that match the current screen
density even when being loaded in compatibility mode.  In this case,
the bitmap is loaded in the screen density, and the bitmap and
nine-patch drawables take care of accounting for the density difference.

This should be safe for existing applications, for the most part, since
they shouldn't really be pulling the bitmap out of the drawable.  For
the small rare chance of them breaking, it worth getting the correct
graphics.  Also this will only happen when there is actually a resource
of the matching density, and no existing apps should have resources for
anything besides the default density (though of course all of the
framework resources will be available in the native density).

As part of this, the bitmap density API has been changed to a single
integer provider the DPI unit density.
parent 3b99e64e
Loading
Loading
Loading
Loading
+223 −31
Original line number Diff line number Diff line
@@ -49107,8 +49107,8 @@
 visibility="public"
>
</method>
<method name="getDensityScale"
 return="float"
<method name="getDensity"
 return="int"
 abstract="false"
 native="false"
 synchronized="false"
@@ -49217,6 +49217,19 @@
<parameter name="metrics" type="android.util.DisplayMetrics">
</parameter>
</method>
<method name="getScaledHeight"
 return="int"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="targetDensity" type="int">
</parameter>
</method>
<method name="getScaledWidth"
 return="int"
 abstract="false"
@@ -49243,19 +49256,21 @@
<parameter name="metrics" type="android.util.DisplayMetrics">
</parameter>
</method>
<method name="getWidth"
<method name="getScaledWidth"
 return="int"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="targetDensity" type="int">
</parameter>
</method>
<method name="hasAlpha"
 return="boolean"
<method name="getWidth"
 return="int"
 abstract="false"
 native="false"
 synchronized="false"
@@ -49265,13 +49280,13 @@
 visibility="public"
>
</method>
<method name="isAutoScalingEnabled"
<method name="hasAlpha"
 return="boolean"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
@@ -49320,20 +49335,7 @@
 visibility="public"
>
</method>
<method name="setAutoScalingEnabled"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="autoScalingEnabled" type="boolean">
</parameter>
</method>
<method name="setDensityScale"
<method name="setDensity"
 return="void"
 abstract="false"
 native="false"
@@ -49343,7 +49345,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="densityScale" type="float">
<parameter name="density" type="int">
</parameter>
</method>
<method name="setPixel"
@@ -49413,11 +49415,11 @@
 visibility="public"
>
</field>
<field name="DENSITY_SCALE_UNKNOWN"
 type="float"
<field name="DENSITY_NONE"
 type="int"
 transient="false"
 volatile="false"
 value="-1.0f"
 value="0"
 static="true"
 final="true"
 deprecated="not deprecated"
@@ -49633,7 +49635,7 @@
<parameter name="id" type="int">
</parameter>
</method>
<method name="decodeStream"
<method name="decodeResourceStream"
 return="android.graphics.Bitmap"
 abstract="false"
 native="false"
@@ -49792,6 +49794,26 @@
 visibility="public"
>
</field>
<field name="inScreenDensity"
 type="int"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="inTargetDensity"
 type="int"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="inTempStorage"
 type="byte[]"
 transient="false"
@@ -51046,8 +51068,8 @@
 visibility="public"
>
</method>
<method name="getDensityScale"
 return="float"
<method name="getDensity"
 return="int"
 abstract="false"
 native="false"
 synchronized="false"
@@ -51403,7 +51425,7 @@
<parameter name="bitmap" type="android.graphics.Bitmap">
</parameter>
</method>
<method name="setDensityScale"
<method name="setDensity"
 return="void"
 abstract="false"
 native="false"
@@ -51413,7 +51435,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="densityScale" type="float">
<parameter name="density" type="int">
</parameter>
</method>
<method name="setDrawFilter"
@@ -53725,6 +53747,17 @@
<parameter name="paint" type="android.graphics.Paint">
</parameter>
</method>
<method name="getDensity"
 return="int"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="getHeight"
 return="int"
 abstract="false"
@@ -59124,6 +59157,14 @@
 deprecated="not deprecated"
 visibility="public"
>
<constructor name="BitmapDrawable"
 type="android.graphics.drawable.BitmapDrawable"
 static="false"
 final="false"
 deprecated="deprecated"
 visibility="public"
>
</constructor>
<constructor name="BitmapDrawable"
 type="android.graphics.drawable.BitmapDrawable"
 static="false"
@@ -59131,6 +59172,18 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="res" type="android.content.res.Resources">
</parameter>
</constructor>
<constructor name="BitmapDrawable"
 type="android.graphics.drawable.BitmapDrawable"
 static="false"
 final="false"
 deprecated="deprecated"
 visibility="public"
>
<parameter name="bitmap" type="android.graphics.Bitmap">
</parameter>
</constructor>
<constructor name="BitmapDrawable"
 type="android.graphics.drawable.BitmapDrawable"
@@ -59139,6 +59192,8 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="res" type="android.content.res.Resources">
</parameter>
<parameter name="bitmap" type="android.graphics.Bitmap">
</parameter>
</constructor>
@@ -59304,6 +59359,45 @@
<parameter name="gravity" type="int">
</parameter>
</method>
<method name="setTargetDensity"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="canvas" type="android.graphics.Canvas">
</parameter>
</method>
<method name="setTargetDensity"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="metrics" type="android.util.DisplayMetrics">
</parameter>
</method>
<method name="setTargetDensity"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="density" type="int">
</parameter>
</method>
<method name="setTileModeX"
 return="void"
 abstract="false"
@@ -59640,6 +59734,25 @@
<parameter name="pathName" type="java.lang.String">
</parameter>
</method>
<method name="createFromResourceStream"
 return="android.graphics.drawable.Drawable"
 abstract="false"
 native="false"
 synchronized="false"
 static="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="res" type="android.content.res.Resources">
</parameter>
<parameter name="value" type="android.util.TypedValue">
</parameter>
<parameter name="is" type="java.io.InputStream">
</parameter>
<parameter name="srcName" type="java.lang.String">
</parameter>
</method>
<method name="createFromStream"
 return="android.graphics.drawable.Drawable"
 abstract="false"
@@ -61333,6 +61446,22 @@
 deprecated="not deprecated"
 visibility="public"
>
<constructor name="NinePatchDrawable"
 type="android.graphics.drawable.NinePatchDrawable"
 static="false"
 final="false"
 deprecated="deprecated"
 visibility="public"
>
<parameter name="bitmap" type="android.graphics.Bitmap">
</parameter>
<parameter name="chunk" type="byte[]">
</parameter>
<parameter name="padding" type="android.graphics.Rect">
</parameter>
<parameter name="srcName" type="java.lang.String">
</parameter>
</constructor>
<constructor name="NinePatchDrawable"
 type="android.graphics.drawable.NinePatchDrawable"
 static="false"
@@ -61340,6 +61469,8 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="res" type="android.content.res.Resources">
</parameter>
<parameter name="bitmap" type="android.graphics.Bitmap">
</parameter>
<parameter name="chunk" type="byte[]">
@@ -61349,6 +61480,16 @@
<parameter name="srcName" type="java.lang.String">
</parameter>
</constructor>
<constructor name="NinePatchDrawable"
 type="android.graphics.drawable.NinePatchDrawable"
 static="false"
 final="false"
 deprecated="deprecated"
 visibility="public"
>
<parameter name="patch" type="android.graphics.NinePatch">
</parameter>
</constructor>
<constructor name="NinePatchDrawable"
 type="android.graphics.drawable.NinePatchDrawable"
 static="false"
@@ -61356,6 +61497,8 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="res" type="android.content.res.Resources">
</parameter>
<parameter name="patch" type="android.graphics.NinePatch">
</parameter>
</constructor>
@@ -61420,6 +61563,45 @@
<parameter name="cf" type="android.graphics.ColorFilter">
</parameter>
</method>
<method name="setTargetDensity"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="canvas" type="android.graphics.Canvas">
</parameter>
</method>
<method name="setTargetDensity"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="metrics" type="android.util.DisplayMetrics">
</parameter>
</method>
<method name="setTargetDensity"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="density" type="int">
</parameter>
</method>
</class>
<class name="PaintDrawable"
 extends="android.graphics.drawable.ShapeDrawable"
@@ -133364,6 +133546,16 @@
 visibility="public"
>
</field>
<field name="densityDpi"
 type="int"
 transient="false"
 volatile="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="heightPixels"
 type="int"
 transient="false"
+13 −3
Original line number Diff line number Diff line
@@ -177,11 +177,17 @@ public final class ActivityThread {
        synchronized (mPackages) {
            // Resources is app scale dependent.
            ResourcesKey key = new ResourcesKey(resDir, compInfo.applicationScale);
            //Log.w(TAG, "getTopLevelResources: " + resDir);
            if (false) {
                Log.w(TAG, "getTopLevelResources: " + resDir + " / "
                        + compInfo.applicationScale);
            }
            WeakReference<Resources> wr = mActiveResources.get(key);
            Resources r = wr != null ? wr.get() : null;
            if (r != null && r.getAssets().isUpToDate()) {
                //Log.w(TAG, "Returning cached resources " + r + " " + resDir);
                if (false) {
                    Log.w(TAG, "Returning cached resources " + r + " " + resDir
                            + ": appScale=" + r.getCompatibilityInfo().applicationScale);
                }
                return r;
            }

@@ -198,7 +204,11 @@ public final class ActivityThread {
            //Log.i(TAG, "Resource: key=" + key + ", display metrics=" + metrics);
            DisplayMetrics metrics = getDisplayMetricsLocked(false);
            r = new Resources(assets, metrics, getConfiguration(), compInfo);
            //Log.i(TAG, "Created app resources " + r + ": " + r.getConfiguration());
            if (false) {
                Log.i(TAG, "Created app resources " + resDir + " " + r + ": "
                        + r.getConfiguration() + " appScale="
                        + r.getCompatibilityInfo().applicationScale);
            }
            // XXX need to remove entries when weak references go away
            mActiveResources.put(key, new WeakReference<Resources>(r));
            return r;
+14 −3
Original line number Diff line number Diff line
@@ -541,7 +541,10 @@ class ApplicationContext extends Context {
            if (fd != null) {
                Bitmap bm = BitmapFactory.decodeFileDescriptor(fd.getFileDescriptor());
                if (bm != null) {
                    return new BitmapDrawable(bm);
                    // For now clear the density until we figure out how
                    // to deal with it for wallpapers.
                    bm.setDensity(0);
                    return new BitmapDrawable(getResources(), bm);
                }
            }
        } catch (RemoteException e) {
@@ -1949,6 +1952,15 @@ class ApplicationContext extends Context {
            try {
                Resources r = getResourcesForApplication(appInfo);
                dr = r.getDrawable(resid);
                if (false) {
                    RuntimeException e = new RuntimeException("here");
                    e.fillInStackTrace();
                    Log.w(TAG, "Getting drawable 0x" + Integer.toHexString(resid)
                            + " from package " + packageName
                            + ": app scale=" + r.getCompatibilityInfo().applicationScale
                            + ", caller scale=" + mContext.getResources().getCompatibilityInfo().applicationScale,
                            e);
                }
                if (DEBUG_ICONS) Log.v(TAG, "Getting drawable 0x"
                        + Integer.toHexString(resid) + " from " + r
                        + ": " + dr);
@@ -2036,10 +2048,9 @@ class ApplicationContext extends Context {
            if (app.packageName.equals("system")) {
                return mContext.mMainThread.getSystemContext().getResources();
            }
            ActivityThread.PackageInfo pi = mContext.mMainThread.getPackageInfoNoCheck(app);
            Resources r = mContext.mMainThread.getTopLevelResources(
                    app.uid == Process.myUid() ? app.sourceDir
                    : app.publicSourceDir, pi);
                    : app.publicSourceDir, mContext.mPackageInfo);
            if (r != null) {
                return r;
            }
+2 −2
Original line number Diff line number Diff line
@@ -297,7 +297,7 @@ public abstract class LauncherActivity extends ListActivity {
                    icon.setBounds(x, y, x + width, y + height);
                    icon.draw(canvas);
                    icon.setBounds(mOldBounds);
                    icon = new BitmapDrawable(thumb);
                    icon = new BitmapDrawable(getResources(), thumb);
                } else if (iconWidth < width && iconHeight < height) {
                    final Bitmap.Config c = Bitmap.Config.ARGB_8888;
                    final Bitmap thumb = Bitmap.createBitmap(mIconWidth, mIconHeight, c);
@@ -309,7 +309,7 @@ public abstract class LauncherActivity extends ListActivity {
                    icon.setBounds(x, y, x + iconWidth, y + iconHeight);
                    icon.draw(canvas);
                    icon.setBounds(mOldBounds);
                    icon = new BitmapDrawable(thumb);
                    icon = new BitmapDrawable(getResources(), thumb);
                }
            }

+2 −2
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ public class ImageSpan extends DynamicDrawableSpan {
     */
    public ImageSpan(Bitmap b, int verticalAlignment) {
        super(verticalAlignment);
        mDrawable = new BitmapDrawable(b);
        mDrawable = new BitmapDrawable(mContext.getResources(), b);
        int width = mDrawable.getIntrinsicWidth();
        int height = mDrawable.getIntrinsicHeight();
        mDrawable.setBounds(0, 0, width > 0 ? width : 0, height > 0 ? height : 0); 
@@ -117,7 +117,7 @@ public class ImageSpan extends DynamicDrawableSpan {
                InputStream is = mContext.getContentResolver().openInputStream(
                        mContentUri);
                bitmap = BitmapFactory.decodeStream(is);
                drawable = new BitmapDrawable(bitmap);
                drawable = new BitmapDrawable(mContext.getResources(), bitmap);
                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
                        drawable.getIntrinsicHeight());
                is.close();
Loading