diff options
author | Marcus Hagerott <mhagerott@google.com> | 2016-12-12 17:21:57 -0800 |
---|---|---|
committer | Marcus Hagerott <mhagerott@google.com> | 2016-12-16 16:43:03 -0800 |
commit | 75895e73379aa26a3d4135c772af4ecb8a79b4c9 (patch) | |
tree | 1187a975c90fb08a739c4cde19a150eef797514e /src/com/android/contacts/util | |
parent | cdb539b3abfcc1447be337ef3741e7501510cf14 (diff) | |
download | Contacts-75895e73379aa26a3d4135c772af4ecb8a79b4c9.tar.gz |
Add AccountInfo class
This holds the AccountWithDataSet, AccountType and AccountDisplayInfo
for an account because many usages of accounts need all three of these.
Test: manually verify that accounts in nav drawer are correct
Bug 33627801
Change-Id: I39962f9945714aa7ce48aca97f220f119a1741cd
Diffstat (limited to 'src/com/android/contacts/util')
3 files changed, 63 insertions, 61 deletions
diff --git a/src/com/android/contacts/util/AccountFilterUtil.java b/src/com/android/contacts/util/AccountFilterUtil.java index 9eb8e7bcc..218604ceb 100644 --- a/src/com/android/contacts/util/AccountFilterUtil.java +++ b/src/com/android/contacts/util/AccountFilterUtil.java @@ -42,6 +42,7 @@ import com.android.contacts.model.AccountTypeManager; import com.android.contacts.model.Contact; import com.android.contacts.model.account.AccountDisplayInfo; import com.android.contacts.model.account.AccountDisplayInfoFactory; +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.preference.ContactsPreferences; @@ -113,53 +114,33 @@ public class AccountFilterUtil { public static class FilterLoader extends ListenableFutureLoader<List<ContactListFilter>> { private AccountTypeManager mAccountTypeManager; private DeviceLocalAccountTypeFactory mDeviceLocalFactory; - private LocalBroadcastManager mLocalBroadcastManager; - private BroadcastReceiver mReceiver; public FilterLoader(Context context) { - super(context); + super(context, new IntentFilter(AccountTypeManager.BROADCAST_ACCOUNTS_CHANGED)); mAccountTypeManager = AccountTypeManager.getInstance(context); mDeviceLocalFactory = ObjectFactory.getDeviceLocalAccountTypeFactory(context); - mLocalBroadcastManager = LocalBroadcastManager.getInstance(context); } - @Override - protected void onStartLoading() { - super.onStartLoading(); - if (mReceiver == null) { - mReceiver = new ForceLoadReceiver(); - mLocalBroadcastManager.registerReceiver(mReceiver, - new IntentFilter(AccountTypeManager.BROADCAST_ACCOUNTS_CHANGED)); - } - } - - @Override - protected void onReset() { - super.onReset(); - if (mReceiver != null) { - mLocalBroadcastManager.unregisterReceiver(mReceiver); - } - } @Override protected ListenableFuture<List<ContactListFilter>> loadData() { - return Futures.transform(mAccountTypeManager.filterAccountsByTypeAsync( + return Futures.transform(mAccountTypeManager.filterAccountsAsync( AccountTypeManager.writableFilter()), - new Function<List<AccountWithDataSet>, List<ContactListFilter>>() { + new Function<List<AccountInfo>, List<ContactListFilter>>() { @Override - public List<ContactListFilter> apply(List<AccountWithDataSet> input) { + public List<ContactListFilter> apply(List<AccountInfo> input) { return getFiltersForAccounts(input); } }, ContactsExecutors.getDefaultThreadPoolExecutor()); } - private List<ContactListFilter> getFiltersForAccounts(List<AccountWithDataSet> accounts) { - final ArrayList<ContactListFilter> accountFilters = Lists.newArrayList(); - AccountTypeManager.sortAccounts(getDefaultAccount(getContext()), accounts); + private List<ContactListFilter> getFiltersForAccounts(List<AccountInfo> accounts) { + final ArrayList<ContactListFilter> accountFilters = new ArrayList<>(); + AccountInfo.sortAccounts(getDefaultAccount(getContext()), accounts); - for (AccountWithDataSet account : accounts) { - final AccountType accountType = - mAccountTypeManager.getAccountType(account.type, account.dataSet); + for (AccountInfo accountInfo : accounts) { + final AccountType accountType = accountInfo.getType(); + final AccountWithDataSet account = accountInfo.getAccount(); if ((accountType.isExtension() || DeviceLocalAccountTypeFactory.Util.isLocalAccountType( mDeviceLocalFactory, account.type)) && @@ -178,9 +159,7 @@ public class AccountFilterUtil { } } - final ArrayList<ContactListFilter> result = Lists.newArrayList(); - result.addAll(accountFilters); - return result; + return accountFilters; } } diff --git a/src/com/android/contacts/util/AccountsListAdapter.java b/src/com/android/contacts/util/AccountsListAdapter.java index 94a7c29ac..005bb8d78 100644 --- a/src/com/android/contacts/util/AccountsListAdapter.java +++ b/src/com/android/contacts/util/AccountsListAdapter.java @@ -25,11 +25,8 @@ import android.widget.ImageView; import android.widget.TextView; import com.android.contacts.R; -import com.android.contacts.list.ContactListFilter; import com.android.contacts.model.AccountTypeManager; -import com.android.contacts.model.account.AccountDisplayInfo; -import com.android.contacts.model.account.AccountDisplayInfoFactory; -import com.android.contacts.model.account.AccountType; +import com.android.contacts.model.account.AccountInfo; import com.android.contacts.model.account.AccountWithDataSet; import java.util.ArrayList; @@ -40,32 +37,41 @@ import java.util.List; */ public final class AccountsListAdapter extends BaseAdapter { private final LayoutInflater mInflater; - private final List<AccountDisplayInfo> mAccountDisplayInfoList; - private final List<AccountWithDataSet> mAccounts; + private final List<AccountInfo> mAccounts; private final Context mContext; private int mCustomLayout = -1; public enum AccountListFilter { ALL_ACCOUNTS { @Override - public List<AccountWithDataSet> getAccounts(Context context) { + public List<AccountWithDataSet> getSourceAccounts(Context context) { return AccountTypeManager.getInstance(context).getAccounts(false); } }, ACCOUNTS_CONTACT_WRITABLE { @Override - public List<AccountWithDataSet> getAccounts(Context context) { + public List<AccountWithDataSet> getSourceAccounts(Context context) { return AccountTypeManager.getInstance(context).getAccounts(true); } }, ACCOUNTS_GROUP_WRITABLE { @Override - public List<AccountWithDataSet> getAccounts(Context context) { + public List<AccountWithDataSet> getSourceAccounts(Context context) { return AccountTypeManager.getInstance(context).getGroupWritableAccounts(); } }; - public abstract List<AccountWithDataSet> getAccounts(Context context); + private List<AccountInfo> getAccounts(Context context) { + final AccountTypeManager accountTypeManager = AccountTypeManager.getInstance(context); + final List<AccountInfo> result = new ArrayList<>(); + final List<AccountWithDataSet> sourceAccounts = getSourceAccounts(context); + for (AccountWithDataSet account : sourceAccounts) { + result.add(accountTypeManager.getAccountInfoForAccount(account)); + } + return result; + } + + public abstract List<AccountWithDataSet> getSourceAccounts(Context context); } public AccountsListAdapter(Context context, AccountListFilter filter) { @@ -77,7 +83,7 @@ public final class AccountsListAdapter extends BaseAdapter { this(context, filter.getAccounts(context), currentAccount); } - public AccountsListAdapter(Context context, List<AccountWithDataSet> accounts) { + public AccountsListAdapter(Context context, List<AccountInfo> accounts) { this(context, accounts, null); } @@ -85,22 +91,18 @@ public final class AccountsListAdapter extends BaseAdapter { * @param currentAccount the Account currently selected by the user, which should come * first in the list. Can be null. */ - public AccountsListAdapter(Context context, List<AccountWithDataSet> accounts, + public AccountsListAdapter(Context context, List<AccountInfo> accounts, AccountWithDataSet currentAccount) { mContext = context; - if (currentAccount != null + + final AccountInfo currentInfo = AccountInfo.getAccount(accounts, currentAccount); + if (currentInfo != null && !accounts.isEmpty() - && !accounts.get(0).equals(currentAccount) - && accounts.remove(currentAccount)) { - accounts.add(0, currentAccount); + && !accounts.get(0).sameAccount(currentAccount) + && accounts.remove(currentInfo)) { + accounts.add(0, currentInfo); } - final AccountDisplayInfoFactory factory = new AccountDisplayInfoFactory(context, - accounts); - mAccountDisplayInfoList = new ArrayList<>(accounts.size()); - for (AccountWithDataSet account : accounts) { - mAccountDisplayInfoList.add(factory.getAccountDisplayInfo(account)); - } mInflater = LayoutInflater.from(context); mAccounts = accounts; @@ -120,22 +122,22 @@ public final class AccountsListAdapter extends BaseAdapter { final TextView text2 = (TextView) resultView.findViewById(android.R.id.text2); final ImageView icon = (ImageView) resultView.findViewById(android.R.id.icon); - text1.setText(mAccountDisplayInfoList.get(position).getTypeLabel()); - text2.setText(mAccountDisplayInfoList.get(position).getNameLabel()); + text1.setText(mAccounts.get(position).getTypeLabel()); + text2.setText(mAccounts.get(position).getNameLabel()); - icon.setImageDrawable(mAccountDisplayInfoList.get(position).getIcon()); + icon.setImageDrawable(mAccounts.get(position).getIcon()); return resultView; } @Override public int getCount() { - return mAccountDisplayInfoList.size(); + return mAccounts.size(); } @Override public AccountWithDataSet getItem(int position) { - return mAccountDisplayInfoList.get(position).getSource(); + return mAccounts.get(position).getAccount(); } @Override diff --git a/src/com/android/contacts/util/concurrent/ListenableFutureLoader.java b/src/com/android/contacts/util/concurrent/ListenableFutureLoader.java index f7edb6444..8c90d8763 100644 --- a/src/com/android/contacts/util/concurrent/ListenableFutureLoader.java +++ b/src/com/android/contacts/util/concurrent/ListenableFutureLoader.java @@ -18,7 +18,9 @@ package com.android.contacts.util.concurrent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.Loader; +import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import com.google.common.util.concurrent.FutureCallback; @@ -38,9 +40,14 @@ import java.util.concurrent.Executor; public abstract class ListenableFutureLoader<D> extends Loader<D> { private static final String TAG = "FutureLoader"; + private final IntentFilter mReloadFilter; + private final Executor mUiExecutor; + private final LocalBroadcastManager mLocalBroadcastManager; + private ListenableFuture<D> mFuture; private D mLoadedData; - private Executor mUiExecutor; + + private BroadcastReceiver mReceiver; /** * Stores away the application context associated with context. @@ -53,12 +60,23 @@ public abstract class ListenableFutureLoader<D> extends Loader<D> { * @param context used to retrieve the application context. */ public ListenableFutureLoader(Context context) { + this(context, null); + } + + public ListenableFutureLoader(Context context, IntentFilter reloadBroadcastFilter) { super(context); mUiExecutor = ContactsExecutors.newUiThreadExecutor(); + mReloadFilter = reloadBroadcastFilter; + mLocalBroadcastManager = LocalBroadcastManager.getInstance(context); } @Override protected void onStartLoading() { + if (mReloadFilter != null && mReceiver == null) { + mReceiver = new ForceLoadReceiver(); + mLocalBroadcastManager.registerReceiver(mReceiver, mReloadFilter); + } + if (mLoadedData != null) { deliverResult(mLoadedData); } @@ -105,6 +123,9 @@ public abstract class ListenableFutureLoader<D> extends Loader<D> { protected void onReset() { mFuture = null; mLoadedData = null; + if (mReceiver != null) { + mLocalBroadcastManager.unregisterReceiver(mReceiver); + } } protected abstract ListenableFuture<D> loadData(); |