/android/upstream/android/widget/QuickContactBadge.java
Java | 302 lines | 202 code | 37 blank | 63 comment | 48 complexity | 9e4387e59d7f8b74823064a8a5639543 MD5 | raw file
- /*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package android.widget;
- import com.android.internal.R;
- import android.content.AsyncQueryHandler;
- import android.content.ContentResolver;
- import android.content.Context;
- import android.content.Intent;
- import android.content.res.TypedArray;
- import android.database.Cursor;
- import android.graphics.Canvas;
- import android.graphics.drawable.Drawable;
- import android.net.Uri;
- import android.provider.ContactsContract.CommonDataKinds.Email;
- import android.provider.ContactsContract.Contacts;
- import android.provider.ContactsContract.Intents;
- import android.provider.ContactsContract.PhoneLookup;
- import android.provider.ContactsContract.QuickContact;
- import android.provider.ContactsContract.RawContacts;
- import android.util.AttributeSet;
- import android.view.View;
- import android.view.View.OnClickListener;
- /**
- * Widget used to show an image with the standard QuickContact badge
- * and on-click behavior.
- */
- public class QuickContactBadge extends ImageView implements OnClickListener {
- private Uri mContactUri;
- private String mContactEmail;
- private String mContactPhone;
- private Drawable mOverlay;
- private QueryHandler mQueryHandler;
- private Drawable mDefaultAvatar;
- protected String[] mExcludeMimes = null;
- static final private int TOKEN_EMAIL_LOOKUP = 0;
- static final private int TOKEN_PHONE_LOOKUP = 1;
- static final private int TOKEN_EMAIL_LOOKUP_AND_TRIGGER = 2;
- static final private int TOKEN_PHONE_LOOKUP_AND_TRIGGER = 3;
- static final String[] EMAIL_LOOKUP_PROJECTION = new String[] {
- RawContacts.CONTACT_ID,
- Contacts.LOOKUP_KEY,
- };
- static final int EMAIL_ID_COLUMN_INDEX = 0;
- static final int EMAIL_LOOKUP_STRING_COLUMN_INDEX = 1;
- static final String[] PHONE_LOOKUP_PROJECTION = new String[] {
- PhoneLookup._ID,
- PhoneLookup.LOOKUP_KEY,
- };
- static final int PHONE_ID_COLUMN_INDEX = 0;
- static final int PHONE_LOOKUP_STRING_COLUMN_INDEX = 1;
- public QuickContactBadge(Context context) {
- this(context, null);
- }
- public QuickContactBadge(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
- public QuickContactBadge(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- TypedArray styledAttributes = mContext.obtainStyledAttributes(R.styleable.Theme);
- mOverlay = styledAttributes.getDrawable(
- com.android.internal.R.styleable.Theme_quickContactBadgeOverlay);
- styledAttributes.recycle();
- mQueryHandler = new QueryHandler(mContext.getContentResolver());
- setOnClickListener(this);
- }
- @Override
- protected void drawableStateChanged() {
- super.drawableStateChanged();
- if (mOverlay != null && mOverlay.isStateful()) {
- mOverlay.setState(getDrawableState());
- invalidate();
- }
- }
- /** This call has no effect anymore, as there is only one QuickContact mode */
- @SuppressWarnings("unused")
- public void setMode(int size) {
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- if (!isEnabled()) {
- // not clickable? don't show triangle
- return;
- }
- if (mOverlay == null || mOverlay.getIntrinsicWidth() == 0 ||
- mOverlay.getIntrinsicHeight() == 0) {
- // nothing to draw
- return;
- }
- mOverlay.setBounds(0, 0, getWidth(), getHeight());
- if (mPaddingTop == 0 && mPaddingLeft == 0) {
- mOverlay.draw(canvas);
- } else {
- int saveCount = canvas.getSaveCount();
- canvas.save();
- canvas.translate(mPaddingLeft, mPaddingTop);
- mOverlay.draw(canvas);
- canvas.restoreToCount(saveCount);
- }
- }
- /** True if a contact, an email address or a phone number has been assigned */
- private boolean isAssigned() {
- return mContactUri != null || mContactEmail != null || mContactPhone != null;
- }
- /**
- * Resets the contact photo to the default state.
- */
- public void setImageToDefault() {
- if (mDefaultAvatar == null) {
- mDefaultAvatar = getResources().getDrawable(R.drawable.ic_contact_picture);
- }
- setImageDrawable(mDefaultAvatar);
- }
- /**
- * Assign the contact uri that this QuickContactBadge should be associated
- * with. Note that this is only used for displaying the QuickContact window and
- * won't bind the contact's photo for you. Call {@link #setImageDrawable(Drawable)} to set the
- * photo.
- *
- * @param contactUri Either a {@link Contacts#CONTENT_URI} or
- * {@link Contacts#CONTENT_LOOKUP_URI} style URI.
- */
- public void assignContactUri(Uri contactUri) {
- mContactUri = contactUri;
- mContactEmail = null;
- mContactPhone = null;
- onContactUriChanged();
- }
- /**
- * Assign a contact based on an email address. This should only be used when
- * the contact's URI is not available, as an extra query will have to be
- * performed to lookup the URI based on the email.
- *
- * @param emailAddress The email address of the contact.
- * @param lazyLookup If this is true, the lookup query will not be performed
- * until this view is clicked.
- */
- public void assignContactFromEmail(String emailAddress, boolean lazyLookup) {
- mContactEmail = emailAddress;
- if (!lazyLookup) {
- mQueryHandler.startQuery(TOKEN_EMAIL_LOOKUP, null,
- Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(mContactEmail)),
- EMAIL_LOOKUP_PROJECTION, null, null, null);
- } else {
- mContactUri = null;
- onContactUriChanged();
- }
- }
- /**
- * Assign a contact based on a phone number. This should only be used when
- * the contact's URI is not available, as an extra query will have to be
- * performed to lookup the URI based on the phone number.
- *
- * @param phoneNumber The phone number of the contact.
- * @param lazyLookup If this is true, the lookup query will not be performed
- * until this view is clicked.
- */
- public void assignContactFromPhone(String phoneNumber, boolean lazyLookup) {
- mContactPhone = phoneNumber;
- if (!lazyLookup) {
- mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP, null,
- Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, mContactPhone),
- PHONE_LOOKUP_PROJECTION, null, null, null);
- } else {
- mContactUri = null;
- onContactUriChanged();
- }
- }
- private void onContactUriChanged() {
- setEnabled(isAssigned());
- }
- @Override
- public void onClick(View v) {
- if (mContactUri != null) {
- QuickContact.showQuickContact(getContext(), QuickContactBadge.this, mContactUri,
- QuickContact.MODE_LARGE, mExcludeMimes);
- } else if (mContactEmail != null) {
- mQueryHandler.startQuery(TOKEN_EMAIL_LOOKUP_AND_TRIGGER, mContactEmail,
- Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(mContactEmail)),
- EMAIL_LOOKUP_PROJECTION, null, null, null);
- } else if (mContactPhone != null) {
- mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP_AND_TRIGGER, mContactPhone,
- Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, mContactPhone),
- PHONE_LOOKUP_PROJECTION, null, null, null);
- } else {
- // If a contact hasn't been assigned, don't react to click.
- return;
- }
- }
- /**
- * Set a list of specific MIME-types to exclude and not display. For
- * example, this can be used to hide the {@link Contacts#CONTENT_ITEM_TYPE}
- * profile icon.
- */
- public void setExcludeMimes(String[] excludeMimes) {
- mExcludeMimes = excludeMimes;
- }
- private class QueryHandler extends AsyncQueryHandler {
- public QueryHandler(ContentResolver cr) {
- super(cr);
- }
- @Override
- protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
- Uri lookupUri = null;
- Uri createUri = null;
- boolean trigger = false;
- try {
- switch(token) {
- case TOKEN_PHONE_LOOKUP_AND_TRIGGER:
- trigger = true;
- createUri = Uri.fromParts("tel", (String)cookie, null);
- //$FALL-THROUGH$
- case TOKEN_PHONE_LOOKUP: {
- if (cursor != null && cursor.moveToFirst()) {
- long contactId = cursor.getLong(PHONE_ID_COLUMN_INDEX);
- String lookupKey = cursor.getString(PHONE_LOOKUP_STRING_COLUMN_INDEX);
- lookupUri = Contacts.getLookupUri(contactId, lookupKey);
- }
- break;
- }
- case TOKEN_EMAIL_LOOKUP_AND_TRIGGER:
- trigger = true;
- createUri = Uri.fromParts("mailto", (String)cookie, null);
- //$FALL-THROUGH$
- case TOKEN_EMAIL_LOOKUP: {
- if (cursor != null && cursor.moveToFirst()) {
- long contactId = cursor.getLong(EMAIL_ID_COLUMN_INDEX);
- String lookupKey = cursor.getString(EMAIL_LOOKUP_STRING_COLUMN_INDEX);
- lookupUri = Contacts.getLookupUri(contactId, lookupKey);
- }
- break;
- }
- }
- } finally {
- if (cursor != null) {
- cursor.close();
- }
- }
- mContactUri = lookupUri;
- onContactUriChanged();
- if (trigger && lookupUri != null) {
- // Found contact, so trigger QuickContact
- QuickContact.showQuickContact(getContext(), QuickContactBadge.this, lookupUri,
- QuickContact.MODE_LARGE, mExcludeMimes);
- } else if (createUri != null) {
- // Prompt user to add this person to contacts
- final Intent intent = new Intent(Intents.SHOW_OR_CREATE_CONTACT, createUri);
- getContext().startActivity(intent);
- }
- }
- }
- }