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

Commit 59c3da23 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

(cherry picked from commit 26edbccb)

Change-Id: I0f41f27e3e6eb88f0265c9ef6b3f34df04bfff1b
parent b125caa7
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);
        }
    }
}