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 com.android.contacts.ContactPhotoManager;
19b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaroimport com.android.contacts.R;
20c569acf64701828c84271a81836dfd1a404dba03Frank Sposaroimport com.android.contacts.list.ContactTileAdapter.ContactEntry;
21b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro
22b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaroimport android.content.Context;
23b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaroimport android.net.Uri;
24b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaroimport android.util.AttributeSet;
25b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaroimport android.util.Log;
26c569acf64701828c84271a81836dfd1a404dba03Frank Sposaroimport android.view.View;
27c56a413e08d907858f848ebbdd8f57290a20f44eFrank Sposaroimport android.widget.FrameLayout;
28b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaroimport android.widget.ImageView;
299e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaroimport android.widget.QuickContactBadge;
30b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaroimport android.widget.TextView;
31b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro
32c56a413e08d907858f848ebbdd8f57290a20f44eFrank Sposaro/**
33b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro * A ContactTile displays the contact's picture overlayed with their name
34b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro */
35c56a413e08d907858f848ebbdd8f57290a20f44eFrank Sposaropublic class ContactTileView extends FrameLayout {
36eec538e5a1cacb96b7cd4309efaa5ddb0baac6faFrank Sposaro    private final static String TAG = ContactTileView.class.getSimpleName();
37b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro
38b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro    private Uri mLookupUri;
39b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro    private ImageView mPhoto;
409e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaro    private QuickContactBadge mQuickContact;
41b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro    private TextView mName;
42595d6ea70e5d557b78b5e9f13019f2c4cef99f0eFrank Sposaro    private TextView mStatus;
4392cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro    private TextView mPhoneLabel;
4492cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro    private TextView mPhoneNumber;
45c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro    private ContactPhotoManager mPhotoManager = null;
46afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro    private View mPushState;
47257cec1e445c338eb86f82cb9be5a2fb37edbb8dFrank Sposaro    private View mHorizontalDivider;
48afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro    private Listener mListener;
49b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro
50b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro    public ContactTileView(Context context, AttributeSet attrs) {
51b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro        super(context, attrs);
52b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro    }
53b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro
54b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro    @Override
55b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro    protected void onFinishInflate() {
56b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro        super.onFinishInflate();
57b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro        mName = (TextView) findViewById(R.id.contact_tile_name);
589e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaro
599e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaro        mQuickContact = (QuickContactBadge) findViewById(R.id.contact_tile_quick);
60b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro        mPhoto = (ImageView) findViewById(R.id.contact_tile_image);
61595d6ea70e5d557b78b5e9f13019f2c4cef99f0eFrank Sposaro        mStatus = (TextView) findViewById(R.id.contact_tile_status);
6292cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro        mPhoneLabel = (TextView) findViewById(R.id.contact_tile_phone_type);
6392cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro        mPhoneNumber = (TextView) findViewById(R.id.contact_tile_phone_number);
64afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro        mPushState = findViewById(R.id.contact_tile_push_state);
65257cec1e445c338eb86f82cb9be5a2fb37edbb8dFrank Sposaro        mHorizontalDivider = findViewById(R.id.contact_tile_horizontal_divider);
669994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro
679994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro        OnClickListener listener = new OnClickListener() {
689994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro            @Override
699994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro            public void onClick(View v) {
709994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro                if (mListener != null) {
719994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro                    mListener.onClick(ContactTileView.this);
729994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro                }
739994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro            }
749994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro        };
759994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro
769994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro        if(mPushState != null) {
779994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro            mPushState.setOnClickListener(listener);
789994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro        } else {
799994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro            setOnClickListener(listener);
809994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro        }
81b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro    }
82b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro
83c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro    public void setPhotoManager(ContactPhotoManager photoManager) {
84c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro        mPhotoManager = photoManager;
85c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro    }
86c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro
87eec538e5a1cacb96b7cd4309efaa5ddb0baac6faFrank Sposaro    /**
88eec538e5a1cacb96b7cd4309efaa5ddb0baac6faFrank Sposaro     * Populates the data members to be displayed from the
89eec538e5a1cacb96b7cd4309efaa5ddb0baac6faFrank Sposaro     * fields in {@link ContactEntry}
90eec538e5a1cacb96b7cd4309efaa5ddb0baac6faFrank Sposaro     */
91c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro    public void loadFromContact(ContactEntry entry) {
923d5c5de0b376aa9c4e5c60eeb0b81118217eb361Frank Sposaro
93b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro        if (entry != null) {
94b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro            mName.setText(entry.name);
95b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro            mLookupUri = entry.lookupKey;
969e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaro
97595d6ea70e5d557b78b5e9f13019f2c4cef99f0eFrank Sposaro            if (mStatus != null) {
98f443194c03dd9ecfeecd3e6ef1fabb0945ada645Frank Sposaro                if (entry.status == null) {
99afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro                    mStatus.setVisibility(View.GONE);
100595d6ea70e5d557b78b5e9f13019f2c4cef99f0eFrank Sposaro                } else {
101f443194c03dd9ecfeecd3e6ef1fabb0945ada645Frank Sposaro                    mStatus.setText(entry.status);
102f443194c03dd9ecfeecd3e6ef1fabb0945ada645Frank Sposaro                    mStatus.setCompoundDrawablesWithIntrinsicBounds(entry.presenceIcon,
103f443194c03dd9ecfeecd3e6ef1fabb0945ada645Frank Sposaro                            null, null, null);
104afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro                    mStatus.setVisibility(View.VISIBLE);
105595d6ea70e5d557b78b5e9f13019f2c4cef99f0eFrank Sposaro                }
106595d6ea70e5d557b78b5e9f13019f2c4cef99f0eFrank Sposaro            }
107595d6ea70e5d557b78b5e9f13019f2c4cef99f0eFrank Sposaro
10892cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro            if (mPhoneLabel != null) {
10992cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro                mPhoneLabel.setText(entry.phoneLabel);
11092cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro            }
11192cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro
11292cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro            if (mPhoneNumber != null) {
11392cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro                // TODO: Format number correctly
11492cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro                mPhoneNumber.setText(entry.phoneNumber);
11592cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro            }
11692cb150070f90dfe3c0d39abee9e9c1692a034e5Frank Sposaro
117c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro            setVisibility(View.VISIBLE);
118b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro
119c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro            if (mPhotoManager != null) {
120afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro                if (mPhoto != null) {
121ecfc26c3f9495f1a4efed69a1582ff2b0deb2c71Daniel Lehmann                    mPhotoManager.loadPhoto(mPhoto, entry.photoUri, isDefaultIconHires(),
122ecfc26c3f9495f1a4efed69a1582ff2b0deb2c71Daniel Lehmann                            isDarkTheme());
123afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro
124afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro                    if (mQuickContact != null) {
125afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro                        mQuickContact.assignContactUri(mLookupUri);
126afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro                    }
127afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro                } else if (mQuickContact != null) {
1285909aabfcf7bfba11e8c7c455295aee9696b5bcbDaniel Lehmann                    mQuickContact.assignContactUri(mLookupUri);
129ecfc26c3f9495f1a4efed69a1582ff2b0deb2c71Daniel Lehmann                    mPhotoManager.loadPhoto(mQuickContact, entry.photoUri, isDefaultIconHires(),
130ecfc26c3f9495f1a4efed69a1582ff2b0deb2c71Daniel Lehmann                            isDarkTheme());
1315909aabfcf7bfba11e8c7c455295aee9696b5bcbDaniel Lehmann                }
1329e095d2ffc4a94d2fb925d19df6db12bc2b1e124Frank Sposaro
133c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro            } else {
134c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro                Log.w(TAG, "contactPhotoManager not set");
135c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro            }
136f75534bc07689443f9a9253242a473df64ecc2c3Daisuke Miyakawa
137f75534bc07689443f9a9253242a473df64ecc2c3Daisuke Miyakawa            if (mPushState != null) {
138f75534bc07689443f9a9253242a473df64ecc2c3Daisuke Miyakawa                mPushState.setContentDescription(entry.name);
139f75534bc07689443f9a9253242a473df64ecc2c3Daisuke Miyakawa            } else if (mQuickContact != null) {
140f75534bc07689443f9a9253242a473df64ecc2c3Daisuke Miyakawa                mQuickContact.setContentDescription(entry.name);
141f75534bc07689443f9a9253242a473df64ecc2c3Daisuke Miyakawa            }
142b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro        } else {
143c569acf64701828c84271a81836dfd1a404dba03Frank Sposaro            setVisibility(View.INVISIBLE);
144b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro        }
145b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro    }
146b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro
147afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro    public void setListener(Listener listener) {
148afc2891b0b07ad1f3d7fa7a272aec5c21bcd8c8bFrank Sposaro        mListener = listener;
149257cec1e445c338eb86f82cb9be5a2fb37edbb8dFrank Sposaro    }
150257cec1e445c338eb86f82cb9be5a2fb37edbb8dFrank Sposaro
151257cec1e445c338eb86f82cb9be5a2fb37edbb8dFrank Sposaro    public void setHorizontalDividerVisibility(int visibility) {
152257cec1e445c338eb86f82cb9be5a2fb37edbb8dFrank Sposaro        if (mHorizontalDivider != null) mHorizontalDivider.setVisibility(visibility);
153257cec1e445c338eb86f82cb9be5a2fb37edbb8dFrank Sposaro    }
154257cec1e445c338eb86f82cb9be5a2fb37edbb8dFrank Sposaro
155b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro    public Uri getLookupUri() {
156b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro        return mLookupUri;
157b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro    }
1589994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro
159ecfc26c3f9495f1a4efed69a1582ff2b0deb2c71Daniel Lehmann    protected boolean isDefaultIconHires() {
160ecfc26c3f9495f1a4efed69a1582ff2b0deb2c71Daniel Lehmann        return false;
161ecfc26c3f9495f1a4efed69a1582ff2b0deb2c71Daniel Lehmann    }
162ecfc26c3f9495f1a4efed69a1582ff2b0deb2c71Daniel Lehmann
163ecfc26c3f9495f1a4efed69a1582ff2b0deb2c71Daniel Lehmann    protected boolean isDarkTheme() {
164ecfc26c3f9495f1a4efed69a1582ff2b0deb2c71Daniel Lehmann        return false;
165ecfc26c3f9495f1a4efed69a1582ff2b0deb2c71Daniel Lehmann    }
166ecfc26c3f9495f1a4efed69a1582ff2b0deb2c71Daniel Lehmann
1679994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro    public interface Listener {
1689994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro        void onClick(ContactTileView contactTileView);
1699994f6634f3e13991b8cbf2021d7bf9099c12cd7Frank Sposaro    }
170b961b3b6dae6e3f1b6096631f130c38bfa33267cFrank Sposaro}
171