Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9e7c2063 authored by Robert Greenwalt's avatar Robert Greenwalt Committed by Android Git Automerger
Browse files

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

* commit '5a8455c3':
  Set locale based on SIM preferred language.
parents 0964c759 5a8455c3
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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);
    }

    /**
+6 −2
Original line number Diff line number Diff line
@@ -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");

+9 −0
Original line number Diff line number Diff line
@@ -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)
+57 −4
Original line number Diff line number Diff line
@@ -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");
        }
    }

    private String findBestLanguage(byte[] languages) {
        String bestMatch = null;
        String[] locales = phone.getContext().getAssets().getLocales();

    public byte[] getLanguageIndication() {
        return mEFli;
        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() {