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

Commit d8617d35 authored by Marcus Hagerott's avatar Marcus Hagerott Committed by Android (Google) Code Review
Browse files

Merge changes If1b344d5,Idaffc3f0,I5a33ad27 into ub-contactsdialer-i-dev

* changes:
  Remove getGroupWritableAccounts method
  Replace getAccounts method with blockForWritableAccounts
  Add setter for accounts in AccountsListAdapter
parents 35ba051c cb43f107
Loading
Loading
Loading
Loading
+11 −7
Original line number Original line Diff line number Diff line
@@ -67,16 +67,17 @@ import com.android.contacts.list.MultiSelectContactsListFragment;
import com.android.contacts.model.AccountTypeManager;
import com.android.contacts.model.AccountTypeManager;
import com.android.contacts.model.account.AccountDisplayInfo;
import com.android.contacts.model.account.AccountDisplayInfo;
import com.android.contacts.model.account.AccountDisplayInfoFactory;
import com.android.contacts.model.account.AccountDisplayInfoFactory;
import com.android.contacts.model.account.AccountInfo;
import com.android.contacts.model.account.AccountWithDataSet;
import com.android.contacts.model.account.AccountWithDataSet;
import com.android.contacts.preference.ContactsPreferenceActivity;
import com.android.contacts.preference.ContactsPreferenceActivity;
import com.android.contacts.util.AccountFilterUtil;
import com.android.contacts.util.AccountFilterUtil;
import com.android.contacts.util.AccountsListAdapter.AccountListFilter;
import com.android.contacts.util.ImplicitIntentsUtil;
import com.android.contacts.util.ImplicitIntentsUtil;
import com.android.contacts.util.MaterialColorMapUtils;
import com.android.contacts.util.MaterialColorMapUtils;
import com.android.contacts.util.SharedPreferenceUtil;
import com.android.contacts.util.SharedPreferenceUtil;
import com.android.contacts.util.ViewUtil;
import com.android.contacts.util.ViewUtil;
import com.android.contactsbind.HelpUtils;
import com.android.contactsbind.HelpUtils;
import com.android.contactsbind.ObjectFactory;
import com.android.contactsbind.ObjectFactory;
import com.google.common.util.concurrent.Futures;


import java.util.HashMap;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Iterator;
@@ -402,7 +403,8 @@ public abstract class ContactsDrawerActivity extends AppCompatContactsActivity i
    }
    }


    @Override
    @Override
    public void onGroupsLoaded(List<GroupListItem> groupListItems) {
    public void onGroupsLoaded(List<GroupListItem> groupListItems,
            boolean areGroupWritableAccountsAvailable) {
        final Menu menu = mNavigationView.getMenu();
        final Menu menu = mNavigationView.getMenu();
        final MenuItem groupsMenuItem = menu.findItem(R.id.nav_groups);
        final MenuItem groupsMenuItem = menu.findItem(R.id.nav_groups);
        final SubMenu subMenu = groupsMenuItem.getSubMenu();
        final SubMenu subMenu = groupsMenuItem.getSubMenu();
@@ -443,7 +445,7 @@ public abstract class ContactsDrawerActivity extends AppCompatContactsActivity i
        }
        }


        // Don't show "Create new..." menu if there's no group-writable accounts available.
        // Don't show "Create new..." menu if there's no group-writable accounts available.
        if (!ContactsUtils.areGroupWritableAccountsAvailable(this)) {
        if (!areGroupWritableAccountsAvailable) {
            return;
            return;
        }
        }


@@ -679,8 +681,10 @@ public abstract class ContactsDrawerActivity extends AppCompatContactsActivity i
    }
    }


    private void selectAccountForNewGroup() {
    private void selectAccountForNewGroup() {
        final List<AccountWithDataSet> accounts = AccountTypeManager.getInstance(this)
        // This should never block because the GroupsFragment loads the accounts and the
                .getGroupWritableAccounts();
        // "Create Label" item only exists when that loading finishes
        final List<AccountInfo> accounts = Futures.getUnchecked(AccountTypeManager.getInstance(this)
                .filterAccountsAsync(AccountTypeManager.AccountFilter.GROUPS_WRITABLE));
        if (accounts.isEmpty()) {
        if (accounts.isEmpty()) {
            // We shouldn't present the add group button if there are no writable accounts
            // We shouldn't present the add group button if there are no writable accounts
            // but check it since it's possible we are started with an Intent.
            // but check it since it's possible we are started with an Intent.
@@ -689,11 +693,11 @@ public abstract class ContactsDrawerActivity extends AppCompatContactsActivity i
        }
        }
        // If there is a single writable account, use it w/o showing a dialog.
        // If there is a single writable account, use it w/o showing a dialog.
        if (accounts.size() == 1) {
        if (accounts.size() == 1) {
            onAccountChosen(accounts.get(0), /* extraArgs */ null);
            onAccountChosen(accounts.get(0).getAccount(), /* extraArgs */ null);
            return;
            return;
        }
        }
        SelectAccountDialogFragment.show(getFragmentManager(), R.string.dialog_new_group_account,
        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);
                TAG_SELECT_ACCOUNT_DIALOG);
    }
    }


+0 −9
Original line number Original line Diff line number Diff line
@@ -29,13 +29,10 @@ import android.util.Pair;


import com.android.contacts.compat.ContactsCompat;
import com.android.contacts.compat.ContactsCompat;
import com.android.contacts.compat.DirectoryCompat;
import com.android.contacts.compat.DirectoryCompat;
import com.android.contacts.model.AccountTypeManager;
import com.android.contacts.model.account.AccountWithDataSet;
import com.android.contacts.model.dataitem.ImDataItem;
import com.android.contacts.model.dataitem.ImDataItem;


import java.lang.annotation.Retention;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.RetentionPolicy;
import java.util.List;


public class ContactsUtils {
public class ContactsUtils {
    private static final String TAG = "ContactsUtils";
    private static final String TAG = "ContactsUtils";
@@ -138,12 +135,6 @@ public class ContactsUtils {
        return TextUtils.equals(a.getAction(), b.getAction());
        return TextUtils.equals(a.getAction(), b.getAction());
    }
    }


    public static boolean areGroupWritableAccountsAvailable(Context context) {
        final List<AccountWithDataSet> accounts =
                AccountTypeManager.getInstance(context).getGroupWritableAccounts();
        return !accounts.isEmpty();
    }

    /**
    /**
     * Returns the size (width and height) of thumbnail pictures as configured in the provider. This
     * Returns the size (width and height) of thumbnail pictures as configured in the provider. This
     * can safely be called from the UI thread, as the provider can serve this without performing
     * can safely be called from the UI thread, as the provider can serve this without performing
+1 −3
Original line number Original line 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.AccountWithDataSet;
import com.android.contacts.model.account.AccountsLoader;
import com.android.contacts.model.account.AccountsLoader;
import com.android.contacts.util.AccountsListAdapter;
import com.android.contacts.util.AccountsListAdapter;
import com.android.contacts.util.AccountsListAdapter.AccountListFilter;
import com.android.contacts.util.ImplicitIntentsUtil;
import com.android.contacts.util.ImplicitIntentsUtil;


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


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


import com.android.contacts.R;
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.AccountWithDataSet;
import com.android.contacts.model.account.AccountsLoader;
import com.android.contacts.util.AccountsListAdapter;
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.
 * Shows a dialog asking the user which account to chose.
 *
 *
 * The result is passed to {@code targetFragment} passed to {@link #show}.
 * 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";
    public static final String TAG = "SelectAccountDialogFragment";


    private static final String KEY_TITLE_RES_ID = "title_res_id";
    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_LIST_FILTER = "list_filter";
    private static final String KEY_EXTRA_ARGS = "extra_args";
    private static final String KEY_EXTRA_ARGS = "extra_args";


    private AccountsListAdapter mAccountsAdapter;
    private AccountTypeManager.AccountFilter mFilter;

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


    public static void show(FragmentManager fragmentManager, int titleResourceId,
    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();
        final Bundle args = new Bundle();
        args.putInt(KEY_TITLE_RES_ID, titleResourceId);
        args.putInt(KEY_TITLE_RES_ID, titleResourceId);
        args.putSerializable(KEY_LIST_FILTER, accountListFilter);
        args.putBundle(KEY_EXTRA_ARGS, (extraArgs == null) ? Bundle.EMPTY : extraArgs);
        args.putBundle(KEY_EXTRA_ARGS, (extraArgs == null) ? Bundle.EMPTY : extraArgs);
        args.putSerializable(KEY_LIST_FILTER, filter);


        final SelectAccountDialogFragment instance = new SelectAccountDialogFragment();
        final SelectAccountDialogFragment instance = new SelectAccountDialogFragment();
        instance.setArguments(args);
        instance.setArguments(args);
        instance.show(fragmentManager, tag);
        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
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        final Bundle args = getArguments();
        final Bundle args = getArguments();


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


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


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


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


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

    @Override
    @Override
    public void onCancel(DialogInterface dialog) {
    public void onCancel(DialogInterface dialog) {
        super.onCancel(dialog);
        super.onCancel(dialog);
@@ -126,6 +148,13 @@ public final class SelectAccountDialogFragment extends DialogFragment {
        return listener;
        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 {
    public interface Listener {
        void onAccountChosen(AccountWithDataSet account, Bundle extraArgs);
        void onAccountChosen(AccountWithDataSet account, Bundle extraArgs);
        void onAccountSelectorCancelled();
        void onAccountSelectorCancelled();
+29 −7
Original line number Original line Diff line number Diff line
@@ -24,6 +24,9 @@ import android.database.Cursor;
import android.os.Bundle;
import android.os.Bundle;


import com.android.contacts.GroupListLoader;
import com.android.contacts.GroupListLoader;
import com.android.contacts.model.AccountTypeManager;
import com.android.contacts.model.account.AccountInfo;
import com.android.contacts.model.account.AccountsLoader;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.List;
import java.util.List;
@@ -31,9 +34,10 @@ import java.util.List;
/**
/**
 * Loads groups and group metadata for all accounts.
 * Loads groups and group metadata for all accounts.
 */
 */
public final class GroupsFragment extends Fragment {
public final class GroupsFragment extends Fragment implements AccountsLoader.AccountsListener {


    private static final int LOADER_GROUPS = 1;
    private static final int LOADER_GROUPS = 1;
    private static final int LOADER_ACCOUNTS = 2;


    /**
    /**
     * Callbacks for hosts of the {@link GroupsFragment}.
     * Callbacks for hosts of the {@link GroupsFragment}.
@@ -43,7 +47,8 @@ public final class GroupsFragment extends Fragment {
        /**
        /**
         * Invoked after groups and group metadata have been loaded.
         * Invoked after groups and group metadata have been loaded.
         */
         */
        void onGroupsLoaded(List<GroupListItem> groupListItems);
        void onGroupsLoaded(List<GroupListItem> groupListItems,
                boolean areGroupWritableAccountsAvailable);
    }
    }


    private final LoaderManager.LoaderCallbacks<Cursor> mGroupListLoaderListener =
    private final LoaderManager.LoaderCallbacks<Cursor> mGroupListLoaderListener =
@@ -65,9 +70,8 @@ public final class GroupsFragment extends Fragment {
                            mGroupListItems.add(GroupUtil.getGroupListItem(data, i));
                            mGroupListItems.add(GroupUtil.getGroupListItem(data, i));
                        }
                        }
                    }
                    }
                    if (mListener != null) {
                    mGroupsLoaded = true;
                        mListener.onGroupsLoaded(mGroupListItems);
                    notifyIfReady();
                    }
                }
                }


                public void onLoaderReset(Loader<Cursor> loader) {
                public void onLoaderReset(Loader<Cursor> loader) {
@@ -75,15 +79,33 @@ public final class GroupsFragment extends Fragment {
            };
            };


    private List<GroupListItem> mGroupListItems = new ArrayList<>();
    private List<GroupListItem> mGroupListItems = new ArrayList<>();
    private boolean mHasGroupWritableAccounts = false;
    private boolean mGroupsLoaded = false;
    private boolean mAccountsLoaded = false;
    private GroupsListener mListener;
    private GroupsListener mListener;


    @Override
    @Override
    public void onStart() {
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        AccountsLoader.loadAccounts(this, LOADER_ACCOUNTS,
                AccountTypeManager.AccountFilter.GROUPS_WRITABLE);
        getLoaderManager().initLoader(LOADER_GROUPS, null, mGroupListLoaderListener);
        getLoaderManager().initLoader(LOADER_GROUPS, null, mGroupListLoaderListener);
        super.onStart();
    }
    }


    public void setListener(GroupsListener listener) {
    public void setListener(GroupsListener listener) {
        mListener = listener;
        mListener = listener;
    }
    }

    @Override
    public void onAccountsLoaded(List<AccountInfo> accounts) {
        mHasGroupWritableAccounts = !accounts.isEmpty();
        mAccountsLoaded = true;
        notifyIfReady();
    }

    private void notifyIfReady() {
        if (mAccountsLoaded && mGroupsLoaded && mListener != null) {
            mListener.onGroupsLoaded(mGroupListItems, mHasGroupWritableAccounts);
        }
    }
}
}
Loading