blob: ddb56d1f7929af008a5f59e6df8eac0d70e3781d [file] [log] [blame]
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;
}
}
}