From 6b576be4554a219088b3d24f91c6e79819a4ac1b Mon Sep 17 00:00:00 2001 From: linyuh Date: Thu, 15 Mar 2018 10:13:54 -0700 Subject: Introduce GlidePhotoManager to CallDetailsActivity Bug: 74202944 Test: ModulesTest, CallDetailsActivityTest PiperOrigin-RevId: 189204143 Change-Id: I917bac76009522c6a99fdb63299556ec2a454dfa --- .../dialer/calldetails/CallDetailsActivity.java | 19 +++++--- .../dialer/calldetails/CallDetailsAdapter.java | 18 ++++--- .../calldetails/CallDetailsHeaderViewHolder.java | 14 ++++++ .../proto/call_details_header_info.proto | 36 ++++++++++++++ .../android/dialer/calllog/ui/menu/Modules.java | 57 +++++++++------------- .../dialer/calllogutils/CallLogContactTypes.java | 38 --------------- .../HistoryItemPrimaryActionInfo.java | 2 +- 7 files changed, 95 insertions(+), 89 deletions(-) create mode 100644 java/com/android/dialer/calldetails/proto/call_details_header_info.proto delete mode 100644 java/com/android/dialer/calllogutils/CallLogContactTypes.java diff --git a/java/com/android/dialer/calldetails/CallDetailsActivity.java b/java/com/android/dialer/calldetails/CallDetailsActivity.java index 672043b6e..4dc294e76 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.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(); } /** diff --git a/java/com/android/dialer/calldetails/CallDetailsAdapter.java b/java/com/android/dialer/calldetails/CallDetailsAdapter.java index dfa472a71..2a4c1efca 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 @@ 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(); } } diff --git a/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java b/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java index 34ed68836..e4fded173 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.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) { 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 000000000..ea7ba1e72 --- /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 184f7abf0..fd5f6a348 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.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 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(); + } - 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(); } } diff --git a/java/com/android/dialer/calllogutils/CallLogContactTypes.java b/java/com/android/dialer/calllogutils/CallLogContactTypes.java deleted file mode 100644 index 58651560f..000000000 --- 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 f4338ce7a..ccc9420c6 100644 --- a/java/com/android/dialer/historyitemactions/HistoryItemPrimaryActionInfo.java +++ b/java/com/android/dialer/historyitemactions/HistoryItemPrimaryActionInfo.java @@ -49,7 +49,7 @@ public abstract class HistoryItemPrimaryActionInfo { @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 -- cgit v1.2.3