am 75749ab1: Merge "Set locale based on SIM preferred language." into honeycomb-LTE

* commit '75749ab1a03f5b4a9f1aaee64dd1c6f36e22dc22':
  Set locale based on SIM preferred language.
This commit is contained in:
Robert Greenwalt
2011-06-09 15:54:45 -07:00
committed by Android Git Automerger
4 changed files with 73 additions and 7 deletions

View File

@@ -234,7 +234,7 @@ public final class MccTable
String country = MccTable.countryCodeForMcc(mcc);
Log.d(LOG_TAG, "locale set to "+language+"_"+country);
phone.setSystemLocale(language, country);
phone.setSystemLocale(language, country, true);
}
/**

View File

@@ -580,7 +580,7 @@ public abstract class PhoneBase extends Handler implements Phone {
if (l.length() >=5) {
country = l.substring(3, 5);
}
setSystemLocale(language, country);
setSystemLocale(language, country, false);
if (!country.isEmpty()) {
try {
@@ -602,10 +602,14 @@ public abstract class PhoneBase extends Handler implements Phone {
* Utility code to set the system locale if it's not set already
* @param language Two character language code desired
* @param country Two character country code desired
* @param fromMcc Indicating whether the locale is set according to MCC table.
* This flag wil be ignored by default implementation.
* TODO: Use a source enumeration so that source of the locale
* can be prioritized.
*
* {@hide}
*/
public void setSystemLocale(String language, String country) {
public void setSystemLocale(String language, String country, boolean fromMcc) {
String l = SystemProperties.get("persist.sys.language");
String c = SystemProperties.get("persist.sys.country");

View File

@@ -120,6 +120,15 @@ public class CDMALTEPhone extends CDMAPhone {
return false;
}
@Override
public void setSystemLocale(String language, String country, boolean fromMcc) {
// Avoid system locale is set from MCC table if CDMALTEPhone is used.
// The locale will be picked up based on EFpl/EFli once CSIM records are loaded.
if (fromMcc) return;
super.setSystemLocale(language, country, false);
}
@Override
protected void log(String s) {
if (DBG)

View File

@@ -19,6 +19,7 @@ import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OP
import com.android.internal.telephony.GsmAlphabet;
import com.android.internal.telephony.IccFileHandler;
import com.android.internal.telephony.IccUtils;
import com.android.internal.telephony.MccTable;
import com.android.internal.telephony.PhoneBase;
import com.android.internal.telephony.cdma.sms.UserData;
import com.android.internal.telephony.gsm.SIMRecords;
@@ -184,6 +185,12 @@ public final class CdmaLteUiccRecords extends SIMRecords {
}
}
@Override
protected void onAllRecordsLoaded() {
super.onAllRecordsLoaded();
setLocaleFromCsim();
}
@Override
protected void fetchSimRecords() {
IccFileHandler iccFh = phone.getIccFileHandler();
@@ -355,12 +362,58 @@ public final class CdmaLteUiccRecords extends SIMRecords {
if (DBG) log("CSIM PRL version=" + mPrlVersion);
}
public byte[] getPreferredLanguage() {
return mEFpl;
private void setLocaleFromCsim() {
String prefLang = null;
// check EFli then EFpl
prefLang = findBestLanguage(mEFli);
if (prefLang == null) {
prefLang = findBestLanguage(mEFpl);
}
if (prefLang != null) {
// check country code from SIM
String imsi = getIMSI();
String country = null;
if (imsi != null) {
country = MccTable.countryCodeForMcc(
Integer.parseInt(imsi.substring(0,3)));
}
log("Setting locale to " + prefLang + "_" + country);
phone.setSystemLocale(prefLang, country, false);
} else {
log ("No suitable CSIM selected locale");
}
}
public byte[] getLanguageIndication() {
return mEFli;
private String findBestLanguage(byte[] languages) {
String bestMatch = null;
String[] locales = phone.getContext().getAssets().getLocales();
if ((languages == null) || (locales == null)) return null;
// Each 2-bytes consists of one language
for (int i = 0; (i + 1) < languages.length; i += 2) {
try {
String lang = new String(languages, i, 2, "ISO-8859-1");
for (int j = 0; j < locales.length; j++) {
if (locales[j] != null && locales[j].length() >= 2 &&
locales[j].substring(0, 2).equals(lang)) {
return lang;
}
}
if (bestMatch != null) break;
} catch(java.io.UnsupportedEncodingException e) {
log ("Failed to parse SIM language records");
}
}
// no match found. return null
return null;
}
@Override
protected void log(String s) {
if (DBG) Log.d(LOG_TAG, "[CSIM] " + s);
}
public String getMdn() {