ConversationListItem.java revision b8cadac68b0e449a7b2139fe3a0a4352873bcee5
172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/*
272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2008 Esmertec AG.
372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * you may not use this file except in compliance with the License.
772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * You may obtain a copy of the License at
872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
1072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
1172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * See the License for the specific language governing permissions and
1572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * limitations under the License.
1672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
1772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
1872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpackage com.android.mms.ui;
1972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.R;
2172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Context;
2372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.graphics.Typeface;
2472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.graphics.drawable.Drawable;
2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Handler;
2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.Spannable;
2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.SpannableStringBuilder;
2972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.style.ForegroundColorSpan;
30b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylorimport android.text.style.StyleSpan;
3172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.style.TextAppearanceSpan;
3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.AttributeSet;
3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log;
3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.View;
3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.Window;
3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.ImageView;
3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.RelativeLayout;
3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.TextView;
3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/**
4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * This class manages the view for given conversation.
4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class ConversationHeaderView extends RelativeLayout {
4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final String TAG = "ConversationHeaderView";
4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final boolean DEBUG = false;
4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private TextView mSubjectView;
4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private TextView mFromView;
4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private TextView mDateView;
5072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private View mAttachmentView;
5172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private View mErrorIndicator;
5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private ImageView mPresenceView;
5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // For posting UI update Runnables from other threads:
5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private Handler mHandler = new Handler();
5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // Access to mConversationHeader is guarded by mConversationHeaderLock.
5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private final Object mConversationHeaderLock = new Object();
5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private ConversationHeader mConversationHeader;
60b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor
61b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor    private static final StyleSpan STYLE_BOLD = new StyleSpan(Typeface.BOLD);
6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public ConversationHeaderView(Context context) {
6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super(context);
6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public ConversationHeaderView(Context context, AttributeSet attrs) {
6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super(context, attrs);
6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void onFinishInflate() {
7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onFinishInflate();
7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mFromView = (TextView) findViewById(R.id.from);
7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSubjectView = (TextView) findViewById(R.id.subject);
7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mDateView = (TextView) findViewById(R.id.date);
7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mAttachmentView = findViewById(R.id.attachment);
8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mErrorIndicator = findViewById(R.id.error);
8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mPresenceView = (ImageView) findViewById(R.id.presence);
8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setPresenceIcon(int iconId) {
8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (iconId == 0) {
8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mPresenceView.setVisibility(View.GONE);
8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else {
8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mPresenceView.setImageResource(iconId);
8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mPresenceView.setVisibility(View.VISIBLE);
9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public ConversationHeader getConversationHeader() {
9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        synchronized (mConversationHeaderLock) {
9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return mConversationHeader;
9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void setConversationHeader(ConversationHeader header) {
10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        synchronized (mConversationHeaderLock) {
10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mConversationHeader = header;
10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Only used for header binding.
10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
10872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void bind(String title, String explain) {
10972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mFromView.setText(title);
11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSubjectView.setText(explain);
11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private CharSequence formatMessage(ConversationHeader ch) {
11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        final int size = android.R.style.TextAppearance_Small;
11572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        final int color = android.R.styleable.Theme_textColorSecondary;
11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        String from = ch.getFrom();
11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (from == null) {
11872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // The temporary text users see while the names of contacts are loading.
11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // TODO: evaluate a better or prettier solution for this?
12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            from = "...";
12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
122b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor
12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SpannableStringBuilder buf = new SpannableStringBuilder(from);
12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (ch.getMessageCount() > 1) {
12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            buf.append(" (" + ch.getMessageCount() + ") ");
12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        int before = buf.length();
13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (ch.hasDraft()) {
13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            buf.append(" ");
13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            buf.append(mContext.getResources().getString(R.string.has_draft));
13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            buf.setSpan(new TextAppearanceSpan(mContext, size, color), before,
13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    buf.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            buf.setSpan(new ForegroundColorSpan(
13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    mContext.getResources().getColor(R.drawable.text_color_red)),
13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    before, buf.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
139b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor
140b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor        // Unread messages are shown in bold
141b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor        if (!ch.isRead()) {
142b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor            buf.setSpan(STYLE_BOLD, 0, buf.length(),
143b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor                    Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
144b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor        }
14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return buf;
14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // Called by another thread that loaded an updated
14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // ConversationHeader for us.  Note, however, that this view
15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // might've been re-used for a different header in the meantime,
15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // so we have to double-check that we still want this header.
15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void onHeaderLoaded(final ConversationHeader newHeader) {
15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        synchronized (mConversationHeaderLock) {
15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            if (mConversationHeader != newHeader) {
15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // The user scrolled away before the item loaded and
15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // this view has been repurposed.
15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return;
15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // TODO: as an optimization, send a message to mHandler instead
16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // of posting a Runnable.
16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mHandler.post(new Runnable() {
16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    public void run() {
16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        synchronized (mConversationHeaderLock) {
16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                            if (mConversationHeader == newHeader) {
16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                mFromView.setText(formatMessage(newHeader));
16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                                setPresenceIcon(newHeader.getPresenceResourceId());
16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                            }
17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                        }
17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    }
17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                });
17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public final void bind(Context context, final ConversationHeader ch) {
17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (DEBUG) Log.v(TAG, "bind()");
17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        ConversationHeader oldHeader = getConversationHeader();
18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        setConversationHeader(ch);
18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
182836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project        LayoutParams attachmentLayout = (LayoutParams)mAttachmentView.getLayoutParams();
18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        boolean hasError = ch.hasError();
18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // When there's an error icon, the attachment icon is left of the error icon.
18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // When there is not an error icon, the attachment icon is left of the date text.
18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // As far as I know, there's no way to specify that relationship in xml.
18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (hasError) {
188836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project            attachmentLayout.addRule(RelativeLayout.LEFT_OF, R.id.error);
18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else {
190836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project            attachmentLayout.addRule(RelativeLayout.LEFT_OF, R.id.date);
19172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
19272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
193836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project        boolean hasAttachment = ch.hasAttachment();
194836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project        mAttachmentView.setVisibility(hasAttachment ? VISIBLE : GONE);
19572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
19672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Date
19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mDateView.setText(ch.getDate());
19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // From.
20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mFromView.setText(formatMessage(ch));
20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // The From above may be incomplete (still loading), so we register ourselves
20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // as a callback later to get woken up in onHeaderLoaded() when it changes.
20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (ch.getFrom() == null) {
20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            ch.setWaitingView(this);
20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Subject
20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSubjectView.setText(ch.getSubject());
210836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project        LayoutParams subjectLayout = (LayoutParams)mSubjectView.getLayoutParams();
211836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project        // We have to make the subject left of whatever optional items are shown on the right.
212836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project        subjectLayout.addRule(RelativeLayout.LEFT_OF, hasAttachment ? R.id.attachment :
213836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project            (hasError ? R.id.error : R.id.date));
21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Transmission error indicator.
21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mErrorIndicator.setVisibility(hasError ? VISIBLE : GONE);
21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
219