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