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