Loading include/androidfw/ResourceTypes.h +8 −4 Original line number Diff line number Diff line Loading @@ -1151,9 +1151,13 @@ struct ResTable_config uint32_t screenConfig2; }; // If true, it means that the script of the locale was explicitly provided. // If false, it means that the script was automatically computed. bool localeScriptWasProvided; // If false and localeScript is set, it means that the script of the locale // was explicitly provided. // // If true, it means that localeScript was automatically computed. // localeScript may still not be set in this case, which means that we // tried but could not compute a script. bool localeScriptWasComputed; void copyFromDeviceNoSwap(const ResTable_config& o); Loading Loading @@ -1233,7 +1237,7 @@ struct ResTable_config inline void clearLocale() { locale = 0; localeScriptWasProvided = false; localeScriptWasComputed = false; memset(localeScript, 0, sizeof(localeScript)); memset(localeVariant, 0, sizeof(localeVariant)); } Loading libs/androidfw/ResourceTypes.cpp +15 −15 Original line number Diff line number Diff line Loading @@ -1870,8 +1870,8 @@ void ResTable_config::swapHtoD() { // The language & region are equal, so compare the scripts and variants. const char emptyScript[sizeof(l.localeScript)] = {'\0', '\0', '\0', '\0'}; const char *lScript = l.localeScriptWasProvided ? l.localeScript : emptyScript; const char *rScript = r.localeScriptWasProvided ? r.localeScript : emptyScript; const char *lScript = l.localeScriptWasComputed ? emptyScript : l.localeScript; const char *rScript = r.localeScriptWasComputed ? emptyScript : r.localeScript; int script = memcmp(lScript, rScript, sizeof(l.localeScript)); if (script) { return script; Loading Loading @@ -2016,11 +2016,11 @@ int ResTable_config::isLocaleMoreSpecificThan(const ResTable_config& o) const { // scripts since it seems more useful to do so. We will consider // "en-US-POSIX" to be more specific than "en-Latn-US". const int score = (localeScriptWasProvided ? 1 : 0) + ((localeVariant[0] != 0) ? 2 : 0); const int score = ((localeScript[0] != '\0' && !localeScriptWasComputed) ? 1 : 0) + ((localeVariant[0] != '\0') ? 2 : 0); const int oScore = (o.localeScriptWasProvided ? 1 : 0) + ((o.localeVariant[0] != 0) ? 2 : 0); const int oScore = (o.localeScript[0] != '\0' && !o.localeScriptWasComputed ? 1 : 0) + ((o.localeVariant[0] != '\0') ? 2 : 0); return score - oScore; Loading Loading @@ -2535,7 +2535,8 @@ bool ResTable_config::match(const ResTable_config& settings) const { if (settings.localeScript[0] == '\0') { // could not determine the request's script countriesMustMatch = true; } else { if (localeScript[0] == '\0') { // script was not provided, so we try to compute it if (localeScript[0] == '\0' && !localeScriptWasComputed) { // script was not provided or computed, so we try to compute it localeDataComputeScript(computed_script, language, country); if (computed_script[0] == '\0') { // we could not compute the script countriesMustMatch = true; Loading Loading @@ -2684,8 +2685,8 @@ void ResTable_config::appendDirLocale(String8& out) const { if (!language[0]) { return; } if (!localeScriptWasProvided && !localeVariant[0]) { const bool scriptWasProvided = localeScript[0] != '\0' && !localeScriptWasComputed; if (!scriptWasProvided && !localeVariant[0]) { // Legacy format. if (out.size() > 0) { out.append("-"); Loading Loading @@ -2715,7 +2716,7 @@ void ResTable_config::appendDirLocale(String8& out) const { size_t len = unpackLanguage(buf); out.append(buf, len); if (localeScriptWasProvided) { if (scriptWasProvided) { out.append("+"); out.append(localeScript, sizeof(localeScript)); } Loading Loading @@ -2746,7 +2747,7 @@ void ResTable_config::getBcp47Locale(char str[RESTABLE_MAX_LOCALE_LEN]) const { charsWritten += unpackLanguage(str); } if (localeScriptWasProvided) { if (localeScript[0] && !localeScriptWasComputed) { if (charsWritten) { str[charsWritten++] = '-'; } Loading Loading @@ -2787,7 +2788,6 @@ void ResTable_config::getBcp47Locale(char str[RESTABLE_MAX_LOCALE_LEN]) const { for (size_t i = 1; i < 4; ++i) { config->localeScript[i] = tolower(start[i]); } config->localeScriptWasProvided = true; break; } case 5: Loading @@ -2807,7 +2807,6 @@ void ResTable_config::getBcp47Locale(char str[RESTABLE_MAX_LOCALE_LEN]) const { void ResTable_config::setBcp47Locale(const char* in) { locale = 0; localeScriptWasProvided = false; memset(localeScript, 0, sizeof(localeScript)); memset(localeVariant, 0, sizeof(localeVariant)); Loading @@ -2824,9 +2823,10 @@ void ResTable_config::setBcp47Locale(const char* in) { const size_t size = in + strlen(in) - start; assignLocaleComponent(this, start, size); if (localeScript[0] == '\0') { localeScriptWasComputed = (localeScript[0] == '\0'); if (localeScriptWasComputed) { computeScript(); }; } } String8 ResTable_config::toString() const { Loading libs/androidfw/tests/ConfigLocale_test.cpp +9 −9 Original line number Diff line number Diff line Loading @@ -125,10 +125,10 @@ TEST(ConfigLocaleTest, packAndUnpack3LetterRegion) { if (script != NULL) { memcpy(out->localeScript, script, 4); out->localeScriptWasProvided = true; out->localeScriptWasComputed = false; } else { out->computeScript(); out->localeScriptWasProvided = false; out->localeScriptWasComputed = true; } if (variant != NULL) { Loading Loading @@ -182,7 +182,7 @@ TEST(ConfigLocaleTest, setLocale) { EXPECT_EQ('n', test.language[1]); EXPECT_EQ('U', test.country[0]); EXPECT_EQ('S', test.country[1]); EXPECT_FALSE(test.localeScriptWasProvided); EXPECT_TRUE(test.localeScriptWasComputed); EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4)); EXPECT_EQ(0, test.localeVariant[0]); Loading @@ -203,7 +203,7 @@ TEST(ConfigLocaleTest, setLocale) { EXPECT_EQ('e', test.language[0]); EXPECT_EQ('n', test.language[1]); EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4)); EXPECT_TRUE(test.localeScriptWasProvided); EXPECT_FALSE(test.localeScriptWasComputed); memset(out, 1, 4); test.unpackRegion(out); EXPECT_EQ('4', out[0]); Loading @@ -216,7 +216,7 @@ TEST(ConfigLocaleTest, setLocale) { EXPECT_EQ('d', out[0]); EXPECT_EQ('e', out[1]); EXPECT_EQ('\0', out[2]); EXPECT_FALSE(test.localeScriptWasProvided); EXPECT_TRUE(test.localeScriptWasComputed); EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4)); memset(out, 1, 4); test.unpackRegion(out); Loading @@ -229,7 +229,7 @@ TEST(ConfigLocaleTest, setLocale) { EXPECT_EQ('d', out[0]); EXPECT_EQ('e', out[1]); EXPECT_EQ('\0', out[2]); EXPECT_TRUE(test.localeScriptWasProvided); EXPECT_FALSE(test.localeScriptWasComputed); EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4)); memset(out, 1, 4); test.unpackRegion(out); Loading Loading @@ -270,11 +270,11 @@ TEST(ConfigLocaleTest, getBcp47Locale_script) { fillIn("en", NULL, "Latn", NULL, &config); char out[RESTABLE_MAX_LOCALE_LEN]; config.localeScriptWasProvided = true; config.localeScriptWasComputed = false; config.getBcp47Locale(out); EXPECT_EQ(0, strcmp("en-Latn", out)); config.localeScriptWasProvided = false; config.localeScriptWasComputed = true; config.getBcp47Locale(out); EXPECT_EQ(0, strcmp("en", out)); } Loading Loading @@ -379,7 +379,7 @@ TEST(ConfigLocaleTest, match_emptyScript) { // emulate packages built with older AAPT memset(supported.localeScript, '\0', 4); supported.localeScriptWasProvided = false; supported.localeScriptWasComputed = false; EXPECT_TRUE(supported.match(requested)); } Loading tools/aapt/AaptAssets.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -373,7 +373,7 @@ int AaptLocaleValue::initFromDirName(const Vector<String8>& parts, const int sta void AaptLocaleValue::initFromResTable(const ResTable_config& config) { config.unpackLanguage(language); config.unpackRegion(region); if (config.localeScriptWasProvided) { if (config.localeScript[0] && !config.localeScriptWasComputed) { memcpy(script, config.localeScript, sizeof(config.localeScript)); } Loading @@ -388,10 +388,10 @@ void AaptLocaleValue::writeTo(ResTable_config* out) const { if (script[0]) { memcpy(out->localeScript, script, sizeof(out->localeScript)); out->localeScriptWasProvided = true; out->localeScriptWasComputed = false; } else { out->computeScript(); out->localeScriptWasProvided = false; out->localeScriptWasComputed = true; } if (variant[0]) { Loading tools/aapt2/Locale.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -253,7 +253,7 @@ std::string LocaleValue::toDirName() const { void LocaleValue::initFromResTable(const ResTable_config& config) { config.unpackLanguage(language); config.unpackRegion(region); if (config.localeScriptWasProvided) { if (config.localeScript[0] && !config.localeScriptWasComputed) { memcpy(script, config.localeScript, sizeof(config.localeScript)); } Loading @@ -268,10 +268,10 @@ void LocaleValue::writeTo(ResTable_config* out) const { if (script[0]) { memcpy(out->localeScript, script, sizeof(out->localeScript)); out->localeScriptWasProvided = true; out->localeScriptWasComputed = false; } else { out->computeScript(); out->localeScriptWasProvided = false; out->localeScriptWasComputed = true; } if (variant[0]) { Loading Loading
include/androidfw/ResourceTypes.h +8 −4 Original line number Diff line number Diff line Loading @@ -1151,9 +1151,13 @@ struct ResTable_config uint32_t screenConfig2; }; // If true, it means that the script of the locale was explicitly provided. // If false, it means that the script was automatically computed. bool localeScriptWasProvided; // If false and localeScript is set, it means that the script of the locale // was explicitly provided. // // If true, it means that localeScript was automatically computed. // localeScript may still not be set in this case, which means that we // tried but could not compute a script. bool localeScriptWasComputed; void copyFromDeviceNoSwap(const ResTable_config& o); Loading Loading @@ -1233,7 +1237,7 @@ struct ResTable_config inline void clearLocale() { locale = 0; localeScriptWasProvided = false; localeScriptWasComputed = false; memset(localeScript, 0, sizeof(localeScript)); memset(localeVariant, 0, sizeof(localeVariant)); } Loading
libs/androidfw/ResourceTypes.cpp +15 −15 Original line number Diff line number Diff line Loading @@ -1870,8 +1870,8 @@ void ResTable_config::swapHtoD() { // The language & region are equal, so compare the scripts and variants. const char emptyScript[sizeof(l.localeScript)] = {'\0', '\0', '\0', '\0'}; const char *lScript = l.localeScriptWasProvided ? l.localeScript : emptyScript; const char *rScript = r.localeScriptWasProvided ? r.localeScript : emptyScript; const char *lScript = l.localeScriptWasComputed ? emptyScript : l.localeScript; const char *rScript = r.localeScriptWasComputed ? emptyScript : r.localeScript; int script = memcmp(lScript, rScript, sizeof(l.localeScript)); if (script) { return script; Loading Loading @@ -2016,11 +2016,11 @@ int ResTable_config::isLocaleMoreSpecificThan(const ResTable_config& o) const { // scripts since it seems more useful to do so. We will consider // "en-US-POSIX" to be more specific than "en-Latn-US". const int score = (localeScriptWasProvided ? 1 : 0) + ((localeVariant[0] != 0) ? 2 : 0); const int score = ((localeScript[0] != '\0' && !localeScriptWasComputed) ? 1 : 0) + ((localeVariant[0] != '\0') ? 2 : 0); const int oScore = (o.localeScriptWasProvided ? 1 : 0) + ((o.localeVariant[0] != 0) ? 2 : 0); const int oScore = (o.localeScript[0] != '\0' && !o.localeScriptWasComputed ? 1 : 0) + ((o.localeVariant[0] != '\0') ? 2 : 0); return score - oScore; Loading Loading @@ -2535,7 +2535,8 @@ bool ResTable_config::match(const ResTable_config& settings) const { if (settings.localeScript[0] == '\0') { // could not determine the request's script countriesMustMatch = true; } else { if (localeScript[0] == '\0') { // script was not provided, so we try to compute it if (localeScript[0] == '\0' && !localeScriptWasComputed) { // script was not provided or computed, so we try to compute it localeDataComputeScript(computed_script, language, country); if (computed_script[0] == '\0') { // we could not compute the script countriesMustMatch = true; Loading Loading @@ -2684,8 +2685,8 @@ void ResTable_config::appendDirLocale(String8& out) const { if (!language[0]) { return; } if (!localeScriptWasProvided && !localeVariant[0]) { const bool scriptWasProvided = localeScript[0] != '\0' && !localeScriptWasComputed; if (!scriptWasProvided && !localeVariant[0]) { // Legacy format. if (out.size() > 0) { out.append("-"); Loading Loading @@ -2715,7 +2716,7 @@ void ResTable_config::appendDirLocale(String8& out) const { size_t len = unpackLanguage(buf); out.append(buf, len); if (localeScriptWasProvided) { if (scriptWasProvided) { out.append("+"); out.append(localeScript, sizeof(localeScript)); } Loading Loading @@ -2746,7 +2747,7 @@ void ResTable_config::getBcp47Locale(char str[RESTABLE_MAX_LOCALE_LEN]) const { charsWritten += unpackLanguage(str); } if (localeScriptWasProvided) { if (localeScript[0] && !localeScriptWasComputed) { if (charsWritten) { str[charsWritten++] = '-'; } Loading Loading @@ -2787,7 +2788,6 @@ void ResTable_config::getBcp47Locale(char str[RESTABLE_MAX_LOCALE_LEN]) const { for (size_t i = 1; i < 4; ++i) { config->localeScript[i] = tolower(start[i]); } config->localeScriptWasProvided = true; break; } case 5: Loading @@ -2807,7 +2807,6 @@ void ResTable_config::getBcp47Locale(char str[RESTABLE_MAX_LOCALE_LEN]) const { void ResTable_config::setBcp47Locale(const char* in) { locale = 0; localeScriptWasProvided = false; memset(localeScript, 0, sizeof(localeScript)); memset(localeVariant, 0, sizeof(localeVariant)); Loading @@ -2824,9 +2823,10 @@ void ResTable_config::setBcp47Locale(const char* in) { const size_t size = in + strlen(in) - start; assignLocaleComponent(this, start, size); if (localeScript[0] == '\0') { localeScriptWasComputed = (localeScript[0] == '\0'); if (localeScriptWasComputed) { computeScript(); }; } } String8 ResTable_config::toString() const { Loading
libs/androidfw/tests/ConfigLocale_test.cpp +9 −9 Original line number Diff line number Diff line Loading @@ -125,10 +125,10 @@ TEST(ConfigLocaleTest, packAndUnpack3LetterRegion) { if (script != NULL) { memcpy(out->localeScript, script, 4); out->localeScriptWasProvided = true; out->localeScriptWasComputed = false; } else { out->computeScript(); out->localeScriptWasProvided = false; out->localeScriptWasComputed = true; } if (variant != NULL) { Loading Loading @@ -182,7 +182,7 @@ TEST(ConfigLocaleTest, setLocale) { EXPECT_EQ('n', test.language[1]); EXPECT_EQ('U', test.country[0]); EXPECT_EQ('S', test.country[1]); EXPECT_FALSE(test.localeScriptWasProvided); EXPECT_TRUE(test.localeScriptWasComputed); EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4)); EXPECT_EQ(0, test.localeVariant[0]); Loading @@ -203,7 +203,7 @@ TEST(ConfigLocaleTest, setLocale) { EXPECT_EQ('e', test.language[0]); EXPECT_EQ('n', test.language[1]); EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4)); EXPECT_TRUE(test.localeScriptWasProvided); EXPECT_FALSE(test.localeScriptWasComputed); memset(out, 1, 4); test.unpackRegion(out); EXPECT_EQ('4', out[0]); Loading @@ -216,7 +216,7 @@ TEST(ConfigLocaleTest, setLocale) { EXPECT_EQ('d', out[0]); EXPECT_EQ('e', out[1]); EXPECT_EQ('\0', out[2]); EXPECT_FALSE(test.localeScriptWasProvided); EXPECT_TRUE(test.localeScriptWasComputed); EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4)); memset(out, 1, 4); test.unpackRegion(out); Loading @@ -229,7 +229,7 @@ TEST(ConfigLocaleTest, setLocale) { EXPECT_EQ('d', out[0]); EXPECT_EQ('e', out[1]); EXPECT_EQ('\0', out[2]); EXPECT_TRUE(test.localeScriptWasProvided); EXPECT_FALSE(test.localeScriptWasComputed); EXPECT_EQ(0, memcmp("Latn", test.localeScript, 4)); memset(out, 1, 4); test.unpackRegion(out); Loading Loading @@ -270,11 +270,11 @@ TEST(ConfigLocaleTest, getBcp47Locale_script) { fillIn("en", NULL, "Latn", NULL, &config); char out[RESTABLE_MAX_LOCALE_LEN]; config.localeScriptWasProvided = true; config.localeScriptWasComputed = false; config.getBcp47Locale(out); EXPECT_EQ(0, strcmp("en-Latn", out)); config.localeScriptWasProvided = false; config.localeScriptWasComputed = true; config.getBcp47Locale(out); EXPECT_EQ(0, strcmp("en", out)); } Loading Loading @@ -379,7 +379,7 @@ TEST(ConfigLocaleTest, match_emptyScript) { // emulate packages built with older AAPT memset(supported.localeScript, '\0', 4); supported.localeScriptWasProvided = false; supported.localeScriptWasComputed = false; EXPECT_TRUE(supported.match(requested)); } Loading
tools/aapt/AaptAssets.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -373,7 +373,7 @@ int AaptLocaleValue::initFromDirName(const Vector<String8>& parts, const int sta void AaptLocaleValue::initFromResTable(const ResTable_config& config) { config.unpackLanguage(language); config.unpackRegion(region); if (config.localeScriptWasProvided) { if (config.localeScript[0] && !config.localeScriptWasComputed) { memcpy(script, config.localeScript, sizeof(config.localeScript)); } Loading @@ -388,10 +388,10 @@ void AaptLocaleValue::writeTo(ResTable_config* out) const { if (script[0]) { memcpy(out->localeScript, script, sizeof(out->localeScript)); out->localeScriptWasProvided = true; out->localeScriptWasComputed = false; } else { out->computeScript(); out->localeScriptWasProvided = false; out->localeScriptWasComputed = true; } if (variant[0]) { Loading
tools/aapt2/Locale.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -253,7 +253,7 @@ std::string LocaleValue::toDirName() const { void LocaleValue::initFromResTable(const ResTable_config& config) { config.unpackLanguage(language); config.unpackRegion(region); if (config.localeScriptWasProvided) { if (config.localeScript[0] && !config.localeScriptWasComputed) { memcpy(script, config.localeScript, sizeof(config.localeScript)); } Loading @@ -268,10 +268,10 @@ void LocaleValue::writeTo(ResTable_config* out) const { if (script[0]) { memcpy(out->localeScript, script, sizeof(out->localeScript)); out->localeScriptWasProvided = true; out->localeScriptWasComputed = false; } else { out->computeScript(); out->localeScriptWasProvided = false; out->localeScriptWasComputed = true; } if (variant[0]) { Loading