Bypass Dialpad code and allow InCallUI check voicemail number for MSIM.

Since user needs to select a subscription before Dialer can check whether a
voicemail number is set up for a certain subscription, go directly to
calling voicemail when the user dials '1' on a MSIM phone where 'Ask
first' is set.

Bug:18233678
Change-Id: I10dd56c14bfb98e4f8410e2de400da44e328682f
diff --git a/src/com/android/dialer/SpecialCharSequenceMgr.java b/src/com/android/dialer/SpecialCharSequenceMgr.java
index 2e35019..f466c41 100644
--- a/src/com/android/dialer/SpecialCharSequenceMgr.java
+++ b/src/com/android/dialer/SpecialCharSequenceMgr.java
@@ -205,16 +205,16 @@
 
                 final TelecomManager telecomManager =
                         (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
-                List<PhoneAccountHandle> phoneAccountHandles =
+                List<PhoneAccountHandle> subscriptionAccountHandles =
                         PhoneAccountUtils.getSubscriptionPhoneAccounts(context);
 
-                boolean hasUserSelectedDefault = hasDefaultSubscriptionAccount(
-                        telecomManager.getUserSelectedOutgoingPhoneAccount(), phoneAccountHandles);
+                boolean hasUserSelectedDefault = subscriptionAccountHandles.contains(
+                        telecomManager.getUserSelectedOutgoingPhoneAccount());
 
-                if (phoneAccountHandles.size() == 1 || hasUserSelectedDefault) {
+                if (subscriptionAccountHandles.size() == 1 || hasUserSelectedDefault) {
                     Uri uri = telecomManager.getAdnUriForPhoneAccount(null);
                     handleAdnQuery(handler, sc, uri);
-                } else if (phoneAccountHandles.size() > 1){
+                } else if (subscriptionAccountHandles.size() > 1){
                     SelectPhoneAccountListener listener = new SelectPhoneAccountListener() {
                         @Override
                         public void onPhoneAccountSelected(PhoneAccountHandle selectedAccountHandle,
@@ -229,7 +229,7 @@
                     };
 
                     SelectPhoneAccountDialogFragment.showAccountDialog(
-                            ((Activity) context).getFragmentManager(), phoneAccountHandles,
+                            ((Activity) context).getFragmentManager(), subscriptionAccountHandles,
                             listener);
                 } else {
                     return false;
@@ -268,16 +268,16 @@
         if ((input.startsWith("**04") || input.startsWith("**05")) && input.endsWith("#")) {
             final TelecomManager telecomManager =
                     (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
-            List<PhoneAccountHandle> phoneAccountHandles =
+            List<PhoneAccountHandle> subscriptionAccountHandles =
                     PhoneAccountUtils.getSubscriptionPhoneAccounts(context);
-            boolean hasUserSelectedDefault = hasDefaultSubscriptionAccount(
-                    telecomManager.getUserSelectedOutgoingPhoneAccount(), phoneAccountHandles);
+            boolean hasUserSelectedDefault = subscriptionAccountHandles.contains(
+                    telecomManager.getUserSelectedOutgoingPhoneAccount());
 
-            if (phoneAccountHandles.size() == 1 || hasUserSelectedDefault) {
+            if (subscriptionAccountHandles.size() == 1 || hasUserSelectedDefault) {
                 // Don't bring up the dialog for single-SIM or if the default outgoing account is
                 // a subscription account.
                 return telecomManager.handleMmi(input);
-            } else if (phoneAccountHandles.size() > 1){
+            } else if (subscriptionAccountHandles.size() > 1){
                 SelectPhoneAccountListener listener = new SelectPhoneAccountListener() {
                     @Override
                     public void onPhoneAccountSelected(PhoneAccountHandle selectedAccountHandle,
@@ -290,7 +290,7 @@
                 };
 
                 SelectPhoneAccountDialogFragment.showAccountDialog(
-                        ((Activity) context).getFragmentManager(), phoneAccountHandles,
+                        ((Activity) context).getFragmentManager(), subscriptionAccountHandles,
                         listener);
             }
             return true;
@@ -298,20 +298,6 @@
         return false;
     }
 
-    /**
-     * Check if the default outgoing phone account set is a subscription phone account.
-     */
-    static private boolean hasDefaultSubscriptionAccount(PhoneAccountHandle defaultOutgoingAccount,
-            List<PhoneAccountHandle> phoneAccountHandles) {
-        for (PhoneAccountHandle accountHandle : phoneAccountHandles) {
-            if (accountHandle.equals(defaultOutgoingAccount)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-
     // TODO: Use TelephonyCapabilities.getDeviceIdLabel() to get the device id label instead of a
     // hard-coded string.
     static boolean handleDeviceIdDisplay(Context context, String input) {
diff --git a/src/com/android/dialer/dialpad/DialpadFragment.java b/src/com/android/dialer/dialpad/DialpadFragment.java
index 3212076..0f5a333 100644
--- a/src/com/android/dialer/dialpad/DialpadFragment.java
+++ b/src/com/android/dialer/dialpad/DialpadFragment.java
@@ -39,6 +39,7 @@
 import android.provider.Contacts.PhonesColumns;
 import android.provider.Settings;
 import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.PhoneStateListener;
@@ -77,6 +78,7 @@
 import com.android.dialer.NeededForReflection;
 import com.android.dialer.R;
 import com.android.dialer.SpecialCharSequenceMgr;
+import com.android.dialer.calllog.PhoneAccountUtils;
 import com.android.dialer.util.DialerUtils;
 import com.android.phone.common.CallLogAsync;
 import com.android.phone.common.HapticFeedback;
@@ -87,6 +89,7 @@
 import com.google.common.annotations.VisibleForTesting;
 
 import java.util.HashSet;
+import java.util.List;
 
 /**
  * Fragment that displays a twelve-key phone dialpad.
@@ -908,7 +911,16 @@
                     // We'll try to initiate voicemail and thus we want to remove irrelevant string.
                     removePreviousDigitIfPossible();
 
-                    if (isVoicemailAvailable()) {
+                    List<PhoneAccountHandle> subscriptionAccountHandles =
+                            PhoneAccountUtils.getSubscriptionPhoneAccounts(getActivity());
+                    boolean hasUserSelectedDefault = subscriptionAccountHandles.contains(
+                            getTelecomManager().getUserSelectedOutgoingPhoneAccount());
+                    boolean multiSim = subscriptionAccountHandles.size() > 1;
+
+                    if ((multiSim && !hasUserSelectedDefault) || isVoicemailAvailable()) {
+                        // On a multi-SIM phone, if the user has not selected a default
+                        // subscription, initiate a call to voicemail so they can select an account
+                        // from the "Call with" dialog.
                         callVoicemail();
                     } else if (getActivity() != null) {
                         // Voicemail is unavailable maybe because Airplane mode is turned on.