1/*
2 * Copyright (C) 2010 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.provider.ContactsContract;
25import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
26import android.provider.ContactsContract.Data;
27import android.view.View;
28import android.view.ViewGroup;
29
30import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
31import com.android.contacts.common.list.ContactEntryListAdapter;
32import com.android.contacts.common.list.ContactListItemView;
33import com.android.contacts.common.preference.ContactsPreferences;
34
35/**
36 * A cursor adapter for the {@link StructuredPostal#CONTENT_TYPE} content type.
37 */
38public class PostalAddressListAdapter extends ContactEntryListAdapter {
39
40    protected static class PostalQuery {
41        private static final String[] PROJECTION_PRIMARY = new String[] {
42            StructuredPostal._ID,                       // 0
43            StructuredPostal.TYPE,                      // 1
44            StructuredPostal.LABEL,                     // 2
45            StructuredPostal.DATA,                      // 3
46            StructuredPostal.PHOTO_ID,                  // 4
47            StructuredPostal.LOOKUP_KEY,                // 5
48            StructuredPostal.DISPLAY_NAME_PRIMARY,      // 6
49        };
50
51        private static final String[] PROJECTION_ALTERNATIVE = new String[] {
52            StructuredPostal._ID,                       // 0
53            StructuredPostal.TYPE,                      // 1
54            StructuredPostal.LABEL,                     // 2
55            StructuredPostal.DATA,                      // 3
56            StructuredPostal.PHOTO_ID,                  // 4
57            StructuredPostal.LOOKUP_KEY,                // 5
58            StructuredPostal.DISPLAY_NAME_ALTERNATIVE,  // 6
59        };
60
61        public static final int POSTAL_ID           = 0;
62        public static final int POSTAL_TYPE         = 1;
63        public static final int POSTAL_LABEL        = 2;
64        public static final int POSTAL_ADDRESS      = 3;
65        public static final int POSTAL_PHOTO_ID     = 4;
66        public static final int POSTAL_LOOKUP_KEY   = 5;
67        public static final int POSTAL_DISPLAY_NAME = 6;
68    }
69
70    private final CharSequence mUnknownNameText;
71
72    public PostalAddressListAdapter(Context context) {
73        super(context);
74
75        mUnknownNameText = context.getText(android.R.string.unknownName);
76    }
77
78    @Override
79    public void configureLoader(CursorLoader loader, long directoryId) {
80        final Builder builder = StructuredPostal.CONTENT_URI.buildUpon()
81                .appendQueryParameter(ContactsContract.REMOVE_DUPLICATE_ENTRIES, "true");
82        if (isSectionHeaderDisplayEnabled()) {
83            builder.appendQueryParameter(StructuredPostal.EXTRA_ADDRESS_BOOK_INDEX, "true");
84        }
85        loader.setUri(builder.build());
86
87        if (getContactNameDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY) {
88            loader.setProjection(PostalQuery.PROJECTION_PRIMARY);
89        } else {
90            loader.setProjection(PostalQuery.PROJECTION_ALTERNATIVE);
91        }
92
93        if (getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY) {
94            loader.setSortOrder(StructuredPostal.SORT_KEY_PRIMARY);
95        } else {
96            loader.setSortOrder(StructuredPostal.SORT_KEY_ALTERNATIVE);
97        }
98    }
99
100    @Override
101    public String getContactDisplayName(int position) {
102        return ((Cursor) getItem(position)).getString(PostalQuery.POSTAL_DISPLAY_NAME);
103    }
104
105    /**
106     * Builds a {@link Data#CONTENT_URI} for the current cursor
107     * position.
108     */
109    public Uri getDataUri(int position) {
110        long id = ((Cursor)getItem(position)).getLong(PostalQuery.POSTAL_ID);
111        return ContentUris.withAppendedId(Data.CONTENT_URI, id);
112    }
113
114    @Override
115    protected ContactListItemView newView(
116            Context context, int partition, Cursor cursor, int position, ViewGroup parent) {
117        ContactListItemView view = super.newView(context, partition, cursor, position, parent);
118        view.setUnknownNameText(mUnknownNameText);
119        view.setQuickContactEnabled(isQuickContactEnabled());
120        view.setIsSectionHeaderEnabled(isSectionHeaderDisplayEnabled());
121        return view;
122    }
123
124    @Override
125    protected void bindView(View itemView, int partition, Cursor cursor, int position) {
126        super.bindView(itemView, partition, cursor, position);
127        ContactListItemView view = (ContactListItemView)itemView;
128        bindSectionHeaderAndDivider(view, position);
129        bindName(view, cursor);
130        bindViewId(view, cursor, PostalQuery.POSTAL_ID);
131        bindPhoto(view, cursor);
132        bindPostalAddress(view, cursor);
133    }
134
135    protected void bindPostalAddress(ContactListItemView view, Cursor cursor) {
136        CharSequence label = null;
137        if (!cursor.isNull(PostalQuery.POSTAL_TYPE)) {
138            final int type = cursor.getInt(PostalQuery.POSTAL_TYPE);
139            final String customLabel = cursor.getString(PostalQuery.POSTAL_LABEL);
140
141            // TODO cache
142            label = StructuredPostal.getTypeLabel(getContext().getResources(), type, customLabel);
143        }
144        view.setLabel(label);
145        view.showData(cursor, PostalQuery.POSTAL_ADDRESS);
146    }
147
148    protected void bindSectionHeaderAndDivider(final ContactListItemView view, int position) {
149        final int section = getSectionForPosition(position);
150        if (getPositionForSection(section) == position) {
151            String title = (String)getSections()[section];
152            view.setSectionHeader(title);
153        } else {
154            view.setSectionHeader(null);
155        }
156    }
157
158    protected void bindName(final ContactListItemView view, Cursor cursor) {
159        view.showDisplayName(cursor, PostalQuery.POSTAL_DISPLAY_NAME, getContactNameDisplayOrder());
160    }
161
162    protected void bindPhoto(final ContactListItemView view, Cursor cursor) {
163        long photoId = 0;
164        if (!cursor.isNull(PostalQuery.POSTAL_PHOTO_ID)) {
165            photoId = cursor.getLong(PostalQuery.POSTAL_PHOTO_ID);
166        }
167
168        DefaultImageRequest request = null;
169        if (photoId == 0) {
170            request = getDefaultImageRequestFromCursor(cursor, PostalQuery.POSTAL_DISPLAY_NAME,
171                    PostalQuery.POSTAL_LOOKUP_KEY);
172        }
173
174        getPhotoLoader().loadThumbnail(view.getPhotoView(), photoId, false, getCircularPhotos(),
175                request);
176    }
177//
178//    protected void bindSearchSnippet(final ContactListItemView view, Cursor cursor) {
179//        view.showSnippet(cursor, SUMMARY_SNIPPET_MIMETYPE_COLUMN_INDEX,
180//                SUMMARY_SNIPPET_DATA1_COLUMN_INDEX, SUMMARY_SNIPPET_DATA4_COLUMN_INDEX);
181//    }
182
183}
184