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 41ab845dee6565a8dfc384186bc8f2e801a2b087e1Ye Wenimport com.android.mms.LogTag; 42e9f32256c438d3560a986ae5695e25da748587beJesse Wilsonimport com.android.mms.R; 43e9f32256c438d3560a986ae5695e25da748587beJesse Wilsonimport com.google.android.mms.MmsException; 4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/** 4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * The back-end data adapter of a message list. 4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class MessageListAdapter extends CursorAdapter { 49ab845dee6565a8dfc384186bc8f2e801a2b087e1Ye Wen private static final String TAG = LogTag.TAG; 50313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor private static final boolean LOCAL_LOGV = false; 5172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final String[] PROJECTION = new String[] { 536be18bedb5b87dbbcdb54f37d5a0945bd0f71377Tom Taylor // TODO: should move this symbol into com.android.mms.telephony.Telephony. 5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MmsSms.TYPE_DISCRIMINATOR_COLUMN, 5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project BaseColumns._ID, 5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Conversations.THREAD_ID, 5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // For SMS 5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Sms.ADDRESS, 5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Sms.BODY, 6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Sms.DATE, 6154711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert Sms.DATE_SENT, 6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Sms.READ, 6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Sms.TYPE, 6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Sms.STATUS, 65440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor Sms.LOCKED, 66161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor Sms.ERROR_CODE, 6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // For MMS 6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.SUBJECT, 6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.SUBJECT_CHARSET, 7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.DATE, 7154711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert Mms.DATE_SENT, 7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.READ, 7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.MESSAGE_TYPE, 7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.MESSAGE_BOX, 7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.DELIVERY_REPORT, 7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Mms.READ_REPORT, 77440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor PendingMessages.ERROR_TYPE, 78ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor Mms.LOCKED, 794847b98115373613b09cf50f43a760e95dd9a15cTom Taylor Mms.STATUS, 804847b98115373613b09cf50f43a760e95dd9a15cTom Taylor Mms.TEXT_ONLY 8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // The indexes of the default columns which must be consistent 8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // with above PROJECTION. 8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final int COLUMN_MSG_TYPE = 0; 8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final int COLUMN_ID = 1; 8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final int COLUMN_THREAD_ID = 2; 8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final int COLUMN_SMS_ADDRESS = 3; 8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final int COLUMN_SMS_BODY = 4; 9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static final int COLUMN_SMS_DATE = 5; 9154711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert static final int COLUMN_SMS_DATE_SENT = 6; 9254711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert static final int COLUMN_SMS_READ = 7; 9354711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert static final int COLUMN_SMS_TYPE = 8; 9454711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert static final int COLUMN_SMS_STATUS = 9; 9554711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert static final int COLUMN_SMS_LOCKED = 10; 9654711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert static final int COLUMN_SMS_ERROR_CODE = 11; 9754711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert static final int COLUMN_MMS_SUBJECT = 12; 9854711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert static final int COLUMN_MMS_SUBJECT_CHARSET = 13; 9954711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert static final int COLUMN_MMS_DATE = 14; 10054711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert static final int COLUMN_MMS_DATE_SENT = 15; 10154711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert static final int COLUMN_MMS_READ = 16; 10254711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert static final int COLUMN_MMS_MESSAGE_TYPE = 17; 10354711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert static final int COLUMN_MMS_MESSAGE_BOX = 18; 10454711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert static final int COLUMN_MMS_DELIVERY_REPORT = 19; 10554711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert static final int COLUMN_MMS_READ_REPORT = 20; 10654711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert static final int COLUMN_MMS_ERROR_TYPE = 21; 10754711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert static final int COLUMN_MMS_LOCKED = 22; 108ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor static final int COLUMN_MMS_STATUS = 23; 1094847b98115373613b09cf50f43a760e95dd9a15cTom Taylor static final int COLUMN_MMS_TEXT_ONLY = 24; 110440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor 111440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor private static final int CACHE_SIZE = 50; 112331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagner 113f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor public static final int INCOMING_ITEM_TYPE_SMS = 0; 114f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor public static final int OUTGOING_ITEM_TYPE_SMS = 1; 115f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor public static final int INCOMING_ITEM_TYPE_MMS = 2; 116f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor public static final int OUTGOING_ITEM_TYPE_MMS = 3; 117602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor 11872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project protected LayoutInflater mInflater; 11951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor private final MessageItemCache mMessageItemCache; 12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private final ColumnsMap mColumnsMap; 12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private OnDataSetChangedListener mOnDataSetChangedListener; 12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private Handler mMsgListItemHandler; 123f114492537753bc68640d4a0d403861387296bcbMark Wagner private Pattern mHighlight; 1246be18bedb5b87dbbcdb54f37d5a0945bd0f71377Tom Taylor private Context mContext; 125c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor private boolean mIsGroupConversation; 12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public MessageListAdapter( 12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Context context, Cursor c, ListView listView, 129f114492537753bc68640d4a0d403861387296bcbMark Wagner boolean useDefaultColumnsMap, Pattern highlight) { 130c2f641cd6716e9e8ee8848811a21f51138f7d451Tom Taylor super(context, c, FLAG_REGISTER_CONTENT_OBSERVER); 1316be18bedb5b87dbbcdb54f37d5a0945bd0f71377Tom Taylor mContext = context; 132f114492537753bc68640d4a0d403861387296bcbMark Wagner mHighlight = highlight; 133331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagner 13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mInflater = (LayoutInflater) context.getSystemService( 13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Context.LAYOUT_INFLATER_SERVICE); 13651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mMessageItemCache = new MessageItemCache(CACHE_SIZE); 13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (useDefaultColumnsMap) { 13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnsMap = new ColumnsMap(); 14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnsMap = new ColumnsMap(c); 14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 1439a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev 1449a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev listView.setRecyclerListener(new AbsListView.RecyclerListener() { 1459a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev @Override 1469a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev public void onMovedToScrapHeap(View view) { 1479a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev if (view instanceof MessageListItem) { 1489a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev MessageListItem mli = (MessageListItem) view; 1499a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev // Clear references to resources 1509a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev mli.unbind(); 1519a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev } 1529a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev } 1539a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev }); 15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project @Override 15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void bindView(View view, Context context, Cursor cursor) { 15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (view instanceof MessageListItem) { 15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String type = cursor.getString(mColumnsMap.mColumnMsgType); 16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project long msgId = cursor.getLong(mColumnsMap.mColumnMsgId); 161331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagner 16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MessageItem msgItem = getCachedMessageItem(type, msgId, cursor); 16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (msgItem != null) { 164b948f78f926dbce6eb93d4e56b09786b2c4ff0f8Mark Wagner MessageListItem mli = (MessageListItem) view; 165eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor int position = cursor.getPosition(); 166c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor mli.bind(msgItem, mIsGroupConversation, position); 167b948f78f926dbce6eb93d4e56b09786b2c4ff0f8Mark Wagner mli.setMsgListItemHandler(mMsgListItemHandler); 16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public interface OnDataSetChangedListener { 17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project void onDataSetChanged(MessageListAdapter adapter); 17467b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor void onContentChanged(MessageListAdapter adapter); 17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setOnDataSetChangedListener(OnDataSetChangedListener l) { 17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mOnDataSetChangedListener = l; 17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setMsgListItemHandler(Handler handler) { 18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mMsgListItemHandler = handler; 18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 185c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor public void setIsGroupConversation(boolean isGroup) { 186c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor mIsGroupConversation = isGroup; 187c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor } 188c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor 18951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public void cancelBackgroundLoading() { 19051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mMessageItemCache.evictAll(); // causes entryRemoved to be called for each MessageItem 19151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor // in the cache which causes us to cancel loading of 19251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor // background pdu's and images. 19351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 19451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 19572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project @Override 19672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void notifyDataSetChanged() { 19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project super.notifyDataSetChanged(); 19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (LOCAL_LOGV) { 19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.v(TAG, "MessageListAdapter.notifyDataSetChanged()."); 20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 202e9f32256c438d3560a986ae5695e25da748587beJesse Wilson mMessageItemCache.evictAll(); 20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (mOnDataSetChangedListener != null) { 20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mOnDataSetChangedListener.onDataSetChanged(this); 20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project @Override 21067b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor protected void onContentChanged() { 2116be18bedb5b87dbbcdb54f37d5a0945bd0f71377Tom Taylor if (getCursor() != null && !getCursor().isClosed()) { 21267b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor if (mOnDataSetChangedListener != null) { 21367b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor mOnDataSetChangedListener.onContentChanged(this); 21467b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor } 21567b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor } 21667b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor } 21767b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor 21867b794480aaad0e1958df2988671b78ea03b76e1Tom Taylor @Override 21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public View newView(Context context, Cursor cursor, ViewGroup parent) { 220f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor int boxType = getItemViewType(cursor); 221f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor View view = mInflater.inflate((boxType == INCOMING_ITEM_TYPE_SMS || 222f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor boxType == INCOMING_ITEM_TYPE_MMS) ? 223f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor R.layout.message_list_item_recv : R.layout.message_list_item_send, 224f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor parent, false); 225f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor if (boxType == INCOMING_ITEM_TYPE_MMS || boxType == OUTGOING_ITEM_TYPE_MMS) { 226f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor // We've got an mms item, pre-inflate the mms portion of the view 227f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor view.findViewById(R.id.mms_layout_view_stub).setVisibility(View.VISIBLE); 228f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor } 229f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor return view; 23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public MessageItem getCachedMessageItem(String type, long msgId, Cursor c) { 23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MessageItem item = mMessageItemCache.get(getKey(type, msgId)); 23432fc80c3da56787085648b83940f897df56b83c4Tom Taylor if (item == null && c != null && isCursorValid(c)) { 23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 236331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagner item = new MessageItem(mContext, type, c, mColumnsMap, mHighlight); 23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mMessageItemCache.put(getKey(item.mType, item.mMsgId), item); 23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (MmsException e) { 2399b9f5da86e17db206e0581704f41383ee0805049Tom Taylor Log.e(TAG, "getCachedMessageItem: ", e); 24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return item; 24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 24532fc80c3da56787085648b83940f897df56b83c4Tom Taylor private boolean isCursorValid(Cursor cursor) { 24632fc80c3da56787085648b83940f897df56b83c4Tom Taylor // Check whether the cursor is valid or not. 247ea339a26d0f2de0087d4c6ebf9f55c505b922695Tom Taylor if (cursor == null || cursor.isClosed() || cursor.isBeforeFirst() || cursor.isAfterLast()) { 24832fc80c3da56787085648b83940f897df56b83c4Tom Taylor return false; 24932fc80c3da56787085648b83940f897df56b83c4Tom Taylor } 25032fc80c3da56787085648b83940f897df56b83c4Tom Taylor return true; 25132fc80c3da56787085648b83940f897df56b83c4Tom Taylor } 25232fc80c3da56787085648b83940f897df56b83c4Tom Taylor 25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static long getKey(String type, long id) { 25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (type.equals("mms")) { 25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return -id; 25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return id; 25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 261602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor @Override 262602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor public boolean areAllItemsEnabled() { 263602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor return true; 264602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor } 265602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor 266f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor /* MessageListAdapter says that it contains four types of views. Really, it just contains 267602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor * a single type, a MessageListItem. Depending upon whether the message is an incoming or 268602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor * outgoing message, the avatar and text and other items are laid out either left or right 269602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor * justified. That works fine for everything but the message text. When views are recycled, 270602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor * there's a greater than zero chance that the right-justified text on outgoing messages 271602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor * will remain left-justified. The best solution at this point is to tell the adapter we've 272602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor * got two different types of views. That way we won't recycle views between the two types. 273602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor * @see android.widget.BaseAdapter#getViewTypeCount() 274602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor */ 275602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor @Override 276602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor public int getViewTypeCount() { 277f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor return 4; // Incoming and outgoing messages, both sms and mms 278602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor } 279602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor 280602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor @Override 281602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor public int getItemViewType(int position) { 282602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor Cursor cursor = (Cursor)getItem(position); 283ca1f651ece39b2b415519ca49b9bb5275b6a64bfTom Taylor return getItemViewType(cursor); 284ca1f651ece39b2b415519ca49b9bb5275b6a64bfTom Taylor } 285ca1f651ece39b2b415519ca49b9bb5275b6a64bfTom Taylor 286ca1f651ece39b2b415519ca49b9bb5275b6a64bfTom Taylor private int getItemViewType(Cursor cursor) { 287602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor String type = cursor.getString(mColumnsMap.mColumnMsgType); 288602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor int boxId; 289602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor if ("sms".equals(type)) { 290602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor boxId = cursor.getInt(mColumnsMap.mColumnSmsType); 291f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor // Note that messages from the SIM card all have a boxId of zero. 292f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor return (boxId == TextBasedSmsColumns.MESSAGE_TYPE_INBOX || 293f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor boxId == TextBasedSmsColumns.MESSAGE_TYPE_ALL) ? 294f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor INCOMING_ITEM_TYPE_SMS : OUTGOING_ITEM_TYPE_SMS; 295602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor } else { 296602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor boxId = cursor.getInt(mColumnsMap.mColumnMmsMessageBox); 297f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor // Note that messages from the SIM card all have a boxId of zero: Mms.MESSAGE_BOX_ALL 298f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor return (boxId == Mms.MESSAGE_BOX_INBOX || boxId == Mms.MESSAGE_BOX_ALL) ? 299f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor INCOMING_ITEM_TYPE_MMS : OUTGOING_ITEM_TYPE_MMS; 300602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor } 301602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor } 302602c2d23651b9ff764cfca62cc8df922587c328eTom Taylor 30337fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor public Cursor getCursorForItem(MessageItem item) { 30437fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor Cursor cursor = getCursor(); 30537fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor if (isCursorValid(cursor)) { 30637fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor if (cursor.moveToFirst()) { 30737fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor do { 30837fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor long id = cursor.getLong(mRowIDColumn); 3098a453148a598bf2ec3926d1cd1d2ea9aa6c3a24fBin Yang String type = cursor.getString(mColumnsMap.mColumnMsgType); 3108a453148a598bf2ec3926d1cd1d2ea9aa6c3a24fBin Yang if (id == item.mMsgId && (type != null && type.equals(item.mType))) { 31137fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor return cursor; 31237fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor } 31337fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor } while (cursor.moveToNext()); 31437fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor } 31537fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor } 31637fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor return null; 31737fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor } 31837fcee8d52f7fa928b04cd34709eddf7a247fbedTom Taylor 31948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public static class ColumnsMap { 32048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int mColumnMsgType; 32148da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int mColumnMsgId; 32248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int mColumnSmsAddress; 32348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int mColumnSmsBody; 32448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int mColumnSmsDate; 32554711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert public int mColumnSmsDateSent; 32648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int mColumnSmsRead; 32748da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int mColumnSmsType; 32848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int mColumnSmsStatus; 329440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor public int mColumnSmsLocked; 330161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor public int mColumnSmsErrorCode; 33148da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int mColumnMmsSubject; 33248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int mColumnMmsSubjectCharset; 33348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int mColumnMmsDate; 33454711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert public int mColumnMmsDateSent; 33548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int mColumnMmsRead; 33648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int mColumnMmsMessageType; 33748da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int mColumnMmsMessageBox; 33848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int mColumnMmsDeliveryReport; 33948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int mColumnMmsReadReport; 34048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int mColumnMmsErrorType; 341440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor public int mColumnMmsLocked; 342ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor public int mColumnMmsStatus; 3434847b98115373613b09cf50f43a760e95dd9a15cTom Taylor public int mColumnMmsTextOnly; 34448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor 34548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public ColumnsMap() { 34672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMsgType = COLUMN_MSG_TYPE; 34772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMsgId = COLUMN_ID; 34872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnSmsAddress = COLUMN_SMS_ADDRESS; 34972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnSmsBody = COLUMN_SMS_BODY; 35072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnSmsDate = COLUMN_SMS_DATE; 35154711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert mColumnSmsDateSent = COLUMN_SMS_DATE_SENT; 35272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnSmsType = COLUMN_SMS_TYPE; 35372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnSmsStatus = COLUMN_SMS_STATUS; 354440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor mColumnSmsLocked = COLUMN_SMS_LOCKED; 355161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor mColumnSmsErrorCode = COLUMN_SMS_ERROR_CODE; 35672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMmsSubject = COLUMN_MMS_SUBJECT; 35772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMmsSubjectCharset = COLUMN_MMS_SUBJECT_CHARSET; 35872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMmsMessageType = COLUMN_MMS_MESSAGE_TYPE; 35972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMmsMessageBox = COLUMN_MMS_MESSAGE_BOX; 36072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMmsDeliveryReport = COLUMN_MMS_DELIVERY_REPORT; 36172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMmsReadReport = COLUMN_MMS_READ_REPORT; 36272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMmsErrorType = COLUMN_MMS_ERROR_TYPE; 363440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor mColumnMmsLocked = COLUMN_MMS_LOCKED; 364ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor mColumnMmsStatus = COLUMN_MMS_STATUS; 3654847b98115373613b09cf50f43a760e95dd9a15cTom Taylor mColumnMmsTextOnly = COLUMN_MMS_TEXT_ONLY; 36672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 36772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 36848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public ColumnsMap(Cursor cursor) { 36972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Ignore all 'not found' exceptions since the custom columns 37072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // may be just a subset of the default columns. 37172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 37272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMsgType = cursor.getColumnIndexOrThrow( 37372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MmsSms.TYPE_DISCRIMINATOR_COLUMN); 37472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 37572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w("colsMap", e.getMessage()); 37672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 37772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 37872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 37972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMsgId = cursor.getColumnIndexOrThrow(BaseColumns._ID); 38072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 38172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w("colsMap", e.getMessage()); 38272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 38372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 38472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 38572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnSmsAddress = cursor.getColumnIndexOrThrow(Sms.ADDRESS); 38672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 38772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w("colsMap", e.getMessage()); 38872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 38972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 39072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 39172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnSmsBody = cursor.getColumnIndexOrThrow(Sms.BODY); 39272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 39372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w("colsMap", e.getMessage()); 39472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 39572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 39672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 39772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnSmsDate = cursor.getColumnIndexOrThrow(Sms.DATE); 39872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 39972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w("colsMap", e.getMessage()); 40072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 40172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 40272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 40354711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert mColumnSmsDateSent = cursor.getColumnIndexOrThrow(Sms.DATE_SENT); 40454711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert } catch (IllegalArgumentException e) { 40554711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert Log.w("colsMap", e.getMessage()); 40654711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert } 40754711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert 40854711acb7191269e0a4723320bd74f29dd2c9223Fredrik Roubert try { 40972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnSmsType = cursor.getColumnIndexOrThrow(Sms.TYPE); 41072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 41172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w("colsMap", e.getMessage()); 41272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 41372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 41472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 41572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnSmsStatus = cursor.getColumnIndexOrThrow(Sms.STATUS); 41672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 41772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w("colsMap", e.getMessage()); 41872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 41972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 42072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 421440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor mColumnSmsLocked = cursor.getColumnIndexOrThrow(Sms.LOCKED); 422440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor } catch (IllegalArgumentException e) { 423440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor Log.w("colsMap", e.getMessage()); 424440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor } 425440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor 426440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor try { 427161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor mColumnSmsErrorCode = cursor.getColumnIndexOrThrow(Sms.ERROR_CODE); 428161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor } catch (IllegalArgumentException e) { 429161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor Log.w("colsMap", e.getMessage()); 430161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor } 431161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor 432161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor try { 43372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMmsSubject = cursor.getColumnIndexOrThrow(Mms.SUBJECT); 43472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 43572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w("colsMap", e.getMessage()); 43672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 43772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 43872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 43972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMmsSubjectCharset = cursor.getColumnIndexOrThrow(Mms.SUBJECT_CHARSET); 44072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 44172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w("colsMap", e.getMessage()); 44272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 44372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 44472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 44572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMmsMessageType = cursor.getColumnIndexOrThrow(Mms.MESSAGE_TYPE); 44672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 44772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w("colsMap", e.getMessage()); 44872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 44972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 45072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 45172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMmsMessageBox = cursor.getColumnIndexOrThrow(Mms.MESSAGE_BOX); 45272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 45372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w("colsMap", e.getMessage()); 45472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 45572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 45672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 45772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMmsDeliveryReport = cursor.getColumnIndexOrThrow(Mms.DELIVERY_REPORT); 45872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 45972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w("colsMap", e.getMessage()); 46072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 46172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 46272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 46372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMmsReadReport = cursor.getColumnIndexOrThrow(Mms.READ_REPORT); 46472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 46572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w("colsMap", e.getMessage()); 46672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 46772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 46872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 46972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mColumnMmsErrorType = cursor.getColumnIndexOrThrow(PendingMessages.ERROR_TYPE); 47072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (IllegalArgumentException e) { 47172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w("colsMap", e.getMessage()); 47272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 473331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagner 474440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor try { 475440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor mColumnMmsLocked = cursor.getColumnIndexOrThrow(Mms.LOCKED); 476440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor } catch (IllegalArgumentException e) { 477440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor Log.w("colsMap", e.getMessage()); 478440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor } 479ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor 480ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor try { 481ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor mColumnMmsStatus = cursor.getColumnIndexOrThrow(Mms.STATUS); 482ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor } catch (IllegalArgumentException e) { 483ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor Log.w("colsMap", e.getMessage()); 484ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor } 4854847b98115373613b09cf50f43a760e95dd9a15cTom Taylor 4864847b98115373613b09cf50f43a760e95dd9a15cTom Taylor try { 4874847b98115373613b09cf50f43a760e95dd9a15cTom Taylor mColumnMmsTextOnly = cursor.getColumnIndexOrThrow(Mms.TEXT_ONLY); 4884847b98115373613b09cf50f43a760e95dd9a15cTom Taylor } catch (IllegalArgumentException e) { 4894847b98115373613b09cf50f43a760e95dd9a15cTom Taylor Log.w("colsMap", e.getMessage()); 4904847b98115373613b09cf50f43a760e95dd9a15cTom Taylor } 49172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 49272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 4938b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner 49451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor private static class MessageItemCache extends LruCache<Long, MessageItem> { 49551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public MessageItemCache(int maxSize) { 49651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor super(maxSize); 49751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 49851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 49951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor @Override 50051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor protected void entryRemoved(boolean evicted, Long key, 50151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor MessageItem oldValue, MessageItem newValue) { 50251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor oldValue.cancelPduLoading(); 50351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 50451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 50572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project} 506