summaryrefslogtreecommitdiffstats
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)
downloadandroid_packages_apps_Dialer-04306a75588b58208758f43821e1898c6f125baf.tar.gz
android_packages_apps_Dialer-04306a75588b58208758f43821e1898c6f125baf.tar.bz2
android_packages_apps_Dialer-04306a75588b58208758f43821e1898c6f125baf.zip
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) {}
}