blob: ac56332cee2e1df19abd683edbfefe3eaf2069fc [file] [log] [blame]
/*
* 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.calllog;
import android.content.Context;
import android.provider.CallLog.Calls;
import android.text.format.DateUtils;
import android.text.format.Formatter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.android.contacts.common.CallUtil;
import com.android.dialer.PhoneCallDetails;
import com.android.dialer.R;
import com.android.dialer.util.DialerUtils;
import com.google.common.collect.Lists;
import java.util.ArrayList;
/**
* Adapter for a ListView containing history items from the details of a call.
*/
public class CallDetailHistoryAdapter extends BaseAdapter {
/** Each history item shows the detail of a call. */
private static final int VIEW_TYPE_HISTORY_ITEM = 1;
private final Context mContext;
private final LayoutInflater mLayoutInflater;
private final CallTypeHelper mCallTypeHelper;
private final PhoneCallDetails[] mPhoneCallDetails;
/**
* List of items to be concatenated together for duration strings.
*/
private ArrayList<CharSequence> mDurationItems = Lists.newArrayList();
public CallDetailHistoryAdapter(Context context, LayoutInflater layoutInflater,
CallTypeHelper callTypeHelper, PhoneCallDetails[] phoneCallDetails) {
mContext = context;
mLayoutInflater = layoutInflater;
mCallTypeHelper = callTypeHelper;
mPhoneCallDetails = phoneCallDetails;
}
@Override
public boolean isEnabled(int position) {
// None of history will be clickable.
return false;
}
@Override
public int getCount() {
return mPhoneCallDetails.length;
}
@Override
public Object getItem(int position) {
return mPhoneCallDetails[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public int getItemViewType(int position) {
return VIEW_TYPE_HISTORY_ITEM;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Make sure we have a valid convertView to start with
final View result = convertView == null
? mLayoutInflater.inflate(R.layout.call_detail_history_item, parent, false)
: convertView;
PhoneCallDetails details = mPhoneCallDetails[position];
CallTypeIconsView callTypeIconView =
(CallTypeIconsView) result.findViewById(R.id.call_type_icon);
TextView callTypeTextView = (TextView) result.findViewById(R.id.call_type_text);
TextView dateView = (TextView) result.findViewById(R.id.date);
TextView durationView = (TextView) result.findViewById(R.id.duration);
int callType = details.callTypes[0];
boolean isVideoCall = (details.features & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO
&& CallUtil.isVideoEnabled(mContext);
callTypeIconView.clear();
callTypeIconView.add(callType);
callTypeIconView.setShowVideo(isVideoCall);
callTypeTextView.setText(mCallTypeHelper.getCallTypeText(callType, isVideoCall));
// Set the date.
CharSequence dateValue = DateUtils.formatDateRange(mContext, details.date, details.date,
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE |
DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_YEAR);
dateView.setText(dateValue);
// Set the duration
if (Calls.VOICEMAIL_TYPE == callType || CallTypeHelper.isMissedCallType(callType)) {
durationView.setVisibility(View.GONE);
} else {
durationView.setVisibility(View.VISIBLE);
durationView.setText(formatDurationAndDataUsage(details.duration, details.dataUsage));
}
return result;
}
private CharSequence formatDuration(long elapsedSeconds) {
long minutes = 0;
long seconds = 0;
if (elapsedSeconds >= 60) {
minutes = elapsedSeconds / 60;
elapsedSeconds -= minutes * 60;
seconds = elapsedSeconds;
return mContext.getString(R.string.callDetailsDurationFormat, minutes, seconds);
} else {
seconds = elapsedSeconds;
return mContext.getString(R.string.callDetailsShortDurationFormat, seconds);
}
}
/**
* Formats a string containing the call duration and the data usage (if specified).
*
* @param elapsedSeconds Total elapsed seconds.
* @param dataUsage Data usage in bytes, or null if not specified.
* @return String containing call duration and data usage.
*/
private CharSequence formatDurationAndDataUsage(long elapsedSeconds, Long dataUsage) {
CharSequence duration = formatDuration(elapsedSeconds);
if (dataUsage != null) {
mDurationItems.clear();
mDurationItems.add(duration);
mDurationItems.add(Formatter.formatShortFileSize(mContext, dataUsage));
return DialerUtils.join(mContext.getResources(), mDurationItems);
} else {
return duration;
}
}
}