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