summaryrefslogtreecommitdiffstats
path: root/java/com/android/dialer/callstats/CallStatsListItemViewHolder.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/dialer/callstats/CallStatsListItemViewHolder.java')
-rw-r--r--java/com/android/dialer/callstats/CallStatsListItemViewHolder.java245
1 files changed, 245 insertions, 0 deletions
diff --git a/java/com/android/dialer/callstats/CallStatsListItemViewHolder.java b/java/com/android/dialer/callstats/CallStatsListItemViewHolder.java
new file mode 100644
index 000000000..bda6b3e3a
--- /dev/null
+++ b/java/com/android/dialer/callstats/CallStatsListItemViewHolder.java
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2011 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.callstats;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.Intent;
+import android.net.Uri;
+import android.provider.CallLog.Calls;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.QuickContactBadge;
+import android.widget.TextView;
+
+import com.android.dialer.R;
+import com.android.dialer.contactphoto.ContactPhotoManager;
+import com.android.dialer.contacts.displaypreference.ContactDisplayPreferences;
+import com.android.dialer.lettertile.LetterTileDrawable;
+import com.android.dialer.location.GeoUtil;
+import com.android.dialer.phonenumbercache.ContactInfoHelper;
+import com.android.dialer.phonenumberutil.PhoneNumberHelper;
+import com.android.dialer.util.DialerUtils;
+import com.android.dialer.widget.LinearColorBar;
+
+/**
+ * This is an object containing references to views contained by the call log list item. This
+ * improves performance by reducing the frequency with which we need to find views by IDs.
+ *
+ * This object also contains UI logic pertaining to the view, to isolate it from the CallLogAdapter.
+ */
+public final class CallStatsListItemViewHolder extends RecyclerView.ViewHolder
+ implements View.OnClickListener {
+
+ public CallStatsDetails details;
+ public Intent clickIntent;
+
+ public final View mRootView;
+ public final QuickContactBadge mQuickContactView;
+ public final View mPrimaryActionView;
+ public final TextView mNameView;
+ public final TextView mNumberView;
+ public final TextView mLabelView;
+ public final TextView mPercentView;
+ public final LinearColorBar mBarView;
+
+ private Context mContext;
+ private ContactInfoHelper mContactInfoHelper;
+ private final int mPhotoSize;
+
+ private CallStatsListItemViewHolder(View rootView,
+ QuickContactBadge quickContactView,
+ View primaryActionView,
+ TextView nameView,
+ TextView numberView,
+ TextView labelView,
+ TextView percentView,
+ LinearColorBar barView,
+ ContactInfoHelper contactInfoHelper) {
+ super(rootView);
+
+ mRootView = rootView;
+ mQuickContactView = quickContactView;
+ mPrimaryActionView = primaryActionView;
+ mNameView = nameView;
+ mNumberView = numberView;
+ mLabelView = labelView;
+ mPercentView = percentView;
+ mBarView = barView;
+
+ mPrimaryActionView.setOnClickListener(this);
+
+ quickContactView.setPrioritizedMimeType(Phone.CONTENT_ITEM_TYPE);
+
+ mContext = rootView.getContext();
+ mPhotoSize = mContext.getResources().getDimensionPixelSize(R.dimen.contact_photo_size);
+ mContactInfoHelper = contactInfoHelper;
+ }
+
+ public static CallStatsListItemViewHolder create(View view,
+ ContactInfoHelper contactInfoHelper) {
+ return new CallStatsListItemViewHolder(view,
+ (QuickContactBadge) view.findViewById(R.id.quick_contact_photo),
+ view.findViewById(R.id.primary_action_view),
+ (TextView) view.findViewById(R.id.name),
+ (TextView) view.findViewById(R.id.number),
+ (TextView) view.findViewById(R.id.label),
+ (TextView) view.findViewById(R.id.percent),
+ (LinearColorBar) view.findViewById(R.id.percent_bar),
+ contactInfoHelper);
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (clickIntent != null) {
+ DialerUtils.startActivityWithErrorToast(mContext, clickIntent);
+ }
+ }
+
+ public void setDetails(CallStatsDetails details, CallStatsDetails first,
+ CallStatsDetails total, int type, boolean byDuration,
+ ContactDisplayPreferences.DisplayOrder nameDisplayOrder) {
+ this.details = details;
+ details.updateDisplayProperties(mContext, nameDisplayOrder);
+
+ CharSequence numberFormattedLabel = null;
+ // Only show a label if the number is shown and it is not a SIP address.
+ if (!TextUtils.isEmpty(details.number)
+ && !PhoneNumberHelper.isUriNumber(details.number.toString())) {
+ numberFormattedLabel = Phone.getTypeLabel(mContext.getResources(),
+ details.numberType, details.numberLabel);
+ }
+
+ final CharSequence nameText;
+ final CharSequence numberText;
+ final CharSequence labelText;
+
+ if (TextUtils.isEmpty(details.displayName)) {
+ nameText = details.displayNumber;
+ if (TextUtils.isEmpty(details.geocode) || details.isVoicemailNumber) {
+ numberText = null;
+ } else {
+ numberText = details.geocode;
+ }
+ labelText = null;
+ } else {
+ nameText = details.displayName;
+ numberText = details.displayNumber;
+ labelText = numberFormattedLabel;
+ }
+
+ float in = 0, out = 0, missed = 0, blocked = 0;
+ float ratio = getDetailValue(details, type, byDuration) /
+ getDetailValue(first, type, byDuration);
+
+ if (type == Calls.INCOMING_TYPE) {
+ in = ratio;
+ } else if (type == Calls.OUTGOING_TYPE) {
+ out = ratio;
+ } else if (type == Calls.MISSED_TYPE) {
+ missed = ratio;
+ } else if (type == Calls.BLOCKED_TYPE) {
+ blocked = ratio;
+ } else {
+ float full = getDetailValue(details, type, byDuration);
+ in = getDetailValue(details, Calls.INCOMING_TYPE, byDuration) * ratio / full;
+ out = getDetailValue(details, Calls.OUTGOING_TYPE, byDuration) * ratio / full;
+ if (!byDuration) {
+ missed = getDetailValue(details, Calls.MISSED_TYPE, byDuration) * ratio / full;
+ blocked = getDetailValue(details, Calls.BLOCKED_TYPE, byDuration) * ratio / full;
+ }
+ }
+
+ mBarView.setRatios(in, out, missed, blocked);
+ mNameView.setText(nameText);
+ mNumberView.setText(numberText);
+ mLabelView.setText(labelText);
+ mLabelView.setVisibility(TextUtils.isEmpty(labelText) ? View.GONE : View.VISIBLE);
+
+ if (byDuration && type == Calls.MISSED_TYPE) {
+ mPercentView.setText(getCallCountString(mContext, details.missedCount));
+ } else if (byDuration && type == Calls.BLOCKED_TYPE) {
+ mPercentView.setText(getCallCountString(mContext, details.blockedCount));
+ } else {
+ float percent = getDetailValue(details, type, byDuration) * 100F /
+ getDetailValue(total, type, byDuration);
+ mPercentView.setText(String.format("%.1f%%", percent));
+ }
+
+ final String nameForDefaultImage = TextUtils.isEmpty(details.name)
+ ? details.displayNumber : details.name;
+
+ int contactType = LetterTileDrawable.TYPE_DEFAULT;
+ if (details.isVoicemailNumber) {
+ contactType = LetterTileDrawable.TYPE_VOICEMAIL;
+ } else if (mContactInfoHelper.isBusiness(details.sourceType)) {
+ contactType = LetterTileDrawable.TYPE_BUSINESS;
+ }
+
+ ContactPhotoManager.getInstance(mContext).loadDialerThumbnailOrPhoto(mQuickContactView,
+ details.contactUri, details.photoId, details.photoUri, nameForDefaultImage, contactType);
+ }
+
+ private float getDetailValue(CallStatsDetails details, int type, boolean byDuration) {
+ if (byDuration) {
+ return (float) details.getRequestedDuration(type);
+ } else {
+ return (float) details.getRequestedCount(type);
+ }
+ }
+
+ public static String getCallCountString(Context context, long count) {
+ return context.getResources().getQuantityString(R.plurals.call, (int) count, (int) count);
+ }
+
+ public static String getDurationString(Context context, long duration, boolean includeSeconds) {
+ int hours, minutes, seconds;
+
+ hours = (int) (duration / 3600);
+ duration -= (long) hours * 3600;
+ minutes = (int) (duration / 60);
+ duration -= (long) minutes * 60;
+ seconds = (int) duration;
+
+ if (!includeSeconds) {
+ if (seconds >= 30) {
+ minutes++;
+ }
+ if (minutes >= 60) {
+ hours++;
+ }
+ }
+
+ boolean dispHours = hours > 0;
+ boolean dispMinutes = minutes > 0 || (!includeSeconds && hours == 0);
+ boolean dispSeconds = includeSeconds && (seconds > 0 || (hours == 0 && minutes == 0));
+
+ final Resources res = context.getResources();
+ final String hourString = dispHours ?
+ res.getQuantityString(R.plurals.hour, hours, hours) : null;
+ final String minuteString = dispMinutes ?
+ res.getQuantityString(R.plurals.minute, minutes, minutes) : null;
+ final String secondString = dispSeconds ?
+ res.getQuantityString(R.plurals.second, seconds, seconds) : null;
+
+ int index = ((dispHours ? 4 : 0) | (dispMinutes ? 2 : 0) | (dispSeconds ? 1 : 0)) - 1;
+ String[] formats = res.getStringArray(R.array.call_stats_duration);
+ return String.format(formats[index], hourString, minuteString, secondString);
+ }
+}