am 0ed2e845: Merge "DO NOT MERGE. Integrate add new screen width/height in "dp" configs." into honeycomb-mr2

* commit '0ed2e845db3f6bc7bc12a08ada18363942c2fb3d':
  DO NOT MERGE.  Integrate add new screen width/height in "dp" configs.
This commit is contained in:
Dianne Hackborn
2011-05-13 11:18:40 -07:00
committed by Android Git Automerger
15 changed files with 433 additions and 27 deletions

View File

@ -57840,6 +57840,17 @@
visibility="public"
>
</field>
<field name="CONFIG_SCREEN_SIZE"
type="int"
transient="false"
volatile="false"
value="1024"
static="true"
final="true"
deprecated="not deprecated"
visibility="public"
>
</field>
<field name="CONFIG_TOUCHSCREEN"
type="int"
transient="false"
@ -63902,6 +63913,28 @@
visibility="public"
>
</field>
<field name="SCREEN_HEIGHT_DP_UNDEFINED"
type="int"
transient="false"
volatile="false"
value="0"
static="true"
final="true"
deprecated="not deprecated"
visibility="public"
>
</field>
<field name="SCREEN_WIDTH_DP_UNDEFINED"
type="int"
transient="false"
volatile="false"
value="0"
static="true"
final="true"
deprecated="not deprecated"
visibility="public"
>
</field>
<field name="TOUCHSCREEN_FINGER"
type="int"
transient="false"
@ -64145,6 +64178,16 @@
visibility="public"
>
</field>
<field name="screenHeightDp"
type="int"
transient="false"
volatile="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
</field>
<field name="screenLayout"
type="int"
transient="false"
@ -64155,6 +64198,16 @@
visibility="public"
>
</field>
<field name="screenWidthDp"
type="int"
transient="false"
volatile="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
</field>
<field name="touchscreen"
type="int"
transient="false"

View File

@ -332,6 +332,12 @@ public class ActivityInfo extends ComponentInfo
* {@link android.R.attr#configChanges} attribute.
*/
public static final int CONFIG_UI_MODE = 0x0200;
/**
* Bit in {@link #configChanges} that indicates that the activity
* can itself handle the screen size. Set from the
* {@link android.R.attr#configChanges} attribute.
*/
public static final int CONFIG_SCREEN_SIZE = 0x0400;
/**
* Bit in {@link #configChanges} that indicates that the activity
* can itself handle changes to the font scaling factor. Set from the
@ -341,6 +347,37 @@ public class ActivityInfo extends ComponentInfo
*/
public static final int CONFIG_FONT_SCALE = 0x40000000;
/** @hide
* Unfortunately the constants for config changes in native code are
* different from ActivityInfo. :( Here are the values we should use for the
* native side given the bit we have assigned in ActivityInfo.
*/
public static int[] CONFIG_NATIVE_BITS = new int[] {
0x0001, // MNC
0x0002, // MCC
0x0004, // LOCALE
0x0008, // TOUCH SCREEN
0x0010, // KEYBOARD
0x0020, // KEYBOARD HIDDEN
0x0040, // NAVIGATION
0x0080, // ORIENTATION
0x0800, // SCREEN LAYOUT
0x1000, // UI MODE
0x0200, // SCREEN SIZE
};
/** @hide
* Convert Java change bits to native.
*/
public static int activityInfoConfigToNative(int input) {
int output = 0;
for (int i=0; i<CONFIG_NATIVE_BITS.length; i++) {
if ((input&(1<<i)) != 0) {
output |= CONFIG_NATIVE_BITS[i];
}
}
return output;
}
/**
* Bit mask of kinds of configuration changes that this activity
* can handle itself (without being restarted by the system).

View File

@ -396,7 +396,7 @@ public class PackageParser {
int cookie = assmgr.addAssetPath(mArchiveSourcePath);
if (cookie != 0) {
res = new Resources(assmgr, metrics, null);
assmgr.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
assmgr.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Build.VERSION.RESOURCES_SDK_INT);
parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
assetError = false;
@ -596,7 +596,7 @@ public class PackageParser {
AssetManager assmgr = null;
try {
assmgr = new AssetManager();
assmgr.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
assmgr.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Build.VERSION.RESOURCES_SDK_INT);
int cookie = assmgr.addAssetPath(packageFilePath);
parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
@ -1931,6 +1931,10 @@ public class PackageParser {
a.info.configChanges = sa.getInt(
com.android.internal.R.styleable.AndroidManifestActivity_configChanges,
0);
if (owner.applicationInfo.targetSdkVersion
< android.os.Build.VERSION_CODES.HONEYCOMB_MR2) {
a.info.configChanges |= ActivityInfo.CONFIG_SCREEN_SIZE;
}
a.info.softInputMode = sa.getInt(
com.android.internal.R.styleable.AndroidManifestActivity_windowSoftInputMode,
0);

View File

@ -652,7 +652,8 @@ public final class AssetManager {
public native final void setConfiguration(int mcc, int mnc, String locale,
int orientation, int touchscreen, int density, int keyboard,
int keyboardHidden, int navigation, int screenWidth, int screenHeight,
int screenLayout, int uiMode, int majorVersion);
int screenWidthDp, int screenHeightDp, int screenLayout, int uiMode,
int majorVersion);
/**
* Retrieve the resource identifier for the given resource name.

View File

@ -245,6 +245,20 @@ public final class Configuration implements Parcelable, Comparable<Configuration
*/
public int uiMode;
public static final int SCREEN_WIDTH_DP_UNDEFINED = 0;
/**
* The current width of the available screen space, in dp units.
*/
public int screenWidthDp;
public static final int SCREEN_HEIGHT_DP_UNDEFINED = 0;
/**
* The current height of the available screen space, in dp units.
*/
public int screenHeightDp;
/**
* @hide Internal book-keeping.
*/
@ -282,6 +296,8 @@ public final class Configuration implements Parcelable, Comparable<Configuration
orientation = o.orientation;
screenLayout = o.screenLayout;
uiMode = o.uiMode;
screenWidthDp = o.screenWidthDp;
screenHeightDp = o.screenHeightDp;
seq = o.seq;
}
@ -320,6 +336,10 @@ public final class Configuration implements Parcelable, Comparable<Configuration
sb.append(java.lang.Integer.toHexString(screenLayout));
sb.append(" uiMode=0x");
sb.append(java.lang.Integer.toHexString(uiMode));
sb.append(" wdp=");
sb.append(screenWidthDp);
sb.append(" hdp=");
sb.append(screenHeightDp);
if (seq != 0) {
sb.append(" seq=");
sb.append(seq);
@ -345,6 +365,8 @@ public final class Configuration implements Parcelable, Comparable<Configuration
orientation = ORIENTATION_UNDEFINED;
screenLayout = SCREENLAYOUT_SIZE_UNDEFINED;
uiMode = UI_MODE_TYPE_UNDEFINED;
screenWidthDp = SCREEN_WIDTH_DP_UNDEFINED;
screenHeightDp = SCREEN_HEIGHT_DP_UNDEFINED;
seq = 0;
}
@ -438,6 +460,16 @@ public final class Configuration implements Parcelable, Comparable<Configuration
| (delta.uiMode&UI_MODE_NIGHT_MASK);
}
}
if (delta.screenWidthDp != SCREEN_WIDTH_DP_UNDEFINED
&& screenWidthDp != delta.screenWidthDp) {
changed |= ActivityInfo.CONFIG_SCREEN_SIZE;
screenWidthDp = delta.screenWidthDp;
}
if (delta.screenHeightDp != SCREEN_HEIGHT_DP_UNDEFINED
&& screenHeightDp != delta.screenHeightDp) {
changed |= ActivityInfo.CONFIG_SCREEN_SIZE;
screenHeightDp = delta.screenHeightDp;
}
if (delta.seq != 0) {
seq = delta.seq;
@ -467,9 +499,11 @@ public final class Configuration implements Parcelable, Comparable<Configuration
* {@link android.content.pm.ActivityInfo#CONFIG_NAVIGATION
* PackageManager.ActivityInfo.CONFIG_NAVIGATION},
* {@link android.content.pm.ActivityInfo#CONFIG_ORIENTATION
* PackageManager.ActivityInfo.CONFIG_ORIENTATION}, or
* PackageManager.ActivityInfo.CONFIG_ORIENTATION},
* {@link android.content.pm.ActivityInfo#CONFIG_SCREEN_LAYOUT
* PackageManager.ActivityInfo.CONFIG_SCREEN_LAYOUT}.
* PackageManager.ActivityInfo.CONFIG_SCREEN_LAYOUT}, or
* {@link android.content.pm.ActivityInfo#CONFIG_SCREEN_SIZE
* PackageManager.ActivityInfo.CONFIG_SCREEN_SIZE}.
*/
public int diff(Configuration delta) {
int changed = 0;
@ -522,6 +556,14 @@ public final class Configuration implements Parcelable, Comparable<Configuration
&& uiMode != delta.uiMode) {
changed |= ActivityInfo.CONFIG_UI_MODE;
}
if (delta.screenWidthDp != SCREEN_WIDTH_DP_UNDEFINED
&& screenWidthDp != delta.screenWidthDp) {
changed |= ActivityInfo.CONFIG_SCREEN_SIZE;
}
if (delta.screenHeightDp != SCREEN_HEIGHT_DP_UNDEFINED
&& screenHeightDp != delta.screenHeightDp) {
changed |= ActivityInfo.CONFIG_SCREEN_SIZE;
}
return changed;
}
@ -603,6 +645,8 @@ public final class Configuration implements Parcelable, Comparable<Configuration
dest.writeInt(orientation);
dest.writeInt(screenLayout);
dest.writeInt(uiMode);
dest.writeInt(screenWidthDp);
dest.writeInt(screenHeightDp);
dest.writeInt(seq);
}
@ -624,6 +668,8 @@ public final class Configuration implements Parcelable, Comparable<Configuration
orientation = source.readInt();
screenLayout = source.readInt();
uiMode = source.readInt();
screenWidthDp = source.readInt();
screenHeightDp = source.readInt();
seq = source.readInt();
}
@ -684,6 +730,10 @@ public final class Configuration implements Parcelable, Comparable<Configuration
n = this.screenLayout - that.screenLayout;
if (n != 0) return n;
n = this.uiMode - that.uiMode;
if (n != 0) return n;
n = this.screenWidthDp - that.screenWidthDp;
if (n != 0) return n;
n = this.screenHeightDp - that.screenHeightDp;
//if (n != 0) return n;
return n;
}
@ -717,6 +767,8 @@ public final class Configuration implements Parcelable, Comparable<Configuration
result = 31 * result + orientation;
result = 31 * result + screenLayout;
result = 31 * result + uiMode;
result = 31 * result + screenWidthDp;
result = 31 * result + screenHeightDp;
return result;
}
}

View File

@ -21,6 +21,7 @@ import com.android.internal.util.XmlUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.content.pm.ActivityInfo;
import android.graphics.Movie;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ColorDrawable;
@ -1418,6 +1419,7 @@ public class Resources {
mTmpConfig.setTo(config);
mCompatibilityInfo.applyToConfiguration(mTmpConfig);
configChanges = mConfiguration.updateFrom(mTmpConfig);
configChanges = ActivityInfo.activityInfoConfigToNative(configChanges);
}
if (mConfiguration.locale == null) {
mConfiguration.locale = Locale.getDefault();
@ -1456,6 +1458,7 @@ public class Resources {
mConfiguration.touchscreen,
(int)(mMetrics.density*160), mConfiguration.keyboard,
keyboardHidden, mConfiguration.navigation, width, height,
mConfiguration.screenWidthDp, mConfiguration.screenHeightDp,
mConfiguration.screenLayout, mConfiguration.uiMode,
Build.VERSION.RESOURCES_SDK_INT);

View File

@ -532,6 +532,7 @@ static void android_content_AssetManager_setConfiguration(JNIEnv* env, jobject c
jint keyboard, jint keyboardHidden,
jint navigation,
jint screenWidth, jint screenHeight,
jint screenWidthDp, jint screenHeightDp,
jint screenLayout, jint uiMode,
jint sdkVersion)
{
@ -555,6 +556,8 @@ static void android_content_AssetManager_setConfiguration(JNIEnv* env, jobject c
config.navigation = (uint8_t)navigation;
config.screenWidth = (uint16_t)screenWidth;
config.screenHeight = (uint16_t)screenHeight;
config.screenWidthDp = (uint16_t)screenWidthDp;
config.screenHeightDp = (uint16_t)screenHeightDp;
config.screenLayout = (uint8_t)screenLayout;
config.uiMode = (uint8_t)uiMode;
config.sdkVersion = (uint16_t)sdkVersion;
@ -1693,7 +1696,7 @@ static JNINativeMethod gAssetManagerMethods[] = {
(void*) android_content_AssetManager_setLocale },
{ "getLocales", "()[Ljava/lang/String;",
(void*) android_content_AssetManager_getLocales },
{ "setConfiguration", "(IILjava/lang/String;IIIIIIIIIII)V",
{ "setConfiguration", "(IILjava/lang/String;IIIIIIIIIIIII)V",
(void*) android_content_AssetManager_setConfiguration },
{ "getResourceIdentifier","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I",
(void*) android_content_AssetManager_getResourceIdentifier },

View File

@ -590,6 +590,11 @@
<!-- The global user interface mode has changed. For example,
going in or out of car mode, night mode changing, etc. -->
<flag name="uiMode" value="0x0200" />
<!-- The physical screen size has changed. If applications don't
target at least {@link android.os.Build.VERSION_CODES#HONEYCOMB_MR2}
then the activity will always handle this itself (the change
will not result in a restart). -->
<flag name="screenSize" value="0x0400" />
<!-- The font scaling factor has changed, that is the user has
selected a new global font size. -->
<flag name="fontScale" value="0x40000000" />

View File

@ -383,6 +383,46 @@ is not related to the screen orientation.</p>
which indicates whether the screen is long.</p>
</td>
</tr>
<tr id="ScreenWidthQualifier">
<td>Screen width</td>
<td>Examples:<br/>
<code>w720dp</code><br/>
<code>w1024dp</code><br/>
etc.
</td>
<td>
<p>Specifies a minimum screen width, in "dp" units, at which the resource
should be used. This configuration value will change when the orientation
changes between landscape and portrait to match the current actual width.
When multiple screen width configurations are available, the closest to
the current screen width will be used. The value specified here is
approximate; screen decorations like a status bar or system bar may cause
the actual space available in your UI to be slightly smaller.
<p><em>Added in API Level 13.</em></p>
<p>Also see the {@link android.content.res.Configuration#screenWidthDp}
configuration field, which holds the current screen width.</p>
</td>
</tr>
<tr id="ScreenHeightQualifier">
<td>Screen height</td>
<td>Examples:<br/>
<code>h720dp</code><br/>
<code>h1024dp</code><br/>
etc.
</td>
<td>
<p>Specifies a minimum screen height, in "dp" units, at which the resource
should be used. This configuration value will change when the orientation
changes between landscape and portrait to match the current actual height.
When multiple screen height configurations are available, the closest to
the current screen height will be used. The value specified here is
approximate; screen decorations like a status bar or system bar may cause
the actual space available in your UI to be slightly smaller.
<p><em>Added in API Level 13.</em></p>
<p>Also see the {@link android.content.res.Configuration#screenHeightDp}
configuration field, which holds the current screen width.</p>
</td>
</tr>
<tr id="OrientationQualifier">
<td>Screen orientation</td>
<td>

View File

@ -972,6 +972,14 @@ struct ResTable_config
uint32_t screenConfig;
};
union {
struct {
uint16_t screenWidthDp;
uint16_t screenHeightDp;
};
uint32_t screenSizeDp;
};
inline void copyFromDeviceNoSwap(const ResTable_config& o) {
const size_t size = dtohl(o.size);
if (size >= sizeof(ResTable_config)) {
@ -992,6 +1000,8 @@ struct ResTable_config
screenHeight = dtohs(screenHeight);
sdkVersion = dtohs(sdkVersion);
minorVersion = dtohs(minorVersion);
screenWidthDp = dtohs(screenWidthDp);
screenHeightDp = dtohs(screenHeightDp);
}
inline void swapHtoD() {
@ -1003,6 +1013,8 @@ struct ResTable_config
screenHeight = htods(screenHeight);
sdkVersion = htods(sdkVersion);
minorVersion = htods(minorVersion);
screenWidthDp = htods(screenWidthDp);
screenHeightDp = htods(screenHeightDp);
}
inline int compare(const ResTable_config& o) const {
@ -1021,6 +1033,8 @@ struct ResTable_config
diff = (int32_t)(screenLayout - o.screenLayout);
if (diff != 0) return diff;
diff = (int32_t)(uiMode - o.uiMode);
if (diff != 0) return diff;
diff = (int32_t)(screenSizeDp - o.screenSizeDp);
return (int)diff;
}
@ -1061,6 +1075,7 @@ struct ResTable_config
if (version != o.version) diffs |= CONFIG_VERSION;
if (screenLayout != o.screenLayout) diffs |= CONFIG_SCREEN_LAYOUT;
if (uiMode != o.uiMode) diffs |= CONFIG_UI_MODE;
if (screenSizeDp != o.screenSizeDp) diffs |= CONFIG_SCREEN_SIZE;
return diffs;
}
@ -1105,6 +1120,18 @@ struct ResTable_config
}
}
if (screenSizeDp || o.screenSizeDp) {
if (screenWidthDp != o.screenWidthDp) {
if (!screenWidthDp) return false;
if (!o.screenWidthDp) return true;
}
if (screenHeightDp != o.screenHeightDp) {
if (!screenHeightDp) return false;
if (!o.screenHeightDp) return true;
}
}
if (orientation != o.orientation) {
if (!orientation) return false;
if (!o.orientation) return true;
@ -1243,6 +1270,30 @@ struct ResTable_config
}
}
if (screenSizeDp || o.screenSizeDp) {
// Better is based on the sum of the difference between both
// width and height from the requested dimensions. We are
// assuming the invalid configs (with smaller dimens) have
// already been filtered. Note that if a particular dimension
// is unspecified, we will end up with a large value (the
// difference between 0 and the requested dimension), which is
// good since we will prefer a config that has specified a
// dimension value.
int myDelta = 0, otherDelta = 0;
if (requested->screenWidthDp) {
myDelta += requested->screenWidthDp - screenWidthDp;
otherDelta += requested->screenWidthDp - o.screenWidthDp;
}
if (requested->screenHeightDp) {
myDelta += requested->screenHeightDp - screenHeightDp;
otherDelta += requested->screenHeightDp - o.screenHeightDp;
}
//LOGI("Comparing this %dx%d to other %dx%d in %dx%d: myDelta=%d otherDelta=%d",
// screenWidthDp, screenHeightDp, o.screenWidthDp, o.screenHeightDp,
// requested->screenWidthDp, requested->screenHeightDp, myDelta, otherDelta);
return (myDelta <= otherDelta);
}
if ((orientation != o.orientation) && requested->orientation) {
return (orientation);
}
@ -1426,6 +1477,18 @@ struct ResTable_config
return false;
}
}
if (screenSizeDp != 0) {
if (settings.screenWidthDp != 0 && screenWidthDp != 0
&& screenWidthDp > settings.screenWidthDp) {
//LOGI("Filtering out width %d in requested %d", screenWidthDp, settings.screenWidthDp);
return false;
}
if (settings.screenHeightDp != 0 && screenHeightDp != 0
&& screenHeightDp > settings.screenHeightDp) {
//LOGI("Filtering out height %d in requested %d", screenHeightDp, settings.screenHeightDp);
return false;
}
}
if (screenType != 0) {
if (settings.orientation != 0 && orientation != 0
&& orientation != settings.orientation) {
@ -1505,13 +1568,13 @@ struct ResTable_config
String8 toString() const {
char buf[200];
sprintf(buf, "imsi=%d/%d lang=%c%c reg=%c%c orient=%d touch=%d dens=%d "
"kbd=%d nav=%d input=%d scrnW=%d scrnH=%d sz=%d long=%d "
"kbd=%d nav=%d input=%d ssz=%dx%d %ddp x %ddp sz=%d long=%d "
"ui=%d night=%d vers=%d.%d",
mcc, mnc,
language[0] ? language[0] : '-', language[1] ? language[1] : '-',
country[0] ? country[0] : '-', country[1] ? country[1] : '-',
orientation, touchscreen, density, keyboard, navigation, inputFlags,
screenWidth, screenHeight,
screenWidth, screenHeight, screenWidthDp, screenHeightDp,
screenLayout&MASK_SCREENSIZE, screenLayout&MASK_SCREENLONG,
uiMode&MASK_UI_MODE_TYPE, uiMode&MASK_UI_MODE_NIGHT,
sdkVersion, minorVersion);

View File

@ -2424,7 +2424,7 @@ void ResTable::setParameters(const ResTable_config* params)
{
mLock.lock();
TABLE_GETENTRY(LOGI("Setting parameters: imsi:%d/%d lang:%c%c cnt:%c%c "
"orien:%d touch:%d density:%d key:%d inp:%d nav:%d w:%d h:%d\n",
"orien:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d %ddp x %ddp\n",
params->mcc, params->mnc,
params->language[0] ? params->language[0] : '-',
params->language[1] ? params->language[1] : '-',
@ -2437,7 +2437,9 @@ void ResTable::setParameters(const ResTable_config* params)
params->inputFlags,
params->navigation,
params->screenWidth,
params->screenHeight));
params->screenHeight,
params->screenWidthDp,
params->screenHeightDp));
mParams = *params;
for (size_t i=0; i<mPackageGroups.size(); i++) {
TABLE_NOISY(LOGI("CLEARING BAGS FOR GROUP %d!", i));
@ -3758,8 +3760,10 @@ ssize_t ResTable::getEntry(
ResTable_config thisConfig;
thisConfig.copyFromDtoH(thisType->config);
TABLE_GETENTRY(LOGI("Match entry 0x%x in type 0x%x (sz 0x%x): imsi:%d/%d=%d/%d lang:%c%c=%c%c cnt:%c%c=%c%c "
"orien:%d=%d touch:%d=%d density:%d=%d key:%d=%d inp:%d=%d nav:%d=%d w:%d=%d h:%d=%d\n",
TABLE_GETENTRY(LOGI("Match entry 0x%x in type 0x%x (sz 0x%x): imsi:%d/%d=%d/%d "
"lang:%c%c=%c%c cnt:%c%c=%c%c orien:%d=%d touch:%d=%d "
"density:%d=%d key:%d=%d inp:%d=%d nav:%d=%d w:%d=%d h:%d=%d "
"wdp:%d=%d hdp:%d=%d\n",
entryIndex, typeIndex+1, dtohl(thisType->config.size),
thisConfig.mcc, thisConfig.mnc,
config ? config->mcc : 0, config ? config->mnc : 0,
@ -3786,7 +3790,11 @@ ssize_t ResTable::getEntry(
thisConfig.screenWidth,
config ? config->screenWidth : 0,
thisConfig.screenHeight,
config ? config->screenHeight : 0));
config ? config->screenHeight : 0,
thisConfig.screenWidthDp,
config ? config->screenWidthDp : 0,
thisConfig.screenHeightDp,
config ? config->screenHeightDp : 0));
// Check to make sure this one is valid for the current parameters.
if (config && !thisConfig.match(*config)) {
@ -4067,7 +4075,8 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg,
ResTable_config thisConfig;
thisConfig.copyFromDtoH(type->config);
LOGI("Adding config to type %d: imsi:%d/%d lang:%c%c cnt:%c%c "
"orien:%d touch:%d density:%d key:%d inp:%d nav:%d w:%d h:%d\n",
"orien:%d touch:%d density:%d key:%d inp:%d nav:%d w:%d h:%d "
"wdp:%d hdp:%d\n",
type->id,
thisConfig.mcc, thisConfig.mnc,
thisConfig.language[0] ? thisConfig.language[0] : '-',
@ -4081,7 +4090,9 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg,
thisConfig.inputFlags,
thisConfig.navigation,
thisConfig.screenWidth,
thisConfig.screenHeight));
thisConfig.screenHeight,
thisConfig.screenWidthDp,
thisConfig.screenHeightDp));
t->configs.add(type);
} else {
status_t err = validate_chunk(chunk, sizeof(ResChunk_header),
@ -4444,6 +4455,12 @@ void ResTable::print(bool inclValues) const
if (type->config.screenHeight != 0) {
printf(" h=%d", dtohs(type->config.screenHeight));
}
if (type->config.screenWidthDp != 0) {
printf(" wdp=%d", dtohs(type->config.screenWidthDp));
}
if (type->config.screenHeightDp != 0) {
printf(" hdp=%d", dtohs(type->config.screenHeightDp));
}
if (type->config.sdkVersion != 0) {
printf(" sdk=%d", dtohs(type->config.sdkVersion));
}

View File

@ -5454,6 +5454,9 @@ public class WindowManagerService extends IWindowManager.Stub
mCompatibleScreenScale = CompatibilityInfo.updateCompatibleScreenFrame(
dm, mCompatibleScreenFrame, null);
config.screenWidthDp = (int)(dm.widthPixels / dm.density);
config.screenHeightDp = (int)(dm.heightPixels / dm.density);
if (mScreenLayout == Configuration.SCREENLAYOUT_SIZE_UNDEFINED) {
// Note we only do this once because at this point we don't
// expect the screen to change in this way at runtime, and want

View File

@ -156,6 +156,20 @@ AaptGroupEntry::parseNamePart(const String8& part, int* axis, uint32_t* value)
return 0;
}
// screen dp width
if (getScreenWidthDpName(part.string(), &config)) {
*axis = AXIS_SCREENWIDTHDP;
*value = config.screenWidthDp;
return 0;
}
// screen dp height
if (getScreenHeightDpName(part.string(), &config)) {
*axis = AXIS_SCREENHEIGHTDP;
*value = config.screenHeightDp;
return 0;
}
// orientation
if (getOrientationName(part.string(), &config)) {
*axis = AXIS_ORIENTATION;
@ -243,7 +257,7 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType)
String8 mcc, mnc, loc, layoutsize, layoutlong, orient, den;
String8 touch, key, keysHidden, nav, navHidden, size, vers;
String8 uiModeType, uiModeNight;
String8 uiModeType, uiModeNight, widthdp, heightdp;
const char *p = dir;
const char *q;
@ -354,6 +368,30 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType)
//printf("not screen layout long: %s\n", part.string());
}
if (getScreenWidthDpName(part.string())) {
widthdp = part;
index++;
if (index == N) {
goto success;
}
part = parts[index];
} else {
//printf("not screen width dp: %s\n", part.string());
}
if (getScreenHeightDpName(part.string())) {
heightdp = part;
index++;
if (index == N) {
goto success;
}
part = parts[index];
} else {
//printf("not screen height dp: %s\n", part.string());
}
// orientation
if (getOrientationName(part.string())) {
orient = part;
@ -503,6 +541,8 @@ success:
this->locale = loc;
this->screenLayoutSize = layoutsize;
this->screenLayoutLong = layoutlong;
this->screenWidthDp = widthdp;
this->screenHeightDp = heightdp;
this->orientation = orient;
this->uiModeType = uiModeType;
this->uiModeNight = uiModeNight;
@ -534,6 +574,10 @@ AaptGroupEntry::toString() const
s += ",";
s += screenLayoutLong;
s += ",";
s += screenWidthDp;
s += ",";
s += screenHeightDp;
s += ",";
s += this->orientation;
s += ",";
s += uiModeType;
@ -582,6 +626,14 @@ AaptGroupEntry::toDirName(const String8& resType) const
s += "-";
s += screenLayoutLong;
}
if (this->screenWidthDp != "") {
s += "-";
s += screenWidthDp;
}
if (this->screenHeightDp != "") {
s += "-";
s += screenHeightDp;
}
if (this->orientation != "") {
s += "-";
s += orientation;
@ -1039,8 +1091,7 @@ bool AaptGroupEntry::getNavigationName(const char* name,
return false;
}
bool AaptGroupEntry::getScreenSizeName(const char* name,
ResTable_config* out)
bool AaptGroupEntry::getScreenSizeName(const char* name, ResTable_config* out)
{
if (strcmp(name, kWildcardName) == 0) {
if (out) {
@ -1075,8 +1126,53 @@ bool AaptGroupEntry::getScreenSizeName(const char* name,
return true;
}
bool AaptGroupEntry::getVersionName(const char* name,
ResTable_config* out)
bool AaptGroupEntry::getScreenWidthDpName(const char* name, ResTable_config* out)
{
if (strcmp(name, kWildcardName) == 0) {
if (out) {
out->screenWidthDp = out->SCREENWIDTH_ANY;
}
return true;
}
if (*name != 'w') return false;
name++;
const char* x = name;
while (*x >= '0' && *x <= '9') x++;
if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
String8 xName(name, x-name);
if (out) {
out->screenWidthDp = (uint16_t)atoi(xName.string());
}
return true;
}
bool AaptGroupEntry::getScreenHeightDpName(const char* name, ResTable_config* out)
{
if (strcmp(name, kWildcardName) == 0) {
if (out) {
out->screenHeightDp = out->SCREENWIDTH_ANY;
}
return true;
}
if (*name != 'h') return false;
name++;
const char* x = name;
while (*x >= '0' && *x <= '9') x++;
if (x == name || x[0] != 'd' || x[1] != 'p' || x[2] != 0) return false;
String8 xName(name, x-name);
if (out) {
out->screenHeightDp = (uint16_t)atoi(xName.string());
}
return true;
}
bool AaptGroupEntry::getVersionName(const char* name, ResTable_config* out)
{
if (strcmp(name, kWildcardName) == 0) {
if (out) {
@ -1112,6 +1208,8 @@ int AaptGroupEntry::compare(const AaptGroupEntry& o) const
if (v == 0) v = vendor.compare(o.vendor);
if (v == 0) v = screenLayoutSize.compare(o.screenLayoutSize);
if (v == 0) v = screenLayoutLong.compare(o.screenLayoutLong);
if (v == 0) v = screenWidthDp.compare(o.screenWidthDp);
if (v == 0) v = screenHeightDp.compare(o.screenHeightDp);
if (v == 0) v = orientation.compare(o.orientation);
if (v == 0) v = uiModeType.compare(o.uiModeType);
if (v == 0) v = uiModeNight.compare(o.uiModeNight);
@ -1135,6 +1233,8 @@ ResTable_config AaptGroupEntry::toParams() const
getLocaleName(locale.string(), &params);
getScreenLayoutSizeName(screenLayoutSize.string(), &params);
getScreenLayoutLongName(screenLayoutLong.string(), &params);
getScreenWidthDpName(screenWidthDp.string(), &params);
getScreenHeightDpName(screenHeightDp.string(), &params);
getOrientationName(orientation.string(), &params);
getUiModeTypeName(uiModeType.string(), &params);
getUiModeNightName(uiModeNight.string(), &params);
@ -1149,7 +1249,10 @@ ResTable_config AaptGroupEntry::toParams() const
// Fix up version number based on specified parameters.
int minSdk = 0;
if ((params.uiMode&ResTable_config::MASK_UI_MODE_TYPE)
if (params.screenWidthDp != ResTable_config::SCREENWIDTH_ANY
|| params.screenHeightDp != ResTable_config::SCREENHEIGHT_ANY) {
minSdk = SDK_ICS;
} else if ((params.uiMode&ResTable_config::MASK_UI_MODE_TYPE)
!= ResTable_config::UI_MODE_TYPE_ANY
|| (params.uiMode&ResTable_config::MASK_UI_MODE_NIGHT)
!= ResTable_config::UI_MODE_NIGHT_ANY) {

View File

@ -42,6 +42,8 @@ enum {
AXIS_NAVHIDDEN,
AXIS_NAVIGATION,
AXIS_SCREENSIZE,
AXIS_SCREENWIDTHDP,
AXIS_SCREENHEIGHTDP,
AXIS_VERSION
};
@ -52,6 +54,7 @@ enum {
SDK_ECLAIR_0_1 = 6,
SDK_MR1 = 7,
SDK_FROYO = 8,
SDK_ICS = 13,
};
/**
@ -71,6 +74,8 @@ public:
String8 vendor;
String8 screenLayoutSize;
String8 screenLayoutLong;
String8 screenWidthDp;
String8 screenHeightDp;
String8 orientation;
String8 uiModeType;
String8 uiModeNight;
@ -102,6 +107,8 @@ public:
static bool getNavigationName(const char* name, ResTable_config* out = NULL);
static bool getNavHiddenName(const char* name, ResTable_config* out = NULL);
static bool getScreenSizeName(const char* name, ResTable_config* out = NULL);
static bool getScreenWidthDpName(const char* name, ResTable_config* out = NULL);
static bool getScreenHeightDpName(const char* name, ResTable_config* out = NULL);
static bool getVersionName(const char* name, ResTable_config* out = NULL);
int compare(const AaptGroupEntry& o) const;

View File

@ -2607,6 +2607,15 @@ ResourceFilter::match(const ResTable_config& config) const
if (!match(AXIS_SCREENSIZE, config.screenSize)) {
return false;
}
if (!match(AXIS_SCREENWIDTHDP, config.screenWidthDp)) {
return false;
}
if (!match(AXIS_SCREENHEIGHTDP, config.screenHeightDp)) {
return false;
}
if (!match(AXIS_SCREENLAYOUTSIZE, config.screenLayout&ResTable_config::MASK_SCREENSIZE)) {
return false;
}
if (!match(AXIS_VERSION, config.version)) {
return false;
}
@ -2800,7 +2809,7 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<AaptFile>& dest)
ConfigDescription config = t->getUniqueConfigs().itemAt(ci);
NOISY(printf("Writing config %d config: imsi:%d/%d lang:%c%c cnt:%c%c "
"orien:%d ui:%d touch:%d density:%d key:%d inp:%d nav:%d w:%d h:%d\n",
"orien:%d ui:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d %ddp x %ddp\n",
ti+1,
config.mcc, config.mnc,
config.language[0] ? config.language[0] : '-',
@ -2815,7 +2824,9 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<AaptFile>& dest)
config.inputFlags,
config.navigation,
config.screenWidth,
config.screenHeight));
config.screenHeight,
config.screenWidthDp,
config.screenHeightDp));
if (filterable && !filter.match(config)) {
continue;
@ -2838,7 +2849,7 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<AaptFile>& dest)
tHeader->entriesStart = htodl(typeSize);
tHeader->config = config;
NOISY(printf("Writing type %d config: imsi:%d/%d lang:%c%c cnt:%c%c "
"orien:%d ui:%d touch:%d density:%d key:%d inp:%d nav:%d w:%d h:%d\n",
"orien:%d ui:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d %ddp x %ddp\n",
ti+1,
tHeader->config.mcc, tHeader->config.mnc,
tHeader->config.language[0] ? tHeader->config.language[0] : '-',
@ -2853,7 +2864,9 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<AaptFile>& dest)
tHeader->config.inputFlags,
tHeader->config.navigation,
tHeader->config.screenWidth,
tHeader->config.screenHeight));
tHeader->config.screenHeight,
tHeader->config.screenWidthDp,
tHeader->config.screenHeightDp));
tHeader->config.swapHtoD();
// Build the entries inside of this type.
@ -3435,7 +3448,7 @@ sp<ResourceTable::Entry> ResourceTable::Type::getEntry(const String16& entry,
if (e == NULL) {
if (config != NULL) {
NOISY(printf("New entry at %s:%d: imsi:%d/%d lang:%c%c cnt:%c%c "
"orien:%d touch:%d density:%d key:%d inp:%d nav:%d w:%d h:%d\n",
"orien:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d %ddp x %ddp\n",
sourcePos.file.string(), sourcePos.line,
config->mcc, config->mnc,
config->language[0] ? config->language[0] : '-',
@ -3449,7 +3462,9 @@ sp<ResourceTable::Entry> ResourceTable::Type::getEntry(const String16& entry,
config->inputFlags,
config->navigation,
config->screenWidth,
config->screenHeight));
config->screenHeight,
config->screenWidthDp,
config->screenHeightDp));
} else {
NOISY(printf("New entry at %s:%d: NULL config\n",
sourcePos.file.string(), sourcePos.line));