1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.dialer.calllog;
18 
19 import android.content.Context;
20 import android.provider.CallLog.Calls;
21 import android.text.format.DateUtils;
22 import android.text.format.Formatter;
23 import android.view.LayoutInflater;
24 import android.view.View;
25 import android.view.ViewGroup;
26 import android.widget.BaseAdapter;
27 import android.widget.TextView;
28 
29 import com.android.contacts.common.CallUtil;
30 import com.android.dialer.PhoneCallDetails;
31 import com.android.dialer.R;
32 import com.android.dialer.util.DialerUtils;
33 import com.google.common.collect.Lists;
34 
35 import java.util.ArrayList;
36 
37 /**
38  * Adapter for a ListView containing history items from the details of a call.
39  */
40 public class CallDetailHistoryAdapter extends BaseAdapter {
41     /** Each history item shows the detail of a call. */
42     private static final int VIEW_TYPE_HISTORY_ITEM = 1;
43 
44     private final Context mContext;
45     private final LayoutInflater mLayoutInflater;
46     private final CallTypeHelper mCallTypeHelper;
47     private final PhoneCallDetails[] mPhoneCallDetails;
48 
49     /**
50      * List of items to be concatenated together for duration strings.
51      */
52     private ArrayList<CharSequence> mDurationItems = Lists.newArrayList();
53 
CallDetailHistoryAdapter(Context context, LayoutInflater layoutInflater, CallTypeHelper callTypeHelper, PhoneCallDetails[] phoneCallDetails)54     public CallDetailHistoryAdapter(Context context, LayoutInflater layoutInflater,
55             CallTypeHelper callTypeHelper, PhoneCallDetails[] phoneCallDetails) {
56         mContext = context;
57         mLayoutInflater = layoutInflater;
58         mCallTypeHelper = callTypeHelper;
59         mPhoneCallDetails = phoneCallDetails;
60     }
61 
62     @Override
isEnabled(int position)63     public boolean isEnabled(int position) {
64         // None of history will be clickable.
65         return false;
66     }
67 
68     @Override
getCount()69     public int getCount() {
70         return mPhoneCallDetails.length;
71     }
72 
73     @Override
getItem(int position)74     public Object getItem(int position) {
75         return mPhoneCallDetails[position];
76     }
77 
78     @Override
getItemId(int position)79     public long getItemId(int position) {
80         return position;
81     }
82 
83     @Override
getViewTypeCount()84     public int getViewTypeCount() {
85         return 1;
86     }
87 
88     @Override
getItemViewType(int position)89     public int getItemViewType(int position) {
90         return VIEW_TYPE_HISTORY_ITEM;
91     }
92 
93     @Override
getView(int position, View convertView, ViewGroup parent)94     public View getView(int position, View convertView, ViewGroup parent) {
95         // Make sure we have a valid convertView to start with
96         final View result  = convertView == null
97                 ? mLayoutInflater.inflate(R.layout.call_detail_history_item, parent, false)
98                 : convertView;
99 
100         PhoneCallDetails details = mPhoneCallDetails[position];
101         CallTypeIconsView callTypeIconView =
102                 (CallTypeIconsView) result.findViewById(R.id.call_type_icon);
103         TextView callTypeTextView = (TextView) result.findViewById(R.id.call_type_text);
104         TextView dateView = (TextView) result.findViewById(R.id.date);
105         TextView durationView = (TextView) result.findViewById(R.id.duration);
106 
107         int callType = details.callTypes[0];
108         boolean isVideoCall = (details.features & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO
109                 && CallUtil.isVideoEnabled(mContext);
110 
111         callTypeIconView.clear();
112         callTypeIconView.add(callType);
113         callTypeIconView.setShowVideo(isVideoCall);
114         callTypeTextView.setText(mCallTypeHelper.getCallTypeText(callType, isVideoCall));
115         // Set the date.
116         CharSequence dateValue = DateUtils.formatDateRange(mContext, details.date, details.date,
117                 DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE |
118                 DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_YEAR);
119         dateView.setText(dateValue);
120         // Set the duration
121         if (Calls.VOICEMAIL_TYPE == callType || CallTypeHelper.isMissedCallType(callType)) {
122             durationView.setVisibility(View.GONE);
123         } else {
124             durationView.setVisibility(View.VISIBLE);
125             durationView.setText(formatDurationAndDataUsage(details.duration, details.dataUsage));
126         }
127 
128         return result;
129     }
130 
formatDuration(long elapsedSeconds)131     private CharSequence formatDuration(long elapsedSeconds) {
132         long minutes = 0;
133         long seconds = 0;
134 
135         if (elapsedSeconds >= 60) {
136             minutes = elapsedSeconds / 60;
137             elapsedSeconds -= minutes * 60;
138             seconds = elapsedSeconds;
139             return mContext.getString(R.string.callDetailsDurationFormat, minutes, seconds);
140         } else {
141             seconds = elapsedSeconds;
142             return mContext.getString(R.string.callDetailsShortDurationFormat, seconds);
143         }
144     }
145 
146     /**
147      * Formats a string containing the call duration and the data usage (if specified).
148      *
149      * @param elapsedSeconds Total elapsed seconds.
150      * @param dataUsage Data usage in bytes, or null if not specified.
151      * @return String containing call duration and data usage.
152      */
formatDurationAndDataUsage(long elapsedSeconds, Long dataUsage)153     private CharSequence formatDurationAndDataUsage(long elapsedSeconds, Long dataUsage) {
154         CharSequence duration = formatDuration(elapsedSeconds);
155 
156         if (dataUsage != null) {
157             mDurationItems.clear();
158             mDurationItems.add(duration);
159             mDurationItems.add(Formatter.formatShortFileSize(mContext, dataUsage));
160 
161             return DialerUtils.join(mContext.getResources(), mDurationItems);
162         } else {
163             return duration;
164         }
165     }
166 }
167