16e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov/*
26e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project
36e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov *
46e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
56e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * you may not use this file except in compliance with the License.
66e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * You may obtain a copy of the License at
76e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov *
86e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
96e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov *
106e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
116e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
126e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * See the License for the specific language governing permissions and
146e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * limitations under the License.
156e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov */
166e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikovpackage com.android.contacts.list;
176e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
18e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.content.Context;
193c46291ef057eaf7b7f8ca5971e59bebe734a660Jeff Hamiltonimport android.content.CursorLoader;
206e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikovimport android.database.Cursor;
21e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.net.Uri;
22e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.net.Uri.Builder;
23e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.provider.ContactsContract;
24e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.provider.ContactsContract.Contacts;
25e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.provider.ContactsContract.Contacts.AggregationSuggestions;
2623411b233966730de4e23d07edb871238cf891f2Dmitri Plotnikovimport android.provider.ContactsContract.Directory;
27e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.text.TextUtils;
286e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikovimport android.view.LayoutInflater;
296e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikovimport android.view.View;
306e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikovimport android.view.ViewGroup;
316e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikovimport android.widget.TextView;
326e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
33e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.R;
34a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ContactListAdapter;
35a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ContactListItemView;
36a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.DirectoryListLoader;
37c9bb2179ab321461f88f54d49e9d41f2f6b19fe3Yorke Leeimport com.android.contacts.common.preference.ContactsPreferences;
38e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
39e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovpublic class JoinContactListAdapter extends ContactListAdapter {
40e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
41e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    /** Maximum number of suggestions shown for joining aggregates */
42e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    private static final int MAX_SUGGESTIONS = 4;
43e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
44e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov    public static final int PARTITION_SUGGESTIONS = 0;
45a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa    public static final int PARTITION_ALL_CONTACTS = 1;
46e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov
47e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    private long mTargetContactId;
486e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
49e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    public JoinContactListAdapter(Context context) {
506e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov        super(context);
51e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov        setPinnedPartitionHeadersEnabled(true);
52e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        setSectionHeaderDisplayEnabled(true);
53e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov        setIndexedPartition(PARTITION_ALL_CONTACTS);
544d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikov        setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_NONE);
55e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov    }
56e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov
57e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov    @Override
58e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov    protected void addPartitions() {
59e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov        // Partition 0: suggestions
60e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov        addPartition(false, true);
61e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov
62a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa        // Partition 1: All contacts
63e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov        addPartition(createDefaultDirectoryPartition());
646e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    }
656e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
66e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    public void setTargetContactId(long targetContactId) {
67e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        this.mTargetContactId = targetContactId;
686e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    }
696e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
70e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    @Override
71d5061fe322880ee993ea18db331fbc1110ddc538Dmitri Plotnikov    public void configureLoader(CursorLoader cursorLoader, long directoryId) {
726da2a2d472d562443a70f3d6a84ff6546dfcbc01Daisuke Miyakawa        JoinContactLoader loader = (JoinContactLoader) cursorLoader;
73e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
74ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        final Builder builder = Contacts.CONTENT_URI.buildUpon();
75e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        builder.appendEncodedPath(String.valueOf(mTargetContactId));
76e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        builder.appendEncodedPath(AggregationSuggestions.CONTENT_DIRECTORY);
77e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
78ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        final String filter = getQueryString();
79e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        if (!TextUtils.isEmpty(filter)) {
80e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov            builder.appendEncodedPath(Uri.encode(filter));
81e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        }
82e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
83e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        builder.appendQueryParameter("limit", String.valueOf(MAX_SUGGESTIONS));
84e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
85e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        loader.setSuggestionUri(builder.build());
86e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
87e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        // TODO simplify projection
886da2a2d472d562443a70f3d6a84ff6546dfcbc01Daisuke Miyakawa        loader.setProjection(getProjection(false));
89ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        final Uri allContactsUri;
90ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        if (!TextUtils.isEmpty(filter)) {
91ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            allContactsUri = buildSectionIndexerUri(Contacts.CONTENT_FILTER_URI).buildUpon()
92ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa                .appendEncodedPath(Uri.encode(filter))
9323411b233966730de4e23d07edb871238cf891f2Dmitri Plotnikov                .appendQueryParameter(
9423411b233966730de4e23d07edb871238cf891f2Dmitri Plotnikov                        ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT))
9523411b233966730de4e23d07edb871238cf891f2Dmitri Plotnikov                .build();
96ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        } else {
97ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa            allContactsUri = buildSectionIndexerUri(Contacts.CONTENT_URI).buildUpon()
98ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa                .appendQueryParameter(
99ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa                        ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT))
100ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa                .build();
101ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        }
10223411b233966730de4e23d07edb871238cf891f2Dmitri Plotnikov        loader.setUri(allContactsUri);
10323411b233966730de4e23d07edb871238cf891f2Dmitri Plotnikov        loader.setSelection(Contacts._ID + "!=?");
104ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        loader.setSelectionArgs(new String[]{ String.valueOf(mTargetContactId) });
105c9bb2179ab321461f88f54d49e9d41f2f6b19fe3Yorke Lee        if (getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY) {
106e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov            loader.setSortOrder(Contacts.SORT_KEY_PRIMARY);
107e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov        } else {
108e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov            loader.setSortOrder(Contacts.SORT_KEY_ALTERNATIVE);
109e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        }
110e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    }
111e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
112e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    @Override
113e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    public boolean isEmpty() {
114e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        return false;
115e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    }
116e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
1176e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    public void setSuggestionsCursor(Cursor cursor) {
118e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov        changeCursor(PARTITION_SUGGESTIONS, cursor);
119e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    }
120e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
1216e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    @Override
1226e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    public void changeCursor(Cursor cursor) {
123e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov        changeCursor(PARTITION_ALL_CONTACTS, cursor);
1246e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    }
125e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
1266e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    @Override
127e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    public void configureDefaultPartition(boolean showIfEmpty, boolean hasHeader) {
128e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov         // Don't change default partition parameters from these defaults
129e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov        super.configureDefaultPartition(false, true);
130e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    }
131e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov
132e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    @Override
1332475ac851b5d8e6d1cc19c53d04163630be490a0Dmitri Plotnikov    public int getViewTypeCount() {
134ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa        return super.getViewTypeCount();
1356e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    }
1366e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
137e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    @Override
1382475ac851b5d8e6d1cc19c53d04163630be490a0Dmitri Plotnikov    public int getItemViewType(int partition, int position) {
139e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov        return super.getItemViewType(partition, position);
140e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    }
141e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov
142e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov    @Override
143e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov    protected View newHeaderView(Context context, int partition, Cursor cursor,
144e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov            ViewGroup parent) {
145e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov        switch (partition) {
146e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov            case PARTITION_SUGGESTIONS: {
147a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                View view = inflate(R.layout.join_contact_picker_section_header, parent);
148d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov                ((TextView) view.findViewById(R.id.text)).setText(
149d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov                        R.string.separatorJoinAggregateSuggestions);
150d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov                return view;
151e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov            }
152e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov            case PARTITION_ALL_CONTACTS: {
153a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa                View view = inflate(R.layout.join_contact_picker_section_header, parent);
154d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov                ((TextView) view.findViewById(R.id.text)).setText(
155d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov                        R.string.separatorJoinAggregateAll);
156d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov                return view;
157e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov            }
1586e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov        }
1596e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
160e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov        return null;
1616e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    }
1626e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
1636e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    @Override
164e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    protected void bindHeaderView(View view, int partitionIndex, Cursor cursor) {
165e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov        // Header views are static - nothing needs to be bound
166e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    }
167e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov
168e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov    @Override
169551da17c65c434dae14365888996f9157068d800Andrew Lee    protected ContactListItemView newView(
170551da17c65c434dae14365888996f9157068d800Andrew Lee            Context context, int partition, Cursor cursor, int position, ViewGroup parent) {
171e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov        switch (partition) {
172e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov            case PARTITION_SUGGESTIONS:
173e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov            case PARTITION_ALL_CONTACTS:
174e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov                return super.newView(context, partition, cursor, position, parent);
1756e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov        }
176e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov        return null;
1776e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    }
1786e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
179e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov    private View inflate(int layoutId, ViewGroup parent) {
180e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov        return LayoutInflater.from(getContext()).inflate(layoutId, parent, false);
1816e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    }
1826e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
1836e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    @Override
184e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov    protected void bindView(View itemView, int partition, Cursor cursor, int position) {
185c9e810710a7624d645e33ec22e5fb90e30c7780bBrian Attwell        super.bindView(itemView, partition, cursor, position);
186e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov        switch (partition) {
187e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov            case PARTITION_SUGGESTIONS: {
188ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa                final ContactListItemView view = (ContactListItemView) itemView;
189d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov                view.setSectionHeader(null);
1901228c817c5b4850a1ea52a95a860fe6a329462b1Dmitri Plotnikov                bindPhoto(view, partition, cursor);
19156151b82c3dac3908ac8776a2a71f107fb4ecdbcBrian Attwell                bindNameAndViewId(view, cursor);
192e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov                break;
193e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov            }
194e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov            case PARTITION_ALL_CONTACTS: {
195ecd392b81d65a5dd5511b2f96bbedfb5b8157ae7Daisuke Miyakawa                final ContactListItemView view = (ContactListItemView) itemView;
196ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson                bindSectionHeaderAndDivider(view, position, cursor);
1971228c817c5b4850a1ea52a95a860fe6a329462b1Dmitri Plotnikov                bindPhoto(view, partition, cursor);
19856151b82c3dac3908ac8776a2a71f107fb4ecdbcBrian Attwell                bindNameAndViewId(view, cursor);
199e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov                break;
2006e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov            }
2016e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov        }
2026e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    }
2036e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov
204e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov    @Override
2058773bcb491d18e88b4e3d1f9cf7c57f6bc8e69edDmitri Plotnikov    public Uri getContactUri(int partitionIndex, Cursor cursor) {
206ed90ea54323f212d87b27b04d7d627192afa6665Daisuke Miyakawa        long contactId = cursor.getLong(ContactQuery.CONTACT_ID);
207ed90ea54323f212d87b27b04d7d627192afa6665Daisuke Miyakawa        String lookupKey = cursor.getString(ContactQuery.CONTACT_LOOKUP_KEY);
208e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov        return Contacts.getLookupUri(contactId, lookupKey);
2096e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov    }
210e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov}
211