Skip to content

Commit e6184f8

Browse files
Dianne HackbornAndroid (Google) Code Review
authored andcommitted
Merge "Start moving away from DisplayMetrics.DENSITY_DEVICE." into jb-mr1-dev
2 parents ff90919 + 908aecc commit e6184f8

File tree

20 files changed

+169
-61
lines changed

20 files changed

+169
-61
lines changed

api/current.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6208,6 +6208,7 @@ package android.content.pm {
62086208
method public int describeContents();
62096209
method public void dump(android.util.Printer, java.lang.String);
62106210
method public final int getThemeResource();
6211+
field public static final int CONFIG_DENSITY = 4096; // 0x1000
62116212
field public static final int CONFIG_FONT_SCALE = 1073741824; // 0x40000000
62126213
field public static final int CONFIG_KEYBOARD = 16; // 0x10
62136214
field public static final int CONFIG_KEYBOARD_HIDDEN = 32; // 0x20
@@ -6802,6 +6803,7 @@ package android.content.res {
68026803
method public int updateFrom(android.content.res.Configuration);
68036804
method public void writeToParcel(android.os.Parcel, int);
68046805
field public static final android.os.Parcelable.Creator CREATOR;
6806+
field public static final int DENSITY_DPI_UNDEFINED = 0; // 0x0
68056807
field public static final int HARDKEYBOARDHIDDEN_NO = 1; // 0x1
68066808
field public static final int HARDKEYBOARDHIDDEN_UNDEFINED = 0; // 0x0
68076809
field public static final int HARDKEYBOARDHIDDEN_YES = 2; // 0x2
@@ -6852,6 +6854,7 @@ package android.content.res {
68526854
field public static final int UI_MODE_TYPE_NORMAL = 1; // 0x1
68536855
field public static final int UI_MODE_TYPE_TELEVISION = 4; // 0x4
68546856
field public static final int UI_MODE_TYPE_UNDEFINED = 0; // 0x0
6857+
field public int densityDpi;
68556858
field public float fontScale;
68566859
field public int hardKeyboardHidden;
68576860
field public int keyboard;

core/java/android/app/ActivityThread.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ public final class ActivityThread {
166166
= new HashMap<IBinder, Service>();
167167
AppBindData mBoundApplication;
168168
Profiler mProfiler;
169+
int mCurDefaultDisplayDpi;
169170
Configuration mConfiguration;
170171
Configuration mCompatConfiguration;
171172
Configuration mResConfiguration;
@@ -1306,6 +1307,7 @@ public void handleMessage(Message msg) {
13061307
break;
13071308
case CONFIGURATION_CHANGED:
13081309
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "configChanged");
1310+
mCurDefaultDisplayDpi = ((Configuration)msg.obj).densityDpi;
13091311
handleConfigurationChanged((Configuration)msg.obj, null);
13101312
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
13111313
break;
@@ -1539,14 +1541,15 @@ DisplayMetrics getDisplayMetricsLocked(CompatibilityInfo ci, boolean forceUpdate
15391541
}
15401542

15411543
private Configuration mMainThreadConfig = new Configuration();
1542-
Configuration applyConfigCompatMainThread(Configuration config, CompatibilityInfo compat) {
1544+
Configuration applyConfigCompatMainThread(int displayDensity, Configuration config,
1545+
CompatibilityInfo compat) {
15431546
if (config == null) {
15441547
return null;
15451548
}
15461549
if (compat != null && !compat.supportsScreen()) {
15471550
mMainThreadConfig.setTo(config);
15481551
config = mMainThreadConfig;
1549-
compat.applyToConfiguration(config);
1552+
compat.applyToConfiguration(displayDensity, config);
15501553
}
15511554
return config;
15521555
}
@@ -3464,6 +3467,7 @@ private void handleRelaunchActivity(ActivityClientRecord tmp) {
34643467

34653468
// If there was a pending configuration change, execute it first.
34663469
if (changedConfig != null) {
3470+
mCurDefaultDisplayDpi = changedConfig.densityDpi;
34673471
handleConfigurationChanged(changedConfig, null);
34683472
}
34693473

@@ -3546,8 +3550,8 @@ ArrayList<ComponentCallbacks2> collectComponentCallbacksLocked(
35463550
for (ActivityClientRecord ar : mActivities.values()) {
35473551
Activity a = ar.activity;
35483552
if (a != null) {
3549-
Configuration thisConfig = applyConfigCompatMainThread(newConfig,
3550-
ar.packageInfo.mCompatibilityInfo.getIfNeeded());
3553+
Configuration thisConfig = applyConfigCompatMainThread(mCurDefaultDisplayDpi,
3554+
newConfig, ar.packageInfo.mCompatibilityInfo.getIfNeeded());
35513555
if (!ar.activity.mFinished && (allActivities || !ar.paused)) {
35523556
// If the activity is currently resumed, its configuration
35533557
// needs to change right now.
@@ -3691,14 +3695,14 @@ final boolean applyConfigurationToResourcesLocked(Configuration config,
36913695
return changes != 0;
36923696
}
36933697

3694-
final Configuration applyCompatConfiguration() {
3698+
final Configuration applyCompatConfiguration(int displayDensity) {
36953699
Configuration config = mConfiguration;
36963700
if (mCompatConfiguration == null) {
36973701
mCompatConfiguration = new Configuration();
36983702
}
36993703
mCompatConfiguration.setTo(mConfiguration);
37003704
if (mResCompatibilityInfo != null && !mResCompatibilityInfo.supportsScreen()) {
3701-
mResCompatibilityInfo.applyToConfiguration(mCompatConfiguration);
3705+
mResCompatibilityInfo.applyToConfiguration(displayDensity, mCompatConfiguration);
37023706
config = mCompatConfiguration;
37033707
}
37043708
return config;
@@ -3713,6 +3717,7 @@ final void handleConfigurationChanged(Configuration config, CompatibilityInfo co
37133717
if (mPendingConfiguration != null) {
37143718
if (!mPendingConfiguration.isOtherSeqNewer(config)) {
37153719
config = mPendingConfiguration;
3720+
mCurDefaultDisplayDpi = config.densityDpi;
37163721
}
37173722
mPendingConfiguration = null;
37183723
}
@@ -3734,7 +3739,7 @@ final void handleConfigurationChanged(Configuration config, CompatibilityInfo co
37343739
}
37353740
configDiff = mConfiguration.diff(config);
37363741
mConfiguration.updateFrom(config);
3737-
config = applyCompatConfiguration();
3742+
config = applyCompatConfiguration(mCurDefaultDisplayDpi);
37383743
callbacks = collectComponentCallbacksLocked(false, config);
37393744
}
37403745

@@ -3933,7 +3938,7 @@ private void handleBindApplication(AppBindData data) {
39333938
// Persistent processes on low-memory devices do not get to
39343939
// use hardware accelerated drawing, since this can add too much
39353940
// overhead to the process.
3936-
Display display = WindowManagerImpl.getDefault().getDefaultDisplay();
3941+
final Display display = WindowManagerImpl.getDefault().getDefaultDisplay();
39373942
if (!ActivityManager.isHighEndGfx(display)) {
39383943
HardwareRenderer.disable(false);
39393944
}
@@ -3970,7 +3975,8 @@ private void handleBindApplication(AppBindData data) {
39703975
* in AppBindData can be safely assumed to be up to date
39713976
*/
39723977
applyConfigurationToResourcesLocked(data.config, data.compatInfo);
3973-
applyCompatConfiguration();
3978+
mCurDefaultDisplayDpi = data.config.densityDpi;
3979+
applyCompatConfiguration(mCurDefaultDisplayDpi);
39743980

39753981
data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
39763982

core/java/android/app/WallpaperManager.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import android.util.DisplayMetrics;
4343
import android.util.Log;
4444
import android.view.ViewRootImpl;
45+
import android.view.WindowManager;
4546

4647
import java.io.FileOutputStream;
4748
import java.io.IOException;
@@ -241,7 +242,7 @@ public Bitmap peekWallpaperBitmap(Context context, boolean returnDefault) {
241242
}
242243
mWallpaper = null;
243244
try {
244-
mWallpaper = getCurrentWallpaperLocked();
245+
mWallpaper = getCurrentWallpaperLocked(context);
245246
} catch (OutOfMemoryError e) {
246247
Log.w(TAG, "No memory load current wallpaper", e);
247248
}
@@ -264,7 +265,7 @@ public void forgetLoadedWallpaper() {
264265
}
265266
}
266267

267-
private Bitmap getCurrentWallpaperLocked() {
268+
private Bitmap getCurrentWallpaperLocked(Context context) {
268269
try {
269270
Bundle params = new Bundle();
270271
ParcelFileDescriptor fd = mService.getWallpaper(this, params);
@@ -276,7 +277,7 @@ private Bitmap getCurrentWallpaperLocked() {
276277
BitmapFactory.Options options = new BitmapFactory.Options();
277278
Bitmap bm = BitmapFactory.decodeFileDescriptor(
278279
fd.getFileDescriptor(), null, options);
279-
return generateBitmap(bm, width, height);
280+
return generateBitmap(context, bm, width, height);
280281
} catch (OutOfMemoryError e) {
281282
Log.w(TAG, "Can't decode file", e);
282283
} finally {
@@ -304,7 +305,7 @@ private Bitmap getDefaultWallpaperLocked(Context context) {
304305
try {
305306
BitmapFactory.Options options = new BitmapFactory.Options();
306307
Bitmap bm = BitmapFactory.decodeStream(is, null, options);
307-
return generateBitmap(bm, width, height);
308+
return generateBitmap(context, bm, width, height);
308309
} catch (OutOfMemoryError e) {
309310
Log.w(TAG, "Can't decode stream", e);
310311
} finally {
@@ -768,12 +769,15 @@ public void clear() throws IOException {
768769
setResource(com.android.internal.R.drawable.default_wallpaper);
769770
}
770771

771-
static Bitmap generateBitmap(Bitmap bm, int width, int height) {
772+
static Bitmap generateBitmap(Context context, Bitmap bm, int width, int height) {
772773
if (bm == null) {
773774
return null;
774775
}
775776

776-
bm.setDensity(DisplayMetrics.DENSITY_DEVICE);
777+
WindowManager wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
778+
DisplayMetrics metrics = new DisplayMetrics();
779+
wm.getDefaultDisplay().getMetrics(metrics);
780+
bm.setDensity(metrics.noncompatDensityDpi);
777781

778782
if (width <= 0 || height <= 0
779783
|| (bm.getWidth() == width && bm.getHeight() == height)) {
@@ -783,7 +787,7 @@ static Bitmap generateBitmap(Bitmap bm, int width, int height) {
783787
// This is the final bitmap we want to return.
784788
try {
785789
Bitmap newbm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
786-
newbm.setDensity(DisplayMetrics.DENSITY_DEVICE);
790+
newbm.setDensity(metrics.noncompatDensityDpi);
787791

788792
Canvas c = new Canvas(newbm);
789793
Rect targetRect = new Rect();

core/java/android/content/pm/ActivityInfo.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,12 @@ public class ActivityInfo extends ComponentInfo
356356
* they are interested in. Please don't do that, thanks.
357357
*/
358358
public static final int CONFIG_SMALLEST_SCREEN_SIZE = 0x0800;
359+
/**
360+
* Bit in {@link #configChanges} that indicates that the activity
361+
* can itself handle density changes. Set from the
362+
* {@link android.R.attr#configChanges} attribute.
363+
*/
364+
public static final int CONFIG_DENSITY = 0x1000;
359365
/**
360366
* Bit in {@link #configChanges} that indicates that the activity
361367
* can itself handle changes to the font scaling factor. Set from the
@@ -383,6 +389,7 @@ public class ActivityInfo extends ComponentInfo
383389
0x1000, // UI MODE
384390
0x0200, // SCREEN SIZE
385391
0x2000, // SMALLEST SCREEN SIZE
392+
0x0100, // DENSITY
386393
};
387394
/** @hide
388395
* Convert Java change bits to native.

core/java/android/content/res/CompatibilityInfo.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ public void applyToDisplayMetrics(DisplayMetrics inoutDm) {
439439
if (isScalingRequired()) {
440440
float invertedRatio = applicationInvertedScale;
441441
inoutDm.density = inoutDm.noncompatDensity * invertedRatio;
442-
inoutDm.densityDpi = (int)((inoutDm.density*DisplayMetrics.DENSITY_DEFAULT)+.5f);
442+
inoutDm.densityDpi = (int)((inoutDm.noncompatDensityDpi * invertedRatio) + .5f);
443443
inoutDm.scaledDensity = inoutDm.noncompatScaledDensity * invertedRatio;
444444
inoutDm.xdpi = inoutDm.noncompatXdpi * invertedRatio;
445445
inoutDm.ydpi = inoutDm.noncompatYdpi * invertedRatio;
@@ -448,7 +448,7 @@ public void applyToDisplayMetrics(DisplayMetrics inoutDm) {
448448
}
449449
}
450450

451-
public void applyToConfiguration(Configuration inoutConfig) {
451+
public void applyToConfiguration(int displayDensity, Configuration inoutConfig) {
452452
if (!supportsScreen()) {
453453
// This is a larger screen device and the app is not
454454
// compatible with large screens, so we are forcing it to
@@ -460,6 +460,11 @@ public void applyToConfiguration(Configuration inoutConfig) {
460460
inoutConfig.screenHeightDp = inoutConfig.compatScreenHeightDp;
461461
inoutConfig.smallestScreenWidthDp = inoutConfig.compatSmallestScreenWidthDp;
462462
}
463+
inoutConfig.densityDpi = displayDensity;
464+
if (isScalingRequired()) {
465+
float invertedRatio = applicationInvertedScale;
466+
inoutConfig.densityDpi = (int)((inoutConfig.densityDpi * invertedRatio) + .5f);
467+
}
463468
}
464469

465470
/**

0 commit comments

Comments
 (0)