From f1f3915b08588cb11eaca5b9d0b5bae293646fdc Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Thu, 19 May 2011 18:13:32 -0700 Subject: [PATCH] Add new "-swNNNdp" resource qualifier. Change-Id: I0101e88ca9d8d44138bdcaf571f24b0352f4f6ce --- AaptAssets.cpp | 132 ++++++++++++++++++++++++++++++++-------------- AaptAssets.h | 9 ++-- ResourceTable.cpp | 15 ++++-- 3 files changed, 111 insertions(+), 45 deletions(-) diff --git a/AaptAssets.cpp b/AaptAssets.cpp index a2271d9..75535f8 100644 --- a/AaptAssets.cpp +++ b/AaptAssets.cpp @@ -142,17 +142,10 @@ AaptGroupEntry::parseNamePart(const String8& part, int* axis, uint32_t* value) return 0; } - // screen layout size - if (getScreenLayoutSizeName(part.string(), &config)) { - *axis = AXIS_SCREENLAYOUTSIZE; - *value = (config.screenLayout&ResTable_config::MASK_SCREENSIZE); - return 0; - } - - // screen layout long - if (getScreenLayoutLongName(part.string(), &config)) { - *axis = AXIS_SCREENLAYOUTLONG; - *value = (config.screenLayout&ResTable_config::MASK_SCREENLONG); + // smallest screen dp width + if (getSmallestScreenWidthDpName(part.string(), &config)) { + *axis = AXIS_SMALLESTSCREENWIDTHDP; + *value = config.smallestScreenWidthDp; return 0; } @@ -170,6 +163,20 @@ AaptGroupEntry::parseNamePart(const String8& part, int* axis, uint32_t* value) return 0; } + // screen layout size + if (getScreenLayoutSizeName(part.string(), &config)) { + *axis = AXIS_SCREENLAYOUTSIZE; + *value = (config.screenLayout&ResTable_config::MASK_SCREENSIZE); + return 0; + } + + // screen layout long + if (getScreenLayoutLongName(part.string(), &config)) { + *axis = AXIS_SCREENLAYOUTLONG; + *value = (config.screenLayout&ResTable_config::MASK_SCREENLONG); + return 0; + } + // orientation if (getOrientationName(part.string(), &config)) { *axis = AXIS_ORIENTATION; @@ -257,7 +264,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, widthdp, heightdp; + String8 uiModeType, uiModeNight, smallestwidthdp, widthdp, heightdp; const char *p = dir; const char *q; @@ -344,8 +351,8 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType) //printf("not region: %s\n", part.string()); } - if (getScreenLayoutSizeName(part.string())) { - layoutsize = part; + if (getSmallestScreenWidthDpName(part.string())) { + smallestwidthdp = part; index++; if (index == N) { @@ -353,11 +360,11 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType) } part = parts[index]; } else { - //printf("not screen layout size: %s\n", part.string()); + //printf("not smallest screen width dp: %s\n", part.string()); } - if (getScreenLayoutLongName(part.string())) { - layoutlong = part; + if (getScreenWidthDpName(part.string())) { + widthdp = part; index++; if (index == N) { @@ -365,11 +372,11 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType) } part = parts[index]; } else { - //printf("not screen layout long: %s\n", part.string()); + //printf("not screen width dp: %s\n", part.string()); } - if (getScreenWidthDpName(part.string())) { - widthdp = part; + if (getScreenHeightDpName(part.string())) { + heightdp = part; index++; if (index == N) { @@ -377,11 +384,11 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType) } part = parts[index]; } else { - //printf("not screen width dp: %s\n", part.string()); + //printf("not screen height dp: %s\n", part.string()); } - if (getScreenHeightDpName(part.string())) { - heightdp = part; + if (getScreenLayoutSizeName(part.string())) { + layoutsize = part; index++; if (index == N) { @@ -389,7 +396,19 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType) } part = parts[index]; } else { - //printf("not screen height dp: %s\n", part.string()); + //printf("not screen layout size: %s\n", part.string()); + } + + if (getScreenLayoutLongName(part.string())) { + layoutlong = part; + + index++; + if (index == N) { + goto success; + } + part = parts[index]; + } else { + //printf("not screen layout long: %s\n", part.string()); } // orientation @@ -541,6 +560,7 @@ success: this->locale = loc; this->screenLayoutSize = layoutsize; this->screenLayoutLong = layoutlong; + this->smallestScreenWidthDp = smallestwidthdp; this->screenWidthDp = widthdp; this->screenHeightDp = heightdp; this->orientation = orient; @@ -570,14 +590,16 @@ AaptGroupEntry::toString() const s += ","; s += this->locale; s += ","; - s += screenLayoutSize; - s += ","; - s += screenLayoutLong; + s += smallestScreenWidthDp; s += ","; s += screenWidthDp; s += ","; s += screenHeightDp; s += ","; + s += screenLayoutSize; + s += ","; + s += screenLayoutLong; + s += ","; s += this->orientation; s += ","; s += uiModeType; @@ -618,13 +640,9 @@ AaptGroupEntry::toDirName(const String8& resType) const s += "-"; s += locale; } - if (this->screenLayoutSize != "") { + if (this->smallestScreenWidthDp != "") { s += "-"; - s += screenLayoutSize; - } - if (this->screenLayoutLong != "") { - s += "-"; - s += screenLayoutLong; + s += smallestScreenWidthDp; } if (this->screenWidthDp != "") { s += "-"; @@ -634,6 +652,14 @@ AaptGroupEntry::toDirName(const String8& resType) const s += "-"; s += screenHeightDp; } + if (this->screenLayoutSize != "") { + s += "-"; + s += screenLayoutSize; + } + if (this->screenLayoutLong != "") { + s += "-"; + s += screenLayoutLong; + } if (this->orientation != "") { s += "-"; s += orientation; @@ -1126,6 +1152,31 @@ bool AaptGroupEntry::getScreenSizeName(const char* name, ResTable_config* out) return true; } +bool AaptGroupEntry::getSmallestScreenWidthDpName(const char* name, ResTable_config* out) +{ + if (strcmp(name, kWildcardName) == 0) { + if (out) { + out->smallestScreenWidthDp = out->SCREENWIDTH_ANY; + } + return true; + } + + if (*name != 's') return false; + name++; + 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->smallestScreenWidthDp = (uint16_t)atoi(xName.string()); + } + + return true; +} + bool AaptGroupEntry::getScreenWidthDpName(const char* name, ResTable_config* out) { if (strcmp(name, kWildcardName) == 0) { @@ -1206,10 +1257,11 @@ int AaptGroupEntry::compare(const AaptGroupEntry& o) const if (v == 0) v = mnc.compare(o.mnc); if (v == 0) v = locale.compare(o.locale); 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 = smallestScreenWidthDp.compare(o.smallestScreenWidthDp); if (v == 0) v = screenWidthDp.compare(o.screenWidthDp); if (v == 0) v = screenHeightDp.compare(o.screenHeightDp); + if (v == 0) v = screenLayoutSize.compare(o.screenLayoutSize); + if (v == 0) v = screenLayoutLong.compare(o.screenLayoutLong); if (v == 0) v = orientation.compare(o.orientation); if (v == 0) v = uiModeType.compare(o.uiModeType); if (v == 0) v = uiModeNight.compare(o.uiModeNight); @@ -1231,10 +1283,11 @@ ResTable_config AaptGroupEntry::toParams() const getMccName(mcc.string(), ¶ms); getMncName(mnc.string(), ¶ms); getLocaleName(locale.string(), ¶ms); - getScreenLayoutSizeName(screenLayoutSize.string(), ¶ms); - getScreenLayoutLongName(screenLayoutLong.string(), ¶ms); + getSmallestScreenWidthDpName(smallestScreenWidthDp.string(), ¶ms); getScreenWidthDpName(screenWidthDp.string(), ¶ms); getScreenHeightDpName(screenHeightDp.string(), ¶ms); + getScreenLayoutSizeName(screenLayoutSize.string(), ¶ms); + getScreenLayoutLongName(screenLayoutLong.string(), ¶ms); getOrientationName(orientation.string(), ¶ms); getUiModeTypeName(uiModeType.string(), ¶ms); getUiModeNightName(uiModeNight.string(), ¶ms); @@ -1249,9 +1302,10 @@ ResTable_config AaptGroupEntry::toParams() const // Fix up version number based on specified parameters. int minSdk = 0; - if (params.screenWidthDp != ResTable_config::SCREENWIDTH_ANY + if (params.smallestScreenWidthDp != ResTable_config::SCREENWIDTH_ANY + || params.screenWidthDp != ResTable_config::SCREENWIDTH_ANY || params.screenHeightDp != ResTable_config::SCREENHEIGHT_ANY) { - minSdk = SDK_ICS; + minSdk = SDK_HONEYCOMB_MR2; } else if ((params.uiMode&ResTable_config::MASK_UI_MODE_TYPE) != ResTable_config::UI_MODE_TYPE_ANY || (params.uiMode&ResTable_config::MASK_UI_MODE_NIGHT) diff --git a/AaptAssets.h b/AaptAssets.h index e5afd1b..65743d8 100644 --- a/AaptAssets.h +++ b/AaptAssets.h @@ -42,6 +42,7 @@ enum { AXIS_NAVHIDDEN, AXIS_NAVIGATION, AXIS_SCREENSIZE, + AXIS_SMALLESTSCREENWIDTHDP, AXIS_SCREENWIDTHDP, AXIS_SCREENHEIGHTDP, AXIS_VERSION @@ -54,7 +55,7 @@ enum { SDK_ECLAIR_0_1 = 6, SDK_MR1 = 7, SDK_FROYO = 8, - SDK_ICS = 13, + SDK_HONEYCOMB_MR2 = 13, }; /** @@ -72,10 +73,11 @@ public: String8 mnc; String8 locale; String8 vendor; - String8 screenLayoutSize; - String8 screenLayoutLong; + String8 smallestScreenWidthDp; String8 screenWidthDp; String8 screenHeightDp; + String8 screenLayoutSize; + String8 screenLayoutLong; String8 orientation; String8 uiModeType; String8 uiModeNight; @@ -107,6 +109,7 @@ 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 getSmallestScreenWidthDpName(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); diff --git a/ResourceTable.cpp b/ResourceTable.cpp index 3dcc093..68c3892 100644 --- a/ResourceTable.cpp +++ b/ResourceTable.cpp @@ -2607,6 +2607,9 @@ ResourceFilter::match(const ResTable_config& config) const if (!match(AXIS_SCREENSIZE, config.screenSize)) { return false; } + if (!match(AXIS_SMALLESTSCREENWIDTHDP, config.smallestScreenWidthDp)) { + return false; + } if (!match(AXIS_SCREENWIDTHDP, config.screenWidthDp)) { return false; } @@ -2809,7 +2812,8 @@ 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 sz:%dx%d %ddp x %ddp\n", + "orien:%d ui:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d " + "sw%ddp w%ddp h%ddp\n", ti+1, config.mcc, config.mnc, config.language[0] ? config.language[0] : '-', @@ -2825,6 +2829,7 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp& dest) config.navigation, config.screenWidth, config.screenHeight, + config.smallestScreenWidthDp, config.screenWidthDp, config.screenHeightDp)); @@ -2849,7 +2854,8 @@ 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 sz:%dx%d %ddp x %ddp\n", + "orien:%d ui:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d " + "sw%ddp w%ddp h%ddp\n", ti+1, tHeader->config.mcc, tHeader->config.mnc, tHeader->config.language[0] ? tHeader->config.language[0] : '-', @@ -2865,6 +2871,7 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp& dest) tHeader->config.navigation, tHeader->config.screenWidth, tHeader->config.screenHeight, + tHeader->config.smallestScreenWidthDp, tHeader->config.screenWidthDp, tHeader->config.screenHeightDp)); tHeader->config.swapHtoD(); @@ -3448,7 +3455,8 @@ 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 sz:%dx%d %ddp x %ddp\n", + "orien:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d " + "sw%ddp w%ddp h%ddp\n", sourcePos.file.string(), sourcePos.line, config->mcc, config->mnc, config->language[0] ? config->language[0] : '-', @@ -3463,6 +3471,7 @@ sp ResourceTable::Type::getEntry(const String16& entry, config->navigation, config->screenWidth, config->screenHeight, + config->smallestScreenWidthDp, config->screenWidthDp, config->screenHeightDp)); } else { -- 2.47.2