package ee.ioc.phon.android.speak.activity; import android.app.Activity; import android.app.ListFragment; import android.content.SharedPreferences; import android.content.res.Resources; import android.os.Bundle; import android.preference.PreferenceManager; import android.widget.ListAdapter; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import ee.ioc.phon.android.speak.R; import ee.ioc.phon.android.speak.adapter.ComboAdapter; import ee.ioc.phon.android.speak.model.Combo; import ee.ioc.phon.android.speak.utils.Utils; import ee.ioc.phon.android.speechutils.RecognitionServiceManager; import ee.ioc.phon.android.speechutils.utils.PreferenceUtils; public class ComboSelectorActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ComboSelectorFragment fragment = new ComboSelectorFragment(); fragment.setArguments(getIntent().getExtras()); getFragmentManager().beginTransaction().add(android.R.id.content, fragment).commit(); } public static class ComboSelectorFragment extends ListFragment { int mKey = R.string.keyImeCombo; int mDefaultCombos = R.array.defaultImeCombos; int mDefaultCombosExcluded = R.array.defaultImeCombosExcluded; public void onCreate(Bundle icicle) { super.onCreate(icicle); Bundle args = getArguments(); if (args != null && getString(R.string.keyCombo).equals(args.getString("key"))) { mKey = R.string.keyCombo; mDefaultCombos = R.array.defaultCombos; mDefaultCombosExcluded = R.array.defaultCombosExcluded; } initModel(); } public void onPause() { super.onPause(); ListAdapter listAdapter = getListAdapter(); if (listAdapter != null && listAdapter instanceof ComboAdapter) { Set<String> selected = new HashSet<>(); List<Combo> selectedCombos = new ArrayList<>(); ComboAdapter comboAdapter = (ComboAdapter) listAdapter; for (int i = 0; i < comboAdapter.getCount(); i++) { Combo combo = comboAdapter.getItem(i); if (combo != null && combo.isSelected()) { selected.add(combo.getId()); selectedCombos.add(combo); } } PreferenceUtils.putPrefStringSet(PreferenceManager.getDefaultSharedPreferences(getActivity()), getResources(), mKey, selected); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N_MR1) { // The app shortcuts correspond to the voice panel combo settings if (mKey == R.string.keyCombo) { Utils.publishShortcuts(getActivity().getApplicationContext(), selectedCombos, PreferenceUtils.getPrefStringSet( PreferenceManager.getDefaultSharedPreferences(getActivity()), getResources(), R.string.defaultRewriteTables)); } } } } private void initModel() { Resources res = getResources(); SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); Set<String> combos = PreferenceUtils.getPrefStringSet(mPrefs, res, mKey); if (combos == null) { combos = PreferenceUtils.getStringSetFromStringArray(res, mDefaultCombos); } RecognitionServiceManager mngr = new RecognitionServiceManager(); mngr.setInitiallySelectedCombos(combos); mngr.setCombosExcluded(PreferenceUtils.getStringSetFromStringArray(res, mDefaultCombosExcluded)); mngr.populateCombos(getActivity(), new RecognitionServiceManager.Listener() { @Override public void onComplete(List<String> combos, Set<String> selectedCombos) { List<Combo> list = new ArrayList<>(); for (String comboAsString : combos) { Combo combo = get(comboAsString); if (selectedCombos.contains(comboAsString)) { combo.setSelected(true); } list.add(combo); } Collections.sort(list, Combo.SORT_BY_SELECTED_BY_LANGUAGE); ComboAdapter adapter = new ComboAdapter(ComboSelectorFragment.this, list); setListAdapter(adapter); // TODO: the fast scroll handle overlaps with the checkboxes //getListView().setFastScrollEnabled(true); // TODO: provide more info about the number of (selected) services and languages //getActivity().getActionBar().setSubtitle("" + adapter.getCount()); } }); } private Combo get(String id) { return new Combo(getActivity(), id); } } }