From fd138cd81a689ff46e6ae90e46adcdc53f3c5442 Mon Sep 17 00:00:00 2001 From: Narayan Kamath Date: Wed, 30 Jul 2014 15:42:25 +0100 Subject: [PATCH] Don't assume languages are 2 letter codes. Also, note that this method never worked. Locale settings were stored with underscores (like Locale.toString) but matched against AssetManager.getLocales() which returned language-tag like output. bug: 10090157 Change-Id: I36ffea6e39ff7d1907b2787f8fd4545c24d326a8 --- .../providers/settings/SettingsHelper.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java index dd7a828626f4e..91199c1fe8d7c 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java @@ -190,33 +190,34 @@ public class SettingsHelper { String localeString = loc.getLanguage(); String country = loc.getCountry(); if (!TextUtils.isEmpty(country)) { - localeString += "_" + country; + localeString += "-" + country; } return localeString.getBytes(); } /** - * Sets the locale specified. Input data is the equivalent of "ll_cc".getBytes(), where - * "ll" is the language code and "cc" is the country code. + * Sets the locale specified. Input data is the byte representation of a + * BCP-47 language tag. For backwards compatibility, strings of the form + * {@code ll_CC} are also accepted, where {@code ll} is a two letter language + * code and {@code CC} is a two letter country code. + * * @param data the locale string in bytes. */ void setLocaleData(byte[] data, int size) { // Check if locale was set by the user: Configuration conf = mContext.getResources().getConfiguration(); - Locale loc = conf.locale; // TODO: The following is not working as intended because the network is forcing a locale // change after registering. Need to find some other way to detect if the user manually // changed the locale if (conf.userSetLocale) return; // Don't change if user set it in the SetupWizard final String[] availableLocales = mContext.getAssets().getLocales(); - String localeCode = new String(data, 0, size); - String language = new String(data, 0, 2); - String country = size > 4 ? new String(data, 3, 2) : ""; - loc = null; + // Replace "_" with "-" to deal with older backups. + String localeCode = new String(data, 0, size).replace('_', '-'); + Locale loc = null; for (int i = 0; i < availableLocales.length; i++) { if (availableLocales[i].equals(localeCode)) { - loc = new Locale(language, country); + loc = Locale.forLanguageTag(localeCode); break; } }