Register call initiated from a known contact in Dialer.

This additional metadata will be used by the telephony system
to determine if an outgoing call is eligible for assisted
dialing.

Bug: 63995025
Test: some new unit tests
PiperOrigin-RevId: 165233878
Change-Id: Idee6491e3396b0798ae6c72da53d51367f9fd7ee
diff --git a/java/com/android/contacts/common/list/ContactTileView.java b/java/com/android/contacts/common/list/ContactTileView.java
index 4635641..cfd52f3 100644
--- a/java/com/android/contacts/common/list/ContactTileView.java
+++ b/java/com/android/contacts/common/list/ContactTileView.java
@@ -65,6 +65,7 @@
         CallSpecificAppData callSpecificAppData =
             CallSpecificAppData.newBuilder()
                 .setCallInitiationType(CallInitiationType.Type.SPEED_DIAL)
+                .setAllowAssistedDialing(true)
                 .build();
         mListener.onContactSelected(
             getLookupUri(),
diff --git a/java/com/android/contacts/common/list/PhoneNumberPickerFragment.java b/java/com/android/contacts/common/list/PhoneNumberPickerFragment.java
index 2ab1217..d704e54 100644
--- a/java/com/android/contacts/common/list/PhoneNumberPickerFragment.java
+++ b/java/com/android/contacts/common/list/PhoneNumberPickerFragment.java
@@ -235,6 +235,7 @@
       cacheContactInfo(position);
       CallSpecificAppData callSpecificAppData =
           CallSpecificAppData.newBuilder()
+              .setAllowAssistedDialing(true)
               .setCallInitiationType(getCallInitiationType(true /* isRemoteDirectory */))
               .setPositionOfSelectedSearchResult(position)
               .setCharactersInSearchString(getQueryString() == null ? 0 : getQueryString().length())
diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java
index a8b75bb..d7edc68 100644
--- a/java/com/android/dialer/app/DialtactsActivity.java
+++ b/java/com/android/dialer/app/DialtactsActivity.java
@@ -43,6 +43,7 @@
 import android.support.v4.view.ViewPager;
 import android.support.v7.app.ActionBar;
 import android.telecom.PhoneAccount;
+import android.telecom.TelecomManager;
 import android.text.Editable;
 import android.text.TextUtils;
 import android.text.TextWatcher;
@@ -96,6 +97,7 @@
 import com.android.dialer.callintent.CallSpecificAppData;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
+import com.android.dialer.compat.telephony.TelephonyManagerCompat;
 import com.android.dialer.configprovider.ConfigProviderBindings;
 import com.android.dialer.constants.ActivityRequestCodes;
 import com.android.dialer.database.Database;
@@ -1449,6 +1451,12 @@
     Intent intent =
         new CallIntentBuilder(phoneNumber, callSpecificAppData).setIsVideoCall(isVideoCall).build();
 
+    if (callSpecificAppData.getAllowAssistedDialing()) {
+      Bundle extras = new Bundle();
+      extras.putBoolean(TelephonyManagerCompat.ALLOW_ASSISTED_DIAL, true);
+      intent.putExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS, extras);
+    }
+
     DialerUtils.startActivityWithErrorToast(this, intent);
     mClearSearchOnPause = true;
   }
diff --git a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
index 745f8b6..5549039 100644
--- a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
+++ b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
@@ -23,6 +23,7 @@
 import android.content.res.Resources;
 import android.net.Uri;
 import android.os.AsyncTask;
+import android.os.Bundle;
 import android.provider.CallLog;
 import android.provider.CallLog.Calls;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
@@ -68,6 +69,7 @@
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.compat.CompatUtils;
+import com.android.dialer.compat.telephony.TelephonyManagerCompat;
 import com.android.dialer.configprovider.ConfigProviderBindings;
 import com.android.dialer.constants.ActivityRequestCodes;
 import com.android.dialer.contactphoto.ContactPhotoManager;
@@ -886,6 +888,15 @@
         return;
       }
 
+      if (info != null && info.lookupKey != null) {
+        Bundle extras = new Bundle();
+        if (intent.hasExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS)) {
+          extras = intent.getParcelableExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS);
+        }
+        extras.putBoolean(TelephonyManagerCompat.ALLOW_ASSISTED_DIAL, true);
+        intent.putExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS, extras);
+      }
+
       // We check to see if we are starting a Lightbringer intent. The reason is Lightbringer
       // intents need to be started using startActivityForResult instead of the usual startActivity
       String packageName = intent.getPackage();
diff --git a/java/com/android/dialer/app/list/PhoneFavoriteTileView.java b/java/com/android/dialer/app/list/PhoneFavoriteTileView.java
index 88a6dff..e0961be 100644
--- a/java/com/android/dialer/app/list/PhoneFavoriteTileView.java
+++ b/java/com/android/dialer/app/list/PhoneFavoriteTileView.java
@@ -129,6 +129,7 @@
 
         CallSpecificAppData.Builder callSpecificAppData =
             CallSpecificAppData.newBuilder()
+                .setAllowAssistedDialing(true)
                 .setCallInitiationType(CallInitiationType.Type.SPEED_DIAL)
                 .setSpeedDialContactPosition(position);
         if (isStarred) {
diff --git a/java/com/android/dialer/callintent/CallIntentBuilder.java b/java/com/android/dialer/callintent/CallIntentBuilder.java
index 36ea907..87de0f0 100644
--- a/java/com/android/dialer/callintent/CallIntentBuilder.java
+++ b/java/com/android/dialer/callintent/CallIntentBuilder.java
@@ -28,6 +28,7 @@
 import android.telecom.VideoProfile;
 import android.text.TextUtils;
 import com.android.dialer.common.Assert;
+import com.android.dialer.compat.telephony.TelephonyManagerCompat;
 import com.android.dialer.performancereport.PerformanceReport;
 import com.android.dialer.util.CallUtil;
 
@@ -38,6 +39,7 @@
   @Nullable private PhoneAccountHandle phoneAccountHandle;
   private boolean isVideoCall;
   private String callSubject;
+  private boolean allowAssistedDial;
 
   private static int lightbringerButtonAppearInExpandedCallLogItemCount = 0;
   private static int lightbringerButtonAppearInCollapsedCallLogItemCount = 0;
@@ -100,6 +102,11 @@
     return this;
   }
 
+  public CallIntentBuilder setAllowAssistedDial(boolean allowAssistedDial) {
+    this.allowAssistedDial = allowAssistedDial;
+    return this;
+  }
+
   public CallIntentBuilder setCallSubject(String callSubject) {
     this.callSubject = callSubject;
     return this;
@@ -114,6 +121,11 @@
     Bundle extras = new Bundle();
     extras.putLong(Constants.EXTRA_CALL_CREATED_TIME_MILLIS, SystemClock.elapsedRealtime());
     CallIntentParser.putCallSpecificAppData(extras, callSpecificAppData);
+
+    if (allowAssistedDial) {
+      extras.putBoolean(TelephonyManagerCompat.ALLOW_ASSISTED_DIAL, true);
+    }
+
     intent.putExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS, extras);
 
     if (phoneAccountHandle != null) {
diff --git a/java/com/android/dialer/callintent/call_specific_app_data.proto b/java/com/android/dialer/callintent/call_specific_app_data.proto
index 82547fa..065a7ab 100644
--- a/java/com/android/dialer/callintent/call_specific_app_data.proto
+++ b/java/com/android/dialer/callintent/call_specific_app_data.proto
@@ -14,7 +14,7 @@
 // Miscellaneous data that's included in a new outgoing call initiated by
 // Dialer. The system will pass this data to the InCallUi which can use it
 // for logging or for something else.
-// Next tag: 14
+// Next tag: 15
 message CallSpecificAppData {
   optional CallInitiationType.Type call_initiation_type = 1;
 
@@ -41,4 +41,7 @@
   optional int32 lightbringer_button_appear_in_collapsed_call_log_item_count =
       12;
   optional int32 lightbringer_button_appear_in_search_count = 13;
+
+  // Indicates that the call is open to modification from assisted dialing.
+  optional bool allow_assisted_dialing = 14;
 }
diff --git a/java/com/android/dialer/interactions/PhoneNumberInteraction.java b/java/com/android/dialer/interactions/PhoneNumberInteraction.java
index 39781cf..c42be42 100644
--- a/java/com/android/dialer/interactions/PhoneNumberInteraction.java
+++ b/java/com/android/dialer/interactions/PhoneNumberInteraction.java
@@ -183,6 +183,7 @@
         intent =
             new CallIntentBuilder(phoneNumber, callSpecificAppData)
                 .setIsVideoCall(isVideoCall)
+                .setAllowAssistedDial(callSpecificAppData.getAllowAssistedDialing())
                 .build();
         break;
     }
diff --git a/java/com/android/dialer/shortcuts/CallContactActivity.java b/java/com/android/dialer/shortcuts/CallContactActivity.java
index b807979..87f6fce 100644
--- a/java/com/android/dialer/shortcuts/CallContactActivity.java
+++ b/java/com/android/dialer/shortcuts/CallContactActivity.java
@@ -70,6 +70,7 @@
   private void makeCall() {
     CallSpecificAppData callSpecificAppData =
         CallSpecificAppData.newBuilder()
+            .setAllowAssistedDialing(true)
             .setCallInitiationType(CallInitiationType.Type.LAUNCHER_SHORTCUT)
             .build();
     PhoneNumberInteraction.startInteractionForPhoneCall(