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