From 5c7524f3354e5121bbea1064a9f13f19e94c276d Mon Sep 17 00:00:00 2001 From: twyen Date: Wed, 15 Nov 2017 18:24:45 -0800 Subject: Send SUB_ID_EXTRA to VoicemailSettingsActivity in Telephony EXTRA_PHONE_ACCOUNT_HANDLE is not implemented in O. subId is required to determine which SIM the settings is for. Bug: 67669006 Test: VoicemailSettingsFragmentTest, TelecomUtilTest PiperOrigin-RevId: 175913331 Change-Id: I84f9e19b711c5baa275d934cfdfd5b7a2d4b6f6d --- java/com/android/dialer/telecom/TelecomUtil.java | 21 ++++++++++++++++ .../settings/VoicemailSettingsFragment.java | 29 ++++++++++++++++++++++ 2 files changed, 50 insertions(+) (limited to 'java/com') diff --git a/java/com/android/dialer/telecom/TelecomUtil.java b/java/com/android/dialer/telecom/TelecomUtil.java index 3bf9b4666..c79d9013d 100644 --- a/java/com/android/dialer/telecom/TelecomUtil.java +++ b/java/com/android/dialer/telecom/TelecomUtil.java @@ -33,9 +33,12 @@ import android.support.v4.content.ContextCompat; import android.telecom.PhoneAccount; import android.telecom.PhoneAccountHandle; import android.telecom.TelecomManager; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; import android.text.TextUtils; import android.util.Pair; import com.android.dialer.common.LogUtil; +import com.google.common.base.Optional; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -145,6 +148,24 @@ public abstract class TelecomUtil { return new ArrayList<>(); } + /** + * @return the {@link SubscriptionInfo} of the SIM if {@code phoneAccountHandle} corresponds to a + * valid SIM. Absent otherwise. + */ + public static Optional getSubscriptionInfo( + @NonNull Context context, @NonNull PhoneAccountHandle phoneAccountHandle) { + if (TextUtils.isEmpty(phoneAccountHandle.getId())) { + return Optional.absent(); + } + SubscriptionManager subscriptionManager = context.getSystemService(SubscriptionManager.class); + for (SubscriptionInfo info : subscriptionManager.getActiveSubscriptionInfoList()) { + if (phoneAccountHandle.getId().startsWith(info.getIccId())) { + return Optional.of(info); + } + } + return Optional.absent(); + } + /** * Returns true if there is a dialer managed call in progress. Self managed calls starting from O * are not included. diff --git a/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java b/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java index 2b496c0ca..aaa1e150d 100644 --- a/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java +++ b/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java @@ -24,16 +24,22 @@ import android.preference.PreferenceScreen; import android.preference.SwitchPreference; import android.provider.Settings; import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; +import android.telecom.PhoneAccount; import android.telecom.PhoneAccountHandle; +import android.telecom.TelecomManager; +import android.telephony.SubscriptionInfo; import android.telephony.TelephonyManager; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; import com.android.dialer.logging.DialerImpression; import com.android.dialer.logging.Logger; import com.android.dialer.notification.NotificationChannelManager; +import com.android.dialer.telecom.TelecomUtil; import com.android.voicemail.VoicemailClient; import com.android.voicemail.VoicemailClient.ActivationStateListener; import com.android.voicemail.VoicemailComponent; +import com.google.common.base.Optional; /** * Fragment for voicemail settings. Requires {@link VoicemailClient#PARAM_PHONE_ACCOUNT_HANDLE} set @@ -45,6 +51,16 @@ public class VoicemailSettingsFragment extends PreferenceFragment private static final String TAG = "VmSettingsActivity"; + // Extras copied from com.android.phone.settings.VoicemailSettingsActivity, + // it does not recognize EXTRA_PHONE_ACCOUNT_HANDLE in O. + @VisibleForTesting + static final String SUB_ID_EXTRA = + "com.android.phone.settings.SubscriptionInfoHelper.SubscriptionId"; + // Extra on intent containing the label of a subscription. + @VisibleForTesting + static final String SUB_LABEL_EXTRA = + "com.android.phone.settings.SubscriptionInfoHelper.SubscriptionLabel"; + @Nullable private PhoneAccountHandle phoneAccountHandle; private VoicemailClient voicemailClient; @@ -167,6 +183,19 @@ public class VoicemailSettingsFragment extends PreferenceFragment advancedSettingsIntent.putExtra(TelephonyManager.EXTRA_HIDE_PUBLIC_SETTINGS, true); advancedSettingsIntent.putExtra( TelephonyManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle); + + // (a bug): EXTRA_PHONE_ACCOUNT_HANDLE not implemented in telephony in O. + Optional subscriptionInfo = + TelecomUtil.getSubscriptionInfo(getContext(), phoneAccountHandle); + if (subscriptionInfo.isPresent()) { + advancedSettingsIntent.putExtra(SUB_ID_EXTRA, subscriptionInfo.get().getSubscriptionId()); + PhoneAccount phoneAccount = + getContext().getSystemService(TelecomManager.class).getPhoneAccount(phoneAccountHandle); + if (phoneAccount != null) { + advancedSettingsIntent.putExtra(SUB_LABEL_EXTRA, phoneAccount.getLabel()); + } + } + advancedSettings.setIntent(advancedSettingsIntent); voicemailChangePinPreference.setOnPreferenceClickListener( new OnPreferenceClickListener() { -- cgit v1.2.3