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