diff options
author | Dianne Hackborn <hackbod@google.com> | 2012-07-31 16:37:34 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2012-08-01 10:54:39 -0700 |
commit | 908aecc3a63c5520d5b11da14a9383f885b7d126 (patch) | |
tree | 11806df7f127ea695474ae7ab490a95c19965508 | |
parent | b1980049855fd6c53e109b44ff012a053f9436f7 (diff) | |
download | frameworks_base-908aecc3a63c5520d5b11da14a9383f885b7d126.zip frameworks_base-908aecc3a63c5520d5b11da14a9383f885b7d126.tar.gz frameworks_base-908aecc3a63c5520d5b11da14a9383f885b7d126.tar.bz2 |
Start moving away from DisplayMetrics.DENSITY_DEVICE.
This puts in most of the infrastructure needed to allow us to
switch between different densities at run time. The main remaining
uses of the global are to initialize the Bitmap object (not sure
what to do about that since it doesn't have anything passed in
the constructor to get this information from), and being able to
load drawables if we need a different density than what was preloaded
by zygote.
Change-Id: Ifdbfd6b7a5c59e6aa22e63b95b78d96af3d96848
20 files changed, 169 insertions, 61 deletions
diff --git a/api/current.txt b/api/current.txt index 916d95b..66b76bb 100644 --- a/api/current.txt +++ b/api/current.txt @@ -6208,6 +6208,7 @@ package android.content.pm { method public int describeContents(); method public void dump(android.util.Printer, java.lang.String); method public final int getThemeResource(); + field public static final int CONFIG_DENSITY = 4096; // 0x1000 field public static final int CONFIG_FONT_SCALE = 1073741824; // 0x40000000 field public static final int CONFIG_KEYBOARD = 16; // 0x10 field public static final int CONFIG_KEYBOARD_HIDDEN = 32; // 0x20 @@ -6802,6 +6803,7 @@ package android.content.res { method public int updateFrom(android.content.res.Configuration); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; + field public static final int DENSITY_DPI_UNDEFINED = 0; // 0x0 field public static final int HARDKEYBOARDHIDDEN_NO = 1; // 0x1 field public static final int HARDKEYBOARDHIDDEN_UNDEFINED = 0; // 0x0 field public static final int HARDKEYBOARDHIDDEN_YES = 2; // 0x2 @@ -6852,6 +6854,7 @@ package android.content.res { field public static final int UI_MODE_TYPE_NORMAL = 1; // 0x1 field public static final int UI_MODE_TYPE_TELEVISION = 4; // 0x4 field public static final int UI_MODE_TYPE_UNDEFINED = 0; // 0x0 + field public int densityDpi; field public float fontScale; field public int hardKeyboardHidden; field public int keyboard; diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 7011bc1..f8d01de 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -166,6 +166,7 @@ public final class ActivityThread { = new HashMap<IBinder, Service>(); AppBindData mBoundApplication; Profiler mProfiler; + int mCurDefaultDisplayDpi; Configuration mConfiguration; Configuration mCompatConfiguration; Configuration mResConfiguration; @@ -1306,6 +1307,7 @@ public final class ActivityThread { break; case CONFIGURATION_CHANGED: Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "configChanged"); + mCurDefaultDisplayDpi = ((Configuration)msg.obj).densityDpi; handleConfigurationChanged((Configuration)msg.obj, null); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); break; @@ -1539,14 +1541,15 @@ public final class ActivityThread { } private Configuration mMainThreadConfig = new Configuration(); - Configuration applyConfigCompatMainThread(Configuration config, CompatibilityInfo compat) { + Configuration applyConfigCompatMainThread(int displayDensity, Configuration config, + CompatibilityInfo compat) { if (config == null) { return null; } if (compat != null && !compat.supportsScreen()) { mMainThreadConfig.setTo(config); config = mMainThreadConfig; - compat.applyToConfiguration(config); + compat.applyToConfiguration(displayDensity, config); } return config; } @@ -3464,6 +3467,7 @@ public final class ActivityThread { // If there was a pending configuration change, execute it first. if (changedConfig != null) { + mCurDefaultDisplayDpi = changedConfig.densityDpi; handleConfigurationChanged(changedConfig, null); } @@ -3546,8 +3550,8 @@ public final class ActivityThread { for (ActivityClientRecord ar : mActivities.values()) { Activity a = ar.activity; if (a != null) { - Configuration thisConfig = applyConfigCompatMainThread(newConfig, - ar.packageInfo.mCompatibilityInfo.getIfNeeded()); + Configuration thisConfig = applyConfigCompatMainThread(mCurDefaultDisplayDpi, + newConfig, ar.packageInfo.mCompatibilityInfo.getIfNeeded()); if (!ar.activity.mFinished && (allActivities || !ar.paused)) { // If the activity is currently resumed, its configuration // needs to change right now. @@ -3691,14 +3695,14 @@ public final class ActivityThread { return changes != 0; } - final Configuration applyCompatConfiguration() { + final Configuration applyCompatConfiguration(int displayDensity) { Configuration config = mConfiguration; if (mCompatConfiguration == null) { mCompatConfiguration = new Configuration(); } mCompatConfiguration.setTo(mConfiguration); if (mResCompatibilityInfo != null && !mResCompatibilityInfo.supportsScreen()) { - mResCompatibilityInfo.applyToConfiguration(mCompatConfiguration); + mResCompatibilityInfo.applyToConfiguration(displayDensity, mCompatConfiguration); config = mCompatConfiguration; } return config; @@ -3713,6 +3717,7 @@ public final class ActivityThread { if (mPendingConfiguration != null) { if (!mPendingConfiguration.isOtherSeqNewer(config)) { config = mPendingConfiguration; + mCurDefaultDisplayDpi = config.densityDpi; } mPendingConfiguration = null; } @@ -3734,7 +3739,7 @@ public final class ActivityThread { } configDiff = mConfiguration.diff(config); mConfiguration.updateFrom(config); - config = applyCompatConfiguration(); + config = applyCompatConfiguration(mCurDefaultDisplayDpi); callbacks = collectComponentCallbacksLocked(false, config); } @@ -3933,7 +3938,7 @@ public final class ActivityThread { // Persistent processes on low-memory devices do not get to // use hardware accelerated drawing, since this can add too much // overhead to the process. - Display display = WindowManagerImpl.getDefault().getDefaultDisplay(); + final Display display = WindowManagerImpl.getDefault().getDefaultDisplay(); if (!ActivityManager.isHighEndGfx(display)) { HardwareRenderer.disable(false); } @@ -3970,7 +3975,8 @@ public final class ActivityThread { * in AppBindData can be safely assumed to be up to date */ applyConfigurationToResourcesLocked(data.config, data.compatInfo); - applyCompatConfiguration(); + mCurDefaultDisplayDpi = data.config.densityDpi; + applyCompatConfiguration(mCurDefaultDisplayDpi); data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo); diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index c131549..27843ac 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -42,6 +42,7 @@ import android.os.ServiceManager; import android.util.DisplayMetrics; import android.util.Log; import android.view.ViewRootImpl; +import android.view.WindowManager; import java.io.FileOutputStream; import java.io.IOException; @@ -241,7 +242,7 @@ public class WallpaperManager { } mWallpaper = null; try { - mWallpaper = getCurrentWallpaperLocked(); + mWallpaper = getCurrentWallpaperLocked(context); } catch (OutOfMemoryError e) { Log.w(TAG, "No memory load current wallpaper", e); } @@ -264,7 +265,7 @@ public class WallpaperManager { } } - private Bitmap getCurrentWallpaperLocked() { + private Bitmap getCurrentWallpaperLocked(Context context) { try { Bundle params = new Bundle(); ParcelFileDescriptor fd = mService.getWallpaper(this, params); @@ -276,7 +277,7 @@ public class WallpaperManager { BitmapFactory.Options options = new BitmapFactory.Options(); Bitmap bm = BitmapFactory.decodeFileDescriptor( fd.getFileDescriptor(), null, options); - return generateBitmap(bm, width, height); + return generateBitmap(context, bm, width, height); } catch (OutOfMemoryError e) { Log.w(TAG, "Can't decode file", e); } finally { @@ -304,7 +305,7 @@ public class WallpaperManager { try { BitmapFactory.Options options = new BitmapFactory.Options(); Bitmap bm = BitmapFactory.decodeStream(is, null, options); - return generateBitmap(bm, width, height); + return generateBitmap(context, bm, width, height); } catch (OutOfMemoryError e) { Log.w(TAG, "Can't decode stream", e); } finally { @@ -768,12 +769,15 @@ public class WallpaperManager { setResource(com.android.internal.R.drawable.default_wallpaper); } - static Bitmap generateBitmap(Bitmap bm, int width, int height) { + static Bitmap generateBitmap(Context context, Bitmap bm, int width, int height) { if (bm == null) { return null; } - bm.setDensity(DisplayMetrics.DENSITY_DEVICE); + WindowManager wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); + DisplayMetrics metrics = new DisplayMetrics(); + wm.getDefaultDisplay().getMetrics(metrics); + bm.setDensity(metrics.noncompatDensityDpi); if (width <= 0 || height <= 0 || (bm.getWidth() == width && bm.getHeight() == height)) { @@ -783,7 +787,7 @@ public class WallpaperManager { // This is the final bitmap we want to return. try { Bitmap newbm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - newbm.setDensity(DisplayMetrics.DENSITY_DEVICE); + newbm.setDensity(metrics.noncompatDensityDpi); Canvas c = new Canvas(newbm); Rect targetRect = new Rect(); diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java index 6b16e74..35e5610 100644 --- a/core/java/android/content/pm/ActivityInfo.java +++ b/core/java/android/content/pm/ActivityInfo.java @@ -358,6 +358,12 @@ public class ActivityInfo extends ComponentInfo public static final int CONFIG_SMALLEST_SCREEN_SIZE = 0x0800; /** * Bit in {@link #configChanges} that indicates that the activity + * can itself handle density changes. Set from the + * {@link android.R.attr#configChanges} attribute. + */ + public static final int CONFIG_DENSITY = 0x1000; + /** + * Bit in {@link #configChanges} that indicates that the activity * can itself handle changes to the font scaling factor. Set from the * {@link android.R.attr#configChanges} attribute. This is * not a core resource configutation, but a higher-level value, so its @@ -383,6 +389,7 @@ public class ActivityInfo extends ComponentInfo 0x1000, // UI MODE 0x0200, // SCREEN SIZE 0x2000, // SMALLEST SCREEN SIZE + 0x0100, // DENSITY }; /** @hide * Convert Java change bits to native. diff --git a/core/java/android/content/res/CompatibilityInfo.java b/core/java/android/content/res/CompatibilityInfo.java index 1c9285e..28c751c 100644 --- a/core/java/android/content/res/CompatibilityInfo.java +++ b/core/java/android/content/res/CompatibilityInfo.java @@ -439,7 +439,7 @@ public class CompatibilityInfo implements Parcelable { if (isScalingRequired()) { float invertedRatio = applicationInvertedScale; inoutDm.density = inoutDm.noncompatDensity * invertedRatio; - inoutDm.densityDpi = (int)((inoutDm.density*DisplayMetrics.DENSITY_DEFAULT)+.5f); + inoutDm.densityDpi = (int)((inoutDm.noncompatDensityDpi * invertedRatio) + .5f); inoutDm.scaledDensity = inoutDm.noncompatScaledDensity * invertedRatio; inoutDm.xdpi = inoutDm.noncompatXdpi * invertedRatio; inoutDm.ydpi = inoutDm.noncompatYdpi * invertedRatio; @@ -448,7 +448,7 @@ public class CompatibilityInfo implements Parcelable { } } - public void applyToConfiguration(Configuration inoutConfig) { + public void applyToConfiguration(int displayDensity, Configuration inoutConfig) { if (!supportsScreen()) { // This is a larger screen device and the app is not // compatible with large screens, so we are forcing it to @@ -460,6 +460,11 @@ public class CompatibilityInfo implements Parcelable { inoutConfig.screenHeightDp = inoutConfig.compatScreenHeightDp; inoutConfig.smallestScreenWidthDp = inoutConfig.compatSmallestScreenWidthDp; } + inoutConfig.densityDpi = displayDensity; + if (isScalingRequired()) { + float invertedRatio = applicationInvertedScale; + inoutConfig.densityDpi = (int)((inoutConfig.densityDpi * invertedRatio) + .5f); + } } /** diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index 423b9af..ea13a2a 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -369,26 +369,40 @@ public final class Configuration implements Parcelable, Comparable<Configuration */ public int uiMode; + /** + * Default value for {@link #screenWidthDp} indicating that no width + * has been specified. + */ public static final int SCREEN_WIDTH_DP_UNDEFINED = 0; /** * The current width of the available screen space, in dp units, * corresponding to * <a href="{@docRoot}guide/topics/resources/providing-resources.html#ScreenWidthQualifier">screen - * width</a> resource qualifier. + * width</a> resource qualifier. Set to + * {@link #SCREEN_WIDTH_DP_UNDEFINED} if no width is specified. */ public int screenWidthDp; + /** + * Default value for {@link #screenHeightDp} indicating that no width + * has been specified. + */ public static final int SCREEN_HEIGHT_DP_UNDEFINED = 0; /** * The current height of the available screen space, in dp units, * corresponding to * <a href="{@docRoot}guide/topics/resources/providing-resources.html#ScreenHeightQualifier">screen - * height</a> resource qualifier. + * height</a> resource qualifier. Set to + * {@link #SCREEN_HEIGHT_DP_UNDEFINED} if no height is specified. */ public int screenHeightDp; + /** + * Default value for {@link #smallestScreenWidthDp} indicating that no width + * has been specified. + */ public static final int SMALLEST_SCREEN_WIDTH_DP_UNDEFINED = 0; /** @@ -397,10 +411,26 @@ public final class Configuration implements Parcelable, Comparable<Configuration * <a href="{@docRoot}guide/topics/resources/providing-resources.html#SmallestScreenWidthQualifier">smallest * screen width</a> resource qualifier. * This is the smallest value of both screenWidthDp and screenHeightDp - * in both portrait and landscape. + * in both portrait and landscape. Set to + * {@link #SMALLEST_SCREEN_WIDTH_DP_UNDEFINED} if no width is specified. */ public int smallestScreenWidthDp; + /** + * Default value for {@link #densityDpi} indicating that no width + * has been specified. + */ + public static final int DENSITY_DPI_UNDEFINED = 0; + + /** + * The target screen density being rendered to, + * corresponding to + * <a href="{@docRoot}guide/topics/resources/providing-resources.html#DensityQualifier">density</a> + * resource qualifier. Set to + * {@link #DENSITY_DPI_UNDEFINED} if no density is specified. + */ + public int densityDpi; + /** @hide Hack to get this information from WM to app running in compat mode. */ public int compatScreenWidthDp; /** @hide Hack to get this information from WM to app running in compat mode. */ @@ -454,6 +484,7 @@ public final class Configuration implements Parcelable, Comparable<Configuration screenWidthDp = o.screenWidthDp; screenHeightDp = o.screenHeightDp; smallestScreenWidthDp = o.smallestScreenWidthDp; + densityDpi = o.densityDpi; compatScreenWidthDp = o.compatScreenWidthDp; compatScreenHeightDp = o.compatScreenHeightDp; compatSmallestScreenWidthDp = o.compatSmallestScreenWidthDp; @@ -465,15 +496,23 @@ public final class Configuration implements Parcelable, Comparable<Configuration sb.append("{"); sb.append(fontScale); sb.append(" "); - sb.append(mcc); - sb.append("mcc"); - sb.append(mnc); - sb.append("mnc"); + if (mcc != 0) { + sb.append(mcc); + sb.append("mcc"); + } else { + sb.append("?mcc"); + } + if (mnc != 0) { + sb.append(mnc); + sb.append("mnc"); + } else { + sb.append("?mnc"); + } if (locale != null) { sb.append(" "); sb.append(locale); } else { - sb.append(" (no locale)"); + sb.append(" ?locale"); } switch (layoutDirection) { case View.LAYOUT_DIRECTION_LTR: /* ltr not interesting */ break; @@ -495,6 +534,11 @@ public final class Configuration implements Parcelable, Comparable<Configuration } else { sb.append(" ?hdp"); } + if (densityDpi != DENSITY_DPI_UNDEFINED) { + sb.append(" "); sb.append(densityDpi); sb.append("dpi"); + } else { + sb.append(" ?density"); + } switch ((screenLayout&SCREENLAYOUT_SIZE_MASK)) { case SCREENLAYOUT_SIZE_UNDEFINED: sb.append(" ?lsize"); break; case SCREENLAYOUT_SIZE_SMALL: sb.append(" smll"); break; @@ -601,6 +645,7 @@ public final class Configuration implements Parcelable, Comparable<Configuration screenWidthDp = compatScreenWidthDp = SCREEN_WIDTH_DP_UNDEFINED; screenHeightDp = compatScreenHeightDp = SCREEN_HEIGHT_DP_UNDEFINED; smallestScreenWidthDp = compatSmallestScreenWidthDp = SMALLEST_SCREEN_WIDTH_DP_UNDEFINED; + densityDpi = DENSITY_DPI_UNDEFINED; layoutDirection = View.LAYOUT_DIRECTION_LTR; seq = 0; } @@ -707,8 +752,13 @@ public final class Configuration implements Parcelable, Comparable<Configuration screenHeightDp = delta.screenHeightDp; } if (delta.smallestScreenWidthDp != SMALLEST_SCREEN_WIDTH_DP_UNDEFINED) { + changed |= ActivityInfo.CONFIG_SCREEN_SIZE; smallestScreenWidthDp = delta.smallestScreenWidthDp; } + if (delta.densityDpi != DENSITY_DPI_UNDEFINED) { + changed |= ActivityInfo.CONFIG_DENSITY; + densityDpi = delta.densityDpi; + } if (delta.compatScreenWidthDp != SCREEN_WIDTH_DP_UNDEFINED) { compatScreenWidthDp = delta.compatScreenWidthDp; } @@ -818,6 +868,10 @@ public final class Configuration implements Parcelable, Comparable<Configuration && smallestScreenWidthDp != delta.smallestScreenWidthDp) { changed |= ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE; } + if (delta.densityDpi != DENSITY_DPI_UNDEFINED + && densityDpi != delta.densityDpi) { + changed |= ActivityInfo.CONFIG_DENSITY; + } return changed; } @@ -902,6 +956,7 @@ public final class Configuration implements Parcelable, Comparable<Configuration dest.writeInt(screenWidthDp); dest.writeInt(screenHeightDp); dest.writeInt(smallestScreenWidthDp); + dest.writeInt(densityDpi); dest.writeInt(compatScreenWidthDp); dest.writeInt(compatScreenHeightDp); dest.writeInt(compatSmallestScreenWidthDp); @@ -930,6 +985,7 @@ public final class Configuration implements Parcelable, Comparable<Configuration screenWidthDp = source.readInt(); screenHeightDp = source.readInt(); smallestScreenWidthDp = source.readInt(); + densityDpi = source.readInt(); compatScreenWidthDp = source.readInt(); compatScreenHeightDp = source.readInt(); compatSmallestScreenWidthDp = source.readInt(); @@ -1000,6 +1056,8 @@ public final class Configuration implements Parcelable, Comparable<Configuration n = this.screenHeightDp - that.screenHeightDp; if (n != 0) return n; n = this.smallestScreenWidthDp - that.smallestScreenWidthDp; + if (n != 0) return n; + n = this.densityDpi - that.densityDpi; //if (n != 0) return n; return n; } @@ -1036,6 +1094,7 @@ public final class Configuration implements Parcelable, Comparable<Configuration result = 31 * result + screenWidthDp; result = 31 * result + screenHeightDp; result = 31 * result + smallestScreenWidthDp; + result = 31 * result + densityDpi; return result; } } diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index c630bb5..c7e55ce 100755 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -693,9 +693,9 @@ public class Resources { */ if (value.density > 0 && value.density != TypedValue.DENSITY_NONE) { if (value.density == density) { - value.density = DisplayMetrics.DENSITY_DEVICE; + value.density = mMetrics.densityDpi; } else { - value.density = (value.density * DisplayMetrics.DENSITY_DEVICE) / density; + value.density = (value.density * mMetrics.densityDpi) / density; } } @@ -1435,7 +1435,8 @@ public class Resources { if (config != null) { mTmpConfig.setTo(config); if (mCompatibilityInfo != null) { - mCompatibilityInfo.applyToConfiguration(mTmpConfig); + mCompatibilityInfo.applyToConfiguration(mMetrics.noncompatDensityDpi, + mTmpConfig); } if (mTmpConfig.locale == null) { mTmpConfig.locale = Locale.getDefault(); @@ -1474,7 +1475,7 @@ public class Resources { mAssets.setConfiguration(mConfiguration.mcc, mConfiguration.mnc, locale, mConfiguration.orientation, mConfiguration.touchscreen, - (int)(mMetrics.density*160), mConfiguration.keyboard, + mConfiguration.densityDpi, mConfiguration.keyboard, keyboardHidden, mConfiguration.navigation, width, height, mConfiguration.smallestScreenWidthDp, mConfiguration.screenWidthDp, mConfiguration.screenHeightDp, diff --git a/core/java/android/util/DisplayMetrics.java b/core/java/android/util/DisplayMetrics.java index 80da0b2..d58eec4 100644 --- a/core/java/android/util/DisplayMetrics.java +++ b/core/java/android/util/DisplayMetrics.java @@ -79,10 +79,19 @@ public class DisplayMetrics { public static final int DENSITY_DEFAULT = DENSITY_MEDIUM; /** + * Scaling factor to convert a density in DPI units to the density scale. + * @hide + */ + public static final float DENSITY_DEFAULT_SCALE = 1.0f / DENSITY_DEFAULT; + + /** * The device's density. - * @hide becase eventually this should be able to change while + * @hide because eventually this should be able to change while * running, so shouldn't be a constant. + * @deprecated There is no longer a static density; you can find the + * density for a display in {@link #densityDpi}. */ + @Deprecated public static final int DENSITY_DEVICE = getDeviceDensity(); /** @@ -150,6 +159,12 @@ public class DisplayMetrics { */ public float noncompatDensity; /** + * The reported display density prior to any compatibility mode scaling + * being applied. + * @hide + */ + public int noncompatDensityDpi; + /** * The reported scaled density prior to any compatibility mode scaling * being applied. * @hide @@ -182,6 +197,7 @@ public class DisplayMetrics { noncompatWidthPixels = o.noncompatWidthPixels; noncompatHeightPixels = o.noncompatHeightPixels; noncompatDensity = o.noncompatDensity; + noncompatDensityDpi = o.noncompatDensityDpi; noncompatScaledDensity = o.noncompatScaledDensity; noncompatXdpi = o.noncompatXdpi; noncompatYdpi = o.noncompatYdpi; @@ -190,11 +206,11 @@ public class DisplayMetrics { public void setToDefaults() { widthPixels = 0; heightPixels = 0; - density = DENSITY_DEVICE / (float) DENSITY_DEFAULT; - densityDpi = DENSITY_DEVICE; + density = noncompatDensity = DENSITY_DEVICE / (float) DENSITY_DEFAULT; + densityDpi = noncompatDensityDpi = DENSITY_DEVICE; scaledDensity = density; - xdpi = DENSITY_DEVICE; - ydpi = DENSITY_DEVICE; + xdpi = noncompatXdpi = DENSITY_DEVICE; + ydpi = noncompatYdpi = DENSITY_DEVICE; noncompatWidthPixels = 0; noncompatHeightPixels = 0; } diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java index 46e4d6e..6fd5b01 100644 --- a/core/java/android/view/Display.java +++ b/core/java/android/view/Display.java @@ -21,7 +21,6 @@ import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.Rect; import android.hardware.display.DisplayManager; -import android.os.RemoteException; import android.os.SystemClock; import android.util.DisplayMetrics; import android.util.Log; diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java index 69b6d67..c65ce63 100644 --- a/core/java/android/view/DisplayInfo.java +++ b/core/java/android/view/DisplayInfo.java @@ -102,10 +102,10 @@ public final class DisplayInfo implements Parcelable { public float refreshRate; /** - * The logical display density which represents the scaling factor for - * the Density Independent Pixel unit. + * The logical display density which is the basis for density-independent + * pixels. */ - public float logicalDensity; + public int logicalDensityDpi; /** * The exact physical pixels per inch of the screen in the X dimension. @@ -158,7 +158,7 @@ public final class DisplayInfo implements Parcelable { logicalHeight = other.logicalHeight; rotation = other.rotation; refreshRate = other.refreshRate; - logicalDensity = other.logicalDensity; + logicalDensityDpi = other.logicalDensityDpi; physicalXDpi = other.physicalXDpi; physicalYDpi = other.physicalYDpi; } @@ -174,7 +174,7 @@ public final class DisplayInfo implements Parcelable { logicalHeight = source.readInt(); rotation = source.readInt(); refreshRate = source.readFloat(); - logicalDensity = source.readFloat(); + logicalDensityDpi = source.readInt(); physicalXDpi = source.readFloat(); physicalYDpi = source.readFloat(); } @@ -191,7 +191,7 @@ public final class DisplayInfo implements Parcelable { dest.writeInt(logicalHeight); dest.writeInt(rotation); dest.writeFloat(refreshRate); - dest.writeFloat(logicalDensity); + dest.writeInt(logicalDensityDpi); dest.writeFloat(physicalXDpi); dest.writeFloat(physicalYDpi); } @@ -206,12 +206,12 @@ public final class DisplayInfo implements Parcelable { private void getMetricsWithSize(DisplayMetrics outMetrics, CompatibilityInfoHolder cih, int width, int height) { - outMetrics.densityDpi = - (int)((logicalDensity * DisplayMetrics.DENSITY_DEFAULT) + .5f); + outMetrics.densityDpi = outMetrics.noncompatDensityDpi = logicalDensityDpi; outMetrics.noncompatWidthPixels = outMetrics.widthPixels = width; outMetrics.noncompatHeightPixels = outMetrics.heightPixels = height; - outMetrics.density = outMetrics.noncompatDensity = logicalDensity; + outMetrics.density = outMetrics.noncompatDensity = + logicalDensityDpi * DisplayMetrics.DENSITY_DEFAULT_SCALE; outMetrics.scaledDensity = outMetrics.noncompatScaledDensity = outMetrics.density; outMetrics.xdpi = outMetrics.noncompatXdpi = physicalXDpi; outMetrics.ydpi = outMetrics.noncompatYdpi = physicalYDpi; diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index befa0c0..1ad42f5 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -318,6 +318,7 @@ public final class ViewRootImpl implements ViewParent, HashSet<View> mTempHashSet; private final int mDensity; + private final int mNoncompatDensity; /** * Consistency verifier for debugging purposes. @@ -390,6 +391,7 @@ public final class ViewRootImpl implements ViewParent, mAttachInfo = new View.AttachInfo(sWindowSession, mWindow, this, mHandler, this); mViewConfiguration = ViewConfiguration.get(context); mDensity = context.getResources().getDisplayMetrics().densityDpi; + mNoncompatDensity = context.getResources().getDisplayMetrics().noncompatDensityDpi; mFallbackEventHandler = PolicyManager.makeNewFallbackEventHandler(context); mProfileRendering = Boolean.parseBoolean( SystemProperties.get(PROPERTY_PROFILE_RENDERING, "false")); @@ -2272,8 +2274,7 @@ public final class ViewRootImpl implements ViewParent, if (mTranslator != null) { mTranslator.translateCanvas(canvas); } - canvas.setScreenDensity(scalingRequired - ? DisplayMetrics.DENSITY_DEVICE : 0); + canvas.setScreenDensity(scalingRequired ? mNoncompatDensity : 0); attachInfo.mSetIgnoreDirtyState = false; mView.draw(canvas); @@ -2673,7 +2674,7 @@ public final class ViewRootImpl implements ViewParent, CompatibilityInfo ci = mCompatibilityInfo.getIfNeeded(); if (ci != null) { config = new Configuration(config); - ci.applyToConfiguration(config); + ci.applyToConfiguration(mNoncompatDensity, config); } synchronized (sConfigCallbacks) { @@ -2684,7 +2685,7 @@ public final class ViewRootImpl implements ViewParent, if (mView != null) { // At this point the resources have been updated to // have the most recent config, whatever that is. Use - // the on in them which may be newer. + // the one in them which may be newer. config = mView.getResources().getConfiguration(); if (force || mLastConfiguration.diff(config) != 0) { mLastConfiguration.setTo(config); diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java index 07bcbdc..540acfa 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -778,7 +778,7 @@ public abstract class Drawable { // to the compatibility density only to have them scaled back up when // drawn to the screen. if (opts == null) opts = new BitmapFactory.Options(); - opts.inScreenDensity = DisplayMetrics.DENSITY_DEVICE; + opts.inScreenDensity = res.getDisplayMetrics().noncompatDensityDpi; Bitmap bm = BitmapFactory.decodeResourceStream(res, value, is, pad, opts); if (bm != null) { byte[] np = bm.getNinePatchChunk(); diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java index b68b267..62aea71 100644 --- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java +++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java @@ -296,7 +296,7 @@ public class NinePatchDrawable extends Drawable { if (dither) { options.inDither = false; } - options.inScreenDensity = DisplayMetrics.DENSITY_DEVICE; + options.inScreenDensity = r.getDisplayMetrics().noncompatDensityDpi; final Rect padding = new Rect(); final Rect layoutInsets = new Rect(); diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 15d53fb..97b4cb5 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -1018,9 +1018,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { com.android.internal.R.dimen.navigation_bar_width); // SystemUI (status bar) layout policy + DisplayMetrics metrics = new DisplayMetrics(); + mDisplay.getMetrics(metrics); int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT - / DisplayMetrics.DENSITY_DEVICE; + / metrics.densityDpi; if (shortSizeDp < 600) { // 0-599dp: "phone" UI with a separate status & navigation bar diff --git a/services/java/com/android/server/display/DisplayDeviceInfo.java b/services/java/com/android/server/display/DisplayDeviceInfo.java index c28b9bb..c60c2e9 100644 --- a/services/java/com/android/server/display/DisplayDeviceInfo.java +++ b/services/java/com/android/server/display/DisplayDeviceInfo.java @@ -33,7 +33,7 @@ public final class DisplayDeviceInfo { public int height; public float refreshRate; - public float density; + public int densityDpi; public float xDpi; public float yDpi; @@ -41,7 +41,7 @@ public final class DisplayDeviceInfo { width = other.width; height = other.height; refreshRate = other.refreshRate; - density = other.density; + densityDpi = other.densityDpi; xDpi = other.xDpi; yDpi = other.yDpi; } @@ -49,6 +49,6 @@ public final class DisplayDeviceInfo { @Override public String toString() { return width + " x " + height + ", " + refreshRate + " fps, " - + "density " + density + ", " + xDpi + " x " + yDpi + " dpi"; + + "density " + densityDpi + ", " + xDpi + " x " + yDpi + " dpi"; } } diff --git a/services/java/com/android/server/display/DisplayManagerService.java b/services/java/com/android/server/display/DisplayManagerService.java index 082d28f..e714064 100644 --- a/services/java/com/android/server/display/DisplayManagerService.java +++ b/services/java/com/android/server/display/DisplayManagerService.java @@ -144,7 +144,7 @@ public final class DisplayManagerService extends IDisplayManager.Stub { mDefaultDisplayInfo.logicalHeight = mDefaultDisplayDeviceInfo.height; mDefaultDisplayInfo.rotation = Surface.ROTATION_0; mDefaultDisplayInfo.refreshRate = mDefaultDisplayDeviceInfo.refreshRate; - mDefaultDisplayInfo.logicalDensity = mDefaultDisplayDeviceInfo.density; + mDefaultDisplayInfo.logicalDensityDpi = mDefaultDisplayDeviceInfo.densityDpi; mDefaultDisplayInfo.physicalXDpi = mDefaultDisplayDeviceInfo.xDpi; mDefaultDisplayInfo.physicalYDpi = mDefaultDisplayDeviceInfo.yDpi; mDefaultDisplayInfo.smallestNominalAppWidth = mDefaultDisplayDeviceInfo.width; diff --git a/services/java/com/android/server/display/HeadlessDisplayAdapter.java b/services/java/com/android/server/display/HeadlessDisplayAdapter.java index d2a70d2..cd18c37 100644 --- a/services/java/com/android/server/display/HeadlessDisplayAdapter.java +++ b/services/java/com/android/server/display/HeadlessDisplayAdapter.java @@ -16,6 +16,8 @@ package com.android.server.display; +import android.util.DisplayMetrics; + /** * Provides a fake default display for headless systems. */ @@ -26,7 +28,7 @@ public final class HeadlessDisplayAdapter extends DisplayAdapter { outInfo.width = 640; outInfo.height = 480; outInfo.refreshRate = 60; - outInfo.density = 1.0f; + outInfo.densityDpi = DisplayMetrics.DENSITY_DEFAULT; outInfo.xDpi = 160; outInfo.yDpi = 160; } diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index d0aea12..1283da3 100755 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -6546,6 +6546,7 @@ public class WindowManagerService extends IWindowManager.Stub config.compatScreenWidthDp = (int)(config.screenWidthDp / mCompatibleScreenScale); config.compatScreenHeightDp = (int)(config.screenHeightDp / mCompatibleScreenScale); config.compatSmallestScreenWidthDp = computeCompatSmallestWidth(rotated, dm, dw, dh); + config.densityDpi = mDisplayMetrics.densityDpi; // Update the configuration based on available input devices, lid switch, // and platform configuration. diff --git a/services/jni/com_android_server_display_SurfaceFlingerDisplayAdapter.cpp b/services/jni/com_android_server_display_SurfaceFlingerDisplayAdapter.cpp index e636eed..05a74d3 100644 --- a/services/jni/com_android_server_display_SurfaceFlingerDisplayAdapter.cpp +++ b/services/jni/com_android_server_display_SurfaceFlingerDisplayAdapter.cpp @@ -31,7 +31,7 @@ static struct { jfieldID width; jfieldID height; jfieldID refreshRate; - jfieldID density; + jfieldID densityDpi; jfieldID xDpi; jfieldID yDpi; } gDisplayDeviceInfoClassInfo; @@ -49,7 +49,8 @@ static void nativeGetDefaultDisplayDeviceInfo(JNIEnv* env, jclass clazz, jobject env->SetIntField(infoObj, gDisplayDeviceInfoClassInfo.width, info.w); env->SetIntField(infoObj, gDisplayDeviceInfoClassInfo.height, info.h); env->SetFloatField(infoObj, gDisplayDeviceInfoClassInfo.refreshRate, info.fps); - env->SetFloatField(infoObj, gDisplayDeviceInfoClassInfo.density, info.density); + env->SetIntField(infoObj, gDisplayDeviceInfoClassInfo.densityDpi, + (jint)((info.density*160) + .5f)); env->SetFloatField(infoObj, gDisplayDeviceInfoClassInfo.xDpi, info.xdpi); env->SetFloatField(infoObj, gDisplayDeviceInfoClassInfo.yDpi, info.ydpi); } @@ -81,7 +82,7 @@ int register_android_server_display_SurfaceFlingerDisplayAdapter(JNIEnv* env) { GET_FIELD_ID(gDisplayDeviceInfoClassInfo.width, clazz, "width", "I"); GET_FIELD_ID(gDisplayDeviceInfoClassInfo.height, clazz, "height", "I"); GET_FIELD_ID(gDisplayDeviceInfoClassInfo.refreshRate, clazz, "refreshRate", "F"); - GET_FIELD_ID(gDisplayDeviceInfoClassInfo.density, clazz, "density", "F"); + GET_FIELD_ID(gDisplayDeviceInfoClassInfo.densityDpi, clazz, "densityDpi", "I"); GET_FIELD_ID(gDisplayDeviceInfoClassInfo.xDpi, clazz, "xDpi", "F"); GET_FIELD_ID(gDisplayDeviceInfoClassInfo.yDpi, clazz, "yDpi", "F"); return 0; diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java index 7323c6a..de65fd4 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java @@ -100,7 +100,7 @@ public abstract class RenderAction<T extends RenderParams> extends FrameworkReso // setup the display Metrics. DisplayMetrics metrics = new DisplayMetrics(); - metrics.densityDpi = mParams.getDensity().getDpiValue(); + metrics.densityDpi = metrics.noncompatDensityDpi = mParams.getDensity().getDpiValue(); metrics.density = metrics.noncompatDensity = metrics.densityDpi / (float) DisplayMetrics.DENSITY_DEFAULT; @@ -335,6 +335,7 @@ public abstract class RenderAction<T extends RenderParams> extends FrameworkReso } else { config.smallestScreenWidthDp = config.screenWidthDp; } + config.densityDpi = density.getDpiValue(); // never run in compat mode: config.compatScreenWidthDp = config.screenWidthDp; |