summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2012-07-31 16:37:34 -0700
committerDianne Hackborn <hackbod@google.com>2012-08-01 10:54:39 -0700
commit908aecc3a63c5520d5b11da14a9383f885b7d126 (patch)
tree11806df7f127ea695474ae7ab490a95c19965508
parentb1980049855fd6c53e109b44ff012a053f9436f7 (diff)
downloadframeworks_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
-rw-r--r--api/current.txt3
-rw-r--r--core/java/android/app/ActivityThread.java24
-rw-r--r--core/java/android/app/WallpaperManager.java18
-rw-r--r--core/java/android/content/pm/ActivityInfo.java7
-rw-r--r--core/java/android/content/res/CompatibilityInfo.java9
-rw-r--r--core/java/android/content/res/Configuration.java75
-rwxr-xr-xcore/java/android/content/res/Resources.java9
-rw-r--r--core/java/android/util/DisplayMetrics.java26
-rw-r--r--core/java/android/view/Display.java1
-rw-r--r--core/java/android/view/DisplayInfo.java18
-rw-r--r--core/java/android/view/ViewRootImpl.java9
-rw-r--r--graphics/java/android/graphics/drawable/Drawable.java2
-rw-r--r--graphics/java/android/graphics/drawable/NinePatchDrawable.java2
-rwxr-xr-xpolicy/src/com/android/internal/policy/impl/PhoneWindowManager.java4
-rw-r--r--services/java/com/android/server/display/DisplayDeviceInfo.java6
-rw-r--r--services/java/com/android/server/display/DisplayManagerService.java2
-rw-r--r--services/java/com/android/server/display/HeadlessDisplayAdapter.java4
-rwxr-xr-xservices/java/com/android/server/wm/WindowManagerService.java1
-rw-r--r--services/jni/com_android_server_display_SurfaceFlingerDisplayAdapter.cpp7
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java3
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;