Skip to content

Commit 908aecc

Browse files
author
Dianne Hackborn
committed
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
1 parent b198004 commit 908aecc

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)