MultiSelectEmailAddressesListAdapter.java revision ff6f1bb6782fe92b8745ef4acb6c622fef3d0cbc
1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.contacts.list;
17
18import android.content.ContentUris;
19import android.content.Context;
20import android.content.CursorLoader;
21import android.database.Cursor;
22import android.net.Uri;
23import android.net.Uri.Builder;
24import android.os.Bundle;
25import android.provider.ContactsContract;
26import android.text.TextUtils;
27import android.view.View;
28import android.view.ViewGroup;
29
30import android.provider.ContactsContract.CommonDataKinds.Email;
31
32import com.android.contacts.common.list.ContactListItemView;
33import com.android.contacts.common.list.MultiSelectEntryContactListAdapter;
34import com.android.contacts.common.preference.ContactsPreferences;
35import com.android.contacts.group.GroupUtil;
36
37/** Email addresses multi-select cursor adapter. */
38public class MultiSelectEmailAddressesListAdapter extends MultiSelectEntryContactListAdapter {
39
40    protected static class EmailQuery {
41        public static final String[] PROJECTION_PRIMARY = new String[] {
42                Email._ID,                          // 0
43                Email.TYPE,                         // 1
44                Email.LABEL,                        // 2
45                Email.ADDRESS,                      // 3
46                Email.CONTACT_ID,                   // 4
47                Email.LOOKUP_KEY,                   // 5
48                Email.PHOTO_ID,                     // 6
49                Email.DISPLAY_NAME_PRIMARY,         // 7
50                Email.PHOTO_THUMBNAIL_URI,          // 8
51        };
52
53        public static final String[] PROJECTION_ALTERNATIVE = new String[] {
54                Email._ID,                          // 0
55                Email.TYPE,                         // 1
56                Email.LABEL,                        // 2
57                Email.ADDRESS,                      // 3
58                Email.CONTACT_ID,                   // 4
59                Email.LOOKUP_KEY,                   // 5
60                Email.PHOTO_ID,                     // 6
61                Email.DISPLAY_NAME_ALTERNATIVE,     // 7
62                Email.PHOTO_THUMBNAIL_URI,          // 8
63        };
64
65        public static final int EMAIL_ID                = 0;
66        public static final int EMAIL_TYPE              = 1;
67        public static final int EMAIL_LABEL             = 2;
68        public static final int EMAIL_ADDRESS           = 3;
69        public static final int CONTACT_ID              = 4;
70        public static final int LOOKUP_KEY              = 5;
71        public static final int PHOTO_ID                = 6;
72        public static final int DISPLAY_NAME            = 7;
73        public static final int PHOTO_URI               = 8;
74    }
75
76    private final CharSequence mUnknownNameText;
77    private long[] mContactIdsFilter = null;
78
79    public MultiSelectEmailAddressesListAdapter(Context context) {
80        super(context, EmailQuery.EMAIL_ID);
81
82        mUnknownNameText = context.getText(android.R.string.unknownName);
83    }
84
85    public void setArguments(Bundle bundle) {
86        mContactIdsFilter = bundle.getLongArray(UiIntentActions.LIST_CONTACTS);
87    }
88
89    @Override
90    public void configureLoader(CursorLoader loader, long directoryId) {
91        final Builder builder;
92        if (isSearchMode()) {
93            builder = Email.CONTENT_FILTER_URI.buildUpon();
94            final String query = getQueryString();
95            builder.appendPath(TextUtils.isEmpty(query) ? "" : query);
96        } else {
97            builder = Email.CONTENT_URI.buildUpon();
98            if (isSectionHeaderDisplayEnabled()) {
99                builder.appendQueryParameter(Email.EXTRA_ADDRESS_BOOK_INDEX, "true");
100            }
101        }
102        builder.appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
103                String.valueOf(directoryId));
104        loader.setUri(builder.build());
105
106        if (mContactIdsFilter != null) {
107            loader.setSelection(ContactsContract.Data.CONTACT_ID
108                    + " IN (" + GroupUtil.convertArrayToString(mContactIdsFilter) + ")");
109        }
110
111        if (getContactNameDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY) {
112            loader.setProjection(EmailQuery.PROJECTION_PRIMARY);
113        } else {
114            loader.setProjection(EmailQuery.PROJECTION_ALTERNATIVE);
115        }
116
117        if (getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY) {
118            loader.setSortOrder(Email.SORT_KEY_PRIMARY);
119        } else {
120            loader.setSortOrder(Email.SORT_KEY_ALTERNATIVE);
121        }
122    }
123
124    @Override
125    public String getContactDisplayName(int position) {
126        return ((Cursor) getItem(position)).getString(EmailQuery.DISPLAY_NAME);
127    }
128
129    /**
130     * Builds a {@link Data#CONTENT_URI} for the current cursor position.
131     */
132    public Uri getDataUri(int position) {
133        final long id = ((Cursor) getItem(position)).getLong(EmailQuery.EMAIL_ID);
134        return ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, id);
135    }
136
137    @Override
138    protected ContactListItemView newView(
139            Context context, int partition, Cursor cursor, int position, ViewGroup parent) {
140        final ContactListItemView view = super.newView(context, partition, cursor, position, parent);
141        view.setUnknownNameText(mUnknownNameText);
142        view.setQuickContactEnabled(isQuickContactEnabled());
143        return view;
144    }
145
146    @Override
147    protected void bindView(View itemView, int partition, Cursor cursor, int position) {
148        super.bindView(itemView, partition, cursor, position);
149        final ContactListItemView view = (ContactListItemView)itemView;
150
151        cursor.moveToPosition(position);
152        boolean isFirstEntry = true;
153        final long currentContactId = cursor.getLong(EmailQuery.CONTACT_ID);
154        if (cursor.moveToPrevious() && !cursor.isBeforeFirst()) {
155            final long previousContactId = cursor.getLong(EmailQuery.CONTACT_ID);
156            if (currentContactId == previousContactId) {
157                isFirstEntry = false;
158            }
159        }
160        cursor.moveToPosition(position);
161
162        bindViewId(view, cursor, EmailQuery.EMAIL_ID);
163        bindSectionHeaderAndDivider(view, position);
164        if (isFirstEntry) {
165            bindName(view, cursor);
166            bindQuickContact(view, partition, cursor, EmailQuery.PHOTO_ID,
167                    EmailQuery.PHOTO_URI, EmailQuery.CONTACT_ID,
168                    EmailQuery.LOOKUP_KEY, EmailQuery.DISPLAY_NAME);
169        } else {
170            unbindName(view);
171            view.removePhotoView(true, false);
172        }
173        bindEmailAddress(view, cursor);
174    }
175
176    protected void unbindName(final ContactListItemView view) {
177        view.hideDisplayName();
178    }
179
180    protected void bindEmailAddress(ContactListItemView view, Cursor cursor) {
181        CharSequence label = null;
182        if (!cursor.isNull(EmailQuery.EMAIL_TYPE)) {
183            final int type = cursor.getInt(EmailQuery.EMAIL_TYPE);
184            final String customLabel = cursor.getString(EmailQuery.EMAIL_LABEL);
185
186            // TODO cache
187            label = Email.getTypeLabel(getContext().getResources(), type, customLabel);
188        }
189        view.setLabel(label);
190        view.showData(cursor, EmailQuery.EMAIL_ADDRESS);
191    }
192
193    protected void bindSectionHeaderAndDivider(final ContactListItemView view, int position) {
194        final int section = getSectionForPosition(position);
195        if (getPositionForSection(section) == position) {
196            final String title = (String)getSections()[section];
197            view.setSectionHeader(title);
198        } else {
199            view.setSectionHeader(null);
200        }
201    }
202
203    protected void bindName(final ContactListItemView view, Cursor cursor) {
204        view.showDisplayName(cursor, EmailQuery.DISPLAY_NAME, getContactNameDisplayOrder());
205    }
206}