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