Merge "Don't set connection manager for call providers" into lmp-dev
diff --git a/src/com/android/telecomm/CreateConnectionProcessor.java b/src/com/android/telecomm/CreateConnectionProcessor.java
index 5a186f4..8ba73bf 100644
--- a/src/com/android/telecomm/CreateConnectionProcessor.java
+++ b/src/com/android/telecomm/CreateConnectionProcessor.java
@@ -18,6 +18,7 @@
 
 import android.telecomm.ConnectionRequest;
 import android.telecomm.ParcelableConnection;
+import android.telecomm.PhoneAccount;
 import android.telecomm.PhoneAccountHandle;
 import android.telephony.DisconnectCause;
 
@@ -78,10 +79,10 @@
         Log.v(this, "process");
         mAttemptRecords = new ArrayList<>();
         if (mCall.getTargetPhoneAccount() != null) {
-            mAttemptRecords.add(
-                    new CallAttemptRecord(mCall.getTargetPhoneAccount(), mCall.getTargetPhoneAccount()));
+            mAttemptRecords.add(new CallAttemptRecord(
+                    mCall.getTargetPhoneAccount(), mCall.getTargetPhoneAccount()));
         }
-        adjustAttemptsForWifi();
+        adjustAttemptsForConnectionManager();
         adjustAttemptsForEmergency();
         mAttemptRecordIterator = mAttemptRecords.iterator();
         attemptNextPhoneAccount();
@@ -134,28 +135,50 @@
         }
     }
 
-    // If there exists a registered Wi-Fi calling service, use it.
-    private void adjustAttemptsForWifi() {
-        switch (mAttemptRecords.size()) {
-            case 0:
-                return;
-            case 1:
-                break;
-            default:
-                Log.d(this, "Unexpectedly have > 1 attempt: %s", mAttemptRecords);
-                return;
+    private boolean shouldSetConnectionManager() {
+        if (mAttemptRecords.size() == 0) {
+            return false;
         }
-        PhoneAccountHandle simCallManager =
-                TelecommApp.getInstance().getPhoneAccountRegistrar().getSimCallManager();
 
-        Log.d(this, "adjustAttemptsForWifi finds simCallManager = %s", simCallManager);
-        if (simCallManager != null &&
-                !Objects.equals(simCallManager, mAttemptRecords.get(0).targetPhoneAccount)) {
-            mAttemptRecords.set(
-                    0,
-                    new CallAttemptRecord(
-                            simCallManager,
-                            mAttemptRecords.get(0).targetPhoneAccount));
+        if (mAttemptRecords.size() > 1) {
+            Log.d(this, "shouldSetConnectionManager, error, mAttemptRecords should not have more "
+                    + "than 1 record");
+            return false;
+        }
+
+        PhoneAccountRegistrar registrar = TelecommApp.getInstance().getPhoneAccountRegistrar();
+        PhoneAccountHandle connectionManager = registrar.getSimCallManager();
+        if (connectionManager == null) {
+            return false;
+        }
+
+        PhoneAccountHandle targetPhoneAccountHandle = mAttemptRecords.get(0).targetPhoneAccount;
+        if (Objects.equals(connectionManager, targetPhoneAccountHandle)) {
+            return false;
+        }
+
+        // Connection managers are only allowed to manage SIM subscriptions.
+        PhoneAccount targetPhoneAccount = registrar.getPhoneAccount(targetPhoneAccountHandle);
+        boolean isSimSubscription = (targetPhoneAccount.getCapabilities() &
+                PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION) != 0;
+        if (!isSimSubscription) {
+            return false;
+        }
+
+        return true;
+    }
+
+    // If there exists a registered connection manager then use it.
+    private void adjustAttemptsForConnectionManager() {
+        if (shouldSetConnectionManager()) {
+            CallAttemptRecord record = new CallAttemptRecord(
+                    TelecommApp.getInstance().getPhoneAccountRegistrar().getSimCallManager(),
+                    mAttemptRecords.get(0).targetPhoneAccount);
+            Log.v(this, "setConnectionManager, changing %s -> %s",
+                    mAttemptRecords.get(0).targetPhoneAccount, record);
+            mAttemptRecords.set(0, record);
+        } else {
+            Log.v(this, "setConnectionManager, not changing");
         }
     }