Introduce GlidePhotoManager to CallDetailsActivity

Bug: 74202944
Test: ModulesTest, CallDetailsActivityTest
PiperOrigin-RevId: 189204143
Change-Id: I917bac76009522c6a99fdb63299556ec2a454dfa
diff --git a/java/com/android/dialer/calldetails/CallDetailsActivity.java b/java/com/android/dialer/calldetails/CallDetailsActivity.java
index 672043b..4dc294e 100644
--- a/java/com/android/dialer/calldetails/CallDetailsActivity.java
+++ b/java/com/android/dialer/calldetails/CallDetailsActivity.java
@@ -28,7 +28,6 @@
 import com.android.dialer.calldetails.CallDetailsHeaderViewHolder.CallDetailsHeaderListener;
 import com.android.dialer.calllog.database.contract.AnnotatedCallLogContract.AnnotatedCallLog;
 import com.android.dialer.common.Assert;
-import com.android.dialer.dialercontact.DialerContact;
 import com.android.dialer.enrichedcall.EnrichedCallComponent;
 import com.android.dialer.protos.ProtoParsers;
 
@@ -42,26 +41,27 @@
  */
 public final class CallDetailsActivity extends CallDetailsActivityCommon {
   public static final String EXTRA_COALESCED_CALL_LOG_IDS = "coalesced_call_log_ids";
-  public static final String EXTRA_CONTACT = "contact";
+  public static final String EXTRA_HEADER_INFO = "header_info";
 
   private static final int CALL_DETAILS_LOADER_ID = 0;
 
   /** IDs of call log entries, used to retrieve them from the annotated call log. */
   private CoalescedIds coalescedCallLogIds;
 
-  private DialerContact contact;
+  /** Info to be shown in the header. */
+  private CallDetailsHeaderInfo headerInfo;
 
   /** Returns an {@link Intent} to launch this activity. */
   public static Intent newInstance(
       Context context,
       CoalescedIds coalescedAnnotatedCallLogIds,
-      DialerContact contact,
+      CallDetailsHeaderInfo callDetailsHeaderInfo,
       boolean canReportCallerId,
       boolean canSupportAssistedDialing) {
     Intent intent = new Intent(context, CallDetailsActivity.class);
-    ProtoParsers.put(intent, EXTRA_CONTACT, Assert.isNotNull(contact));
     ProtoParsers.put(
         intent, EXTRA_COALESCED_CALL_LOG_IDS, Assert.isNotNull(coalescedAnnotatedCallLogIds));
+    ProtoParsers.put(intent, EXTRA_HEADER_INFO, Assert.isNotNull(callDetailsHeaderInfo));
     intent.putExtra(EXTRA_CAN_REPORT_CALLER_ID, canReportCallerId);
     intent.putExtra(EXTRA_CAN_SUPPORT_ASSISTED_DIALING, canSupportAssistedDialing);
     return intent;
@@ -70,14 +70,17 @@
   @Override
   protected void handleIntent(Intent intent) {
     Assert.checkArgument(intent.hasExtra(EXTRA_COALESCED_CALL_LOG_IDS));
+    Assert.checkArgument(intent.hasExtra(EXTRA_HEADER_INFO));
     Assert.checkArgument(intent.hasExtra(EXTRA_CAN_REPORT_CALLER_ID));
     Assert.checkArgument(intent.hasExtra(EXTRA_CAN_SUPPORT_ASSISTED_DIALING));
 
-    contact = ProtoParsers.getTrusted(intent, EXTRA_CONTACT, DialerContact.getDefaultInstance());
     setCallDetailsEntries(CallDetailsEntries.getDefaultInstance());
     coalescedCallLogIds =
         ProtoParsers.getTrusted(
             intent, EXTRA_COALESCED_CALL_LOG_IDS, CoalescedIds.getDefaultInstance());
+    headerInfo =
+        ProtoParsers.getTrusted(
+            intent, EXTRA_HEADER_INFO, CallDetailsHeaderInfo.getDefaultInstance());
 
     getLoaderManager()
         .initLoader(
@@ -91,7 +94,7 @@
       DeleteCallDetailsListener deleteCallDetailsListener) {
     return new CallDetailsAdapter(
         this,
-        contact,
+        headerInfo,
         getCallDetailsEntries(),
         callDetailsHeaderListener,
         reportCallIdListener,
@@ -100,7 +103,7 @@
 
   @Override
   protected String getNumber() {
-    return contact.getNumber();
+    return headerInfo.getDialerPhoneNumber().getNormalizedNumber();
   }
 
   /**
diff --git a/java/com/android/dialer/calldetails/CallDetailsAdapter.java b/java/com/android/dialer/calldetails/CallDetailsAdapter.java
index dfa472a..2a4c1ef 100644
--- a/java/com/android/dialer/calldetails/CallDetailsAdapter.java
+++ b/java/com/android/dialer/calldetails/CallDetailsAdapter.java
@@ -16,12 +16,12 @@
 
 package com.android.dialer.calldetails;
 
+
 import android.content.Context;
 import android.support.v7.widget.RecyclerView;
 import android.view.View;
 import com.android.dialer.calldetails.CallDetailsFooterViewHolder.DeleteCallDetailsListener;
 import com.android.dialer.calldetails.CallDetailsHeaderViewHolder.CallDetailsHeaderListener;
-import com.android.dialer.dialercontact.DialerContact;
 
 /**
  * A {@link RecyclerView.Adapter} for {@link CallDetailsActivity}.
@@ -31,11 +31,12 @@
  */
 final class CallDetailsAdapter extends CallDetailsAdapterCommon {
 
-  private final DialerContact contact;
+  /** Info to be shown in the header. */
+  private final CallDetailsHeaderInfo headerInfo;
 
   CallDetailsAdapter(
       Context context,
-      DialerContact contact,
+      CallDetailsHeaderInfo calldetailsHeaderInfo,
       CallDetailsEntries callDetailsEntries,
       CallDetailsHeaderListener callDetailsHeaderListener,
       CallDetailsFooterViewHolder.ReportCallIdListener reportCallIdListener,
@@ -46,26 +47,29 @@
         callDetailsHeaderListener,
         reportCallIdListener,
         deleteCallDetailsListener);
-    this.contact = contact;
+    this.headerInfo = calldetailsHeaderInfo;
   }
 
   @Override
   protected CallDetailsHeaderViewHolder createCallDetailsHeaderViewHolder(
       View container, CallDetailsHeaderListener callDetailsHeaderListener) {
     return new CallDetailsHeaderViewHolder(
-        container, contact.getNumber(), contact.getPostDialDigits(), callDetailsHeaderListener);
+        container,
+        headerInfo.getDialerPhoneNumber().getNormalizedNumber(),
+        headerInfo.getDialerPhoneNumber().getPostDialPortion(),
+        callDetailsHeaderListener);
   }
 
   @Override
   protected void bindCallDetailsHeaderViewHolder(
       CallDetailsHeaderViewHolder callDetailsHeaderViewHolder, int position) {
-    callDetailsHeaderViewHolder.updateContactInfo(contact, getCallbackAction());
+    callDetailsHeaderViewHolder.updateContactInfo(headerInfo, getCallbackAction());
     callDetailsHeaderViewHolder.updateAssistedDialingInfo(
         getCallDetailsEntries().getEntries(position));
   }
 
   @Override
   protected String getNumber() {
-    return contact.getNumber();
+    return headerInfo.getDialerPhoneNumber().getNormalizedNumber();
   }
 }
diff --git a/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java b/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
index 34ed688..e4fded1 100644
--- a/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
+++ b/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
@@ -37,6 +37,7 @@
 import com.android.dialer.compat.telephony.TelephonyManagerCompat;
 import com.android.dialer.contactphoto.ContactPhotoManager;
 import com.android.dialer.dialercontact.DialerContact;
+import com.android.dialer.glidephotomanager.GlidePhotoManagerComponent;
 import com.android.dialer.logging.InteractionEvent;
 import com.android.dialer.logging.Logger;
 
@@ -182,6 +183,19 @@
     setCallbackAction(callbackAction);
   }
 
+  void updateContactInfo(CallDetailsHeaderInfo headerInfo, @CallbackAction int callbackAction) {
+    GlidePhotoManagerComponent.get(context)
+        .glidePhotoManager()
+        .loadQuickContactBadge(contactPhoto, headerInfo.getPhotoInfo());
+
+    nameView.setText(headerInfo.getPrimaryText());
+    numberView.setText(headerInfo.getSecondaryText());
+
+    // TODO(a bug): show SIM info in the TextView returned by getNetworkView().
+
+    setCallbackAction(callbackAction);
+  }
+
   private void setCallbackAction(@CallbackAction int callbackAction) {
     this.callbackAction = callbackAction;
     switch (callbackAction) {
diff --git a/java/com/android/dialer/calldetails/proto/call_details_header_info.proto b/java/com/android/dialer/calldetails/proto/call_details_header_info.proto
new file mode 100644
index 0000000..ea7ba1e
--- /dev/null
+++ b/java/com/android/dialer/calldetails/proto/call_details_header_info.proto
@@ -0,0 +1,36 @@
+syntax = "proto2";
+
+option java_package = "com.android.dialer.calldetails";
+option java_multiple_files = true;
+option optimize_for = LITE_RUNTIME;
+
+
+import "java/com/android/dialer/phonenumberproto/dialer_phone_number.proto";
+import "java/com/android/dialer/glidephotomanager/photo_info.proto";
+
+package com.android.dialer.calldetails;
+
+// Contains information for the header in CallDetailsActivity
+// Next ID: 5
+message CallDetailsHeaderInfo {
+  // The number of all call detail entries.
+  optional com.android.dialer.DialerPhoneNumber dialer_phone_number = 1;
+
+  // Information used to load the contact photo.
+  optional com.android.dialer.glidephotomanager.PhotoInfo photo_info = 2;
+
+  // Primary text of the header, which can be
+  // (1) a presentation name (e.g., "Restricted", "Unknown", etc.),
+  // (2) the contact name, or
+  // (3) the formatted number.
+  optional string primary_text = 3;
+
+  // Secondary test of the header, which describes the number.
+  // Some examples are:
+  //   "Mobile • 555-1234",
+  //   "Blocked • Mobile • 555-1234", and
+  //   "Spam • Mobile • 555-1234".
+  optional string secondary_text = 4;
+
+  // TODO(a bug): Add SIM info.
+}
\ No newline at end of file
diff --git a/java/com/android/dialer/calllog/ui/menu/Modules.java b/java/com/android/dialer/calllog/ui/menu/Modules.java
index 184f7ab..fd5f6a3 100644
--- a/java/com/android/dialer/calllog/ui/menu/Modules.java
+++ b/java/com/android/dialer/calllog/ui/menu/Modules.java
@@ -22,11 +22,12 @@
 import android.text.TextUtils;
 import com.android.dialer.blockreportspam.BlockReportSpamDialogInfo;
 import com.android.dialer.calldetails.CallDetailsActivity;
+import com.android.dialer.calldetails.CallDetailsHeaderInfo;
 import com.android.dialer.callintent.CallInitiationType;
 import com.android.dialer.calllog.model.CoalescedRow;
-import com.android.dialer.calllogutils.CallLogContactTypes;
-import com.android.dialer.calllogutils.PhoneNumberDisplayUtil;
-import com.android.dialer.dialercontact.DialerContact;
+import com.android.dialer.calllogutils.CallLogEntryText;
+import com.android.dialer.calllogutils.NumberAttributesConverter;
+import com.android.dialer.glidephotomanager.PhotoInfo;
 import com.android.dialer.historyitemactions.DividerModule;
 import com.android.dialer.historyitemactions.HistoryItemActionModule;
 import com.android.dialer.historyitemactions.IntentModule;
@@ -106,8 +107,6 @@
       }
     }
 
-    // TODO(zachh): Revisit if DialerContact is the best thing to pass to CallDetails; could
-    // it use a HistoryItemPrimaryActionInfo instead?
     modules.add(createModuleForAccessingCallDetails(context, row));
 
     modules.add(new DeleteCallLogItemModule(context, row.coalescedIds()));
@@ -156,43 +155,31 @@
         CallDetailsActivity.newInstance(
             context,
             row.coalescedIds(),
-            createDialerContactFromRow(context, row),
+            createCallDetailsHeaderInfoFromRow(context, row),
             canReportAsInvalidNumber,
             canSupportAssistedDialing),
         R.string.call_details_menu_label,
         R.drawable.quantum_ic_info_outline_vd_theme_24);
   }
 
-  private static DialerContact createDialerContactFromRow(Context context, CoalescedRow row) {
-    Optional<String> presentationName =
-        PhoneNumberDisplayUtil.getNameForPresentation(context, row.numberPresentation());
-    if (presentationName.isPresent()) {
-      return DialerContact.newBuilder()
-          .setNameOrNumber(presentationName.get())
-          .setContactType(CallLogContactTypes.getContactType(row))
-          .build();
+  private static CallDetailsHeaderInfo createCallDetailsHeaderInfoFromRow(
+      Context context, CoalescedRow row) {
+    return CallDetailsHeaderInfo.newBuilder()
+        .setDialerPhoneNumber(row.number())
+        .setPhotoInfo(createPhotoInfoFromRow(row))
+        .setPrimaryText(CallLogEntryText.buildPrimaryText(context, row).toString())
+        .setSecondaryText(
+            CallLogEntryText.buildSecondaryTextForBottomSheet(context, row).toString())
+        .build();
+  }
+
+  private static PhotoInfo createPhotoInfoFromRow(CoalescedRow row) {
+    PhotoInfo.Builder photoInfoBuilder =
+        NumberAttributesConverter.toPhotoInfoBuilder(row.numberAttributes())
+            .setIsVideo((row.features() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO);
+    if (!TextUtils.isEmpty(row.formattedNumber())) {
+      photoInfoBuilder.setFormattedNumber(row.formattedNumber());
     }
-
-    String normalizedNumber = row.number().getNormalizedNumber();
-    DialerContact.Builder dialerContactBuilder =
-        DialerContact.newBuilder()
-            .setNumber(normalizedNumber)
-            .setContactType(CallLogContactTypes.getContactType(row))
-            .setPhotoId(row.numberAttributes().getPhotoId());
-
-    if (!row.numberAttributes().getName().isEmpty()) {
-      dialerContactBuilder.setNameOrNumber(row.numberAttributes().getName());
-      if (row.formattedNumber() != null) {
-        dialerContactBuilder.setDisplayNumber(row.formattedNumber());
-      }
-    } else if (!TextUtils.isEmpty(row.formattedNumber())) {
-      dialerContactBuilder.setNameOrNumber(row.formattedNumber());
-    }
-
-    dialerContactBuilder.setNumberLabel(row.numberAttributes().getNumberTypeLabel());
-    dialerContactBuilder.setPhotoUri(row.numberAttributes().getPhotoUri());
-    dialerContactBuilder.setContactUri(row.numberAttributes().getLookupUri());
-
-    return dialerContactBuilder.build();
+    return photoInfoBuilder.build();
   }
 }
diff --git a/java/com/android/dialer/calllogutils/CallLogContactTypes.java b/java/com/android/dialer/calllogutils/CallLogContactTypes.java
deleted file mode 100644
index 5865156..0000000
--- a/java/com/android/dialer/calllogutils/CallLogContactTypes.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.dialer.calllogutils;
-
-import com.android.dialer.calllog.model.CoalescedRow;
-import com.android.dialer.lettertile.LetterTileDrawable;
-
-/** Determines the {@link LetterTileDrawable.ContactType} for a {@link CoalescedRow}. */
-public class CallLogContactTypes {
-
-  /** Determines the {@link LetterTileDrawable.ContactType} for a {@link CoalescedRow}. */
-  @LetterTileDrawable.ContactType
-  public static int getContactType(CoalescedRow row) {
-    // TODO(zachh): Set these fields correctly.
-    boolean isVoicemail = false;
-    boolean isSpam = false;
-    boolean isBusiness = false;
-    int numberPresentation = row.numberPresentation();
-    boolean isConference = false;
-
-    return LetterTileDrawable.getContactTypeFromPrimitives(
-        isVoicemail, isSpam, isBusiness, numberPresentation, isConference);
-  }
-}
diff --git a/java/com/android/dialer/historyitemactions/HistoryItemPrimaryActionInfo.java b/java/com/android/dialer/historyitemactions/HistoryItemPrimaryActionInfo.java
index f4338ce..ccc9420 100644
--- a/java/com/android/dialer/historyitemactions/HistoryItemPrimaryActionInfo.java
+++ b/java/com/android/dialer/historyitemactions/HistoryItemPrimaryActionInfo.java
@@ -49,7 +49,7 @@
   @Nullable
   public abstract Intent intent();
 
-  // TODO(zachh): Add SIM info here if should be shown in bottom sheet.
+  // TODO(a bug): Add SIM info.
 
   /** Builder for {@link HistoryItemPrimaryActionInfo}. */
   @AutoValue.Builder