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