package org.openintents.preferences; import android.app.AlertDialog.Builder; import android.content.Context; import android.preference.ListPreference; import android.speech.tts.TextToSpeech; import android.text.TextUtils; import android.util.AttributeSet; import java.util.ArrayList; import java.util.Locale; import java.util.MissingResourceException; public class LocalePreference extends ListPreference { private static CharSequence[] entries; private static CharSequence[] entryValues; public LocalePreference(Context context) { super(context); } public LocalePreference(Context context, AttributeSet attr) { super(context, attr); } public static void init(TextToSpeech tts) { if (entries == null) { int length = Locale.getAvailableLocales().length; ArrayList<CharSequence> entryList = new ArrayList<>(); ArrayList<CharSequence> entryValueList = new ArrayList<>(); int count = 0; Locale l; String country; for (int i = 0; i < length; i++) { l = Locale.getAvailableLocales()[i]; if (invalidLocale(tts, l)){ continue; } switch (tts.isLanguageAvailable(l)) { case TextToSpeech.LANG_AVAILABLE: case TextToSpeech.LANG_COUNTRY_AVAILABLE: case TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE: country = l.getDisplayCountry(l); if (TextUtils.isEmpty(country)) { entryList.add(l.getDisplayLanguage(l)); } else { entryList.add(l.getDisplayLanguage(l) + " (" + country + ")"); } entryValueList.add(l.getLanguage() + "," + l.getCountry()); count++; } } entries = entryList.toArray(new CharSequence[count]); entryValues = entryValueList.toArray(new CharSequence[count]); } } private static boolean invalidLocale(TextToSpeech tts, Locale l) { try { l.getISO3Country(); tts.isLanguageAvailable(l); return false; } catch (MissingResourceException e) { return true; } catch (IllegalArgumentException e) { return true; } } @Override protected void onPrepareDialogBuilder(Builder builder) { setEntryValues(entryValues); setEntries(entries); super.onPrepareDialogBuilder(builder); } }