194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng/* 294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Copyright (C) 2011 The Android Open Source Project 394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * 494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * you may not use this file except in compliance with the License. 694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * You may obtain a copy of the License at 794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * 894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * http://www.apache.org/licenses/LICENSE-2.0 994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * 1094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Unless required by applicable law or agreed to in writing, software 1194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * distributed under the License is distributed on an "AS IS" BASIS, 1294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * See the License for the specific language governing permissions and 1494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * limitations under the License. 1594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 1694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 1794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengpackage com.android.dialer.calllog; 1894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 1994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.content.Context; 2094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.provider.CallLog.Calls; 2194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.text.format.DateUtils; 228b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunnimport android.text.format.Formatter; 2394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.view.LayoutInflater; 2494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.view.View; 2594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.view.ViewGroup; 2694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.BaseAdapter; 2794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.widget.TextView; 2894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 2992b0e2fc719f925d22d8d77f0b51bb897453c448Paul Soulosimport com.android.contacts.common.CallUtil; 3091197049c458f07092b31501d2ed512180b13d58Chiao Chengimport com.android.dialer.PhoneCallDetails; 319554500572ba82fbd7adb0a1637206ef870ef09eChiao Chengimport com.android.dialer.R; 328b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunnimport com.android.dialer.util.DialerUtils; 338b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunnimport com.google.common.collect.Lists; 348b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn 358b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunnimport java.util.ArrayList; 3694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 3794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng/** 3894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Adapter for a ListView containing history items from the details of a call. 3994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 4094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengpublic class CallDetailHistoryAdapter extends BaseAdapter { 4194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** The top element is a blank header, which is hidden under the rest of the UI. */ 4294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final int VIEW_TYPE_HEADER = 0; 4394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** Each history item shows the detail of a call. */ 4494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final int VIEW_TYPE_HISTORY_ITEM = 1; 4594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 4694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final Context mContext; 4794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final LayoutInflater mLayoutInflater; 4894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final CallTypeHelper mCallTypeHelper; 4994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final PhoneCallDetails[] mPhoneCallDetails; 5094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 518b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn /** 528b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn * List of items to be concatenated together for duration strings. 538b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn */ 548b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn private ArrayList<CharSequence> mDurationItems = Lists.newArrayList(); 558b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn 5694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public CallDetailHistoryAdapter(Context context, LayoutInflater layoutInflater, 5718164c85000ad4049b787051b3ab472d2901c586Tyler Gunn CallTypeHelper callTypeHelper, PhoneCallDetails[] phoneCallDetails) { 5894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mContext = context; 5994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mLayoutInflater = layoutInflater; 6094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mCallTypeHelper = callTypeHelper; 6194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mPhoneCallDetails = phoneCallDetails; 6294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 6394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 6494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 6594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public boolean isEnabled(int position) { 6694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // None of history will be clickable. 6794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return false; 6894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 6994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 7094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 7194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public int getCount() { 7294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return mPhoneCallDetails.length + 1; 7394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 7494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 7594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 7694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public Object getItem(int position) { 7794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (position == 0) { 7894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return null; 7994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 8094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return mPhoneCallDetails[position - 1]; 8194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 8294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 8394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 8494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public long getItemId(int position) { 8594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (position == 0) { 8694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return -1; 8794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 8894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return position - 1; 8994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 9094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 9194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 9294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public int getViewTypeCount() { 9394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return 2; 9494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 9594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 9694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 9794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public int getItemViewType(int position) { 9894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (position == 0) { 9994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return VIEW_TYPE_HEADER; 10094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 10194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return VIEW_TYPE_HISTORY_ITEM; 10294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 10394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 10494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 10594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public View getView(int position, View convertView, ViewGroup parent) { 10694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (position == 0) { 10794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final View header = convertView == null 10894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng ? mLayoutInflater.inflate(R.layout.call_detail_history_header, parent, false) 10994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng : convertView; 11094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return header; 11194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 11294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 11394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Make sure we have a valid convertView to start with 11494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final View result = convertView == null 11594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng ? mLayoutInflater.inflate(R.layout.call_detail_history_item, parent, false) 11694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng : convertView; 11794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 11894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng PhoneCallDetails details = mPhoneCallDetails[position - 1]; 11994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng CallTypeIconsView callTypeIconView = 12094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng (CallTypeIconsView) result.findViewById(R.id.call_type_icon); 12194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng TextView callTypeTextView = (TextView) result.findViewById(R.id.call_type_text); 12294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng TextView dateView = (TextView) result.findViewById(R.id.date); 12394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng TextView durationView = (TextView) result.findViewById(R.id.duration); 12494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 12594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng int callType = details.callTypes[0]; 126ca630af11785b88d0646bb8751b8b4af32fd2b76Andrew Lee boolean isVideoCall = (details.features & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO 1270927dc6ef623bec56415d087885f6d2607da35f7Andrew Lee && CallUtil.isVideoEnabled(mContext); 1285619f2ed87cb207352c0ff5578348baeb69ee202Tyler Gunn 12994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng callTypeIconView.clear(); 13094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng callTypeIconView.add(callType); 1315619f2ed87cb207352c0ff5578348baeb69ee202Tyler Gunn callTypeIconView.setShowVideo(isVideoCall); 1325619f2ed87cb207352c0ff5578348baeb69ee202Tyler Gunn callTypeTextView.setText(mCallTypeHelper.getCallTypeText(callType, isVideoCall)); 13394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Set the date. 13494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng CharSequence dateValue = DateUtils.formatDateRange(mContext, details.date, details.date, 13594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | 13694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_YEAR); 13794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng dateView.setText(dateValue); 13894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Set the duration 13966b60af960e3bf2e3b425966026e4b8ed8d01a03Yorke Lee if (Calls.VOICEMAIL_TYPE == callType || CallTypeHelper.isMissedCallType(callType)) { 14094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng durationView.setVisibility(View.GONE); 14194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else { 14294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng durationView.setVisibility(View.VISIBLE); 1438b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn durationView.setText(formatDurationAndDataUsage(details.duration, details.dataUsage)); 14494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 14594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 14694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return result; 14794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 14894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 1498b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn private CharSequence formatDuration(long elapsedSeconds) { 15094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng long minutes = 0; 15194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng long seconds = 0; 15294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 15394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (elapsedSeconds >= 60) { 15494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng minutes = elapsedSeconds / 60; 15594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng elapsedSeconds -= minutes * 60; 1562edcc52884f5ce28df261573ec87b876bc00f963Roshan Pius seconds = elapsedSeconds; 1572edcc52884f5ce28df261573ec87b876bc00f963Roshan Pius return mContext.getString(R.string.callDetailsDurationFormat, minutes, seconds); 1582edcc52884f5ce28df261573ec87b876bc00f963Roshan Pius } else { 1592edcc52884f5ce28df261573ec87b876bc00f963Roshan Pius seconds = elapsedSeconds; 1602edcc52884f5ce28df261573ec87b876bc00f963Roshan Pius return mContext.getString(R.string.callDetailsShortDurationFormat, seconds); 16194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 16294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 1638b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn 1648b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn /** 1658b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn * Formats a string containing the call duration and the data usage (if specified). 1668b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn * 1678b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn * @param elapsedSeconds Total elapsed seconds. 1688b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn * @param dataUsage Data usage in bytes, or null if not specified. 1698b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn * @return String containing call duration and data usage. 1708b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn */ 1718b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn private CharSequence formatDurationAndDataUsage(long elapsedSeconds, Long dataUsage) { 1728b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn CharSequence duration = formatDuration(elapsedSeconds); 1738b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn 1748b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn if (dataUsage != null) { 1758b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn mDurationItems.clear(); 1768b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn mDurationItems.add(duration); 1778b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn mDurationItems.add(Formatter.formatShortFileSize(mContext, dataUsage)); 1788b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn 1798b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn return DialerUtils.join(mContext.getResources(), mDurationItems); 1808b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn } else { 1818b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn return duration; 1828b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn } 1838b0e858d5b4c50813dbe2b5c244e7013814b23ecTyler Gunn } 18494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng} 185