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