1b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro/* 2b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro * Copyright (C) 2011 The Android Open Source Project 3b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro * 4b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro * Licensed under the Apache License, Version 2.0 (the "License"); 5b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro * you may not use this file except in compliance with the License. 6b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro * You may obtain a copy of the License at 7b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro * 8b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro * http://www.apache.org/licenses/LICENSE-2.0 9b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro * 10b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro * Unless required by applicable law or agreed to in writing, software 11b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro * distributed under the License is distributed on an "AS IS" BASIS, 12b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro * See the License for the specific language governing permissions and 14b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro * limitations under the License. 15b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro */ 16b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaropackage com.android.contacts.list; 17b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro 18b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaroimport android.content.Context; 194e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargusimport android.graphics.Rect; 20b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaroimport android.net.Uri; 21b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaroimport android.util.AttributeSet; 22b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaroimport android.util.Log; 23c569acf64701828c84271a81836dfd1a404dba03Frank Sposaroimport android.view.View; 24c56a413e08d907858f848ebbdd8f57290a20f44eFrank Sposaroimport android.widget.FrameLayout; 25b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaroimport android.widget.ImageView; 269e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaroimport android.widget.QuickContactBadge; 27b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaroimport android.widget.TextView; 28b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro 29e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.ContactPhotoManager; 30e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.ContactsUtils; 31e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.R; 32e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.list.ContactTileAdapter.ContactEntry; 33e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng 34c56a413e08d907858f848ebbdd8f57290a20f44eFrank Sposaro/** 352f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann * A ContactTile displays a contact's picture and name 36b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro */ 372f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmannpublic abstract class ContactTileView extends FrameLayout { 38eec538e5a1cacb96b7cd4309efaa5ddb0baac6faFrank Sposaro private final static String TAG = ContactTileView.class.getSimpleName(); 39b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro 40b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro private Uri mLookupUri; 41b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro private ImageView mPhoto; 429e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaro private QuickContactBadge mQuickContact; 43b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro private TextView mName; 44595d6ea70e5d557b78b5e9f13019f2c4cef99f0eFrank Sposaro private TextView mStatus; 4592cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro private TextView mPhoneLabel; 4692cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro private TextView mPhoneNumber; 47c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro private ContactPhotoManager mPhotoManager = null; 48afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro private View mPushState; 49257cec1e445c338eb86f82cb9be5a2fb37edbb8dFrank Sposaro private View mHorizontalDivider; 504e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus protected Listener mListener; 51b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro 52b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro public ContactTileView(Context context, AttributeSet attrs) { 53b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro super(context, attrs); 54b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro } 55b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro 56b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro @Override 57b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro protected void onFinishInflate() { 58b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro super.onFinishInflate(); 59b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro mName = (TextView) findViewById(R.id.contact_tile_name); 609e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaro 619e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaro mQuickContact = (QuickContactBadge) findViewById(R.id.contact_tile_quick); 62b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro mPhoto = (ImageView) findViewById(R.id.contact_tile_image); 63595d6ea70e5d557b78b5e9f13019f2c4cef99f0eFrank Sposaro mStatus = (TextView) findViewById(R.id.contact_tile_status); 6492cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro mPhoneLabel = (TextView) findViewById(R.id.contact_tile_phone_type); 6592cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro mPhoneNumber = (TextView) findViewById(R.id.contact_tile_phone_number); 66afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro mPushState = findViewById(R.id.contact_tile_push_state); 67257cec1e445c338eb86f82cb9be5a2fb37edbb8dFrank Sposaro mHorizontalDivider = findViewById(R.id.contact_tile_horizontal_divider); 689994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro 694e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus OnClickListener listener = createClickListener(); 709994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro 719994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro if(mPushState != null) { 729994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro mPushState.setOnClickListener(listener); 739994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro } else { 749994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro setOnClickListener(listener); 759994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro } 76b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro } 77b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro 784e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus protected OnClickListener createClickListener() { 794e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus return new OnClickListener() { 804e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus @Override 814e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus public void onClick(View v) { 824e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus if (mListener == null) return; 834e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus mListener.onContactSelected( 844e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus getLookupUri(), 854e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus ContactsUtils.getTargetRectFromView(mContext, ContactTileView.this)); 864e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus } 874e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus }; 884e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus } 894e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus 90c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro public void setPhotoManager(ContactPhotoManager photoManager) { 91c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro mPhotoManager = photoManager; 92c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro } 93c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro 94eec538e5a1cacb96b7cd4309efaa5ddb0baac6faFrank Sposaro /** 95eec538e5a1cacb96b7cd4309efaa5ddb0baac6faFrank Sposaro * Populates the data members to be displayed from the 96eec538e5a1cacb96b7cd4309efaa5ddb0baac6faFrank Sposaro * fields in {@link ContactEntry} 97eec538e5a1cacb96b7cd4309efaa5ddb0baac6faFrank Sposaro */ 98c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro public void loadFromContact(ContactEntry entry) { 993d5c5de0b376aa9c4e5c60eeb0b81118217eb361Frank Sposaro 100b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro if (entry != null) { 101b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro mName.setText(entry.name); 102b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro mLookupUri = entry.lookupKey; 1039e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaro 104595d6ea70e5d557b78b5e9f13019f2c4cef99f0eFrank Sposaro if (mStatus != null) { 105f443194c03dd9ecfeecd3e6ef1fabb0945ada645Frank Sposaro if (entry.status == null) { 106afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro mStatus.setVisibility(View.GONE); 107595d6ea70e5d557b78b5e9f13019f2c4cef99f0eFrank Sposaro } else { 108f443194c03dd9ecfeecd3e6ef1fabb0945ada645Frank Sposaro mStatus.setText(entry.status); 109f443194c03dd9ecfeecd3e6ef1fabb0945ada645Frank Sposaro mStatus.setCompoundDrawablesWithIntrinsicBounds(entry.presenceIcon, 110f443194c03dd9ecfeecd3e6ef1fabb0945ada645Frank Sposaro null, null, null); 111afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro mStatus.setVisibility(View.VISIBLE); 112595d6ea70e5d557b78b5e9f13019f2c4cef99f0eFrank Sposaro } 113595d6ea70e5d557b78b5e9f13019f2c4cef99f0eFrank Sposaro } 114595d6ea70e5d557b78b5e9f13019f2c4cef99f0eFrank Sposaro 11592cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro if (mPhoneLabel != null) { 11692cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro mPhoneLabel.setText(entry.phoneLabel); 11792cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro } 11892cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro 11992cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro if (mPhoneNumber != null) { 12092cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro // TODO: Format number correctly 12192cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro mPhoneNumber.setText(entry.phoneNumber); 12292cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro } 12392cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro 124c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro setVisibility(View.VISIBLE); 125b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro 126c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro if (mPhotoManager != null) { 127afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro if (mPhoto != null) { 1282f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann mPhotoManager.loadPhoto(mPhoto, entry.photoUri, getApproximateImageSize(), 129ecfc26c3f9495f1a4efed69a1582ff2b0deb2c71Daniel Lehmann isDarkTheme()); 130afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro 131afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro if (mQuickContact != null) { 132afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro mQuickContact.assignContactUri(mLookupUri); 133afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro } 134afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro } else if (mQuickContact != null) { 1355909aabfcf7bfba11e8c7c455295aee9696b5bcbDaniel Lehmann mQuickContact.assignContactUri(mLookupUri); 1362f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann mPhotoManager.loadPhoto(mQuickContact, entry.photoUri, 1372f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann getApproximateImageSize(), isDarkTheme()); 1385909aabfcf7bfba11e8c7c455295aee9696b5bcbDaniel Lehmann } 139c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro } else { 140c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro Log.w(TAG, "contactPhotoManager not set"); 141c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro } 142f75534bc07689443f9a9253242a473df64ecc2c3Daisuke Miyakawa 143f75534bc07689443f9a9253242a473df64ecc2c3Daisuke Miyakawa if (mPushState != null) { 144f75534bc07689443f9a9253242a473df64ecc2c3Daisuke Miyakawa mPushState.setContentDescription(entry.name); 145f75534bc07689443f9a9253242a473df64ecc2c3Daisuke Miyakawa } else if (mQuickContact != null) { 146f75534bc07689443f9a9253242a473df64ecc2c3Daisuke Miyakawa mQuickContact.setContentDescription(entry.name); 147f75534bc07689443f9a9253242a473df64ecc2c3Daisuke Miyakawa } 148b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro } else { 149c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro setVisibility(View.INVISIBLE); 150b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro } 151b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro } 152b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro 153afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro public void setListener(Listener listener) { 154afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro mListener = listener; 155257cec1e445c338eb86f82cb9be5a2fb37edbb8dFrank Sposaro } 156257cec1e445c338eb86f82cb9be5a2fb37edbb8dFrank Sposaro 157257cec1e445c338eb86f82cb9be5a2fb37edbb8dFrank Sposaro public void setHorizontalDividerVisibility(int visibility) { 158257cec1e445c338eb86f82cb9be5a2fb37edbb8dFrank Sposaro if (mHorizontalDivider != null) mHorizontalDivider.setVisibility(visibility); 159257cec1e445c338eb86f82cb9be5a2fb37edbb8dFrank Sposaro } 160257cec1e445c338eb86f82cb9be5a2fb37edbb8dFrank Sposaro 161b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro public Uri getLookupUri() { 162b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro return mLookupUri; 163b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro } 1649994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro 1652f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann protected QuickContactBadge getQuickContact() { 1662f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann return mQuickContact; 167ecfc26c3f9495f1a4efed69a1582ff2b0deb2c71Daniel Lehmann } 168ecfc26c3f9495f1a4efed69a1582ff2b0deb2c71Daniel Lehmann 1692f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann /** 1702f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann * Implemented by subclasses to estimate the size of the picture. This can return -1 if only 1712f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann * a thumbnail is shown anyway 1722f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann */ 1732f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann protected abstract int getApproximateImageSize(); 1742f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann 1752f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann protected abstract boolean isDarkTheme(); 176ecfc26c3f9495f1a4efed69a1582ff2b0deb2c71Daniel Lehmann 1779994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro public interface Listener { 1784e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus /** 1794e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus * Notification that the contact was selected; no specific action is dictated. 1804e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus */ 1814e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus void onContactSelected(Uri contactLookupUri, Rect viewRect); 1824e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus /** 1834e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus * Notification that the specified number is to be called. 1844e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus */ 1854e05a29c9b05c8cb74972aa5b9fe55fe35d7f45dJosh Gargus void onCallNumberDirectly(String phoneNumber); 1862f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann /** 1872f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann * @return The width of each tile. This doesn't have to be a precise number (e.g. paddings 1882f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann * can be ignored), but is used to load the correct picture size from the database 1892f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann */ 1902f77c85543e6c497e63cd0e216b70e58c1d13ec3Daniel Lehmann int getApproximateTileWidth(); 1919994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro } 192b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro} 193