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