Home | History | Annotate | Download | only in contact
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.android.messaging.ui.contact;
     17 
     18 import android.content.Context;
     19 import android.database.Cursor;
     20 import android.net.Uri;
     21 import android.provider.ContactsContract.CommonDataKinds.Phone;
     22 import android.util.AttributeSet;
     23 import android.view.View;
     24 import android.view.View.OnClickListener;
     25 import android.widget.ImageView;
     26 import android.widget.LinearLayout;
     27 import android.widget.TextView;
     28 
     29 import com.android.ex.chips.RecipientEntry;
     30 import com.android.messaging.R;
     31 import com.android.messaging.datamodel.DataModel;
     32 import com.android.messaging.datamodel.data.ContactListItemData;
     33 import com.android.messaging.datamodel.data.ParticipantData;
     34 import com.android.messaging.ui.ContactIconView;
     35 import com.android.messaging.util.Assert;
     36 import com.android.messaging.util.AvatarUriUtil;
     37 import com.google.common.annotations.VisibleForTesting;
     38 
     39 /**
     40  * The view for a single entry in a contact list.
     41  */
     42 public class ContactListItemView extends LinearLayout implements OnClickListener {
     43     public interface HostInterface {
     44         void onContactListItemClicked(ContactListItemData item, ContactListItemView view);
     45         boolean isContactSelected(ContactListItemData item);
     46     }
     47 
     48     @VisibleForTesting
     49     final ContactListItemData mData;
     50     private TextView mContactNameTextView;
     51     private TextView mContactDetailsTextView;
     52     private TextView mContactDetailTypeTextView;
     53     private TextView mAlphabetHeaderTextView;
     54     private ContactIconView mContactIconView;
     55     private ImageView mContactCheckmarkView;
     56     private ImageView mWorkProfileIcon;
     57     private HostInterface mHostInterface;
     58     private boolean mShouldShowAlphabetHeader;
     59 
     60     public ContactListItemView(final Context context, final AttributeSet attrs) {
     61         super(context, attrs);
     62         mData = DataModel.get().createContactListItemData();
     63     }
     64 
     65     @Override
     66     protected void onFinishInflate () {
     67         mContactNameTextView = (TextView) findViewById(R.id.contact_name);
     68         mContactDetailsTextView = (TextView) findViewById(R.id.contact_details);
     69         mContactDetailTypeTextView = (TextView) findViewById(R.id.contact_detail_type);
     70         mAlphabetHeaderTextView = (TextView) findViewById(R.id.alphabet_header);
     71         mContactIconView = (ContactIconView) findViewById(R.id.contact_icon);
     72         mContactCheckmarkView = (ImageView) findViewById(R.id.contact_checkmark);
     73         mWorkProfileIcon = (ImageView) findViewById(R.id.work_profile_icon);
     74     }
     75 
     76     /**
     77      * Fills in the data associated with this view by binding to a contact cursor provided by
     78      * ContactUtil.
     79      * @param cursor the contact cursor.
     80      * @param hostInterface host interface to this view.
     81      * @param shouldShowAlphabetHeader whether an alphabetical header should shown on the side
     82      *        of this view. If {@code headerLabel} is empty, we will still leave space for it.
     83      * @param headerLabel the alphabetical header on the side of this view, if it should be shown.
     84      */
     85     public void bind(final Cursor cursor, final HostInterface hostInterface,
     86             final boolean shouldShowAlphabetHeader, final String headerLabel) {
     87         mData.bind(cursor, headerLabel);
     88         mHostInterface = hostInterface;
     89         mShouldShowAlphabetHeader = shouldShowAlphabetHeader;
     90         setOnClickListener(this);
     91         updateViewAppearance();
     92     }
     93 
     94     /**
     95      * Binds a RecipientEntry. This is used by the chips text view's dropdown layout.
     96      * @param recipientEntry the source RecipientEntry provided by ContactDropdownLayouter, which
     97      *        was in turn directly from one of the existing chips, or from filtered results
     98      *        generated by ContactRecipientAdapter.
     99      * @param styledName display name where the portion that matches the search text is bold.
    100      * @param styledDestination number where the portion that matches the search text is bold.
    101      * @param hostInterface host interface to this view.
    102      * @param isSingleRecipient whether this item is shown as the only line item in the single
    103      *        recipient drop down from the chips view. If this is the case, we always show the
    104      *        contact avatar even if it's not a first-level entry.
    105      * @param isWorkContact whether the contact is in managed profile.
    106      */
    107     public void bind(final RecipientEntry recipientEntry, final CharSequence styledName,
    108             final CharSequence styledDestination, final HostInterface hostInterface,
    109             final boolean isSingleRecipient, final boolean isWorkContact) {
    110         mData.bind(recipientEntry, styledName, styledDestination, isSingleRecipient, isWorkContact);
    111         mHostInterface = hostInterface;
    112         mShouldShowAlphabetHeader = false;
    113         updateViewAppearance();
    114     }
    115 
    116     private void updateViewAppearance() {
    117         mContactNameTextView.setText(mData.getDisplayName());
    118         mContactDetailsTextView.setText(mData.getDestination());
    119         mContactDetailTypeTextView.setText(Phone.getTypeLabel(getResources(),
    120                 mData.getDestinationType(), mData.getDestinationLabel()));
    121         final RecipientEntry recipientEntry = mData.getRecipientEntry();
    122         final String destinationString = String.valueOf(mData.getDestination());
    123         if (mData.getIsSimpleContactItem()) {
    124             // This is a special number-with-avatar type of contact (for unknown contact chips
    125             // and for direct "send to destination" item). In this case, make sure we only show
    126             // the display name (phone number) and the avatar and hide everything else.
    127             final Uri avatarUri = AvatarUriUtil.createAvatarUri(
    128                     ParticipantData.getFromRecipientEntry(recipientEntry));
    129             mContactIconView.setImageResourceUri(avatarUri, mData.getContactId(),
    130                     mData.getLookupKey(), destinationString);
    131             mContactIconView.setVisibility(VISIBLE);
    132             mContactCheckmarkView.setVisibility(GONE);
    133             mContactDetailTypeTextView.setVisibility(GONE);
    134             mContactDetailsTextView.setVisibility(GONE);
    135             mContactNameTextView.setVisibility(VISIBLE);
    136         } else if (mData.getIsFirstLevel()) {
    137             final Uri avatarUri = AvatarUriUtil.createAvatarUri(
    138                     ParticipantData.getFromRecipientEntry(recipientEntry));
    139             mContactIconView.setImageResourceUri(avatarUri, mData.getContactId(),
    140                     mData.getLookupKey(), destinationString);
    141             mContactIconView.setVisibility(VISIBLE);
    142             mContactNameTextView.setVisibility(VISIBLE);
    143             final boolean isSelected = mHostInterface.isContactSelected(mData);
    144             setSelected(isSelected);
    145             mContactCheckmarkView.setVisibility(isSelected ? VISIBLE : GONE);
    146             mContactDetailsTextView.setVisibility(VISIBLE);
    147             mContactDetailTypeTextView.setVisibility(VISIBLE);
    148         } else {
    149             mContactIconView.setImageResourceUri(null);
    150             mContactIconView.setVisibility(INVISIBLE);
    151             mContactNameTextView.setVisibility(GONE);
    152             final boolean isSelected = mHostInterface.isContactSelected(mData);
    153             setSelected(isSelected);
    154             mContactCheckmarkView.setVisibility(isSelected ? VISIBLE : GONE);
    155             mContactDetailsTextView.setVisibility(VISIBLE);
    156             mContactDetailTypeTextView.setVisibility(VISIBLE);
    157         }
    158         if (mData.getIsWorkContact()) {
    159             mWorkProfileIcon.setVisibility(VISIBLE);
    160         } else {
    161             mWorkProfileIcon.setVisibility(GONE);
    162         }
    163         if (mShouldShowAlphabetHeader) {
    164             mAlphabetHeaderTextView.setVisibility(VISIBLE);
    165             mAlphabetHeaderTextView.setText(mData.getAlphabetHeader());
    166         } else {
    167             mAlphabetHeaderTextView.setVisibility(GONE);
    168         }
    169     }
    170 
    171     /**
    172      * {@inheritDoc} from OnClickListener
    173      */
    174     @Override
    175     public void onClick(final View v) {
    176         Assert.isTrue(v == this);
    177         Assert.isTrue(mHostInterface != null);
    178         mHostInterface.onContactListItemClicked(mData, this);
    179     }
    180 
    181     public void setImageClickHandlerDisabled(final boolean isHandlerDisabled) {
    182         mContactIconView.setImageClickHandlerDisabled(isHandlerDisabled);
    183     }
    184 }
    185