1e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar/*
2e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar * Copyright (C) 2009 The Android Open Source Project
3e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar *
4e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar * Licensed under the Apache License, Version 2.0 (the "License");
5e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar * you may not use this file except in compliance with the License.
6e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar * You may obtain a copy of the License at
7e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar *
8e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar *      http://www.apache.org/licenses/LICENSE-2.0
9e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar *
10e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar * Unless required by applicable law or agreed to in writing, software
11e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar * distributed under the License is distributed on an "AS IS" BASIS,
12e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar * See the License for the specific language governing permissions and
14e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar * limitations under the License.
15e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar */
16e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
17e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millarpackage android.widget;
18e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
19e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millarimport android.content.AsyncQueryHandler;
20e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millarimport android.content.ContentResolver;
21e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millarimport android.content.Context;
22e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millarimport android.content.Intent;
23e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millarimport android.content.res.TypedArray;
24e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millarimport android.database.Cursor;
25f5935a9836d1a49693bd59f7fce5c475291c8daeMark Wagnerimport android.graphics.drawable.Drawable;
26e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millarimport android.net.Uri;
27e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millarimport android.provider.ContactsContract.Contacts;
28e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millarimport android.provider.ContactsContract.Intents;
29e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millarimport android.provider.ContactsContract.PhoneLookup;
3001fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaokaimport android.provider.ContactsContract.QuickContact;
31ea36747114cb8c06742994dddc6a3cff2b666e69Dmitri Plotnikovimport android.provider.ContactsContract.RawContacts;
32e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millarimport android.provider.ContactsContract.CommonDataKinds.Email;
33e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millarimport android.util.AttributeSet;
34e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millarimport android.view.View;
35e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millarimport android.view.View.OnClickListener;
36b2c6429d4dc95118237d8a10237b9b005b339fb6Mark Wagnerimport com.android.internal.R;
37e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
38e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar/**
39c1a2a8296e811a2b9f8553346147be65e8a690b6Evan Millar * Widget used to show an image with the standard QuickContact badge
40e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar * and on-click behavior.
41e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar */
42c1a2a8296e811a2b9f8553346147be65e8a690b6Evan Millarpublic class QuickContactBadge extends ImageView implements OnClickListener {
43e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
44e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    private Uri mContactUri;
45e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    private String mContactEmail;
46e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    private String mContactPhone;
47e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    private int mMode;
48e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    private QueryHandler mQueryHandler;
49f5935a9836d1a49693bd59f7fce5c475291c8daeMark Wagner    private Drawable mBadgeBackground;
50b2c6429d4dc95118237d8a10237b9b005b339fb6Mark Wagner    private Drawable mNoBadgeBackground;
512f14c621256e9eac1f958b1a19e41b2a47b7011eDaniel Lehmann    private int mSelectedContactsAppTabIndex = -1;
52e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
53e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    protected String[] mExcludeMimes = null;
54e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
55e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    static final private int TOKEN_EMAIL_LOOKUP = 0;
56e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    static final private int TOKEN_PHONE_LOOKUP = 1;
57e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    static final private int TOKEN_EMAIL_LOOKUP_AND_TRIGGER = 2;
58e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    static final private int TOKEN_PHONE_LOOKUP_AND_TRIGGER = 3;
5901fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka    static final private int TOKEN_CONTACT_LOOKUP_AND_TRIGGER = 4;
60e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
61e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    static final String[] EMAIL_LOOKUP_PROJECTION = new String[] {
62ea36747114cb8c06742994dddc6a3cff2b666e69Dmitri Plotnikov        RawContacts.CONTACT_ID,
63e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        Contacts.LOOKUP_KEY,
64e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    };
6501fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka    static final int EMAIL_ID_COLUMN_INDEX = 0;
6601fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka    static final int EMAIL_LOOKUP_STRING_COLUMN_INDEX = 1;
67e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
68e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    static final String[] PHONE_LOOKUP_PROJECTION = new String[] {
69e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        PhoneLookup._ID,
70e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        PhoneLookup.LOOKUP_KEY,
71e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    };
7201fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka    static final int PHONE_ID_COLUMN_INDEX = 0;
7301fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka    static final int PHONE_LOOKUP_STRING_COLUMN_INDEX = 1;
74e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
7501fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka    static final String[] CONTACT_LOOKUP_PROJECTION = new String[] {
7601fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka        Contacts._ID,
7701fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka        Contacts.LOOKUP_KEY,
7801fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka    };
7901fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka    static final int CONTACT_ID_COLUMN_INDEX = 0;
8001fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka    static final int CONTACT_LOOKUPKEY_COLUMN_INDEX = 1;
81e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
82e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
83c1a2a8296e811a2b9f8553346147be65e8a690b6Evan Millar    public QuickContactBadge(Context context) {
84e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        this(context, null);
85e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    }
86e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
87c1a2a8296e811a2b9f8553346147be65e8a690b6Evan Millar    public QuickContactBadge(Context context, AttributeSet attrs) {
88e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        this(context, attrs, 0);
89e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    }
90e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
91c1a2a8296e811a2b9f8553346147be65e8a690b6Evan Millar    public QuickContactBadge(Context context, AttributeSet attrs, int defStyle) {
92e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        super(context, attrs, defStyle);
93e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
94e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        TypedArray a =
95e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar            context.obtainStyledAttributes(attrs,
96c1a2a8296e811a2b9f8553346147be65e8a690b6Evan Millar                    com.android.internal.R.styleable.QuickContactBadge, defStyle, 0);
97e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
98c1a2a8296e811a2b9f8553346147be65e8a690b6Evan Millar        mMode = a.getInt(com.android.internal.R.styleable.QuickContactBadge_quickContactWindowSize,
99e3ec9977bbfbdd6659cf27c7341f4c1c826f2209Evan Millar                QuickContact.MODE_MEDIUM);
100e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
101e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        a.recycle();
102e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
103e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        init();
104f5935a9836d1a49693bd59f7fce5c475291c8daeMark Wagner
105f5935a9836d1a49693bd59f7fce5c475291c8daeMark Wagner        mBadgeBackground = getBackground();
106e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    }
107e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
108e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    private void init() {
109e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        mQueryHandler = new QueryHandler(mContext.getContentResolver());
110e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        setOnClickListener(this);
111e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    }
112e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
113e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    /**
114e3ec9977bbfbdd6659cf27c7341f4c1c826f2209Evan Millar     * Set the QuickContact window mode. Options are {@link QuickContact#MODE_SMALL},
115e3ec9977bbfbdd6659cf27c7341f4c1c826f2209Evan Millar     * {@link QuickContact#MODE_MEDIUM}, {@link QuickContact#MODE_LARGE}.
116e3ec9977bbfbdd6659cf27c7341f4c1c826f2209Evan Millar     * @param size
117e3ec9977bbfbdd6659cf27c7341f4c1c826f2209Evan Millar     */
118e3ec9977bbfbdd6659cf27c7341f4c1c826f2209Evan Millar    public void setMode(int size) {
119e3ec9977bbfbdd6659cf27c7341f4c1c826f2209Evan Millar        mMode = size;
120e3ec9977bbfbdd6659cf27c7341f4c1c826f2209Evan Millar    }
121e3ec9977bbfbdd6659cf27c7341f4c1c826f2209Evan Millar
122e3ec9977bbfbdd6659cf27c7341f4c1c826f2209Evan Millar    /**
123c1a2a8296e811a2b9f8553346147be65e8a690b6Evan Millar     * Assign the contact uri that this QuickContactBadge should be associated
124c1a2a8296e811a2b9f8553346147be65e8a690b6Evan Millar     * with. Note that this is only used for displaying the QuickContact window and
1250050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey     * won't bind the contact's photo for you.
126e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     *
1270050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey     * @param contactUri Either a {@link Contacts#CONTENT_URI} or
1280050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey     *            {@link Contacts#CONTENT_LOOKUP_URI} style URI.
129e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     */
130e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    public void assignContactUri(Uri contactUri) {
131e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        mContactUri = contactUri;
132f5935a9836d1a49693bd59f7fce5c475291c8daeMark Wagner        mContactEmail = null;
133f5935a9836d1a49693bd59f7fce5c475291c8daeMark Wagner        mContactPhone = null;
134f5935a9836d1a49693bd59f7fce5c475291c8daeMark Wagner        onContactUriChanged();
135f5935a9836d1a49693bd59f7fce5c475291c8daeMark Wagner    }
136f5935a9836d1a49693bd59f7fce5c475291c8daeMark Wagner
1372f14c621256e9eac1f958b1a19e41b2a47b7011eDaniel Lehmann    /**
1382f14c621256e9eac1f958b1a19e41b2a47b7011eDaniel Lehmann     * Sets the currently selected tab of the Contacts application. If not set, this is -1
1392f14c621256e9eac1f958b1a19e41b2a47b7011eDaniel Lehmann     * and therefore does not save a tab selection when a phone call is being made
1402f14c621256e9eac1f958b1a19e41b2a47b7011eDaniel Lehmann     * @hide
1412f14c621256e9eac1f958b1a19e41b2a47b7011eDaniel Lehmann     */
1422f14c621256e9eac1f958b1a19e41b2a47b7011eDaniel Lehmann    public void setSelectedContactsAppTabIndex(int value) {
1432f14c621256e9eac1f958b1a19e41b2a47b7011eDaniel Lehmann        mSelectedContactsAppTabIndex = value;
1442f14c621256e9eac1f958b1a19e41b2a47b7011eDaniel Lehmann    }
1452f14c621256e9eac1f958b1a19e41b2a47b7011eDaniel Lehmann
146f5935a9836d1a49693bd59f7fce5c475291c8daeMark Wagner    private void onContactUriChanged() {
147f5935a9836d1a49693bd59f7fce5c475291c8daeMark Wagner        if (mContactUri == null && mContactEmail == null && mContactPhone == null) {
148b2c6429d4dc95118237d8a10237b9b005b339fb6Mark Wagner            if (mNoBadgeBackground == null) {
149c1a2a8296e811a2b9f8553346147be65e8a690b6Evan Millar                mNoBadgeBackground = getResources().getDrawable(R.drawable.quickcontact_nobadge);
150b2c6429d4dc95118237d8a10237b9b005b339fb6Mark Wagner            }
151b2c6429d4dc95118237d8a10237b9b005b339fb6Mark Wagner            setBackgroundDrawable(mNoBadgeBackground);
152f5935a9836d1a49693bd59f7fce5c475291c8daeMark Wagner        } else {
153f5935a9836d1a49693bd59f7fce5c475291c8daeMark Wagner            setBackgroundDrawable(mBadgeBackground);
154f5935a9836d1a49693bd59f7fce5c475291c8daeMark Wagner        }
155e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    }
156e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
157e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    /**
158e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     * Assign a contact based on an email address. This should only be used when
159e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     * the contact's URI is not available, as an extra query will have to be
160e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     * performed to lookup the URI based on the email.
161e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     *
162e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     * @param emailAddress The email address of the contact.
163e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     * @param lazyLookup If this is true, the lookup query will not be performed
164e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     * until this view is clicked.
165e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     */
166e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    public void assignContactFromEmail(String emailAddress, boolean lazyLookup) {
167e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        mContactEmail = emailAddress;
168e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        if (!lazyLookup) {
169e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar            mQueryHandler.startQuery(TOKEN_EMAIL_LOOKUP, null,
170e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                    Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(mContactEmail)),
171e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                    EMAIL_LOOKUP_PROJECTION, null, null, null);
1720050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey        } else {
1730050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey            mContactUri = null;
174f5935a9836d1a49693bd59f7fce5c475291c8daeMark Wagner            onContactUriChanged();
175e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        }
176e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    }
177e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
178e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    /**
179e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     * Assign a contact based on a phone number. This should only be used when
180e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     * the contact's URI is not available, as an extra query will have to be
181e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     * performed to lookup the URI based on the phone number.
182e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     *
183e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     * @param phoneNumber The phone number of the contact.
184e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     * @param lazyLookup If this is true, the lookup query will not be performed
185e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     * until this view is clicked.
186e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     */
187e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    public void assignContactFromPhone(String phoneNumber, boolean lazyLookup) {
188e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        mContactPhone = phoneNumber;
189e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        if (!lazyLookup) {
190e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar            mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP, null,
191e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                    Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, mContactPhone),
192e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                    PHONE_LOOKUP_PROJECTION, null, null, null);
1930050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey        } else {
1940050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey            mContactUri = null;
195f5935a9836d1a49693bd59f7fce5c475291c8daeMark Wagner            onContactUriChanged();
196e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        }
197e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    }
198e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
199e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    public void onClick(View v) {
200e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        if (mContactUri != null) {
20101fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka            mQueryHandler.startQuery(TOKEN_CONTACT_LOOKUP_AND_TRIGGER, null,
20201fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka                    mContactUri,
20301fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka                    CONTACT_LOOKUP_PROJECTION, null, null, null);
204e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        } else if (mContactEmail != null) {
2050050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey            mQueryHandler.startQuery(TOKEN_EMAIL_LOOKUP_AND_TRIGGER, mContactEmail,
206e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                    Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(mContactEmail)),
207e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                    EMAIL_LOOKUP_PROJECTION, null, null, null);
208e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        } else if (mContactPhone != null) {
2090050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey            mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP_AND_TRIGGER, mContactPhone,
210e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                    Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, mContactPhone),
211e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                    PHONE_LOOKUP_PROJECTION, null, null, null);
212e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        } else {
213e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar            // If a contact hasn't been assigned, don't react to click.
214e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar            return;
215e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        }
216e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    }
217e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
218e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    /**
219e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     * Set a list of specific MIME-types to exclude and not display. For
220e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     * example, this can be used to hide the {@link Contacts#CONTENT_ITEM_TYPE}
221e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     * profile icon.
222e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar     */
223e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    public void setExcludeMimes(String[] excludeMimes) {
224e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        mExcludeMimes = excludeMimes;
225e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    }
226e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
2270050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey    private void trigger(Uri lookupUri) {
2282f14c621256e9eac1f958b1a19e41b2a47b7011eDaniel Lehmann        final Intent intent = QuickContact.getQuickContactIntent(getContext(), this, lookupUri,
2292f14c621256e9eac1f958b1a19e41b2a47b7011eDaniel Lehmann                mMode, mExcludeMimes);
2302f14c621256e9eac1f958b1a19e41b2a47b7011eDaniel Lehmann        if (mSelectedContactsAppTabIndex != -1) {
2312f14c621256e9eac1f958b1a19e41b2a47b7011eDaniel Lehmann            intent.putExtra(QuickContact.EXTRA_SELECTED_CONTACTS_APP_TAB_INDEX,
2322f14c621256e9eac1f958b1a19e41b2a47b7011eDaniel Lehmann                    mSelectedContactsAppTabIndex);
2332f14c621256e9eac1f958b1a19e41b2a47b7011eDaniel Lehmann        }
2342f14c621256e9eac1f958b1a19e41b2a47b7011eDaniel Lehmann        getContext().startActivity(intent);
235e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    }
236e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
237e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    private class QueryHandler extends AsyncQueryHandler {
238e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
239e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        public QueryHandler(ContentResolver cr) {
240e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar            super(cr);
241e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        }
242e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
243e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        @Override
244e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
2450050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey            Uri lookupUri = null;
2460050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey            Uri createUri = null;
247e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar            boolean trigger = false;
248e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
2490050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey            try {
250e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                switch(token) {
251e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                    case TOKEN_PHONE_LOOKUP_AND_TRIGGER:
252e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                        trigger = true;
2530050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey                        createUri = Uri.fromParts("tel", (String)cookie, null);
2540050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey
255a362e1d79492cf3a60724a259fcd6d786574d5d6Makoto Onuki                        //$FALL-THROUGH$
256e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                    case TOKEN_PHONE_LOOKUP: {
257e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                        if (cursor != null && cursor.moveToFirst()) {
258e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                            long contactId = cursor.getLong(PHONE_ID_COLUMN_INDEX);
259e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                            String lookupKey = cursor.getString(PHONE_LOOKUP_STRING_COLUMN_INDEX);
2600050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey                            lookupUri = Contacts.getLookupUri(contactId, lookupKey);
261e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                        }
2620050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey
263e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                        break;
264e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                    }
265e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                    case TOKEN_EMAIL_LOOKUP_AND_TRIGGER:
266e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                        trigger = true;
2670050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey                        createUri = Uri.fromParts("mailto", (String)cookie, null);
2680050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey
269a362e1d79492cf3a60724a259fcd6d786574d5d6Makoto Onuki                        //$FALL-THROUGH$
270e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                    case TOKEN_EMAIL_LOOKUP: {
271e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                        if (cursor != null && cursor.moveToFirst()) {
272e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                            long contactId = cursor.getLong(EMAIL_ID_COLUMN_INDEX);
273e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                            String lookupKey = cursor.getString(EMAIL_LOOKUP_STRING_COLUMN_INDEX);
2740050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey                            lookupUri = Contacts.getLookupUri(contactId, lookupKey);
275e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                        }
276a362e1d79492cf3a60724a259fcd6d786574d5d6Makoto Onuki                        break;
277e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                    }
27801fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka
27901fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka                    case TOKEN_CONTACT_LOOKUP_AND_TRIGGER: {
28001fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka                        if (cursor != null && cursor.moveToFirst()) {
28101fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka                            long contactId = cursor.getLong(CONTACT_ID_COLUMN_INDEX);
28201fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka                            String lookupKey = cursor.getString(CONTACT_LOOKUPKEY_COLUMN_INDEX);
28301fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka                            lookupUri = Contacts.getLookupUri(contactId, lookupKey);
28401fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka                            trigger = true;
28501fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka                        }
28601fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka
28701fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka                        break;
28801fd4e1226394b3d9591a13bf5edfcb74ea14690Tadashi G. Takaoka                    }
289e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                }
290e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar            } finally {
291e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                if (cursor != null) {
292e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                    cursor.close();
293e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar                }
294e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar            }
295e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar
2960050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey            mContactUri = lookupUri;
297f5935a9836d1a49693bd59f7fce5c475291c8daeMark Wagner            onContactUriChanged();
2980050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey
2990050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey            if (trigger && lookupUri != null) {
3000050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey                // Found contact, so trigger track
3010050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey                trigger(lookupUri);
3020050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey            } else if (createUri != null) {
3030050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey                // Prompt user to add this person to contacts
3040050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey                final Intent intent = new Intent(Intents.SHOW_OR_CREATE_CONTACT, createUri);
3050050ee36398c3ab6e5f1ee0038609aff8cf4f0e9Jeff Sharkey                getContext().startActivity(intent);
306e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar            }
307e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar        }
308e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar    }
309e727f18cf2649d07a89aba19ecefed93c9d0b305Evan Millar}
310