summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/preferredsim
diff options
context:
space:
mode:
authortwyen <twyen@google.com>2018-01-25 16:14:15 -0800
committerCopybara-Service <copybara-piper@google.com>2018-01-25 17:34:21 -0800
commit04306a75588b58208758f43821e1898c6f125baf (patch)
tree71f651124922c345bfcca2687f918dce76e7e927 /java/com/android/dialer/preferredsim
parentc1623fe219f3229bf9191afdcf0667efd0f549b8 (diff)
Update preferred SIM SuggestionProvider
"remember this SIM" checkbox state is reported to the provider. The other SIM is reported to the provider when "change SIM" is used Bug: 70503524 Test: Unit tests PiperOrigin-RevId: 183308581 Change-Id: I3d097d14a503c759f130044c9a9c48c420eee19d
Diffstat (limited to 'java/com/android/dialer/preferredsim')
-rw-r--r--java/com/android/dialer/preferredsim/PreferredAccountUtil.java116
-rw-r--r--java/com/android/dialer/preferredsim/suggestion/SuggestionProvider.java6
-rw-r--r--java/com/android/dialer/preferredsim/suggestion/stub/StubSuggestionProvider.java6
3 files changed, 124 insertions, 4 deletions
diff --git a/java/com/android/dialer/preferredsim/PreferredAccountUtil.java b/java/com/android/dialer/preferredsim/PreferredAccountUtil.java
new file mode 100644
index 000000000..1cfdbb161
--- /dev/null
+++ b/java/com/android/dialer/preferredsim/PreferredAccountUtil.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.preferredsim;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.configprovider.ConfigProviderComponent;
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Utilities for looking up and validating preferred {@link PhoneAccountHandle}. Contacts should
+ * follow the same logic.
+ */
+public class PreferredAccountUtil {
+
+ /**
+ * Validates {@code componentNameString} and {@code idString} maps to SIM that is present on the
+ * device.
+ */
+ @NonNull
+ public static Optional<PhoneAccountHandle> getValidPhoneAccount(
+ @NonNull Context context, @Nullable String componentNameString, @Nullable String idString) {
+ if (TextUtils.isEmpty(componentNameString) || TextUtils.isEmpty(idString)) {
+ LogUtil.i("PreferredAccountUtil.getValidPhoneAccount", "empty componentName or id");
+ return Optional.absent();
+ }
+ ComponentName componentName = ComponentName.unflattenFromString(componentNameString);
+ if (componentName == null) {
+ LogUtil.e("PreferredAccountUtil.getValidPhoneAccount", "cannot parse component name");
+ return Optional.absent();
+ }
+ PhoneAccountHandle phoneAccountHandle = new PhoneAccountHandle(componentName, idString);
+
+ if (isPhoneAccountValid(context, phoneAccountHandle)) {
+ return Optional.of(phoneAccountHandle);
+ }
+ return Optional.absent();
+ }
+
+ public static boolean isPhoneAccountValid(
+ Context context, PhoneAccountHandle phoneAccountHandle) {
+ if (VERSION.SDK_INT >= VERSION_CODES.O) {
+ return context
+ .getSystemService(TelephonyManager.class)
+ .createForPhoneAccountHandle(phoneAccountHandle)
+ != null;
+ }
+
+ PhoneAccount phoneAccount =
+ context.getSystemService(TelecomManager.class).getPhoneAccount(phoneAccountHandle);
+ if (phoneAccount == null) {
+ LogUtil.e("PreferredAccountUtil.isPhoneAccountValid", "invalid phone account");
+ return false;
+ }
+
+ if (!phoneAccount.isEnabled()) {
+ LogUtil.e("PreferredAccountUtil.isPhoneAccountValid", "disabled phone account");
+ return false;
+ }
+ for (SubscriptionInfo info :
+ SubscriptionManager.from(context).getActiveSubscriptionInfoList()) {
+ if (phoneAccountHandle.getId().startsWith(info.getIccId())) {
+ LogUtil.i("PreferredAccountUtil.isPhoneAccountValid", "sim found");
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Return a set of {@link android.accounts.Account#type} that is known to have writable contacts.
+ * This is a light weight implementation of {@link
+ * com.android.contacts.common.model.AccountTypeManager#getAccountTypes(boolean)}. External
+ * accounts are not supported.
+ */
+ public static ImmutableSet<String> getValidAccountTypes(Context context) {
+ return ImmutableSet.copyOf(
+ ConfigProviderComponent.get(context)
+ .getConfigProvider()
+ .getString(
+ "preferred_sim_valid_account_types",
+ "com.google;"
+ + "com.osp.app.signin;"
+ + "com.android.exchange;"
+ + "com.google.android.exchange;"
+ + "com.google.android.gm.exchange")
+ .split(";"));
+ }
+}
diff --git a/java/com/android/dialer/preferredsim/suggestion/SuggestionProvider.java b/java/com/android/dialer/preferredsim/suggestion/SuggestionProvider.java
index c1114b3f3..bb50889ec 100644
--- a/java/com/android/dialer/preferredsim/suggestion/SuggestionProvider.java
+++ b/java/com/android/dialer/preferredsim/suggestion/SuggestionProvider.java
@@ -62,8 +62,10 @@ public interface SuggestionProvider {
void reportUserSelection(
@NonNull Context context,
@NonNull String number,
- @NonNull PhoneAccountHandle phoneAccountHandle);
+ @NonNull PhoneAccountHandle phoneAccountHandle,
+ boolean rememberSelection);
@WorkerThread
- void reportIncorrectSuggestion(@NonNull Context context, @NonNull String number);
+ void reportIncorrectSuggestion(
+ @NonNull Context context, @NonNull String number, @NonNull PhoneAccountHandle newAccount);
}
diff --git a/java/com/android/dialer/preferredsim/suggestion/stub/StubSuggestionProvider.java b/java/com/android/dialer/preferredsim/suggestion/stub/StubSuggestionProvider.java
index 6fb73ac5d..bd54ddb3a 100644
--- a/java/com/android/dialer/preferredsim/suggestion/stub/StubSuggestionProvider.java
+++ b/java/com/android/dialer/preferredsim/suggestion/stub/StubSuggestionProvider.java
@@ -40,8 +40,10 @@ public class StubSuggestionProvider implements SuggestionProvider {
public void reportUserSelection(
@NonNull Context context,
@NonNull String number,
- @NonNull PhoneAccountHandle phoneAccountHandle) {}
+ @NonNull PhoneAccountHandle phoneAccountHandle,
+ boolean rememberSelection) {}
@Override
- public void reportIncorrectSuggestion(@NonNull Context context, @NonNull String number) {}
+ public void reportIncorrectSuggestion(
+ @NonNull Context context, @NonNull String number, PhoneAccountHandle newAccount) {}
}