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 20331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagnerimport java.util.Map; 21f114492537753bc68640d4a0d403861387296bcbMark Wagnerimport java.util.regex.Matcher; 22f114492537753bc68640d4a0d403861387296bcbMark Wagnerimport java.util.regex.Pattern; 2372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 2472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.app.AlertDialog; 2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Context; 2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.DialogInterface; 2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Intent; 2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.graphics.Bitmap; 2951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport android.graphics.Paint.FontMetricsInt; 3072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.graphics.Typeface; 3172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.graphics.drawable.Drawable; 3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.net.Uri; 3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Handler; 3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Message; 354f1871e8e85598c94d5f09d508c690c41fdcce16Tom Taylorimport android.provider.ContactsContract.Profile; 36f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Sms; 3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.telephony.PhoneNumberUtils; 385c113729220385c970b9e941b93a162054285209Tom Taylorimport android.telephony.TelephonyManager; 397c8748972faf3078f53ef9ecbe6c95f0903f43f7satokimport android.text.Html; 4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.SpannableStringBuilder; 4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.TextUtils; 4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.method.HideReturnsTransformationMethod; 4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.style.ForegroundColorSpan; 448b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagnerimport android.text.style.LineHeightSpan; 4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.style.StyleSpan; 468b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagnerimport android.text.style.TextAppearanceSpan; 4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.style.URLSpan; 4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.AttributeSet; 495a3151adedd991252dd529c75e85a3374970dfb0Tom Taylorimport android.util.Log; 5072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.View; 5172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.View.OnClickListener; 5251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport android.view.ViewGroup; 5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.ArrayAdapter; 5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.Button; 5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.ImageButton; 5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.ImageView; 5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.LinearLayout; 5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.TextView; 5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 60bb8edcae15a50b3651261db70791afc668aae294Tom Taylorimport com.android.mms.MmsApp; 61331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagnerimport com.android.mms.R; 62313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylorimport com.android.mms.data.Contact; 63331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagnerimport com.android.mms.data.WorkingMessage; 6451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.model.SlideModel; 6551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.model.SlideshowModel; 66331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagnerimport com.android.mms.transaction.Transaction; 67331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagnerimport com.android.mms.transaction.TransactionBundle; 68331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagnerimport com.android.mms.transaction.TransactionService; 69331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagnerimport com.android.mms.util.DownloadManager; 7051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.util.ItemLoadedCallback; 71331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagnerimport com.android.mms.util.SmileyParser; 7279bf6f70c54d08dc9c3481b8461a3a46a3cefb83Tom Taylorimport com.android.mms.util.ThumbnailManager.ImageLoaded; 73f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.ContentType; 74f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.pdu.PduHeaders; 7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/** 7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * This class provides view of a message in the messages list. 7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class MessageListItem extends LinearLayout implements 8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project SlideViewInterface, OnClickListener { 8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static final String EXTRA_URLS = "com.android.mms.ExtraUrls"; 8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final String TAG = "MessageListItem"; 8451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor private static final boolean DEBUG = false; 85f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor private static final boolean DEBUG_DONT_LOAD_IMAGES = false; 8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 873efec5a219021385d816639f5c801c4cd277ae9dTom Taylor static final int MSG_LIST_EDIT = 1; 883efec5a219021385d816639f5c801c4cd277ae9dTom Taylor static final int MSG_LIST_PLAY = 2; 893efec5a219021385d816639f5c801c4cd277ae9dTom Taylor static final int MSG_LIST_DETAILS = 3; 9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private View mMmsView; 9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private ImageView mImageView; 935a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor private ImageView mLockedIndicator; 945a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor private ImageView mDeliveredIndicator; 955a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor private ImageView mDetailsIndicator; 9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private ImageButton mSlideShowButton; 9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private TextView mBodyTextView; 9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private Button mDownloadButton; 9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private TextView mDownloadingLabel; 10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private Handler mHandler; 10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private MessageItem mMessageItem; 1024759133e3c935e751815bf4f997d029caa64d889Bai Tao private String mDefaultCountryIso; 1033fb271abe0c478d0ea8432830589774182079c86Tom Taylor private TextView mDateView; 10410ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor public View mMessageBlock; 10510ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor private QuickContactDivot mAvatar; 106313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor static private Drawable sDefaultContactImage; 10751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor private Presenter mPresenter; 108eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor private int mPosition; // for debugging 109721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor private ImageLoadedCallback mImageLoadedCallback; 110c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor private boolean mMultiRecipients; 11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public MessageListItem(Context context) { 11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project super(context); 1144759133e3c935e751815bf4f997d029caa64d889Bai Tao mDefaultCountryIso = MmsApp.getApplication().getCurrentCountryIso(); 115313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor 116313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor if (sDefaultContactImage == null) { 117313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor sDefaultContactImage = context.getResources().getDrawable(R.drawable.ic_contact_picture); 118313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor } 11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public MessageListItem(Context context, AttributeSet attrs) { 12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project super(context, attrs); 1238b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner 1248b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner int color = mContext.getResources().getColor(R.color.timestamp_color); 1258b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner mColorSpan = new ForegroundColorSpan(color); 126d019225935f492f67dc189d9199bb61eeb7f02d5Tom Taylor mDefaultCountryIso = MmsApp.getApplication().getCurrentCountryIso(); 127313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor 128313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor if (sDefaultContactImage == null) { 129313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor sDefaultContactImage = context.getResources().getDrawable(R.drawable.ic_contact_picture); 130313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor } 13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project @Override 13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project protected void onFinishInflate() { 13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project super.onFinishInflate(); 13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mBodyTextView = (TextView) findViewById(R.id.text_view); 1383fb271abe0c478d0ea8432830589774182079c86Tom Taylor mDateView = (TextView) findViewById(R.id.date_view); 1395a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mLockedIndicator = (ImageView) findViewById(R.id.locked_indicator); 1405a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mDeliveredIndicator = (ImageView) findViewById(R.id.delivered_indicator); 1415a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mDetailsIndicator = (ImageView) findViewById(R.id.details_indicator); 14210ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor mAvatar = (QuickContactDivot) findViewById(R.id.avatar); 14310ca1d3969305df50fb07a17f5d23b0ed59f7868Tom Taylor mMessageBlock = findViewById(R.id.message_block); 14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 146c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor public void bind(MessageItem msgItem, boolean convHasMultiRecipients, int position) { 1470fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor if (DEBUG) { 1480fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor Log.v(TAG, "bind for item: " + position + " old: " + 1490fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor (mMessageItem != null ? mMessageItem.toString() : "NULL" ) + 1500fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor " new " + msgItem.toString()); 1510fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor } 1520fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor boolean sameItem = mMessageItem != null && mMessageItem.mMsgId == msgItem.mMsgId; 15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mMessageItem = msgItem; 154ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor 155eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor mPosition = position; 156c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor mMultiRecipients = convHasMultiRecipients; 15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project setLongClickable(false); 1599549e0f231f524440c6a9112fe07ac898f82c88aTom Taylor setClickable(false); // let the list view handle clicks on the item normally. When 1609549e0f231f524440c6a9112fe07ac898f82c88aTom Taylor // clickable is true, clicks bypass the listview and go straight 1619549e0f231f524440c6a9112fe07ac898f82c88aTom Taylor // to this listitem. We always want the listview to handle the 1629549e0f231f524440c6a9112fe07ac898f82c88aTom Taylor // clicks first. 16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project switch (msgItem.mMessageType) { 16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND: 16651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor bindNotifInd(); 16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project break; 16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project default: 1690fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor bindCommonMessage(sameItem); 17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project break; 17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 1749a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev public void unbind() { 1759a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev // Clear all references to the message item, which can contain attachments and other 1769a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev // memory-intensive objects 1779a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev if (mImageView != null) { 1789a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev // Because #setOnClickListener may have set the listener to an object that has the 1799a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev // message item in its closure. 1809a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev mImageView.setOnClickListener(null); 1819a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev } 1829a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev if (mSlideShowButton != null) { 1839a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev // Because #drawPlaybackButton sets the tag to mMessageItem 1849a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev mSlideShowButton.setTag(null); 1859a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev } 18651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor // leave the presenter in case it's needed when rebound to a different MessageItem. 18751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (mPresenter != null) { 18851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mPresenter.cancelBackgroundLoading(); 18951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 1909a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev } 1919a0457146d9caa476ca8c44c950dce741ede8143Todor Kalaydjiev 19272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public MessageItem getMessageItem() { 19372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return mMessageItem; 19472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 195331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagner 19672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setMsgListItemHandler(Handler handler) { 19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mHandler = handler; 19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 199331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagner 20051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor private void bindNotifInd() { 201f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor showMmsView(false); 20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String msgSizeText = mContext.getString(R.string.message_size_label) 20451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor + String.valueOf((mMessageItem.mMessageSize + 1023) / 1024) 20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project + mContext.getString(R.string.kilobyte); 20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 207c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor mBodyTextView.setText(formatMessage(mMessageItem, null, 20851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mMessageItem.mSubject, 20951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mMessageItem.mHighlight, 21051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mMessageItem.mTextContentType)); 21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 212c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor mDateView.setText(buildTimestampLine(msgSizeText + " " + mMessageItem.mTimestamp)); 2133fb271abe0c478d0ea8432830589774182079c86Tom Taylor 214ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor switch (mMessageItem.getMmsDownloadStatus()) { 21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case DownloadManager.STATE_DOWNLOADING: 2165c113729220385c970b9e941b93a162054285209Tom Taylor showDownloadingAttachment(); 21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project break; 2185c113729220385c970b9e941b93a162054285209Tom Taylor case DownloadManager.STATE_UNKNOWN: 21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case DownloadManager.STATE_UNSTARTED: 2205c113729220385c970b9e941b93a162054285209Tom Taylor DownloadManager downloadManager = DownloadManager.getInstance(); 2215c113729220385c970b9e941b93a162054285209Tom Taylor boolean autoDownload = downloadManager.isAuto(); 2225c113729220385c970b9e941b93a162054285209Tom Taylor boolean dataSuspended = (MmsApp.getApplication().getTelephonyManager() 2235c113729220385c970b9e941b93a162054285209Tom Taylor .getDataState() == TelephonyManager.DATA_SUSPENDED); 2245c113729220385c970b9e941b93a162054285209Tom Taylor 2255c113729220385c970b9e941b93a162054285209Tom Taylor // If we're going to automatically start downloading the mms attachment, then 2265c113729220385c970b9e941b93a162054285209Tom Taylor // don't bother showing the download button for an instant before the actual 2275c113729220385c970b9e941b93a162054285209Tom Taylor // download begins. Instead, show downloading as taking place. 2285c113729220385c970b9e941b93a162054285209Tom Taylor if (autoDownload && !dataSuspended) { 2295c113729220385c970b9e941b93a162054285209Tom Taylor showDownloadingAttachment(); 2305c113729220385c970b9e941b93a162054285209Tom Taylor break; 2315c113729220385c970b9e941b93a162054285209Tom Taylor } 23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case DownloadManager.STATE_TRANSIENT_FAILURE: 23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project case DownloadManager.STATE_PERMANENT_FAILURE: 23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project default: 23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project setLongClickable(true); 23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project inflateDownloadControls(); 23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mDownloadingLabel.setVisibility(View.GONE); 23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mDownloadButton.setVisibility(View.VISIBLE); 23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mDownloadButton.setOnClickListener(new OnClickListener() { 24044e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void onClick(View v) { 24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mDownloadingLabel.setVisibility(View.VISIBLE); 24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mDownloadButton.setVisibility(View.GONE); 24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Intent intent = new Intent(mContext, TransactionService.class); 24551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor intent.putExtra(TransactionBundle.URI, mMessageItem.mMessageUri.toString()); 24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project intent.putExtra(TransactionBundle.TRANSACTION_TYPE, 24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Transaction.RETRIEVE_TRANSACTION); 24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mContext.startService(intent); 24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }); 25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project break; 25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 2545a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor // Hide the indicators. 2555a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mLockedIndicator.setVisibility(View.GONE); 2565a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mDeliveredIndicator.setVisibility(View.GONE); 2575a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mDetailsIndicator.setVisibility(View.GONE); 25851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor updateAvatarView(mMessageItem.mAddress, false); 25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 261c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor private String buildTimestampLine(String timestamp) { 2629c9df2773645d195dbf17df91d7cccdf5154fe84Tom Taylor if (!mMultiRecipients || mMessageItem.isMe() || TextUtils.isEmpty(mMessageItem.mContact)) { 263c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor // Never show "Me" for messages I sent. 264c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor return timestamp; 265c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor } 266c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor // This is a group conversation, show the sender's name on the same line as the timestamp. 267c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor return mContext.getString(R.string.message_timestamp_format, mMessageItem.mContact, 268c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor timestamp); 269c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor } 270c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor 2715c113729220385c970b9e941b93a162054285209Tom Taylor private void showDownloadingAttachment() { 2725c113729220385c970b9e941b93a162054285209Tom Taylor inflateDownloadControls(); 2735c113729220385c970b9e941b93a162054285209Tom Taylor mDownloadingLabel.setVisibility(View.VISIBLE); 2745c113729220385c970b9e941b93a162054285209Tom Taylor mDownloadButton.setVisibility(View.GONE); 2755c113729220385c970b9e941b93a162054285209Tom Taylor } 2765c113729220385c970b9e941b93a162054285209Tom Taylor 2774f1871e8e85598c94d5f09d508c690c41fdcce16Tom Taylor private void updateAvatarView(String addr, boolean isSelf) { 278313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor Drawable avatarDrawable; 2794f1871e8e85598c94d5f09d508c690c41fdcce16Tom Taylor if (isSelf || !TextUtils.isEmpty(addr)) { 2804f1871e8e85598c94d5f09d508c690c41fdcce16Tom Taylor Contact contact = isSelf ? Contact.getMe(false) : Contact.get(addr, false); 281313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor avatarDrawable = contact.getAvatar(mContext, sDefaultContactImage); 282313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor 2834f1871e8e85598c94d5f09d508c690c41fdcce16Tom Taylor if (isSelf) { 2844f1871e8e85598c94d5f09d508c690c41fdcce16Tom Taylor mAvatar.assignContactUri(Profile.CONTENT_URI); 285313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor } else { 2864f1871e8e85598c94d5f09d508c690c41fdcce16Tom Taylor if (contact.existsInDatabase()) { 2874f1871e8e85598c94d5f09d508c690c41fdcce16Tom Taylor mAvatar.assignContactUri(contact.getUri()); 2884f1871e8e85598c94d5f09d508c690c41fdcce16Tom Taylor } else { 2894f1871e8e85598c94d5f09d508c690c41fdcce16Tom Taylor mAvatar.assignContactFromPhone(contact.getNumber(), true); 2904f1871e8e85598c94d5f09d508c690c41fdcce16Tom Taylor } 291313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor } 292313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor } else { 293313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor avatarDrawable = sDefaultContactImage; 294313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor } 295313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor mAvatar.setImageDrawable(avatarDrawable); 296313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor } 297313d09ee558e6ac94ab28a205357885dc830cd0dTom Taylor 2980fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor private void bindCommonMessage(final boolean sameItem) { 29972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (mDownloadButton != null) { 30072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mDownloadButton.setVisibility(View.GONE); 30172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mDownloadingLabel.setVisibility(View.GONE); 30272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 30372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Since the message text should be concatenated with the sender's 30472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // address(or name), I have to display it here instead of 30572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // displaying it by the Presenter. 30672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mBodyTextView.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); 30772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 308ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor boolean haveLoadedPdu = mMessageItem.isSms() || mMessageItem.mSlideshow != null; 309ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor // Here we're avoiding reseting the avatar to the empty avatar when we're rebinding 310ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor // to the same item. This happens when there's a DB change which causes the message item 311ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor // cache in the MessageListAdapter to get cleared. When an mms MessageItem is newly 312ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor // created, it has no info in it except the message id. The info is eventually loaded 313ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor // and bindCommonMessage is called again (see onPduLoaded below). When we haven't loaded 314ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor // the pdu, we don't want to call updateAvatarView because it 315ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor // will set the avatar to the generic avatar then when this method is called again 316ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor // from onPduLoaded, it will reset to the real avatar. This test is to avoid that flash. 317ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor if (!sameItem || haveLoadedPdu) { 3180fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor boolean isSelf = Sms.isOutgoingFolder(mMessageItem.mBoxId); 3190fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor String addr = isSelf ? null : mMessageItem.mAddress; 3200fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor updateAvatarView(addr, isSelf); 3210fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor } 3228b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner 32372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Get and/or lazily set the formatted message from/on the 32472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // MessageItem. Because the MessageItem instances come from a 32572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // cache (currently of size ~50), the hit rate on avoiding the 32672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // expensive formatMessage() call is very high. 32751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor CharSequence formattedMessage = mMessageItem.getCachedFormattedMessage(); 32872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (formattedMessage == null) { 329c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor formattedMessage = formatMessage(mMessageItem, 33051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mMessageItem.mBody, 33151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mMessageItem.mSubject, 33251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mMessageItem.mHighlight, 33351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mMessageItem.mTextContentType); 334a46c89868eb1cd1ec9d0b3c248c83cfab21c8203Tom Taylor mMessageItem.setCachedFormattedMessage(formattedMessage); 33572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 336ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor if (!sameItem || haveLoadedPdu) { 337ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor mBodyTextView.setText(formattedMessage); 338ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor } 33972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 34051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor // Debugging code to put the URI of the image attachment in the body of the list item. 34151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (DEBUG) { 34251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor String debugText = null; 34351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (mMessageItem.mSlideshow == null) { 34451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor debugText = "NULL slideshow"; 34551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } else { 34651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor SlideModel slide = ((SlideshowModel) mMessageItem.mSlideshow).get(0); 34751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (slide == null) { 34851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor debugText = "NULL first slide"; 34951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } else if (!slide.hasImage()) { 35051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor debugText = "Not an image"; 35151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } else { 35251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor debugText = slide.getImage().getUri().toString(); 35351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 35451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 355eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor mBodyTextView.setText(mPosition + ": " + debugText); 35651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 35751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 3583fb271abe0c478d0ea8432830589774182079c86Tom Taylor // If we're in the process of sending a message (i.e. pending), then we show a "SENDING..." 3593fb271abe0c478d0ea8432830589774182079c86Tom Taylor // string in place of the timestamp. 360ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor if (!sameItem || haveLoadedPdu) { 361ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor mDateView.setText(buildTimestampLine(mMessageItem.isSending() ? 362ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor mContext.getResources().getString(R.string.sending_message) : 363ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor mMessageItem.mTimestamp)); 364ac5b230500508d676267f264dc4ce63ae0900937Tom Taylor } 36551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (mMessageItem.isSms()) { 366f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor showMmsView(false); 36751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mMessageItem.setOnPduLoaded(null); 36872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 369eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor if (DEBUG) { 370eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor Log.v(TAG, "bindCommonMessage for item: " + mPosition + " " + 371fbcd6a7287afd459fee2521bfaf2d4f70668c85aTom Taylor mMessageItem.toString() + 3720fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor " mMessageItem.mAttachmentType: " + mMessageItem.mAttachmentType + 3730fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor " sameItem: " + sameItem); 374eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor } 375f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor if (mMessageItem.mAttachmentType != WorkingMessage.TEXT) { 3760fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor if (!sameItem) { 3770fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor setImage(null, null); 3780fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor } 379f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor setOnClickListener(mMessageItem); 380f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor drawPlaybackButton(mMessageItem); 381f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor } else { 382f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor showMmsView(false); 383f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor } 384eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor if (mMessageItem.mSlideshow == null) { 385eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor mMessageItem.setOnPduLoaded(new MessageItem.PduLoadedCallback() { 386eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor public void onPduLoaded(MessageItem messageItem) { 387eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor if (DEBUG) { 388eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor Log.v(TAG, "PduLoadedCallback in MessageListItem for item: " + mPosition + 389eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor " " + (mMessageItem == null ? "NULL" : mMessageItem.toString()) + 390eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor " passed in item: " + 391eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor (messageItem == null ? "NULL" : messageItem.toString())); 392eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor } 393eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor if (messageItem != null && mMessageItem != null && 394eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor messageItem.getMessageId() == mMessageItem.getMessageId()) { 395106d27e66e192ac88eb86440c015a617f990c2a6Tom Taylor mMessageItem.setCachedFormattedMessage(null); 3960fd8d0e7ec0fc246dcdbea999920cbbe7fca61e9Tom Taylor bindCommonMessage(true); 397eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor } 398eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor } 399eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor }); 400eee73088ec62f011fe99abfc7aac1ec6fd3feb52Tom Taylor } else { 40151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (mPresenter == null) { 40251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mPresenter = PresenterFactory.getPresenter( 40351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor "MmsThumbnailPresenter", mContext, 40451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor this, mMessageItem.mSlideshow); 40551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } else { 40651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mPresenter.setModel(mMessageItem.mSlideshow); 40751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mPresenter.setView(this); 40851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 409721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor if (mImageLoadedCallback == null) { 410721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor mImageLoadedCallback = new ImageLoadedCallback(this); 411721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor } else { 412721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor mImageLoadedCallback.reset(this); 413721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor } 414721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor mPresenter.present(mImageLoadedCallback); 415442a32e235a56401a849beda5564912bb2783e57Tom Taylor } 41672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 41751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor drawRightStatusIndicator(mMessageItem); 4189f756084b90d25fef7c22dfbb9d5842676164b34Kenny Root 4199f756084b90d25fef7c22dfbb9d5842676164b34Kenny Root requestLayout(); 42072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 42172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 42279bf6f70c54d08dc9c3481b8461a3a46a3cefb83Tom Taylor static private class ImageLoadedCallback implements ItemLoadedCallback<ImageLoaded> { 423721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor private long mMessageId; 42479bf6f70c54d08dc9c3481b8461a3a46a3cefb83Tom Taylor private final MessageListItem mListItem; 42551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 42651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor public ImageLoadedCallback(MessageListItem listItem) { 42751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mListItem = listItem; 42851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor mMessageId = listItem.getMessageItem().getMessageId(); 42951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 43051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 431721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor public void reset(MessageListItem listItem) { 432721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor mMessageId = listItem.getMessageItem().getMessageId(); 433721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor } 434721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor 43579bf6f70c54d08dc9c3481b8461a3a46a3cefb83Tom Taylor public void onItemLoaded(ImageLoaded imageLoaded, Throwable exception) { 436f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor if (DEBUG_DONT_LOAD_IMAGES) { 437f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor return; 438f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor } 43951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor // Make sure we're still pointing to the same message. The list item could have 44051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor // been recycled. 44151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor MessageItem msgItem = mListItem.mMessageItem; 44251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor if (msgItem != null && msgItem.getMessageId() == mMessageId) { 44379bf6f70c54d08dc9c3481b8461a3a46a3cefb83Tom Taylor if (imageLoaded.mIsVideo) { 44479bf6f70c54d08dc9c3481b8461a3a46a3cefb83Tom Taylor mListItem.setVideoThumbnail(null, imageLoaded.mBitmap); 44579bf6f70c54d08dc9c3481b8461a3a46a3cefb83Tom Taylor } else { 44679bf6f70c54d08dc9c3481b8461a3a46a3cefb83Tom Taylor mListItem.setImage(null, imageLoaded.mBitmap); 44779bf6f70c54d08dc9c3481b8461a3a46a3cefb83Tom Taylor } 44851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 44951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 45051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor } 45151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor 45244e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 45372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void startAudio() { 45472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO Auto-generated method stub 45572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 45672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 45744e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 45872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void startVideo() { 45972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO Auto-generated method stub 46072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 46172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 46244e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 46372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setAudio(Uri audio, String name, Map<String, ?> extras) { 46472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO Auto-generated method stub 46572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 46672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 46744e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 46872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setImage(String name, Bitmap bitmap) { 469f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor showMmsView(true); 47072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 4715a3151adedd991252dd529c75e85a3374970dfb0Tom Taylor try { 4725a3151adedd991252dd529c75e85a3374970dfb0Tom Taylor mImageView.setImageBitmap(bitmap); 4735a3151adedd991252dd529c75e85a3374970dfb0Tom Taylor mImageView.setVisibility(VISIBLE); 4745a3151adedd991252dd529c75e85a3374970dfb0Tom Taylor } catch (java.lang.OutOfMemoryError e) { 4755a3151adedd991252dd529c75e85a3374970dfb0Tom Taylor Log.e(TAG, "setImage: out of memory: ", e); 4766f53960f9a27fe76ba11735ede0778456d3f6930Tom Taylor } 47772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 47872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 479f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor private void showMmsView(boolean visible) { 48072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (mMmsView == null) { 48172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mMmsView = findViewById(R.id.mms_view); 482f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor // if mMmsView is still null here, that mean the mms section hasn't been inflated 483f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor 484f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor if (visible && mMmsView == null) { 485f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor //inflate the mms view_stub 486f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor View mmsStub = findViewById(R.id.mms_layout_view_stub); 487f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor mmsStub.setVisibility(View.VISIBLE); 488f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor mMmsView = findViewById(R.id.mms_view); 489f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor } 490f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor } 491f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor if (mMmsView != null) { 492f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor if (mImageView == null) { 493f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor mImageView = (ImageView) findViewById(R.id.image_view); 494f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor } 495f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor if (mSlideShowButton == null) { 496f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor mSlideShowButton = (ImageButton) findViewById(R.id.play_slideshow_button); 497f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor } 498f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor mMmsView.setVisibility(visible ? View.VISIBLE : View.GONE); 499f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor mImageView.setVisibility(visible ? View.VISIBLE : View.GONE); 50072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 50172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 502331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagner 50372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private void inflateDownloadControls() { 50472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (mDownloadButton == null) { 50572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project //inflate the download controls 50672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project findViewById(R.id.mms_downloading_view_stub).setVisibility(VISIBLE); 50772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mDownloadButton = (Button) findViewById(R.id.btn_download_msg); 50872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mDownloadingLabel = (TextView) findViewById(R.id.label_downloading); 50972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 51072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 51172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 5128b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner 5138b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner private LineHeightSpan mSpan = new LineHeightSpan() { 51444e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 5158b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner public void chooseHeight(CharSequence text, int start, 5168b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner int end, int spanstartv, int v, FontMetricsInt fm) { 5178b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner fm.ascent -= 10; 5188b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner } 5198b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner }; 5208b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner 5218b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner TextAppearanceSpan mTextSmallSpan = 5228b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner new TextAppearanceSpan(mContext, android.R.style.TextAppearance_Small); 5238b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner 5248b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner ForegroundColorSpan mColorSpan = null; // set in ctor 5258b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner 526c1f03822994dc09939060c41e0ce9cb37175b054Tom Taylor private CharSequence formatMessage(MessageItem msgItem, String body, 5273fb271abe0c478d0ea8432830589774182079c86Tom Taylor String subject, Pattern highlight, 5285a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor String contentType) { 5293fb271abe0c478d0ea8432830589774182079c86Tom Taylor SpannableStringBuilder buf = new SpannableStringBuilder(); 53072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 53172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project boolean hasSubject = !TextUtils.isEmpty(subject); 532fe0faf65c654a87d4d5de8d87713364fcf786a3fTom Taylor SmileyParser parser = SmileyParser.getInstance(); 53372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (hasSubject) { 534fe0faf65c654a87d4d5de8d87713364fcf786a3fTom Taylor CharSequence smilizedSubject = parser.addSmileySpans(subject); 535fe0faf65c654a87d4d5de8d87713364fcf786a3fTom Taylor // Can't use the normal getString() with extra arguments for string replacement 536fe0faf65c654a87d4d5de8d87713364fcf786a3fTom Taylor // because it doesn't preserve the SpannableText returned by addSmileySpans. 537fe0faf65c654a87d4d5de8d87713364fcf786a3fTom Taylor // We have to manually replace the %s with our text. 538fe0faf65c654a87d4d5de8d87713364fcf786a3fTom Taylor buf.append(TextUtils.replace(mContext.getResources().getString(R.string.inline_subject), 539fe0faf65c654a87d4d5de8d87713364fcf786a3fTom Taylor new String[] { "%s" }, new CharSequence[] { smilizedSubject })); 54072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 54172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 54272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (!TextUtils.isEmpty(body)) { 5437c8748972faf3078f53ef9ecbe6c95f0903f43f7satok // Converts html to spannable if ContentType is "text/html". 5447c8748972faf3078f53ef9ecbe6c95f0903f43f7satok if (contentType != null && ContentType.TEXT_HTML.equals(contentType)) { 5457c8748972faf3078f53ef9ecbe6c95f0903f43f7satok buf.append("\n"); 5467c8748972faf3078f53ef9ecbe6c95f0903f43f7satok buf.append(Html.fromHtml(body)); 5477c8748972faf3078f53ef9ecbe6c95f0903f43f7satok } else { 5487c8748972faf3078f53ef9ecbe6c95f0903f43f7satok if (hasSubject) { 5497c8748972faf3078f53ef9ecbe6c95f0903f43f7satok buf.append(" - "); 5507c8748972faf3078f53ef9ecbe6c95f0903f43f7satok } 5517c8748972faf3078f53ef9ecbe6c95f0903f43f7satok buf.append(parser.addSmileySpans(body)); 55272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 55372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 5548b5ea2314049354f289925d4d8c6f11d13626a34Mark Wagner 555331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagner if (highlight != null) { 556f114492537753bc68640d4a0d403861387296bcbMark Wagner Matcher m = highlight.matcher(buf.toString()); 557f114492537753bc68640d4a0d403861387296bcbMark Wagner while (m.find()) { 558f114492537753bc68640d4a0d403861387296bcbMark Wagner buf.setSpan(new StyleSpan(Typeface.BOLD), m.start(), m.end(), 0); 559331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagner } 560331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagner } 56172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return buf; 56272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 56372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 56472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private void drawPlaybackButton(MessageItem msgItem) { 56572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project switch (msgItem.mAttachmentType) { 566b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick case WorkingMessage.SLIDESHOW: 567b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick case WorkingMessage.AUDIO: 568b9bcfdd226bbb6f5b265f925343375192963d58aFicus Kirkpatrick case WorkingMessage.VIDEO: 56972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Show the 'Play' button and bind message info on it. 57072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mSlideShowButton.setTag(msgItem); 57172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Set call-back for the 'Play' button. 57272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mSlideShowButton.setOnClickListener(this); 57372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mSlideShowButton.setVisibility(View.VISIBLE); 57472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project setLongClickable(true); 575b0ef2b0d0974c13e98055d8ffd85bef559fe80a4Tom Taylor 576b0ef2b0d0974c13e98055d8ffd85bef559fe80a4Tom Taylor // When we show the mSlideShowButton, this list item's onItemClickListener doesn't 577b0ef2b0d0974c13e98055d8ffd85bef559fe80a4Tom Taylor // get called. (It gets set in ComposeMessageActivity: 578b0ef2b0d0974c13e98055d8ffd85bef559fe80a4Tom Taylor // mMsgListView.setOnItemClickListener) Here we explicitly set the item's 579b0ef2b0d0974c13e98055d8ffd85bef559fe80a4Tom Taylor // onClickListener. It allows the item to respond to embedded html links and at the 580b0ef2b0d0974c13e98055d8ffd85bef559fe80a4Tom Taylor // same time, allows the slide show play button to work. 581b0ef2b0d0974c13e98055d8ffd85bef559fe80a4Tom Taylor setOnClickListener(new OnClickListener() { 58244e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 583b0ef2b0d0974c13e98055d8ffd85bef559fe80a4Tom Taylor public void onClick(View v) { 584b0ef2b0d0974c13e98055d8ffd85bef559fe80a4Tom Taylor onMessageListItemClick(); 585b0ef2b0d0974c13e98055d8ffd85bef559fe80a4Tom Taylor } 586b0ef2b0d0974c13e98055d8ffd85bef559fe80a4Tom Taylor }); 58772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project break; 58872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project default: 58972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mSlideShowButton.setVisibility(View.GONE); 59072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project break; 59172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 59272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 59372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 59472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // OnClick Listener for the playback button 59544e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 59672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void onClick(View v) { 597661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor sendMessage(mMessageItem, MSG_LIST_PLAY); 598661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor } 599661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor 600661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor private void sendMessage(MessageItem messageItem, int message) { 601661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor if (mHandler != null) { 602661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor Message msg = Message.obtain(mHandler, message); 603661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor msg.obj = messageItem; 604661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor msg.sendToTarget(); // See ComposeMessageActivity.mMessageListItemHandler.handleMessage 60572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 60672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 60772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 60872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void onMessageListItemClick() { 60944e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev // If the message is a failed one, clicking it should reload it in the compose view, 61044e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev // regardless of whether it has links in it 61144e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev if (mMessageItem != null && 61244e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev mMessageItem.isOutgoingMessage() && 61344e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev mMessageItem.isFailedMessage() ) { 614661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor 615661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor // Assuming the current message is a failed one, reload it into the compose view so 616661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor // the user can resend it. 617661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor sendMessage(mMessageItem, MSG_LIST_EDIT); 61844e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev return; 61944e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev } 62044e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev 62144e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev // Check for links. If none, do nothing; if 1, open it; if >1, ask user to pick one 622b4ef5fdc458756bc259806a39c3379108fe804e0Tom Taylor final URLSpan[] spans = mBodyTextView.getUrls(); 62372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 62472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (spans.length == 0) { 6253efec5a219021385d816639f5c801c4cd277ae9dTom Taylor sendMessage(mMessageItem, MSG_LIST_DETAILS); // show the message details dialog 62672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (spans.length == 1) { 627b4ef5fdc458756bc259806a39c3379108fe804e0Tom Taylor spans[0].onClick(mBodyTextView); 62872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 629b4ef5fdc458756bc259806a39c3379108fe804e0Tom Taylor ArrayAdapter<URLSpan> adapter = 630b4ef5fdc458756bc259806a39c3379108fe804e0Tom Taylor new ArrayAdapter<URLSpan>(mContext, android.R.layout.select_dialog_item, spans) { 63144e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 63272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 63372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project View v = super.getView(position, convertView, parent); 63472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 635b4ef5fdc458756bc259806a39c3379108fe804e0Tom Taylor URLSpan span = getItem(position); 636b4ef5fdc458756bc259806a39c3379108fe804e0Tom Taylor String url = span.getURL(); 637b4ef5fdc458756bc259806a39c3379108fe804e0Tom Taylor Uri uri = Uri.parse(url); 63872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project TextView tv = (TextView) v; 639b4ef5fdc458756bc259806a39c3379108fe804e0Tom Taylor Drawable d = mContext.getPackageManager().getActivityIcon( 640b4ef5fdc458756bc259806a39c3379108fe804e0Tom Taylor new Intent(Intent.ACTION_VIEW, uri)); 64172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (d != null) { 64272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project d.setBounds(0, 0, d.getIntrinsicHeight(), d.getIntrinsicHeight()); 64372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project tv.setCompoundDrawablePadding(10); 64472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project tv.setCompoundDrawables(d, null, null, null); 64572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 64672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project final String telPrefix = "tel:"; 64772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (url.startsWith(telPrefix)) { 648e753c800a1533ee7e4f8bc3843991269f1295ec0Emmanuel Delaude if ((mDefaultCountryIso == null) || mDefaultCountryIso.isEmpty()) { 649e753c800a1533ee7e4f8bc3843991269f1295ec0Emmanuel Delaude url = url.substring(telPrefix.length()); 650e753c800a1533ee7e4f8bc3843991269f1295ec0Emmanuel Delaude } 651e753c800a1533ee7e4f8bc3843991269f1295ec0Emmanuel Delaude else { 652e753c800a1533ee7e4f8bc3843991269f1295ec0Emmanuel Delaude url = PhoneNumberUtils.formatNumber( 653e753c800a1533ee7e4f8bc3843991269f1295ec0Emmanuel Delaude url.substring(telPrefix.length()), mDefaultCountryIso); 654e753c800a1533ee7e4f8bc3843991269f1295ec0Emmanuel Delaude } 65572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 65672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project tv.setText(url); 65772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (android.content.pm.PackageManager.NameNotFoundException ex) { 65844e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev // it's ok if we're unable to set the drawable for this view - the user 65944e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev // can still use it 66072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 66172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return v; 66272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 66372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 66472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 66572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project AlertDialog.Builder b = new AlertDialog.Builder(mContext); 66672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 66772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project DialogInterface.OnClickListener click = new DialogInterface.OnClickListener() { 66844e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 66972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public final void onClick(DialogInterface dialog, int which) { 67072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (which >= 0) { 671b4ef5fdc458756bc259806a39c3379108fe804e0Tom Taylor spans[which].onClick(mBodyTextView); 67272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 673c4a34a0ccd414e2bba937e8abd105a0383afff35Tom Taylor dialog.dismiss(); 67472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 67572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 676331864544ec51ba6807fc5471cc6d537b7fef198Mark Wagner 67772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project b.setTitle(R.string.select_link_title); 67872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project b.setCancelable(true); 67972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project b.setAdapter(adapter, click); 68072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 68172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project b.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 68244e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 68372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public final void onClick(DialogInterface dialog, int which) { 68472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project dialog.dismiss(); 68572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 68672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }); 68772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 68872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project b.show(); 68972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 69072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 69172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 69272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private void setOnClickListener(final MessageItem msgItem) { 69372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project switch(msgItem.mAttachmentType) { 694661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor case WorkingMessage.IMAGE: 695661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor case WorkingMessage.VIDEO: 696661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor mImageView.setOnClickListener(new OnClickListener() { 697661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor @Override 698661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor public void onClick(View v) { 699661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor sendMessage(msgItem, MSG_LIST_PLAY); 700661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor } 701661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor }); 702661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor mImageView.setOnLongClickListener(new OnLongClickListener() { 703661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor @Override 704661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor public boolean onLongClick(View v) { 705661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor return v.showContextMenu(); 706661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor } 707661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor }); 708661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor break; 70972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 710661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor default: 711661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor mImageView.setOnClickListener(null); 712661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor break; 713661957caeb3110ae3328a995edd467ceedc07a36Tom Taylor } 71472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 71572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 71672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private void drawRightStatusIndicator(MessageItem msgItem) { 7175a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor // Locked icon 7185a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor if (msgItem.mLocked) { 7195a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mLockedIndicator.setImageResource(R.drawable.ic_lock_message_sms); 7205a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mLockedIndicator.setVisibility(View.VISIBLE); 7215a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor } else { 7225a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mLockedIndicator.setVisibility(View.GONE); 7235a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor } 7245a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor 72521a30a301e99a15217f02fddcbacfc2aa622fc7bTom Taylor // Delivery icon - we can show a failed icon for both sms and mms, but for an actual 72621a30a301e99a15217f02fddcbacfc2aa622fc7bTom Taylor // delivery, we only show the icon for sms. We don't have the information here in mms to 72721a30a301e99a15217f02fddcbacfc2aa622fc7bTom Taylor // know whether the message has been delivered. For mms, msgItem.mDeliveryStatus set 72821a30a301e99a15217f02fddcbacfc2aa622fc7bTom Taylor // to MessageItem.DeliveryStatus.RECEIVED simply means the setting requesting a 72921a30a301e99a15217f02fddcbacfc2aa622fc7bTom Taylor // delivery report was turned on when the message was sent. Yes, it's confusing! 73044e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev if ((msgItem.isOutgoingMessage() && msgItem.isFailedMessage()) || 73144e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev msgItem.mDeliveryStatus == MessageItem.DeliveryStatus.FAILED) { 7325ad68bd0767ac325cf272317c5eb80d08fc2b018Tom Taylor mDeliveredIndicator.setImageResource(R.drawable.ic_list_alert_sms_failed); 7335a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mDeliveredIndicator.setVisibility(View.VISIBLE); 73421a30a301e99a15217f02fddcbacfc2aa622fc7bTom Taylor } else if (msgItem.isSms() && 73521a30a301e99a15217f02fddcbacfc2aa622fc7bTom Taylor msgItem.mDeliveryStatus == MessageItem.DeliveryStatus.RECEIVED) { 7365a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mDeliveredIndicator.setImageResource(R.drawable.ic_sms_mms_delivered); 7375a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mDeliveredIndicator.setVisibility(View.VISIBLE); 7385a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor } else { 7395a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mDeliveredIndicator.setVisibility(View.GONE); 7405a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor } 7415a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor 74221a30a301e99a15217f02fddcbacfc2aa622fc7bTom Taylor // Message details icon - this icon is shown both for sms and mms messages. For mms, 74321a30a301e99a15217f02fddcbacfc2aa622fc7bTom Taylor // we show the icon if the read report or delivery report setting was set when the 74421a30a301e99a15217f02fddcbacfc2aa622fc7bTom Taylor // message was sent. Showing the icon tells the user there's more information 74521a30a301e99a15217f02fddcbacfc2aa622fc7bTom Taylor // by selecting the "View report" menu. 74621a30a301e99a15217f02fddcbacfc2aa622fc7bTom Taylor if (msgItem.mDeliveryStatus == MessageItem.DeliveryStatus.INFO || msgItem.mReadReport 74721a30a301e99a15217f02fddcbacfc2aa622fc7bTom Taylor || (msgItem.isMms() && 74821a30a301e99a15217f02fddcbacfc2aa622fc7bTom Taylor msgItem.mDeliveryStatus == MessageItem.DeliveryStatus.RECEIVED)) { 7495a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mDetailsIndicator.setImageResource(R.drawable.ic_sms_mms_details); 7505a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mDetailsIndicator.setVisibility(View.VISIBLE); 75172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else { 7525a73318ac906b37eb5634a6975a8a26ef5ed36efTom Taylor mDetailsIndicator.setVisibility(View.GONE); 75372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 75472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 75572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 75644e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 75772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setImageRegionFit(String fit) { 75872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO Auto-generated method stub 75972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 76072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 76144e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 76272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setImageVisibility(boolean visible) { 76372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO Auto-generated method stub 76472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 76572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 76644e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 76772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setText(String name, String text) { 76872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO Auto-generated method stub 76972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 77072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 77144e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 77272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setTextVisibility(boolean visible) { 77372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO Auto-generated method stub 77472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 77572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 77644e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 77779bf6f70c54d08dc9c3481b8461a3a46a3cefb83Tom Taylor public void setVideo(String name, Uri uri) { 77879bf6f70c54d08dc9c3481b8461a3a46a3cefb83Tom Taylor } 77979bf6f70c54d08dc9c3481b8461a3a46a3cefb83Tom Taylor 78079bf6f70c54d08dc9c3481b8461a3a46a3cefb83Tom Taylor @Override 78179bf6f70c54d08dc9c3481b8461a3a46a3cefb83Tom Taylor public void setVideoThumbnail(String name, Bitmap bitmap) { 782f627528d5e7780baa20975c067637126c3fc0f57Tom Taylor showMmsView(true); 7835a3151adedd991252dd529c75e85a3374970dfb0Tom Taylor 7845a3151adedd991252dd529c75e85a3374970dfb0Tom Taylor try { 7855a3151adedd991252dd529c75e85a3374970dfb0Tom Taylor mImageView.setImageBitmap(bitmap); 7865a3151adedd991252dd529c75e85a3374970dfb0Tom Taylor mImageView.setVisibility(VISIBLE); 7875a3151adedd991252dd529c75e85a3374970dfb0Tom Taylor } catch (java.lang.OutOfMemoryError e) { 7885a3151adedd991252dd529c75e85a3374970dfb0Tom Taylor Log.e(TAG, "setVideo: out of memory: ", e); 78972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 79072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 79172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 79244e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 79372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setVideoVisibility(boolean visible) { 79472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO Auto-generated method stub 79572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 79672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 79744e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 79872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void stopAudio() { 79972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO Auto-generated method stub 80072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 80172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 80244e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 80372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void stopVideo() { 80472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO Auto-generated method stub 80572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 80672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 80744e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 80872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void reset() { 80972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 81072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 81144e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 81272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void setVisibility(boolean visible) { 81372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO Auto-generated method stub 81472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 81572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 81644e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 81772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void pauseAudio() { 81872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO Auto-generated method stub 81972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 82072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 82172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 82244e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 82372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void pauseVideo() { 82472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO Auto-generated method stub 82572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 82672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 82772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 82844e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 82972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void seekAudio(int seekTo) { 83072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO Auto-generated method stub 83172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 83272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 83372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 83444e86cc021e0656602ecdb6afa38051cfebea68dTodor Kalaydjiev @Override 83572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void seekVideo(int seekTo) { 83672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // TODO Auto-generated method stub 83772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 83872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 83972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project} 840