Update default account preference settings dialog
Make it look like the other account picker dialogs in the app.
Test: Manual usage of default account selector in settings menu.
Tested swapping between three accounts with going back to the main
view to see if the settings stick.
Tested making a new contact would save to the proper default.
Bug: 29282755
Change-Id: Ib09d9bbe3e2cf29413e012b3aeb3218eb0782753
diff --git a/src/com/android/contacts/common/preference/DefaultAccountPreference.java b/src/com/android/contacts/common/preference/DefaultAccountPreference.java
index 2fc5c7b..bcde371 100644
--- a/src/com/android/contacts/common/preference/DefaultAccountPreference.java
+++ b/src/com/android/contacts/common/preference/DefaultAccountPreference.java
@@ -18,23 +18,22 @@
import android.app.AlertDialog;
import android.content.Context;
+import android.content.DialogInterface;
import android.preference.ListPreference;
import android.util.AttributeSet;
import android.view.View;
-import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.account.AccountType;
-import com.android.contacts.common.model.account.AccountTypeWithDataSet;
import com.android.contacts.common.model.account.AccountWithDataSet;
+import com.android.contacts.common.util.AccountsListAdapter;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
-import java.util.Set;
public class DefaultAccountPreference extends ListPreference {
private ContactsPreferences mPreferences;
private Map<String, AccountWithDataSet> mAccountMap;
+ private int mClickedDialogEntryIndex;
+ private AccountsListAdapter mListAdapter;
public DefaultAccountPreference(Context context) {
super(context);
@@ -55,19 +54,20 @@
private void prepare() {
mPreferences = new ContactsPreferences(getContext());
mAccountMap = new HashMap<>();
- final AccountTypeManager accountTypeManager = AccountTypeManager.getInstance(getContext());
- List<AccountWithDataSet> accounts = accountTypeManager.getAccounts(true);
- for (AccountWithDataSet account : accounts) {
+ mListAdapter = new AccountsListAdapter(getContext(),
+ AccountsListAdapter.AccountListFilter.ACCOUNTS_CONTACT_WRITABLE);
+ final String[] accountNamesArray = new String[mListAdapter.getCount()];
+ for (int i = 0; i < mListAdapter.getCount(); i++) {
+ final AccountWithDataSet account = mListAdapter.getItem(i);
mAccountMap.put(account.name, account);
+ accountNamesArray[i] = account.name;
}
- final Set<String> accountNames = mAccountMap.keySet();
- final String[] accountNamesArray = accountNames.toArray(new String[accountNames.size()]);
setEntries(accountNamesArray);
setEntryValues(accountNamesArray);
final String defaultAccount = String.valueOf(mPreferences.getDefaultAccount());
- if (accounts.size() == 1) {
- setValue(accounts.get(0).name);
- } else if (accountNames.contains(defaultAccount)) {
+ if (mListAdapter.getCount() == 1) {
+ setValue(mListAdapter.getItem(0).name);
+ } else if (mAccountMap.keySet().contains(defaultAccount)) {
setValue(defaultAccount);
} else {
setValue(null);
@@ -98,9 +98,32 @@
}
@Override
- // UX recommendation is not to show cancel button on such lists.
protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
super.onPrepareDialogBuilder(builder);
+ // UX recommendation is not to show cancel button on such lists.
builder.setNegativeButton(null, null);
+ // Override and do everything ListPreference does except relative to our custom adapter.
+ // onDialogClosed needs to be overridden as well since mClickedDialogEntryIndex is private
+ // in ListPreference.
+ builder.setAdapter(mListAdapter, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ mClickedDialogEntryIndex = which;
+ // Clicking on an item simulates the positive button click,
+ // and dismisses the dialog.
+ DefaultAccountPreference.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE);
+ dialog.dismiss();
+ }
+ });
+ }
+
+ @Override
+ protected void onDialogClosed(boolean positiveResult) {
+ if (positiveResult && mClickedDialogEntryIndex >= 0 && getEntryValues() != null) {
+ final String value = getEntryValues()[mClickedDialogEntryIndex].toString();
+ if (callChangeListener(value)) {
+ setValue(value);
+ }
+ }
}
}