summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/voice/VoiceInputListPreference.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/voice/VoiceInputListPreference.java')
-rw-r--r--src/com/android/settings/voice/VoiceInputListPreference.java148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/com/android/settings/voice/VoiceInputListPreference.java b/src/com/android/settings/voice/VoiceInputListPreference.java
new file mode 100644
index 0000000..a131d21
--- /dev/null
+++ b/src/com/android/settings/voice/VoiceInputListPreference.java
@@ -0,0 +1,148 @@
+package com.android.settings.voice;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.provider.Settings;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ListAdapter;
+
+import com.android.settings.AppListPreferenceWithSettings;
+import com.android.settings.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class VoiceInputListPreference extends AppListPreferenceWithSettings {
+
+ private VoiceInputHelper mHelper;
+
+ // The assist component name to restrict available voice inputs.
+ private ComponentName mAssistRestrict;
+
+ private final List<Integer> mAvailableIndexes = new ArrayList<>();
+
+ public VoiceInputListPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setDialogTitle(R.string.choose_voice_input_title);
+ }
+
+ @Override
+ protected ListAdapter createListAdapter() {
+ return new CustomAdapter(getContext(), getEntries());
+ }
+
+ @Override
+ protected boolean persistString(String value) {
+ for (int i = 0; i < mHelper.mAvailableInteractionInfos.size(); ++i) {
+ VoiceInputHelper.InteractionInfo info = mHelper.mAvailableInteractionInfos.get(i);
+ if (info.key.equals(value)) {
+ Settings.Secure.putString(getContext().getContentResolver(),
+ Settings.Secure.VOICE_INTERACTION_SERVICE, value);
+ Settings.Secure.putString(getContext().getContentResolver(),
+ Settings.Secure.VOICE_RECOGNITION_SERVICE,
+ new ComponentName(info.service.packageName,
+ info.serviceInfo.getRecognitionService())
+ .flattenToShortString());
+ setSummary(getEntry());
+ setSettingsComponent(info.settings);
+ return true;
+ }
+ }
+
+ for (int i = 0; i < mHelper.mAvailableRecognizerInfos.size(); ++i) {
+ VoiceInputHelper.RecognizerInfo info = mHelper.mAvailableRecognizerInfos.get(i);
+ if (info.key.equals(value)) {
+ Settings.Secure.putString(getContext().getContentResolver(),
+ Settings.Secure.VOICE_INTERACTION_SERVICE, "");
+ Settings.Secure.putString(getContext().getContentResolver(),
+ Settings.Secure.VOICE_RECOGNITION_SERVICE, value);
+ setSummary(getEntry());
+ setSettingsComponent(info.settings);
+ return true;
+ }
+ }
+
+ setSettingsComponent(null);
+ return true;
+ }
+
+ @Override
+ public void setPackageNames(CharSequence[] packageNames, CharSequence defaultPackageName) {
+ // Skip since all entries are created from |mHelper|.
+ }
+
+ public void setAssistRestrict(ComponentName assistRestrict) {
+ mAssistRestrict = assistRestrict;
+ }
+
+ public void refreshVoiceInputs() {
+ mHelper = new VoiceInputHelper(getContext());
+ mHelper.buildUi();
+
+ final String assistKey =
+ mAssistRestrict == null ? "" : mAssistRestrict.flattenToShortString();
+
+ mAvailableIndexes.clear();
+ List<CharSequence> entries = new ArrayList<>();
+ List<CharSequence> values = new ArrayList<>();
+ for (int i = 0; i < mHelper.mAvailableInteractionInfos.size(); ++i) {
+ VoiceInputHelper.InteractionInfo info = mHelper.mAvailableInteractionInfos.get(i);
+ entries.add(info.appLabel);
+ values.add(info.key);
+
+ if (info.key.contentEquals(assistKey)) {
+ mAvailableIndexes.add(i);
+ }
+ }
+
+ final boolean assitIsService = !mAvailableIndexes.isEmpty();
+ final int serviceCount = entries.size();
+
+ for (int i = 0; i < mHelper.mAvailableRecognizerInfos.size(); ++i) {
+ VoiceInputHelper.RecognizerInfo info = mHelper.mAvailableRecognizerInfos.get(i);
+ entries.add(info.label);
+ values.add(info.key);
+ if (!assitIsService) {
+ mAvailableIndexes.add(serviceCount + i);
+ }
+ }
+ setEntries(entries.toArray(new CharSequence[entries.size()]));
+ setEntryValues(values.toArray(new CharSequence[values.size()]));
+
+ if (mHelper.mCurrentVoiceInteraction != null) {
+ setValue(mHelper.mCurrentVoiceInteraction.flattenToShortString());
+ } else if (mHelper.mCurrentRecognizer != null) {
+ setValue(mHelper.mCurrentRecognizer.flattenToShortString());
+ } else {
+ setValue(null);
+ }
+ }
+
+ private class CustomAdapter extends ArrayAdapter<CharSequence> {
+
+ public CustomAdapter(Context context, CharSequence[] objects) {
+ super(context, com.android.internal.R.layout.select_dialog_singlechoice_material,
+ android.R.id.text1, objects);
+ }
+
+ @Override
+ public boolean areAllItemsEnabled() {
+ return false;
+ }
+
+ @Override
+ public boolean isEnabled(int position) {
+ return mAvailableIndexes.contains(position);
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ View view = super.getView(position, convertView, parent);
+ view.setEnabled(isEnabled(position));
+ return view;
+ }
+ }
+}