summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java')
-rw-r--r--java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java156
1 files changed, 144 insertions, 12 deletions
diff --git a/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java b/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java
index 4c459e123..e198a38e8 100644
--- a/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java
+++ b/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java
@@ -15,29 +15,161 @@
*/
package com.android.dialer.calllog.ui;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.CallLog.Calls;
import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
import android.view.View;
+import android.widget.QuickContactBadge;
import android.widget.TextView;
-import java.text.SimpleDateFormat;
+import com.android.dialer.calllog.ui.CoalescedAnnotatedCallLogCursorLoader.Row;
+import com.android.dialer.calllogutils.CallLogDates;
+import com.android.dialer.calllogutils.CallTypeIconsView;
+import com.android.dialer.contactphoto.ContactPhotoManager;
+import com.android.dialer.lettertile.LetterTileDrawable;
+import com.android.dialer.oem.MotorolaUtils;
+import com.android.dialer.time.Clock;
import java.util.Locale;
/** {@link RecyclerView.ViewHolder} for the new call log. */
final class NewCallLogViewHolder extends RecyclerView.ViewHolder {
- // TODO: Format correctly using current locale.
- private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.US);
+ private final Context context;
+ private final TextView primaryTextView;
+ private final TextView secondaryTextView;
+ private final QuickContactBadge quickContactBadge;
+ private final CallTypeIconsView primaryCallTypeIconsView; // Used for Wifi, HD icons
+ private final CallTypeIconsView secondaryCallTypeIconsView; // Used for call types
+ private final TextView phoneAccountView;
+ private final Clock clock;
- private final TextView contactNameView;
- private final TextView timestampView;
-
- NewCallLogViewHolder(View view) {
+ NewCallLogViewHolder(View view, Clock clock) {
super(view);
- contactNameView = view.findViewById(R.id.contact_name);
- timestampView = view.findViewById(R.id.timestamp);
+ this.context = view.getContext();
+ primaryTextView = view.findViewById(R.id.primary_text);
+ secondaryTextView = view.findViewById(R.id.secondary_text);
+ quickContactBadge = view.findViewById(R.id.quick_contact_photo);
+ primaryCallTypeIconsView = view.findViewById(R.id.primary_call_type_icons);
+ secondaryCallTypeIconsView = view.findViewById(R.id.secondary_call_type_icons);
+ phoneAccountView = view.findViewById(R.id.phone_account);
+ this.clock = clock;
+ }
+
+ /** @param cursor a cursor from {@link CoalescedAnnotatedCallLogCursorLoader}. */
+ void bind(Cursor cursor) {
+ CoalescedAnnotatedCallLogCursorLoader.Row row =
+ new CoalescedAnnotatedCallLogCursorLoader.Row(cursor);
+
+ // TODO(zachh): Handle RTL properly.
+ primaryTextView.setText(buildPrimaryText(row));
+ secondaryTextView.setText(buildSecondaryText(row));
+
+ if (row.isNew()) {
+ // TODO(zachh): Figure out correct styling for new/missed/unread calls.
+ primaryTextView.setTextAppearance(R.style.primary_textview_new_call);
+ // TODO(zachh): Styling for call type icons when the call is new.
+ secondaryTextView.setTextAppearance(R.style.secondary_textview_new_call);
+ }
+
+ setPhoto(row);
+ setPrimaryCallTypes(row);
+ setSecondaryCallTypes(row);
+ setPhoneAccounts(row);
+ }
+
+ private String buildPrimaryText(CoalescedAnnotatedCallLogCursorLoader.Row row) {
+ StringBuilder primaryText = new StringBuilder();
+ if (!TextUtils.isEmpty(row.name())) {
+ primaryText.append(row.name());
+ } else if (!TextUtils.isEmpty(row.formattedNumber())) {
+ primaryText.append(row.formattedNumber());
+ } else {
+ // TODO(zachh): Handle CallLog.Calls.PRESENTATION_*, including Verizon restricted numbers.
+ primaryText.append(context.getText(R.string.new_call_log_unknown));
+ }
+ if (row.numberCalls() > 1) {
+ primaryText.append(String.format(Locale.getDefault(), " (%d)", row.numberCalls()));
+ }
+ return primaryText.toString();
+ }
+
+ private String buildSecondaryText(CoalescedAnnotatedCallLogCursorLoader.Row row) {
+ /*
+ * Rules: (Duo video, )?$Label|$Location • Date
+ *
+ * Examples:
+ * Duo Video, Mobile • Now
+ * Duo Video • 11:45pm
+ * Mobile • 11:45pm
+ * Mobile • Sunday
+ * Brooklyn, NJ • Jan 15
+ *
+ * Date rules:
+ * if < 1 minute ago: "Now"; else if today: HH:MM(am|pm); else if < 3 days: day; else: MON D
+ */
+ StringBuilder secondaryText = new StringBuilder();
+ if ((row.features() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO) {
+ // TODO(zachh): Add "Duo" prefix?
+ secondaryText.append(context.getText(R.string.new_call_log_video));
+ }
+ String numberTypeLabel = row.numberTypeLabel();
+ if (!TextUtils.isEmpty(numberTypeLabel)) {
+ if (secondaryText.length() > 0) {
+ secondaryText.append(", ");
+ }
+ secondaryText.append(numberTypeLabel);
+ } else { // If there's a number type label, don't show the location.
+ String location = row.geocodedLocation();
+ if (!TextUtils.isEmpty(location)) {
+ if (secondaryText.length() > 0) {
+ secondaryText.append(", ");
+ }
+ secondaryText.append(location);
+ }
+ }
+ if (secondaryText.length() > 0) {
+ secondaryText.append(" • ");
+ }
+ secondaryText.append(
+ CallLogDates.newCallLogTimestampLabel(context, clock.currentTimeMillis(), row.timestamp()));
+ return secondaryText.toString();
+ }
+
+ private void setPhoto(Row row) {
+ // TODO(zachh): Set the contact type.
+ ContactPhotoManager.getInstance(context)
+ .loadDialerThumbnailOrPhoto(
+ quickContactBadge,
+ row.lookupUri() == null ? null : Uri.parse(row.lookupUri()),
+ row.photoId(),
+ row.photoUri() == null ? null : Uri.parse(row.photoUri()),
+ row.name(),
+ LetterTileDrawable.TYPE_DEFAULT);
+ }
+
+ private void setPrimaryCallTypes(Row row) {
+ // Only HD and Wifi icons are shown following the primary text.
+ primaryCallTypeIconsView.setShowHd(
+ MotorolaUtils.shouldShowHdIconInCallLog(context, row.features()));
+ primaryCallTypeIconsView.setShowWifi(
+ MotorolaUtils.shouldShowWifiIconInCallLog(context, row.features()));
+ }
+
+ private void setSecondaryCallTypes(Row row) {
+ // Only call type icons are shown before the secondary text.
+ for (int callType : row.callTypes().getTypeList()) {
+ secondaryCallTypeIconsView.add(callType);
+ }
+ // TODO(zachh): Per new mocks, may need to add method to CallTypeIconsView to disable coloring.
}
- void bind(long timestamp) {
- contactNameView.setText("Contact Name Placeholder");
- timestampView.setText(dateFormat.format(timestamp));
+ private void setPhoneAccounts(Row row) {
+ if (row.phoneAccountLabel() != null) {
+ phoneAccountView.setText(row.phoneAccountLabel());
+ phoneAccountView.setTextColor(row.phoneAccountColor());
+ phoneAccountView.setVisibility(View.VISIBLE);
+ }
}
}