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