Merge "Add a subId extra to the respond via SMS intent." into lmp-mr1-dev
diff --git a/src/com/android/server/telecom/Call.java b/src/com/android/server/telecom/Call.java
index 36048dd..1c842da 100644
--- a/src/com/android/server/telecom/Call.java
+++ b/src/com/android/server/telecom/Call.java
@@ -382,12 +382,21 @@
     void setState(int newState) {
         if (mState != newState) {
             Log.v(this, "setState %s -> %s", mState, newState);
+            int oldState = mState;
             mState = newState;
             maybeLoadCannedSmsResponses();
 
             if (mState == CallState.DISCONNECTED) {
                 setLocallyDisconnecting(false);
                 fixParentAfterDisconnect();
+                if ((oldState == CallState.DIALING || oldState == CallState.CONNECTING)
+                        && mCreateConnectionProcessor != null
+                        && mCreateConnectionProcessor.isProcessingComplete()
+                        && mCreateConnectionProcessor.hasMorePhoneAccounts()
+                        && mDisconnectCause != null
+                        && mDisconnectCause.getCode() == DisconnectCause.ERROR) {
+                    mCreateConnectionProcessor.continueProcessingIfPossible(this, mDisconnectCause);
+                }
             }
         }
     }
@@ -689,7 +698,6 @@
             CallIdMapper idMapper,
             ParcelableConnection connection) {
         Log.v(this, "handleCreateConnectionSuccessful %s", connection);
-        mCreateConnectionProcessor = null;
         setTargetPhoneAccount(connection.getPhoneAccount());
         setHandle(connection.getHandle(), connection.getHandlePresentation());
         setCallerDisplayName(
@@ -731,7 +739,6 @@
 
     @Override
     public void handleCreateConnectionFailure(DisconnectCause disconnectCause) {
-        mCreateConnectionProcessor = null;
         clearConnectionService();
         setDisconnectCause(disconnectCause);
         CallsManager.getInstance().markCallAsDisconnected(this, disconnectCause);
@@ -806,7 +813,8 @@
     }
 
     void abort(boolean wasViaNewOutgoingCallBroadcaster) {
-        if (mCreateConnectionProcessor != null) {
+        if (mCreateConnectionProcessor != null &&
+                !mCreateConnectionProcessor.isProcessingComplete()) {
             mCreateConnectionProcessor.abort();
         } else if (mState == CallState.NEW || mState == CallState.PRE_DIAL_WAIT
                 || mState == CallState.CONNECTING) {
diff --git a/src/com/android/server/telecom/CreateConnectionProcessor.java b/src/com/android/server/telecom/CreateConnectionProcessor.java
index f31f423..5d21d1a 100644
--- a/src/com/android/server/telecom/CreateConnectionProcessor.java
+++ b/src/com/android/server/telecom/CreateConnectionProcessor.java
@@ -101,6 +101,10 @@
         mContext = context;
     }
 
+    boolean isProcessingComplete() {
+        return mResponse == null;
+    }
+
     void process() {
         Log.v(this, "process");
         mAttemptRecords = new ArrayList<>();
@@ -114,6 +118,18 @@
         attemptNextPhoneAccount();
     }
 
+    boolean hasMorePhoneAccounts() {
+        return mAttemptRecordIterator.hasNext();
+    }
+
+    void continueProcessingIfPossible(CreateConnectionResponse response,
+            DisconnectCause disconnectCause) {
+        Log.v(this, "continueProcessingIfPossible");
+        mResponse = response;
+        mLastErrorDisconnectCause = disconnectCause;
+        attemptNextPhoneAccount();
+    }
+
     void abort() {
         Log.v(this, "abort");
 
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index f3ea392..df7e93e 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -73,6 +73,7 @@
                 <action android:name="android.telecom.testapps.ACTION_NEW_UNKNOWN_CALL" />
                 <category android:name="android.intent.category.DEFAULT" />
                 <data android:scheme="tel" />
+                <data android:scheme="sip" />
             </intent-filter>
         </activity>