1e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton/* 2e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Copyright (C) 2009 The Android Open Source Project 3e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * 4e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Licensed under the Apache License, Version 2.0 (the "License"); 5e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * you may not use this file except in compliance with the License. 6e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * You may obtain a copy of the License at 7e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * 8e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * http://www.apache.org/licenses/LICENSE-2.0 9e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * 10e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Unless required by applicable law or agreed to in writing, software 11e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * distributed under the License is distributed on an "AS IS" BASIS, 12e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * See the License for the specific language governing permissions and 14e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * limitations under the License. 15e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 16e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 17e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonpackage com.android.loaderapp; 18e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 19e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.Manifest; 20e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.AsyncQueryHandler; 21e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.ContentResolver; 22e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.ContentUris; 23e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.ContentValues; 24e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.Context; 25e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.pm.PackageManager; 26e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.pm.PackageManager.NameNotFoundException; 27e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.res.Resources; 28e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.content.res.Resources.NotFoundException; 29e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.database.Cursor; 30e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.graphics.Bitmap; 31e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.graphics.BitmapFactory; 32e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.net.Uri; 33e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.os.SystemClock; 34e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.provider.ContactsContract.Contacts; 35e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.provider.ContactsContract.Data; 36e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.provider.ContactsContract.PhoneLookup; 37e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.provider.ContactsContract.RawContacts; 38e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.provider.ContactsContract.StatusUpdates; 39e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.Email; 40e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.Photo; 41e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.text.TextUtils; 42e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.text.format.DateUtils; 43e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.util.AttributeSet; 44e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.util.Log; 45e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.view.LayoutInflater; 46e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.view.View; 47e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.widget.CheckBox; 48e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.widget.QuickContactBadge; 49e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.widget.FrameLayout; 50e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.widget.ImageView; 51e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonimport android.widget.TextView; 52e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 53e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton/** 54e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Header used across system for displaying a title bar with contact info. You 55e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * can bind specific values on the header, or use helper methods like 56e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * {@link #bindFromContactLookupUri(Uri)} to populate asynchronously. 57e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * <p> 58e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * The parent must request the {@link Manifest.permission#READ_CONTACTS} 59e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * permission to access contact data. 60e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 61e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamiltonpublic class ContactHeaderWidget extends FrameLayout implements View.OnClickListener { 62e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 63e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private static final String TAG = "ContactHeaderWidget"; 64e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 65e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private TextView mDisplayNameView; 66e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private View mAggregateBadge; 67e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private TextView mPhoneticNameView; 68e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private CheckBox mStarredView; 69e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private QuickContactBadge mPhotoView; 70e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private ImageView mPresenceView; 71e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private TextView mStatusView; 72e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private TextView mStatusAttributionView; 73e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private int mNoPhotoResource; 74e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private QueryHandler mQueryHandler; 75e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 76e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton protected Uri mContactUri; 77e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 78e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton protected String[] mExcludeMimes = null; 79e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 80e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton protected ContentResolver mContentResolver; 81e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 82e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 83e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Interface for callbacks invoked when the user interacts with a header. 84e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 85e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public interface ContactHeaderListener { 86e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void onPhotoClick(View view); 87e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void onDisplayNameClick(View view); 88e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 89e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 90e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private ContactHeaderListener mListener; 91e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 92e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 93e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private interface ContactQuery { 94e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton //Projection used for the summary info in the header. 95e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton String[] COLUMNS = new String[] { 96e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Contacts._ID, 97e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Contacts.LOOKUP_KEY, 98e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Contacts.PHOTO_ID, 99e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Contacts.DISPLAY_NAME, 100e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Contacts.PHONETIC_NAME, 101e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Contacts.STARRED, 102e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Contacts.CONTACT_PRESENCE, 103e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Contacts.CONTACT_STATUS, 104e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Contacts.CONTACT_STATUS_TIMESTAMP, 105e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Contacts.CONTACT_STATUS_RES_PACKAGE, 106e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Contacts.CONTACT_STATUS_LABEL, 107e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton }; 108e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton int _ID = 0; 109e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton int LOOKUP_KEY = 1; 110e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton int PHOTO_ID = 2; 111e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton int DISPLAY_NAME = 3; 112e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton int PHONETIC_NAME = 4; 113e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton //TODO: We need to figure out how we're going to get the phonetic name. 114e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton //static final int HEADER_PHONETIC_NAME_COLUMN_INDEX 115e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton int STARRED = 5; 116e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton int CONTACT_PRESENCE_STATUS = 6; 117e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton int CONTACT_STATUS = 7; 118e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton int CONTACT_STATUS_TIMESTAMP = 8; 119e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton int CONTACT_STATUS_RES_PACKAGE = 9; 120e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton int CONTACT_STATUS_LABEL = 10; 121e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 122e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 123e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private interface PhotoQuery { 124e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton String[] COLUMNS = new String[] { 125e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Photo.PHOTO 126e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton }; 127e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 128e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton int PHOTO = 0; 129e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 130e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 131e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton //Projection used for looking up contact id from phone number 132e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton protected static final String[] PHONE_LOOKUP_PROJECTION = new String[] { 133e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton PhoneLookup._ID, 134e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton PhoneLookup.LOOKUP_KEY, 135e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton }; 136e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton protected static final int PHONE_LOOKUP_CONTACT_ID_COLUMN_INDEX = 0; 137e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton protected static final int PHONE_LOOKUP_CONTACT_LOOKUP_KEY_COLUMN_INDEX = 1; 138e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 139e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton //Projection used for looking up contact id from email address 140e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton protected static final String[] EMAIL_LOOKUP_PROJECTION = new String[] { 141e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton RawContacts.CONTACT_ID, 142e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Contacts.LOOKUP_KEY, 143e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton }; 144e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton protected static final int EMAIL_LOOKUP_CONTACT_ID_COLUMN_INDEX = 0; 145e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton protected static final int EMAIL_LOOKUP_CONTACT_LOOKUP_KEY_COLUMN_INDEX = 1; 146e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 147e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton protected static final String[] CONTACT_LOOKUP_PROJECTION = new String[] { 148e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Contacts._ID, 149e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton }; 150e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton protected static final int CONTACT_LOOKUP_ID_COLUMN_INDEX = 0; 151e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 152e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private static final int TOKEN_CONTACT_INFO = 0; 153e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private static final int TOKEN_PHONE_LOOKUP = 1; 154e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private static final int TOKEN_EMAIL_LOOKUP = 2; 155e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private static final int TOKEN_PHOTO_QUERY = 3; 156e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 157e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public ContactHeaderWidget(Context context) { 158e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton this(context, null); 159e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 160e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 161e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public ContactHeaderWidget(Context context, AttributeSet attrs) { 162e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton this(context, attrs, 0); 163e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 164e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 165e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public ContactHeaderWidget(Context context, AttributeSet attrs, int defStyle) { 166e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton super(context, attrs, defStyle); 167e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 168e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mContentResolver = mContext.getContentResolver(); 169e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 170e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton LayoutInflater inflater = 171e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 172e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton inflater.inflate(R.layout.contact_header, this); 173e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 174e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mDisplayNameView = (TextView) findViewById(R.id.name); 175e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 176e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mPhoneticNameView = (TextView) findViewById(R.id.phonetic_name); 177e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 178e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mPhotoView = (QuickContactBadge) findViewById(R.id.photo); 179e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 180e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mPresenceView = (ImageView) findViewById(R.id.presence); 181e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 182e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mStatusView = (TextView)findViewById(R.id.status); 183e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mStatusAttributionView = (TextView)findViewById(R.id.status_date); 184e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 185e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton // Set the photo with a random "no contact" image 186e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton long now = SystemClock.elapsedRealtime(); 187e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton int num = (int) now & 0xf; 188e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (num < 9) { 189e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton // Leaning in from right, common 190e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mNoPhotoResource = R.drawable.ic_contact_picture; 191e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } else if (num < 14) { 192e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton // Leaning in from left uncommon 193e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mNoPhotoResource = R.drawable.ic_contact_picture_2; 194e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } else { 195e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton // Coming in from the top, rare 196e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mNoPhotoResource = R.drawable.ic_contact_picture_3; 197e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 198e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 199e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton resetAsyncQueryHandler(); 200e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 201e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 202e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void enableClickListeners() { 203e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mDisplayNameView.setOnClickListener(this); 204e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mPhotoView.setOnClickListener(this); 205e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 206e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 207e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 208e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Set the given {@link ContactHeaderListener} to handle header events. 209e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 210e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void setContactHeaderListener(ContactHeaderListener listener) { 211e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mListener = listener; 212e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 213e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 214e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private void performPhotoClick() { 215e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (mListener != null) { 216e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mListener.onPhotoClick(mPhotoView); 217e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 218e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 219e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 220e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private void performDisplayNameClick() { 221e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (mListener != null) { 222e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mListener.onDisplayNameClick(mDisplayNameView); 223e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 224e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 225e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 226e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private class QueryHandler extends AsyncQueryHandler { 227e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 228e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public QueryHandler(ContentResolver cr) { 229e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton super(cr); 230e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 231e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 232e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton @Override 233e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 234e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton try{ 235e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (this != mQueryHandler) { 236e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Log.d(TAG, "onQueryComplete: discard result, the query handler is reset!"); 237e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton return; 238e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 239e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 240e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton switch (token) { 241e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton case TOKEN_PHOTO_QUERY: { 242e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton //Set the photo 243e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Bitmap photoBitmap = null; 244e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (cursor != null && cursor.moveToFirst() 245e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton && !cursor.isNull(PhotoQuery.PHOTO)) { 246e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton byte[] photoData = cursor.getBlob(PhotoQuery.PHOTO); 247e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton photoBitmap = BitmapFactory.decodeByteArray(photoData, 0, 248e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton photoData.length, null); 249e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 250e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 251e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (photoBitmap == null) { 252e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton photoBitmap = loadPlaceholderPhoto(null); 253e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 254e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setPhoto(photoBitmap); 255e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (cookie != null && cookie instanceof Uri) { 256e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mPhotoView.assignContactUri((Uri) cookie); 257e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 258e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton invalidate(); 259e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton break; 260e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 261e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton case TOKEN_CONTACT_INFO: { 262e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (cursor != null && cursor.moveToFirst()) { 263e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton bindContactInfo(cursor); 264e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton final Uri lookupUri = Contacts.getLookupUri( 265e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton cursor.getLong(ContactQuery._ID), 266e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton cursor.getString(ContactQuery.LOOKUP_KEY)); 267e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 268e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton final long photoId = cursor.getLong(ContactQuery.PHOTO_ID); 269e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 270e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setPhotoId(photoId, lookupUri); 271e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } else { 272e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton // shouldn't really happen 273e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setDisplayName(null, null); 274e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setSocialSnippet(null); 275e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setPhoto(loadPlaceholderPhoto(null)); 276e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 277e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton break; 278e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 279e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton case TOKEN_PHONE_LOOKUP: { 280e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (cursor != null && cursor.moveToFirst()) { 281e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton long contactId = cursor.getLong(PHONE_LOOKUP_CONTACT_ID_COLUMN_INDEX); 282e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton String lookupKey = cursor.getString( 283e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton PHONE_LOOKUP_CONTACT_LOOKUP_KEY_COLUMN_INDEX); 284e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton bindFromContactUriInternal(Contacts.getLookupUri(contactId, lookupKey), 285e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton false /* don't reset query handler */); 286e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } else { 287e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton String phoneNumber = (String) cookie; 288e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setDisplayName(phoneNumber, null); 289e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setSocialSnippet(null); 290e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setPhoto(loadPlaceholderPhoto(null)); 291e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mPhotoView.assignContactFromPhone(phoneNumber, true); 292e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 293e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton break; 294e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 295e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton case TOKEN_EMAIL_LOOKUP: { 296e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (cursor != null && cursor.moveToFirst()) { 297e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton long contactId = cursor.getLong(EMAIL_LOOKUP_CONTACT_ID_COLUMN_INDEX); 298e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton String lookupKey = cursor.getString( 299e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton EMAIL_LOOKUP_CONTACT_LOOKUP_KEY_COLUMN_INDEX); 300e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton bindFromContactUriInternal(Contacts.getLookupUri(contactId, lookupKey), 301e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton false /* don't reset query handler */); 302e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } else { 303e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton String emailAddress = (String) cookie; 304e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setDisplayName(emailAddress, null); 305e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setSocialSnippet(null); 306e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setPhoto(loadPlaceholderPhoto(null)); 307e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mPhotoView.assignContactFromEmail(emailAddress, true); 308e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 309e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton break; 310e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 311e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 312e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } finally { 313e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (cursor != null) { 314e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton cursor.close(); 315e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 316e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 317e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 318e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 319e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 320e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 321e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Manually set the presence. 322e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 323e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void setPresence(int presence) { 324e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mPresenceView.setImageResource(StatusUpdates.getPresenceIconResourceId(presence)); 325e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 326e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 327e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 328e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Manually set the presence. If presence is null, it is hidden. 329e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * This doesn't change the underlying {@link Contacts} value, only the UI state. 330e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @hide 331e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 332e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void setPresence(Integer presence) { 333e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (presence == null) { 334e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton showPresence(false); 335e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } else { 336e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton showPresence(true); 337e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setPresence(presence.intValue()); 338e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 339e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 340e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 341e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 342e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Turn on/off showing the presence. 343e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @hide this is here for consistency with setStared/showStar and should be public 344e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 345e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void showPresence(boolean showPresence) { 346e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mPresenceView.setVisibility(showPresence ? View.VISIBLE : View.GONE); 347e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 348e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 349e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 350e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Manually set the contact uri without loading any data 351e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 352e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void setContactUri(Uri uri) { 353e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setContactUri(uri, true); 354e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 355e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 356e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 357e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Manually set the contact uri without loading any data 358e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 359e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void setContactUri(Uri uri, boolean sendToQuickContact) { 360e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mContactUri = uri; 361e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (sendToQuickContact) { 362e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mPhotoView.assignContactUri(uri); 363e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 364e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 365e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 366e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 367e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Manually set the photo to display in the header. This doesn't change the 368e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * underlying {@link Contacts}, only the UI state. 369e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 370e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void setPhoto(Bitmap bitmap) { 371e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mPhotoView.setImageBitmap(bitmap); 372e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 373e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 374e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 375e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Manually set the photo given its id. If the id is 0, a placeholder picture will 376e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * be loaded. For any other Id, an async query is started 377e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @hide 378e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 379e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void setPhotoId(final long photoId, final Uri lookupUri) { 380e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (photoId == 0) { 381e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setPhoto(loadPlaceholderPhoto(null)); 382e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mPhotoView.assignContactUri(lookupUri); 383e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton invalidate(); 384e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } else { 385e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton startPhotoQuery(photoId, lookupUri, 386e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton false /* don't reset query handler */); 387e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 388e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 389e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 390e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 391e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Manually set the display name and phonetic name to show in the header. 392e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * This doesn't change the underlying {@link Contacts}, only the UI state. 393e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 394e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void setDisplayName(CharSequence displayName, CharSequence phoneticName) { 395e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mDisplayNameView.setText(displayName); 396e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (!TextUtils.isEmpty(phoneticName)) { 397e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mPhoneticNameView.setText(phoneticName); 398e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mPhoneticNameView.setVisibility(View.VISIBLE); 399e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } else { 400e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mPhoneticNameView.setVisibility(View.GONE); 401e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 402e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 403e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 404e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 405e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Manually set the social snippet text to display in the header. This doesn't change the 406e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * underlying {@link Contacts}, only the UI state. 407e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 408e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void setSocialSnippet(CharSequence snippet) { 409e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (snippet == null) { 410e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mStatusView.setVisibility(View.GONE); 411e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mStatusAttributionView.setVisibility(View.GONE); 412e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } else { 413e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mStatusView.setText(snippet); 414e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mStatusView.setVisibility(View.VISIBLE); 415e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 416e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 417e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 418e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 419e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Manually set the status attribution text to display in the header. 420e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * This doesn't change the underlying {@link Contacts}, only the UI state. 421e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @hide 422e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 423e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void setStatusAttribution(CharSequence attribution) { 424e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (attribution != null) { 425e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mStatusAttributionView.setText(attribution); 426e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mStatusAttributionView.setVisibility(View.VISIBLE); 427e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } else { 428e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mStatusAttributionView.setVisibility(View.GONE); 429e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 430e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 431e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 432e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 433e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Set a list of specific MIME-types to exclude and not display. For 434e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * example, this can be used to hide the {@link Contacts#CONTENT_ITEM_TYPE} 435e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * profile icon. 436e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 437e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void setExcludeMimes(String[] excludeMimes) { 438e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mExcludeMimes = excludeMimes; 439e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mPhotoView.setExcludeMimes(excludeMimes); 440e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 441e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 442e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 443e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Manually set all the status values to display in the header. 444e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * This doesn't change the underlying {@link Contacts}, only the UI state. 445e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @hide 446e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @param status The status of the contact. If this is either null or empty, 447e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * the status is cleared and the other parameters are ignored. 448e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @param statusTimestamp The timestamp (retrieved via a call to 449e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * {@link System#currentTimeMillis()}) of the last status update. 450e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * This value can be null if it is not known. 451e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @param statusLabel The id of a resource string that specifies the current 452e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * status. This value can be null if no Label should be used. 453e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @param statusResPackage The name of the resource package containing the resource string 454e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * referenced in the parameter statusLabel. 455e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 456e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void setStatus(final String status, final Long statusTimestamp, 457e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton final Integer statusLabel, final String statusResPackage) { 458e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (TextUtils.isEmpty(status)) { 459e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setSocialSnippet(null); 460e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton return; 461e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 462e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 463e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setSocialSnippet(status); 464e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 465e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton final CharSequence timestampDisplayValue; 466e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 467e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (statusTimestamp != null) { 468e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton // Set the date/time field by mixing relative and absolute 469e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton // times. 470e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton int flags = DateUtils.FORMAT_ABBREV_RELATIVE; 471e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 472e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton timestampDisplayValue = DateUtils.getRelativeTimeSpanString( 473e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton statusTimestamp.longValue(), System.currentTimeMillis(), 474e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton DateUtils.MINUTE_IN_MILLIS, flags); 475e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } else { 476e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton timestampDisplayValue = null; 477e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 478e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 479e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 480e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton String labelDisplayValue = null; 481e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 482e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (statusLabel != null) { 483e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Resources resources; 484e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (TextUtils.isEmpty(statusResPackage)) { 485e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton resources = getResources(); 486e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } else { 487e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton PackageManager pm = getContext().getPackageManager(); 488e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton try { 489e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton resources = pm.getResourcesForApplication(statusResPackage); 490e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } catch (NameNotFoundException e) { 491e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Log.w(TAG, "Contact status update resource package not found: " 492e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton + statusResPackage); 493e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton resources = null; 494e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 495e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 496e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 497e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (resources != null) { 498e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton try { 499e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton labelDisplayValue = resources.getString(statusLabel.intValue()); 500e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } catch (NotFoundException e) { 501e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Log.w(TAG, "Contact status update resource not found: " + statusResPackage + "@" 502e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton + statusLabel.intValue()); 503e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 504e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 505e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 506e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 507e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton final CharSequence attribution; 508e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (timestampDisplayValue != null && labelDisplayValue != null) { 509e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton attribution = getContext().getString( 510e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton R.string.contact_status_update_attribution_with_date, 511e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton timestampDisplayValue, labelDisplayValue); 512e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } else if (timestampDisplayValue == null && labelDisplayValue != null) { 513e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton attribution = getContext().getString( 514e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton R.string.contact_status_update_attribution, 515e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton labelDisplayValue); 516e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } else if (timestampDisplayValue != null) { 517e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton attribution = timestampDisplayValue; 518e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } else { 519e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton attribution = null; 520e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 521e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setStatusAttribution(attribution); 522e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 523e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 524e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 525e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Convenience method for binding all available data from an existing 526e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * contact. 527e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * 528e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @param contactLookupUri a {Contacts.CONTENT_LOOKUP_URI} style URI. 529e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 530e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void bindFromContactLookupUri(Uri contactLookupUri) { 531e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton bindFromContactUriInternal(contactLookupUri, true /* reset query handler */); 532e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 533e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 534e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 535e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Convenience method for binding all available data from an existing 536e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * contact. 537e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * 538e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @param contactUri a {Contacts.CONTENT_URI} style URI. 539e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @param resetQueryHandler whether to use a new AsyncQueryHandler or not. 540e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 541e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private void bindFromContactUriInternal(Uri contactUri, boolean resetQueryHandler) { 542e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mContactUri = contactUri; 543e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton startContactQuery(contactUri, resetQueryHandler); 544e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 545e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 546e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 547e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Convenience method for binding all available data from an existing 548e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * contact. 549e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * 550e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @param emailAddress The email address used to do a reverse lookup in 551e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * the contacts database. If more than one contact contains this email 552e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * address, one of them will be chosen to bind to. 553e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 554e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void bindFromEmail(String emailAddress) { 555e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton resetAsyncQueryHandler(); 556e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 557e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mQueryHandler.startQuery(TOKEN_EMAIL_LOOKUP, emailAddress, 558e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(emailAddress)), 559e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton EMAIL_LOOKUP_PROJECTION, null, null, null); 560e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 561e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 562e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 563e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Convenience method for binding all available data from an existing 564e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * contact. 565e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * 566e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @param number The phone number used to do a reverse lookup in 567e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * the contacts database. If more than one contact contains this phone 568e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * number, one of them will be chosen to bind to. 569e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 570e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void bindFromPhoneNumber(String number) { 571e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton resetAsyncQueryHandler(); 572e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 573e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP, number, 574e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)), 575e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton PHONE_LOOKUP_PROJECTION, null, null, null); 576e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 577e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 578e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 579e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * startContactQuery 580e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * 581e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * internal method to query contact by Uri. 582e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * 583e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @param contactUri the contact uri 584e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @param resetQueryHandler whether to use a new AsyncQueryHandler or not 585e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 586e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private void startContactQuery(Uri contactUri, boolean resetQueryHandler) { 587e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (resetQueryHandler) { 588e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton resetAsyncQueryHandler(); 589e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 590e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 591e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mQueryHandler.startQuery(TOKEN_CONTACT_INFO, contactUri, contactUri, ContactQuery.COLUMNS, 592e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton null, null, null); 593e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 594e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 595e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 596e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * startPhotoQuery 597e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * 598e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * internal method to query contact photo by photo id and uri. 599e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * 600e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @param photoId the photo id. 601e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @param lookupKey the lookup uri. 602e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * @param resetQueryHandler whether to use a new AsyncQueryHandler or not. 603e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 604e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton protected void startPhotoQuery(long photoId, Uri lookupKey, boolean resetQueryHandler) { 605e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (resetQueryHandler) { 606e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton resetAsyncQueryHandler(); 607e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 608e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 609e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mQueryHandler.startQuery(TOKEN_PHOTO_QUERY, lookupKey, 610e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton ContentUris.withAppendedId(Data.CONTENT_URI, photoId), PhotoQuery.COLUMNS, 611e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton null, null, null); 612e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 613e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 614e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 615e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Method to force this widget to forget everything it knows about the contact. 616e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * We need to stop any existing async queries for phone, email, contact, and photos. 617e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 618e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void wipeClean() { 619e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton resetAsyncQueryHandler(); 620e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 621e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setDisplayName(null, null); 622e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setPhoto(loadPlaceholderPhoto(null)); 623e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setSocialSnippet(null); 624e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setPresence(0); 625e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mContactUri = null; 626e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mExcludeMimes = null; 627e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 628e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 629e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 630e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private void resetAsyncQueryHandler() { 631e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton // the api AsyncQueryHandler.cancelOperation() doesn't really work. Since we really 632e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton // need the old async queries to be cancelled, let's do it the hard way. 633e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mQueryHandler = new QueryHandler(mContentResolver); 634e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 635e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 636e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton /** 637e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton * Bind the contact details provided by the given {@link Cursor}. 638e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton */ 639e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton protected void bindContactInfo(Cursor c) { 640e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton final String displayName = c.getString(ContactQuery.DISPLAY_NAME); 641e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton final String phoneticName = c.getString(ContactQuery.PHONETIC_NAME); 642e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton this.setDisplayName(displayName, phoneticName); 643e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 644e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton //Set the presence status 645e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (!c.isNull(ContactQuery.CONTACT_PRESENCE_STATUS)) { 646e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton int presence = c.getInt(ContactQuery.CONTACT_PRESENCE_STATUS); 647e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setPresence(presence); 648e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton showPresence(true); 649e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } else { 650e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton showPresence(false); 651e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 652e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 653e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton //Set the status update 654e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton final String status = c.getString(ContactQuery.CONTACT_STATUS); 655e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton final Long statusTimestamp = c.isNull(ContactQuery.CONTACT_STATUS_TIMESTAMP) 656e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton ? null 657e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton : c.getLong(ContactQuery.CONTACT_STATUS_TIMESTAMP); 658e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton final Integer statusLabel = c.isNull(ContactQuery.CONTACT_STATUS_LABEL) 659e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton ? null 660e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton : c.getInt(ContactQuery.CONTACT_STATUS_LABEL); 661e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton final String statusResPackage = c.getString(ContactQuery.CONTACT_STATUS_RES_PACKAGE); 662e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 663e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton setStatus(status, statusTimestamp, statusLabel, statusResPackage); 664e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 665e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 666e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton public void onClick(View view) { 667e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton switch (view.getId()) { 668e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton case R.id.photo: { 669e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton performPhotoClick(); 670e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton break; 671e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 672e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton case R.id.name: { 673e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton performDisplayNameClick(); 674e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton break; 675e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 676e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 677e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 678e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton 679e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton private Bitmap loadPlaceholderPhoto(BitmapFactory.Options options) { 680e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton if (mNoPhotoResource == 0) { 681e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton return null; 682e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 683e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton return BitmapFactory.decodeResource(mContext.getResources(), 684e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton mNoPhotoResource, options); 685e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton } 686e87bd517767784bb40f1fac51309fee5b829b00eJeff Hamilton} 687