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 17 package com.android.messaging.datamodel.data; 18 19 import android.database.Cursor; 20 import android.net.Uri; 21 import android.provider.ContactsContract.DisplayNameSources; 22 23 import com.android.ex.chips.RecipientEntry; 24 25 import com.android.messaging.util.Assert; 26 import com.android.messaging.util.ContactRecipientEntryUtils; 27 import com.android.messaging.util.ContactUtil; 28 29 /** 30 * Data model object used to power ContactListItemViews, which may be displayed either in 31 * our contact list, or in the chips UI search drop down presented by ContactDropdownLayouter. 32 */ 33 public class ContactListItemData { 34 // Keeps the contact data in the form of RecipientEntry that RecipientEditTextView can 35 // directly use. 36 private RecipientEntry mRecipientEntry; 37 38 private CharSequence mStyledName; 39 private CharSequence mStyledDestination; 40 41 // If this contact is the first in the list for its first letter, then this will be the 42 // first letter, otherwise this is null. 43 private String mAlphabetHeader; 44 45 // Is the contact the only item in the list (happens when the user clicks on an 46 // existing chip for which we show full contact detail for the selected contact). 47 private boolean mSingleRecipient; 48 49 // Is the contact in managed profile. 50 private boolean mIsWorkContact; 51 52 /** 53 * Bind to a contact cursor in the contact list. 54 */ bind(final Cursor cursor, final String alphabetHeader)55 public void bind(final Cursor cursor, final String alphabetHeader) { 56 final long dataId = cursor.getLong(ContactUtil.INDEX_DATA_ID); 57 final long contactId = cursor.getLong(ContactUtil.INDEX_CONTACT_ID); 58 final String lookupKey = cursor.getString(ContactUtil.INDEX_LOOKUP_KEY); 59 final String displayName = cursor.getString(ContactUtil.INDEX_DISPLAY_NAME); 60 final String photoThumbnailUri = cursor.getString(ContactUtil.INDEX_PHOTO_URI); 61 final String destination = cursor.getString(ContactUtil.INDEX_PHONE_EMAIL); 62 final int destinationType = cursor.getInt(ContactUtil.INDEX_PHONE_EMAIL_TYPE); 63 final String destinationLabel = cursor.getString(ContactUtil.INDEX_PHONE_EMAIL_LABEL); 64 mStyledName = null; 65 mStyledDestination = null; 66 mAlphabetHeader = alphabetHeader; 67 mSingleRecipient = false; 68 69 // Check whether this contact is first level (i.e. whether it's the first entry of this 70 // contact in the contact list). 71 boolean isFirstLevel = true; 72 if (!cursor.isFirst() && cursor.moveToPrevious()) { 73 final long contactIdPrevious = cursor.getLong(ContactUtil.INDEX_CONTACT_ID); 74 if (contactId == contactIdPrevious) { 75 isFirstLevel = false; 76 } 77 cursor.moveToNext(); 78 } 79 80 mRecipientEntry = ContactUtil.createRecipientEntry(displayName, 81 DisplayNameSources.STRUCTURED_NAME, destination, destinationType, destinationLabel, 82 contactId, lookupKey, dataId, photoThumbnailUri, isFirstLevel); 83 84 mIsWorkContact = ContactUtil.isEnterpriseContactId(contactId); 85 } 86 87 /** 88 * Bind to a RecipientEntry produced by the chips text view in the search drop down, plus 89 * optional styled name & destination for showing bold search match. 90 */ bind(final RecipientEntry entry, final CharSequence styledName, final CharSequence styledDestination, final boolean singleRecipient, final boolean isWorkContact)91 public void bind(final RecipientEntry entry, final CharSequence styledName, 92 final CharSequence styledDestination, final boolean singleRecipient, 93 final boolean isWorkContact) { 94 Assert.isTrue(entry.isValid()); 95 mRecipientEntry = entry; 96 mStyledName = styledName; 97 mStyledDestination = styledDestination; 98 mAlphabetHeader = null; 99 mSingleRecipient = singleRecipient; 100 mIsWorkContact = isWorkContact; 101 } 102 getDisplayName()103 public CharSequence getDisplayName() { 104 final CharSequence displayName = mStyledName != null ? mStyledName : 105 ContactRecipientEntryUtils.getDisplayNameForContactList(mRecipientEntry); 106 return displayName == null ? "" : displayName; 107 } 108 getPhotoThumbnailUri()109 public Uri getPhotoThumbnailUri() { 110 return mRecipientEntry.getPhotoThumbnailUri() == null ? null : 111 mRecipientEntry.getPhotoThumbnailUri(); 112 } 113 getDestination()114 public CharSequence getDestination() { 115 final CharSequence destination = mStyledDestination != null ? 116 mStyledDestination : ContactRecipientEntryUtils.formatDestination(mRecipientEntry); 117 return destination == null ? "" : destination; 118 } 119 getDestinationType()120 public int getDestinationType() { 121 return mRecipientEntry.getDestinationType(); 122 } 123 getDestinationLabel()124 public String getDestinationLabel() { 125 return mRecipientEntry.getDestinationLabel(); 126 } 127 getContactId()128 public long getContactId() { 129 return mRecipientEntry.getContactId(); 130 } 131 getLookupKey()132 public String getLookupKey() { 133 return mRecipientEntry.getLookupKey(); 134 } 135 136 /** 137 * Returns if this item is "first-level," i.e. whether it's the first entry of the contact 138 * that it represents in the list. For example, if John Smith has 3 different phone numbers, 139 * then the first number is considered first-level, while the other two are considered 140 * second-level. 141 */ getIsFirstLevel()142 public boolean getIsFirstLevel() { 143 // Treat the item as first level if it's a top-level recipient entry, or if it's the only 144 // item in the list. 145 return mRecipientEntry.isFirstLevel() || mSingleRecipient; 146 } 147 148 /** 149 * Returns if this item is simple, i.e. it has only avatar and a display name with phone number 150 * embedded so we can hide everything else. 151 */ getIsSimpleContactItem()152 public boolean getIsSimpleContactItem() { 153 return ContactRecipientEntryUtils.isAvatarAndNumberOnlyContact(mRecipientEntry) || 154 ContactRecipientEntryUtils.isSendToDestinationContact(mRecipientEntry); 155 } 156 getAlphabetHeader()157 public String getAlphabetHeader() { 158 return mAlphabetHeader; 159 } 160 161 /** 162 * Returns a RecipientEntry instance readily usable by the RecipientEditTextView. 163 */ getRecipientEntry()164 public RecipientEntry getRecipientEntry() { 165 return mRecipientEntry; 166 } 167 168 /** 169 * @return whether the contact is in managed profile. 170 */ getIsWorkContact()171 public boolean getIsWorkContact() { 172 return mIsWorkContact; 173 } 174 } 175