X-Git-Url: https://git.saurik.com/android/aapt.git/blobdiff_plain/e8b1d1095bd7c2b3d0fb6c0ffa3e27f8ad54a74b..a498fc6fc0fd9b85b3c847f825bf794b73e3b1d8:/AaptAssets.cpp?ds=inline diff --git a/AaptAssets.cpp b/AaptAssets.cpp index 4d2d046..d66cdf0 100644 --- a/AaptAssets.cpp +++ b/AaptAssets.cpp @@ -142,6 +142,27 @@ AaptGroupEntry::parseNamePart(const String8& part, int* axis, uint32_t* value) return 0; } + // smallest screen dp width + if (getSmallestScreenWidthDpName(part.string(), &config)) { + *axis = AXIS_SMALLESTSCREENWIDTHDP; + *value = config.smallestScreenWidthDp; + 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; + } + // screen layout size if (getScreenLayoutSizeName(part.string(), &config)) { *axis = AXIS_SCREENLAYOUTSIZE; @@ -243,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; + String8 uiModeType, uiModeNight, smallestwidthdp, widthdp, heightdp; const char *p = dir; const char *q; @@ -330,6 +351,42 @@ AaptGroupEntry::initFromDirName(const char* dir, String8* resType) //printf("not region: %s\n", part.string()); } + if (getSmallestScreenWidthDpName(part.string())) { + smallestwidthdp = part; + + index++; + if (index == N) { + goto success; + } + part = parts[index]; + } else { + //printf("not smallest screen width dp: %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()); + } + if (getScreenLayoutSizeName(part.string())) { layoutsize = part; @@ -503,6 +560,9 @@ success: this->locale = loc; this->screenLayoutSize = layoutsize; this->screenLayoutLong = layoutlong; + this->smallestScreenWidthDp = smallestwidthdp; + this->screenWidthDp = widthdp; + this->screenHeightDp = heightdp; this->orientation = orient; this->uiModeType = uiModeType; this->uiModeNight = uiModeNight; @@ -530,6 +590,12 @@ AaptGroupEntry::toString() const s += ","; s += this->locale; s += ","; + s += smallestScreenWidthDp; + s += ","; + s += screenWidthDp; + s += ","; + s += screenHeightDp; + s += ","; s += screenLayoutSize; s += ","; s += screenLayoutLong; @@ -574,6 +640,18 @@ AaptGroupEntry::toDirName(const String8& resType) const s += "-"; s += locale; } + if (this->smallestScreenWidthDp != "") { + s += "-"; + s += smallestScreenWidthDp; + } + if (this->screenWidthDp != "") { + s += "-"; + s += screenWidthDp; + } + if (this->screenHeightDp != "") { + s += "-"; + s += screenHeightDp; + } if (this->screenLayoutSize != "") { s += "-"; s += screenLayoutSize; @@ -685,13 +763,11 @@ bool AaptGroupEntry::getMncName(const char* name, if (*c != 0) return false; if (c-val == 0 || c-val > 3) return false; - int d = atoi(val); - if (d != 0) { - if (out) out->mnc = d; - return true; + if (out) { + out->mnc = atoi(val); } - return false; + return true; } /* @@ -837,6 +913,11 @@ bool AaptGroupEntry::getUiModeTypeName(const char* name, (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE) | ResTable_config::UI_MODE_TYPE_CAR; return true; + } else if (strcmp(name, "television") == 0) { + if (out) out->uiMode = + (out->uiMode&~ResTable_config::MASK_UI_MODE_TYPE) + | ResTable_config::UI_MODE_TYPE_TELEVISION; + return true; } return false; @@ -888,11 +969,21 @@ bool AaptGroupEntry::getDensityName(const char* name, return true; } + if (strcmp(name, "tvdpi") == 0) { + if (out) out->density = ResTable_config::DENSITY_TV; + return true; + } + if (strcmp(name, "hdpi") == 0) { if (out) out->density = ResTable_config::DENSITY_HIGH; return true; } + if (strcmp(name, "xhdpi") == 0) { + if (out) out->density = ResTable_config::DENSITY_MEDIUM*2; + return true; + } + char* c = (char*)name; while (*c >= '0' && *c <= '9') { c++; @@ -1036,8 +1127,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) { @@ -1072,8 +1162,78 @@ bool AaptGroupEntry::getScreenSizeName(const char* name, return true; } -bool AaptGroupEntry::getVersionName(const char* name, - ResTable_config* out) +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) { + 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) { @@ -1107,6 +1267,9 @@ 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 = 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); @@ -1130,6 +1293,9 @@ ResTable_config AaptGroupEntry::toParams() const getMccName(mcc.string(), ¶ms); getMncName(mnc.string(), ¶ms); getLocaleName(locale.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); @@ -1146,7 +1312,11 @@ 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.smallestScreenWidthDp != ResTable_config::SCREENWIDTH_ANY + || params.screenWidthDp != ResTable_config::SCREENWIDTH_ANY + || params.screenHeightDp != ResTable_config::SCREENHEIGHT_ANY) { + 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) != ResTable_config::UI_MODE_NIGHT_ANY) { @@ -1390,10 +1560,10 @@ status_t AaptDir::addLeafFile(const String8& leafName, const sp<AaptFile>& file) } ssize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir, - const AaptGroupEntry& kind, const String8& resType) + const AaptGroupEntry& kind, const String8& resType, + sp<FilePathStore>& fullResPaths) { Vector<String8> fileNames; - { DIR* dir = NULL; @@ -1416,9 +1586,14 @@ ssize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir, if (isHidden(srcDir.string(), entry->d_name)) continue; - fileNames.add(String8(entry->d_name)); + String8 name(entry->d_name); + fileNames.add(name); + // Add fully qualified path for dependency purposes + // if we're collecting them + if (fullResPaths != NULL) { + fullResPaths->add(srcDir.appendPathCopy(name)); + } } - closedir(dir); } @@ -1445,7 +1620,7 @@ ssize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir, notAdded = true; } ssize_t res = subdir->slurpFullTree(bundle, pathName, kind, - resType); + resType, fullResPaths); if (res < NO_ERROR) { return res; } @@ -1677,7 +1852,7 @@ ssize_t AaptAssets::slurpFromArgs(Bundle* bundle) sp<AaptDir> assetAaptDir = makeDir(String8(kAssetDir)); AaptGroupEntry group; count = assetAaptDir->slurpFullTree(bundle, assetRoot, group, - String8()); + String8(), mFullAssetPaths); if (count < 0) { totalCount = count; goto bail; @@ -1708,6 +1883,7 @@ ssize_t AaptAssets::slurpFromArgs(Bundle* bundle) sp<AaptAssets> nextOverlay = new AaptAssets(); current->setOverlay(nextOverlay); current = nextOverlay; + current->setFullResPaths(mFullResPaths); } count = current->slurpResourceTree(bundle, String8(res)); @@ -1750,7 +1926,7 @@ ssize_t AaptAssets::slurpFromArgs(Bundle* bundle) * guarantees about ordering, so we're okay with an inorder search * using whatever order the OS happens to hand back to us. */ - count = slurpFullTree(bundle, assetRoot, AaptGroupEntry(), String8()); + count = slurpFullTree(bundle, assetRoot, AaptGroupEntry(), String8(), mFullAssetPaths); if (count < 0) { /* failure; report error and remove archive */ totalCount = count; @@ -1776,9 +1952,10 @@ bail: ssize_t AaptAssets::slurpFullTree(Bundle* bundle, const String8& srcDir, const AaptGroupEntry& kind, - const String8& resType) + const String8& resType, + sp<FilePathStore>& fullResPaths) { - ssize_t res = AaptDir::slurpFullTree(bundle, srcDir, kind, resType); + ssize_t res = AaptDir::slurpFullTree(bundle, srcDir, kind, resType, fullResPaths); if (res > 0) { mGroupEntries.add(kind); } @@ -1825,12 +2002,22 @@ ssize_t AaptAssets::slurpResourceTree(Bundle* bundle, const String8& srcDir) continue; } + if (bundle->getMaxResVersion() != NULL && group.version.length() != 0) { + int maxResInt = atoi(bundle->getMaxResVersion()); + const char *verString = group.version.string(); + int dirVersionInt = atoi(verString + 1); // skip 'v' in version name + if (dirVersionInt > maxResInt) { + fprintf(stderr, "max res %d, skipping %s\n", maxResInt, entry->d_name); + continue; + } + } + FileType type = getFileType(subdirName.string()); if (type == kFileTypeDirectory) { sp<AaptDir> dir = makeDir(String8(entry->d_name)); ssize_t res = dir->slurpFullTree(bundle, subdirName, group, - resType); + resType, mFullResPaths); if (res < 0) { count = res; goto bail;