diff options
author | Marcus Hagerott <mhagerott@google.com> | 2016-12-12 12:44:11 -0800 |
---|---|---|
committer | Marcus Hagerott <mhagerott@google.com> | 2016-12-15 14:11:43 -0800 |
commit | b61e6543ef277443a44e576adc8d0b753b308c9e (patch) | |
tree | f6431182abff1494f5b9c493dc136b25b7497aa0 /src/com/android/contacts/util | |
parent | 396aab726710c557188ace4e961064a65900524a (diff) | |
download | Contacts-b61e6543ef277443a44e576adc8d0b753b308c9e.tar.gz |
Make account filters for nav drawer update
Use new methods in AccountTypeManager so that the ContactListFilters
are reloaded when accounts are added and removed.
Test: manually verify that list of accounts in nav drawer updates
when an account is added or removed
Bug 33627801
Change-Id: Ib4c2a049c27602c3c52b471e686eca6fdbf92a39
Diffstat (limited to 'src/com/android/contacts/util')
-rw-r--r-- | src/com/android/contacts/util/AccountFilterUtil.java | 105 | ||||
-rw-r--r-- | src/com/android/contacts/util/DeviceLocalAccountTypeFactory.java | 4 |
2 files changed, 67 insertions, 42 deletions
diff --git a/src/com/android/contacts/util/AccountFilterUtil.java b/src/com/android/contacts/util/AccountFilterUtil.java index 3a6d49e4e..9eb8e7bcc 100644 --- a/src/com/android/contacts/util/AccountFilterUtil.java +++ b/src/com/android/contacts/util/AccountFilterUtil.java @@ -21,11 +21,14 @@ import android.app.Activity; import android.app.Fragment; import android.content.ActivityNotFoundException; import android.content.AsyncTaskLoader; +import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.graphics.drawable.Drawable; import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Intents; +import android.support.v4.content.LocalBroadcastManager; import android.text.TextUtils; import android.util.Log; import android.widget.Toast; @@ -36,18 +39,27 @@ import com.android.contacts.list.AccountFilterActivity; import com.android.contacts.list.ContactListFilter; import com.android.contacts.list.ContactListFilterController; 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.AccountType; import com.android.contacts.model.account.AccountWithDataSet; import com.android.contacts.preference.ContactsPreferences; +import com.android.contacts.util.concurrent.ContactsExecutors; +import com.android.contacts.util.concurrent.ListenableFutureLoader; import com.android.contactsbind.ObjectFactory; +import com.google.common.base.Function; +import com.google.common.base.Predicate; import com.google.common.collect.Lists; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; import java.util.ArrayList; import java.util.List; +import javax.annotation.Nullable; + /** * Utility class for account filter manipulation. */ @@ -98,65 +110,78 @@ public class AccountFilterUtil { /** * Loads a list of contact list filters */ - public static class FilterLoader extends AsyncTaskLoader<List<ContactListFilter>> { - private Context mContext; + 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); - mContext = context; + mAccountTypeManager = AccountTypeManager.getInstance(context); mDeviceLocalFactory = ObjectFactory.getDeviceLocalAccountTypeFactory(context); - } - - @Override - public List<ContactListFilter> loadInBackground() { - return loadAccountFilters(mContext, mDeviceLocalFactory); + mLocalBroadcastManager = LocalBroadcastManager.getInstance(context); } @Override protected void onStartLoading() { - forceLoad(); + super.onStartLoading(); + if (mReceiver == null) { + mReceiver = new ForceLoadReceiver(); + mLocalBroadcastManager.registerReceiver(mReceiver, + new IntentFilter(AccountTypeManager.BROADCAST_ACCOUNTS_CHANGED)); + } } @Override - protected void onStopLoading() { - cancelLoad(); + protected void onReset() { + super.onReset(); + if (mReceiver != null) { + mLocalBroadcastManager.unregisterReceiver(mReceiver); + } } @Override - protected void onReset() { - onStopLoading(); + protected ListenableFuture<List<ContactListFilter>> loadData() { + return Futures.transform(mAccountTypeManager.filterAccountsByTypeAsync( + AccountTypeManager.writableFilter()), + new Function<List<AccountWithDataSet>, List<ContactListFilter>>() { + @Override + public List<ContactListFilter> apply(List<AccountWithDataSet> input) { + return getFiltersForAccounts(input); + } + }, ContactsExecutors.getDefaultThreadPoolExecutor()); } - } - private static List<ContactListFilter> loadAccountFilters(Context context, - DeviceLocalAccountTypeFactory deviceAccountTypeFactory) { - final ArrayList<ContactListFilter> accountFilters = Lists.newArrayList(); - final AccountTypeManager accountTypeManager = AccountTypeManager.getInstance(context); - final List<AccountWithDataSet> accounts = accountTypeManager.getAccounts(true); - AccountTypeManager.sortAccounts(getDefaultAccount(context), accounts); - - for (AccountWithDataSet account : accounts) { - final AccountType accountType = - accountTypeManager.getAccountType(account.type, account.dataSet); - if ((accountType.isExtension() || DeviceLocalAccountTypeFactory.Util.isLocalAccountType( - deviceAccountTypeFactory, account.type)) && !account.hasData(context)) { - // Hide extensions and device accounts with no raw_contacts. - continue; - } - final Drawable icon = accountType != null ? accountType.getDisplayIcon(context) : null; - if (DeviceLocalAccountTypeFactory.Util.isLocalAccountType( - deviceAccountTypeFactory, account.type)) { - accountFilters.add(ContactListFilter.createDeviceContactsFilter(icon, account)); - } else { - accountFilters.add(ContactListFilter.createAccountFilter( - account.type, account.name, account.dataSet, icon)); + private List<ContactListFilter> getFiltersForAccounts(List<AccountWithDataSet> accounts) { + final ArrayList<ContactListFilter> accountFilters = Lists.newArrayList(); + AccountTypeManager.sortAccounts(getDefaultAccount(getContext()), accounts); + + for (AccountWithDataSet account : accounts) { + final AccountType accountType = + mAccountTypeManager.getAccountType(account.type, account.dataSet); + if ((accountType.isExtension() || + DeviceLocalAccountTypeFactory.Util.isLocalAccountType( + mDeviceLocalFactory, account.type)) && + !account.hasData(getContext())) { + // Hide extensions and device accounts with no raw_contacts. + continue; + } + final Drawable icon = accountType != null ? + accountType.getDisplayIcon(getContext()) : null; + if (DeviceLocalAccountTypeFactory.Util.isLocalAccountType( + mDeviceLocalFactory, account.type)) { + accountFilters.add(ContactListFilter.createDeviceContactsFilter(icon, account)); + } else { + accountFilters.add(ContactListFilter.createAccountFilter( + account.type, account.name, account.dataSet, icon)); + } } - } - final ArrayList<ContactListFilter> result = Lists.newArrayList(); - result.addAll(accountFilters); - return result; + final ArrayList<ContactListFilter> result = Lists.newArrayList(); + result.addAll(accountFilters); + return result; + } } private static AccountWithDataSet getDefaultAccount(Context context) { diff --git a/src/com/android/contacts/util/DeviceLocalAccountTypeFactory.java b/src/com/android/contacts/util/DeviceLocalAccountTypeFactory.java index 3e615554e..59ee7e5d3 100644 --- a/src/com/android/contacts/util/DeviceLocalAccountTypeFactory.java +++ b/src/com/android/contacts/util/DeviceLocalAccountTypeFactory.java @@ -15,8 +15,6 @@ */ package com.android.contacts.util; -import static java.lang.annotation.RetentionPolicy.SOURCE; - import android.content.Context; import android.support.annotation.IntDef; @@ -25,6 +23,8 @@ import com.android.contacts.model.account.DeviceLocalAccountType; import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.SOURCE; + /** * Reports whether a value from RawContacts.ACCOUNT_TYPE should be considered a "Device" * account |