From 04306a75588b58208758f43821e1898c6f125baf Mon Sep 17 00:00:00 2001 From: twyen Date: Thu, 25 Jan 2018 16:14:15 -0800 Subject: 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 --- .../dialer/preferredsim/PreferredAccountUtil.java | 116 +++++++++++++++++++++ .../suggestion/SuggestionProvider.java | 6 +- .../suggestion/stub/StubSuggestionProvider.java | 6 +- 3 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 java/com/android/dialer/preferredsim/PreferredAccountUtil.java (limited to 'java/com/android/dialer/preferredsim') 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 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 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) {} } -- cgit v1.2.3