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

Commit 75749ab1 authored by Robert Greenwalt's avatar Robert Greenwalt Committed by Android (Google) Code Review
Browse files

Merge "Set locale based on SIM preferred language." into honeycomb-LTE

parents 2488a943 e9b46c3a
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() {