Show SIM auto select reason in in call UI

The assisted dialed string will also along show with the "calling via" label. To handle the long string, Top row is now a marquee.

Bug: 72571130
Test: Unit tests
PiperOrigin-RevId: 190156719
Change-Id: I18a13712bdc9d780f744ef65a1773d249e40fb15
diff --git a/java/com/android/dialer/callintent/CallIntentBuilder.java b/java/com/android/dialer/callintent/CallIntentBuilder.java
index ff490c2..9d9fcf4 100644
--- a/java/com/android/dialer/callintent/CallIntentBuilder.java
+++ b/java/com/android/dialer/callintent/CallIntentBuilder.java
@@ -25,6 +25,7 @@
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
+import android.telecom.Call.Details;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
@@ -168,6 +169,7 @@
     return callSubject;
   }
 
+  /** Additional data the in call UI can read with {@link Details#getIntentExtras()} */
   public Bundle getOutgoingCallExtras() {
     return outgoingCallExtras;
   }
diff --git a/java/com/android/dialer/precall/impl/CallingAccountSelector.java b/java/com/android/dialer/precall/impl/CallingAccountSelector.java
index b7f071d..a5dc6a0 100644
--- a/java/com/android/dialer/precall/impl/CallingAccountSelector.java
+++ b/java/com/android/dialer/precall/impl/CallingAccountSelector.java
@@ -159,6 +159,11 @@
                   LogUtil.i(
                       "CallingAccountSelector.processPreferredAccount", "Auto selected suggestion");
                   builder.setPhoneAccountHandle(result.getSuggestion().get().phoneAccountHandle);
+                  builder
+                      .getOutgoingCallExtras()
+                      .putString(
+                          SuggestionProvider.EXTRA_SIM_SUGGESTION_REASON,
+                          result.getSuggestion().get().reason.name());
                   pendingAction.finish();
                   return;
                 }
diff --git a/java/com/android/dialer/preferredsim/suggestion/SuggestionProvider.java b/java/com/android/dialer/preferredsim/suggestion/SuggestionProvider.java
index cfa37c8..f710f73 100644
--- a/java/com/android/dialer/preferredsim/suggestion/SuggestionProvider.java
+++ b/java/com/android/dialer/preferredsim/suggestion/SuggestionProvider.java
@@ -30,6 +30,8 @@
 /** Provides hints to the user when selecting a SIM to make a call. */
 public interface SuggestionProvider {
 
+  String EXTRA_SIM_SUGGESTION_REASON = "sim_suggestion_reason";
+
   /** The reason the suggestion is made. */
   enum Reason {
     UNKNOWN,
diff --git a/java/com/android/incallui/CallCardPresenter.java b/java/com/android/incallui/CallCardPresenter.java
index 8eb07c5..49f819b 100644
--- a/java/com/android/incallui/CallCardPresenter.java
+++ b/java/com/android/incallui/CallCardPresenter.java
@@ -54,6 +54,7 @@
 import com.android.dialer.oem.MotorolaUtils;
 import com.android.dialer.phonenumberutil.PhoneNumberHelper;
 import com.android.dialer.postcall.PostCall;
+import com.android.dialer.preferredsim.suggestion.SuggestionProvider;
 import com.android.incallui.ContactInfoCache.ContactCacheEntry;
 import com.android.incallui.ContactInfoCache.ContactInfoCacheCallback;
 import com.android.incallui.InCallPresenter.InCallDetailsListener;
@@ -478,6 +479,7 @@
                   .setSessionModificationState(primary.getVideoTech().getSessionModificationState())
                   .setDisconnectCause(primary.getDisconnectCause())
                   .setConnectionLabel(getConnectionLabel())
+                  .setSimSuggestionReason(getSimSuggestionReason())
                   .setConnectionIcon(getCallStateIcon())
                   .setGatewayNumber(getGatewayNumber())
                   .setCallSubject(shouldShowCallSubject(primary) ? primary.getCallSubject() : null)
@@ -988,6 +990,21 @@
     return primary.getCallProviderLabel();
   }
 
+  @Nullable
+  private SuggestionProvider.Reason getSimSuggestionReason() {
+    String value =
+        primary.getIntentExtras().getString(SuggestionProvider.EXTRA_SIM_SUGGESTION_REASON);
+    if (value == null) {
+      return null;
+    }
+    try {
+      return SuggestionProvider.Reason.valueOf(value);
+    } catch (IllegalArgumentException e) {
+      LogUtil.e("CallCardPresenter.getConnectionLabel", "unknown reason " + value);
+      return null;
+    }
+  }
+
   private Drawable getCallStateIcon() {
     // Return connection icon if one exists.
     StatusHints statusHints = primary.getStatusHints();
diff --git a/java/com/android/incallui/contactgrid/ContactGridManager.java b/java/com/android/incallui/contactgrid/ContactGridManager.java
index 327eaf2..d8b1f50 100644
--- a/java/com/android/incallui/contactgrid/ContactGridManager.java
+++ b/java/com/android/incallui/contactgrid/ContactGridManager.java
@@ -244,6 +244,10 @@
       statusTextView.setText(info.label);
       statusTextView.setVisibility(View.VISIBLE);
       statusTextView.setSingleLine(info.labelIsSingleLine);
+      // Required to start the marquee
+      // This will send a AccessibilityEvent.TYPE_VIEW_SELECTED, but has no observable effect on
+      // talkback.
+      statusTextView.setSelected(true);
     }
 
     if (info.icon == null) {
diff --git a/java/com/android/incallui/contactgrid/TopRow.java b/java/com/android/incallui/contactgrid/TopRow.java
index f551092..89300ca 100644
--- a/java/com/android/incallui/contactgrid/TopRow.java
+++ b/java/com/android/incallui/contactgrid/TopRow.java
@@ -166,7 +166,22 @@
 
   private static CharSequence getLabelForDialing(Context context, PrimaryCallState state) {
     if (!TextUtils.isEmpty(state.connectionLabel()) && !state.isWifi()) {
-      return context.getString(R.string.incall_calling_via_template, state.connectionLabel());
+      CharSequence label = getCallingViaLabel(context, state);
+
+      if (state.isAssistedDialed() && state.assistedDialingExtras() != null) {
+        LogUtil.i("TopRow.getLabelForDialing", "using assisted dialing with via label.");
+        String countryCode =
+            String.valueOf(state.assistedDialingExtras().transformedNumberCountryCallingCode());
+        label =
+            TextUtils.concat(
+                label,
+                " • ",
+                context.getString(
+                    R.string.incall_connecting_assited_dialed_component,
+                    countryCode,
+                    state.assistedDialingExtras().userHomeCountryCode()));
+      }
+      return label;
     } else {
       if (state.isVideoCall()) {
         if (state.isWifi()) {
@@ -189,6 +204,22 @@
     }
   }
 
+  private static CharSequence getCallingViaLabel(Context context, PrimaryCallState state) {
+    if (state.simSuggestionReason() != null) {
+      switch (state.simSuggestionReason()) {
+        case FREQUENT:
+          return context.getString(
+              R.string.incall_calling_on_recent_choice_template, state.connectionLabel());
+        case INTRA_CARRIER:
+          return context.getString(
+              R.string.incall_calling_on_same_carrier_template, state.connectionLabel());
+        default:
+          break;
+      }
+    }
+    return context.getString(R.string.incall_calling_via_template, state.connectionLabel());
+  }
+
   private static CharSequence getConnectionLabel(PrimaryCallState state) {
     if (!TextUtils.isEmpty(state.connectionLabel())
         && (isAccount(state) || state.isWifi() || state.isConference())) {
diff --git a/java/com/android/incallui/contactgrid/res/layout/incall_contactgrid_top_row.xml b/java/com/android/incallui/contactgrid/res/layout/incall_contactgrid_top_row.xml
index 42066f2..2f9ca3e 100644
--- a/java/com/android/incallui/contactgrid/res/layout/incall_contactgrid_top_row.xml
+++ b/java/com/android/incallui/contactgrid/res/layout/incall_contactgrid_top_row.xml
@@ -40,6 +40,8 @@
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:singleLine="true"
+    android:ellipsize="marquee"
+    android:scrollHorizontally="true"
     android:textAppearance="@style/Dialer.Incall.TextAppearance"
     tools:text="Captain Holt"/>
 </LinearLayout>
diff --git a/java/com/android/incallui/contactgrid/res/values/strings.xml b/java/com/android/incallui/contactgrid/res/values/strings.xml
index c6bdb11..7c0f5a6 100644
--- a/java/com/android/incallui/contactgrid/res/values/strings.xml
+++ b/java/com/android/incallui/contactgrid/res/values/strings.xml
@@ -20,6 +20,14 @@
      [CHAR LIMIT=40] -->
   <string name="incall_calling_via_template">Calling via <xliff:g id="provider_name">%s</xliff:g></string>
 
+  <!-- Title displayed in the overlay for outgoing calls when the provider is automatically chosen
+         because it is the same provider the callee is using. [CHAR LIMIT=60] -->
+  <string name="incall_calling_on_same_carrier_template">Calling on same carrier <xliff:g id="provider_name">%s</xliff:g></string>
+
+  <!-- Title displayed in the overlay for outgoing calls when the provider is automatically chosen
+         because the user has selected it multiple times.  [CHAR LIMIT=60] -->
+  <string name="incall_calling_on_recent_choice_template">Calling on recent choice <xliff:g id="provider_name">%s</xliff:g></string>
+
   <!-- Displayed above the contact name during an outgoing phone call. Indicates that the call is
        in the connecting stage. -->
   <string name="incall_connecting">Calling…</string>
@@ -27,6 +35,9 @@
   <!-- Display information related to assisted dialing, for example Calling using +1 (US)… -->
   <string name="incall_connecting_assited_dialed">Calling using +<xliff:g example="1" id="ad_country_code">%1$s</xliff:g> (<xliff:g example="1" id="ad_user_home_locale">%2$s</xliff:g>)\u2026</string>
 
+  <!-- String appended to the outgoing call title for additional information related to assisted dialing, for example "Calling via <CARRIER> • Using +1 (US)… "-->
+  <string name="incall_connecting_assited_dialed_component">Using +<xliff:g example="1" id="ad_country_code">%1$s</xliff:g> (<xliff:g example="1" id="ad_user_home_locale">%2$s</xliff:g>)\u2026</string>
+
   <!-- Displayed above the contact name when an external call is being pulled to the local
        device. -->
   <string name="incall_transferring">Transferring…</string>
diff --git a/java/com/android/incallui/incall/protocol/PrimaryCallState.java b/java/com/android/incallui/incall/protocol/PrimaryCallState.java
index 1d536e9..1d23036 100644
--- a/java/com/android/incallui/incall/protocol/PrimaryCallState.java
+++ b/java/com/android/incallui/incall/protocol/PrimaryCallState.java
@@ -23,6 +23,7 @@
 import android.text.TextUtils;
 import com.android.dialer.assisteddialing.TransformationInfo;
 import com.android.dialer.common.Assert;
+import com.android.dialer.preferredsim.suggestion.SuggestionProvider;
 import com.android.incallui.call.DialerCall;
 import com.android.incallui.call.DialerCall.State;
 import com.android.incallui.videotech.utils.SessionModificationState;
@@ -60,6 +61,9 @@
   public abstract String connectionLabel();
 
   @Nullable
+  public abstract SuggestionProvider.Reason simSuggestionReason();
+
+  @Nullable
   public abstract Drawable connectionIcon();
 
   @Nullable
@@ -141,6 +145,8 @@
 
     public abstract Builder setConnectionLabel(String connectionLabel);
 
+    public abstract Builder setSimSuggestionReason(SuggestionProvider.Reason reason);
+
     public abstract Builder setConnectionIcon(Drawable connectionIcon);
 
     public abstract Builder setGatewayNumber(String gatewayNumber);