summaryrefslogtreecommitdiffstats
path: root/libs/androidfw
diff options
context:
space:
mode:
authorNarayan Kamath <narayan@google.com>2014-06-26 16:01:28 +0100
committerNarayan Kamath <narayan@google.com>2014-07-02 10:53:43 +0100
commite4345dbd2a892f38e62269d94e5ee7002d121bed (patch)
tree02bbd706da907540982427ac29dd0cbd44589782 /libs/androidfw
parent104da1e495cbed81e7ebe66b80344bf916b02391 (diff)
downloadframeworks_base-e4345dbd2a892f38e62269d94e5ee7002d121bed.zip
frameworks_base-e4345dbd2a892f38e62269d94e5ee7002d121bed.tar.gz
frameworks_base-e4345dbd2a892f38e62269d94e5ee7002d121bed.tar.bz2
Fall back to "tl" if "fil" is absent.
For JB-MR1, there was a hack that used "tl" where we really meant "fil" because ICU didn't have localizations for "fil". This has now been fixed, and we now support 3 letter language codes for AAPT so we can use "fil" where required. For the benefit of apps that need to target older platforms, we fall back to "tl" if the app has assets for "tl" and the resource locale is "fil". See bugs 7291355, 7207176 and 8049507 for more context. Change-Id: I1ac8502525f99b40f9091d5efd2df33518d47a41
Diffstat (limited to 'libs/androidfw')
-rw-r--r--libs/androidfw/AssetManager.cpp57
1 files changed, 56 insertions, 1 deletions
diff --git a/libs/androidfw/AssetManager.cpp b/libs/androidfw/AssetManager.cpp
index 87164ca..482dfc8 100644
--- a/libs/androidfw/AssetManager.cpp
+++ b/libs/androidfw/AssetManager.cpp
@@ -347,6 +347,15 @@ void AssetManager::setLocale(const char* locale)
setLocaleLocked(locale);
}
+
+static const char kFilPrefix[] = "fil";
+static const char kTlPrefix[] = "tl";
+
+// The sizes of the prefixes, excluding the 0 suffix.
+// char.
+static const int kFilPrefixLen = sizeof(kFilPrefix) - 1;
+static const int kTlPrefixLen = sizeof(kTlPrefix) - 1;
+
void AssetManager::setLocaleLocked(const char* locale)
{
if (mLocale != NULL) {
@@ -355,8 +364,44 @@ void AssetManager::setLocaleLocked(const char* locale)
//mZipSet.purgeLocale();
delete[] mLocale;
}
- mLocale = strdupNew(locale);
+
+ // If we're attempting to set a locale that starts with "fil",
+ // we should convert it to "tl" for backwards compatibility since
+ // we've been using "tl" instead of "fil" prior to L.
+ //
+ // If the resource table already has entries for "fil", we use that
+ // instead of attempting a fallback.
+ if (strncmp(locale, kFilPrefix, kFilPrefixLen) == 0) {
+ Vector<String8> locales;
+ getLocales(&locales);
+ const size_t localesSize = locales.size();
+ bool hasFil = false;
+ for (size_t i = 0; i < localesSize; ++i) {
+ if (locales[i].find(kFilPrefix) == 0) {
+ hasFil = true;
+ break;
+ }
+ }
+
+
+ if (!hasFil) {
+ const size_t newLocaleLen = strlen(locale);
+ // This isn't a bug. We really do want mLocale to be 1 byte
+ // shorter than locale, because we're replacing "fil-" with
+ // "tl-".
+ mLocale = new char[newLocaleLen];
+ // Copy over "tl".
+ memcpy(mLocale, kTlPrefix, kTlPrefixLen);
+ // Copy the rest of |locale|, including the terminating '\0'.
+ memcpy(mLocale + kTlPrefixLen, locale + kFilPrefixLen,
+ newLocaleLen - kFilPrefixLen + 1);
+ updateResourceParamsLocked();
+ return;
+ }
+ }
+
+ mLocale = strdupNew(locale);
updateResourceParamsLocked();
}
@@ -741,6 +786,16 @@ void AssetManager::getLocales(Vector<String8>* locales) const
if (res != NULL) {
res->getLocales(locales);
}
+
+ const size_t numLocales = locales->size();
+ for (size_t i = 0; i < numLocales; ++i) {
+ const String8& localeStr = locales->itemAt(i);
+ if (localeStr.find(kTlPrefix) == 0) {
+ String8 replaced("fil");
+ replaced += (localeStr.string() + kTlPrefixLen);
+ locales->editItemAt(i) = replaced;
+ }
+ }
}
/*