DeliveryReportActivity.java revision f7e8281a223af6228e6399055a6197a1edd9bc3a
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
2072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.R;
21f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.pdu.PduHeaders;
22fd644551e8506266aad2b76463b51b44154ed62fTom Taylorimport android.database.sqlite.SqliteWrapper;
2372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.app.ListActivity;
2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Intent;
2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.Cursor;
2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.net.Uri;
2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Bundle;
29f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Mms;
30f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Sms;
3172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.telephony.PhoneNumberUtils;
3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.TextUtils;
3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log;
3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.LayoutInflater;
3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.View;
3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.Window;
3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.ListView;
3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.ArrayList;
4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.HashMap;
4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.Iterator;
4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.List;
4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.Map;
4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport java.util.Set;
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
7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Sms.STATUS              //1
7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    };
7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // These indices must sync up with the projections above.
8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final int COLUMN_RECIPIENT           = 0;
8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final int COLUMN_DELIVERY_REPORT     = 1;
8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final int COLUMN_READ_REPORT         = 2;
8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final int COLUMN_DELIVERY_STATUS     = 1;
8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final int COLUMN_READ_STATUS         = 2;
8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private long mMessageId;
8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private String mMessageType;
8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void onCreate(Bundle icicle) {
9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onCreate(icicle);
9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        requestWindowFeature(Window.FEATURE_NO_TITLE);
9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        setContentView(R.layout.delivery_report_activity);
9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Intent intent = getIntent();
9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mMessageId = getMessageId(icicle, intent);
9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mMessageType = getMessageType(icicle, intent);
9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        initListView();
10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        initListAdapter();
10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void initListView() {
10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Add the header for the list view.
10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        LayoutInflater inflater = getLayoutInflater();
10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        View header = inflater.inflate(R.layout.delivery_report_header, null);
10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        getListView().addHeaderView(header, null, true);
10872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
10972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void initListAdapter() {
11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        List<DeliveryReportItem> items = getReportItems();
11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (items == null) {
11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            items = new ArrayList<DeliveryReportItem>(1);
11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            items.add(new DeliveryReportItem("", getString(R.string.status_none)));
11572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Log.w(LOG_TAG, "cursor == null");
11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        setListAdapter(new DeliveryReportAdapter(this, items));
11872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void onResume() {
12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onResume();
12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        refreshDeliveryReport();
12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void refreshDeliveryReport() {
12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        ListView list = getListView();
12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        list.invalidateViews();
12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        list.requestFocus();
13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private long getMessageId(Bundle icicle, Intent intent) {
13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        long msgId = 0L;
13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (icicle != null) {
13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            msgId = icicle.getLong("message_id");
13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (msgId == 0L) {
14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            msgId = intent.getLongExtra("message_id", 0L);
14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return msgId;
14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private String getMessageType(Bundle icicle, Intent intent) {
14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        String msgType = null;
14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (icicle != null) {
15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            msgType = icicle.getString("message_type");
15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (msgType == null) {
15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            msgType = intent.getStringExtra("message_type");
15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return msgType;
15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private List<DeliveryReportItem> getReportItems() {
16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (mMessageType.equals("sms")) {
16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return getSmsReportItems();
16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else {
16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return getMmsReportItems();
16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private List<DeliveryReportItem> getSmsReportItems() {
16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        String selection = "_id = " + mMessageId;
17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Cursor c = SqliteWrapper.query(this, getContentResolver(), Sms.CONTENT_URI,
17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                              SMS_REPORT_STATUS_PROJECTION, selection, null, null);
17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (c == null) {
17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return null;
17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        try {
17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (c.getCount() <= 0) {
17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return null;
17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            List<DeliveryReportItem> items = new ArrayList<DeliveryReportItem>();
18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            while (c.moveToNext()) {
18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                items.add(new DeliveryReportItem(
18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                getString(R.string.recipient_label) + c.getString(COLUMN_RECIPIENT),
18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                getString(R.string.status_label) +
18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                    getSmsStatusText(c.getInt(COLUMN_DELIVERY_STATUS))));
18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
18872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return items;
18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } finally {
19072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            c.close();
19172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
19272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
19372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
19472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private String getMmsReportStatusText(
19572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            MmsReportRequest request,
19672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Map<String, MmsReportStatus> reportStatus) {
19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (reportStatus == null) {
19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // haven't received any reports.
19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return getString(R.string.status_pending);
20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        String recipient = request.getRecipient();
20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        recipient = (Mms.isEmailAddress(recipient))?
20420b79e068c8aebff46f24fd3803cf7697df4eac4Ficus Kirkpatrick                Mms.extractAddrSpec(recipient): PhoneNumberUtils.stripSeparators(recipient);
20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        MmsReportStatus status = queryStatusByRecipient(reportStatus, recipient);
20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (status == null) {
20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // haven't received any reports.
20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return getString(R.string.status_pending);
20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
21072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (request.isReadReportRequested()) {
21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (status.readStatus != 0) {
21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                switch (status.readStatus) {
21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    case PduHeaders.READ_STATUS_READ:
21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        return getString(R.string.status_read);
21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    case PduHeaders.READ_STATUS__DELETED_WITHOUT_BEING_READ:
21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        return getString(R.string.status_unread);
21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        switch (status.deliveryStatus) {
22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case 0: // No delivery report received so far.
22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return getString(R.string.status_pending);
22572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case PduHeaders.STATUS_FORWARDED:
22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case PduHeaders.STATUS_RETRIEVED:
22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return getString(R.string.status_received);
22872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            case PduHeaders.STATUS_REJECTED:
22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return getString(R.string.status_rejected);
23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            default:
23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return getString(R.string.status_failed);
23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static MmsReportStatus queryStatusByRecipient(
23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Map<String, MmsReportStatus> status, String recipient) {
23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Set<String> recipientSet = status.keySet();
23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Iterator<String> iterator = recipientSet.iterator();
23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        while (iterator.hasNext()) {
24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            String r = iterator.next();
24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (Mms.isEmailAddress(recipient)) {
24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                if (TextUtils.equals(r, recipient)) {
24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    return status.get(r);
24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                }
24572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            else if (PhoneNumberUtils.compare(r, recipient)) {
24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return status.get(r);
24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return null;
25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private List<DeliveryReportItem> getMmsReportItems() {
25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        List<MmsReportRequest> reportReqs = getMmsReportRequests();
25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (null == reportReqs) {
25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return null;
25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (reportReqs.size() == 0) {
26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return null;
26172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
26272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
26372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Map<String, MmsReportStatus> reportStatus = getMmsReportStatus();
26472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        List<DeliveryReportItem> items = new ArrayList<DeliveryReportItem>();
26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        for (MmsReportRequest reportReq : reportReqs) {
26672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            String statusText = getString(R.string.status_label) +
26772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                getMmsReportStatusText(reportReq, reportStatus);
26872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            items.add(new DeliveryReportItem(getString(R.string.recipient_label) +
26972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    reportReq.getRecipient(), statusText));
27072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
27172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return items;
27272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
27372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
27472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private Map<String, MmsReportStatus> getMmsReportStatus() {
27572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Uri uri = Uri.withAppendedPath(Mms.REPORT_STATUS_URI,
27672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                       String.valueOf(mMessageId));
27772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Cursor c = SqliteWrapper.query(this, getContentResolver(), uri,
27872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                       MMS_REPORT_STATUS_PROJECTION, null, null, null);
27972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
28072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (c == null) {
28172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return null;
28272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
28372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
28472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        try {
28572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Map<String, MmsReportStatus> statusMap =
28672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    new HashMap<String, MmsReportStatus>();
28772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
28872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            while (c.moveToNext()) {
28972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                String recipient = c.getString(COLUMN_RECIPIENT);
29072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                recipient = (Mms.isEmailAddress(recipient))?
29172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                        Mms.extractAddrSpec(recipient):
29220b79e068c8aebff46f24fd3803cf7697df4eac4Ficus Kirkpatrick                                            PhoneNumberUtils.stripSeparators(recipient);
29372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                MmsReportStatus status = new MmsReportStatus(
29472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                        c.getInt(COLUMN_DELIVERY_STATUS),
29572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                        c.getInt(COLUMN_READ_STATUS));
29672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                statusMap.put(recipient, status);
29772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
29872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return statusMap;
29972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } finally {
30072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            c.close();
30172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
30272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
30372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
30472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private List<MmsReportRequest> getMmsReportRequests() {
30572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Uri uri = Uri.withAppendedPath(Mms.REPORT_REQUEST_URI,
30672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                       String.valueOf(mMessageId));
30772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Cursor c = SqliteWrapper.query(this, getContentResolver(), uri,
30872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                      MMS_REPORT_REQUEST_PROJECTION, null, null, null);
30972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (c == null) {
31172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return null;
31272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
31372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        try {
31572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (c.getCount() <= 0) {
31672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return null;
31772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
31872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
31972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            List<MmsReportRequest> reqList = new ArrayList<MmsReportRequest>();
32072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            while (c.moveToNext()) {
32172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                reqList.add(new MmsReportRequest(
32272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                c.getString(COLUMN_RECIPIENT),
32372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                c.getInt(COLUMN_DELIVERY_REPORT),
32472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                c.getInt(COLUMN_READ_REPORT)));
32572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
32672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return reqList;
32772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } finally {
32872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            c.close();
32972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
33072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
33172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
33272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private String getSmsStatusText(int status) {
33372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (status == Sms.STATUS_NONE) {
33472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // No delivery report requested
33572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return getString(R.string.status_none);
33672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (status >= Sms.STATUS_FAILED) {
33772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // Failure
33872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return getString(R.string.status_failed);
33972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (status >= Sms.STATUS_PENDING) {
34072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // Pending
34172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return getString(R.string.status_pending);
34272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else {
34372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // Success
34472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return getString(R.string.status_received);
34572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
34672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
34772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
34872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final class MmsReportStatus {
34972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        final int deliveryStatus;
35072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        final int readStatus;
35172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
35272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public MmsReportStatus(int drStatus, int rrStatus) {
35372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            deliveryStatus = drStatus;
35472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            readStatus = rrStatus;
35572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
35672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
35772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
35872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final class MmsReportRequest {
35972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        private final String mRecipient;
36072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        private final boolean mIsDeliveryReportRequsted;
36172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        private final boolean mIsReadReportRequested;
36272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
36372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public MmsReportRequest(String recipient, int drValue, int rrValue) {
36472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mRecipient = recipient;
36572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mIsDeliveryReportRequsted = drValue == PduHeaders.VALUE_YES;
36672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mIsReadReportRequested = rrValue == PduHeaders.VALUE_YES;
36772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
36872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
36972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public String getRecipient() {
37072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return mRecipient;
37172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
37272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
37372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public boolean isDeliveryReportRequested() {
37472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return mIsDeliveryReportRequsted;
37572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
37672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
37772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        public boolean isReadReportRequested() {
37872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return mIsReadReportRequested;
37972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
38072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
38172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
382