ConversationListItem.java revision 6f21719c32796092cb2d07a3d375633a1f3c4c6b
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
206f21719c32796092cb2d07a3d375633a1f3c4c6bTom Taylorimport com.android.mms.LogTag;
2172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.R;
221d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickimport com.android.mms.data.Contact;
231d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickimport com.android.mms.data.ContactList;
24f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylorimport com.android.mms.data.Conversation;
25fe0faf65c654a87d4d5de8d87713364fcf786a3fTom Taylorimport com.android.mms.util.SmileyParser;
2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Context;
2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.graphics.Typeface;
2972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.graphics.drawable.Drawable;
3072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
3172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Handler;
3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.Spannable;
3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.SpannableStringBuilder;
3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.style.ForegroundColorSpan;
35b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylorimport android.text.style.StyleSpan;
3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.style.TextAppearanceSpan;
3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.AttributeSet;
3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log;
3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.View;
40c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylorimport android.widget.Checkable;
41fb465ee4515a8671be60722327e1a34f11cc5631Evan Millarimport android.widget.QuickContactBadge;
4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.RelativeLayout;
4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.TextView;
4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/**
4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * This class manages the view for given conversation.
4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
48c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylorpublic class ConversationListItem extends RelativeLayout implements Contact.UpdateListener,
49c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor            Checkable {
505c692bf6ab8df5145f377a2adb769d085500d91aTom Taylor    private static final String TAG = "ConversationListItem";
5172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final boolean DEBUG = false;
5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private TextView mSubjectView;
5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private TextView mFromView;
5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private TextView mDateView;
5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private View mAttachmentView;
5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private View mErrorIndicator;
58fb465ee4515a8671be60722327e1a34f11cc5631Evan Millar    private QuickContactBadge mAvatarView;
59b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner
60b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner    static private Drawable sDefaultContactImage;
6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // For posting UI update Runnables from other threads:
6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private Handler mHandler = new Handler();
6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
65f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor    private Conversation mConversation;
66b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner
67c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    public static final StyleSpan STYLE_BOLD = new StyleSpan(Typeface.BOLD);
6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
695c692bf6ab8df5145f377a2adb769d085500d91aTom Taylor    public ConversationListItem(Context context) {
7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super(context);
7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
735c692bf6ab8df5145f377a2adb769d085500d91aTom Taylor    public ConversationListItem(Context context, AttributeSet attrs) {
7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super(context, attrs);
75b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner
76b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        if (sDefaultContactImage == null) {
77b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner            sDefaultContactImage = context.getResources().getDrawable(R.drawable.ic_contact_picture);
78b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        }
7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void onFinishInflate() {
8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onFinishInflate();
8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mFromView = (TextView) findViewById(R.id.from);
8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSubjectView = (TextView) findViewById(R.id.subject);
8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mDateView = (TextView) findViewById(R.id.date);
8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mAttachmentView = findViewById(R.id.attachment);
9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mErrorIndicator = findViewById(R.id.error);
91fb465ee4515a8671be60722327e1a34f11cc5631Evan Millar        mAvatarView = (QuickContactBadge) findViewById(R.id.avatar);
9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
94f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor    public Conversation getConversation() {
95f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor        return mConversation;
9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Only used for header binding.
10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void bind(String title, String explain) {
10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mFromView.setText(title);
10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSubjectView.setText(explain);
10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
106f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor    private CharSequence formatMessage() {
10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        final int color = android.R.styleable.Theme_textColorSecondary;
108f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor        String from = mConversation.getRecipients().formatNames(", ");
109b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor
11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SpannableStringBuilder buf = new SpannableStringBuilder(from);
11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
112f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor        if (mConversation.getMessageCount() > 1) {
113a1bc3d0cb872052b52e070ac12da809fee018658Tom Taylor            int before = buf.length();
114a1bc3d0cb872052b52e070ac12da809fee018658Tom Taylor            buf.append(mContext.getResources().getString(R.string.message_count_format,
115a1bc3d0cb872052b52e070ac12da809fee018658Tom Taylor                    mConversation.getMessageCount()));
116a1bc3d0cb872052b52e070ac12da809fee018658Tom Taylor            buf.setSpan(new ForegroundColorSpan(
117a1bc3d0cb872052b52e070ac12da809fee018658Tom Taylor                    mContext.getResources().getColor(R.color.message_count_color)),
118a1bc3d0cb872052b52e070ac12da809fee018658Tom Taylor                    before, buf.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
120f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor        if (mConversation.hasDraft()) {
1213fb271abe0c478d0ea8432830589774182079c86Tom Taylor            buf.append(mContext.getResources().getString(R.string.draft_separator));
1223fb271abe0c478d0ea8432830589774182079c86Tom Taylor            int before = buf.length();
1233fb271abe0c478d0ea8432830589774182079c86Tom Taylor            int size;
12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            buf.append(mContext.getResources().getString(R.string.has_draft));
1253fb271abe0c478d0ea8432830589774182079c86Tom Taylor            size = android.R.style.TextAppearance_Small;
12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            buf.setSpan(new TextAppearanceSpan(mContext, size, color), before,
12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    buf.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            buf.setSpan(new ForegroundColorSpan(
1291e3af2fe548e2eed18c48048b2db54865f879966Peter Ng                    mContext.getResources().getColor(R.drawable.text_color_red)),
13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    before, buf.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
132b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner
133b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor        // Unread messages are shown in bold
134f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor        if (mConversation.hasUnreadMessages()) {
135b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor            buf.setSpan(STYLE_BOLD, 0, buf.length(),
136b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor                    Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
137b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor        }
13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return buf;
13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
141b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner    private void updateAvatarView() {
142b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        Drawable avatarDrawable;
143f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor        if (mConversation.getRecipients().size() == 1) {
144f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor            Contact contact = mConversation.getRecipients().get(0);
145b54460a3af15ca85c2a7b6d5422e9e5eb4592fa8Mark Wagner            avatarDrawable = contact.getAvatar(mContext, sDefaultContactImage);
14678ac273e144aa7c71382e84a581fcc979fbda959Mark Wagner
14778ac273e144aa7c71382e84a581fcc979fbda959Mark Wagner            if (contact.existsInDatabase()) {
14878ac273e144aa7c71382e84a581fcc979fbda959Mark Wagner                mAvatarView.assignContactUri(contact.getUri());
14978ac273e144aa7c71382e84a581fcc979fbda959Mark Wagner            } else {
15078ac273e144aa7c71382e84a581fcc979fbda959Mark Wagner                mAvatarView.assignContactFromPhone(contact.getNumber(), true);
15178ac273e144aa7c71382e84a581fcc979fbda959Mark Wagner            }
152b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        } else {
153b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner            // TODO get a multiple recipients asset (or do something else)
154b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner            avatarDrawable = sDefaultContactImage;
155458cba41f1fd632e12a87d8d43a929b8097f5e6aMark Wagner            mAvatarView.assignContactUri(null);
156b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        }
157b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        mAvatarView.setImageDrawable(avatarDrawable);
158b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        mAvatarView.setVisibility(View.VISIBLE);
159b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner    }
160b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner
1611d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick    private void updateFromView() {
162f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor        mFromView.setText(formatMessage());
163b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        updateAvatarView();
1641d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick    }
16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
1661d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick    public void onUpdate(Contact updated) {
1676f21719c32796092cb2d07a3d375633a1f3c4c6bTom Taylor        if (Log.isLoggable(LogTag.CONTACT, Log.DEBUG)) {
1686f21719c32796092cb2d07a3d375633a1f3c4c6bTom Taylor            Log.v(TAG, "onUpdate: " + this + " contact: " + updated);
1696f21719c32796092cb2d07a3d375633a1f3c4c6bTom Taylor        }
1701d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        mHandler.post(new Runnable() {
1711d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick            public void run() {
1721d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick                updateFromView();
1731d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick            }
1741d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        });
17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
177f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor    public final void bind(Context context, final Conversation conversation) {
178d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huang        //if (DEBUG) Log.v(TAG, "bind()");
17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
180f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor        mConversation = conversation;
18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
182c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor        updateBackground();
18343523adca08d2db019c55d5b611d0755a6788f21Wei Huang
184836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project        LayoutParams attachmentLayout = (LayoutParams)mAttachmentView.getLayoutParams();
185f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor        boolean hasError = conversation.hasError();
18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // When there's an error icon, the attachment icon is left of the error icon.
18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // When there is not an error icon, the attachment icon is left of the date text.
18872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // As far as I know, there's no way to specify that relationship in xml.
18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (hasError) {
190836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project            attachmentLayout.addRule(RelativeLayout.LEFT_OF, R.id.error);
19172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else {
192836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project            attachmentLayout.addRule(RelativeLayout.LEFT_OF, R.id.date);
19372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
19472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
195f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor        boolean hasAttachment = conversation.hasAttachment();
196836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project        mAttachmentView.setVisibility(hasAttachment ? VISIBLE : GONE);
19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Date
199f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor        mDateView.setText(MessageUtils.formatTimeStampString(context, conversation.getDate()));
20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // From.
202f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor        mFromView.setText(formatMessage());
20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2041d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        // Register for updates in changes of any of the contacts in this conversation.
205f9d706cfd0c46a74ba3d79e5543f13a225328d30Tom Taylor        ContactList contacts = conversation.getRecipients();
206d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huang
2076f21719c32796092cb2d07a3d375633a1f3c4c6bTom Taylor        if (Log.isLoggable(LogTag.CONTACT, Log.DEBUG)) {
2086f21719c32796092cb2d07a3d375633a1f3c4c6bTom Taylor            Log.v(TAG, "bind: contacts.addListeners " + this);
2096f21719c32796092cb2d07a3d375633a1f3c4c6bTom Taylor        }
210ea5e915b6104ff0e30c313bcb5a96f838997e57bMark Wagner        Contact.addListener(this);
21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Subject
213fe0faf65c654a87d4d5de8d87713364fcf786a3fTom Taylor        SmileyParser parser = SmileyParser.getInstance();
214fe0faf65c654a87d4d5de8d87713364fcf786a3fTom Taylor        mSubjectView.setText(parser.addSmileySpans(conversation.getSnippet()));
215836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project        LayoutParams subjectLayout = (LayoutParams)mSubjectView.getLayoutParams();
216836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project        // We have to make the subject left of whatever optional items are shown on the right.
217836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project        subjectLayout.addRule(RelativeLayout.LEFT_OF, hasAttachment ? R.id.attachment :
218836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project            (hasError ? R.id.error : R.id.date));
21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Transmission error indicator.
22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mErrorIndicator.setVisibility(hasError ? VISIBLE : GONE);
222b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner
223b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        updateAvatarView();
22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
2251d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick
226c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor    private void updateBackground() {
227c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor        int backgroundId;
228c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor        if (mConversation.isChecked()) {
229c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor            backgroundId = R.drawable.list_selected_holo_light;
230c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor        } else if (mConversation.hasUnreadMessages()) {
231c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor            backgroundId = R.drawable.conversation_item_background_unread;
232c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor        } else {
233c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor            backgroundId = R.drawable.conversation_item_background_read;
234c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor        }
235c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor        Drawable background = mContext.getResources().getDrawable(backgroundId);
236c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor        setBackground(background);
237c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor    }
238c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor
2391d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick    public final void unbind() {
2406f21719c32796092cb2d07a3d375633a1f3c4c6bTom Taylor        if (Log.isLoggable(LogTag.CONTACT, Log.DEBUG)) {
2416f21719c32796092cb2d07a3d375633a1f3c4c6bTom Taylor            Log.v(TAG, "unbind: contacts.removeListeners " + this);
2426f21719c32796092cb2d07a3d375633a1f3c4c6bTom Taylor        }
2431d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        // Unregister contact update callbacks.
244ea5e915b6104ff0e30c313bcb5a96f838997e57bMark Wagner        Contact.removeListener(this);
2451d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick    }
246c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor
247c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor    public void setChecked(boolean checked) {
248c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor        mConversation.setIsChecked(checked);
249c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor        updateBackground();
250c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor    }
251c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor
252c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor    public boolean isChecked() {
253c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor        return mConversation.isChecked();
254c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor    }
255c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor
256c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor    public void toggle() {
257c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor        mConversation.setIsChecked(!mConversation.isChecked());
258c0f139d682d08a6a6f012fc6e7ae7ee451bb6e87Tom Taylor    }
25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
260