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

Commit 26edbccb authored by Narayan Kamath's avatar Narayan Kamath
Browse files

Get rid of duplicated code in accessibility settings.

Has the side effect of picking up changes to LocalePicker
that added support for 3 letter language codes.

bug: 10090157

Change-Id: I20b357c8a3e76c7cecdf623d9ed39c3751d07645
parent ce258caa
Loading
Loading
Loading
Loading
+8 −92
Original line number Diff line number Diff line
@@ -21,10 +21,12 @@ import android.content.res.Resources;
import android.preference.ListPreference;
import android.util.AttributeSet;

import com.android.internal.app.LocalePicker;
import com.android.settings.R;

import java.text.Collator;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;

/**
@@ -43,108 +45,22 @@ public class LocalePreference extends ListPreference {
    }

    public void init(Context context) {
        final String[] systemLocales = Resources.getSystem().getAssets().getLocales();
        Arrays.sort(systemLocales);

        final Resources resources = context.getResources();
        final String[] specialLocaleCodes = resources.getStringArray(
                com.android.internal.R.array.special_locale_codes);
        final String[] specialLocaleNames = resources.getStringArray(
                com.android.internal.R.array.special_locale_names);

        int finalSize = 0;

        final int origSize = systemLocales.length;
        final LocaleInfo[] localeInfos = new LocaleInfo[origSize];
        for (int i = 0; i < origSize; i++) {
            final String localeStr = systemLocales[i];
            final int len = localeStr.length();
            if (len != 5) {
                continue;
            }

            final String language = localeStr.substring(0, 2);
            final String country = localeStr.substring(3, 5);
            final Locale l = new Locale(language, country);

            if (finalSize == 0) {
                localeInfos[finalSize++] = new LocaleInfo(l.getDisplayLanguage(l), l);
            } else {
                // check previous entry:
                // same lang and a country -> upgrade to full name and
                // insert ours with full name
                // diff lang -> insert ours with lang-only name
                final LocaleInfo previous = localeInfos[finalSize - 1];
                if (previous.locale.getLanguage().equals(language)
                        && !previous.locale.getLanguage().equals("zz")) {
                    previous.label = getDisplayName(
                            localeInfos[finalSize - 1].locale, specialLocaleCodes,
                            specialLocaleNames);
                    localeInfos[finalSize++] = new LocaleInfo(getDisplayName(l,
                            specialLocaleCodes, specialLocaleNames), l);
                } else {
                    final String displayName;
                    if (localeStr.equals("zz_ZZ")) {
                        displayName = "[Developer] Accented English";
                    } else if (localeStr.equals("zz_ZY")) {
                        displayName = "[Developer] Fake Bi-Directional";
                    } else {
                        displayName = l.getDisplayLanguage(l);
                    }
                    localeInfos[finalSize++] = new LocaleInfo(displayName, l);
                }
            }
        }
        List<LocalePicker.LocaleInfo> locales = LocalePicker.getAllAssetLocales(context,
                false /* in developer mode */);

        final int finalSize = locales.size();
        final CharSequence[] entries = new CharSequence[finalSize + 1];
        final CharSequence[] entryValues = new CharSequence[finalSize + 1];
        Arrays.sort(localeInfos, 0, finalSize);

        entries[0] = resources.getString(R.string.locale_default);
        entries[0] = context.getResources().getString(R.string.locale_default);
        entryValues[0] = "";

        for (int i = 0; i < finalSize; i++) {
            final LocaleInfo info = localeInfos[i];
            final LocalePicker.LocaleInfo info = locales.get(i);
            entries[i + 1] = info.toString();
            entryValues[i + 1] = info.locale.toString();
            entryValues[i + 1] = info.getLocale().toString();
        }

        setEntries(entries);
        setEntryValues(entryValues);
    }

    private static String getDisplayName(
            Locale l, String[] specialLocaleCodes, String[] specialLocaleNames) {
        String code = l.toString();

        for (int i = 0; i < specialLocaleCodes.length; i++) {
            if (specialLocaleCodes[i].equals(code)) {
                return specialLocaleNames[i];
            }
        }

        return l.getDisplayName(l);
    }

    private static class LocaleInfo implements Comparable<LocaleInfo> {
        private static final Collator sCollator = Collator.getInstance();

        public String label;
        public Locale locale;

        public LocaleInfo(String label, Locale locale) {
            this.label = label;
            this.locale = locale;
        }

        @Override
        public String toString() {
            return label;
        }

        @Override
        public int compareTo(LocaleInfo another) {
            return sCollator.compare(this.label, another.label);
        }
    }
}