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  */
16 package com.android.contacts.list;
17 
18 import android.content.ContentUris;
19 import android.content.Context;
20 import android.content.CursorLoader;
21 import android.database.Cursor;
22 import android.net.Uri;
23 import android.net.Uri.Builder;
24 import android.provider.ContactsContract;
25 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
26 import android.provider.ContactsContract.Data;
27 import android.view.View;
28 import android.view.ViewGroup;
29 
30 import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
31 import com.android.contacts.common.list.ContactEntryListAdapter;
32 import com.android.contacts.common.list.ContactListItemView;
33 import com.android.contacts.common.preference.ContactsPreferences;
34 
35 /**
36  * A cursor adapter for the {@link StructuredPostal#CONTENT_TYPE} content type.
37  */
38 public 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 
PostalAddressListAdapter(Context context)72     public PostalAddressListAdapter(Context context) {
73         super(context);
74 
75         mUnknownNameText = context.getText(android.R.string.unknownName);
76     }
77 
78     @Override
configureLoader(CursorLoader loader, long directoryId)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
getContactDisplayName(int position)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      */
getDataUri(int position)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
newView( Context context, int partition, Cursor cursor, int position, ViewGroup parent)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
bindView(View itemView, int partition, Cursor cursor, int position)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 
bindPostalAddress(ContactListItemView view, Cursor cursor)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 
bindSectionHeaderAndDivider(final ContactListItemView view, int position)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 
bindName(final ContactListItemView view, Cursor cursor)158     protected void bindName(final ContactListItemView view, Cursor cursor) {
159         view.showDisplayName(cursor, PostalQuery.POSTAL_DISPLAY_NAME, getContactNameDisplayOrder());
160     }
161 
bindPhoto(final ContactListItemView view, Cursor cursor)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