Adding plugin specific settings to TTS settings + changing the UI
to be more like the IME settings.
Change-Id: I0d26042262b4d9e636d3f456e867c725fa56ae55
diff --git a/src/com/android/settings/TextToSpeechSettings.java b/src/com/android/settings/TextToSpeechSettings.java
index 4fafa25..6b97ef2 100644
--- a/src/com/android/settings/TextToSpeechSettings.java
+++ b/src/com/android/settings/TextToSpeechSettings.java
@@ -23,7 +23,9 @@
import static android.provider.Settings.Secure.TTS_DEFAULT_VARIANT;
import static android.provider.Settings.Secure.TTS_DEFAULT_SYNTH;
+import android.app.AlertDialog;
import android.content.ContentResolver;
+import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
@@ -31,7 +33,10 @@
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
+import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
+import android.preference.PreferenceGroup;
+import android.preference.PreferenceScreen;
import android.preference.CheckBoxPreference;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
@@ -49,6 +54,7 @@
private static final String TAG = "TextToSpeechSettings";
+ private static final String SYSTEM_TTS = "com.svox.pico";
private static final String KEY_TTS_PLAY_EXAMPLE = "tts_play_example";
private static final String KEY_TTS_INSTALL_DATA = "tts_install_data";
private static final String KEY_TTS_USE_DEFAULT = "toggle_use_default_tts_settings";
@@ -57,6 +63,10 @@
private static final String KEY_TTS_DEFAULT_COUNTRY = "tts_default_country";
private static final String KEY_TTS_DEFAULT_VARIANT = "tts_default_variant";
private static final String KEY_TTS_DEFAULT_SYNTH = "tts_default_synth";
+
+ private static final String KEY_PLUGIN_ENABLED_PREFIX = "ENABLED_";
+ private static final String KEY_PLUGIN_SETTINGS_PREFIX = "SETTINGS_";
+
// TODO move default Locale values to TextToSpeech.Engine
private static final String DEFAULT_LANG_VAL = "eng";
private static final String DEFAULT_COUNTRY_VAL = "USA";
@@ -102,6 +112,8 @@
addPreferencesFromResource(R.xml.tts_settings);
+ addEngineSpecificSettings();
+
mDemoStrings = getResources().getStringArray(R.array.tts_demo_strings);
setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM);
@@ -133,6 +145,55 @@
}
+ private void addEngineSpecificSettings() {
+ PreferenceGroup enginesCategory = (PreferenceGroup) findPreference("tts_engines_section");
+ Intent intent = new Intent("android.intent.action.START_TTS_ENGINE");
+ ResolveInfo[] enginesArray = new ResolveInfo[0];
+ PackageManager pm = getPackageManager();
+ enginesArray = pm.queryIntentActivities(intent, 0).toArray(enginesArray);
+ for (int i = 0; i < enginesArray.length; i++) {
+ String prefKey = "";
+ final String pluginPackageName = enginesArray[i].activityInfo.packageName;
+ if (!enginesArray[i].activityInfo.packageName.equals(SYSTEM_TTS)) {
+ CheckBoxPreference chkbxPref = new CheckBoxPreference(this);
+ prefKey = KEY_PLUGIN_ENABLED_PREFIX + pluginPackageName;
+ chkbxPref.setKey(prefKey);
+ chkbxPref.setTitle(enginesArray[i].loadLabel(pm));
+ enginesCategory.addPreference(chkbxPref);
+ }
+ if (pluginHasSettings(pluginPackageName)) {
+ Preference pref = new Preference(this);
+ prefKey = KEY_PLUGIN_SETTINGS_PREFIX + pluginPackageName;
+ pref.setKey(prefKey);
+ pref.setTitle(enginesArray[i].loadLabel(pm));
+ CharSequence settingsLabel = getResources().getString(
+ R.string.tts_engine_name_settings, enginesArray[i].loadLabel(pm));
+ pref.setSummary(settingsLabel);
+ pref.setOnPreferenceClickListener(new OnPreferenceClickListener(){
+ public boolean onPreferenceClick(Preference preference){
+ Intent i = new Intent();
+ i.setClassName(pluginPackageName,
+ pluginPackageName + ".EngineSettings");
+ startActivity(i);
+ return true;
+ }
+ });
+ enginesCategory.addPreference(pref);
+ }
+ }
+ }
+
+ private boolean pluginHasSettings(String pluginPackageName) {
+ PackageManager pm = getPackageManager();
+ Intent i = new Intent();
+ i.setClassName(pluginPackageName, pluginPackageName + ".EngineSettings");
+ if (pm.resolveActivity(i, PackageManager.MATCH_DEFAULT_ONLY) != null){
+ return true;
+ }
+ return false;
+ }
+
+
private void initClickers() {
mPlayExample = findPreference(KEY_TTS_PLAY_EXAMPLE);
mPlayExample.setOnPreferenceClickListener(this);
@@ -436,6 +497,46 @@
return false;
}
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+ if (Utils.isMonkeyRunning()) {
+ return false;
+ }
+
+ if (preference instanceof CheckBoxPreference) {
+ final CheckBoxPreference chkPref = (CheckBoxPreference) preference;
+ if (!chkPref.getKey().equals(KEY_TTS_USE_DEFAULT)){
+ if (chkPref.isChecked()) {
+ chkPref.setChecked(false);
+ AlertDialog d = (new AlertDialog.Builder(this))
+ .setTitle(android.R.string.dialog_alert_title)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setMessage(getString(R.string.tts_engine_security_warning,
+ chkPref.getTitle()))
+ .setCancelable(true)
+ .setPositiveButton(android.R.string.ok,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ chkPref.setChecked(true);
+ loadEngines();
+ }
+ })
+ .setNegativeButton(android.R.string.cancel,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ }
+ })
+ .create();
+ d.show();
+ } else {
+ loadEngines();
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
private void updateWidgetState() {
mPlayExample.setEnabled(mEnableDemo);
@@ -540,22 +641,36 @@
}
- private void loadEngines() {
- ListPreference enginesPref = (ListPreference) findPreference(KEY_TTS_DEFAULT_SYNTH);
+ private void loadEngines() {
+ ListPreference enginesPref = (ListPreference) findPreference(KEY_TTS_DEFAULT_SYNTH);
- Intent intent = new Intent("android.intent.action.START_TTS_ENGINE");
+ // TODO (clchen): Try to see if it is possible to be more efficient here
+ // and not search for plugins again.
+ Intent intent = new Intent("android.intent.action.START_TTS_ENGINE");
+ ResolveInfo[] enginesArray = new ResolveInfo[0];
+ PackageManager pm = getPackageManager();
+ enginesArray = pm.queryIntentActivities(intent, 0).toArray(enginesArray);
+ ArrayList<CharSequence> entries = new ArrayList<CharSequence>();
+ ArrayList<CharSequence> values = new ArrayList<CharSequence>();
+ for (int i = 0; i < enginesArray.length; i++) {
+ if (enginesArray[i].activityInfo.packageName.equals(SYSTEM_TTS)) {
+ entries.add(enginesArray[i].loadLabel(pm));
+ values.add(enginesArray[i].activityInfo.packageName);
+ } else {
+ CheckBoxPreference pref = (CheckBoxPreference) findPreference(
+ KEY_PLUGIN_ENABLED_PREFIX + enginesArray[i].activityInfo.packageName);
+ if ((pref != null) && pref.isChecked()){
+ entries.add(enginesArray[i].loadLabel(pm));
+ values.add(enginesArray[i].activityInfo.packageName);
+ }
+ }
+ }
- ResolveInfo[] enginesArray = new ResolveInfo[0];
- PackageManager pm = getPackageManager();
- enginesArray = pm.queryIntentActivities(intent, 0).toArray(enginesArray);
- CharSequence entries[] = new CharSequence[enginesArray.length];
- CharSequence values[] = new CharSequence[enginesArray.length];
- for (int i = 0; i < enginesArray.length; i++) {
- entries[i] = enginesArray[i].loadLabel(pm);
- values[i] = enginesArray[i].activityInfo.packageName;
+ CharSequence entriesArray[] = new CharSequence[entries.size()];
+ CharSequence valuesArray[] = new CharSequence[values.size()];
+
+ enginesPref.setEntries(entries.toArray(entriesArray));
+ enginesPref.setEntryValues(values.toArray(valuesArray));
}
- enginesPref.setEntries(entries);
- enginesPref.setEntryValues(values);
- }
}