| /* |
| * 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); |
| } |
| } |
| } |