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