Merge "Text to speech settings UI change."
This commit is contained in:
committed by
Android (Google) Code Review
commit
fb52613a57
@@ -2878,6 +2878,14 @@ found in the list of installed applications.</string>
|
||||
<string name="tts_engine_name_is_enabled_summary"><xliff:g id="tts_plugin_engine_name">%s</xliff:g> is enabled</string>
|
||||
<!-- On main TTS Settings screen, text preceded by the TTS engine name to indicate the engine cannot be used by the user -->
|
||||
<string name="tts_engine_name_is_disabled_summary"><xliff:g id="tts_plugin_engine_name">%s</xliff:g> is disabled</string>
|
||||
<!-- On the main TTS settings screen, text for a divider under which
|
||||
the engine specific settings and the "engine install data" option
|
||||
are listed [CHAR LIMIT=30]-->
|
||||
<string name="tts_engine_settings_section">Engine settings</string>
|
||||
<!-- Title for a preference in the main TTS settings screen, which
|
||||
launches the settings screen for a given TTS engine when clicked
|
||||
[CHAR LIMIT=30]-->
|
||||
<string name="tts_engine_settings_title">Settings for <xliff:g id="tts_engine_name">%s</xliff:g></string>
|
||||
<!-- On Pico TTS Settings screen, text to mark the section for the various languages and voices that are available -->
|
||||
<string name="pico_languages_and_voices">Languages and voices</string>
|
||||
<!-- On Pico TTS Settings screen, text to mark a voice as installed -->
|
||||
|
@@ -4,9 +4,9 @@
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@@ -18,17 +18,11 @@
|
||||
android:title="@string/tts_settings_title">
|
||||
|
||||
<Preference
|
||||
android:key="tts_play_example"
|
||||
android:persistent="false"
|
||||
android:title="@string/tts_play_example_title"
|
||||
android:summary="@string/tts_play_example_summary" />
|
||||
android:key="tts_play_example"
|
||||
android:persistent="false"
|
||||
android:title="@string/tts_play_example_title"
|
||||
android:summary="@string/tts_play_example_summary" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="toggle_use_default_tts_settings"
|
||||
android:title="@string/use_default_tts_settings_title"
|
||||
android:summary="@string/use_default_tts_settings_summary"
|
||||
android:persistent="false" />
|
||||
|
||||
<PreferenceCategory
|
||||
android:title="@string/tts_default_settings_section">
|
||||
<ListPreference
|
||||
@@ -39,12 +33,6 @@
|
||||
android:entries="@array/tts_engine_entries"
|
||||
android:entryValues="@array/tts_engine_values" />
|
||||
|
||||
<Preference
|
||||
android:key="tts_install_data"
|
||||
android:persistent="false"
|
||||
android:title="@string/tts_install_data_title"
|
||||
android:summary="@string/tts_install_data_summary" />
|
||||
|
||||
<ListPreference
|
||||
android:key="tts_default_rate"
|
||||
android:title="@string/tts_default_rate_title"
|
||||
@@ -63,8 +51,19 @@
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory android:key="tts_engines_section"
|
||||
android:title="@string/tts_engines_section" />
|
||||
<PreferenceCategory android:key="tts_engine_settings_section"
|
||||
android:title="@string/tts_engine_settings_section">
|
||||
<Preference
|
||||
android:key="tts_engine_settings"
|
||||
android:persistent="false"
|
||||
android:title="@string/tts_engine_settings_title" />
|
||||
|
||||
<Preference
|
||||
android:key="tts_install_data"
|
||||
android:persistent="false"
|
||||
android:title="@string/tts_install_data_title"
|
||||
android:summary="@string/tts_install_data_summary" />
|
||||
</PreferenceCategory>
|
||||
|
||||
|
||||
</PreferenceScreen>
|
||||
|
@@ -21,7 +21,6 @@ import static android.provider.Settings.Secure.TTS_DEFAULT_LANG;
|
||||
import static android.provider.Settings.Secure.TTS_DEFAULT_RATE;
|
||||
import static android.provider.Settings.Secure.TTS_DEFAULT_SYNTH;
|
||||
import static android.provider.Settings.Secure.TTS_DEFAULT_VARIANT;
|
||||
import static android.provider.Settings.Secure.TTS_ENABLED_PLUGINS;
|
||||
import static android.provider.Settings.Secure.TTS_USE_DEFAULTS;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
@@ -32,7 +31,6 @@ import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Bundle;
|
||||
import android.preference.CheckBoxPreference;
|
||||
import android.preference.ListPreference;
|
||||
import android.preference.Preference;
|
||||
import android.preference.Preference.OnPreferenceClickListener;
|
||||
@@ -64,7 +62,7 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
|
||||
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_TTS_ENGINES = "tts_engines_section";
|
||||
private static final String KEY_TTS_ENGINE_SETTINGS = "tts_engine_settings";
|
||||
|
||||
private static final String KEY_PLUGIN_ENABLED_PREFIX = "ENABLED_";
|
||||
private static final String KEY_PLUGIN_SETTINGS_PREFIX = "SETTINGS_";
|
||||
@@ -76,13 +74,14 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
|
||||
|
||||
private static final String LOCALE_DELIMITER = "-";
|
||||
|
||||
private Preference mPlayExample = null;
|
||||
private Preference mInstallData = null;
|
||||
private CheckBoxPreference mUseDefaultPref = null;
|
||||
private ListPreference mDefaultRatePref = null;
|
||||
private ListPreference mDefaultLocPref = null;
|
||||
private ListPreference mDefaultSynthPref = null;
|
||||
private PreferenceGroup mEnginesGroup;
|
||||
private Preference mPlayExample = null;
|
||||
|
||||
private ListPreference mDefaultRatePref = null;
|
||||
private ListPreference mDefaultLocPref = null;
|
||||
private ListPreference mDefaultSynthPref = null;
|
||||
|
||||
private Preference mInstallData = null;
|
||||
private Preference mEngineSettings = null;
|
||||
|
||||
private String mDefaultLanguage = null;
|
||||
private String mDefaultCountry = null;
|
||||
@@ -127,18 +126,18 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
|
||||
mInstallData = findPreference(KEY_TTS_INSTALL_DATA);
|
||||
mInstallData.setOnPreferenceClickListener(this);
|
||||
|
||||
mUseDefaultPref = (CheckBoxPreference) findPreference(KEY_TTS_USE_DEFAULT);
|
||||
mDefaultSynthPref = (ListPreference) findPreference(KEY_TTS_DEFAULT_SYNTH);
|
||||
mDefaultRatePref = (ListPreference) findPreference(KEY_TTS_DEFAULT_RATE);
|
||||
mDefaultLocPref = (ListPreference) findPreference(KEY_TTS_DEFAULT_LANG);
|
||||
|
||||
mEnginesGroup = (PreferenceGroup) findPreference(KEY_TTS_ENGINES);
|
||||
mEngineSettings = (Preference) findPreference(KEY_TTS_ENGINE_SETTINGS);
|
||||
mEngineSettings.setEnabled(false);
|
||||
|
||||
mTts = new TextToSpeech(getActivity().getApplicationContext(), this);
|
||||
mEnginesHelper = new TtsEngines(getActivity().getApplicationContext());
|
||||
|
||||
initDefaultSettings();
|
||||
addEngineSpecificSettings();
|
||||
initEngineSpecificSettings();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -175,39 +174,27 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
|
||||
}
|
||||
}
|
||||
|
||||
private void addEngineSpecificSettings() {
|
||||
Context context = getActivity();
|
||||
List<EngineInfo> engines = mTts.getEngines();
|
||||
for (EngineInfo engine : engines) {
|
||||
final String engineName = engine.name;
|
||||
if (!engine.system) {
|
||||
CheckBoxPreference enablePref = new CheckBoxPreference(context);
|
||||
enablePref.setKey(KEY_PLUGIN_ENABLED_PREFIX + engineName);
|
||||
enablePref.setTitle(engine.label);
|
||||
enablePref.setOnPreferenceClickListener(this);
|
||||
mEnginesGroup.addPreference(enablePref);
|
||||
}
|
||||
private void initEngineSpecificSettings() {
|
||||
final String engineName = mEnginesHelper.getDefaultEngine();
|
||||
final EngineInfo engine = mEnginesHelper.getEngineInfo(engineName);
|
||||
|
||||
if (engineHasSettings(engineName)) {
|
||||
Preference pref = new Preference(context);
|
||||
pref.setKey(KEY_PLUGIN_SETTINGS_PREFIX + engineName);
|
||||
pref.setTitle(engine.label);
|
||||
CharSequence settingsLabel = getResources().getString(
|
||||
R.string.tts_engine_name_settings, engine.label);
|
||||
pref.setSummary(settingsLabel);
|
||||
// TODO: Add a new API for this.
|
||||
pref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||
public boolean onPreferenceClick(Preference preference) {
|
||||
Intent i = new Intent();
|
||||
i.setClassName(engineName,
|
||||
engineName + ".EngineSettings");
|
||||
startActivity(i);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
mEnginesGroup.addPreference(pref);
|
||||
}
|
||||
mEngineSettings.setTitle(getResources().getString(R.string.tts_engine_settings_title,
|
||||
engine.label));
|
||||
|
||||
if (engineHasSettings(engineName)) {
|
||||
mEngineSettings.setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||
public boolean onPreferenceClick(Preference preference) {
|
||||
Intent i = new Intent();
|
||||
i.setClassName(engineName, engineName + ".EngineSettings");
|
||||
startActivity(i);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
mEngineSettings.setEnabled(true);
|
||||
} else {
|
||||
mEngineSettings.setEnabled(false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private boolean engineHasSettings(String enginePackageName) {
|
||||
@@ -226,12 +213,6 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
|
||||
// Find the default TTS values in the settings, initialize and store the
|
||||
// settings if they are not found.
|
||||
|
||||
// "Use Defaults"
|
||||
int useDefault = Settings.Secure.getInt(resolver, TTS_USE_DEFAULTS,
|
||||
TextToSpeech.Engine.USE_DEFAULTS);
|
||||
mUseDefaultPref.setChecked(useDefault == 1);
|
||||
mUseDefaultPref.setOnPreferenceChangeListener(this);
|
||||
|
||||
// Default synthesis engine
|
||||
loadEngines();
|
||||
mDefaultSynthPref.setOnPreferenceChangeListener(this);
|
||||
@@ -301,6 +282,7 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
|
||||
intent.putExtra("country", mDefaultCountry);
|
||||
intent.putExtra("variant", mDefaultLocVariant);
|
||||
intent.setPackage(defaultEngine);
|
||||
|
||||
try {
|
||||
Log.v(TAG, "Getting sample text: " + intent.toUri(0));
|
||||
startActivityForResult(intent, GET_SAMPLE_TEXT);
|
||||
@@ -504,16 +486,21 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
|
||||
Log.v(TAG, " selected is " + newIndex);
|
||||
mDemoStringIndex = newIndex > -1 ? newIndex : 0;
|
||||
} else if (KEY_TTS_DEFAULT_SYNTH.equals(preference.getKey())) {
|
||||
String defaultEng = objValue.toString();
|
||||
Settings.Secure.putString(getContentResolver(), TTS_DEFAULT_SYNTH, defaultEng);
|
||||
if (mTts != null) {
|
||||
mTts.setEngineByPackageName(defaultEng);
|
||||
mEnableDemo = false;
|
||||
mVoicesMissing = false;
|
||||
updateWidgetState();
|
||||
checkVoiceData();
|
||||
final String name = objValue.toString();
|
||||
final EngineInfo info = mEnginesHelper.getEngineInfo(name);
|
||||
|
||||
if (info.system) {
|
||||
// For system engines, do away with the alert dialog.
|
||||
updateDefaultEngine(name);
|
||||
initEngineSpecificSettings();
|
||||
} else {
|
||||
// For all other engines, display a warning message before
|
||||
// turning them on.
|
||||
displayDataAlert(preference, name);
|
||||
}
|
||||
Log.v(TAG, "The default synth is: " + objValue.toString());
|
||||
|
||||
// We'll deal with updating the UI ourselves.
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -534,42 +521,13 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
|
||||
// quit this activity so it needs to be restarted after installation of the voice data
|
||||
finish();
|
||||
return true;
|
||||
} else if (preference.getKey().startsWith(KEY_PLUGIN_ENABLED_PREFIX)) {
|
||||
final CheckBoxPreference chkPref = (CheckBoxPreference) preference;
|
||||
if (chkPref.isChecked()) {
|
||||
chkPref.setChecked(false);
|
||||
AlertDialog d = (new AlertDialog.Builder(getActivity()))
|
||||
.setTitle(android.R.string.dialog_alert_title)
|
||||
.setIcon(android.R.drawable.ic_dialog_alert)
|
||||
.setMessage(
|
||||
getActivity().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);
|
||||
mUseDefaultPref.setEnabled(mEnableDemo);
|
||||
mDefaultRatePref.setEnabled(mEnableDemo);
|
||||
mDefaultLocPref.setEnabled(mEnableDemo);
|
||||
|
||||
@@ -582,14 +540,18 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
|
||||
mDefaultLanguage = "";
|
||||
mDefaultCountry = "";
|
||||
mDefaultLocVariant = "";
|
||||
if (tokenizer.hasMoreTokens()) {
|
||||
mDefaultLanguage = tokenizer.nextToken().trim();
|
||||
}
|
||||
if (tokenizer.hasMoreTokens()) {
|
||||
mDefaultCountry = tokenizer.nextToken().trim();
|
||||
}
|
||||
if (tokenizer.hasMoreTokens()) {
|
||||
mDefaultLocVariant = tokenizer.nextToken().trim();
|
||||
|
||||
if (locale != null) {
|
||||
String[] components = locale.split(LOCALE_DELIMITER);
|
||||
if (components.length > 0) {
|
||||
mDefaultLanguage = components[0];
|
||||
}
|
||||
if (components.length > 1) {
|
||||
mDefaultCountry = components[1];
|
||||
}
|
||||
if (components.length > 2) {
|
||||
mDefaultLocVariant = components[2];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -683,26 +645,18 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
|
||||
|
||||
private void loadEngines() {
|
||||
List<EngineInfo> engines = mEnginesHelper.getEngines();
|
||||
updateUserEnabledEngines(engines);
|
||||
CharSequence entries[] = new CharSequence[engines.size()];
|
||||
CharSequence values[] = new CharSequence[engines.size()];
|
||||
|
||||
ArrayList<CharSequence> entries = new ArrayList<CharSequence>();
|
||||
ArrayList<CharSequence> values = new ArrayList<CharSequence>();
|
||||
StringBuilder enabledEngines = new StringBuilder();
|
||||
|
||||
for (EngineInfo engine : engines) {
|
||||
Log.v(TAG, "Engine: " + engine);
|
||||
if (mEnginesHelper.isEngineEnabled(engine.name)) {
|
||||
entries.add(engine.label);
|
||||
values.add(engine.name);
|
||||
}
|
||||
final int count = engines.size();
|
||||
for (int i = 0; i < count; ++i) {
|
||||
final EngineInfo engine = engines.get(i);
|
||||
entries[i] = engine.label;
|
||||
values[i] = engine.name;
|
||||
}
|
||||
|
||||
|
||||
CharSequence entriesArray[] = new CharSequence[entries.size()];
|
||||
CharSequence valuesArray[] = new CharSequence[values.size()];
|
||||
|
||||
mDefaultSynthPref.setEntries(entries.toArray(entriesArray));
|
||||
mDefaultSynthPref.setEntryValues(values.toArray(valuesArray));
|
||||
mDefaultSynthPref.setEntries(entries);
|
||||
mDefaultSynthPref.setEntryValues(values);
|
||||
|
||||
// Set the selected engine based on the saved preference
|
||||
String selectedEngine = Settings.Secure.getString(getContentResolver(), TTS_DEFAULT_SYNTH);
|
||||
@@ -716,26 +670,51 @@ public class TextToSpeechSettings extends SettingsPreferenceFragment implements
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Write out the list of engines enabled by the user to a
|
||||
* shared preference.
|
||||
*/
|
||||
private void updateUserEnabledEngines(List<EngineInfo> engines) {
|
||||
StringBuilder enginesList = new StringBuilder();
|
||||
for (EngineInfo engine : engines) {
|
||||
if (isEngineUserEnabled(engine.name)) {
|
||||
if (enginesList.length() > 0) enginesList.append(' ');
|
||||
enginesList.append(engine.name);
|
||||
private void displayDataAlert(Preference pref, final String key) {
|
||||
Log.v(TAG, "Displaying data alert for :" + key);
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||
builder.setTitle(android.R.string.dialog_alert_title);
|
||||
builder.setIcon(android.R.drawable.ic_dialog_alert);
|
||||
builder.setMessage(getActivity().getString(
|
||||
R.string.tts_engine_security_warning, pref.getTitle()));
|
||||
builder.setCancelable(true);
|
||||
builder.setPositiveButton(android.R.string.ok,
|
||||
new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
updateDefaultEngine(key);
|
||||
loadEngines();
|
||||
initEngineSpecificSettings();
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(android.R.string.cancel, null);
|
||||
|
||||
AlertDialog dialog = builder.create();
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
private void updateDefaultEngine(String engine) {
|
||||
Log.v(TAG, "Updating default synth to : " + engine);
|
||||
if (mTts != null) {
|
||||
try {
|
||||
mTts.shutdown();
|
||||
mTts = null;
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error shutting down TTS engine" + e);
|
||||
}
|
||||
}
|
||||
|
||||
ContentResolver resolver = getContentResolver();
|
||||
Settings.Secure.putString(resolver, TTS_ENABLED_PLUGINS, enginesList.toString());
|
||||
}
|
||||
mTts = new TextToSpeech(getActivity().getApplicationContext(), this, engine);
|
||||
mEnableDemo = false;
|
||||
mVoicesMissing = false;
|
||||
updateWidgetState();
|
||||
checkVoiceData();
|
||||
|
||||
private boolean isEngineUserEnabled(String engineName) {
|
||||
String enginePref = KEY_PLUGIN_ENABLED_PREFIX + engineName;
|
||||
return getPreferenceManager().getSharedPreferences().getBoolean(enginePref, false);
|
||||
// Finally, persist this value to settings.
|
||||
Settings.Secure.putString(getContentResolver(), TTS_DEFAULT_SYNTH, engine);
|
||||
// .. and update the UI.
|
||||
mDefaultSynthPref.setValue(engine);
|
||||
|
||||
Log.v(TAG, "The default synth is now: " + engine);
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user