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

Commit e9b46c3a authored by Kazuhiro Ondo's avatar Kazuhiro Ondo Committed by Robert Greenwalt
Browse files

Set locale based on SIM preferred language.

Unless user had selected a desired locale, EFli or EFpl will be
used to decide the locale to be used.

Note this locale setting is not persistent - only valid while
SIM card is present.

Change-Id: I1f3945f7bc02624dff94b90e7f1a658a136033e8
parent 9b0a8f9a
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() {