DropdownChipLayouter.java revision 4db8cccf3332ad7c6fb1915f9f0f169953c3953a
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 } 115b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin break; 116b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin case RECIPIENT_ALTERNATES: 117b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin if (position != 0) { 118b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin displayName = null; 119b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin showImage = false; 120b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 121b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin break; 122b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin case SINGLE_RECIPIENT: 123b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin destination = Rfc822Tokenizer.tokenize(entry.getDestination())[0].getAddress(); 124b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin destinationType = null; 125b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 126b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 127b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin // Bind the information to the view 128b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin bindTextToView(displayName, viewHolder.displayNameView); 129b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin bindTextToView(destination, viewHolder.destinationView); 130b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin bindTextToView(destinationType, viewHolder.destinationTypeView); 131b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin bindIconToView(showImage, entry, viewHolder.imageView, type); 1324db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao bindDrawableToDeleteView(deleteDrawable, viewHolder.deleteView); 133b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 134b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return itemView; 135b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 136b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 137b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 1384ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao * Returns a new view with {@link #getItemLayoutResId(AdapterType)}. 139b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 1404ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao public View newView(AdapterType type) { 1414ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao return mInflater.inflate(getItemLayoutResId(type), null); 142b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 143b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 144b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 145b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Returns the same view, or inflates a new one if the given view was null. 146b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 147b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin protected View reuseOrInflateView(View convertView, ViewGroup parent, AdapterType type) { 1484ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao int itemLayout = getItemLayoutResId(type); 149b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin switch (type) { 150b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin case BASE_RECIPIENT: 151b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin case RECIPIENT_ALTERNATES: 152b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin break; 153b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin case SINGLE_RECIPIENT: 1544ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao itemLayout = getAlternateItemLayoutResId(type); 155b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin break; 156b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 157b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return convertView != null ? convertView : mInflater.inflate(itemLayout, parent, false); 158b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 159b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 160b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 161b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Binds the text to the given text view. If the text was null, hides the text view. 162b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 163b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin protected void bindTextToView(CharSequence text, TextView view) { 164b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin if (view == null) { 165b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return; 166b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 167b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 168b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin if (text != null) { 169b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin view.setText(text); 170b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin view.setVisibility(View.VISIBLE); 171b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } else { 172b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin view.setVisibility(View.GONE); 173b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 174b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 175b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 176b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 177b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Binds the avatar icon to the image view. If we don't want to show the image, hides the 178b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * image view. 179b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 180b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin protected void bindIconToView(boolean showImage, RecipientEntry entry, ImageView view, 181b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin AdapterType type) { 182b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin if (view == null) { 183b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return; 184b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 185b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 186b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin if (showImage) { 187b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin switch (type) { 188b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin case BASE_RECIPIENT: 189b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin byte[] photoBytes = entry.getPhotoBytes(); 190b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin if (photoBytes != null && photoBytes.length > 0) { 191b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin final Bitmap photo = BitmapFactory.decodeByteArray(photoBytes, 0, 192b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin photoBytes.length); 193b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin view.setImageBitmap(photo); 194b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } else { 195b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin view.setImageResource(getDefaultPhotoResId()); 196b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 197b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin break; 198b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin case RECIPIENT_ALTERNATES: 199b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin Uri thumbnailUri = entry.getPhotoThumbnailUri(); 200b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin if (thumbnailUri != null) { 201b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin // TODO: see if this needs to be done outside the main thread 202b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin // as it may be too slow to get immediately. 2037a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy view.setImageURI(thumbnailUri); 204b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } else { 205b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin view.setImageResource(getDefaultPhotoResId()); 206b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 207b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin break; 208b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin case SINGLE_RECIPIENT: 209b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin default: 210b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin break; 211b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 212b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin view.setVisibility(View.VISIBLE); 213b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } else { 214b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin view.setVisibility(View.GONE); 215b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 216b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 217b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 2184db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao protected void bindDrawableToDeleteView(final StateListDrawable drawable, ImageView view) { 2194db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao if (view == null) { 2204db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao return; 2214db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao } 2224db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao if (drawable == null) { 2234db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao view.setVisibility(View.GONE); 2244db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao } 2254db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao 2264db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao view.setImageDrawable(drawable); 2274db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao if (mDeleteListener != null) { 2284db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao view.setOnClickListener(new View.OnClickListener() { 2294db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao @Override 2304db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao public void onClick(View view) { 2314db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao if (drawable.getCurrent() != null) { 2324db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao mDeleteListener.onChipDelete(); 2334db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao } 2344db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao } 2354db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao }); 2364db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao } 2374db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao } 2384db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao 239b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin protected CharSequence getDestinationType(RecipientEntry entry) { 240b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return mQuery.getTypeLabel(mContext.getResources(), entry.getDestinationType(), 241b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin entry.getDestinationLabel()).toString().toUpperCase(); 242b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 243b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 244b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 245b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Returns a layout id for each item inside auto-complete list. 246b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * 247b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Each View must contain two TextViews (for display name and destination) and one ImageView 248b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * (for photo). Ids for those should be available via {@link #getDisplayNameResId()}, 249b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * {@link #getDestinationResId()}, and {@link #getPhotoResId()}. 250b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 2514ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao protected @LayoutRes int getItemLayoutResId(AdapterType type) { 2524ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao switch (type) { 2534ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao case BASE_RECIPIENT: 2544ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao return R.layout.chips_autocomplete_recipient_dropdown_item; 2554ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao case RECIPIENT_ALTERNATES: 2564ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao return R.layout.chips_recipient_dropdown_item; 2574ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao default: 2584ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao return R.layout.chips_recipient_dropdown_item; 2594ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao } 260b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 261b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 262b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 263b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Returns a layout id for each item inside alternate auto-complete list. 264b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * 265b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Each View must contain two TextViews (for display name and destination) and one ImageView 266b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * (for photo). Ids for those should be available via {@link #getDisplayNameResId()}, 267b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * {@link #getDestinationResId()}, and {@link #getPhotoResId()}. 268b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 2694ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao protected @LayoutRes int getAlternateItemLayoutResId(AdapterType type) { 2704ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao switch (type) { 2714ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao case BASE_RECIPIENT: 2724ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao return R.layout.chips_autocomplete_recipient_dropdown_item; 2734ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao case RECIPIENT_ALTERNATES: 2744ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao return R.layout.chips_recipient_dropdown_item; 2754ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao default: 2764ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao return R.layout.chips_recipient_dropdown_item; 2774ddcdaed9ef5ea83910a0513e87538130270e2e4Jin Cao } 278b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 279b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 280b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 281b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Returns a resource ID representing an image which should be shown when ther's no relevant 282b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * photo is available. 283b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 2844db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao protected @DrawableRes int getDefaultPhotoResId() { 285b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return R.drawable.ic_contact_picture; 286b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 287b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 288b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 289b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Returns an id for TextView in an item View for showing a display name. By default 290b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * {@link android.R.id#title} is returned. 291b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 2924db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao protected @IdRes int getDisplayNameResId() { 293b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return android.R.id.title; 294b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 295b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 296b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 297b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Returns an id for TextView in an item View for showing a destination 298b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * (an email address or a phone number). 299b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * By default {@link android.R.id#text1} is returned. 300b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 3014db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao protected @IdRes int getDestinationResId() { 302b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return android.R.id.text1; 303b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 304b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 305b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 306b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Returns an id for TextView in an item View for showing the type of the destination. 307b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * By default {@link android.R.id#text2} is returned. 308b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 3094db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao protected @IdRes int getDestinationTypeResId() { 310b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return android.R.id.text2; 311b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 312b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 313b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 314b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * Returns an id for ImageView in an item View for showing photo image for a person. In default 315b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * {@link android.R.id#icon} is returned. 316b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 3174db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao protected @IdRes int getPhotoResId() { 318b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin return android.R.id.icon; 319b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 320b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 321b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin /** 3224db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao * Returns an id for ImageView in an item View for showing the delete button. In default 3234db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao * {@link android.R.id#icon1} is returned. 3244db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao */ 3254db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao protected @IdRes int getDeleteResId() { return android.R.id.icon1; } 3264db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao 3274db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao /** 328b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * A holder class the view. Uses the getters in DropdownChipLayouter to find the id of the 329b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * corresponding views. 330b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */ 331b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin protected class ViewHolder { 332b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin public final TextView displayNameView; 333b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin public final TextView destinationView; 334b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin public final TextView destinationTypeView; 335b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin public final ImageView imageView; 3364db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao public final ImageView deleteView; 337b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin 338b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin public ViewHolder(View view) { 339b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin displayNameView = (TextView) view.findViewById(getDisplayNameResId()); 340b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin destinationView = (TextView) view.findViewById(getDestinationResId()); 341b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin destinationTypeView = (TextView) view.findViewById(getDestinationTypeResId()); 342b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin imageView = (ImageView) view.findViewById(getPhotoResId()); 3434db8cccf3332ad7c6fb1915f9f0f169953c3953aJin Cao deleteView = (ImageView) view.findViewById(getDeleteResId()); 344b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 345b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin } 346b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin} 347