Add "Set up" and "Invite" for video to call log entry actions

Bug: 70034799
Test: GoogleCallLogAdapterTest
PiperOrigin-RevId: 178434462
Change-Id: I220cb74116aaa5dc3518de0dd20f2cdefda4049b
diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java
index 4f78bc9..f456555 100644
--- a/java/com/android/dialer/app/calllog/CallLogAdapter.java
+++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java
@@ -828,65 +828,65 @@
   }
 
   private void loadAndRender(
-      final CallLogListItemViewHolder views,
+      final CallLogListItemViewHolder viewHolder,
       final long rowId,
       final PhoneCallDetails details,
       final CallDetailsEntries callDetailsEntries) {
-    LogUtil.d("CallLogAdapter.loadAndRender", "position: %d", views.getAdapterPosition());
+    LogUtil.d("CallLogAdapter.loadAndRender", "position: %d", viewHolder.getAdapterPosition());
     // Reset block and spam information since this view could be reused which may contain
     // outdated data.
-    views.isSpam = false;
-    views.blockId = null;
-    views.isSpamFeatureEnabled = false;
+    viewHolder.isSpam = false;
+    viewHolder.blockId = null;
+    viewHolder.isSpamFeatureEnabled = false;
 
     // Attempt to set the isCallComposerCapable field. If capabilities are unknown for this number,
     // the value will be false while capabilities are requested. mExpandCollapseListener will
     // attempt to set the field properly in that case
-    views.isCallComposerCapable = isCallComposerCapable(views.number);
-    views.setDetailedPhoneDetails(callDetailsEntries);
-    views.duoReady = getDuo().isReachable(mActivity, views.number);
+    viewHolder.isCallComposerCapable = isCallComposerCapable(viewHolder.number);
+    viewHolder.setDetailedPhoneDetails(callDetailsEntries);
+    viewHolder.duo = getDuo();
     final AsyncTask<Void, Void, Boolean> loadDataTask =
         new AsyncTask<Void, Void, Boolean>() {
           @Override
           protected Boolean doInBackground(Void... params) {
-            views.blockId =
+            viewHolder.blockId =
                 mFilteredNumberAsyncQueryHandler.getBlockedIdSynchronous(
-                    views.number, views.countryIso);
-            details.isBlocked = views.blockId != null;
+                    viewHolder.number, viewHolder.countryIso);
+            details.isBlocked = viewHolder.blockId != null;
             if (isCancelled()) {
               return false;
             }
             if (mIsSpamEnabled) {
-              views.isSpamFeatureEnabled = true;
+              viewHolder.isSpamFeatureEnabled = true;
               // Only display the call as a spam call if there are incoming calls in the list.
               // Call log cards with only outgoing calls should never be displayed as spam.
-              views.isSpam =
+              viewHolder.isSpam =
                   details.hasIncomingCalls()
                       && Spam.get(mActivity)
-                          .checkSpamStatusSynchronous(views.number, views.countryIso);
-              details.isSpam = views.isSpam;
+                          .checkSpamStatusSynchronous(viewHolder.number, viewHolder.countryIso);
+              details.isSpam = viewHolder.isSpam;
             }
-            return !isCancelled() && loadData(views, rowId, details);
+            return !isCancelled() && loadData(viewHolder, rowId, details);
           }
 
           @Override
           protected void onPostExecute(Boolean success) {
-            views.isLoaded = true;
+            viewHolder.isLoaded = true;
             if (success) {
-              views.callbackAction = getCallbackAction(views.rowId);
-              int currentDayGroup = getDayGroup(views.rowId);
+              viewHolder.callbackAction = getCallbackAction(viewHolder.rowId);
+              int currentDayGroup = getDayGroup(viewHolder.rowId);
               if (currentDayGroup != details.previousGroup) {
-                views.dayGroupHeaderVisibility = View.VISIBLE;
-                views.dayGroupHeaderText = getGroupDescription(currentDayGroup);
+                viewHolder.dayGroupHeaderVisibility = View.VISIBLE;
+                viewHolder.dayGroupHeaderText = getGroupDescription(currentDayGroup);
               } else {
-                views.dayGroupHeaderVisibility = View.GONE;
+                viewHolder.dayGroupHeaderVisibility = View.GONE;
               }
-              render(views, details, rowId);
+              render(viewHolder, details, rowId);
             }
           }
         };
 
-    views.asyncTask = loadDataTask;
+    viewHolder.asyncTask = loadDataTask;
     mAsyncTaskExecutor.submit(LOAD_DATA_TASK_IDENTIFIER, loadDataTask);
   }
 
diff --git a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
index 26ca5bd..a5a0cff 100644
--- a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
+++ b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
@@ -78,6 +78,7 @@
 import com.android.dialer.contactphoto.ContactPhotoManager;
 import com.android.dialer.dialercontact.DialerContact;
 import com.android.dialer.dialercontact.SimDetails;
+import com.android.dialer.duo.Duo;
 import com.android.dialer.duo.DuoConstants;
 import com.android.dialer.lettertile.LetterTileDrawable;
 import com.android.dialer.lettertile.LetterTileDrawable.ContactType;
@@ -147,6 +148,8 @@
 
   public View callButtonView;
   public View videoCallButtonView;
+  public View setUpVideoButtonView;
+  public View inviteVideoButtonView;
   public View createNewContactButtonView;
   public View addToExistingContactButtonView;
   public View sendMessageView;
@@ -228,7 +231,7 @@
   public boolean isSpam;
 
   public boolean isCallComposerCapable;
-  public boolean duoReady;
+  public Duo duo;
 
   private View.OnClickListener mExpandCollapseListener;
   private final OnActionModeStateChangedListener onActionModeStateChangedListener;
@@ -466,6 +469,12 @@
       videoCallButtonView = actionsView.findViewById(R.id.video_call_action);
       videoCallButtonView.setOnClickListener(this);
 
+      setUpVideoButtonView = actionsView.findViewById(R.id.set_up_video_action);
+      setUpVideoButtonView.setOnClickListener(this);
+
+      inviteVideoButtonView = actionsView.findViewById(R.id.invite_video_action);
+      inviteVideoButtonView.setOnClickListener(this);
+
       createNewContactButtonView = actionsView.findViewById(R.id.create_new_contact_action);
       createNewContactButtonView.setOnClickListener(this);
 
@@ -593,6 +602,8 @@
     // This saves us having to remember to set it to GONE in multiple places.
     callButtonView.setVisibility(View.GONE);
     videoCallButtonView.setVisibility(View.GONE);
+    setUpVideoButtonView.setVisibility(View.GONE);
+    inviteVideoButtonView.setVisibility(View.GONE);
 
     if (isFullyUndialableVoicemail()) {
       // Sometimes the voicemail server will report the message is from some non phone number
@@ -665,9 +676,15 @@
             && (hasPlacedCarrierVideoCall() || canSupportCarrierVideoCall())) {
           videoCallButtonView.setTag(IntentProvider.getReturnVideoCallIntentProvider(number));
           videoCallButtonView.setVisibility(View.VISIBLE);
-        } else if (duoReady) {
+        } else if (duo.isReachable(mContext, number)) {
           videoCallButtonView.setTag(IntentProvider.getDuoVideoIntentProvider(number));
           videoCallButtonView.setVisibility(View.VISIBLE);
+        } else if (duo.isActivated(mContext)) {
+          inviteVideoButtonView.setTag(IntentProvider.getDuoInviteIntentProvider(number));
+          inviteVideoButtonView.setVisibility(View.VISIBLE);
+        } else if (duo.isEnabled(mContext)) {
+          setUpVideoButtonView.setTag(IntentProvider.getSetUpDuoIntentProvider());
+          setUpVideoButtonView.setVisibility(View.VISIBLE);
         }
         break;
       default:
@@ -755,7 +772,7 @@
   private boolean showDuoPrimaryButton() {
     return accountHandle != null
         && accountHandle.getComponentName().equals(DuoConstants.PHONE_ACCOUNT_COMPONENT_NAME)
-        && duoReady;
+        && duo.isReachable(mContext, number);
   }
 
   private static boolean hasDialableChar(CharSequence number) {
diff --git a/java/com/android/dialer/app/calllog/IntentProvider.java b/java/com/android/dialer/app/calllog/IntentProvider.java
index 0835d89..996bca0 100644
--- a/java/com/android/dialer/app/calllog/IntentProvider.java
+++ b/java/com/android/dialer/app/calllog/IntentProvider.java
@@ -22,6 +22,7 @@
 import android.net.Uri;
 import android.provider.ContactsContract;
 import android.support.annotation.Nullable;
+import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.TelephonyManager;
 import com.android.contacts.common.model.Contact;
@@ -32,6 +33,7 @@
 import com.android.dialer.callintent.CallIntentBuilder;
 import com.android.dialer.dialercontact.DialerContact;
 import com.android.dialer.duo.DuoComponent;
+import com.android.dialer.duo.DuoConstants;
 import com.android.dialer.precall.PreCall;
 import com.android.dialer.util.IntentUtil;
 import java.util.ArrayList;
@@ -102,6 +104,29 @@
     };
   }
 
+  public static IntentProvider getSetUpDuoIntentProvider() {
+    return new IntentProvider() {
+      @Override
+      public Intent getIntent(Context context) {
+        return new Intent("com.google.android.apps.tachyon.action.REGISTER")
+            .setPackage(DuoConstants.PACKAGE_NAME);
+      }
+    };
+  }
+
+  public static IntentProvider getDuoInviteIntentProvider(String number) {
+    return new IntentProvider() {
+      @Override
+      public Intent getIntent(Context context) {
+        Intent intent =
+            new Intent("com.google.android.apps.tachyon.action.INVITE")
+                .setPackage(DuoConstants.PACKAGE_NAME)
+                .setData(Uri.fromParts(PhoneAccount.SCHEME_TEL, number, null /* fragment */));
+        return intent;
+      }
+    };
+  }
+
   public static IntentProvider getReturnVoicemailCallIntentProvider(
       @Nullable PhoneAccountHandle phoneAccountHandle) {
     return new IntentProvider() {
diff --git a/java/com/android/dialer/app/res/layout/call_log_list_item_actions.xml b/java/com/android/dialer/app/res/layout/call_log_list_item_actions.xml
index ec9e5a0..7df0d15 100644
--- a/java/com/android/dialer/app/res/layout/call_log_list_item_actions.xml
+++ b/java/com/android/dialer/app/res/layout/call_log_list_item_actions.xml
@@ -73,6 +73,34 @@
   </LinearLayout>
 
   <LinearLayout
+      android:id="@+id/set_up_video_action"
+      style="@style/CallLogActionStyle">
+
+    <ImageView
+        style="@style/CallLogActionIconStyle"
+        android:src="@drawable/quantum_ic_videocam_white_24"/>
+
+    <TextView
+        style="@style/CallLogActionTextStyle"
+        android:text="@string/call_log_action_set_up_video"/>
+
+  </LinearLayout>
+
+  <LinearLayout
+      android:id="@+id/invite_video_action"
+      style="@style/CallLogActionStyle">
+
+    <ImageView
+        style="@style/CallLogActionIconStyle"
+        android:src="@drawable/quantum_ic_videocam_white_24"/>
+
+    <TextView
+        style="@style/CallLogActionTextStyle"
+        android:text="@string/call_log_action_invite_video"/>
+
+  </LinearLayout>
+
+  <LinearLayout
     android:id="@+id/create_new_contact_action"
     style="@style/CallLogActionStyle">
 
diff --git a/java/com/android/dialer/app/res/values/strings.xml b/java/com/android/dialer/app/res/values/strings.xml
index 01c4776..99720c2 100644
--- a/java/com/android/dialer/app/res/values/strings.xml
+++ b/java/com/android/dialer/app/res/values/strings.xml
@@ -348,6 +348,16 @@
        [CHAR LIMIT=30] -->
   <string name="call_log_action_video_call">Video call</string>
 
+  <!-- Button text for the "Set up" video calling option displayed underneath an entry in the call log.
+       Tapping causes a the user to be taken to set up video calling.
+       [CHAR LIMIT=30] -->
+  <string name="call_log_action_set_up_video">Set up</string>
+
+  <!-- Button text for the "Invite" option displayed underneath an entry in the call log.
+       Tapping causes a the user to be taken to the messaging app with a message ready to invite them to set up video calling.
+       [CHAR LIMIT=30] -->
+  <string name="call_log_action_invite_video">Invite</string>
+
   <!-- Button text for a button displayed underneath an entry in the call log, which opens up a
        messaging app to send a SMS to the number represented by the call log entry.
        [CHAR LIMIT=30] -->