Make TTS language setting track system language.
TTS engine default locale is set independently from the system locale. If TTS engine default locale is not set, it defaults to the system locale. If user decides to set TTS locale, ability to default to the current system locale is lost (until device is wiped). This change makes settings wipe the TTS engine default locale value if user selects language that is system language. This allows TTS to track system language if user changes it. If system language is not available in TTS, language field is set to "language not selected" value. This change require a small change in framework/base to make previously private method public (TtsEngines.getDefaultLocale). + Selected language is displayed in language preference summary (matches all other language preferences) + Removing and then adding "language" and 'install languages' preferences looks glitchy, not they are disabled (grayed out) if unavailable. Bug: 8613986 Change-Id: Ic4bde97ef7406adb64cc03efbe660275360ba3af
This commit is contained in:
committed by
Android (Google) Code Review
parent
52d8db7fb2
commit
6dcdfab906
@@ -3437,8 +3437,11 @@
|
|||||||
<string name="tts_default_pitch_title">Pitch</string>
|
<string name="tts_default_pitch_title">Pitch</string>
|
||||||
<!-- On main TTS Settings screen, summary for default pitch for synthesized voice -->
|
<!-- On main TTS Settings screen, summary for default pitch for synthesized voice -->
|
||||||
<string name="tts_default_pitch_summary">Affects the tone of the spoken text</string>
|
<string name="tts_default_pitch_summary">Affects the tone of the spoken text</string>
|
||||||
|
|
||||||
<!-- On main TTS Settings screen, in default settings section, setting default language for synthesized voice -->
|
<!-- On main TTS Settings screen, in default settings section, setting default language for synthesized voice -->
|
||||||
<string name="tts_default_lang_title">Language</string>
|
<string name="tts_default_lang_title">Language</string>
|
||||||
|
<!-- On main TTS Settings screen, language summary if it can't default to system language [CHAR LIMIT=50] -->
|
||||||
|
<string name="tts_lang_not_selected">Language not selected</string>
|
||||||
<!-- On main TTS Settings screen, summary for default language for synthesized voice -->
|
<!-- On main TTS Settings screen, summary for default language for synthesized voice -->
|
||||||
<string name="tts_default_lang_summary">Sets the language-specific voice for the spoken text</string>
|
<string name="tts_default_lang_summary">Sets the language-specific voice for the spoken text</string>
|
||||||
<!-- On main TTS Settings screen, triggers playback of an example of speech synthesis -->
|
<!-- On main TTS Settings screen, triggers playback of an example of speech synthesis -->
|
||||||
|
@@ -22,6 +22,7 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.preference.CheckBoxPreference;
|
||||||
import android.preference.ListPreference;
|
import android.preference.ListPreference;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.Preference.OnPreferenceChangeListener;
|
import android.preference.Preference.OnPreferenceChangeListener;
|
||||||
@@ -62,6 +63,9 @@ public class TtsEngineSettingsFragment extends SettingsPreferenceFragment implem
|
|||||||
|
|
||||||
private TextToSpeech mTts;
|
private TextToSpeech mTts;
|
||||||
|
|
||||||
|
private int mSelectedLocaleIndex = -1;
|
||||||
|
private int mSystemLocaleIndex = -1;
|
||||||
|
|
||||||
private final TextToSpeech.OnInitListener mTtsInitListener = new TextToSpeech.OnInitListener() {
|
private final TextToSpeech.OnInitListener mTtsInitListener = new TextToSpeech.OnInitListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onInit(int status) {
|
public void onInit(int status) {
|
||||||
@@ -105,10 +109,6 @@ public class TtsEngineSettingsFragment extends SettingsPreferenceFragment implem
|
|||||||
mEngineSettingsPreference.setOnPreferenceClickListener(this);
|
mEngineSettingsPreference.setOnPreferenceClickListener(this);
|
||||||
mInstallVoicesPreference = root.findPreference(KEY_INSTALL_DATA);
|
mInstallVoicesPreference = root.findPreference(KEY_INSTALL_DATA);
|
||||||
mInstallVoicesPreference.setOnPreferenceClickListener(this);
|
mInstallVoicesPreference.setOnPreferenceClickListener(this);
|
||||||
// Remove this preference unless voices are indeed available to install.
|
|
||||||
root.removePreference(mInstallVoicesPreference);
|
|
||||||
// Remove this preference unless locales are indeed available.
|
|
||||||
root.removePreference(mLocalePreference);
|
|
||||||
|
|
||||||
root.setTitle(getEngineLabel());
|
root.setTitle(getEngineLabel());
|
||||||
root.setKey(getEngineName());
|
root.setKey(getEngineName());
|
||||||
@@ -120,8 +120,8 @@ public class TtsEngineSettingsFragment extends SettingsPreferenceFragment implem
|
|||||||
mEngineSettingsPreference.setEnabled(false);
|
mEngineSettingsPreference.setEnabled(false);
|
||||||
}
|
}
|
||||||
mInstallVoicesPreference.setEnabled(false);
|
mInstallVoicesPreference.setEnabled(false);
|
||||||
|
|
||||||
mLocalePreference.setEnabled(false);
|
mLocalePreference.setEnabled(false);
|
||||||
|
|
||||||
mLocalePreference.setEntries(new CharSequence[0]);
|
mLocalePreference.setEntries(new CharSequence[0]);
|
||||||
mLocalePreference.setEntryValues(new CharSequence[0]);
|
mLocalePreference.setEntryValues(new CharSequence[0]);
|
||||||
|
|
||||||
@@ -130,7 +130,6 @@ public class TtsEngineSettingsFragment extends SettingsPreferenceFragment implem
|
|||||||
mTts = new TextToSpeech(getActivity().getApplicationContext(), mTtsInitListener,
|
mTts = new TextToSpeech(getActivity().getApplicationContext(), mTtsInitListener,
|
||||||
getEngineName());
|
getEngineName());
|
||||||
|
|
||||||
|
|
||||||
// Check if data packs changed
|
// Check if data packs changed
|
||||||
checkTtsData();
|
checkTtsData();
|
||||||
|
|
||||||
@@ -172,31 +171,26 @@ public class TtsEngineSettingsFragment extends SettingsPreferenceFragment implem
|
|||||||
final ArrayList<String> unavailable = mVoiceDataDetails.getStringArrayListExtra(
|
final ArrayList<String> unavailable = mVoiceDataDetails.getStringArrayListExtra(
|
||||||
TextToSpeech.Engine.EXTRA_UNAVAILABLE_VOICES);
|
TextToSpeech.Engine.EXTRA_UNAVAILABLE_VOICES);
|
||||||
|
|
||||||
|
if (unavailable != null && unavailable.size() > 0) {
|
||||||
|
mInstallVoicesPreference.setEnabled(true);
|
||||||
|
} else {
|
||||||
|
mInstallVoicesPreference.setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
if (available == null){
|
if (available == null){
|
||||||
Log.e(TAG, "TTS data check failed (available == null).");
|
Log.e(TAG, "TTS data check failed (available == null).");
|
||||||
mLocalePreference.setEnabled(false);
|
mLocalePreference.setEnabled(false);
|
||||||
getPreferenceScreen().removePreference(mLocalePreference);
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
if (unavailable != null && unavailable.size() > 0) {
|
|
||||||
mInstallVoicesPreference.setEnabled(true);
|
|
||||||
getPreferenceScreen().addPreference(mInstallVoicesPreference);
|
|
||||||
} else {
|
} else {
|
||||||
getPreferenceScreen().removePreference(mInstallVoicesPreference);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (available.size() > 0) {
|
|
||||||
mLocalePreference.setEnabled(true);
|
|
||||||
getPreferenceScreen().addPreference(mLocalePreference);
|
|
||||||
updateDefaultLocalePref(available);
|
updateDefaultLocalePref(available);
|
||||||
} else {
|
|
||||||
mLocalePreference.setEnabled(false);
|
|
||||||
getPreferenceScreen().removePreference(mLocalePreference);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateDefaultLocalePref(ArrayList<String> availableLangs) {
|
private void updateDefaultLocalePref(ArrayList<String> availableLangs) {
|
||||||
|
if (availableLangs == null || availableLangs.size() == 0) {
|
||||||
|
mLocalePreference.setEnabled(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
String currentLocale = mEnginesHelper.getLocalePrefForEngine(
|
String currentLocale = mEnginesHelper.getLocalePrefForEngine(
|
||||||
getEngineName());
|
getEngineName());
|
||||||
|
|
||||||
@@ -227,14 +221,20 @@ public class TtsEngineSettingsFragment extends SettingsPreferenceFragment implem
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
String defaultLocaleStr = mEnginesHelper.getDefaultLocale();
|
||||||
|
|
||||||
// Get two arrays out of one of pairs
|
// Get two arrays out of one of pairs
|
||||||
int selectedLanguageIndex = -1;
|
mSelectedLocaleIndex = -1;
|
||||||
|
mSystemLocaleIndex = -1;
|
||||||
CharSequence[] entries = new CharSequence[availableLangs.size()];
|
CharSequence[] entries = new CharSequence[availableLangs.size()];
|
||||||
CharSequence[] entryValues = new CharSequence[availableLangs.size()];
|
CharSequence[] entryValues = new CharSequence[availableLangs.size()];
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (Pair<String, String> entry : entryPairs) {
|
for (Pair<String, String> entry : entryPairs) {
|
||||||
if (entry.second.equalsIgnoreCase(currentLocale)) {
|
if (entry.second.equalsIgnoreCase(currentLocale)) {
|
||||||
selectedLanguageIndex = i;
|
mSelectedLocaleIndex = i;
|
||||||
|
}
|
||||||
|
if (entry.second.equalsIgnoreCase(defaultLocaleStr)) {
|
||||||
|
mSystemLocaleIndex = i;
|
||||||
}
|
}
|
||||||
entries[i] = entry.first;
|
entries[i] = entry.first;
|
||||||
entryValues[i++] = entry.second;
|
entryValues[i++] = entry.second;
|
||||||
@@ -242,11 +242,18 @@ public class TtsEngineSettingsFragment extends SettingsPreferenceFragment implem
|
|||||||
|
|
||||||
mLocalePreference.setEntries(entries);
|
mLocalePreference.setEntries(entries);
|
||||||
mLocalePreference.setEntryValues(entryValues);
|
mLocalePreference.setEntryValues(entryValues);
|
||||||
if (selectedLanguageIndex > -1) {
|
mLocalePreference.setEnabled(true);
|
||||||
mLocalePreference.setValueIndex(selectedLanguageIndex);
|
setLocalePreference(mSelectedLocaleIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Set entry from entry table in mLocalePreference */
|
||||||
|
private void setLocalePreference(int index) {
|
||||||
|
if (index < 0) {
|
||||||
|
mLocalePreference.setValue("");
|
||||||
|
mLocalePreference.setSummary(R.string.tts_lang_not_selected);
|
||||||
} else {
|
} else {
|
||||||
mLocalePreference.setValueIndex(0);
|
mLocalePreference.setValueIndex(index);
|
||||||
updateLanguageTo(availableLangs.get(0));
|
mLocalePreference.setSummary(mLocalePreference.getEntries()[index]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -286,12 +293,32 @@ public class TtsEngineSettingsFragment extends SettingsPreferenceFragment implem
|
|||||||
updateLanguageTo((String) newValue);
|
updateLanguageTo((String) newValue);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateLanguageTo(String locale) {
|
private void updateLanguageTo(String locale) {
|
||||||
|
int selectedLocaleIndex = -1;
|
||||||
|
for (int i=0; i < mLocalePreference.getEntryValues().length; i++) {
|
||||||
|
if (locale.equalsIgnoreCase(mLocalePreference.getEntryValues()[i].toString())) {
|
||||||
|
selectedLocaleIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selectedLocaleIndex == -1) {
|
||||||
|
Log.w(TAG, "updateLanguageTo called with unknown locale argument");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mLocalePreference.setSummary(mLocalePreference.getEntries()[selectedLocaleIndex]);
|
||||||
|
mSelectedLocaleIndex = selectedLocaleIndex;
|
||||||
|
|
||||||
|
if (mSelectedLocaleIndex == mSystemLocaleIndex) {
|
||||||
|
// Use empty locale, it will default to the system language
|
||||||
|
mEnginesHelper.updateLocalePrefForEngine(getEngineName(), "");
|
||||||
|
} else {
|
||||||
mEnginesHelper.updateLocalePrefForEngine(getEngineName(), locale);
|
mEnginesHelper.updateLocalePrefForEngine(getEngineName(), locale);
|
||||||
|
}
|
||||||
|
|
||||||
if (getEngineName().equals(mTts.getCurrentEngine())) {
|
if (getEngineName().equals(mTts.getCurrentEngine())) {
|
||||||
String[] localeArray = TtsEngines.parseLocalePref(locale);
|
String[] localeArray = TtsEngines.parseLocalePref(locale);
|
||||||
if (localeArray != null) {
|
if (localeArray != null) {
|
||||||
@@ -307,5 +334,4 @@ public class TtsEngineSettingsFragment extends SettingsPreferenceFragment implem
|
|||||||
private String getEngineLabel() {
|
private String getEngineLabel() {
|
||||||
return getArguments().getString(TtsEnginePreference.FRAGMENT_ARGS_LABEL);
|
return getArguments().getString(TtsEnginePreference.FRAGMENT_ARGS_LABEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user