package be.lukin.android.babble;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.MultiSelectListPreference;
import android.preference.PreferenceManager;
import android.speech.RecognitionService;
public class SettingsActivity extends SubActivity implements OnSharedPreferenceChangeListener {
private SettingsFragment mSettingsFragment;
private SharedPreferences mPrefs;
private String mKeyService;
private String mKeyLanguages;
// TODO: we support one service per package, this might
// be a limitation...
private final Map<String, String> mPkgToCls = new HashMap<String, String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSettingsFragment = new SettingsFragment();
mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
mKeyService = getString(R.string.keyService);
mKeyLanguages = getString(R.string.keyLanguages);
// Display the fragment as the main content.
getFragmentManager().beginTransaction().replace(android.R.id.content, mSettingsFragment).commit();
}
@Override
protected void onResume() {
super.onResume();
mPrefs.registerOnSharedPreferenceChangeListener(this);
populateServices();
}
@Override
protected void onPause() {
super.onPause();
mPrefs.unregisterOnSharedPreferenceChangeListener(this);
// Save the selected service class name, otherwise we cannot construct the
//recognizer.
String pkg = mPrefs.getString(getString(R.string.keyService), null);
SharedPreferences.Editor editor = mPrefs.edit();
editor.putString(getString(R.string.prefRecognizerServiceCls), mPkgToCls.get(pkg));
editor.commit();
}
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals(mKeyService)) {
ListPreference pref = (ListPreference) mSettingsFragment.findPreference(key);
pref.setSummary(pref.getEntry());
} else if (key.equals(mKeyLanguages)) {
// TODO: show the number of selected languages
// MultiSelectListPreference pref = (MultiSelectListPreference) mSettingsFragment.findPreference(key);
// pref.setSummary(pref.getEntryValues().length + " languages");
}
}
private void populateServices() {
PackageManager pm = getPackageManager();
List<ResolveInfo> services = pm.queryIntentServices(
new Intent(RecognitionService.SERVICE_INTERFACE), 0);
String selectedService = mPrefs.getString(mKeyService, null);
int selectedIndex = 0;
CharSequence[] entries = new CharSequence[services.size()];
CharSequence[] entryValues = new CharSequence[services.size()];
int index = 0;
for (ResolveInfo ri : services) {
ServiceInfo si = ri.serviceInfo;
if (si == null) {
Log.i("serviceInfo == null");
continue;
}
String pkg = si.packageName;
String cls = si.name;
CharSequence label = si.loadLabel(pm);
mPkgToCls.put(pkg, cls);
Log.i(pkg + " :: " + label + " :: " + mPkgToCls.get(pkg));
entries[index] = label;
entryValues[index] = pkg;
if (pkg.equals(selectedService)) {
selectedIndex = index;
}
index++;
}
ListPreference list = (ListPreference) mSettingsFragment.findPreference(mKeyService);
list.setEntries(entries);
list.setEntryValues(entryValues);
list.setValueIndex(selectedIndex);
list.setSummary(list.getEntry());
}
}