ConversationListItem.java revision d9d7479a8c9e10b7b3f39137e28ed0f283e4a257
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
201d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickimport java.util.List;
211d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick
2272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.R;
231d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickimport com.android.mms.data.Contact;
241d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickimport com.android.mms.data.ContactList;
2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2616e40177467f2af99ac1c6ecac48c7f41701cce7Mark Wagnerimport android.content.ActivityNotFoundException;
2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Context;
28a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagnerimport android.content.Intent;
29a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagnerimport android.graphics.Rect;
3072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.graphics.Typeface;
3172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.graphics.drawable.Drawable;
3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Handler;
34a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagnerimport android.provider.ContactsContract.Intents;
3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.Spannable;
3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.SpannableStringBuilder;
3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.style.ForegroundColorSpan;
38b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylorimport android.text.style.StyleSpan;
3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.text.style.TextAppearanceSpan;
4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.AttributeSet;
4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log;
4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.View;
4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.view.Window;
4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.ImageView;
4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.RelativeLayout;
4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.TextView;
4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/**
4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * This class manages the view for given conversation.
5072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
511d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrickpublic class ConversationHeaderView extends RelativeLayout implements Contact.UpdateListener {
5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final String TAG = "ConversationHeaderView";
5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private static final boolean DEBUG = false;
5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private TextView mSubjectView;
5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private TextView mFromView;
5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private TextView mDateView;
5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private View mAttachmentView;
5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private View mErrorIndicator;
6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private ImageView mPresenceView;
61b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner    private ImageView mAvatarView;
62b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner
63b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner    static private Drawable sDefaultContactImage;
6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    // For posting UI update Runnables from other threads:
6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private Handler mHandler = new Handler();
6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private ConversationHeader mConversationHeader;
69b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner
70b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor    private static final StyleSpan STYLE_BOLD = new StyleSpan(Typeface.BOLD);
7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public ConversationHeaderView(Context context) {
7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super(context);
7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public ConversationHeaderView(Context context, AttributeSet attrs) {
7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super(context, attrs);
78b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner
79b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        if (sDefaultContactImage == null) {
80b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner            sDefaultContactImage = context.getResources().getDrawable(R.drawable.ic_contact_picture);
81b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        }
8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    protected void onFinishInflate() {
8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onFinishInflate();
8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mFromView = (TextView) findViewById(R.id.from);
8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSubjectView = (TextView) findViewById(R.id.subject);
9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mDateView = (TextView) findViewById(R.id.date);
9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mAttachmentView = findViewById(R.id.attachment);
9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mErrorIndicator = findViewById(R.id.error);
9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mPresenceView = (ImageView) findViewById(R.id.presence);
95b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        mAvatarView = (ImageView) findViewById(R.id.avatar);
96a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner
97a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner        mAvatarView.setOnClickListener(new OnClickListener() {
98a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner            private Rect getTargetRect(View anchor) {
99a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner                final int[] location = new int[2];
100a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner                anchor.getLocationOnScreen(location);
101a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner
102a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner                final Rect rect = new Rect();
103a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner                rect.left = location[0];
104a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner                rect.top = location[1];
105a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner                rect.right = rect.left + anchor.getWidth();
106a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner                rect.bottom = rect.top + anchor.getHeight();
107a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner                return rect;
108a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner            }
109a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner
110a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner           public void onClick(View v) {
111a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner                // Photo launches contact detail action
112a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner                ContactList list = mConversationHeader.getContacts();
113a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner                if (list.size() != 1) {
114a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner                    return;
115a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner                }
116a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner
117a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner                final Intent intent = new Intent(Intents.SHOW_OR_CREATE_CONTACT, list.get(0).getUri());
118a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner                final Rect target = getTargetRect(ConversationHeaderView.this);
119a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner                intent.putExtra(Intents.EXTRA_TARGET_RECT, target);
120a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner                intent.putExtra(Intents.EXTRA_MODE, Intents.MODE_SMALL);
12116e40177467f2af99ac1c6ecac48c7f41701cce7Mark Wagner                try {
12216e40177467f2af99ac1c6ecac48c7f41701cce7Mark Wagner                    mContext.startActivity(intent);
12316e40177467f2af99ac1c6ecac48c7f41701cce7Mark Wagner                } catch (ActivityNotFoundException ex) {
12416e40177467f2af99ac1c6ecac48c7f41701cce7Mark Wagner                    // ignore
12516e40177467f2af99ac1c6ecac48c7f41701cce7Mark Wagner                }
126a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner            }
127a1e4905939ef884ce011f1eb317d25fbc8908daeMark Wagner        });
12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setPresenceIcon(int iconId) {
13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (iconId == 0) {
132b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner            mPresenceView.setVisibility(View.GONE);
13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else {
13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mPresenceView.setImageResource(iconId);
13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            mPresenceView.setVisibility(View.VISIBLE);
13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public ConversationHeader getConversationHeader() {
1401d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        return mConversationHeader;
14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private void setConversationHeader(ConversationHeader header) {
1441d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        mConversationHeader = header;
14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /**
14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Only used for header binding.
14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void bind(String title, String explain) {
15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mFromView.setText(title);
15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSubjectView.setText(explain);
15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    private CharSequence formatMessage(ConversationHeader ch) {
15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        final int size = android.R.style.TextAppearance_Small;
15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        final int color = android.R.styleable.Theme_textColorSecondary;
15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        String from = ch.getFrom();
159b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor
16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        SpannableStringBuilder buf = new SpannableStringBuilder(from);
16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (ch.getMessageCount() > 1) {
16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            buf.append(" (" + ch.getMessageCount() + ") ");
16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        int before = buf.length();
16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (ch.hasDraft()) {
16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            buf.append(" ");
16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            buf.append(mContext.getResources().getString(R.string.has_draft));
17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            buf.setSpan(new TextAppearanceSpan(mContext, size, color), before,
17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    buf.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            buf.setSpan(new ForegroundColorSpan(
17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    mContext.getResources().getColor(R.drawable.text_color_red)),
17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                    before, buf.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
176b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner
177b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor        // Unread messages are shown in bold
178b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor        if (!ch.isRead()) {
179b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor            buf.setSpan(STYLE_BOLD, 0, buf.length(),
180b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor                    Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
181b8cadac68b0e449a7b2139fe3a0a4352873bcee5Tom Taylor        }
18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return buf;
18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
185b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner    private void updateAvatarView() {
186b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        ConversationHeader ch = mConversationHeader;
187b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner
188b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        Drawable avatarDrawable;
189b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        if (ch.getContacts().size() == 1) {
190b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner            avatarDrawable = ch.getContacts().get(0).getAvatar(sDefaultContactImage);
191b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        } else {
192b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner            // TODO get a multiple recipients asset (or do something else)
193b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner            avatarDrawable = sDefaultContactImage;
194b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        }
195b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        mAvatarView.setImageDrawable(avatarDrawable);
196b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        mAvatarView.setVisibility(View.VISIBLE);
197b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner    }
198b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner
1991d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick    private void updateFromView() {
2001d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        ConversationHeader ch = mConversationHeader;
2011d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        ch.updateRecipients();
2021d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        mFromView.setText(formatMessage(ch));
2031d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        setPresenceIcon(ch.getContacts().getPresenceResId());
204b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        updateAvatarView();
2051d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick    }
20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2071d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick    public void onUpdate(Contact updated) {
2081d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        mHandler.post(new Runnable() {
2091d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick            public void run() {
2101d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick                updateFromView();
2111d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick            }
2121d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        });
21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public final void bind(Context context, final ConversationHeader ch) {
216d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huang        //if (DEBUG) Log.v(TAG, "bind()");
21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        setConversationHeader(ch);
21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
220836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project        LayoutParams attachmentLayout = (LayoutParams)mAttachmentView.getLayoutParams();
22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        boolean hasError = ch.hasError();
22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // When there's an error icon, the attachment icon is left of the error icon.
22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // When there is not an error icon, the attachment icon is left of the date text.
22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // As far as I know, there's no way to specify that relationship in xml.
22572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (hasError) {
226836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project            attachmentLayout.addRule(RelativeLayout.LEFT_OF, R.id.error);
22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else {
228836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project            attachmentLayout.addRule(RelativeLayout.LEFT_OF, R.id.date);
22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
231836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project        boolean hasAttachment = ch.hasAttachment();
232836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project        mAttachmentView.setVisibility(hasAttachment ? VISIBLE : GONE);
23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Date
23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mDateView.setText(ch.getDate());
23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // From.
23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mFromView.setText(formatMessage(ch));
23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2401d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        // Register for updates in changes of any of the contacts in this conversation.
2411d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        ContactList contacts = ch.getContacts();
242d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huang
243d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huang        if (DEBUG) Log.v(TAG, "bind: contacts.addListeners " + this);
2441d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        contacts.addListeners(this);
2451d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        setPresenceIcon(contacts.getPresenceResId());
24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Subject
24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSubjectView.setText(ch.getSubject());
249836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project        LayoutParams subjectLayout = (LayoutParams)mSubjectView.getLayoutParams();
250836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project        // We have to make the subject left of whatever optional items are shown on the right.
251836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project        subjectLayout.addRule(RelativeLayout.LEFT_OF, hasAttachment ? R.id.attachment :
252836945de572ac80fd6f6a7bf59036d4cce801410The Android Open Source Project            (hasError ? R.id.error : R.id.date));
25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Transmission error indicator.
25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mErrorIndicator.setVisibility(hasError ? VISIBLE : GONE);
256b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner
257b3bbd22cf834a92780cdcb75f6473009d73412eaMark Wagner        updateAvatarView();
25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
2591d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick
2601d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick    public final void unbind() {
261d9d7479a8c9e10b7b3f39137e28ed0f283e4a257Wei Huang        if (DEBUG) Log.v(TAG, "unbind: contacts.removeListeners " + this);
2621d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        // Unregister contact update callbacks.
2631d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        mConversationHeader.getContacts().removeListeners(this);
2641d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick    }
26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
266