X-Git-Url: https://git.saurik.com/android/aapt.git/blobdiff_plain/71c3ee5192ffe51b6d9a0874a62f24b63ec8055f..0409f31b5d48bbf46dcf5fe9b1a6f07104135b3c:/Command.cpp diff --git a/Command.cpp b/Command.cpp index 8ac7590..223b1fa 100644 --- a/Command.cpp +++ b/Command.cpp @@ -343,6 +343,9 @@ enum { REQUIRED_ATTR = 0x0101028e, SCREEN_SIZE_ATTR = 0x010102ca, SCREEN_DENSITY_ATTR = 0x010102cb, + REQUIRES_SMALLEST_WIDTH_DP_ATTR = 0x01010364, + COMPATIBLE_WIDTH_LIMIT_DP_ATTR = 0x01010365, + LARGEST_WIDTH_LIMIT_DP_ATTR = 0x01010366, }; const char *getComponentName(String8 &pkgName, String8 &componentName) { @@ -423,6 +426,24 @@ int doDump(Bundle* bundle) return 1; } + // Make a dummy config for retrieving resources... we need to supply + // non-default values for some configs so that we can retrieve resources + // in the app that don't have a default. The most important of these is + // the API version because key resources like icons will have an implicit + // version if they are using newer config types like density. + ResTable_config config; + config.language[0] = 'e'; + config.language[1] = 'n'; + config.country[0] = 'U'; + config.country[1] = 'S'; + config.orientation = ResTable_config::ORIENTATION_PORT; + config.density = ResTable_config::DENSITY_MEDIUM; + config.sdkVersion = 10000; // Very high. + config.screenWidthDp = 320; + config.screenHeightDp = 480; + config.smallestScreenWidthDp = 320; + assets.setConfiguration(config); + const ResTable& res = assets.getResources(false); if (&res == NULL) { fprintf(stderr, "ERROR: dump failed because no resource table was found\n"); @@ -542,6 +563,19 @@ int doDump(Bundle* bundle) } } } else if (strcmp("badging", option) == 0) { + Vector locales; + res.getLocales(&locales); + + Vector configs; + res.getConfigurations(&configs); + SortedVector densities; + const size_t NC = configs.size(); + for (size_t i=0; i 0 && normalScreen > 0 && largeScreen > 0 && xlargeScreen > 0 + && requiresSmallestWidthDp > 0) { + int compatWidth = compatibleWidthLimitDp; + if (compatWidth <= 0) compatWidth = requiresSmallestWidthDp; + if (requiresSmallestWidthDp <= 240 && compatWidth >= 240) { + smallScreen = -1; + } else { + smallScreen = 0; + } + if (requiresSmallestWidthDp <= 320 && compatWidth >= 320) { + normalScreen = -1; + } else { + normalScreen = 0; + } + if (requiresSmallestWidthDp <= 480 && compatWidth >= 480) { + largeScreen = -1; + } else { + largeScreen = 0; + } + if (requiresSmallestWidthDp <= 720 && compatWidth >= 720) { + xlargeScreen = -1; + } else { + xlargeScreen = 0; + } + } + // Determine default values for any unspecified screen sizes, // based on the target SDK of the package. As of 4 (donut) // the screen size support was introduced, so all default to @@ -1146,7 +1261,8 @@ int doDump(Bundle* bundle) xlargeScreen = targetSdk >= 9 ? -1 : 0; } if (anyDensity > 0) { - anyDensity = targetSdk >= 4 ? -1 : 0; + anyDensity = (targetSdk >= 4 || requiresSmallestWidthDp > 0 + || compatibleWidthLimitDp > 0) ? -1 : 0; } printf("supports-screens:"); if (smallScreen != 0) printf(" 'small'"); @@ -1154,12 +1270,18 @@ int doDump(Bundle* bundle) if (largeScreen != 0) printf(" 'large'"); if (xlargeScreen != 0) printf(" 'xlarge'"); printf("\n"); - printf("supports-any-density: '%s'\n", anyDensity ? "true" : "false"); + if (requiresSmallestWidthDp > 0) { + printf("requires-smallest-width:'%d'\n", requiresSmallestWidthDp); + } + if (compatibleWidthLimitDp > 0) { + printf("compatible-width-limit:'%d'\n", compatibleWidthLimitDp); + } + if (largestWidthLimitDp > 0) { + printf("largest-width-limit:'%d'\n", largestWidthLimitDp); + } printf("locales:"); - Vector locales; - res.getLocales(&locales); const size_t NL = locales.size(); for (size_t i=0; i configs; - res.getConfigurations(&configs); - SortedVector densities; - const size_t NC = configs.size(); - for (size_t i=0; i