DropdownChipLayouter.java revision 7a4e67708498ec46c2e9b3bad69d3807d88c064e
1b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linpackage com.android.ex.chips;
2b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
3b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.content.Context;
4b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.graphics.Bitmap;
5b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.graphics.BitmapFactory;
6b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.net.Uri;
7b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.text.TextUtils;
8b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.text.util.Rfc822Tokenizer;
9b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.view.LayoutInflater;
10b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.view.View;
11b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.view.ViewGroup;
12b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.widget.ImageView;
13b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport android.widget.TextView;
14b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
15b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linimport com.android.ex.chips.Queries.Query;
16b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
17b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin/**
18b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * A class that inflates and binds the views in the dropdown list from
19b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin * RecipientEditTextView.
20b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin */
21b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Linpublic class DropdownChipLayouter {
22b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    /**
23b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * The type of adapter that is requesting a chip layout.
24b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     */
25b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    public enum AdapterType {
26b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        BASE_RECIPIENT,
27b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        RECIPIENT_ALTERNATES,
28b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        SINGLE_RECIPIENT
29b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    }
30b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
31b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    private final LayoutInflater mInflater;
32b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    private final Context mContext;
33b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    private Query mQuery;
34b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
35b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    public DropdownChipLayouter(LayoutInflater inflater, Context context) {
36b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        mInflater = inflater;
37b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        mContext = context;
38b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    }
39b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
40b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    public void setQuery(Query query) {
41b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        mQuery = query;
42b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    }
43b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
44b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
45b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    /**
46b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * Layouts and binds recipient information to the view. If convertView is null, inflates a new
47b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * view with getItemLaytout().
48b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     *
49b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * @param convertView The view to bind information to.
50b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * @param parent The parent to bind the view to if we inflate a new view.
51b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * @param entry The recipient entry to get information from.
52b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * @param position The position in the list.
53b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * @param type The adapter type that is requesting the bind.
54b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * @param constraint The constraint typed in the auto complete view.
55b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     *
56b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * @return A view ready to be shown in the drop down list.
57b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     */
58b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    public View bindView(View convertView, ViewGroup parent, RecipientEntry entry, int position,
59b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        AdapterType type, String constraint) {
60b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        // Default to show all the information
61b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        String displayName = entry.getDisplayName();
62b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        String destination = entry.getDestination();
63b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        boolean showImage = true;
64b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        CharSequence destinationType = getDestinationType(entry);
65b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
66b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        final View itemView = reuseOrInflateView(convertView, parent, type);
67b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
68b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        final ViewHolder viewHolder = new ViewHolder(itemView);
69b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
70b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        // Hide some information depending on the entry type and adapter type
71b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        switch (type) {
72b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            case BASE_RECIPIENT:
73b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                if (TextUtils.isEmpty(displayName) || TextUtils.equals(displayName, destination)) {
74b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    displayName = destination;
75b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
76b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    // We only show the destination for secondary entries, so clear it only for the
77b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    // first level.
78b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    if (entry.isFirstLevel()) {
79b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                        destination = null;
80b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    }
81b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                }
82b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
83b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                if (!entry.isFirstLevel()) {
84b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    displayName = null;
85b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    showImage = false;
86b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                }
87b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                break;
88b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            case RECIPIENT_ALTERNATES:
89b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                if (position != 0) {
90b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    displayName = null;
91b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    showImage = false;
92b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                }
93b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                break;
94b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            case SINGLE_RECIPIENT:
95b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                destination = Rfc822Tokenizer.tokenize(entry.getDestination())[0].getAddress();
96b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                destinationType = null;
97b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        }
98b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
99b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        // Bind the information to the view
100b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        bindTextToView(displayName, viewHolder.displayNameView);
101b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        bindTextToView(destination, viewHolder.destinationView);
102b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        bindTextToView(destinationType, viewHolder.destinationTypeView);
103b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        bindIconToView(showImage, entry, viewHolder.imageView, type);
104b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
105b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        return itemView;
106b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    }
107b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
108b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    /**
109b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * Returns a new view with {@link #getItemLayoutResId()}.
110b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     */
111b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    public View newView() {
112b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        return mInflater.inflate(getItemLayoutResId(), null);
113b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    }
114b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
115b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    /**
116b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * Returns the same view, or inflates a new one if the given view was null.
117b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     */
118b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    protected View reuseOrInflateView(View convertView, ViewGroup parent, AdapterType type) {
119b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        int itemLayout = getItemLayoutResId();
120b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        switch (type) {
121b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            case BASE_RECIPIENT:
122b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            case RECIPIENT_ALTERNATES:
123b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                break;
124b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            case SINGLE_RECIPIENT:
125b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                itemLayout = getAlternateItemLayoutResId();
126b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                break;
127b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        }
128b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        return convertView != null ? convertView : mInflater.inflate(itemLayout, parent, false);
129b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    }
130b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
131b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    /**
132b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * Binds the text to the given text view. If the text was null, hides the text view.
133b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     */
134b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    protected void bindTextToView(CharSequence text, TextView view) {
135b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        if (view == null) {
136b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            return;
137b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        }
138b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
139b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        if (text != null) {
140b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            view.setText(text);
141b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            view.setVisibility(View.VISIBLE);
142b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        } else {
143b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            view.setVisibility(View.GONE);
144b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        }
145b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    }
146b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
147b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    /**
148b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * Binds the avatar icon to the image view. If we don't want to show the image, hides the
149b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * image view.
150b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     */
151b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    protected void bindIconToView(boolean showImage, RecipientEntry entry, ImageView view,
152b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        AdapterType type) {
153b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        if (view == null) {
154b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            return;
155b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        }
156b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
157b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        if (showImage) {
158b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            switch (type) {
159b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                case BASE_RECIPIENT:
160b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    byte[] photoBytes = entry.getPhotoBytes();
161b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    if (photoBytes != null && photoBytes.length > 0) {
162b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                        final Bitmap photo = BitmapFactory.decodeByteArray(photoBytes, 0,
163b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                            photoBytes.length);
164b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                        view.setImageBitmap(photo);
165b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    } else {
166b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                        view.setImageResource(getDefaultPhotoResId());
167b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    }
168b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    break;
169b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                case RECIPIENT_ALTERNATES:
170b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    Uri thumbnailUri = entry.getPhotoThumbnailUri();
171b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    if (thumbnailUri != null) {
172b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                        // TODO: see if this needs to be done outside the main thread
173b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                        // as it may be too slow to get immediately.
1747a4e67708498ec46c2e9b3bad69d3807d88c064eScott Kennedy                        view.setImageURI(thumbnailUri);
175b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    } else {
176b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                        view.setImageResource(getDefaultPhotoResId());
177b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    }
178b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    break;
179b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                case SINGLE_RECIPIENT:
180b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                default:
181b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin                    break;
182b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            }
183b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            view.setVisibility(View.VISIBLE);
184b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        } else {
185b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            view.setVisibility(View.GONE);
186b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        }
187b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    }
188b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
189b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    protected CharSequence getDestinationType(RecipientEntry entry) {
190b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        return mQuery.getTypeLabel(mContext.getResources(), entry.getDestinationType(),
191b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            entry.getDestinationLabel()).toString().toUpperCase();
192b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    }
193b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
194b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    /**
195b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * Returns a layout id for each item inside auto-complete list.
196b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     *
197b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * Each View must contain two TextViews (for display name and destination) and one ImageView
198b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * (for photo). Ids for those should be available via {@link #getDisplayNameResId()},
199b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * {@link #getDestinationResId()}, and {@link #getPhotoResId()}.
200b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     */
201b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    protected int getItemLayoutResId() {
202b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        return R.layout.chips_recipient_dropdown_item;
203b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    }
204b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
205b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    /**
206b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * Returns a layout id for each item inside alternate auto-complete list.
207b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     *
208b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * Each View must contain two TextViews (for display name and destination) and one ImageView
209b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * (for photo). Ids for those should be available via {@link #getDisplayNameResId()},
210b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * {@link #getDestinationResId()}, and {@link #getPhotoResId()}.
211b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     */
212b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    protected int getAlternateItemLayoutResId() {
213b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        return R.layout.chips_alternate_item;
214b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    }
215b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
216b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    /**
217b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * Returns a resource ID representing an image which should be shown when ther's no relevant
218b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * photo is available.
219b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     */
220b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    protected int getDefaultPhotoResId() {
221b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        return R.drawable.ic_contact_picture;
222b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    }
223b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
224b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    /**
225b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * Returns an id for TextView in an item View for showing a display name. By default
226b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * {@link android.R.id#title} is returned.
227b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     */
228b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    protected int getDisplayNameResId() {
229b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        return android.R.id.title;
230b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    }
231b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
232b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    /**
233b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * Returns an id for TextView in an item View for showing a destination
234b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * (an email address or a phone number).
235b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * By default {@link android.R.id#text1} is returned.
236b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     */
237b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    protected int getDestinationResId() {
238b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        return android.R.id.text1;
239b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    }
240b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
241b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    /**
242b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * Returns an id for TextView in an item View for showing the type of the destination.
243b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * By default {@link android.R.id#text2} is returned.
244b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     */
245b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    protected int getDestinationTypeResId() {
246b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        return android.R.id.text2;
247b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    }
248b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
249b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    /**
250b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * Returns an id for ImageView in an item View for showing photo image for a person. In default
251b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * {@link android.R.id#icon} is returned.
252b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     */
253b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    protected int getPhotoResId() {
254b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        return android.R.id.icon;
255b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    }
256b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
257b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    /**
258b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * A holder class the view. Uses the getters in DropdownChipLayouter to find the id of the
259b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     * corresponding views.
260b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin     */
261b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    protected class ViewHolder {
262b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        public final TextView displayNameView;
263b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        public final TextView destinationView;
264b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        public final TextView destinationTypeView;
265b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        public final ImageView imageView;
266b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin
267b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        public ViewHolder(View view) {
268b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            displayNameView = (TextView) view.findViewById(getDisplayNameResId());
269b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            destinationView = (TextView) view.findViewById(getDestinationResId());
270b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            destinationTypeView = (TextView) view.findViewById(getDestinationTypeResId());
271b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin            imageView = (ImageView) view.findViewById(getPhotoResId());
272b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin        }
273b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin    }
274b10d1c652d0416c284d9792fc9a0a92b3acd51caKevin Lin}
275