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