159 lines
5.7 KiB
Java
159 lines
5.7 KiB
Java
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);
|
|
}
|
|
}
|
|
|
|
public ComponentName getCurrentService() {
|
|
if (mHelper.mCurrentVoiceInteraction != null) {
|
|
return mHelper.mCurrentVoiceInteraction;
|
|
} else if (mHelper.mCurrentRecognizer != null) {
|
|
return mHelper.mCurrentRecognizer;
|
|
} else {
|
|
return 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;
|
|
}
|
|
}
|
|
}
|