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
diff --git a/java/com/android/dialer/telecom/TelecomUtil.java b/java/com/android/dialer/telecom/TelecomUtil.java
index 3bf9b46..c79d901 100644
--- a/java/com/android/dialer/telecom/TelecomUtil.java
+++ b/java/com/android/dialer/telecom/TelecomUtil.java
@@ -33,9 +33,12 @@
 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;
@@ -146,6 +149,24 @@
   }
 
   /**
+   * @return the {@link SubscriptionInfo} of the SIM if {@code phoneAccountHandle} corresponds to a
+   *     valid SIM. Absent otherwise.
+   */
+  public static Optional<SubscriptionInfo> 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 2b496c0..aaa1e15 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.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 @@
 
   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 @@
     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> 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() {