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