Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6b576be4 authored by linyuh's avatar linyuh Committed by Copybara-Service
Browse files

Introduce GlidePhotoManager to CallDetailsActivity

Bug: 74202944
Test: ModulesTest, CallDetailsActivityTest
PiperOrigin-RevId: 189204143
Change-Id: I917bac76009522c6a99fdb63299556ec2a454dfa
parent 94067bd7
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@ import com.android.dialer.calldetails.CallDetailsFooterViewHolder.ReportCallIdLi
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 @@ import com.android.dialer.protos.ProtoParsers;
 */
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 @@ public final class CallDetailsActivity extends CallDetailsActivityCommon {
  @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 @@ public final class CallDetailsActivity extends CallDetailsActivityCommon {
      DeleteCallDetailsListener deleteCallDetailsListener) {
    return new CallDetailsAdapter(
        this,
        contact,
        headerInfo,
        getCallDetailsEntries(),
        callDetailsHeaderListener,
        reportCallIdListener,
@@ -100,7 +103,7 @@ public final class CallDetailsActivity extends CallDetailsActivityCommon {

  @Override
  protected String getNumber() {
    return contact.getNumber();
    return headerInfo.getDialerPhoneNumber().getNormalizedNumber();
  }

  /**
+11 −7
Original line number Diff line number Diff line
@@ -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 @@ import com.android.dialer.dialercontact.DialerContact;
 */
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 @@ final class CallDetailsAdapter extends CallDetailsAdapterCommon {
        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();
  }
}
+14 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import com.android.dialer.common.concurrent.DialerExecutor.SuccessListener;
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 @@ public class CallDetailsHeaderViewHolder extends RecyclerView.ViewHolder
    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) {
+36 −0
Original line number Diff line number Diff line
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
+22 −35
Original line number Diff line number Diff line
@@ -22,11 +22,12 @@ import android.telecom.PhoneAccountHandle;
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 @@ final class Modules {
      }
    }

    // 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 @@ final class Modules {
        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))
  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();
  }

    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());
  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());
    }

    dialerContactBuilder.setNumberLabel(row.numberAttributes().getNumberTypeLabel());
    dialerContactBuilder.setPhotoUri(row.numberAttributes().getPhotoUri());
    dialerContactBuilder.setContactUri(row.numberAttributes().getLookupUri());

    return dialerContactBuilder.build();
    return photoInfoBuilder.build();
  }
}
Loading