Unify voicemail call placing

All voicemails are called by using CallIntentBuilder.forVoicemail() so the PhoneAccountHandle can be designated. A future CL will use dialogs to customize the call (multi SIM selection, RTT, etc.)

As a result voicemail error messages and legacy voicemail notifications will call the account it is received from directly.

Bug: 64216442
Test: Unit tests
PiperOrigin-RevId: 174784322
Change-Id: Ibe1c57bc7852e3d55a39a0cc2da19b6a79954c0f
diff --git a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
index fa73bb2..1c106a7 100644
--- a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
+++ b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
@@ -547,7 +547,7 @@
       case CallbackAction.VOICE:
         if (mCallLogCache.isVoicemailNumber(accountHandle, number)) {
           // Call to generic voicemail number, in case there are multiple accounts
-          primaryActionButtonView.setTag(IntentProvider.getReturnVoicemailCallIntentProvider());
+          primaryActionButtonView.setTag(IntentProvider.getReturnVoicemailCallIntentProvider(null));
         } else if (canSupportAssistedDialing()) {
           primaryActionButtonView.setTag(
               IntentProvider.getAssistedDialIntentProvider(
diff --git a/java/com/android/dialer/app/calllog/IntentProvider.java b/java/com/android/dialer/app/calllog/IntentProvider.java
index c812bf8..36e62c3 100644
--- a/java/com/android/dialer/app/calllog/IntentProvider.java
+++ b/java/com/android/dialer/app/calllog/IntentProvider.java
@@ -21,6 +21,7 @@
 import android.content.Intent;
 import android.net.Uri;
 import android.provider.ContactsContract;
+import android.support.annotation.Nullable;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.TelephonyManager;
 import com.android.contacts.common.model.Contact;
@@ -32,7 +33,6 @@
 import com.android.dialer.callintent.CallIntentBuilder;
 import com.android.dialer.dialercontact.DialerContact;
 import com.android.dialer.duo.DuoComponent;
-import com.android.dialer.util.CallUtil;
 import com.android.dialer.util.IntentUtil;
 import java.util.ArrayList;
 
@@ -100,11 +100,12 @@
     };
   }
 
-  public static IntentProvider getReturnVoicemailCallIntentProvider() {
+  public static IntentProvider getReturnVoicemailCallIntentProvider(
+      @Nullable PhoneAccountHandle phoneAccountHandle) {
     return new IntentProvider() {
       @Override
       public Intent getIntent(Context context) {
-        return new CallIntentBuilder(CallUtil.getVoicemailUri(), CallInitiationType.Type.CALL_LOG)
+        return CallIntentBuilder.forVoicemail(phoneAccountHandle, CallInitiationType.Type.CALL_LOG)
             .build();
       }
     };
diff --git a/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java b/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java
index 9c8b146..4786ca6 100644
--- a/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java
+++ b/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java
@@ -66,7 +66,7 @@
       return new VoicemailErrorMessage(
           context.getString(R.string.voicemail_error_activating_title),
           context.getString(R.string.voicemail_error_activating_message),
-          VoicemailErrorMessage.createCallVoicemailAction(context));
+          VoicemailErrorMessage.createCallVoicemailAction(context, status.getPhoneAccountHandle()));
     }
 
     if (Status.NOTIFICATION_CHANNEL_STATE_NO_CONNECTION == status.notificationChannelState) {
@@ -77,7 +77,7 @@
       return new VoicemailErrorMessage(
           context.getString(R.string.voicemail_error_activation_failed_title),
           context.getString(R.string.voicemail_error_activation_failed_message),
-          VoicemailErrorMessage.createCallVoicemailAction(context),
+          VoicemailErrorMessage.createCallVoicemailAction(context, status.getPhoneAccountHandle()),
           VoicemailErrorMessage.createRetryAction(context, status));
     }
 
@@ -85,7 +85,7 @@
       return new VoicemailErrorMessage(
           context.getString(R.string.voicemail_error_no_data_title),
           context.getString(R.string.voicemail_error_no_data_message),
-          VoicemailErrorMessage.createCallVoicemailAction(context),
+          VoicemailErrorMessage.createCallVoicemailAction(context, status.getPhoneAccountHandle()),
           VoicemailErrorMessage.createRetryAction(context, status));
     }
 
@@ -93,7 +93,7 @@
       return new VoicemailErrorMessage(
           context.getString(R.string.voicemail_error_no_data_title),
           context.getString(R.string.voicemail_error_no_data_cellular_required_message),
-          VoicemailErrorMessage.createCallVoicemailAction(context),
+          VoicemailErrorMessage.createCallVoicemailAction(context, status.getPhoneAccountHandle()),
           VoicemailErrorMessage.createRetryAction(context, status));
     }
 
@@ -101,7 +101,7 @@
       return new VoicemailErrorMessage(
           context.getString(R.string.voicemail_error_bad_config_title),
           context.getString(R.string.voicemail_error_bad_config_message),
-          VoicemailErrorMessage.createCallVoicemailAction(context),
+          VoicemailErrorMessage.createCallVoicemailAction(context, status.getPhoneAccountHandle()),
           VoicemailErrorMessage.createRetryAction(context, status));
     }
 
@@ -109,7 +109,7 @@
       return new VoicemailErrorMessage(
           context.getString(R.string.voicemail_error_communication_title),
           context.getString(R.string.voicemail_error_communication_message),
-          VoicemailErrorMessage.createCallVoicemailAction(context),
+          VoicemailErrorMessage.createCallVoicemailAction(context, status.getPhoneAccountHandle()),
           VoicemailErrorMessage.createRetryAction(context, status));
     }
 
@@ -117,7 +117,7 @@
       return new VoicemailErrorMessage(
           context.getString(R.string.voicemail_error_server_title),
           context.getString(R.string.voicemail_error_server_message),
-          VoicemailErrorMessage.createCallVoicemailAction(context),
+          VoicemailErrorMessage.createCallVoicemailAction(context, status.getPhoneAccountHandle()),
           VoicemailErrorMessage.createRetryAction(context, status));
     }
 
@@ -125,7 +125,7 @@
       return new VoicemailErrorMessage(
           context.getString(R.string.voicemail_error_server_connection_title),
           context.getString(R.string.voicemail_error_server_connection_message),
-          VoicemailErrorMessage.createCallVoicemailAction(context),
+          VoicemailErrorMessage.createCallVoicemailAction(context, status.getPhoneAccountHandle()),
           VoicemailErrorMessage.createRetryAction(context, status));
     }
 
diff --git a/java/com/android/dialer/app/voicemail/error/VoicemailErrorMessage.java b/java/com/android/dialer/app/voicemail/error/VoicemailErrorMessage.java
index ab269f6..7cc6cda 100644
--- a/java/com/android/dialer/app/voicemail/error/VoicemailErrorMessage.java
+++ b/java/com/android/dialer/app/voicemail/error/VoicemailErrorMessage.java
@@ -25,11 +25,12 @@
 import android.telecom.PhoneAccountHandle;
 import android.view.View;
 import android.view.View.OnClickListener;
+import com.android.dialer.callintent.CallInitiationType;
+import com.android.dialer.callintent.CallIntentBuilder;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.PerAccountSharedPreferences;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
-import com.android.dialer.util.CallUtil;
 import com.android.dialer.voicemail.settings.VoicemailChangePinActivity;
 import com.android.voicemail.VoicemailClient;
 import com.android.voicemail.VoicemailComponent;
@@ -156,15 +157,18 @@
   }
 
   @NonNull
-  public static Action createCallVoicemailAction(final Context context) {
+  public static Action createCallVoicemailAction(
+      final Context context, final PhoneAccountHandle phoneAccountHandle) {
     return new Action(
         context.getString(R.string.voicemail_action_call_voicemail),
         new OnClickListener() {
           @Override
           public void onClick(View v) {
             Logger.get(context).logImpression(DialerImpression.Type.VVM_CALL_VOICEMAIL_CLICKED);
-            Intent intent = new Intent(Intent.ACTION_CALL, CallUtil.getVoicemailUri());
-            context.startActivity(intent);
+            context.startActivity(
+                CallIntentBuilder.forVoicemail(
+                        phoneAccountHandle, CallInitiationType.Type.VOICEMAIL_ERROR_MESSAGE)
+                    .build());
           }
         });
   }
diff --git a/java/com/android/dialer/app/voicemail/error/VoicemailStatus.java b/java/com/android/dialer/app/voicemail/error/VoicemailStatus.java
index 1cfbe86..a832b5d 100644
--- a/java/com/android/dialer/app/voicemail/error/VoicemailStatus.java
+++ b/java/com/android/dialer/app/voicemail/error/VoicemailStatus.java
@@ -30,6 +30,7 @@
 import android.telecom.PhoneAccountHandle;
 import android.telephony.ServiceState;
 import android.telephony.TelephonyManager;
+import android.text.TextUtils;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.database.VoicemailStatusQuery;
 
@@ -293,8 +294,15 @@
     return cursor.getString(index);
   }
 
+  @Nullable
   public PhoneAccountHandle getPhoneAccountHandle() {
-    return new PhoneAccountHandle(
-        ComponentName.unflattenFromString(phoneAccountComponentName), phoneAccountId);
+    if (TextUtils.isEmpty(phoneAccountComponentName) || TextUtils.isEmpty(phoneAccountId)) {
+      return null;
+    }
+    ComponentName componentName = ComponentName.unflattenFromString(phoneAccountComponentName);
+    if (componentName == null) {
+      return null;
+    }
+    return new PhoneAccountHandle(componentName, phoneAccountId);
   }
 }
diff --git a/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java b/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java
index 748b814..d10c7da 100644
--- a/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java
+++ b/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java
@@ -167,7 +167,7 @@
       return new VoicemailErrorMessage(
           context.getString(R.string.vvm3_error_unknown_user_title),
           getCustomerSupportString(context, R.string.vvm3_error_unknown_user_message),
-          VoicemailErrorMessage.createCallVoicemailAction(context),
+          VoicemailErrorMessage.createCallVoicemailAction(context, status.getPhoneAccountHandle()),
           createCallCustomerSupportAction(context));
     }
 
@@ -175,7 +175,7 @@
       return new VoicemailErrorMessage(
           context.getString(R.string.vvm3_error_unknown_device_title),
           getCustomerSupportString(context, R.string.vvm3_error_unknown_device_message),
-          VoicemailErrorMessage.createCallVoicemailAction(context),
+          VoicemailErrorMessage.createCallVoicemailAction(context, status.getPhoneAccountHandle()),
           createCallCustomerSupportAction(context));
     }
 
@@ -183,7 +183,7 @@
       return new VoicemailErrorMessage(
           context.getString(R.string.vvm3_error_invalid_password_title),
           getCustomerSupportString(context, R.string.vvm3_error_invalid_password_message),
-          VoicemailErrorMessage.createCallVoicemailAction(context),
+          VoicemailErrorMessage.createCallVoicemailAction(context, status.getPhoneAccountHandle()),
           createCallCustomerSupportAction(context));
     }
 
@@ -219,7 +219,7 @@
       return new VoicemailErrorMessage(
           context.getString(R.string.vvm3_error_subscriber_unknown_title),
           getCustomerSupportString(context, R.string.vvm3_error_subscriber_unknown_message),
-          VoicemailErrorMessage.createCallVoicemailAction(context),
+          VoicemailErrorMessage.createCallVoicemailAction(context, status.getPhoneAccountHandle()),
           createCallCustomerSupportAction(context));
     }
 
@@ -227,7 +227,7 @@
       return new VoicemailErrorMessage(
           context.getString(R.string.vvm3_error_imap_getquota_error_title),
           getCustomerSupportString(context, R.string.vvm3_error_imap_getquota_error_message),
-          VoicemailErrorMessage.createCallVoicemailAction(context),
+          VoicemailErrorMessage.createCallVoicemailAction(context, status.getPhoneAccountHandle()),
           createCallCustomerSupportAction(context));
     }
 
@@ -235,7 +235,7 @@
       return new VoicemailErrorMessage(
           context.getString(R.string.vvm3_error_imap_select_error_title),
           getCustomerSupportString(context, R.string.vvm3_error_imap_select_error_message),
-          VoicemailErrorMessage.createCallVoicemailAction(context),
+          VoicemailErrorMessage.createCallVoicemailAction(context, status.getPhoneAccountHandle()),
           createCallCustomerSupportAction(context));
     }
 
@@ -243,7 +243,7 @@
       return new VoicemailErrorMessage(
           context.getString(R.string.vvm3_error_imap_error_title),
           getCustomerSupportString(context, R.string.vvm3_error_imap_error_message),
-          VoicemailErrorMessage.createCallVoicemailAction(context),
+          VoicemailErrorMessage.createCallVoicemailAction(context, status.getPhoneAccountHandle()),
           createCallCustomerSupportAction(context));
     }
 
diff --git a/java/com/android/dialer/callintent/CallIntentBuilder.java b/java/com/android/dialer/callintent/CallIntentBuilder.java
index 2bbd124..25a5803 100644
--- a/java/com/android/dialer/callintent/CallIntentBuilder.java
+++ b/java/com/android/dialer/callintent/CallIntentBuilder.java
@@ -96,6 +96,13 @@
     this(CallUtil.getCallUri(Assert.isNotNull(number)), callInitiationType);
   }
 
+  public static CallIntentBuilder forVoicemail(
+      @Nullable PhoneAccountHandle phoneAccountHandle, CallInitiationType.Type callInitiationType) {
+    return new CallIntentBuilder(
+            Uri.fromParts(PhoneAccount.SCHEME_VOICEMAIL, "", null), callInitiationType)
+        .setPhoneAccountHandle(phoneAccountHandle);
+  }
+
   public CallSpecificAppData getCallSpecificAppData() {
     return callSpecificAppData;
   }
diff --git a/java/com/android/dialer/callintent/call_initiation_type.proto b/java/com/android/dialer/callintent/call_initiation_type.proto
index 32e4e49..27d4461 100644
--- a/java/com/android/dialer/callintent/call_initiation_type.proto
+++ b/java/com/android/dialer/callintent/call_initiation_type.proto
@@ -60,5 +60,9 @@
     CALL_SUBJECT_DIALOG = 16;
 
     IMS_VIDEO_BLOCKED_FALLBACK_TO_VOICE = 17;
+
+    LEGACY_VOICEMAIL_NOTIFICATION = 18;
+
+    VOICEMAIL_ERROR_MESSAGE = 19;
   }
 }
diff --git a/java/com/android/dialer/dialpadview/DialpadFragment.java b/java/com/android/dialer/dialpadview/DialpadFragment.java
index 1f83d55..659d120 100644
--- a/java/com/android/dialer/dialpadview/DialpadFragment.java
+++ b/java/com/android/dialer/dialpadview/DialpadFragment.java
@@ -999,7 +999,7 @@
   public void callVoicemail() {
     DialerUtils.startActivityWithErrorToast(
         getActivity(),
-        new CallIntentBuilder(CallUtil.getVoicemailUri(), CallInitiationType.Type.DIALPAD).build());
+        CallIntentBuilder.forVoicemail(null, CallInitiationType.Type.DIALPAD).build());
     hideAndClearDialpad();
   }
 
diff --git a/java/com/android/dialer/util/CallUtil.java b/java/com/android/dialer/util/CallUtil.java
index 0afe930..22cab87 100644
--- a/java/com/android/dialer/util/CallUtil.java
+++ b/java/com/android/dialer/util/CallUtil.java
@@ -52,11 +52,6 @@
     return Uri.fromParts(PhoneAccount.SCHEME_TEL, number, null);
   }
 
-  /** @return Uri that directly dials a user's voicemail inbox. */
-  public static Uri getVoicemailUri() {
-    return Uri.fromParts(PhoneAccount.SCHEME_VOICEMAIL, "", null);
-  }
-
   /**
    * Determines if video calling is available, and if so whether presence checking is available as
    * well.
diff --git a/java/com/android/voicemail/impl/sms/LegacyModeSmsHandler.java b/java/com/android/voicemail/impl/sms/LegacyModeSmsHandler.java
index d55e3b5..2f8dc7a 100644
--- a/java/com/android/voicemail/impl/sms/LegacyModeSmsHandler.java
+++ b/java/com/android/voicemail/impl/sms/LegacyModeSmsHandler.java
@@ -20,14 +20,14 @@
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
-import android.net.Uri;
 import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
-import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.TelephonyManager;
 import android.telephony.VisualVoicemailSms;
+import com.android.dialer.callintent.CallInitiationType;
+import com.android.dialer.callintent.CallIntentBuilder;
 import com.android.voicemail.VoicemailClient;
 import com.android.voicemail.impl.OmtpConstants;
 import com.android.voicemail.impl.OmtpVvmCarrierConfigHelper;
@@ -94,8 +94,9 @@
           PendingIntent.getActivity(
               context,
               CALL_VOICEMAIL_REQUEST_CODE,
-              new Intent(
-                  Intent.ACTION_CALL, Uri.fromParts(PhoneAccount.SCHEME_VOICEMAIL, "", null)),
+              CallIntentBuilder.forVoicemail(
+                      phoneAccountHandle, CallInitiationType.Type.LEGACY_VOICEMAIL_NOTIFICATION)
+                  .build(),
               PendingIntent.FLAG_UPDATE_CURRENT);
     } else {
       Intent launchVoicemailSettingsIntent =