Merge cherrypicks of [8655472, 8655254, 8655915, 8655916, 8655554, 8655935, 8655917, 8655800, 8655789, 8655473, 8655918, 8655474, 8655408, 8655351] into qt-release

Change-Id: I757b5406c0e6c60a1fb53f3705976b691884d7ea
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index aa87c32..d6bd975 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -1841,7 +1841,7 @@
             mPendingUnredirectedOutgoingCallInfo.remove(callId);
         } else {
             Log.w(this, "processRedirectedOutgoingCallAfterUserInteraction for non-matched Call ID"
-                    + " %s with handle %s and phoneAccountHandle %s", callId);
+                    + " %s", callId);
         }
     }
 
diff --git a/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java b/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java
index 51ddd8e..7a641af 100644
--- a/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java
+++ b/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java
@@ -288,6 +288,7 @@
                     return result;
                 } else {
                     result.callImmediately = true;
+                    result.requestRedirection = false;
                 }
             }
         } else if (Intent.ACTION_CALL_EMERGENCY.equals(action)) {
@@ -298,6 +299,7 @@
                 return result;
             }
             result.callImmediately = true;
+            result.requestRedirection = false;
         } else {
             Log.w(this, "Unhandled Intent %s. Ignoring and not placing call.", intent);
             result.disconnectCause = DisconnectCause.INVALID_NUMBER;
diff --git a/src/com/android/server/telecom/ui/CallRedirectionConfirmDialogActivity.java b/src/com/android/server/telecom/ui/CallRedirectionConfirmDialogActivity.java
index 32b0960..0d3599e 100644
--- a/src/com/android/server/telecom/ui/CallRedirectionConfirmDialogActivity.java
+++ b/src/com/android/server/telecom/ui/CallRedirectionConfirmDialogActivity.java
@@ -43,19 +43,38 @@
     public static final String EXTRA_REDIRECTION_APP_NAME =
             "android.telecom.extra.REDIRECTION_APP_NAME";
 
+    private String mCallId;
+    private AlertDialog mConfirmDialog;
+    /**
+     * Tracks whether the activity has stopped due to a loss of focus (e.g. use hitting the home
+     * button) or whether its going to stop because a button in the dialog was pressed.
+     */
+    private boolean mHasLostFocus = true;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         Log.i(this, "CallRedirectionConfirmDialogActivity onCreate.");
         final CharSequence redirectionAppName = getIntent().getStringExtra(
                 EXTRA_REDIRECTION_APP_NAME);
+        mCallId = getIntent().getStringExtra(EXTRA_REDIRECTION_OUTGOING_CALL_ID);
         showDialog(redirectionAppName);
     }
 
+    @Override
+    protected void onStop() {
+        super.onStop();
+        if (mHasLostFocus) {
+            Log.i(this, "onStop: dialog lost focus; canceling redirection for call %s", mCallId);
+            mConfirmDialog.dismiss();
+            cancelRedirection();
+        }
+    }
+
     private void showDialog(final CharSequence redirectionAppName) {
         Log.i(this, "showDialog: confirming redirection with %s", redirectionAppName);
 
-        final AlertDialog confirmDialog = new AlertDialog.Builder(this).create();
+        mConfirmDialog = new AlertDialog.Builder(this).create();
         LayoutInflater layoutInflater = LayoutInflater.from(this);
         View dialogView = layoutInflater.inflate(R.layout.call_redirection_confirm_dialog, null);
 
@@ -67,10 +86,10 @@
                         TelecomBroadcastIntentProcessor.ACTION_PLACE_UNREDIRECTED_CALL,
                         null, CallRedirectionConfirmDialogActivity.this,
                         TelecomBroadcastReceiver.class);
-                proceedWithoutRedirectedCall.putExtra(EXTRA_REDIRECTION_OUTGOING_CALL_ID,
-                        getIntent().getStringExtra(EXTRA_REDIRECTION_OUTGOING_CALL_ID));
+                proceedWithoutRedirectedCall.putExtra(EXTRA_REDIRECTION_OUTGOING_CALL_ID, mCallId);
                 sendBroadcast(proceedWithoutRedirectedCall);
-                confirmDialog.dismiss();
+                mConfirmDialog.dismiss();
+                mHasLostFocus = false;
                 finish();
             }
         });
@@ -86,10 +105,10 @@
                                 .ACTION_PLACE_REDIRECTED_CALL, null,
                         CallRedirectionConfirmDialogActivity.this,
                         TelecomBroadcastReceiver.class);
-                proceedWithRedirectedCall.putExtra(EXTRA_REDIRECTION_OUTGOING_CALL_ID,
-                        getIntent().getStringExtra(EXTRA_REDIRECTION_OUTGOING_CALL_ID));
+                proceedWithRedirectedCall.putExtra(EXTRA_REDIRECTION_OUTGOING_CALL_ID, mCallId);
                 sendBroadcast(proceedWithRedirectedCall);
-                confirmDialog.dismiss();
+                mConfirmDialog.dismiss();
+                mHasLostFocus = false;
                 finish();
             }
         });
@@ -101,36 +120,42 @@
                         TelecomBroadcastIntentProcessor.ACTION_CANCEL_REDIRECTED_CALL,
                         null, CallRedirectionConfirmDialogActivity.this,
                         TelecomBroadcastReceiver.class);
-                cancelRedirectedCall.putExtra(EXTRA_REDIRECTION_OUTGOING_CALL_ID,
-                        getIntent().getStringExtra(EXTRA_REDIRECTION_OUTGOING_CALL_ID));
+                cancelRedirectedCall.putExtra(EXTRA_REDIRECTION_OUTGOING_CALL_ID, mCallId);
                 sendBroadcast(cancelRedirectedCall);
-                confirmDialog.dismiss();
+                mConfirmDialog.dismiss();
+                mHasLostFocus = false;
                 finish();
             }
         });
 
-        confirmDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
+        mConfirmDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
             @Override
             public void onCancel(DialogInterface dialog) {
-                Intent cancelRedirectedCall = new Intent(
-                        TelecomBroadcastIntentProcessor.ACTION_CANCEL_REDIRECTED_CALL,
-                        null, CallRedirectionConfirmDialogActivity.this,
-                        TelecomBroadcastReceiver.class);
-                cancelRedirectedCall.putExtra(EXTRA_REDIRECTION_OUTGOING_CALL_ID,
-                        getIntent().getStringExtra(EXTRA_REDIRECTION_OUTGOING_CALL_ID));
-                sendBroadcast(cancelRedirectedCall);
+                cancelRedirection();
                 dialog.dismiss();
+                mHasLostFocus = false;
                 finish();
             }
         });
 
-        confirmDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+        mConfirmDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
 
-        confirmDialog.setCancelable(false);
-        confirmDialog.setCanceledOnTouchOutside(false);
+        mConfirmDialog.setCancelable(false);
+        mConfirmDialog.setCanceledOnTouchOutside(false);
+        mConfirmDialog.setView(dialogView);
 
-        confirmDialog.setView(dialogView);
+        mConfirmDialog.show();
+    }
 
-        confirmDialog.show();
+    /**
+     * Signals to Telecom that redirection of the call is to be cancelled.
+     */
+    private void cancelRedirection() {
+        Intent cancelRedirectedCall = new Intent(
+                TelecomBroadcastIntentProcessor.ACTION_CANCEL_REDIRECTED_CALL,
+                null, CallRedirectionConfirmDialogActivity.this,
+                TelecomBroadcastReceiver.class);
+        cancelRedirectedCall.putExtra(EXTRA_REDIRECTION_OUTGOING_CALL_ID, mCallId);
+        sendBroadcast(cancelRedirectedCall);
     }
 }