Improve Wi-Fi wiring

Bug: 16552606
Change-Id: Iddbde3d18e92ad1d40fb539d9177df582f317a7b
diff --git a/src/com/android/telecomm/PhoneAccountPreferencesActivity.java b/src/com/android/telecomm/PhoneAccountPreferencesActivity.java
index e4c62e7..2430f26 100644
--- a/src/com/android/telecomm/PhoneAccountPreferencesActivity.java
+++ b/src/com/android/telecomm/PhoneAccountPreferencesActivity.java
@@ -18,19 +18,17 @@
 
 import android.app.Activity;
 import android.os.Bundle;
-import android.preference.ListPreference;
-import android.preference.Preference;
 import android.preference.PreferenceFragment;
+import android.telecomm.PhoneAccount;
 import android.telecomm.PhoneAccountHandle;
 
-import java.util.HashMap;
+import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
-import java.util.Objects;
 
 public class PhoneAccountPreferencesActivity extends Activity {
 
     private static final String KEY_DEFAULT_OUTGOING_ACCOUNT = "default_outgoing_account";
+    private static final String KEY_SIM_CALL_MANAGER_ACCOUNT = "sim_call_manager_account";
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -39,54 +37,63 @@
     }
 
     public static class PreferencesFragment extends PreferenceFragment
-            implements ListPreference.OnPreferenceChangeListener {
-        private ListPreference mDefaultOutgoingAccount;
-        private PhoneAccountRegistrar mRegistrar;
-        private Map<String, PhoneAccountHandle> mAccountByValue = new HashMap<>();
+            implements AccountSelectionPreference.AccountSelectionListener {
+        private AccountSelectionPreference mDefaultOutgoingAccount;
+        private AccountSelectionPreference mSimCallManagerAccount;
 
         @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
 
             addPreferencesFromResource(R.xml.phone_account_preferences);
-            mDefaultOutgoingAccount = (ListPreference) findPreference(KEY_DEFAULT_OUTGOING_ACCOUNT);
 
-            mRegistrar = TelecommApp.getInstance().getPhoneAccountRegistrar();
-            List<PhoneAccountHandle> accountHandles = mRegistrar.getEnabledPhoneAccounts();
-            PhoneAccountHandle currentDefault = mRegistrar.getDefaultOutgoingPhoneAccount();
+            mDefaultOutgoingAccount = (AccountSelectionPreference)
+                    findPreference(KEY_DEFAULT_OUTGOING_ACCOUNT);
+            mSimCallManagerAccount = (AccountSelectionPreference)
+                    findPreference(KEY_SIM_CALL_MANAGER_ACCOUNT);
 
-            String[] entryValues = new String[accountHandles.size() + 1];
-            String[] entries = new String[accountHandles.size() + 1];
+            PhoneAccountRegistrar registrar = TelecommApp.getInstance().getPhoneAccountRegistrar();
 
-            int selectedIndex = accountHandles.size();  // Points to "ask every time" by default
-            int i = 0;
-            for ( ; i < accountHandles.size(); i++) {
-                CharSequence label = mRegistrar.getPhoneAccount(accountHandles.get(i))
-                        .getLabel();
-                entries[i] = label == null ? null : label.toString();
-                entryValues[i] = Integer.toString(i);
-                if (Objects.equals(currentDefault, accountHandles.get(i))) {
-                    selectedIndex = i;
-                }
-                mAccountByValue.put(entryValues[i], accountHandles.get(i));
-            }
-            entryValues[i] = Integer.toString(i);
-            entries[i] = getString(R.string.account_ask_every_time);
-            mAccountByValue.put(entryValues[i], null);
+            mDefaultOutgoingAccount.setModel(
+                    registrar,
+                    registrar.getEnabledPhoneAccounts(),
+                    registrar.getDefaultOutgoingPhoneAccount(),
+                    getString(R.string.account_ask_every_time));
 
-            mDefaultOutgoingAccount.setEntryValues(entryValues);
-            mDefaultOutgoingAccount.setEntries(entries);
-            mDefaultOutgoingAccount.setValueIndex(selectedIndex);
-            mDefaultOutgoingAccount.setOnPreferenceChangeListener(this);
+            mSimCallManagerAccount.setModel(
+                    registrar,
+                    getSimCallManagers(registrar),
+                    registrar.getSimCallManager(),
+                    getString(R.string.do_not_use_sim_call_manager));
+
+            mDefaultOutgoingAccount.setListener(this);
+            mSimCallManagerAccount.setListener(this);
         }
 
         @Override
-        public boolean onPreferenceChange(Preference p, Object o) {
+        public boolean onAccountSelected(
+                AccountSelectionPreference p, PhoneAccountHandle account) {
+            PhoneAccountRegistrar registrar = TelecommApp.getInstance().getPhoneAccountRegistrar();
             if (p == mDefaultOutgoingAccount) {
-                mRegistrar.setDefaultOutgoingPhoneAccount(mAccountByValue.get(o));
+                registrar.setDefaultOutgoingPhoneAccount(account);
+                return true;
+            } else if (p == mSimCallManagerAccount) {
+                registrar.setSimCallManager(account);
                 return true;
             }
             return false;
         }
+
+        private List<PhoneAccountHandle> getSimCallManagers(PhoneAccountRegistrar registrar) {
+            List<PhoneAccountHandle> simCallManagers = new ArrayList<>();
+            List<PhoneAccountHandle> allAccounts = registrar.getAllPhoneAccountHandles();
+            for (int i = 0; i < allAccounts.size(); i++) {
+                PhoneAccount account = registrar.getPhoneAccount(allAccounts.get(i));
+                if ((account.getCapabilities() & PhoneAccount.CAPABILITY_SIM_CALL_MANAGER) != 0) {
+                    simCallManagers.add(allAccounts.get(i));
+                }
+            }
+            return simCallManagers;
+        }
     }
 }