DO NOT MERGE. Integrate add new screen width/height in "dp" configs.
You can now specify resource configuration variants "wNNNdp" and "hNNNdp". These are the minimum screen width/height in "dp" units. This allows you to do things like have your app adjust its layout based only on the about of horizontal space available. This introduces a new configuration change flag for screen size. Note that this configuration change happens each time the orientation changes. Applications often say they handle the orientation change to avoid being restarted at a screen rotation, and this will now cause them to be restarted. To address this, we assume the app can handle this new config change if its target SDK version is < ICS. Change-Id: I4acb73d82677b74092c1da9e4046a4951921f9f4
This commit is contained in:
@ -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(), ¶ms);
|
||||
getScreenLayoutSizeName(screenLayoutSize.string(), ¶ms);
|
||||
getScreenLayoutLongName(screenLayoutLong.string(), ¶ms);
|
||||
getScreenWidthDpName(screenWidthDp.string(), ¶ms);
|
||||
getScreenHeightDpName(screenHeightDp.string(), ¶ms);
|
||||
getOrientationName(orientation.string(), ¶ms);
|
||||
getUiModeTypeName(uiModeType.string(), ¶ms);
|
||||
getUiModeNightName(uiModeNight.string(), ¶ms);
|
||||
@ -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) {
|
||||
|
Reference in New Issue
Block a user