Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ee3d3a50 authored by Marcus Hagerott's avatar Marcus Hagerott
Browse files

Add setter for accounts in AccountsListAdapter

This allows the accounts to be set after the adapter has been created
which simplifies usage in cases where the accounts are loaded with a
loader.

Test: manually verify that account list is correct for default account
preference, import from .vcf and create label.

Bug 33627801

Change-Id: I5a33ad2746cff41d0251cead9a33dc53e5bf822d
parent 9674eee8
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -70,7 +70,6 @@ import com.android.contacts.model.account.AccountDisplayInfoFactory;
import com.android.contacts.model.account.AccountWithDataSet;
import com.android.contacts.preference.ContactsPreferenceActivity;
import com.android.contacts.util.AccountFilterUtil;
import com.android.contacts.util.AccountsListAdapter.AccountListFilter;
import com.android.contacts.util.ImplicitIntentsUtil;
import com.android.contacts.util.MaterialColorMapUtils;
import com.android.contacts.util.SharedPreferenceUtil;
@@ -693,7 +692,7 @@ public abstract class ContactsDrawerActivity extends AppCompatContactsActivity i
            return;
        }
        SelectAccountDialogFragment.show(getFragmentManager(), R.string.dialog_new_group_account,
                AccountListFilter.ACCOUNTS_GROUP_WRITABLE, /* extraArgs */ null,
                AccountTypeManager.AccountFilter.GROUPS_WRITABLE, /* extraArgs */ null,
                TAG_SELECT_ACCOUNT_DIALOG);
    }

+1 −3
Original line number Diff line number Diff line
@@ -37,7 +37,6 @@ import com.android.contacts.model.account.AccountInfo;
import com.android.contacts.model.account.AccountWithDataSet;
import com.android.contacts.model.account.AccountsLoader;
import com.android.contacts.util.AccountsListAdapter;
import com.android.contacts.util.AccountsListAdapter.AccountListFilter;
import com.android.contacts.util.ImplicitIntentsUtil;

import java.util.List;
@@ -142,8 +141,7 @@ public class ContactEditorAccountsChangedActivity extends Activity
            button.setOnClickListener(mAddAccountClickListener);

            final ListView accountListView = (ListView) view.findViewById(R.id.account_list);
            mAccountListAdapter = new AccountsListAdapter(this,
                    AccountListFilter.ACCOUNTS_CONTACT_WRITABLE);
            mAccountListAdapter = new AccountsListAdapter(this, accounts);
            accountListView.setAdapter(mAccountListAdapter);
            accountListView.setOnItemClickListener(mAccountListItemClickListener);
        } else if (numAccounts == 1 && !accounts.get(0).getAccount().isNullAccount()) {
+42 −13
Original line number Diff line number Diff line
@@ -27,58 +27,74 @@ import android.view.View;
import android.widget.TextView;

import com.android.contacts.R;
import com.android.contacts.model.AccountTypeManager;
import com.android.contacts.model.account.AccountInfo;
import com.android.contacts.model.account.AccountWithDataSet;
import com.android.contacts.model.account.AccountsLoader;
import com.android.contacts.util.AccountsListAdapter;
import com.android.contacts.util.AccountsListAdapter.AccountListFilter;
import com.google.common.base.Preconditions;

import java.util.List;

/**
 * Shows a dialog asking the user which account to chose.
 *
 * The result is passed to {@code targetFragment} passed to {@link #show}.
 */
public final class SelectAccountDialogFragment extends DialogFragment {
public final class SelectAccountDialogFragment extends DialogFragment
        implements AccountsLoader.AccountsListener {
    public static final String TAG = "SelectAccountDialogFragment";

    private static final String KEY_TITLE_RES_ID = "title_res_id";
    private static final String KEY_LIST_FILTER = "list_filter";
    private static final String KEY_EXTRA_ARGS = "extra_args";

    private AccountsListAdapter mAccountsAdapter;
    private AccountTypeManager.AccountFilter mFilter;

    /**
     * Show the dialog.
     *
     * @param fragmentManager {@link FragmentManager}.
     * @param titleResourceId resource ID to use as the title.
     * @param accountListFilter account filter.
     * @param extraArgs Extra arguments, which will later be passed to
     *     {@link Listener#onAccountChosen}.  {@code null} will be converted to
     *     {@link Bundle#EMPTY}.
     */
    public static void show(FragmentManager fragmentManager, int titleResourceId,
            AccountListFilter accountListFilter, Bundle extraArgs) {
        show(fragmentManager, titleResourceId, accountListFilter, extraArgs, /* tag */ null);
            AccountTypeManager.AccountFilter filter, Bundle extraArgs) {
        show(fragmentManager, titleResourceId, filter, extraArgs, /* tag */ null);
    }

    public static void show(FragmentManager fragmentManager, int titleResourceId,
            AccountListFilter accountListFilter, Bundle extraArgs, String tag) {
            AccountTypeManager.AccountFilter filter, Bundle extraArgs, String tag) {
        final Bundle args = new Bundle();
        args.putInt(KEY_TITLE_RES_ID, titleResourceId);
        args.putSerializable(KEY_LIST_FILTER, accountListFilter);
        args.putBundle(KEY_EXTRA_ARGS, (extraArgs == null) ? Bundle.EMPTY : extraArgs);
        args.putSerializable(KEY_LIST_FILTER, filter);

        final SelectAccountDialogFragment instance = new SelectAccountDialogFragment();
        instance.setArguments(args);
        instance.show(fragmentManager, tag);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Bundle args = getArguments();
        mFilter = (AccountTypeManager.AccountFilter) args.getSerializable(KEY_LIST_FILTER);
        if (mFilter == null) {
            mFilter = AccountTypeManager.AccountFilter.ALL;
        }
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        final Bundle args = getArguments();

        final AccountListFilter filter = (AccountListFilter) args.getSerializable(KEY_LIST_FILTER);
        final AccountsListAdapter accountAdapter = new AccountsListAdapter(builder.getContext(),
                filter);
        accountAdapter.setCustomLayout(R.layout.account_selector_list_item_condensed);
        mAccountsAdapter = new AccountsListAdapter(builder.getContext());
        mAccountsAdapter.setCustomLayout(R.layout.account_selector_list_item_condensed);

        final DialogInterface.OnClickListener clickListener =
                new DialogInterface.OnClickListener() {
@@ -86,18 +102,24 @@ public final class SelectAccountDialogFragment extends DialogFragment {
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();

                onAccountSelected(accountAdapter.getItem(which));
                onAccountSelected(mAccountsAdapter.getItem(which));
            }
        };

        final TextView title = (TextView) View.inflate(getActivity(), R.layout.dialog_title, null);
        title.setText(args.getInt(KEY_TITLE_RES_ID));
        builder.setCustomTitle(title);
        builder.setSingleChoiceItems(accountAdapter, 0, clickListener);
        builder.setSingleChoiceItems(mAccountsAdapter, 0, clickListener);
        final AlertDialog result = builder.create();
        return result;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        AccountsLoader.loadAccounts(this, 0, mFilter);
    }

    @Override
    public void onCancel(DialogInterface dialog) {
        super.onCancel(dialog);
@@ -126,6 +148,13 @@ public final class SelectAccountDialogFragment extends DialogFragment {
        return listener;
    }

    @Override
    public void onAccountsLoaded(List<AccountInfo> accounts) {
        Preconditions.checkNotNull(mAccountsAdapter,
                "Accounts adapter should have been initialized");
        mAccountsAdapter.setAccounts(accounts, null);
    }

    public interface Listener {
        void onAccountChosen(AccountWithDataSet account, Bundle extraArgs);
        void onAccountSelectorCancelled();
+1 −4
Original line number Diff line number Diff line
@@ -44,12 +44,9 @@ import com.android.contacts.model.AccountTypeManager;
import com.android.contacts.model.SimCard;
import com.android.contacts.model.SimContact;
import com.android.contacts.model.account.AccountInfo;
import com.android.contacts.model.account.AccountType;
import com.android.contacts.model.account.AccountWithDataSet;
import com.android.contacts.util.AccountSelectionUtil;
import com.android.contacts.util.AccountsListAdapter.AccountListFilter;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;

import java.util.List;
import java.util.concurrent.Future;
@@ -274,7 +271,7 @@ public class ImportDialogFragment extends DialogFragment {
            args.putInt(KEY_SUBSCRIPTION_ID, subscriptionId);
            SelectAccountDialogFragment.show(
                    getFragmentManager(), R.string.dialog_new_contact_account,
                    AccountListFilter.ACCOUNTS_CONTACT_WRITABLE, args);
                    AccountTypeManager.AccountFilter.CONTACTS_WRITABLE, args);
        } else {
            AccountSelectionUtil.doImport(getActivity(), resId,
                    (size == 1 ? accountList.get(0) : null),
+23 −33
Original line number Diff line number Diff line
@@ -83,6 +83,27 @@ public abstract class AccountTypeManager {
    public static final String BROADCAST_ACCOUNTS_CHANGED = AccountTypeManager.class.getName() +
            ".AccountsChanged";

    public enum AccountFilter implements Predicate<AccountInfo> {
        ALL {
            @Override
            public boolean apply(@Nullable AccountInfo input) {
                return input != null;
            }
        },
        CONTACTS_WRITABLE {
            @Override
            public boolean apply(@Nullable AccountInfo input) {
                return input != null && input.getType().areContactsWritable();
            }
        },
        GROUPS_WRITABLE {
            @Override
            public boolean apply(@Nullable AccountInfo input) {
                return input != null && input.getType().isGroupMembershipEditable();
            }
        };
    }

    /**
     * Requests the singleton instance of {@link AccountTypeManager} with data bound from
     * the available authenticators. This method can safely be called from the UI thread.
@@ -298,43 +319,12 @@ public abstract class AccountTypeManager {
        return canGetAccounts && canReadContacts;
    }

    public static Predicate<AccountInfo> nonNullAccountFilter() {
        return new Predicate<AccountInfo>() {
            @Override
            public boolean apply(AccountInfo info) {
                AccountWithDataSet account = info != null ? info.getAccount() : null;
                return account != null && !account.isNullAccount();
            }
        };

    }

    public static Predicate<AccountInfo> writableFilter() {
        return new Predicate<AccountInfo>() {
            @Override
            public boolean apply(AccountInfo account) {
                return account.getType().areContactsWritable();
            }
        };
        return AccountFilter.CONTACTS_WRITABLE;
    }

    public static Predicate<AccountInfo> groupWritableFilter() {
        return new Predicate<AccountInfo>() {
            @Override
            public boolean apply(@Nullable AccountInfo account) {
                return account.getType().isGroupMembershipEditable();
            }
        };
    }

    public static Predicate<AccountInfo> onlyNonEmptyExtensionFilter(Context context) {
        final Context appContext = context.getApplicationContext();
        return new Predicate<AccountInfo>() {
            @Override
            public boolean apply(@Nullable AccountInfo input) {
                return !input.getType().isExtension() || input.getAccount().hasData(appContext);
            }
        };
        return AccountFilter.GROUPS_WRITABLE;
    }
}

Loading