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.regex.Pattern;
21d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chen
2272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Context;
2372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.Cursor;
2472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Handler;
2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.provider.BaseColumns;
26f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Mms;
27f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.MmsSms;
28f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.MmsSms.PendingMessages;
29e9f32256c438d3560a986ae5695e25da748587beJesse Wilsonimport android.provider.Telephony.Sms;
30f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Sms.Conversations;
31f627528d5e7780baa20975c067637126c3fc0f57Tom Taylorimport android.provider.Telephony.TextBasedSmsColumns;
3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log;
33e9f32256c438d3560a986ae5695e25da748587beJesse Wilsonimport android.util.LruCache;
3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.LayoutInflater;
3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.View;
3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.ViewGroup;
379a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjievimport android.widget.AbsListView;
3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.CursorAdapter;
3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.ListView;
40d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chen
41e9f32256c438d3560a986ae5695e25da748587beJesse Wilsonimport com.android.mms.R;
42e9f32256c438d3560a986ae5695e25da748587beJesse Wilsonimport com.google.android.mms.MmsException;
4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/**
4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * The back-end data adapter of a message list.
4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class MessageListAdapter extends CursorAdapter {
4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final String TAG = "MessageListAdapter";
49313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor    private static final boolean LOCAL_LOGV = false;
5072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final String[] PROJECTION = new String[] {
526be18bedb5b87dbbcdb54f37d5a0945bd0f71377Tom Taylor        // TODO: should move this symbol into com.android.mms.telephony.Telephony.
5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        MmsSms.TYPE_DISCRIMINATOR_COLUMN,
5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        BaseColumns._ID,
5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Conversations.THREAD_ID,
5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // For SMS
5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Sms.ADDRESS,
5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Sms.BODY,
5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Sms.DATE,
6054711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert        Sms.DATE_SENT,
6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Sms.READ,
6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Sms.TYPE,
6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Sms.STATUS,
64440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor        Sms.LOCKED,
65161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor        Sms.ERROR_CODE,
6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // For MMS
6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Mms.SUBJECT,
6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Mms.SUBJECT_CHARSET,
6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Mms.DATE,
7054711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert        Mms.DATE_SENT,
7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Mms.READ,
7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Mms.MESSAGE_TYPE,
7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Mms.MESSAGE_BOX,
7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Mms.DELIVERY_REPORT,
7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Mms.READ_REPORT,
76440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor        PendingMessages.ERROR_TYPE,
77ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor        Mms.LOCKED,
784847b98115373613b09cf50f43a760e95dd9a15cTom Taylor        Mms.STATUS,
794847b98115373613b09cf50f43a760e95dd9a15cTom Taylor        Mms.TEXT_ONLY
8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    };
8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // The indexes of the default columns which must be consistent
8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // with above PROJECTION.
8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final int COLUMN_MSG_TYPE            = 0;
8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final int COLUMN_ID                  = 1;
8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final int COLUMN_THREAD_ID           = 2;
8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final int COLUMN_SMS_ADDRESS         = 3;
8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final int COLUMN_SMS_BODY            = 4;
8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    static final int COLUMN_SMS_DATE            = 5;
9054711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert    static final int COLUMN_SMS_DATE_SENT       = 6;
9154711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert    static final int COLUMN_SMS_READ            = 7;
9254711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert    static final int COLUMN_SMS_TYPE            = 8;
9354711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert    static final int COLUMN_SMS_STATUS          = 9;
9454711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert    static final int COLUMN_SMS_LOCKED          = 10;
9554711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert    static final int COLUMN_SMS_ERROR_CODE      = 11;
9654711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert    static final int COLUMN_MMS_SUBJECT         = 12;
9754711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert    static final int COLUMN_MMS_SUBJECT_CHARSET = 13;
9854711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert    static final int COLUMN_MMS_DATE            = 14;
9954711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert    static final int COLUMN_MMS_DATE_SENT       = 15;
10054711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert    static final int COLUMN_MMS_READ            = 16;
10154711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert    static final int COLUMN_MMS_MESSAGE_TYPE    = 17;
10254711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert    static final int COLUMN_MMS_MESSAGE_BOX     = 18;
10354711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert    static final int COLUMN_MMS_DELIVERY_REPORT = 19;
10454711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert    static final int COLUMN_MMS_READ_REPORT     = 20;
10554711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert    static final int COLUMN_MMS_ERROR_TYPE      = 21;
10654711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert    static final int COLUMN_MMS_LOCKED          = 22;
107ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor    static final int COLUMN_MMS_STATUS          = 23;
1084847b98115373613b09cf50f43a760e95dd9a15cTom Taylor    static final int COLUMN_MMS_TEXT_ONLY       = 24;
109440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor
110440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor    private static final int CACHE_SIZE         = 50;
111331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagner
112f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor    public static final int INCOMING_ITEM_TYPE_SMS = 0;
113f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor    public static final int OUTGOING_ITEM_TYPE_SMS = 1;
114f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor    public static final int INCOMING_ITEM_TYPE_MMS = 2;
115f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor    public static final int OUTGOING_ITEM_TYPE_MMS = 3;
116602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor
11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected LayoutInflater mInflater;
11851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    private final MessageItemCache mMessageItemCache;
11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private final ColumnsMap mColumnsMap;
12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private OnDataSetChangedListener mOnDataSetChangedListener;
12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private Handler mMsgListItemHandler;
122f114492537753bc68640d4a0d403861387296bcbMark Wagner    private Pattern mHighlight;
1236be18bedb5b87dbbcdb54f37d5a0945bd0f71377Tom Taylor    private Context mContext;
124c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor    private boolean mIsGroupConversation;
12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public MessageListAdapter(
12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Context context, Cursor c, ListView listView,
128f114492537753bc68640d4a0d403861387296bcbMark Wagner            boolean useDefaultColumnsMap, Pattern highlight) {
129c2f641cd6716e9e8ee8848811a21f51138f7d451Tom Taylor        super(context, c, FLAG_REGISTER_CONTENT_OBSERVER);
1306be18bedb5b87dbbcdb54f37d5a0945bd0f71377Tom Taylor        mContext = context;
131f114492537753bc68640d4a0d403861387296bcbMark Wagner        mHighlight = highlight;
132331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagner
13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mInflater = (LayoutInflater) context.getSystemService(
13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Context.LAYOUT_INFLATER_SERVICE);
13551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        mMessageItemCache = new MessageItemCache(CACHE_SIZE);
13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (useDefaultColumnsMap) {
13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mColumnsMap = new ColumnsMap();
13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else {
14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mColumnsMap = new ColumnsMap(c);
14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
1429a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev
1439a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev        listView.setRecyclerListener(new AbsListView.RecyclerListener() {
1449a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev            @Override
1459a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev            public void onMovedToScrapHeap(View view) {
1469a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev                if (view instanceof MessageListItem) {
1479a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev                    MessageListItem mli = (MessageListItem) view;
1489a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev                    // Clear references to resources
1499a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev                    mli.unbind();
1509a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev                }
1519a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev            }
1529a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev        });
15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void bindView(View view, Context context, Cursor cursor) {
15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (view instanceof MessageListItem) {
15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            String type = cursor.getString(mColumnsMap.mColumnMsgType);
15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            long msgId = cursor.getLong(mColumnsMap.mColumnMsgId);
160331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagner
16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            MessageItem msgItem = getCachedMessageItem(type, msgId, cursor);
16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (msgItem != null) {
163b948f78f926dbce6eb93d4e56b09786b2c4ff0f8Mark Wagner                MessageListItem mli = (MessageListItem) view;
164eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor                int position = cursor.getPosition();
165c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor                mli.bind(msgItem, mIsGroupConversation, position);
166b948f78f926dbce6eb93d4e56b09786b2c4ff0f8Mark Wagner                mli.setMsgListItemHandler(mMsgListItemHandler);
16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public interface OnDataSetChangedListener {
17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        void onDataSetChanged(MessageListAdapter adapter);
17367b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor        void onContentChanged(MessageListAdapter adapter);
17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setOnDataSetChangedListener(OnDataSetChangedListener l) {
17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mOnDataSetChangedListener = l;
17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setMsgListItemHandler(Handler handler) {
18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mMsgListItemHandler = handler;
18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
184c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor    public void setIsGroupConversation(boolean isGroup) {
185c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor        mIsGroupConversation = isGroup;
186c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor    }
187c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor
18851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    public void cancelBackgroundLoading() {
18951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        mMessageItemCache.evictAll();   // causes entryRemoved to be called for each MessageItem
19051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor                                        // in the cache which causes us to cancel loading of
19151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor                                        // background pdu's and images.
19251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    }
19351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor
19472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
19572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void notifyDataSetChanged() {
19672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.notifyDataSetChanged();
19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (LOCAL_LOGV) {
19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            Log.v(TAG, "MessageListAdapter.notifyDataSetChanged().");
19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
201e9f32256c438d3560a986ae5695e25da748587beJesse Wilson        mMessageItemCache.evictAll();
20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (mOnDataSetChangedListener != null) {
20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mOnDataSetChangedListener.onDataSetChanged(this);
20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
20967b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor    protected void onContentChanged() {
2106be18bedb5b87dbbcdb54f37d5a0945bd0f71377Tom Taylor        if (getCursor() != null && !getCursor().isClosed()) {
21167b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor            if (mOnDataSetChangedListener != null) {
21267b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor                mOnDataSetChangedListener.onContentChanged(this);
21367b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor            }
21467b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor        }
21567b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor    }
21667b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor
21767b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor    @Override
21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public View newView(Context context, Cursor cursor, ViewGroup parent) {
219f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor        int boxType = getItemViewType(cursor);
220f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor        View view = mInflater.inflate((boxType == INCOMING_ITEM_TYPE_SMS ||
221f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor                boxType == INCOMING_ITEM_TYPE_MMS) ?
222f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor                        R.layout.message_list_item_recv : R.layout.message_list_item_send,
223f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor                        parent, false);
224f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor        if (boxType == INCOMING_ITEM_TYPE_MMS || boxType == OUTGOING_ITEM_TYPE_MMS) {
225f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor            // We've got an mms item, pre-inflate the mms portion of the view
226f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor            view.findViewById(R.id.mms_layout_view_stub).setVisibility(View.VISIBLE);
227f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor        }
228f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor        return view;
22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public MessageItem getCachedMessageItem(String type, long msgId, Cursor c) {
23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        MessageItem item = mMessageItemCache.get(getKey(type, msgId));
23332fc80c3da56787085648b83940f897df56b83c4Tom Taylor        if (item == null && c != null && isCursorValid(c)) {
23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            try {
235331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagner                item = new MessageItem(mContext, type, c, mColumnsMap, mHighlight);
23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mMessageItemCache.put(getKey(item.mType, item.mMsgId), item);
23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } catch (MmsException e) {
2389b9f5da86e17db206e0581704f41383ee0805049Tom Taylor                Log.e(TAG, "getCachedMessageItem: ", e);
23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return item;
24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
24432fc80c3da56787085648b83940f897df56b83c4Tom Taylor    private boolean isCursorValid(Cursor cursor) {
24532fc80c3da56787085648b83940f897df56b83c4Tom Taylor        // Check whether the cursor is valid or not.
246ea339a26d0f2de0087d4c6ebf9f55c505b922695Tom Taylor        if (cursor == null || cursor.isClosed() || cursor.isBeforeFirst() || cursor.isAfterLast()) {
24732fc80c3da56787085648b83940f897df56b83c4Tom Taylor            return false;
24832fc80c3da56787085648b83940f897df56b83c4Tom Taylor        }
24932fc80c3da56787085648b83940f897df56b83c4Tom Taylor        return true;
25032fc80c3da56787085648b83940f897df56b83c4Tom Taylor    }
25132fc80c3da56787085648b83940f897df56b83c4Tom Taylor
25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static long getKey(String type, long id) {
25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (type.equals("mms")) {
25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return -id;
25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else {
25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return id;
25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
260602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor    @Override
261602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor    public boolean areAllItemsEnabled() {
262602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor        return true;
263602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor    }
264602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor
265f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor    /* MessageListAdapter says that it contains four types of views. Really, it just contains
266602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor     * a single type, a MessageListItem. Depending upon whether the message is an incoming or
267602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor     * outgoing message, the avatar and text and other items are laid out either left or right
268602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor     * justified. That works fine for everything but the message text. When views are recycled,
269602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor     * there's a greater than zero chance that the right-justified text on outgoing messages
270602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor     * will remain left-justified. The best solution at this point is to tell the adapter we've
271602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor     * got two different types of views. That way we won't recycle views between the two types.
272602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor     * @see android.widget.BaseAdapter#getViewTypeCount()
273602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor     */
274602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor    @Override
275602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor    public int getViewTypeCount() {
276f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor        return 4;   // Incoming and outgoing messages, both sms and mms
277602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor    }
278602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor
279602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor    @Override
280602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor    public int getItemViewType(int position) {
281602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor        Cursor cursor = (Cursor)getItem(position);
282ca1f651ece39b2b415519ca49b9bb5275b6a64bfTom Taylor        return getItemViewType(cursor);
283ca1f651ece39b2b415519ca49b9bb5275b6a64bfTom Taylor    }
284ca1f651ece39b2b415519ca49b9bb5275b6a64bfTom Taylor
285ca1f651ece39b2b415519ca49b9bb5275b6a64bfTom Taylor    private int getItemViewType(Cursor cursor) {
286602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor        String type = cursor.getString(mColumnsMap.mColumnMsgType);
287602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor        int boxId;
288602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor        if ("sms".equals(type)) {
289602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor            boxId = cursor.getInt(mColumnsMap.mColumnSmsType);
290f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor            // Note that messages from the SIM card all have a boxId of zero.
291f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor            return (boxId == TextBasedSmsColumns.MESSAGE_TYPE_INBOX ||
292f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor                    boxId == TextBasedSmsColumns.MESSAGE_TYPE_ALL) ?
293f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor                    INCOMING_ITEM_TYPE_SMS : OUTGOING_ITEM_TYPE_SMS;
294602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor        } else {
295602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor            boxId = cursor.getInt(mColumnsMap.mColumnMmsMessageBox);
296f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor            // Note that messages from the SIM card all have a boxId of zero: Mms.MESSAGE_BOX_ALL
297f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor            return (boxId == Mms.MESSAGE_BOX_INBOX || boxId == Mms.MESSAGE_BOX_ALL) ?
298f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor                    INCOMING_ITEM_TYPE_MMS : OUTGOING_ITEM_TYPE_MMS;
299602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor        }
300602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor    }
301602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor
30237fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor    public Cursor getCursorForItem(MessageItem item) {
30337fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor        Cursor cursor = getCursor();
30437fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor        if (isCursorValid(cursor)) {
30537fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor            if (cursor.moveToFirst()) {
30637fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor                do {
30737fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor                    long id = cursor.getLong(mRowIDColumn);
30837fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor                    if (id == item.mMsgId) {
30937fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor                        return cursor;
31037fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor                    }
31137fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor                } while (cursor.moveToNext());
31237fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor            }
31337fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor        }
31437fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor        return null;
31537fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor    }
31637fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor
31748da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor    public static class ColumnsMap {
31848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public int mColumnMsgType;
31948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public int mColumnMsgId;
32048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public int mColumnSmsAddress;
32148da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public int mColumnSmsBody;
32248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public int mColumnSmsDate;
32354711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert        public int mColumnSmsDateSent;
32448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public int mColumnSmsRead;
32548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public int mColumnSmsType;
32648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public int mColumnSmsStatus;
327440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor        public int mColumnSmsLocked;
328161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor        public int mColumnSmsErrorCode;
32948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public int mColumnMmsSubject;
33048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public int mColumnMmsSubjectCharset;
33148da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public int mColumnMmsDate;
33254711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert        public int mColumnMmsDateSent;
33348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public int mColumnMmsRead;
33448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public int mColumnMmsMessageType;
33548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public int mColumnMmsMessageBox;
33648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public int mColumnMmsDeliveryReport;
33748da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public int mColumnMmsReadReport;
33848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public int mColumnMmsErrorType;
339440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor        public int mColumnMmsLocked;
340ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor        public int mColumnMmsStatus;
3414847b98115373613b09cf50f43a760e95dd9a15cTom Taylor        public int mColumnMmsTextOnly;
34248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor
34348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public ColumnsMap() {
34472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mColumnMsgType            = COLUMN_MSG_TYPE;
34572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mColumnMsgId              = COLUMN_ID;
34672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mColumnSmsAddress         = COLUMN_SMS_ADDRESS;
34772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mColumnSmsBody            = COLUMN_SMS_BODY;
34872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mColumnSmsDate            = COLUMN_SMS_DATE;
34954711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert            mColumnSmsDateSent        = COLUMN_SMS_DATE_SENT;
35072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mColumnSmsType            = COLUMN_SMS_TYPE;
35172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mColumnSmsStatus          = COLUMN_SMS_STATUS;
352440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor            mColumnSmsLocked          = COLUMN_SMS_LOCKED;
353161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor            mColumnSmsErrorCode       = COLUMN_SMS_ERROR_CODE;
35472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mColumnMmsSubject         = COLUMN_MMS_SUBJECT;
35572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mColumnMmsSubjectCharset  = COLUMN_MMS_SUBJECT_CHARSET;
35672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mColumnMmsMessageType     = COLUMN_MMS_MESSAGE_TYPE;
35772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mColumnMmsMessageBox      = COLUMN_MMS_MESSAGE_BOX;
35872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mColumnMmsDeliveryReport  = COLUMN_MMS_DELIVERY_REPORT;
35972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mColumnMmsReadReport      = COLUMN_MMS_READ_REPORT;
36072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mColumnMmsErrorType       = COLUMN_MMS_ERROR_TYPE;
361440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor            mColumnMmsLocked          = COLUMN_MMS_LOCKED;
362ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor            mColumnMmsStatus          = COLUMN_MMS_STATUS;
3634847b98115373613b09cf50f43a760e95dd9a15cTom Taylor            mColumnMmsTextOnly        = COLUMN_MMS_TEXT_ONLY;
36472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
36572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
36648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor        public ColumnsMap(Cursor cursor) {
36772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // Ignore all 'not found' exceptions since the custom columns
36872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // may be just a subset of the default columns.
36972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            try {
37072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mColumnMsgType = cursor.getColumnIndexOrThrow(
37172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        MmsSms.TYPE_DISCRIMINATOR_COLUMN);
37272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } catch (IllegalArgumentException e) {
37372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.w("colsMap", e.getMessage());
37472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
37572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
37672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            try {
37772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mColumnMsgId = cursor.getColumnIndexOrThrow(BaseColumns._ID);
37872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } catch (IllegalArgumentException e) {
37972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.w("colsMap", e.getMessage());
38072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
38172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
38272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            try {
38372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mColumnSmsAddress = cursor.getColumnIndexOrThrow(Sms.ADDRESS);
38472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } catch (IllegalArgumentException e) {
38572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.w("colsMap", e.getMessage());
38672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
38772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
38872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            try {
38972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mColumnSmsBody = cursor.getColumnIndexOrThrow(Sms.BODY);
39072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } catch (IllegalArgumentException e) {
39172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.w("colsMap", e.getMessage());
39272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
39372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
39472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            try {
39572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mColumnSmsDate = cursor.getColumnIndexOrThrow(Sms.DATE);
39672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } catch (IllegalArgumentException e) {
39772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.w("colsMap", e.getMessage());
39872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
39972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
40072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            try {
40154711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert                mColumnSmsDateSent = cursor.getColumnIndexOrThrow(Sms.DATE_SENT);
40254711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert            } catch (IllegalArgumentException e) {
40354711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert                Log.w("colsMap", e.getMessage());
40454711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert            }
40554711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert
40654711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert            try {
40772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mColumnSmsType = cursor.getColumnIndexOrThrow(Sms.TYPE);
40872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } catch (IllegalArgumentException e) {
40972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.w("colsMap", e.getMessage());
41072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
41172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
41272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            try {
41372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mColumnSmsStatus = cursor.getColumnIndexOrThrow(Sms.STATUS);
41472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } catch (IllegalArgumentException e) {
41572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.w("colsMap", e.getMessage());
41672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
41772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
41872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            try {
419440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor                mColumnSmsLocked = cursor.getColumnIndexOrThrow(Sms.LOCKED);
420440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor            } catch (IllegalArgumentException e) {
421440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor                Log.w("colsMap", e.getMessage());
422440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor            }
423440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor
424440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor            try {
425161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor                mColumnSmsErrorCode = cursor.getColumnIndexOrThrow(Sms.ERROR_CODE);
426161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor            } catch (IllegalArgumentException e) {
427161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor                Log.w("colsMap", e.getMessage());
428161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor            }
429161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor
430161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor            try {
43172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mColumnMmsSubject = cursor.getColumnIndexOrThrow(Mms.SUBJECT);
43272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } catch (IllegalArgumentException e) {
43372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.w("colsMap", e.getMessage());
43472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
43572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
43672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            try {
43772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mColumnMmsSubjectCharset = cursor.getColumnIndexOrThrow(Mms.SUBJECT_CHARSET);
43872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } catch (IllegalArgumentException e) {
43972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.w("colsMap", e.getMessage());
44072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
44172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
44272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            try {
44372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mColumnMmsMessageType = cursor.getColumnIndexOrThrow(Mms.MESSAGE_TYPE);
44472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } catch (IllegalArgumentException e) {
44572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.w("colsMap", e.getMessage());
44672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
44772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
44872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            try {
44972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mColumnMmsMessageBox = cursor.getColumnIndexOrThrow(Mms.MESSAGE_BOX);
45072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } catch (IllegalArgumentException e) {
45172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.w("colsMap", e.getMessage());
45272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
45372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
45472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            try {
45572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mColumnMmsDeliveryReport = cursor.getColumnIndexOrThrow(Mms.DELIVERY_REPORT);
45672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } catch (IllegalArgumentException e) {
45772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.w("colsMap", e.getMessage());
45872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
45972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
46072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            try {
46172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mColumnMmsReadReport = cursor.getColumnIndexOrThrow(Mms.READ_REPORT);
46272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } catch (IllegalArgumentException e) {
46372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.w("colsMap", e.getMessage());
46472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
46572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
46672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            try {
46772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                mColumnMmsErrorType = cursor.getColumnIndexOrThrow(PendingMessages.ERROR_TYPE);
46872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            } catch (IllegalArgumentException e) {
46972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Log.w("colsMap", e.getMessage());
47072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
471331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagner
472440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor            try {
473440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor                mColumnMmsLocked = cursor.getColumnIndexOrThrow(Mms.LOCKED);
474440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor            } catch (IllegalArgumentException e) {
475440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor                Log.w("colsMap", e.getMessage());
476440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor            }
477ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor
478ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor            try {
479ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor                mColumnMmsStatus = cursor.getColumnIndexOrThrow(Mms.STATUS);
480ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor            } catch (IllegalArgumentException e) {
481ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor                Log.w("colsMap", e.getMessage());
482ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor            }
4834847b98115373613b09cf50f43a760e95dd9a15cTom Taylor
4844847b98115373613b09cf50f43a760e95dd9a15cTom Taylor            try {
4854847b98115373613b09cf50f43a760e95dd9a15cTom Taylor                mColumnMmsTextOnly = cursor.getColumnIndexOrThrow(Mms.TEXT_ONLY);
4864847b98115373613b09cf50f43a760e95dd9a15cTom Taylor            } catch (IllegalArgumentException e) {
4874847b98115373613b09cf50f43a760e95dd9a15cTom Taylor                Log.w("colsMap", e.getMessage());
4884847b98115373613b09cf50f43a760e95dd9a15cTom Taylor            }
48972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
49072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
4918b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner
49251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    private static class MessageItemCache extends LruCache<Long, MessageItem> {
49351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        public MessageItemCache(int maxSize) {
49451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor            super(maxSize);
49551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        }
49651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor
49751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        @Override
49851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        protected void entryRemoved(boolean evicted, Long key,
49951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor                MessageItem oldValue, MessageItem newValue) {
50051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor            oldValue.cancelPduLoading();
50151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        }
50251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    }
50372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
504