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