MessageListItem.java revision 61f7564d146f338dbcc05340a6800446f892b121
1/* 2 * Copyright (C) 2008 Esmertec AG. 3 * Copyright (C) 2008 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18package com.android.mms.ui; 19 20import java.util.Map; 21import java.util.regex.Matcher; 22import java.util.regex.Pattern; 23 24import android.app.AlertDialog; 25import android.content.Context; 26import android.content.DialogInterface; 27import android.content.Intent; 28import android.graphics.Bitmap; 29import android.graphics.BitmapFactory; 30import android.graphics.Canvas; 31import android.graphics.Paint; 32import android.graphics.Typeface; 33import android.graphics.Paint.FontMetricsInt; 34import android.graphics.drawable.Drawable; 35import android.net.Uri; 36import android.os.Handler; 37import android.os.Message; 38import android.provider.Browser; 39import android.provider.Telephony.Mms; 40import android.provider.Telephony.MmsSms; 41import android.provider.Telephony.Sms; 42import android.telephony.PhoneNumberUtils; 43import android.telephony.TelephonyManager; 44import android.text.Html; 45import android.text.Layout; 46import android.text.Spannable; 47import android.text.SpannableStringBuilder; 48import android.text.TextUtils; 49import android.text.method.HideReturnsTransformationMethod; 50import android.text.style.ForegroundColorSpan; 51import android.text.style.LeadingMarginSpan; 52import android.text.style.LineHeightSpan; 53import android.text.style.StyleSpan; 54import android.text.style.TextAppearanceSpan; 55import android.text.style.URLSpan; 56import android.util.AttributeSet; 57import android.util.Log; 58import android.view.View; 59import android.view.ViewGroup; 60import android.view.View.OnClickListener; 61import android.widget.ArrayAdapter; 62import android.widget.Button; 63import android.widget.ImageButton; 64import android.widget.ImageView; 65import android.widget.LinearLayout; 66import android.widget.QuickContactBadge; 67import android.widget.TextView; 68 69import com.android.mms.MmsApp; 70import com.android.mms.R; 71import com.android.mms.data.WorkingMessage; 72import com.android.mms.transaction.Transaction; 73import com.android.mms.transaction.TransactionBundle; 74import com.android.mms.transaction.TransactionService; 75import com.android.mms.util.DownloadManager; 76import com.android.mms.util.SmileyParser; 77import com.google.android.mms.ContentType; 78import com.google.android.mms.pdu.PduHeaders; 79 80/** 81 * This class provides view of a message in the messages list. 82 */ 83public class MessageListItem extends LinearLayout implements 84 SlideViewInterface, OnClickListener { 85 public static final String EXTRA_URLS = "com.android.mms.ExtraUrls"; 86 87 private static final String TAG = "MessageListItem"; 88 private static final StyleSpan STYLE_BOLD = new StyleSpan(Typeface.BOLD); 89 90 static final int MSG_LIST_EDIT_MMS = 1; 91 static final int MSG_LIST_EDIT_SMS = 2; 92 93 private View mMsgListItem; 94 private View mMmsView; 95 private ImageView mImageView; 96 private ImageView mLockedIndicator; 97 private ImageView mDeliveredIndicator; 98 private ImageView mDetailsIndicator; 99 private ImageButton mSlideShowButton; 100 private TextView mBodyTextView; 101 private Button mDownloadButton; 102 private TextView mDownloadingLabel; 103 private QuickContactBadge mAvatar; 104 private Handler mHandler; 105 private MessageItem mMessageItem; 106 private String mDefaultCountryIso; 107 108 public MessageListItem(Context context) { 109 super(context); 110 mDefaultCountryIso = MmsApp.getApplication().getCurrentCountryIso(); 111 } 112 113 public MessageListItem(Context context, AttributeSet attrs) { 114 super(context, attrs); 115 116 int color = mContext.getResources().getColor(R.color.timestamp_color); 117 mColorSpan = new ForegroundColorSpan(color); 118 } 119 120 @Override 121 protected void onFinishInflate() { 122 super.onFinishInflate(); 123 124 mMsgListItem = findViewById(R.id.msg_list_item); 125 mBodyTextView = (TextView) findViewById(R.id.text_view); 126 mLockedIndicator = (ImageView) findViewById(R.id.locked_indicator); 127 mDeliveredIndicator = (ImageView) findViewById(R.id.delivered_indicator); 128 mDetailsIndicator = (ImageView) findViewById(R.id.details_indicator); 129 mAvatar = (QuickContactBadge) findViewById(R.id.avatar); 130 131 ViewGroup.MarginLayoutParams badgeParams = (MarginLayoutParams)mAvatar.getLayoutParams(); 132 final int badgeWidth = badgeParams.width + badgeParams.rightMargin + badgeParams.leftMargin; 133 134 int lineHeight = mBodyTextView.getLineHeight(); 135 int effectiveBadgeHeight = badgeParams.height + badgeParams.topMargin - mBodyTextView.getPaddingTop(); 136 final int indentLineCount = (int) ((effectiveBadgeHeight-1) / lineHeight) + 1; 137 138 mLeadingMarginSpan = new LeadingMarginSpan.LeadingMarginSpan2() { 139 public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, 140 int top, int baseline, int bottom, CharSequence text, 141 int start, int end, boolean first, Layout layout) { 142 // no op 143 } 144 145 public int getLeadingMargin(boolean first) { 146 return first ? badgeWidth : 0; 147 } 148 149 public int getLeadingMarginLineCount() { 150 return indentLineCount; 151 } 152 }; 153 154 } 155 156 public void bind(MessageListAdapter.AvatarCache avatarCache, MessageItem msgItem) { 157 mMessageItem = msgItem; 158 159 setLongClickable(false); 160 161 switch (msgItem.mMessageType) { 162 case PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND: 163 bindNotifInd(msgItem); 164 break; 165 default: 166 bindCommonMessage(avatarCache, msgItem); 167 break; 168 } 169 } 170 171 public MessageItem getMessageItem() { 172 return mMessageItem; 173 } 174 175 public void setMsgListItemHandler(Handler handler) { 176 mHandler = handler; 177 } 178 179 private void bindNotifInd(final MessageItem msgItem) { 180 hideMmsViewIfNeeded(); 181 182 String msgSizeText = mContext.getString(R.string.message_size_label) 183 + String.valueOf((msgItem.mMessageSize + 1023) / 1024) 184 + mContext.getString(R.string.kilobyte); 185 186 mBodyTextView.setText(formatMessage(msgItem, msgItem.mContact, null, msgItem.mSubject, 187 msgSizeText + "\n" + msgItem.mTimestamp, 188 msgItem.mHighlight, msgItem.mTextContentType)); 189 190 int state = DownloadManager.getInstance().getState(msgItem.mMessageUri); 191 switch (state) { 192 case DownloadManager.STATE_DOWNLOADING: 193 inflateDownloadControls(); 194 mDownloadingLabel.setVisibility(View.VISIBLE); 195 mDownloadButton.setVisibility(View.GONE); 196 break; 197 case DownloadManager.STATE_UNSTARTED: 198 case DownloadManager.STATE_TRANSIENT_FAILURE: 199 case DownloadManager.STATE_PERMANENT_FAILURE: 200 default: 201 setLongClickable(true); 202 inflateDownloadControls(); 203 mDownloadingLabel.setVisibility(View.GONE); 204 mDownloadButton.setVisibility(View.VISIBLE); 205 mDownloadButton.setOnClickListener(new OnClickListener() { 206 public void onClick(View v) { 207 mDownloadingLabel.setVisibility(View.VISIBLE); 208 mDownloadButton.setVisibility(View.GONE); 209 Intent intent = new Intent(mContext, TransactionService.class); 210 intent.putExtra(TransactionBundle.URI, msgItem.mMessageUri.toString()); 211 intent.putExtra(TransactionBundle.TRANSACTION_TYPE, 212 Transaction.RETRIEVE_TRANSACTION); 213 mContext.startService(intent); 214 } 215 }); 216 break; 217 } 218 219 // Hide the indicators. 220 mLockedIndicator.setVisibility(View.GONE); 221 mDeliveredIndicator.setVisibility(View.GONE); 222 mDetailsIndicator.setVisibility(View.GONE); 223 224 drawLeftStatusIndicator(msgItem.mBoxId); 225 } 226 227 private void bindCommonMessage(final MessageListAdapter.AvatarCache avatarCache, final MessageItem msgItem) { 228 if (mDownloadButton != null) { 229 mDownloadButton.setVisibility(View.GONE); 230 mDownloadingLabel.setVisibility(View.GONE); 231 } 232 // Since the message text should be concatenated with the sender's 233 // address(or name), I have to display it here instead of 234 // displaying it by the Presenter. 235 mBodyTextView.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); 236 237 String addr = null; 238 if (!Sms.isOutgoingFolder(msgItem.mBoxId)) { 239 addr = msgItem.mAddress; 240 } else { 241 addr = MmsApp.getApplication().getTelephonyManager().getLine1Number(); 242 } 243 if (!TextUtils.isEmpty(addr)) { 244 MessageListAdapter.AvatarCache.ContactData contactData = avatarCache.get(addr); 245 mAvatar.setImageDrawable(contactData.getAvatar()); 246 Uri contactUri = contactData.getContactUri(); 247 // Since we load the contact info in the background, on the first screenfull of 248 // messages, it's likely we haven't loaded the contact URI info yet. In that case, 249 // fall back and use the phone number. 250 if (contactUri != null) { 251 mAvatar.assignContactUri(contactUri); 252 } else { 253 mAvatar.assignContactFromPhone(addr, true); 254 } 255 } else { 256 mAvatar.setImageToDefault(); 257 mAvatar.assignContactUri(null); 258 } 259 260 // Get and/or lazily set the formatted message from/on the 261 // MessageItem. Because the MessageItem instances come from a 262 // cache (currently of size ~50), the hit rate on avoiding the 263 // expensive formatMessage() call is very high. 264 CharSequence formattedMessage = msgItem.getCachedFormattedMessage(); 265 if (formattedMessage == null) { 266 formattedMessage = formatMessage(msgItem, msgItem.mContact, msgItem.mBody, 267 msgItem.mSubject, msgItem.mTimestamp, 268 msgItem.mHighlight, msgItem.mTextContentType); 269 } 270 mBodyTextView.setText(formattedMessage); 271 272 if (msgItem.isSms()) { 273 hideMmsViewIfNeeded(); 274 } else { 275 Presenter presenter = PresenterFactory.getPresenter( 276 "MmsThumbnailPresenter", mContext, 277 this, msgItem.mSlideshow); 278 presenter.present(); 279 280 if (msgItem.mAttachmentType != WorkingMessage.TEXT) { 281 inflateMmsView(); 282 mMmsView.setVisibility(View.VISIBLE); 283 setOnClickListener(msgItem); 284 drawPlaybackButton(msgItem); 285 } else { 286 hideMmsViewIfNeeded(); 287 } 288 } 289 290 drawLeftStatusIndicator(msgItem.mBoxId); 291 drawRightStatusIndicator(msgItem); 292 293 requestLayout(); 294 } 295 296 private void hideMmsViewIfNeeded() { 297 if (mMmsView != null) { 298 mMmsView.setVisibility(View.GONE); 299 } 300 } 301 302 public void startAudio() { 303 // TODO Auto-generated method stub 304 } 305 306 public void startVideo() { 307 // TODO Auto-generated method stub 308 } 309 310 public void setAudio(Uri audio, String name, Map<String, ?> extras) { 311 // TODO Auto-generated method stub 312 } 313 314 public void setImage(String name, Bitmap bitmap) { 315 inflateMmsView(); 316 317 try { 318 if (null == bitmap) { 319 bitmap = BitmapFactory.decodeResource(getResources(), 320 R.drawable.ic_missing_thumbnail_picture); 321 } 322 mImageView.setImageBitmap(bitmap); 323 mImageView.setVisibility(VISIBLE); 324 } catch (java.lang.OutOfMemoryError e) { 325 Log.e(TAG, "setImage: out of memory: ", e); 326 } 327 } 328 329 private void inflateMmsView() { 330 if (mMmsView == null) { 331 //inflate the surrounding view_stub 332 findViewById(R.id.mms_layout_view_stub).setVisibility(VISIBLE); 333 334 mMmsView = findViewById(R.id.mms_view); 335 mImageView = (ImageView) findViewById(R.id.image_view); 336 mSlideShowButton = (ImageButton) findViewById(R.id.play_slideshow_button); 337 } 338 } 339 340 private void inflateDownloadControls() { 341 if (mDownloadButton == null) { 342 //inflate the download controls 343 findViewById(R.id.mms_downloading_view_stub).setVisibility(VISIBLE); 344 mDownloadButton = (Button) findViewById(R.id.btn_download_msg); 345 mDownloadingLabel = (TextView) findViewById(R.id.label_downloading); 346 } 347 } 348 349 private LeadingMarginSpan mLeadingMarginSpan; 350 351 private LineHeightSpan mSpan = new LineHeightSpan() { 352 public void chooseHeight(CharSequence text, int start, 353 int end, int spanstartv, int v, FontMetricsInt fm) { 354 fm.ascent -= 10; 355 } 356 }; 357 358 TextAppearanceSpan mTextSmallSpan = 359 new TextAppearanceSpan(mContext, android.R.style.TextAppearance_Small); 360 361 ForegroundColorSpan mColorSpan = null; // set in ctor 362 363 private CharSequence formatMessage(MessageItem msgItem, String contact, String body, 364 String subject, String timestamp, Pattern highlight, 365 String contentType) { 366 CharSequence template = mContext.getResources().getText(R.string.name_colon); 367 SpannableStringBuilder buf = 368 new SpannableStringBuilder(TextUtils.replace(template, 369 new String[] { "%s" }, 370 new CharSequence[] { contact })); 371 372 boolean hasSubject = !TextUtils.isEmpty(subject); 373 if (hasSubject) { 374 buf.append(mContext.getResources().getString(R.string.inline_subject, subject)); 375 } 376 377 if (!TextUtils.isEmpty(body)) { 378 // Converts html to spannable if ContentType is "text/html". 379 if (contentType != null && ContentType.TEXT_HTML.equals(contentType)) { 380 buf.append("\n"); 381 buf.append(Html.fromHtml(body)); 382 } else { 383 if (hasSubject) { 384 buf.append(" - "); 385 } 386 SmileyParser parser = SmileyParser.getInstance(); 387 buf.append(parser.addSmileySpans(body)); 388 } 389 } 390 // If we're in the process of sending a message (i.e. pending), then we show a "Sending..." 391 // string in place of the timestamp. 392 if (msgItem.isSending()) { 393 timestamp = mContext.getResources().getString(R.string.sending_message); 394 } 395 // We always show two lines because the optional icon bottoms are aligned with the 396 // bottom of the text field, assuming there are two lines for the message and the sent time. 397 buf.append("\n"); 398 int startOffset = buf.length(); 399 400 startOffset = buf.length(); 401 buf.append(TextUtils.isEmpty(timestamp) ? " " : timestamp); 402 403 buf.setSpan(mTextSmallSpan, startOffset, buf.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 404 buf.setSpan(mSpan, startOffset+1, buf.length(), 0); 405 406 // Make the timestamp text not as dark 407 buf.setSpan(mColorSpan, startOffset, buf.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 408 409 if (highlight != null) { 410 Matcher m = highlight.matcher(buf.toString()); 411 while (m.find()) { 412 buf.setSpan(new StyleSpan(Typeface.BOLD), m.start(), m.end(), 0); 413 } 414 } 415 buf.setSpan(mLeadingMarginSpan, 0, buf.length(), 0); 416 return buf; 417 } 418 419 private void drawPlaybackButton(MessageItem msgItem) { 420 switch (msgItem.mAttachmentType) { 421 case WorkingMessage.SLIDESHOW: 422 case WorkingMessage.AUDIO: 423 case WorkingMessage.VIDEO: 424 // Show the 'Play' button and bind message info on it. 425 mSlideShowButton.setTag(msgItem); 426 // Set call-back for the 'Play' button. 427 mSlideShowButton.setOnClickListener(this); 428 mSlideShowButton.setVisibility(View.VISIBLE); 429 setLongClickable(true); 430 431 // When we show the mSlideShowButton, this list item's onItemClickListener doesn't 432 // get called. (It gets set in ComposeMessageActivity: 433 // mMsgListView.setOnItemClickListener) Here we explicitly set the item's 434 // onClickListener. It allows the item to respond to embedded html links and at the 435 // same time, allows the slide show play button to work. 436 setOnClickListener(new OnClickListener() { 437 public void onClick(View v) { 438 onMessageListItemClick(); 439 } 440 }); 441 break; 442 default: 443 mSlideShowButton.setVisibility(View.GONE); 444 break; 445 } 446 } 447 448 // OnClick Listener for the playback button 449 public void onClick(View v) { 450 MessageItem mi = (MessageItem) v.getTag(); 451 switch (mi.mAttachmentType) { 452 case WorkingMessage.VIDEO: 453 case WorkingMessage.AUDIO: 454 case WorkingMessage.SLIDESHOW: 455 MessageUtils.viewMmsMessageAttachment(mContext, mi.mMessageUri, mi.mSlideshow); 456 break; 457 } 458 } 459 460 public void onMessageListItemClick() { 461 URLSpan[] spans = mBodyTextView.getUrls(); 462 463 if (spans.length == 0) { 464 // Do nothing. 465 } else if (spans.length == 1) { 466 Uri uri = Uri.parse(spans[0].getURL()); 467 Intent intent = new Intent(Intent.ACTION_VIEW, uri); 468 intent.putExtra(Browser.EXTRA_APPLICATION_ID, mContext.getPackageName()); 469 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 470 mContext.startActivity(intent); 471 } else { 472 final java.util.ArrayList<String> urls = MessageUtils.extractUris(spans); 473 474 ArrayAdapter<String> adapter = 475 new ArrayAdapter<String>(mContext, android.R.layout.select_dialog_item, urls) { 476 public View getView(int position, View convertView, ViewGroup parent) { 477 View v = super.getView(position, convertView, parent); 478 try { 479 String url = getItem(position).toString(); 480 TextView tv = (TextView) v; 481 Drawable d = mContext.getPackageManager().getActivityIcon(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); 482 if (d != null) { 483 d.setBounds(0, 0, d.getIntrinsicHeight(), d.getIntrinsicHeight()); 484 tv.setCompoundDrawablePadding(10); 485 tv.setCompoundDrawables(d, null, null, null); 486 } 487 final String telPrefix = "tel:"; 488 if (url.startsWith(telPrefix)) { 489 url = PhoneNumberUtils.formatNumber( 490 url.substring(telPrefix.length()), mDefaultCountryIso); 491 } 492 tv.setText(url); 493 } catch (android.content.pm.PackageManager.NameNotFoundException ex) { 494 ; 495 } 496 return v; 497 } 498 }; 499 500 AlertDialog.Builder b = new AlertDialog.Builder(mContext); 501 502 DialogInterface.OnClickListener click = new DialogInterface.OnClickListener() { 503 public final void onClick(DialogInterface dialog, int which) { 504 if (which >= 0) { 505 Uri uri = Uri.parse(urls.get(which)); 506 Intent intent = new Intent(Intent.ACTION_VIEW, uri); 507 intent.putExtra(Browser.EXTRA_APPLICATION_ID, mContext.getPackageName()); 508 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 509 mContext.startActivity(intent); 510 } 511 dialog.dismiss(); 512 } 513 }; 514 515 b.setTitle(R.string.select_link_title); 516 b.setCancelable(true); 517 b.setAdapter(adapter, click); 518 519 b.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 520 public final void onClick(DialogInterface dialog, int which) { 521 dialog.dismiss(); 522 } 523 }); 524 525 b.show(); 526 } 527 } 528 529 530 private void setOnClickListener(final MessageItem msgItem) { 531 switch(msgItem.mAttachmentType) { 532 case WorkingMessage.IMAGE: 533 case WorkingMessage.VIDEO: 534 mImageView.setOnClickListener(new OnClickListener() { 535 public void onClick(View v) { 536 MessageUtils.viewMmsMessageAttachment(mContext, null, msgItem.mSlideshow); 537 } 538 }); 539 mImageView.setOnLongClickListener(new OnLongClickListener() { 540 public boolean onLongClick(View v) { 541 return v.showContextMenu(); 542 } 543 }); 544 break; 545 546 default: 547 mImageView.setOnClickListener(null); 548 break; 549 } 550 } 551 552 private void drawLeftStatusIndicator(int msgBoxId) { 553 switch (msgBoxId) { 554 case Mms.MESSAGE_BOX_INBOX: 555 mMsgListItem.setBackgroundResource(R.drawable.listitem_background_lightblue); 556 break; 557 558 case Mms.MESSAGE_BOX_DRAFTS: 559 case Sms.MESSAGE_TYPE_FAILED: 560 case Sms.MESSAGE_TYPE_QUEUED: 561 case Mms.MESSAGE_BOX_OUTBOX: 562 mMsgListItem.setBackgroundResource(R.drawable.listitem_background); 563 break; 564 565 default: 566 mMsgListItem.setBackgroundResource(R.drawable.listitem_background); 567 break; 568 } 569 } 570 571 private void setErrorIndicatorClickListener(final MessageItem msgItem) { 572 String type = msgItem.mType; 573 final int what; 574 if (type.equals("sms")) { 575 what = MSG_LIST_EDIT_SMS; 576 } else { 577 what = MSG_LIST_EDIT_MMS; 578 } 579 mDeliveredIndicator.setOnClickListener(new OnClickListener() { 580 public void onClick(View v) { 581 if (null != mHandler) { 582 Message msg = Message.obtain(mHandler, what); 583 msg.obj = new Long(msgItem.mMsgId); 584 msg.sendToTarget(); 585 } 586 } 587 }); 588 } 589 590 private void drawRightStatusIndicator(MessageItem msgItem) { 591 // Locked icon 592 if (msgItem.mLocked) { 593 mLockedIndicator.setImageResource(R.drawable.ic_lock_message_sms); 594 mLockedIndicator.setVisibility(View.VISIBLE); 595 } else { 596 mLockedIndicator.setVisibility(View.GONE); 597 } 598 599 // Delivery icon 600 if (msgItem.isOutgoingMessage() && msgItem.isFailedMessage()) { 601 mDeliveredIndicator.setImageResource(R.drawable.ic_list_alert_sms_failed); 602 setErrorIndicatorClickListener(msgItem); 603 mDeliveredIndicator.setVisibility(View.VISIBLE); 604 } else if (msgItem.mDeliveryStatus == MessageItem.DeliveryStatus.FAILED) { 605 mDeliveredIndicator.setImageResource(R.drawable.ic_list_alert_sms_failed); 606 mDeliveredIndicator.setVisibility(View.VISIBLE); 607 } else if (msgItem.mDeliveryStatus == MessageItem.DeliveryStatus.RECEIVED) { 608 mDeliveredIndicator.setImageResource(R.drawable.ic_sms_mms_delivered); 609 mDeliveredIndicator.setVisibility(View.VISIBLE); 610 } else { 611 mDeliveredIndicator.setVisibility(View.GONE); 612 } 613 614 // Message details icon 615 if (msgItem.mDeliveryStatus == MessageItem.DeliveryStatus.INFO || msgItem.mReadReport) { 616 mDetailsIndicator.setImageResource(R.drawable.ic_sms_mms_details); 617 mDetailsIndicator.setVisibility(View.VISIBLE); 618 } else { 619 mDetailsIndicator.setVisibility(View.GONE); 620 } 621 } 622 623 public void setImageRegionFit(String fit) { 624 // TODO Auto-generated method stub 625 } 626 627 public void setImageVisibility(boolean visible) { 628 // TODO Auto-generated method stub 629 } 630 631 public void setText(String name, String text) { 632 // TODO Auto-generated method stub 633 } 634 635 public void setTextVisibility(boolean visible) { 636 // TODO Auto-generated method stub 637 } 638 639 public void setVideo(String name, Uri video) { 640 inflateMmsView(); 641 642 try { 643 Bitmap bitmap = VideoAttachmentView.createVideoThumbnail(mContext, video); 644 if (null == bitmap) { 645 bitmap = BitmapFactory.decodeResource(getResources(), 646 R.drawable.ic_missing_thumbnail_video); 647 } 648 mImageView.setImageBitmap(bitmap); 649 mImageView.setVisibility(VISIBLE); 650 } catch (java.lang.OutOfMemoryError e) { 651 Log.e(TAG, "setVideo: out of memory: ", e); 652 } 653 } 654 655 public void setVideoVisibility(boolean visible) { 656 // TODO Auto-generated method stub 657 } 658 659 public void stopAudio() { 660 // TODO Auto-generated method stub 661 } 662 663 public void stopVideo() { 664 // TODO Auto-generated method stub 665 } 666 667 public void reset() { 668 if (mImageView != null) { 669 mImageView.setVisibility(GONE); 670 } 671 } 672 673 public void setVisibility(boolean visible) { 674 // TODO Auto-generated method stub 675 } 676 677 public void pauseAudio() { 678 // TODO Auto-generated method stub 679 680 } 681 682 public void pauseVideo() { 683 // TODO Auto-generated method stub 684 685 } 686 687 public void seekAudio(int seekTo) { 688 // TODO Auto-generated method stub 689 690 } 691 692 public void seekVideo(int seekTo) { 693 // TODO Auto-generated method stub 694 695 } 696} 697