172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/*
272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2008 Esmertec AG.
372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * you may not use this file except in compliance with the License.
772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * You may obtain a copy of the License at
872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
1072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
1172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * See the License for the specific language governing permissions and
1572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * limitations under the License.
1672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
1772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
1872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpackage com.android.mms.ui;
1972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.ArrayList;
21d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.HashMap;
22d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.Iterator;
23d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.List;
24d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.Map;
25d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.Set;
2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.app.ListActivity;
2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Intent;
2972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.Cursor;
30d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport android.database.sqlite.SqliteWrapper;
3172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.net.Uri;
3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Bundle;
33f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Mms;
34f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Sms;
3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.telephony.PhoneNumberUtils;
3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.TextUtils;
3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log;
3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.LayoutInflater;
3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.View;
4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.Window;
4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.ListView;
4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
43d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.android.mms.R;
44d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport com.google.android.mms.pdu.PduHeaders;
4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/**
4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * This is the UI for displaying a delivery report:
4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * This activity can handle the following parameters from the intent
5072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * by which it is launched:
5172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * thread_id long The id of the conversation from which to get the recipients
5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *      for the report.
5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * message_id long The id of the message about which a report should be displayed.
5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * message_type String The type of message (Sms or Mms).  This is used in
5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *      conjunction with the message id to retrive the particular message that
5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *      the report will be about.
5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class DeliveryReportActivity extends ListActivity {
6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final String LOG_TAG = "DeliveryReportActivity";
6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final String[] MMS_REPORT_REQUEST_PROJECTION = new String[] {
6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Mms.Addr.ADDRESS,       //0
6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Mms.DELIVERY_REPORT,    //1
6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Mms.READ_REPORT         //2
6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    };
6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final String[] MMS_REPORT_STATUS_PROJECTION = new String[] {
6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Mms.Addr.ADDRESS,       //0
7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        "delivery_status",      //1
7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        "read_status"           //2
7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    };
7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final String[] SMS_REPORT_STATUS_PROJECTION = new String[] {
7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Sms.ADDRESS,            //0
76831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor        Sms.STATUS,             //1
77831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor        Sms.DATE_SENT,          //2
78831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor        Sms.TYPE                //3
7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    };
8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // These indices must sync up with the projections above.
8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final int COLUMN_RECIPIENT           = 0;
8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final int COLUMN_DELIVERY_REPORT     = 1;
8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final int COLUMN_READ_REPORT         = 2;
8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final int COLUMN_DELIVERY_STATUS     = 1;
8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final int COLUMN_READ_STATUS         = 2;
87831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor    static final int COLUMN_DATE_SENT           = 2;
88831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor    static final int COLUMN_MESSAGE_TYPE        = 3;
8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private long mMessageId;
9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private String mMessageType;
9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void onCreate(Bundle icicle) {
9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onCreate(icicle);
9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        requestWindowFeature(Window.FEATURE_NO_TITLE);
9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        setContentView(R.layout.delivery_report_activity);
9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Intent intent = getIntent();
10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mMessageId = getMessageId(icicle, intent);
10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mMessageType = getMessageType(icicle, intent);
10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        initListView();
10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        initListAdapter();
10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void initListView() {
10872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Add the header for the list view.
10972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        LayoutInflater inflater = getLayoutInflater();
11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        View header = inflater.inflate(R.layout.delivery_report_header, null);
11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        getListView().addHeaderView(header, null, true);
11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void initListAdapter() {
11572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        List<DeliveryReportItem> items = getReportItems();
11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (items == null) {
11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            items = new ArrayList<DeliveryReportItem>(1);
118831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor            items.add(new DeliveryReportItem("", getString(R.string.status_none), null));
11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Log.w(LOG_TAG, "cursor == null");
12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        setListAdapter(new DeliveryReportAdapter(this, items));
12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void onResume() {
12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onResume();
12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        refreshDeliveryReport();
12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void refreshDeliveryReport() {
13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        ListView list = getListView();
13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        list.invalidateViews();
13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        list.requestFocus();
13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private long getMessageId(Bundle icicle, Intent intent) {
13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        long msgId = 0L;
13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (icicle != null) {
14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            msgId = icicle.getLong("message_id");
14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (msgId == 0L) {
14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            msgId = intent.getLongExtra("message_id", 0L);
14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return msgId;
14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private String getMessageType(Bundle icicle, Intent intent) {
15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        String msgType = null;
15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (icicle != null) {
15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            msgType = icicle.getString("message_type");
15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (msgType == null) {
15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            msgType = intent.getStringExtra("message_type");
15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return msgType;
16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private List<DeliveryReportItem> getReportItems() {
16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (mMessageType.equals("sms")) {
16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return getSmsReportItems();
16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else {
16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return getMmsReportItems();
16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private List<DeliveryReportItem> getSmsReportItems() {
17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        String selection = "_id = " + mMessageId;
17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Cursor c = SqliteWrapper.query(this, getContentResolver(), Sms.CONTENT_URI,
17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                              SMS_REPORT_STATUS_PROJECTION, selection, null, null);
17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (c == null) {
17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return null;
17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        try {
18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (c.getCount() <= 0) {
18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return null;
18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            List<DeliveryReportItem> items = new ArrayList<DeliveryReportItem>();
18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            while (c.moveToNext()) {
187831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor                // For sent messages with delivery reports, we stick the delivery time in the
188831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor                // date_sent column (see MessageStatusReceiver).
189831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor                String deliveryDateString = null;
190831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor                long deliveryDate = c.getLong(COLUMN_DATE_SENT);
191831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor                int messageType = c.getInt(COLUMN_MESSAGE_TYPE);
192831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor                if (messageType == Sms.MESSAGE_TYPE_SENT && deliveryDate > 0) {
193831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor                    deliveryDateString = getString(R.string.delivered_label) +
194831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor                            MessageUtils.formatTimeStampString(this,
195831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor                                    deliveryDate, true);
196831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor                }
197831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor
19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                items.add(new DeliveryReportItem(
19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                getString(R.string.recipient_label) + c.getString(COLUMN_RECIPIENT),
200831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor                                getString(R.string.status_label) +
201831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor                                        getSmsStatusText(c.getInt(COLUMN_DELIVERY_STATUS)),
202831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor                                        deliveryDateString));
20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return items;
20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } finally {
20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            c.close();
20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
21072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private String getMmsReportStatusText(
21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            MmsReportRequest request,
21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Map<String, MmsReportStatus> reportStatus) {
21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (reportStatus == null) {
21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // haven't received any reports.
21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return getString(R.string.status_pending);
21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        String recipient = request.getRecipient();
21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        recipient = (Mms.isEmailAddress(recipient))?
22020b79e068c8aebff46f24fd3803cf7697df4eac4Ficus Kirkpatrick                Mms.extractAddrSpec(recipient): PhoneNumberUtils.stripSeparators(recipient);
22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        MmsReportStatus status = queryStatusByRecipient(reportStatus, recipient);
22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (status == null) {
22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // haven't received any reports.
22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return getString(R.string.status_pending);
22572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (request.isReadReportRequested()) {
22872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (status.readStatus != 0) {
22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                switch (status.readStatus) {
23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    case PduHeaders.READ_STATUS_READ:
23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        return getString(R.string.status_read);
23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    case PduHeaders.READ_STATUS__DELETED_WITHOUT_BEING_READ:
23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        return getString(R.string.status_unread);
23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        switch (status.deliveryStatus) {
23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case 0: // No delivery report received so far.
24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return getString(R.string.status_pending);
24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case PduHeaders.STATUS_FORWARDED:
24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case PduHeaders.STATUS_RETRIEVED:
24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return getString(R.string.status_received);
24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case PduHeaders.STATUS_REJECTED:
24572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return getString(R.string.status_rejected);
24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            default:
24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return getString(R.string.status_failed);
24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static MmsReportStatus queryStatusByRecipient(
25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Map<String, MmsReportStatus> status, String recipient) {
25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Set<String> recipientSet = status.keySet();
25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Iterator<String> iterator = recipientSet.iterator();
25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        while (iterator.hasNext()) {
25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            String r = iterator.next();
25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (Mms.isEmailAddress(recipient)) {
25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                if (TextUtils.equals(r, recipient)) {
25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    return status.get(r);
26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
26172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
26272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            else if (PhoneNumberUtils.compare(r, recipient)) {
26372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return status.get(r);
26472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
26672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return null;
26772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
26872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
26972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private List<DeliveryReportItem> getMmsReportItems() {
27072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        List<MmsReportRequest> reportReqs = getMmsReportRequests();
27172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (null == reportReqs) {
27272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return null;
27372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
27472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
27572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (reportReqs.size() == 0) {
27672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return null;
27772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
27872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
27972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Map<String, MmsReportStatus> reportStatus = getMmsReportStatus();
28072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        List<DeliveryReportItem> items = new ArrayList<DeliveryReportItem>();
28172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        for (MmsReportRequest reportReq : reportReqs) {
282831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor            String statusText = getString(R.string.status_label) +
28372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                getMmsReportStatusText(reportReq, reportStatus);
284831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor            items.add(new DeliveryReportItem(getString(R.string.recipient_label) +
285831b1232edf7f01b9d31322083ad0180b2b375b9Tom Taylor                    reportReq.getRecipient(), statusText, null));
28672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
28772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return items;
28872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
28972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
29072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private Map<String, MmsReportStatus> getMmsReportStatus() {
29172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Uri uri = Uri.withAppendedPath(Mms.REPORT_STATUS_URI,
29272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                       String.valueOf(mMessageId));
29372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Cursor c = SqliteWrapper.query(this, getContentResolver(), uri,
29472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                       MMS_REPORT_STATUS_PROJECTION, null, null, null);
29572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
29672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (c == null) {
29772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return null;
29872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
29972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
30072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        try {
30172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Map<String, MmsReportStatus> statusMap =
30272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    new HashMap<String, MmsReportStatus>();
30372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
30472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            while (c.moveToNext()) {
30572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                String recipient = c.getString(COLUMN_RECIPIENT);
30672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                recipient = (Mms.isEmailAddress(recipient))?
30772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                        Mms.extractAddrSpec(recipient):
30820b79e068c8aebff46f24fd3803cf7697df4eac4Ficus Kirkpatrick                                            PhoneNumberUtils.stripSeparators(recipient);
30972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                MmsReportStatus status = new MmsReportStatus(
31072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                        c.getInt(COLUMN_DELIVERY_STATUS),
31172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                        c.getInt(COLUMN_READ_STATUS));
31272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                statusMap.put(recipient, status);
31372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
31472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return statusMap;
31572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } finally {
31672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            c.close();
31772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
31872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
31972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
32072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private List<MmsReportRequest> getMmsReportRequests() {
32172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Uri uri = Uri.withAppendedPath(Mms.REPORT_REQUEST_URI,
32272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                       String.valueOf(mMessageId));
32372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Cursor c = SqliteWrapper.query(this, getContentResolver(), uri,
32472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                      MMS_REPORT_REQUEST_PROJECTION, null, null, null);
32572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
32672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (c == null) {
32772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return null;
32872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
32972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
33072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        try {
33172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (c.getCount() <= 0) {
33272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return null;
33372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
33472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
33572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            List<MmsReportRequest> reqList = new ArrayList<MmsReportRequest>();
33672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            while (c.moveToNext()) {
33772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                reqList.add(new MmsReportRequest(
33872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                c.getString(COLUMN_RECIPIENT),
33972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                c.getInt(COLUMN_DELIVERY_REPORT),
34072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                c.getInt(COLUMN_READ_REPORT)));
34172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
34272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return reqList;
34372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } finally {
34472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            c.close();
34572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
34672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
34772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
34872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private String getSmsStatusText(int status) {
34972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (status == Sms.STATUS_NONE) {
35072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // No delivery report requested
35172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return getString(R.string.status_none);
35272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (status >= Sms.STATUS_FAILED) {
35372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // Failure
35472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return getString(R.string.status_failed);
35572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (status >= Sms.STATUS_PENDING) {
35672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // Pending
35772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return getString(R.string.status_pending);
35872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else {
35972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // Success
36072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return getString(R.string.status_received);
36172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
36272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
36372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
36472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final class MmsReportStatus {
36572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        final int deliveryStatus;
36672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        final int readStatus;
36772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
36872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public MmsReportStatus(int drStatus, int rrStatus) {
36972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            deliveryStatus = drStatus;
37072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            readStatus = rrStatus;
37172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
37272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
37372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
37472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final class MmsReportRequest {
37572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        private final String mRecipient;
37672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        private final boolean mIsDeliveryReportRequsted;
37772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        private final boolean mIsReadReportRequested;
37872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
37972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public MmsReportRequest(String recipient, int drValue, int rrValue) {
38072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mRecipient = recipient;
38172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mIsDeliveryReportRequsted = drValue == PduHeaders.VALUE_YES;
38272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mIsReadReportRequested = rrValue == PduHeaders.VALUE_YES;
38372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
38472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
38572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public String getRecipient() {
38672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return mRecipient;
38772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
38872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
38972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public boolean isDeliveryReportRequested() {
39072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return mIsDeliveryReportRequsted;
39172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
39272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
39372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public boolean isReadReportRequested() {
39472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return mIsReadReportRequested;
39572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
39672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
39772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
398