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