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 20f114492537753bc68640d4a0d403861387296bcbMark Wagnerimport java.util.regex.Pattern; 21f114492537753bc68640d4a0d403861387296bcbMark Wagner 2251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport android.content.ContentUris; 2351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport android.content.Context; 2451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport android.database.Cursor; 2551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport android.net.Uri; 2651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport android.provider.Telephony.Mms; 2751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport android.provider.Telephony.MmsSms; 2851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport android.provider.Telephony.Sms; 2951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport android.text.TextUtils; 3051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport android.util.Log; 3151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 3251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.LogTag; 3351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.MmsApp; 3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.R; 3533a87f96f8c625aa10131a77a3968c97c4ec5a62Ficus Kirkpatrickimport com.android.mms.data.Contact; 364847b98115373613b09cf50f43a760e95dd9a15cTom Taylorimport com.android.mms.data.WorkingMessage; 3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.SlideModel; 3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.SlideshowModel; 3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.model.TextModel; 4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.ui.MessageListAdapter.ColumnsMap; 41fd8357ff5febab0141e1beb8dd3b26f70416b108Tom Taylorimport com.android.mms.util.AddressUtils; 42ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylorimport com.android.mms.util.DownloadManager; 4351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.util.ItemLoadedCallback; 4451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.util.ItemLoadedFuture; 4551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.util.PduLoaderManager; 46f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.MmsException; 47f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.pdu.EncodedStringValue; 48f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.pdu.MultimediaMessagePdu; 49f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.pdu.NotificationInd; 50f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.pdu.PduHeaders; 51f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.pdu.PduPersister; 52f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.pdu.RetrieveConf; 53f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.pdu.SendReq; 5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/** 5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Mostly immutable model for an SMS/MMS message. 5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * <p>The only mutable field is the cached formatted message member, 5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * the formatting of which is done outside this model in MessageListItem. 6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class MessageItem { 6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static String TAG = "MessageItem"; 6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 64e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy public enum DeliveryStatus { NONE, INFO, FAILED, PENDING, RECEIVED } 65e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy 66f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor public static int ATTACHMENT_TYPE_NOT_LOADED = -1; 67f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor 6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final Context mContext; 6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final String mType; 7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final long mMsgId; 7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final int mBoxId; 7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 73e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy DeliveryStatus mDeliveryStatus; 7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project boolean mReadReport; 75440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor boolean mLocked; // locked to prevent auto-deletion 7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String mTimestamp; 7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String mAddress; 7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String mContact; 8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String mBody; // Body of SMS, first text of MMS. 817c8748972faf3078f53ef9ecbe6c95f0903f43f7satok String mTextContentType; // ContentType of text of MMS. 82f114492537753bc68640d4a0d403861387296bcbMark Wagner Pattern mHighlight; // portion of message to highlight (from search) 8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // The only non-immutable field. Not synchronized, as access will 8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // only be from the main GUI thread. Worst case if accessed from 8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // another thread is it'll return null and be set again from that 8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // thread. 8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project CharSequence mCachedFormattedMessage; 8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 905a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor // The last message is cached above in mCachedFormattedMessage. In the latest design, we 915a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor // show "Sending..." in place of the timestamp when a message is being sent. mLastSendingState 925a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor // is used to keep track of the last sending state so that if the current sending state is 935a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor // different, we can clear the message cache so it will get rebuilt and recached. 945a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor boolean mLastSendingState; 955a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor 9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Fields for MMS only. 9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Uri mMessageUri; 9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int mMessageType; 9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int mAttachmentType; 10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String mSubject; 10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project SlideshowModel mSlideshow; 10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int mMessageSize; 10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project int mErrorType; 104161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor int mErrorCode; 105ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor int mMmsStatus; 10651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor Cursor mCursor; 10751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor ColumnsMap mColumnsMap; 10851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor private PduLoadedCallback mPduLoadedCallback; 10951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor private ItemLoadedFuture mItemLoadedFuture; 11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 11151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor MessageItem(Context context, String type, final Cursor cursor, 11251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor final ColumnsMap columnsMap, Pattern highlight) throws MmsException { 11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mContext = context; 11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mMsgId = cursor.getLong(columnsMap.mColumnMsgId); 115f114492537753bc68640d4a0d403861387296bcbMark Wagner mHighlight = highlight; 1160e19f738c114f86d0d88825ee48966015fb48b6dTom Taylor mType = type; 11751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mCursor = cursor; 11851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mColumnsMap = columnsMap; 11952f854cbb75e8f9975c7e33216b828eb2f981095Tom Taylor 12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if ("sms".equals(type)) { 12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mReadReport = false; // No read reports in sms 122e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy 123e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy long status = cursor.getLong(columnsMap.mColumnSmsStatus); 124e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy if (status == Sms.STATUS_NONE) { 125e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy // No delivery report requested 126e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy mDeliveryStatus = DeliveryStatus.NONE; 127e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy } else if (status >= Sms.STATUS_FAILED) { 128e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy // Failure 129e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy mDeliveryStatus = DeliveryStatus.FAILED; 130e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy } else if (status >= Sms.STATUS_PENDING) { 131e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy // Pending 132e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy mDeliveryStatus = DeliveryStatus.PENDING; 133e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy } else { 134e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy // Success 135e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy mDeliveryStatus = DeliveryStatus.RECEIVED; 136e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy } 137e7c8092e952d9d5edbc1c0b62e5f872c4d21d2b4Ondrej Novy 13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mMessageUri = ContentUris.withAppendedId(Sms.CONTENT_URI, mMsgId); 13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Set contact and message body 14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mBoxId = cursor.getInt(columnsMap.mColumnSmsType); 14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mAddress = cursor.getString(columnsMap.mColumnSmsAddress); 14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (Sms.isOutgoingFolder(mBoxId)) { 14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String meString = context.getString( 14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project R.string.messagelist_sender_self); 14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 14670c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick mContact = meString; 14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // For incoming messages, the ADDRESS field contains the sender. 149715e32f97bd9d8ce4b5ba650b97ba4b137150456Tom Taylor mContact = Contact.get(mAddress, false).getName(); 15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mBody = cursor.getString(columnsMap.mColumnSmsBody); 15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 1530e6ae5265245a13e1bef96c6aad1e3f2c1c7236eFredrik Roubert // Unless the message is currently in the progress of being sent, it gets a time stamp. 1540e19f738c114f86d0d88825ee48966015fb48b6dTom Taylor if (!isOutgoingMessage()) { 1550e6ae5265245a13e1bef96c6aad1e3f2c1c7236eFredrik Roubert // Set "received" or "sent" time stamp 1560e19f738c114f86d0d88825ee48966015fb48b6dTom Taylor long date = cursor.getLong(columnsMap.mColumnSmsDate); 1573fb271abe0c478d0ea8432830589774182079c86Tom Taylor mTimestamp = MessageUtils.formatTimeStampString(context, date); 1580e19f738c114f86d0d88825ee48966015fb48b6dTom Taylor } 15952f854cbb75e8f9975c7e33216b828eb2f981095Tom Taylor 160440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor mLocked = cursor.getInt(columnsMap.mColumnSmsLocked) != 0; 161161375d2c4eff31add607fc0befa5c781c6fd7f1Tom Taylor mErrorCode = cursor.getInt(columnsMap.mColumnSmsErrorCode); 16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if ("mms".equals(type)) { 16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mMessageUri = ContentUris.withAppendedId(Mms.CONTENT_URI, mMsgId); 16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mBoxId = cursor.getInt(columnsMap.mColumnMmsMessageBox); 16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mMessageType = cursor.getInt(columnsMap.mColumnMmsMessageType); 16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mErrorType = cursor.getInt(columnsMap.mColumnMmsErrorType); 16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String subject = cursor.getString(columnsMap.mColumnMmsSubject); 16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (!TextUtils.isEmpty(subject)) { 16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project EncodedStringValue v = new EncodedStringValue( 17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project cursor.getInt(columnsMap.mColumnMmsSubjectCharset), 17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project PduPersister.getBytes(subject)); 1723c307cabb5bd96ed174930ebf17f533bf2a79de7Tom Taylor mSubject = MessageUtils.cleanseMmsSubject(context, v.getString()); 17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 174440071bb40c9c7bac5870a8bb3110edbe665c702Tom Taylor mLocked = cursor.getInt(columnsMap.mColumnMmsLocked) != 0; 17551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mSlideshow = null; 17651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mDeliveryStatus = DeliveryStatus.NONE; 17751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mReadReport = false; 17851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mBody = null; 17951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mMessageSize = 0; 18051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mTextContentType = null; 1818aee2389b3feb40b4abf3110c2f74be30dd0256eRoger Chen // Initialize the time stamp to "" instead of null 1828aee2389b3feb40b4abf3110c2f74be30dd0256eRoger Chen mTimestamp = ""; 183ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor mMmsStatus = cursor.getInt(columnsMap.mColumnMmsStatus); 1844847b98115373613b09cf50f43a760e95dd9a15cTom Taylor mAttachmentType = cursor.getInt(columnsMap.mColumnMmsTextOnly) != 0 ? 1854847b98115373613b09cf50f43a760e95dd9a15cTom Taylor WorkingMessage.TEXT : ATTACHMENT_TYPE_NOT_LOADED; 18651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 18751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor // Start an async load of the pdu. If the pdu is already loaded, the callback 18851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor // will get called immediately 18951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor boolean loadSlideshow = mMessageType != PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND; 19051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 19151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mItemLoadedFuture = MmsApp.getApplication().getPduLoaderManager() 19251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor .getPdu(mMessageUri, loadSlideshow, 19351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor new PduLoadedMessageItemCallback()); 19472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 19572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 19672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project throw new MmsException("Unknown type of the message: " + type); 19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 200fd8357ff5febab0141e1beb8dd3b26f70416b108Tom Taylor private void interpretFrom(EncodedStringValue from, Uri messageUri) { 20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (from != null) { 20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mAddress = from.getString(); 20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 204fd8357ff5febab0141e1beb8dd3b26f70416b108Tom Taylor // In the rare case when getting the "from" address from the pdu fails, 205fd8357ff5febab0141e1beb8dd3b26f70416b108Tom Taylor // (e.g. from == null) fall back to a slower, yet more reliable method of 206fd8357ff5febab0141e1beb8dd3b26f70416b108Tom Taylor // getting the address from the "addr" table. This is what the Messaging 207fd8357ff5febab0141e1beb8dd3b26f70416b108Tom Taylor // notification system uses. 208fd8357ff5febab0141e1beb8dd3b26f70416b108Tom Taylor mAddress = AddressUtils.getFrom(mContext, messageUri); 20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 210715e32f97bd9d8ce4b5ba650b97ba4b137150456Tom Taylor mContact = TextUtils.isEmpty(mAddress) ? "" : Contact.get(mAddress, false).getName(); 21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public boolean isMms() { 21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return mType.equals("mms"); 21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public boolean isSms() { 21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return mType.equals("sms"); 21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public boolean isDownloaded() { 22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return (mMessageType != PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND); 22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 225c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor public boolean isMe() { 226c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor // Logic matches MessageListAdapter.getItemViewType which is used to decide which 227c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor // type of MessageListItem to create: a left or right justified item depending on whether 228c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor // the message is incoming or outgoing. 229c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor boolean isIncomingMms = isMms() 230c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor && (mBoxId == Mms.MESSAGE_BOX_INBOX 231c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor || mBoxId == Mms.MESSAGE_BOX_ALL); 232c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor boolean isIncomingSms = isSms() 233c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor && (mBoxId == Sms.MESSAGE_TYPE_INBOX 234c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor || mBoxId == Sms.MESSAGE_TYPE_ALL); 235c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor return !(isIncomingMms || isIncomingSms); 236c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor } 237c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor 23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public boolean isOutgoingMessage() { 23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project boolean isOutgoingMms = isMms() && (mBoxId == Mms.MESSAGE_BOX_OUTBOX); 24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project boolean isOutgoingSms = isSms() 24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project && ((mBoxId == Sms.MESSAGE_TYPE_FAILED) 24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project || (mBoxId == Sms.MESSAGE_TYPE_OUTBOX) 24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project || (mBoxId == Sms.MESSAGE_TYPE_QUEUED)); 24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return isOutgoingMms || isOutgoingSms; 24572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 2475a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor public boolean isSending() { 24863ac1002131c90ae78ae1d3e69a77fa1f8d2b303Tom Taylor return !isFailedMessage() && isOutgoingMessage(); 2495a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor } 2505a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor 2515a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor public boolean isFailedMessage() { 2525a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor boolean isFailedMms = isMms() 2535a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor && (mErrorType >= MmsSms.ERR_TYPE_GENERIC_PERMANENT); 2545a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor boolean isFailedSms = isSms() 2555a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor && (mBoxId == Sms.MESSAGE_TYPE_FAILED); 2565a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor return isFailedMms || isFailedSms; 2575a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor } 2585a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor 25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Note: This is the only mutable field in this class. Think of 26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // mCachedFormattedMessage as a C++ 'mutable' field on a const 26172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // object, with this being a lazy accessor whose logic to set it 26272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // is outside the class for model/view separation reasons. In any 26372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // case, please keep this class conceptually immutable. 26472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setCachedFormattedMessage(CharSequence formattedMessage) { 26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mCachedFormattedMessage = formattedMessage; 26672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 26772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 26872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public CharSequence getCachedFormattedMessage() { 2695a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor boolean isSending = isSending(); 2705a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor if (isSending != mLastSendingState) { 2715a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mLastSendingState = isSending; 2725a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mCachedFormattedMessage = null; // clear cache so we'll rebuild the message 2735a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor // to show "Sending..." or the sent date. 2745a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor } 27572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return mCachedFormattedMessage; 27672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 27752f854cbb75e8f9975c7e33216b828eb2f981095Tom Taylor 27848da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public int getBoxId() { 27948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor return mBoxId; 28048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor } 28152f854cbb75e8f9975c7e33216b828eb2f981095Tom Taylor 28251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public long getMessageId() { 28351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor return mMsgId; 28451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 28551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 286ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor public int getMmsDownloadStatus() { 287ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor return mMmsStatus & ~DownloadManager.DEFERRED_MASK; 288ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor } 289ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor 29048da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor @Override 29148da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor public String toString() { 29248da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor return "type: " + mType + 29348da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor " box: " + mBoxId + 29448da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor " uri: " + mMessageUri + 29548da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor " address: " + mAddress + 29648da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor " contact: " + mContact + 29748da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor " read: " + mReadReport + 298ccf56ee6079a2378031a964f6a8da655e1fde023Jean-Baptiste Queru " delivery status: " + mDeliveryStatus; 29948da875f1beea835c6771977e5bd8a9aa3d4bc10Tom Taylor } 30051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 30151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public class PduLoadedMessageItemCallback implements ItemLoadedCallback { 30251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public void onItemLoaded(Object result, Throwable exception) { 30351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (exception != null) { 30451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor Log.e(TAG, "PduLoadedMessageItemCallback PDU couldn't be loaded: ", exception); 30551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor return; 30651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 3079c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor if (mItemLoadedFuture != null) { 3089c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor synchronized(mItemLoadedFuture) { 3099c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor mItemLoadedFuture.setIsDone(true); 3109c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor } 3119c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor } 31251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor PduLoaderManager.PduLoaded pduLoaded = (PduLoaderManager.PduLoaded)result; 31351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor long timestamp = 0L; 31451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND == mMessageType) { 31551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mDeliveryStatus = DeliveryStatus.NONE; 31651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor NotificationInd notifInd = (NotificationInd)pduLoaded.mPdu; 31751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor interpretFrom(notifInd.getFrom(), mMessageUri); 31851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor // Borrow the mBody to hold the URL of the message. 31951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mBody = new String(notifInd.getContentLocation()); 32051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mMessageSize = (int) notifInd.getMessageSize(); 32151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor timestamp = notifInd.getExpiry() * 1000L; 32251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } else { 32351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (mCursor.isClosed()) { 32451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor return; 32551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 32651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor MultimediaMessagePdu msg = (MultimediaMessagePdu)pduLoaded.mPdu; 32751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mSlideshow = pduLoaded.mSlideshow; 32851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mAttachmentType = MessageUtils.getAttachmentType(mSlideshow); 32951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 33051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (mMessageType == PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF) { 33151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (msg == null) { 33251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor interpretFrom(null, mMessageUri); 33351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } else { 33451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor RetrieveConf retrieveConf = (RetrieveConf) msg; 33551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor interpretFrom(retrieveConf.getFrom(), mMessageUri); 33651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor timestamp = retrieveConf.getDate() * 1000L; 33751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 33851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } else { 33951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor // Use constant string for outgoing messages 34051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mContact = mAddress = 34151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mContext.getString(R.string.messagelist_sender_self); 34251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor timestamp = msg == null ? 0 : ((SendReq) msg).getDate() * 1000L; 34351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 34451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 34551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor SlideModel slide = mSlideshow == null ? null : mSlideshow.get(0); 34651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if ((slide != null) && slide.hasText()) { 34751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor TextModel tm = slide.getText(); 3480ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor mBody = tm.getText(); 34951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mTextContentType = tm.getContentType(); 35051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 35151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 35251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mMessageSize = mSlideshow == null ? 0 : mSlideshow.getTotalMessageSize(); 35351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 35451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor String report = mCursor.getString(mColumnsMap.mColumnMmsDeliveryReport); 35551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if ((report == null) || !mAddress.equals(mContext.getString( 35651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor R.string.messagelist_sender_self))) { 35751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mDeliveryStatus = DeliveryStatus.NONE; 35851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } else { 35951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor int reportInt; 36051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor try { 36151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor reportInt = Integer.parseInt(report); 36251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (reportInt == PduHeaders.VALUE_YES) { 36351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mDeliveryStatus = DeliveryStatus.RECEIVED; 36451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } else { 36551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mDeliveryStatus = DeliveryStatus.NONE; 36651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 36751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } catch (NumberFormatException nfe) { 36851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor Log.e(TAG, "Value for delivery report was invalid."); 36951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mDeliveryStatus = DeliveryStatus.NONE; 37051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 37151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 37251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 37351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor report = mCursor.getString(mColumnsMap.mColumnMmsReadReport); 37451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if ((report == null) || !mAddress.equals(mContext.getString( 37551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor R.string.messagelist_sender_self))) { 37651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mReadReport = false; 37751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } else { 37851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor int reportInt; 37951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor try { 38051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor reportInt = Integer.parseInt(report); 38151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mReadReport = (reportInt == PduHeaders.VALUE_YES); 38251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } catch (NumberFormatException nfe) { 38351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor Log.e(TAG, "Value for read report was invalid."); 38451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mReadReport = false; 38551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 38651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 38751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 388a46c89868eb1cd1ec9d0b3c248c83cfab21c8203Tom Taylor if (!isOutgoingMessage()) { 389a46c89868eb1cd1ec9d0b3c248c83cfab21c8203Tom Taylor if (PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND == mMessageType) { 390a46c89868eb1cd1ec9d0b3c248c83cfab21c8203Tom Taylor mTimestamp = mContext.getString(R.string.expire_on, 391a46c89868eb1cd1ec9d0b3c248c83cfab21c8203Tom Taylor MessageUtils.formatTimeStampString(mContext, timestamp)); 392a46c89868eb1cd1ec9d0b3c248c83cfab21c8203Tom Taylor } else { 393a46c89868eb1cd1ec9d0b3c248c83cfab21c8203Tom Taylor mTimestamp = MessageUtils.formatTimeStampString(mContext, timestamp); 394a46c89868eb1cd1ec9d0b3c248c83cfab21c8203Tom Taylor } 395a46c89868eb1cd1ec9d0b3c248c83cfab21c8203Tom Taylor } 39651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (mPduLoadedCallback != null) { 39751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mPduLoadedCallback.onPduLoaded(MessageItem.this); 39851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 39951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 40051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 40151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 40251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public void setOnPduLoaded(PduLoadedCallback pduLoadedCallback) { 40351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mPduLoadedCallback = pduLoadedCallback; 40451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 40551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 40651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public void cancelPduLoading() { 4079c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor if (mItemLoadedFuture != null && !mItemLoadedFuture.isDone()) { 40851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (Log.isLoggable(LogTag.APP, Log.DEBUG)) { 40951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor Log.v(TAG, "cancelPduLoading for: " + this); 41051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 4119c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor mItemLoadedFuture.cancel(mMessageUri); 41251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mItemLoadedFuture = null; 41351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 41451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 41551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 41651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public interface PduLoadedCallback { 41751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor /** 41851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * Called when this item's pdu and slideshow are finished loading. 41951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * 42051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor * @param messageItem the MessageItem that finished loading. 42151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor */ 42251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor void onPduLoaded(MessageItem messageItem); 42351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 4247b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor 425e5486018e640aa2c36f68f56d19682a8fd614291Tom Taylor public SlideshowModel getSlideshow() { 426e5486018e640aa2c36f68f56d19682a8fd614291Tom Taylor return mSlideshow; 4277b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor } 42872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project} 429