Don't hide TTS settings if no recognizer is found.
bug:5412210 Change-Id: I6fdfda7f5f7bcd22acda2fd2b55e0d76f0fab1cd
This commit is contained in:
@@ -33,6 +33,7 @@ import android.preference.PreferenceScreen;
|
|||||||
import android.preference.Preference.OnPreferenceChangeListener;
|
import android.preference.Preference.OnPreferenceChangeListener;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.speech.RecognitionService;
|
import android.speech.RecognitionService;
|
||||||
|
import android.speech.tts.TtsEngines;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Xml;
|
import android.util.Xml;
|
||||||
@@ -54,43 +55,65 @@ public class VoiceInputOutputSettings implements OnPreferenceChangeListener {
|
|||||||
private static final String KEY_VOICE_CATEGORY = "voice_category";
|
private static final String KEY_VOICE_CATEGORY = "voice_category";
|
||||||
private static final String KEY_RECOGNIZER = "recognizer";
|
private static final String KEY_RECOGNIZER = "recognizer";
|
||||||
private static final String KEY_RECOGNIZER_SETTINGS = "recognizer_settings";
|
private static final String KEY_RECOGNIZER_SETTINGS = "recognizer_settings";
|
||||||
|
private static final String KEY_TTS_SETTINGS = "tts_settings";
|
||||||
|
|
||||||
private PreferenceGroup mParent;
|
private PreferenceGroup mParent;
|
||||||
private PreferenceCategory mVoiceCategory;
|
private PreferenceCategory mVoiceCategory;
|
||||||
private ListPreference mRecognizerPref;
|
private ListPreference mRecognizerPref;
|
||||||
|
private Preference mRecognizerSettingsPref;
|
||||||
|
private Preference mTtsSettingsPref;
|
||||||
private PreferenceScreen mSettingsPref;
|
private PreferenceScreen mSettingsPref;
|
||||||
private SettingsPreferenceFragment mFragment;
|
private final SettingsPreferenceFragment mFragment;
|
||||||
|
private final TtsEngines mTtsEngines;
|
||||||
|
|
||||||
private HashMap<String, ResolveInfo> mAvailableRecognizersMap;
|
private HashMap<String, ResolveInfo> mAvailableRecognizersMap;
|
||||||
|
|
||||||
public VoiceInputOutputSettings(SettingsPreferenceFragment fragment) {
|
public VoiceInputOutputSettings(SettingsPreferenceFragment fragment) {
|
||||||
mFragment = fragment;
|
mFragment = fragment;
|
||||||
|
mTtsEngines = new TtsEngines(fragment.getPreferenceScreen().getContext());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
|
|
||||||
mParent = (PreferenceGroup) mFragment.getPreferenceScreen();
|
mParent = mFragment.getPreferenceScreen();
|
||||||
mVoiceCategory = (PreferenceCategory) mParent.findPreference(KEY_VOICE_CATEGORY);
|
mVoiceCategory = (PreferenceCategory) mParent.findPreference(KEY_VOICE_CATEGORY);
|
||||||
mRecognizerPref = (ListPreference) mVoiceCategory.findPreference(KEY_RECOGNIZER);
|
mRecognizerPref = (ListPreference) mVoiceCategory.findPreference(KEY_RECOGNIZER);
|
||||||
|
mRecognizerSettingsPref = mVoiceCategory.findPreference(KEY_RECOGNIZER_SETTINGS);
|
||||||
|
mTtsSettingsPref = mVoiceCategory.findPreference(KEY_TTS_SETTINGS);
|
||||||
mRecognizerPref.setOnPreferenceChangeListener(this);
|
mRecognizerPref.setOnPreferenceChangeListener(this);
|
||||||
mSettingsPref = (PreferenceScreen)
|
mSettingsPref = (PreferenceScreen)
|
||||||
mVoiceCategory.findPreference(KEY_RECOGNIZER_SETTINGS);
|
mVoiceCategory.findPreference(KEY_RECOGNIZER_SETTINGS);
|
||||||
|
|
||||||
mAvailableRecognizersMap = new HashMap<String, ResolveInfo>();
|
mAvailableRecognizersMap = new HashMap<String, ResolveInfo>();
|
||||||
|
|
||||||
populateOrRemoveRecognizerPreference();
|
populateOrRemovePreferences();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void populateOrRemoveRecognizerPreference() {
|
private void populateOrRemovePreferences() {
|
||||||
|
boolean hasRecognizerPrefs = populateOrRemoveRecognizerPrefs();
|
||||||
|
boolean hasTtsPrefs = populateOrRemoveTtsPrefs();
|
||||||
|
if (!hasRecognizerPrefs && !hasTtsPrefs) {
|
||||||
|
// There were no TTS settings and no recognizer settings,
|
||||||
|
// so it should be safe to hide the preference category
|
||||||
|
// entirely.
|
||||||
|
mFragment.getPreferenceScreen().removePreference(mVoiceCategory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean populateOrRemoveRecognizerPrefs() {
|
||||||
List<ResolveInfo> availableRecognitionServices =
|
List<ResolveInfo> availableRecognitionServices =
|
||||||
mFragment.getPackageManager().queryIntentServices(
|
mFragment.getPackageManager().queryIntentServices(
|
||||||
new Intent(RecognitionService.SERVICE_INTERFACE), PackageManager.GET_META_DATA);
|
new Intent(RecognitionService.SERVICE_INTERFACE),
|
||||||
|
PackageManager.GET_META_DATA);
|
||||||
int numAvailable = availableRecognitionServices.size();
|
int numAvailable = availableRecognitionServices.size();
|
||||||
|
|
||||||
if (numAvailable == 0) {
|
if (numAvailable == 0) {
|
||||||
// No recognizer available - remove all related preferences.
|
mVoiceCategory.removePreference(mRecognizerPref);
|
||||||
mFragment.getPreferenceScreen().removePreference(mVoiceCategory);
|
mVoiceCategory.removePreference(mRecognizerSettingsPref);
|
||||||
} else if (numAvailable == 1) {
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (numAvailable == 1) {
|
||||||
// Only one recognizer available, so don't show the list of choices, but do
|
// Only one recognizer available, so don't show the list of choices, but do
|
||||||
// set up the link to settings for the available recognizer.
|
// set up the link to settings for the available recognizer.
|
||||||
mVoiceCategory.removePreference(mRecognizerPref);
|
mVoiceCategory.removePreference(mRecognizerPref);
|
||||||
@@ -98,11 +121,11 @@ public class VoiceInputOutputSettings implements OnPreferenceChangeListener {
|
|||||||
// But first set up the available recognizers map with just the one recognizer.
|
// But first set up the available recognizers map with just the one recognizer.
|
||||||
ResolveInfo resolveInfo = availableRecognitionServices.get(0);
|
ResolveInfo resolveInfo = availableRecognitionServices.get(0);
|
||||||
String recognizerComponent =
|
String recognizerComponent =
|
||||||
new ComponentName(resolveInfo.serviceInfo.packageName,
|
new ComponentName(resolveInfo.serviceInfo.packageName,
|
||||||
resolveInfo.serviceInfo.name).flattenToShortString();
|
resolveInfo.serviceInfo.name).flattenToShortString();
|
||||||
|
|
||||||
mAvailableRecognizersMap.put(recognizerComponent, resolveInfo);
|
mAvailableRecognizersMap.put(recognizerComponent, resolveInfo);
|
||||||
|
|
||||||
String currentSetting = Settings.Secure.getString(
|
String currentSetting = Settings.Secure.getString(
|
||||||
mFragment.getContentResolver(), Settings.Secure.VOICE_RECOGNITION_SERVICE);
|
mFragment.getContentResolver(), Settings.Secure.VOICE_RECOGNITION_SERVICE);
|
||||||
updateSettingsLink(currentSetting);
|
updateSettingsLink(currentSetting);
|
||||||
@@ -110,6 +133,19 @@ public class VoiceInputOutputSettings implements OnPreferenceChangeListener {
|
|||||||
// Multiple recognizers available, so show the full list of choices.
|
// Multiple recognizers available, so show the full list of choices.
|
||||||
populateRecognizerPreference(availableRecognitionServices);
|
populateRecognizerPreference(availableRecognitionServices);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// In this case, there was at least one available recognizer so
|
||||||
|
// we populated the settings.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean populateOrRemoveTtsPrefs() {
|
||||||
|
if (mTtsEngines.getEngines().isEmpty()) {
|
||||||
|
mVoiceCategory.removePreference(mTtsSettingsPref);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void populateRecognizerPreference(List<ResolveInfo> recognizers) {
|
private void populateRecognizerPreference(List<ResolveInfo> recognizers) {
|
||||||
|
Reference in New Issue
Block a user