DropdownChipLayouter.java revision b58c9a621a250c6119be2d5a77164b940a8559b0
1b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linpackage com.android.ex.chips; 2b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 3b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.content.Context; 4b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.graphics.Bitmap; 5b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.graphics.BitmapFactory; 64db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Caoimport android.graphics.drawable.StateListDrawable; 7b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.net.Uri; 84db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Caoimport android.support.annotation.DrawableRes; 94db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Caoimport android.support.annotation.IdRes; 104ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Caoimport android.support.annotation.LayoutRes; 11b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.text.TextUtils; 12b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.text.util.Rfc822Tokenizer; 13b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.view.LayoutInflater; 14b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.view.View; 15b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.view.ViewGroup; 16b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.widget.ImageView; 17b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.widget.TextView; 18b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 19b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport com.android.ex.chips.Queries.Query; 20b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 21b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin/** 22b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * A class that inflates and binds the views in the dropdown list from 23b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * RecipientEditTextView. 24b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 25b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linpublic class DropdownChipLayouter { 26b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 27b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * The type of adapter that is requesting a chip layout. 28b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 29b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin public enum AdapterType { 30b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin BASE_RECIPIENT, 31b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin RECIPIENT_ALTERNATES, 32b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin SINGLE_RECIPIENT 33b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 34b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 354db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao public interface ChipDeleteListener { 364db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao void onChipDelete(); 374db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao } 384db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao 39b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin private final LayoutInflater mInflater; 40b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin private final Context mContext; 414db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao private ChipDeleteListener mDeleteListener; 42b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin private Query mQuery; 43b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 44b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin public DropdownChipLayouter(LayoutInflater inflater, Context context) { 454db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao this(inflater, context, null); 464db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao } 474db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao 484db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao public DropdownChipLayouter(LayoutInflater inflater, Context context, 494db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao ChipDeleteListener deleteListener) { 50b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin mInflater = inflater; 51b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin mContext = context; 524db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao mDeleteListener = deleteListener; 53b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 54b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 55b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin public void setQuery(Query query) { 56b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin mQuery = query; 57b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 58b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 594db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao public void setDeleteListener(ChipDeleteListener listener) { 604db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao mDeleteListener = listener; 614db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao } 624db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao 63b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 64b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 65b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Layouts and binds recipient information to the view. If convertView is null, inflates a new 66b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * view with getItemLaytout(). 67b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * 68b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * @param convertView The view to bind information to. 69b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * @param parent The parent to bind the view to if we inflate a new view. 70b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * @param entry The recipient entry to get information from. 71b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * @param position The position in the list. 72b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * @param type The adapter type that is requesting the bind. 73b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * @param constraint The constraint typed in the auto complete view. 74b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * 75b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * @return A view ready to be shown in the drop down list. 76b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 77b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin public View bindView(View convertView, ViewGroup parent, RecipientEntry entry, int position, 78b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin AdapterType type, String constraint) { 794db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao return bindView(convertView, parent, entry, position, type, constraint, null); 804db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao } 814db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao 824db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao /** 834db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao * See {@link #bindView(View, ViewGroup, RecipientEntry, int, AdapterType, String)} 844db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao * @param deleteDrawable 854db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao */ 864db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao public View bindView(View convertView, ViewGroup parent, RecipientEntry entry, int position, 874db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao AdapterType type, String constraint, StateListDrawable deleteDrawable) { 88b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin // Default to show all the information 89b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin String displayName = entry.getDisplayName(); 90b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin String destination = entry.getDestination(); 91b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin boolean showImage = true; 92b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin CharSequence destinationType = getDestinationType(entry); 93b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 94b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin final View itemView = reuseOrInflateView(convertView, parent, type); 95b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 96b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin final ViewHolder viewHolder = new ViewHolder(itemView); 97b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 98b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin // Hide some information depending on the entry type and adapter type 99b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin switch (type) { 100b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin case BASE_RECIPIENT: 101b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin if (TextUtils.isEmpty(displayName) || TextUtils.equals(displayName, destination)) { 102b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin displayName = destination; 103b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 104b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin // We only show the destination for secondary entries, so clear it only for the 105b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin // first level. 106b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin if (entry.isFirstLevel()) { 107b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin destination = null; 108b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 109b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 110b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 111b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin if (!entry.isFirstLevel()) { 112b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin displayName = null; 113b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin showImage = false; 114b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 115b58c9a621a250c6119be2d5a77164b940a8559b0Jin Cao 116b58c9a621a250c6119be2d5a77164b940a8559b0Jin Cao // For BASE_RECIPIENT set all top dividers except for the first one to be GONE. 117b58c9a621a250c6119be2d5a77164b940a8559b0Jin Cao if (viewHolder.topDivider != null) { 118b58c9a621a250c6119be2d5a77164b940a8559b0Jin Cao viewHolder.topDivider.setVisibility(position == 0 ? View.VISIBLE : View.GONE); 119b58c9a621a250c6119be2d5a77164b940a8559b0Jin Cao } 120b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin break; 121b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin case RECIPIENT_ALTERNATES: 122b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin if (position != 0) { 123b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin displayName = null; 124b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin showImage = false; 125b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 126b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin break; 127b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin case SINGLE_RECIPIENT: 128b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin destination = Rfc822Tokenizer.tokenize(entry.getDestination())[0].getAddress(); 129b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin destinationType = null; 130b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 131b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 132b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin // Bind the information to the view 133b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin bindTextToView(displayName, viewHolder.displayNameView); 134b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin bindTextToView(destination, viewHolder.destinationView); 135b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin bindTextToView(destinationType, viewHolder.destinationTypeView); 136b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin bindIconToView(showImage, entry, viewHolder.imageView, type); 1374db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao bindDrawableToDeleteView(deleteDrawable, viewHolder.deleteView); 138b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 139b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return itemView; 140b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 141b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 142b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 1434ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao * Returns a new view with {@link #getItemLayoutResId(AdapterType)}. 144b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 1454ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao public View newView(AdapterType type) { 1464ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao return mInflater.inflate(getItemLayoutResId(type), null); 147b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 148b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 149b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 150b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Returns the same view, or inflates a new one if the given view was null. 151b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 152b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin protected View reuseOrInflateView(View convertView, ViewGroup parent, AdapterType type) { 1534ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao int itemLayout = getItemLayoutResId(type); 154b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin switch (type) { 155b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin case BASE_RECIPIENT: 156b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin case RECIPIENT_ALTERNATES: 157b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin break; 158b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin case SINGLE_RECIPIENT: 1594ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao itemLayout = getAlternateItemLayoutResId(type); 160b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin break; 161b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 162b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return convertView != null ? convertView : mInflater.inflate(itemLayout, parent, false); 163b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 164b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 165b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 166b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Binds the text to the given text view. If the text was null, hides the text view. 167b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 168b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin protected void bindTextToView(CharSequence text, TextView view) { 169b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin if (view == null) { 170b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return; 171b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 172b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 173b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin if (text != null) { 174b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin view.setText(text); 175b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin view.setVisibility(View.VISIBLE); 176b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } else { 177b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin view.setVisibility(View.GONE); 178b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 179b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 180b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 181b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 182b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Binds the avatar icon to the image view. If we don't want to show the image, hides the 183b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * image view. 184b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 185b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin protected void bindIconToView(boolean showImage, RecipientEntry entry, ImageView view, 186b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin AdapterType type) { 187b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin if (view == null) { 188b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return; 189b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 190b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 191b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin if (showImage) { 192b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin switch (type) { 193b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin case BASE_RECIPIENT: 194b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin byte[] photoBytes = entry.getPhotoBytes(); 195b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin if (photoBytes != null && photoBytes.length > 0) { 196b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin final Bitmap photo = BitmapFactory.decodeByteArray(photoBytes, 0, 197b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin photoBytes.length); 198b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin view.setImageBitmap(photo); 199b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } else { 200b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin view.setImageResource(getDefaultPhotoResId()); 201b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 202b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin break; 203b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin case RECIPIENT_ALTERNATES: 204b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin Uri thumbnailUri = entry.getPhotoThumbnailUri(); 205b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin if (thumbnailUri != null) { 206b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin // TODO: see if this needs to be done outside the main thread 207b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin // as it may be too slow to get immediately. 2087a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy view.setImageURI(thumbnailUri); 209b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } else { 210b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin view.setImageResource(getDefaultPhotoResId()); 211b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 212b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin break; 213b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin case SINGLE_RECIPIENT: 214b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin default: 215b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin break; 216b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 217b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin view.setVisibility(View.VISIBLE); 218b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } else { 219b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin view.setVisibility(View.GONE); 220b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 221b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 222b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 2234db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao protected void bindDrawableToDeleteView(final StateListDrawable drawable, ImageView view) { 2244db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao if (view == null) { 2254db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao return; 2264db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao } 2274db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao if (drawable == null) { 2284db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao view.setVisibility(View.GONE); 2294db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao } 2304db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao 2314db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao view.setImageDrawable(drawable); 2324db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao if (mDeleteListener != null) { 2334db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao view.setOnClickListener(new View.OnClickListener() { 2344db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao @Override 2354db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao public void onClick(View view) { 2364db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao if (drawable.getCurrent() != null) { 2374db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao mDeleteListener.onChipDelete(); 2384db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao } 2394db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao } 2404db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao }); 2414db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao } 2424db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao } 2434db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao 244b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin protected CharSequence getDestinationType(RecipientEntry entry) { 245b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return mQuery.getTypeLabel(mContext.getResources(), entry.getDestinationType(), 246b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin entry.getDestinationLabel()).toString().toUpperCase(); 247b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 248b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 249b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 250b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Returns a layout id for each item inside auto-complete list. 251b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * 252b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Each View must contain two TextViews (for display name and destination) and one ImageView 253b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * (for photo). Ids for those should be available via {@link #getDisplayNameResId()}, 254b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * {@link #getDestinationResId()}, and {@link #getPhotoResId()}. 255b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 2564ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao protected @LayoutRes int getItemLayoutResId(AdapterType type) { 2574ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao switch (type) { 2584ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao case BASE_RECIPIENT: 2594ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao return R.layout.chips_autocomplete_recipient_dropdown_item; 2604ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao case RECIPIENT_ALTERNATES: 2614ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao return R.layout.chips_recipient_dropdown_item; 2624ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao default: 2634ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao return R.layout.chips_recipient_dropdown_item; 2644ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao } 265b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 266b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 267b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 268b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Returns a layout id for each item inside alternate auto-complete list. 269b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * 270b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Each View must contain two TextViews (for display name and destination) and one ImageView 271b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * (for photo). Ids for those should be available via {@link #getDisplayNameResId()}, 272b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * {@link #getDestinationResId()}, and {@link #getPhotoResId()}. 273b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 2744ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao protected @LayoutRes int getAlternateItemLayoutResId(AdapterType type) { 2754ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao switch (type) { 2764ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao case BASE_RECIPIENT: 2774ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao return R.layout.chips_autocomplete_recipient_dropdown_item; 2784ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao case RECIPIENT_ALTERNATES: 2794ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao return R.layout.chips_recipient_dropdown_item; 2804ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao default: 2814ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao return R.layout.chips_recipient_dropdown_item; 2824ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao } 283b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 284b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 285b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 286b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Returns a resource ID representing an image which should be shown when ther's no relevant 287b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * photo is available. 288b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 2894db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao protected @DrawableRes int getDefaultPhotoResId() { 290b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return R.drawable.ic_contact_picture; 291b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 292b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 293b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 294b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Returns an id for TextView in an item View for showing a display name. By default 295b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * {@link android.R.id#title} is returned. 296b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 2974db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao protected @IdRes int getDisplayNameResId() { 298b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return android.R.id.title; 299b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 300b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 301b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 302b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Returns an id for TextView in an item View for showing a destination 303b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * (an email address or a phone number). 304b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * By default {@link android.R.id#text1} is returned. 305b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 3064db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao protected @IdRes int getDestinationResId() { 307b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return android.R.id.text1; 308b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 309b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 310b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 311b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Returns an id for TextView in an item View for showing the type of the destination. 312b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * By default {@link android.R.id#text2} is returned. 313b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 3144db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao protected @IdRes int getDestinationTypeResId() { 315b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return android.R.id.text2; 316b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 317b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 318b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 319b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Returns an id for ImageView in an item View for showing photo image for a person. In default 320b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * {@link android.R.id#icon} is returned. 321b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 3224db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao protected @IdRes int getPhotoResId() { 323b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return android.R.id.icon; 324b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 325b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 326b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 3274db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao * Returns an id for ImageView in an item View for showing the delete button. In default 3284db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao * {@link android.R.id#icon1} is returned. 3294db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao */ 3304db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao protected @IdRes int getDeleteResId() { return android.R.id.icon1; } 3314db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao 3324db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao /** 333b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * A holder class the view. Uses the getters in DropdownChipLayouter to find the id of the 334b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * corresponding views. 335b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 336b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin protected class ViewHolder { 337b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin public final TextView displayNameView; 338b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin public final TextView destinationView; 339b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin public final TextView destinationTypeView; 340b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin public final ImageView imageView; 3414db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao public final ImageView deleteView; 342b58c9a621a250c6119be2d5a77164b940a8559b0Jin Cao public final View topDivider; 343b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 344b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin public ViewHolder(View view) { 345b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin displayNameView = (TextView) view.findViewById(getDisplayNameResId()); 346b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin destinationView = (TextView) view.findViewById(getDestinationResId()); 347b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin destinationTypeView = (TextView) view.findViewById(getDestinationTypeResId()); 348b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin imageView = (ImageView) view.findViewById(getPhotoResId()); 3494db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao deleteView = (ImageView) view.findViewById(getDeleteResId()); 350b58c9a621a250c6119be2d5a77164b940a8559b0Jin Cao topDivider = view.findViewById(R.id.chip_autocomplete_top_divider); 351b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 352b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 353b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin} 354