diff options
Diffstat (limited to 'src/com/android/messaging/ui/ContactIconView.java')
-rw-r--r-- | src/com/android/messaging/ui/ContactIconView.java | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/src/com/android/messaging/ui/ContactIconView.java b/src/com/android/messaging/ui/ContactIconView.java new file mode 100644 index 0000000..44983ab --- /dev/null +++ b/src/com/android/messaging/ui/ContactIconView.java @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2015 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 com.android.messaging.ui; + +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.net.Uri; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; + +import com.android.messaging.R; +import com.android.messaging.datamodel.data.ParticipantData; +import com.android.messaging.datamodel.media.AvatarGroupRequestDescriptor; +import com.android.messaging.datamodel.media.AvatarRequestDescriptor; +import com.android.messaging.util.Assert; +import com.android.messaging.util.AvatarUriUtil; +import com.android.messaging.util.ContactUtil; + +/** + * A view used to render contact icons. This class derives from AsyncImageView, so it loads contact + * icons from MediaResourceManager, and it handles more rendering logic than an AsyncImageView + * (draws a circular bitmap). + */ +public class ContactIconView extends AsyncImageView { + private static final int NORMAL_ICON_SIZE_ID = 0; + private static final int LARGE_ICON_SIZE_ID = 1; + private static final int SMALL_ICON_SIZE_ID = 2; + + protected final int mIconSize; + private final int mColorPressedId; + + private long mContactId; + private String mContactLookupKey; + private String mNormalizedDestination; + private Uri mAvatarUri; + private boolean mDisableClickHandler; + + public ContactIconView(final Context context, final AttributeSet attrs) { + super(context, attrs); + + final Resources resources = context.getResources(); + final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ContactIconView); + + final int iconSizeId = a.getInt(R.styleable.ContactIconView_iconSize, 0); + switch (iconSizeId) { + case NORMAL_ICON_SIZE_ID: + mIconSize = (int) resources.getDimension( + R.dimen.contact_icon_view_normal_size); + break; + case LARGE_ICON_SIZE_ID: + mIconSize = (int) resources.getDimension( + R.dimen.contact_icon_view_large_size); + break; + case SMALL_ICON_SIZE_ID: + mIconSize = (int) resources.getDimension( + R.dimen.contact_icon_view_small_size); + break; + default: + // For the compiler, something has to be set even with the assert. + mIconSize = 0; + Assert.fail("Unsupported ContactIconView icon size attribute"); + } + mColorPressedId = resources.getColor(R.color.contact_avatar_pressed_color); + + setImage(null); + a.recycle(); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { + setColorFilter(mColorPressedId); + } else { + clearColorFilter(); + } + return super.onTouchEvent(event); + } + + /** + * Method which allows the automatic hookup of a click handler when the Uri is changed + */ + public void setImageClickHandlerDisabled(final boolean isHandlerDisabled) { + mDisableClickHandler = isHandlerDisabled; + setOnClickListener(null); + setClickable(false); + } + + /** + * A convenience method that sets the URI of the contact icon by creating a new image request. + */ + public void setImageResourceUri(final Uri uri) { + setImageResourceUri(uri, 0, null, null); + } + + public void setImageResourceUri(final Uri uri, final long contactId, + final String contactLookupKey, final String normalizedDestination) { + if (uri == null) { + setImageResourceId(null); + } else { + final String avatarType = AvatarUriUtil.getAvatarType(uri); + if (AvatarUriUtil.TYPE_GROUP_URI.equals(avatarType)) { + setImageResourceId(new AvatarGroupRequestDescriptor(uri, mIconSize, mIconSize)); + } else { + setImageResourceId(new AvatarRequestDescriptor(uri, mIconSize, mIconSize)); + } + } + + mContactId = contactId; + mContactLookupKey = contactLookupKey; + mNormalizedDestination = normalizedDestination; + mAvatarUri = uri; + + maybeInitializeOnClickListener(); + } + + protected void maybeInitializeOnClickListener() { + if ((mContactId > ParticipantData.PARTICIPANT_CONTACT_ID_NOT_RESOLVED + && !TextUtils.isEmpty(mContactLookupKey)) || + !TextUtils.isEmpty(mNormalizedDestination)) { + if (!mDisableClickHandler) { + setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(final View view) { + ContactUtil.showOrAddContact(view, mContactId, mContactLookupKey, + mAvatarUri, mNormalizedDestination); + } + }); + } + } else { + // This should happen when the phone number is not in the user's contacts or it is a + // group conversation, group conversations don't have contact phone numbers. If this + // is the case then absorb the click to prevent propagation. + setOnClickListener(null); + } + } +} |