diff options
Diffstat (limited to 'core/java')
-rw-r--r-- | core/java/android/app/ActivityThread.java | 24 | ||||
-rw-r--r-- | core/java/android/app/WallpaperManager.java | 18 | ||||
-rw-r--r-- | core/java/android/content/pm/ActivityInfo.java | 7 | ||||
-rw-r--r-- | core/java/android/content/res/CompatibilityInfo.java | 9 | ||||
-rw-r--r-- | core/java/android/content/res/Configuration.java | 75 | ||||
-rwxr-xr-x | core/java/android/content/res/Resources.java | 9 | ||||
-rw-r--r-- | core/java/android/util/DisplayMetrics.java | 26 | ||||
-rw-r--r-- | core/java/android/view/Display.java | 1 | ||||
-rw-r--r-- | core/java/android/view/DisplayInfo.java | 18 | ||||
-rw-r--r-- | core/java/android/view/ViewRootImpl.java | 9 |
10 files changed, 147 insertions, 49 deletions
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); |