summaryrefslogtreecommitdiff
path: root/src/com/android/contacts/util
diff options
context:
space:
mode:
authorGary Mai <garymai@google.com>2021-02-08 11:12:44 -0800
committerGary Mai <garymai@google.com>2021-02-08 11:13:04 -0800
commit760cd8e2d784bbfa4808c709c93f680d3acea037 (patch)
treedf5324e83c07250c804b6d50d344dba8cd299776 /src/com/android/contacts/util
parent8b0e5303db5e13bf0ec22d819c6e852c77545f77 (diff)
downloadContacts-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.java21
-rw-r--r--src/com/android/contacts/util/DeviceLocalAccountTypeFactory.java14
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.");