Ensure chosen phone account is used if it is valid.
am: b8ce2aa67d

Change-Id: I8b3048cf0853f10a18f3a9966e202488f1e3283f
diff --git a/res/xml/layout_blocked_number.xml b/res/xml/layout_blocked_number.xml
index 94cdbae..fbd7de3 100644
--- a/res/xml/layout_blocked_number.xml
+++ b/res/xml/layout_blocked_number.xml
@@ -28,8 +28,8 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignParentStart="true"
-        android:layout_toStartOf="@+id/delete_blocked_number"
-        android:paddingTop="@dimen/blocked_numbers_delete_icon_padding" />
+        android:paddingTop="@dimen/blocked_numbers_delete_icon_padding"
+        android:textDirection="ltr" />
 
     <ImageView
             android:id="@+id/delete_blocked_number"
diff --git a/src/com/android/server/telecom/InCallController.java b/src/com/android/server/telecom/InCallController.java
index cdda387..58f489c 100644
--- a/src/com/android/server/telecom/InCallController.java
+++ b/src/com/android/server/telecom/InCallController.java
@@ -756,6 +756,10 @@
             // We are bound, and we are connected.
             adjustServiceBindingsForEmergency();
 
+            // This is in case an emergency call is added while there is an existing call.
+            mEmergencyCallHelper.maybeGrantTemporaryLocationPermission(call,
+                    mCallsManager.getCurrentUserHandle());
+
             Log.i(this, "onCallAdded: %s", call);
             // Track the call if we don't already know about it.
             addCall(call);
@@ -807,6 +811,8 @@
                     // Check again to make sure there are no active calls.
                     if (mCallsManager.getCalls().isEmpty()) {
                         unbindFromServices();
+
+                        mEmergencyCallHelper.maybeRevokeTemporaryLocationPermission();
                     }
                 }
             }.prepare(), mTimeoutsAdapter.getCallRemoveUnbindInCallServicesDelay(
diff --git a/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java b/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java
index fda68a8..a7e21ad 100644
--- a/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java
+++ b/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java
@@ -30,6 +30,7 @@
 import android.telecom.GatewayInfo;
 import android.telecom.Log;
 import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.telecom.VideoProfile;
 import android.telephony.DisconnectCause;
@@ -262,6 +263,21 @@
             return DisconnectCause.INVALID_NUMBER;
         }
 
+        // True for all managed calls, false for self-managed calls.
+        boolean sendNewOutgoingCallBroadcast = true;
+        PhoneAccountHandle targetPhoneAccount = mIntent.getParcelableExtra(
+                TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE);
+        if (targetPhoneAccount != null) {
+            PhoneAccount phoneAccount =
+                    mCallsManager.getPhoneAccountRegistrar().getPhoneAccountUnchecked(
+                            targetPhoneAccount);
+            if (phoneAccount != null && phoneAccount.isSelfManaged()) {
+                callImmediately = true;
+                sendNewOutgoingCallBroadcast = false;
+                Log.i(this, "Skipping NewOutgoingCallBroadcast for self-managed call.");
+            }
+        }
+
         if (callImmediately) {
             String scheme = isUriNumber ? PhoneAccount.SCHEME_SIP : PhoneAccount.SCHEME_TEL;
             boolean speakerphoneOn = mIntent.getBooleanExtra(
@@ -278,9 +294,11 @@
             // initiate the call again because of the presence of the EXTRA_ALREADY_CALLED extra.
         }
 
-        UserHandle targetUser = mCall.getInitiatingUser();
-        Log.i(this, "Sending NewOutgoingCallBroadcast for %s to %s", mCall, targetUser);
-        broadcastIntent(intent, number, !callImmediately, targetUser);
+        if (sendNewOutgoingCallBroadcast) {
+            UserHandle targetUser = mCall.getInitiatingUser();
+            Log.i(this, "Sending NewOutgoingCallBroadcast for %s to %s", mCall, targetUser);
+            broadcastIntent(intent, number, !callImmediately, targetUser);
+        }
         return DisconnectCause.NOT_DISCONNECTED;
     }
 
diff --git a/src/com/android/server/telecom/settings/BlockedNumbersAdapter.java b/src/com/android/server/telecom/settings/BlockedNumbersAdapter.java
index 705e031..1278a4b 100644
--- a/src/com/android/server/telecom/settings/BlockedNumbersAdapter.java
+++ b/src/com/android/server/telecom/settings/BlockedNumbersAdapter.java
@@ -41,12 +41,9 @@
         super.bindView(view, context, cursor);
         final String rawNumber = cursor.getString(cursor.getColumnIndex(
                 BlockedNumberContract.BlockedNumbers.COLUMN_ORIGINAL_NUMBER));
-        String formattedNumber = PhoneNumberUtils.formatNumber(rawNumber,
-                BlockedNumbersUtil.getLocaleDefaultToUS());
-        final String finalFormattedNumber = formattedNumber == null ? rawNumber : formattedNumber;
-
+        final String formattedNumber = BlockedNumbersUtil.formatNumber(rawNumber);
         TextView numberView = (TextView) view.findViewById(R.id.blocked_number);
-        Spannable numberSpannable = new SpannableString(finalFormattedNumber);
+        Spannable numberSpannable = new SpannableString(formattedNumber);
         PhoneNumberUtils.addTtsSpan(numberSpannable, 0, numberSpannable.length());
         numberView.setText(numberSpannable);
 
@@ -54,7 +51,7 @@
         deleteButton.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
-               showDeleteBlockedNumberDialog(context, rawNumber, finalFormattedNumber);
+                showDeleteBlockedNumberDialog(context, rawNumber, formattedNumber);
             }
         });
     }
diff --git a/src/com/android/server/telecom/settings/BlockedNumbersUtil.java b/src/com/android/server/telecom/settings/BlockedNumbersUtil.java
index 5d2e238..b75c4b3 100644
--- a/src/com/android/server/telecom/settings/BlockedNumbersUtil.java
+++ b/src/com/android/server/telecom/settings/BlockedNumbersUtil.java
@@ -18,11 +18,11 @@
 
 import android.content.Context;
 import android.telephony.PhoneNumberUtils;
+import android.text.BidiFormatter;
 import android.text.Spannable;
 import android.text.SpannableString;
+import android.text.TextDirectionHeuristics;
 import android.widget.Toast;
-import com.android.server.telecom.R;
-
 import java.util.Locale;
 
 public final class BlockedNumbersUtil {
@@ -40,18 +40,28 @@
     }
 
     /**
+     * Attempts to format the number, or returns the original number if it is not formattable. Also
+     * wraps the returned number as LTR.
+     */
+    public static String formatNumber(String number){
+      String formattedNumber = PhoneNumberUtils.formatNumber(number, getLocaleDefaultToUS());
+      return BidiFormatter.getInstance().unicodeWrap(
+              formattedNumber == null ? number : formattedNumber,
+              TextDirectionHeuristics.LTR);
+    }
+
+    /**
      * Formats the number in the string and shows a toast for {@link Toast#LENGTH_SHORT}.
      *
      * <p>Adds the number in a TsSpan so that it reads as a phone number when talk back is on.
      */
     public static void showToastWithFormattedNumber(Context context, int stringId, String number) {
-        String formattedNumber = PhoneNumberUtils.formatNumber(number, getLocaleDefaultToUS());
-        String finalFormattedNumber = formattedNumber == null ? number : formattedNumber;
-        String message = context.getString(stringId, finalFormattedNumber);
-        int startingPosition = message.indexOf(finalFormattedNumber);
+        String formattedNumber = formatNumber(number);
+        String message = context.getString(stringId, formattedNumber);
+        int startingPosition = message.indexOf(formattedNumber);
         Spannable messageSpannable = new SpannableString(message);
         PhoneNumberUtils.addTtsSpan(messageSpannable, startingPosition,
-                startingPosition + finalFormattedNumber.length());
+                startingPosition + formattedNumber.length());
         Toast.makeText(
                 context,
                 messageSpannable,
diff --git a/testapps/src/com/android/server/telecom/testapps/TestRttActivity.java b/testapps/src/com/android/server/telecom/testapps/TestRttActivity.java
index 9bb6977..78ebbe5 100644
--- a/testapps/src/com/android/server/telecom/testapps/TestRttActivity.java
+++ b/testapps/src/com/android/server/telecom/testapps/TestRttActivity.java
@@ -93,7 +93,8 @@
                     }
                     // inner read loop
                     while (true) {
-                        String receivedText = rttCall.read();
+                        String receivedText;
+                        receivedText = rttCall.read();
                         if (receivedText == null) {
                             if (Thread.currentThread().isInterrupted()) {
                                 break begin;