diff options
author | Gary Mai <garymai@google.com> | 2021-02-08 11:12:44 -0800 |
---|---|---|
committer | Gary Mai <garymai@google.com> | 2021-02-08 11:13:04 -0800 |
commit | 760cd8e2d784bbfa4808c709c93f680d3acea037 (patch) | |
tree | df5324e83c07250c804b6d50d344dba8cd299776 /src/com/android/contacts/util | |
parent | 8b0e5303db5e13bf0ec22d819c6e852c77545f77 (diff) | |
download | Contacts-760cd8e2d784bbfa4808c709c93f680d3acea037.tar.gz |
Add known SIM accounts to account drawer
Add listener to SIM changed broadcast
Load SIM accounts from ContactsContract API
Treat them similarly as device local accounts
Mark SIM accounts as not-writable, to avoid making it seem like AOSP
supports writing to the SIM.
Need to special case and add SIM accounts as a separate drawer filter
because of that
Test: Manual test, verifying SIM account appears and account view shows
correct contacts and count.
Bug: 177603484
Change-Id: I5449cbedbc76bc80047b64afd71041e6e0255764
Diffstat (limited to 'src/com/android/contacts/util')
-rw-r--r-- | src/com/android/contacts/util/AccountFilterUtil.java | 21 | ||||
-rw-r--r-- | src/com/android/contacts/util/DeviceLocalAccountTypeFactory.java | 14 |
2 files changed, 22 insertions, 13 deletions
diff --git a/src/com/android/contacts/util/AccountFilterUtil.java b/src/com/android/contacts/util/AccountFilterUtil.java index 65ee69e85..c4a8df64d 100644 --- a/src/com/android/contacts/util/AccountFilterUtil.java +++ b/src/com/android/contacts/util/AccountFilterUtil.java @@ -20,15 +20,12 @@ import android.accounts.Account; 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 androidx.localbroadcastmanager.content.LocalBroadcastManager; import android.text.TextUtils; import android.util.Log; import android.widget.Toast; @@ -39,9 +36,6 @@ 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.AccountInfo; import com.android.contacts.model.account.AccountType; import com.android.contacts.model.account.AccountWithDataSet; @@ -51,16 +45,12 @@ 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. */ @@ -125,7 +115,7 @@ public class AccountFilterUtil { @Override protected ListenableFuture<List<ContactListFilter>> loadData() { return Futures.transform(mAccountTypeManager.filterAccountsAsync( - AccountTypeManager.writableFilter()), + AccountTypeManager.drawerDisplayableFilter()), new Function<List<AccountInfo>, List<ContactListFilter>>() { @Override public List<ContactListFilter> apply(List<AccountInfo> input) { @@ -150,9 +140,12 @@ public class AccountFilterUtil { } final Drawable icon = accountType != null ? accountType.getDisplayIcon(getContext()) : null; - if (DeviceLocalAccountTypeFactory.Util.isLocalAccountType( - mDeviceLocalFactory, account.type)) { + if (mDeviceLocalFactory.classifyAccount(account.type) + == DeviceLocalAccountTypeFactory.TYPE_DEVICE) { accountFilters.add(ContactListFilter.createDeviceContactsFilter(icon, account)); + } else if (mDeviceLocalFactory.classifyAccount(account.type) + == DeviceLocalAccountTypeFactory.TYPE_SIM) { + accountFilters.add(ContactListFilter.createSimContactsFilter(icon, account)); } else { accountFilters.add(ContactListFilter.createAccountFilter( account.type, account.name, account.dataSet, icon)); @@ -222,6 +215,8 @@ public class AccountFilterUtil { public static String getActionBarTitleForFilter(Context context, ContactListFilter filter) { if (filter.filterType == ContactListFilter.FILTER_TYPE_DEVICE_CONTACTS) { return context.getString(R.string.account_phone); + } else if (filter.filterType == ContactListFilter.FILTER_TYPE_SIM_CONTACTS) { + return context.getString(R.string.account_sim); } else if (filter.filterType == ContactListFilter.FILTER_TYPE_ACCOUNT && !TextUtils.isEmpty(filter.accountName)) { return getActionBarTitleForAccount(context, filter); diff --git a/src/com/android/contacts/util/DeviceLocalAccountTypeFactory.java b/src/com/android/contacts/util/DeviceLocalAccountTypeFactory.java index 5a0758037..41caa424f 100644 --- a/src/com/android/contacts/util/DeviceLocalAccountTypeFactory.java +++ b/src/com/android/contacts/util/DeviceLocalAccountTypeFactory.java @@ -16,11 +16,14 @@ package com.android.contacts.util; import android.content.Context; +import android.provider.ContactsContract; + import androidx.annotation.IntDef; import com.android.contacts.model.account.AccountType; import com.android.contacts.model.account.AccountWithDataSet; import com.android.contacts.model.account.DeviceLocalAccountType; +import com.android.contacts.model.account.SimAccountType; import java.lang.annotation.Retention; import java.util.Objects; @@ -67,6 +70,14 @@ public interface DeviceLocalAccountTypeFactory { @Override public int classifyAccount(String accountType) { + for (ContactsContract.SimAccount simAccount : + ContactsContract.SimContacts.getSimAccounts( + mContext.getContentResolver())) { + if (accountType != null && Objects.equals(accountType, + simAccount.getAccountType())) { + return TYPE_SIM; + } + } return accountType == null || Objects.equals(AccountWithDataSet.getLocalAccount(mContext).type, accountType) ? TYPE_DEVICE : TYPE_OTHER; @@ -74,6 +85,9 @@ public interface DeviceLocalAccountTypeFactory { @Override public AccountType getAccountType(String accountType) { + if (classifyAccount(accountType) == TYPE_SIM) { + return new SimAccountType(mContext); + } if (accountType != null && !Objects.equals( AccountWithDataSet.getLocalAccount(mContext).type, accountType)) { throw new IllegalArgumentException(accountType + " is not a device account type."); |