From 4ee37df20d54e7811d7d1b5cd3657f01cc970b88 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Thu, 12 May 2011 18:07:47 -0700 Subject: [PATCH] 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 --- AaptAssets.cpp | 115 +++++++++++++++++++++++++++++++++++++++++++--- AaptAssets.h | 7 +++ ResourceTable.cpp | 27 ++++++++--- 3 files changed, 137 insertions(+), 12 deletions(-) diff --git a/AaptAssets.cpp b/AaptAssets.cpp index 2b2ec7b..a2271d9 100644 --- a/AaptAssets.cpp +++ b/AaptAssets.cpp @@ -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) { diff --git a/AaptAssets.h b/AaptAssets.h index eeb00c0..e5afd1b 100644 --- a/AaptAssets.h +++ b/AaptAssets.h @@ -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; diff --git a/ResourceTable.cpp b/ResourceTable.cpp index 5339566..3dcc093 100644 --- a/ResourceTable.cpp +++ b/ResourceTable.cpp @@ -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& 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& 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& 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& 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::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::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)); -- 2.45.2