LegacyApiSupport.java revision a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0
1f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov/*
2f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project
3f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov *
4f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
5f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * you may not use this file except in compliance with the License.
6f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * You may obtain a copy of the License at
7f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov *
8f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
9f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov *
10f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
11f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
12f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * See the License for the specific language governing permissions and
14f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * limitations under the License
15f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov */
16f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovpackage com.android.providers.contacts;
17f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
18e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.DataColumns;
190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.ExtensionsColumns;
200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.GroupsColumns;
21e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.MimetypesColumns;
22e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.PhoneColumns;
23c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport com.android.providers.contacts.OpenHelper.RawContactsColumns;
24f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.Tables;
25f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
26c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.app.SearchManager;
27f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentUris;
28f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentValues;
29f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.Context;
30f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.UriMatcher;
31f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.Cursor;
32e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.database.DatabaseUtils;
33f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteDatabase;
34f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteQueryBuilder;
35f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteStatement;
36f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.net.Uri;
37f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract;
38e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.Contacts.ContactMethods;
39f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.Contacts.People;
40e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.Data;
410f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.Groups;
4270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikovimport android.provider.ContactsContract.Presence;
43c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract.RawContacts;
44e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email;
450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership;
46e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im;
47f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Note;
483cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization;
49e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone;
50c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo;
51f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName;
5267dde51ab932dc84d95a203b113989b13437f13dJeff Sharkeyimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
53c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.util.Log;
54f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
55f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport java.util.HashMap;
56f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
57d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikovpublic class LegacyApiSupport implements OpenHelper.Delegate {
58f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
59f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
60f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
61f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE = 1;
62f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE_ID = 2;
63f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE_UPDATE_CONTACT_TIME = 3;
643cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final int ORGANIZATIONS = 4;
653cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final int ORGANIZATIONS_ID = 5;
66e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_CONTACTMETHODS = 6;
67e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_CONTACTMETHODS_ID = 7;
68e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int CONTACTMETHODS = 8;
69e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int CONTACTMETHODS_ID = 9;
70e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_PHONES = 10;
71e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_PHONES_ID = 11;
72e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PHONES = 12;
73e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PHONES_ID = 13;
740f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int EXTENSIONS = 14;
750f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int EXTENSIONS_ID = 15;
760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_EXTENSIONS = 16;
770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_EXTENSIONS_ID = 17;
780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPS = 18;
790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPS_ID = 19;
800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPMEMBERSHIP = 20;
810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPMEMBERSHIP_ID = 21;
820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_GROUPMEMBERSHIP = 22;
830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_GROUPMEMBERSHIP_ID = 23;
84c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PEOPLE_PHOTO = 24;
85c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PHOTOS = 25;
86c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PHOTOS_ID = 26;
8770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    private static final int PRESENCE = 27;
8870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    private static final int PRESENCE_ID = 28;
89445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov    private static final int PEOPLE_FILTER = 29;
9033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov    private static final int DELETED_PEOPLE = 30;
9133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov    private static final int DELETED_GROUPS = 31;
92c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    private static final int SEARCH_SUGGESTIONS = 32;
93c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
9433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov
950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
96e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String PEOPLE_JOINS =
975ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            " LEFT OUTER JOIN data name ON (raw_contacts._id = name.raw_contact_id"
98e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = name.mimetype_id)"
99e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + StructuredName.CONTENT_ITEM_TYPE + "')"
1005ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data organization ON (raw_contacts._id = organization.raw_contact_id"
101e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = organization.mimetype_id)"
102e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Organization.CONTENT_ITEM_TYPE + "' AND organization.is_primary)"
1035ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data email ON (raw_contacts._id = email.raw_contact_id"
104e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = email.mimetype_id)"
105e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Email.CONTENT_ITEM_TYPE + "' AND email.is_primary)"
1065ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data note ON (raw_contacts._id = note.raw_contact_id"
107e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = note.mimetype_id)"
108e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Note.CONTENT_ITEM_TYPE + "')"
1095ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data phone ON (raw_contacts._id = phone.raw_contact_id"
110e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = phone.mimetype_id)"
111e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Phone.CONTENT_ITEM_TYPE + "' AND phone.is_primary)";
112e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
113d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    public static final String DATA_JOINS =
114d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            " JOIN mimetypes ON (mimetypes._id = data.mimetype_id)"
1155ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " JOIN raw_contacts ON (raw_contacts._id = data.raw_contact_id)"
116d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            + PEOPLE_JOINS;
117d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
11870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    public static final String PRESENCE_JOINS =
11970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            " LEFT OUTER JOIN presence ON ("
12070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            + " presence.presence_id = (SELECT max(presence_id) FROM presence"
1215ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " WHERE view_v1_people._id = presence.raw_contact_id))";
12270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
123e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String PHONETIC_NAME_SQL = "trim(trim("
124e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_GIVEN_NAME + ",' ')||' '||"
125e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_MIDDLE_NAME + ",' '))||' '||"
126e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_FAMILY_NAME + ",' ')) ";
127e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
128e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String CONTACT_METHOD_KIND_SQL =
129d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            "CAST ((CASE WHEN mimetype='" + Email.CONTENT_ITEM_TYPE + "'"
130e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                + " THEN " + android.provider.Contacts.KIND_EMAIL
131e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                + " ELSE"
132e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + " (CASE WHEN mimetype='" + Im.CONTENT_ITEM_TYPE +"'"
133e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " THEN " + android.provider.Contacts.KIND_IM
134e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " ELSE"
13567dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey                        + " (CASE WHEN mimetype='" + StructuredPostal.CONTENT_ITEM_TYPE + "'"
136e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " THEN "  + android.provider.Contacts.KIND_POSTAL
137e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " ELSE"
138e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                                + " NULL"
139e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " END)"
140e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " END)"
141d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                + " END) AS INTEGER)";
142f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
143f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public interface LegacyTables {
144d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String PEOPLE = "view_v1_people";
14570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        public static final String PEOPLE_JOIN_PRESENCE = "view_v1_people" + PRESENCE_JOINS;
146d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String GROUPS = "view_v1_groups";
147d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String ORGANIZATIONS = "view_v1_organizations";
148d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String CONTACT_METHODS = "view_v1_contact_methods";
149d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String PHONES = "view_v1_phones";
150d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String EXTENSIONS = "view_v1_extensions";
151d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String GROUP_MEMBERSHIP = "view_v1_group_membership";
152c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String PHOTOS = "view_v1_photos";
15370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        public static final String PRESENCE_JOIN_CONTACTS = Tables.PRESENCE +
1545ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " LEFT OUTER JOIN " + Tables.RAW_CONTACTS
1555ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                + " ON (" + Tables.PRESENCE + "." + Presence.RAW_CONTACT_ID + "="
1566cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContactsColumns.CONCRETE_ID + ")";
157f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
158f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
159e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] ORGANIZATION_MIME_TYPES = new String[] {
160e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Organization.CONTENT_ITEM_TYPE
161e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
162e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
163e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] CONTACT_METHOD_MIME_TYPES = new String[] {
164e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Email.CONTENT_ITEM_TYPE,
165e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Im.CONTENT_ITEM_TYPE,
16667dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey        StructuredPostal.CONTENT_ITEM_TYPE,
167e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
168e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
169e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] PHONE_MIME_TYPES = new String[] {
170e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Phone.CONTENT_ITEM_TYPE
171e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
172e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
173c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private interface PhotoQuery {
174c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        String[] COLUMNS = { Data._ID };
175c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
176c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int _ID = 0;
177c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
178c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
179c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    /**
180c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     * A custom data row that is used to store legacy photo data fields no
181c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     * longer directly supported by the API.
182c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     */
183c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private interface LegacyPhotoData {
184c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/photo_v1_extras";
185c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
186c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String PHOTO_DATA_ID = Data.DATA1;
187c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String LOCAL_VERSION = Data.DATA2;
188c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String DOWNLOAD_REQUIRED = Data.DATA3;
189c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String EXISTS_ON_SERVER = Data.DATA4;
190c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String SYNC_ERROR = Data.DATA5;
191c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
192c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
193c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    public static final String LEGACY_PHOTO_JOIN =
1945ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            " LEFT OUTER JOIN data legacy_photo ON (raw_contacts._id = legacy_photo.raw_contact_id"
195c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = legacy_photo.mimetype_id)"
196c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'"
197c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + " AND " + DataColumns.CONCRETE_ID + " = legacy_photo." + LegacyPhotoData.PHOTO_DATA_ID
198c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + ")";
199c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
200f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final HashMap<String, String> sPeopleProjectionMap;
2013cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final HashMap<String, String> sOrganizationProjectionMap;
202e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final HashMap<String, String> sContactMethodProjectionMap;
203e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final HashMap<String, String> sPhoneProjectionMap;
2040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sExtensionProjectionMap;
2050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sGroupProjectionMap;
2060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sGroupMembershipProjectionMap;
207c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final HashMap<String, String> sPhotoProjectionMap;
20870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    private static final HashMap<String, String> sPresenceProjectionMap;
209f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
210f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    static {
211f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
212f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // Contacts URI matching table
213f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        UriMatcher matcher = sUriMatcher;
214f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
215f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        String authority = android.provider.Contacts.AUTHORITY;
2160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "extensions", EXTENSIONS);
2170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "extensions/#", EXTENSIONS_ID);
2180f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groups", GROUPS);
2190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groups/#", GROUPS_ID);
220f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/name/*/members", GROUP_NAME_MEMBERS);
221f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/name/*/members/filter/*",
222f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                GROUP_NAME_MEMBERS_FILTER);
223f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/system_id/*/members", GROUP_SYSTEM_ID_MEMBERS);
224f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/system_id/*/members/filter/*",
225f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                GROUP_SYSTEM_ID_MEMBERS_FILTER);
2260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groupmembership", GROUPMEMBERSHIP);
2270f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groupmembership/#", GROUPMEMBERSHIP_ID);
228f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groupmembershipraw", GROUPMEMBERSHIP_RAW);
229f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people", PEOPLE);
230f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/strequent", PEOPLE_STREQUENT);
231f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/strequent/filter/*", PEOPLE_STREQUENT_FILTER);
232445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov        matcher.addURI(authority, "people/filter/*", PEOPLE_FILTER);
233f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/with_phones_filter/*",
234f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_WITH_PHONES_FILTER);
235f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/with_email_or_im_filter/*",
236f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_WITH_EMAIL_OR_IM_FILTER);
237f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people/#", PEOPLE_ID);
2380f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/extensions", PEOPLE_EXTENSIONS);
2390f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/extensions/#", PEOPLE_EXTENSIONS_ID);
240e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/phones", PEOPLE_PHONES);
241e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/phones/#", PEOPLE_PHONES_ID);
242f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/phones_with_presence",
243f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_PHONES_WITH_PRESENCE);
244c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "people/#/photo", PEOPLE_PHOTO);
245f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/photo/data", PEOPLE_PHOTO_DATA);
246e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/contact_methods", PEOPLE_CONTACTMETHODS);
247f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/contact_methods_with_presence",
248f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_CONTACTMETHODS_WITH_PRESENCE);
249e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID);
250f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/organizations", PEOPLE_ORGANIZATIONS);
251f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/organizations/#", PEOPLE_ORGANIZATIONS_ID);
2520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/groupmembership", PEOPLE_GROUPMEMBERSHIP);
2530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/groupmembership/#", PEOPLE_GROUPMEMBERSHIP_ID);
254f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/raw", PEOPLE_RAW);
255f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/owner", PEOPLE_OWNER);
256f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people/#/update_contact_time",
257f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                PEOPLE_UPDATE_CONTACT_TIME);
25833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov        matcher.addURI(authority, "deleted_people", DELETED_PEOPLE);
25933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov        matcher.addURI(authority, "deleted_groups", DELETED_GROUPS);
260e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "phones", PHONES);
261f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones_with_presence", PHONES_WITH_PRESENCE);
262f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones/filter/*", PHONES_FILTER);
263f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones/filter_name/*", PHONES_FILTER_NAME);
264f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones/mobile_filter_name/*",
265f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PHONES_MOBILE_FILTER_NAME);
266e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "phones/#", PHONES_ID);
267c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "photos", PHOTOS);
268c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "photos/#", PHOTOS_ID);
269e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "contact_methods", CONTACTMETHODS);
270f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "contact_methods/email", CONTACTMETHODS_EMAIL);
271f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "contact_methods/email/*", CONTACTMETHODS_EMAIL_FILTER);
272e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "contact_methods/#", CONTACTMETHODS_ID);
273f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "contact_methods/with_presence",
274f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                CONTACTMETHODS_WITH_PRESENCE);
27570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        matcher.addURI(authority, "presence", PRESENCE);
27670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        matcher.addURI(authority, "presence/#", PRESENCE_ID);
2773cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        matcher.addURI(authority, "organizations", ORGANIZATIONS);
2783cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        matcher.addURI(authority, "organizations/#", ORGANIZATIONS_ID);
279f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "voice_dialer_timestamp", VOICE_DIALER_TIMESTAMP);
280c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY,
281c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                SEARCH_SUGGESTIONS);
282c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY + "/*",
283c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                SEARCH_SUGGESTIONS);
284f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/#",
285f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                SEARCH_SHORTCUT);
286f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "settings", SETTINGS);
287f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//
288f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "live_folders/people", LIVE_FOLDERS_PEOPLE);
289f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "live_folders/people/*",
290f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                LIVE_FOLDERS_PEOPLE_GROUP_NAME);
291f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "live_folders/people_with_phones",
292f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                LIVE_FOLDERS_PEOPLE_WITH_PHONES);
293f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "live_folders/favorites",
294f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                LIVE_FOLDERS_PEOPLE_FAVORITES);
295f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
296f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
297e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        HashMap<String, String> peopleProjectionMap = new HashMap<String, String>();
298d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.NAME, People.NAME);
299d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.DISPLAY_NAME, People.DISPLAY_NAME);
300d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.PHONETIC_NAME, People.PHONETIC_NAME);
301d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.NOTES, People.NOTES);
302d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.TIMES_CONTACTED, People.TIMES_CONTACTED);
303d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.LAST_TIME_CONTACTED, People.LAST_TIME_CONTACTED);
304d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.CUSTOM_RINGTONE, People.CUSTOM_RINGTONE);
305d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.SEND_TO_VOICEMAIL, People.SEND_TO_VOICEMAIL);
306d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.STARRED, People.STARRED);
307e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
308e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPeopleProjectionMap = new HashMap<String, String>(peopleProjectionMap);
309d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.PRIMARY_ORGANIZATION_ID, People.PRIMARY_ORGANIZATION_ID);
310d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.PRIMARY_EMAIL_ID, People.PRIMARY_EMAIL_ID);
311d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.PRIMARY_PHONE_ID, People.PRIMARY_PHONE_ID);
312d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.NUMBER, People.NUMBER);
313d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.TYPE, People.TYPE);
314d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.LABEL, People.LABEL);
315d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.NUMBER_KEY, People.NUMBER_KEY);
31670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.IM_PROTOCOL, People.IM_PROTOCOL);
31770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.IM_HANDLE, People.IM_HANDLE);
31870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.IM_ACCOUNT, People.IM_ACCOUNT);
31970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.PRESENCE_STATUS, People.PRESENCE_STATUS);
32070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.PRESENCE_CUSTOM_STATUS, People.PRESENCE_CUSTOM_STATUS);
3213cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
3223cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap = new HashMap<String, String>();
3233cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.PERSON_ID,
324d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.PERSON_ID);
3253cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.ISPRIMARY,
326d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.ISPRIMARY);
3273cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.COMPANY,
328d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.COMPANY);
3293cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TYPE,
330d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.TYPE);
3313cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.LABEL,
332d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.LABEL);
3333cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TITLE,
334d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.TITLE);
335e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
336e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sContactMethodProjectionMap = new HashMap<String, String>(peopleProjectionMap);
337d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.PERSON_ID, ContactMethods.PERSON_ID);
338d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.KIND, ContactMethods.KIND);
339d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.ISPRIMARY, ContactMethods.ISPRIMARY);
340d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.TYPE, ContactMethods.TYPE);
341d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.DATA, ContactMethods.DATA);
342d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.LABEL, ContactMethods.LABEL);
343d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.AUX_DATA, ContactMethods.AUX_DATA);
344e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
345e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap = new HashMap<String, String>(peopleProjectionMap);
346e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.PERSON_ID,
347d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.PERSON_ID);
348e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.ISPRIMARY,
349d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.ISPRIMARY);
350e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER,
351d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.NUMBER);
352e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.TYPE,
353d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.TYPE);
354e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.LABEL,
355d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.LABEL);
356e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER_KEY,
357d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.NUMBER_KEY);
3580f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
3590f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap = new HashMap<String, String>();
3600f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.PERSON_ID,
361d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.PERSON_ID);
3620f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.NAME,
363d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.NAME);
3640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.VALUE,
365d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.VALUE);
3660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
3670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap = new HashMap<String, String>();
3680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups._ID,
369d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups._ID);
3700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.NAME,
371d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.NAME);
3720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.NOTES,
373d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.NOTES);
3740f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.SYSTEM_ID,
375d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.SYSTEM_ID);
3760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
3770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap = new HashMap<String, String>();
3780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.PERSON_ID,
379d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.GroupMembership.PERSON_ID);
3800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.GROUP_ID,
381d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.GroupMembership.GROUP_ID);
382c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
383c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap = new HashMap<String, String>();
384c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.PERSON_ID,
385c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.PERSON_ID);
386c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.DATA,
387c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.DATA);
388c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.LOCAL_VERSION,
389c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.LOCAL_VERSION);
390c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.DOWNLOAD_REQUIRED,
391c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.DOWNLOAD_REQUIRED);
392c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.EXISTS_ON_SERVER,
393c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.EXISTS_ON_SERVER);
394c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.SYNC_ERROR,
395c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.SYNC_ERROR);
39670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
39770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPresenceProjectionMap = new HashMap<String, String>();
39870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPresenceProjectionMap.put(android.provider.Contacts.Presence._ID,
39970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                Tables.PRESENCE + "." + Presence._ID
40070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                        + " AS " + android.provider.Contacts.Presence._ID);
40170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPresenceProjectionMap.put(android.provider.Contacts.Presence.PERSON_ID,
4025ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.PRESENCE + "." + Presence.RAW_CONTACT_ID
40370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                        + " AS " + android.provider.Contacts.Presence.PERSON_ID);
40470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPresenceProjectionMap.put(android.provider.Contacts.Presence.IM_PROTOCOL,
40570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                Presence.IM_PROTOCOL
40670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                    + " AS " + android.provider.Contacts.Presence.IM_PROTOCOL);
40770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPresenceProjectionMap.put(android.provider.Contacts.Presence.IM_HANDLE,
40870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                Presence.IM_HANDLE
40970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                    + " AS " + android.provider.Contacts.Presence.IM_HANDLE);
41070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPresenceProjectionMap.put(android.provider.Contacts.Presence.IM_ACCOUNT,
41170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                Presence.IM_ACCOUNT
41270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                    + " AS " + android.provider.Contacts.Presence.IM_ACCOUNT);
41370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPresenceProjectionMap.put(android.provider.Contacts.Presence.PRESENCE_STATUS,
41470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                Presence.PRESENCE_STATUS
41570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                    + " AS " + android.provider.Contacts.Presence.PRESENCE_STATUS);
41670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPresenceProjectionMap.put(android.provider.Contacts.Presence.PRESENCE_CUSTOM_STATUS,
41770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                Presence.PRESENCE_CUSTOM_STATUS
41870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                    + " AS " + android.provider.Contacts.Presence.PRESENCE_CUSTOM_STATUS);
419f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
420f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
421f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final Context mContext;
422f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final OpenHelper mOpenHelper;
423f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final ContactsProvider2 mContactsProvider;
424f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final NameSplitter mPhoneticNameSplitter;
425a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov    private final GlobalSearchSupport mGlobalSearchSupport;
426f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
427d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov    /** Precompiled sql statement for incrementing times contacted for a contact */
4283cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private final SQLiteStatement mLastTimeContactedUpdate;
4293cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
4303cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private final ContentValues mValues = new ContentValues();
4313cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
432a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
433f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public LegacyApiSupport(Context context, OpenHelper openHelper,
434a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov            ContactsProvider2 contactsProvider, GlobalSearchSupport globalSearchSupport) {
435f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContext = context;
436f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContactsProvider = contactsProvider;
437f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mOpenHelper = openHelper;
438a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        mGlobalSearchSupport = globalSearchSupport;
439d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        mOpenHelper.setDelegate(this);
440f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
441f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mPhoneticNameSplitter = new NameSplitter("", "", "",
442f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                context.getString(com.android.internal.R.string.common_name_conjunctions));
443f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
444f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
4455ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mLastTimeContactedUpdate = db.compileStatement("UPDATE " + Tables.RAW_CONTACTS + " SET "
4466cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts.TIMES_CONTACTED + "="
4476cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts.TIMES_CONTACTED + "+1,"
4486cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts.LAST_TIME_CONTACTED + "=? WHERE "
4496cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts._ID + "=?");
450f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
451f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
452d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
453d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    public void createDatabase(SQLiteDatabase db) {
454d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
455d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PEOPLE + ";");
456d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PEOPLE + " AS SELECT " +
4576cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                RawContactsColumns.CONCRETE_ID
458d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.People._ID + ", " +
459d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "name." + StructuredName.DISPLAY_NAME
460d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NAME + ", " +
4615ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME
462d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.DISPLAY_NAME + ", " +
463d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PHONETIC_NAME_SQL
464d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PHONETIC_NAME + " , " +
465d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "note." + Note.NOTE
466d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NOTES + ", " +
4675ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED
468d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.TIMES_CONTACTED + ", " +
4695ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED
470d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.LAST_TIME_CONTACTED + ", " +
4715ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE
472d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.CUSTOM_RINGTONE + ", " +
4735ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL
474d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.SEND_TO_VOICEMAIL + ", " +
4755ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.STARRED
476d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.STARRED + ", " +
477d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "organization." + Data._ID
478d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_ORGANIZATION_ID + ", " +
479d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "email." + Data._ID
480d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_EMAIL_ID + ", " +
481d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Data._ID
482d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_PHONE_ID + ", " +
483d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.NUMBER
484d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NUMBER + ", " +
485d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.TYPE
486d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.TYPE + ", " +
487d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.LABEL
488d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.LABEL + ", " +
489d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + PhoneColumns.NORMALIZED_NUMBER
49070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                        + " AS " + People.NUMBER_KEY + ", " +
4916cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                RawContacts.IS_RESTRICTED +
4925ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.RAW_CONTACTS + PEOPLE_JOINS +
4935ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " WHERE " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
494d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
495d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
496d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.ORGANIZATIONS + ";");
497d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.ORGANIZATIONS + " AS SELECT " +
498d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
499d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations._ID + ", " +
5005ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Data.RAW_CONTACT_ID
501d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.PERSON_ID + ", " +
502d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Data.IS_PRIMARY
503d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.ISPRIMARY + ", " +
504d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.COMPANY
505d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.COMPANY + ", " +
506d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.TYPE
507d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.TYPE + ", " +
508d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.LABEL
509d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.LABEL + ", " +
510d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.TITLE
511d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.TITLE + ", " +
5126cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                RawContacts.IS_RESTRICTED +
5135ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS +
514d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
51533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Organization.CONTENT_ITEM_TYPE + "'"
5165ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
517d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
518d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
519d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.CONTACT_METHODS + ";");
520d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.CONTACT_METHODS + " AS SELECT " +
521d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
522d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods._ID + ", " +
523d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
524d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.PERSON_ID + ", " +
525d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                CONTACT_METHOD_KIND_SQL
526d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.KIND + ", " +
527d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_IS_PRIMARY
528d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.ISPRIMARY + ", " +
529d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_DATA1
530d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.TYPE + ", " +
531d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_DATA2
532d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.DATA + ", " +
533d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_DATA3
534d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.LABEL + ", " +
535d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_DATA14
536d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.AUX_DATA + ", " +
537d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "name." + StructuredName.DISPLAY_NAME
538d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.NAME + ", " +
5395ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME
540d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.DISPLAY_NAME + ", " +
541d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PHONETIC_NAME_SQL
542d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.PHONETIC_NAME + " , " +
543d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "note." + Note.NOTE
544d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.NOTES + ", " +
5455ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED
546d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.TIMES_CONTACTED + ", " +
5475ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED
548d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.LAST_TIME_CONTACTED + ", " +
5495ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE
550d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.CUSTOM_RINGTONE + ", " +
5515ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL
552d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.SEND_TO_VOICEMAIL + ", " +
5535ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.STARRED
554d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.STARRED + ", " +
5556cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                RawContacts.IS_RESTRICTED +
556d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS +
55733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                " WHERE " + ContactMethods.KIND + " IS NOT NULL"
5585ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                    + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
559d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
560d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
561d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
562d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHONES + ";");
563d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PHONES + " AS SELECT " +
564d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
565d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones._ID + ", " +
566d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
567d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.PERSON_ID + ", " +
568d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_IS_PRIMARY
569d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.ISPRIMARY + ", " +
570d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.NUMBER
571d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NUMBER + ", " +
572d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.TYPE
573d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.TYPE + ", " +
574d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.LABEL
575d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.LABEL + ", " +
576d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PhoneColumns.CONCRETE_NORMALIZED_NUMBER
577d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NUMBER_KEY + ", " +
578d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "name." + StructuredName.DISPLAY_NAME
579d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NAME + ", " +
5805ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME
581d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.DISPLAY_NAME + ", " +
582d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PHONETIC_NAME_SQL
583d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.PHONETIC_NAME + " , " +
584d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "note." + Note.NOTE
585d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NOTES + ", " +
5865ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED
587d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.TIMES_CONTACTED + ", " +
5885ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED
589d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.LAST_TIME_CONTACTED + ", " +
5905ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE
591d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.CUSTOM_RINGTONE + ", " +
5925ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL
593d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.SEND_TO_VOICEMAIL + ", " +
5945ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.STARRED
595d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.STARRED + ", " +
5966cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                RawContacts.IS_RESTRICTED +
597d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS +
598d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
59933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Phone.CONTENT_ITEM_TYPE + "'"
6005ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
601d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
602d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
603d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.EXTENSIONS + ";");
604d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.EXTENSIONS + " AS SELECT " +
605d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
606d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions._ID + ", " +
607d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
608d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.PERSON_ID + ", " +
609d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                ExtensionsColumns.NAME
610d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.NAME + ", " +
611d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                ExtensionsColumns.VALUE
612d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.VALUE + ", " +
6136cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                RawContacts.IS_RESTRICTED +
6145ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS +
615d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
61633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE + "'"
6175ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
618d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
619d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
620d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUPS + ";");
621d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.GROUPS + " AS SELECT " +
622d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                GroupsColumns.CONCRETE_ID + " AS " + android.provider.Contacts.Groups._ID + ", " +
623d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.TITLE + " AS " + android.provider.Contacts.Groups.NAME + ", " +
624d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.NOTES + " AS " + android.provider.Contacts.Groups.NOTES + " , " +
625d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.SYSTEM_ID + " AS " + android.provider.Contacts.Groups.SYSTEM_ID +
626d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.GROUPS +
627d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
628d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
629d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUP_MEMBERSHIP + ";");
630d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.GROUP_MEMBERSHIP + " AS SELECT " +
631d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
632d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership._ID + ", " +
633d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
634d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.PERSON_ID + ", " +
635d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                GroupMembership.GROUP_ROW_ID
636d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.GROUP_ID + ", " +
637d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.TITLE
638d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.NAME + ", " +
639d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.NOTES
640d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.NOTES + " , " +
641d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.SYSTEM_ID
642d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.SYSTEM_ID + ", " +
6436cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                RawContacts.IS_RESTRICTED +
6445ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_GROUPS +
645d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
64633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + GroupMembership.CONTENT_ITEM_TYPE + "'"
6475ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
648d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
649c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
650c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHOTOS + ";");
651c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PHOTOS + " AS SELECT " +
652c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                DataColumns.CONCRETE_ID
653c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos._ID + ", " +
654d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
655c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.PERSON_ID + ", " +
656c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                Tables.DATA + "." + Photo.PHOTO
657c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.DATA + ", " +
658c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.EXISTS_ON_SERVER
659c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.EXISTS_ON_SERVER + ", " +
660c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.DOWNLOAD_REQUIRED
661c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.DOWNLOAD_REQUIRED + ", " +
662c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.LOCAL_VERSION
663c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.LOCAL_VERSION + ", " +
664c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.SYNC_ERROR
665c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.SYNC_ERROR + ", " +
6666cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                RawContacts.IS_RESTRICTED +
667c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS + LEGACY_PHOTO_JOIN +
668c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
66933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Photo.CONTENT_ITEM_TYPE + "'"
6705ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
671c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        ";");
672d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    }
673d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
674f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public Uri insert(Uri uri, ContentValues values) {
675f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final int match = sUriMatcher.match(uri);
676f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        long id = 0;
677f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch (match) {
678f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE:
6793cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                id = insertPeople(values);
6803cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
6813cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
6823cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS:
6833cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                id = insertOrganization(values);
684f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
685f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
6860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS: {
6875ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
6885ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertContactMethod(rawContactId, values);
689e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
6900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
691e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
6920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case CONTACTMETHODS: {
6935ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values, ContactMethods.PERSON_ID);
6945ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertContactMethod(rawContactId, values);
695e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
6960f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
697e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
6980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PHONES: {
6995ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7000f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.Phones.PERSON_ID);
7015ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertPhone(rawContactId, values);
7020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
7050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS: {
7065ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7070f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.Extensions.PERSON_ID);
7085ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertExtension(rawContactId, values);
7090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7100f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7110f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
7120f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS:
7130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                id = insertGroup(values);
714e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
715e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP: {
7175ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7180f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.GroupMembership.PERSON_ID);
7190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                long groupId = getRequiredValue(values,
7200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.GroupMembership.GROUP_ID);
7215ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertGroupMembership(rawContactId, groupId);
7220f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
72570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            case PRESENCE: {
72670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                id = insertPresence(values);
72770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                break;
72870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            }
72970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
730f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            default:
731f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
732f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
733f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
734f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (id < 0) {
735f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            return null;
736f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
737f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
738f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final Uri result = ContentUris.withAppendedId(uri, id);
739f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        onChange(result);
740f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return result;
741f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
742f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
7430f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private long getRequiredValue(ContentValues values, String column) {
7440f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        if (!values.containsKey(column)) {
7450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            throw new RuntimeException("Required value: " + column);
746e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        }
747e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return values.getAsLong(column);
749e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
750e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7513cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private long insertPeople(ContentValues values) {
7523cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        mValues.clear();
753f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
7546cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, RawContacts.CUSTOM_RINGTONE,
755f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                values, People.CUSTOM_RINGTONE);
7566cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, RawContacts.SEND_TO_VOICEMAIL,
757f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                values, People.SEND_TO_VOICEMAIL);
7586cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, RawContacts.LAST_TIME_CONTACTED,
759f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                values, People.LAST_TIME_CONTACTED);
7606cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, RawContacts.TIMES_CONTACTED,
761f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                values, People.TIMES_CONTACTED);
7626cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, RawContacts.STARRED,
763f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                values, People.STARRED);
7646cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov        Uri contactUri = mContactsProvider.insert(RawContacts.CONTENT_URI, mValues);
7655ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        long rawContactId = ContentUris.parseId(contactUri);
766f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
767f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (values.containsKey(People.NAME) || values.containsKey(People.PHONETIC_NAME)) {
7683cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            mValues.clear();
7695ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
7703cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            mValues.put(ContactsContract.Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
7713cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            OpenHelper.copyStringValue(mValues, StructuredName.DISPLAY_NAME,
772f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                    values, People.NAME);
773f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            if (values.containsKey(People.PHONETIC_NAME)) {
774f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                String phoneticName = values.getAsString(People.PHONETIC_NAME);
775f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                NameSplitter.Name parsedName = new NameSplitter.Name();
776f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                mPhoneticNameSplitter.split(parsedName, phoneticName);
7773cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                mValues.put(StructuredName.PHONETIC_GIVEN_NAME, parsedName.getGivenNames());
7783cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                mValues.put(StructuredName.PHONETIC_MIDDLE_NAME, parsedName.getMiddleName());
7793cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                mValues.put(StructuredName.PHONETIC_FAMILY_NAME, parsedName.getFamilyName());
780f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            }
781f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
7823cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            mContactsProvider.insert(ContactsContract.Data.CONTENT_URI, mValues);
783f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
784f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
785f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (values.containsKey(People.NOTES)) {
7863cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            mValues.clear();
7875ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(Data.RAW_CONTACT_ID, rawContactId);
7883cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            mValues.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE);
7893cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            OpenHelper.copyStringValue(mValues, Note.NOTE, values, People.NOTES);
7903cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            mContactsProvider.insert(Data.CONTENT_URI, mValues);
791f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
792f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
793f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // TODO instant aggregation
7945ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        return rawContactId;
795f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
796f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
7973cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private long insertOrganization(ContentValues values) {
7983cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        mValues.clear();
7993cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8005ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.RAW_CONTACT_ID,
8013cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.PERSON_ID);
8023cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        mValues.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
8033cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8043cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY,
8053cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.ISPRIMARY);
8063cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8073cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        OpenHelper.copyStringValue(mValues, Organization.COMPANY,
8083cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.COMPANY);
8093cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8103cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        // TYPE values happen to remain the same between V1 and V2 - can just copy the value
8113cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        OpenHelper.copyLongValue(mValues, Organization.TYPE,
8123cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.TYPE);
8133cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8143cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        OpenHelper.copyStringValue(mValues, Organization.LABEL,
8153cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.LABEL);
8163cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        OpenHelper.copyStringValue(mValues, Organization.TITLE,
8173cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.TITLE);
8183cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8193cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues);
8203cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8213cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        return ContentUris.parseId(uri);
8223cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    }
823f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
8245ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertPhone(long rawContactId, ContentValues values) {
825e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        mValues.clear();
826e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8275ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
828e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        mValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
829e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
830e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY,
831e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                values, android.provider.Contacts.Phones.ISPRIMARY);
832e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
833e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Phone.NUMBER,
834e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                values, android.provider.Contacts.Phones.NUMBER);
835e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
836e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        // TYPE values happen to remain the same between V1 and V2 - can just copy the value
837e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Phone.TYPE,
838e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                values, android.provider.Contacts.Phones.TYPE);
839e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
840e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Phone.LABEL,
841e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                values, android.provider.Contacts.Phones.LABEL);
842e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
843e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues);
844e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
845e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        return ContentUris.parseId(uri);
846e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
847e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8485ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertContactMethod(long rawContactId, ContentValues values) {
849e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Integer kind = values.getAsInteger(ContactMethods.KIND);
850e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        if (kind == null) {
851e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            throw new RuntimeException("Required value: " + ContactMethods.KIND);
852e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        }
853e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
854e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        mValues.clear();
8555ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
856e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
857e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY, values, ContactMethods.ISPRIMARY);
858e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
859e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        switch (kind) {
860e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case android.provider.Contacts.KIND_EMAIL:
861e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                copyCommonFields(values, Email.CONTENT_ITEM_TYPE, Email.TYPE, Email.LABEL,
8620f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        Email.DATA, Data.DATA14);
863e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
864e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
865e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case android.provider.Contacts.KIND_IM:
866e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                copyCommonFields(values, Im.CONTENT_ITEM_TYPE, Im.TYPE, Im.LABEL,
8670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        Email.DATA, Data.DATA14);
868e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
869e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
870e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case android.provider.Contacts.KIND_POSTAL:
87167dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey                copyCommonFields(values, StructuredPostal.CONTENT_ITEM_TYPE, StructuredPostal.TYPE,
87267dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey                        StructuredPostal.LABEL, StructuredPostal.FORMATTED_ADDRESS, Data.DATA14);
873e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
874e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        }
875e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
876e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues);
877e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        return ContentUris.parseId(uri);
878e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
879e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
880e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private void copyCommonFields(ContentValues values, String mimeType, String typeColumn,
881e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            String labelColumn, String dataColumn, String auxDataColumn) {
882e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        mValues.put(Data.MIMETYPE, mimeType);
883e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, typeColumn, values, ContactMethods.TYPE);
884e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, labelColumn, values, ContactMethods.LABEL);
885e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, dataColumn, values, ContactMethods.DATA);
886e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, auxDataColumn, values, ContactMethods.AUX_DATA);
887e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
888e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8895ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertExtension(long rawContactId, ContentValues values) {
8900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.clear();
8910f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
8925ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
8930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(Data.MIMETYPE, android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE);
8940f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
8950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, ExtensionsColumns.NAME,
8960f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                values, android.provider.Contacts.People.Extensions.NAME);
8970f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, ExtensionsColumns.VALUE,
8980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                values, android.provider.Contacts.People.Extensions.VALUE);
8990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9000f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues);
9010f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
9020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
9030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private long insertGroup(ContentValues values) {
9050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.clear();
9060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9070f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Groups.TITLE,
9080f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                values, android.provider.Contacts.Groups.NAME);
9090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Groups.NOTES,
9100f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                values, android.provider.Contacts.Groups.NOTES);
9110f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Groups.SYSTEM_ID,
9120f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                values, android.provider.Contacts.Groups.SYSTEM_ID);
9130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9140f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        Uri uri = mContactsProvider.insert(Groups.CONTENT_URI, mValues);
9150f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
9160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
9170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9185ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertGroupMembership(long rawContactId, long groupId) {
9190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.clear();
9200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9210f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE);
9225ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(GroupMembership.RAW_CONTACT_ID, rawContactId);
9230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(GroupMembership.GROUP_ROW_ID, groupId);
9240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9250f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues);
9260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
9270f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
9280f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
92970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    private long insertPresence(ContentValues values) {
93070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        mValues.clear();
93170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
93270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        OpenHelper.copyLongValue(mValues, Presence._ID,
93370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                values, android.provider.Contacts.Presence._ID);
9345ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Presence.RAW_CONTACT_ID,
93570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                values, android.provider.Contacts.Presence.PERSON_ID);
93670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        OpenHelper.copyStringValue(mValues, Presence.IM_PROTOCOL,
93770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                values, android.provider.Contacts.Presence.IM_PROTOCOL);
93870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        OpenHelper.copyStringValue(mValues, Presence.IM_HANDLE,
93970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                values, android.provider.Contacts.Presence.IM_HANDLE);
94070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        OpenHelper.copyStringValue(mValues, Presence.IM_ACCOUNT,
94170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                values, android.provider.Contacts.Presence.IM_ACCOUNT);
94270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        OpenHelper.copyLongValue(mValues, Presence.PRESENCE_STATUS,
94370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                values, android.provider.Contacts.Presence.PRESENCE_STATUS);
94470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        OpenHelper.copyStringValue(mValues, Presence.PRESENCE_CUSTOM_STATUS,
94570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                values, android.provider.Contacts.Presence.PRESENCE_CUSTOM_STATUS);
94670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
94770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        return mContactsProvider.insertPresence(mValues);
94870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    }
94970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
950f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
951f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final int match = sUriMatcher.match(uri);
952c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int count = 0;
953f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch(match) {
954f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE_UPDATE_CONTACT_TIME:
955f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                count = updateContactTime(uri, values);
956f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
957c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
958c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PEOPLE_PHOTO: {
9595ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
9605ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                return updatePhoto(rawContactId, values);
961c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            }
962c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
963c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PHOTOS:
964c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                // TODO
965c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
966c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
967c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PHOTOS_ID:
968c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                // TODO
969c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
970c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
971c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
972f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            default:
973f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
974f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
975f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
976f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (count > 0) {
977f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            mContext.getContentResolver().notifyChange(uri, null);
978f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
979f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return count;
980f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
981f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
982c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
983f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private int updateContactTime(Uri uri, ContentValues values) {
984f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
985f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // TODO check sanctions
986f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
987f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        long lastTimeContacted;
988f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (values.containsKey(People.LAST_TIME_CONTACTED)) {
989f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            lastTimeContacted = values.getAsLong(People.LAST_TIME_CONTACTED);
990f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        } else {
991f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            lastTimeContacted = System.currentTimeMillis();
992f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
993f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
9945ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
995d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov        long contactId = mOpenHelper.getContactId(rawContactId);
996d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov        if (contactId != 0) {
997d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov            mContactsProvider.updateContactTime(contactId, lastTimeContacted);
998f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        } else {
999f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            mLastTimeContactedUpdate.bindLong(1, lastTimeContacted);
10005ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mLastTimeContactedUpdate.bindLong(2, rawContactId);
1001f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            mLastTimeContactedUpdate.execute();
1002f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1003f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return 1;
1004f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1005f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
10065ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private int updatePhoto(long rawContactId, ContentValues values) {
1007c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1008c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        // TODO check sanctions
1009c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1010c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int count;
1011c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1012c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        long dataId = -1;
1013c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        Cursor c = mContactsProvider.query(Data.CONTENT_URI, PhotoQuery.COLUMNS,
10145ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Data.RAW_CONTACT_ID + "=" + rawContactId + " AND "
1015c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + Data.MIMETYPE + "=" + mOpenHelper.getMimeTypeId(Photo.CONTENT_ITEM_TYPE),
1016c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                null, null);
1017c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        try {
1018c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            if (c.moveToFirst()) {
1019c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                dataId = c.getLong(PhotoQuery._ID);
1020c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            }
1021c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        } finally {
1022c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            c.close();
1023c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        }
1024c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1025c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.clear();
1026c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA);
1027c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.put(Photo.PHOTO, bytes);
1028c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1029c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        if (dataId == -1) {
1030c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE);
10315ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(Data.RAW_CONTACT_ID, rawContactId);
1032c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            Uri dataUri = mContactsProvider.insert(Data.CONTENT_URI, mValues);
1033c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            dataId = ContentUris.parseId(dataUri);
1034c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            count = 1;
1035c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        } else {
1036c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            Uri dataUri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
1037c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            count = mContactsProvider.update(dataUri, mValues, null, null);
1038c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        }
1039c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1040c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.clear();
1041c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.LOCAL_VERSION,
1042c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.LOCAL_VERSION);
1043c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.DOWNLOAD_REQUIRED,
1044c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.DOWNLOAD_REQUIRED);
1045c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.EXISTS_ON_SERVER,
1046c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.EXISTS_ON_SERVER);
1047c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.SYNC_ERROR,
1048c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.SYNC_ERROR);
1049c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1050c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int updated = mContactsProvider.update(Data.CONTENT_URI, mValues,
1051c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                Data.MIMETYPE + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'"
10525ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Data.RAW_CONTACT_ID + "=" + rawContactId
1053c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AND " + LegacyPhotoData.PHOTO_DATA_ID + "=" + dataId, null);
1054c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        if (updated == 0) {
10555ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(Data.RAW_CONTACT_ID, rawContactId);
1056c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(Data.MIMETYPE, LegacyPhotoData.CONTENT_ITEM_TYPE);
1057c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(LegacyPhotoData.PHOTO_DATA_ID, dataId);
1058c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mContactsProvider.insert(Data.CONTENT_URI, mValues);
1059c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        }
1060c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1061c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        return count;
1062c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
1063c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
10643cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    public int delete(Uri uri, String selection, String[] selectionArgs) {
10653cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        final int match = sUriMatcher.match(uri);
10663cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        int count = 0;
10673cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        switch (match) {
106833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case PEOPLE_ID:
106933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                count = mContactsProvider.deleteRawContact(ContentUris.parseId(uri), false);
107033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                break;
107133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov
10723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS_ID:
1073e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1074e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        ORGANIZATION_MIME_TYPES);
1075e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1076e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1077e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS_ID:
1078e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1079e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        CONTACT_METHOD_MIME_TYPES);
1080e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1081e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1082e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES_ID:
1083e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1084e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        PHONE_MIME_TYPES);
10853cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
10863cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
10873cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            default:
10883cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
10893cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        }
10903cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
10913cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        return count;
10923cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    }
10933cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
1094f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
1095c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            String sortOrder, String limit) {
1096f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final SQLiteDatabase db = mOpenHelper.getReadableDatabase();
1097f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
1098f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        String groupBy = null;
1099f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1100f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final int match = sUriMatcher.match(uri);
1101f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch (match) {
1102f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE: {
110370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1104f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
1105f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
1106f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            }
1107f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1108f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE_ID:
110970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1110f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
1111d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(People._ID + "=");
1112f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1113f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
1114f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1115445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov            case PEOPLE_FILTER: {
1116445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1117445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
1118445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                String filterParam = uri.getPathSegments().get(2);
1119445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                qb.appendWhere(People._ID + " IN "
11205ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + mContactsProvider.getRawContactsByFilterAsNestedQuery(filterParam));
1121445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                break;
1122445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov            }
1123445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov
11243cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS:
1125d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.ORGANIZATIONS);
1126d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sOrganizationProjectionMap);
1127d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
11283cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
11293cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
11303cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS_ID:
1131d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.ORGANIZATIONS);
11323cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                qb.setProjectionMap(sOrganizationProjectionMap);
1133e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
1134d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Organizations._ID + "=");
1135e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1136e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1137e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1138e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS:
1139d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS);
1140d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
1141d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
1142e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1143e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1144e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS_ID:
1145d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS);
1146e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
1147e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
1148d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods._ID + "=");
1149e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1150e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1151e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1152e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS:
1153d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS);
1154e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
1155e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
1156d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "=");
1157e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1158e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL");
1159e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1160e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1161e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS_ID:
1162d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS);
1163e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
1164e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
1165d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "=");
1166e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1167d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods._ID + "=");
1168e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
1169e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL");
1170e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1171e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1172e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES:
1173d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.PHONES);
1174d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
1175d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
1176e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1177e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1178e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES_ID:
1179d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.PHONES);
1180e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
1181e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
1182d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "=");
1183e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1184e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1185e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1186e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_PHONES:
1187d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.PHONES);
1188e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
1189e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
1190d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "=");
1191e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1192e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1193e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1194e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_PHONES_ID:
1195d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.PHONES);
1196e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
1197e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
1198d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "=");
11993cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1200d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "=");
1201e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
12023cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
12033cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
12040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS:
1205d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS);
1206d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
1207d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
12080f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
12090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
12100f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS_ID:
1211d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS);
12120f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
12130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
1214d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "=");
12150f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
12160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
12170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
12180f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_EXTENSIONS:
1219d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS);
12200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
12210f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
1222d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "=");
12230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
12240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
12250f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
12260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_EXTENSIONS_ID:
1227d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS);
12280f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
12290f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
1230d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "=");
12310f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1232d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "=");
12330f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
12340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
12350f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
12360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS:
1237d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.GROUPS);
12380f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupProjectionMap);
12390f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
12400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
12410f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS_ID:
1242d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.GROUPS);
12430f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupProjectionMap);
1244d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(android.provider.Contacts.Groups._ID + "=");
12450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
12460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
12470f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
12480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP:
1249d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP);
1250d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
1251d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
12520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
12530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
12540f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP_ID:
1255d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP);
12560f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
12570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
1258d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "=");
12590f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
12600f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
12610f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
12620f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_GROUPMEMBERSHIP:
1263d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP);
12640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
12650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
1266d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "=");
12670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
12680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
12690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
12700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_GROUPMEMBERSHIP_ID:
1271d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP);
12720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
12730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
1274d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "=");
12750f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1276d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "=");
12770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
12780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
12790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
1280c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PEOPLE_PHOTO:
1281c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.setTables(LegacyTables.PHOTOS);
1282c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.setProjectionMap(sPhotoProjectionMap);
1283c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                mContactsProvider.applyDataRestrictionExceptions(qb);
1284c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Photos.PERSON_ID + "=");
1285c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1286c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                limit = "1";
1287c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
1288c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
128970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            case PRESENCE:
129070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(Tables.PRESENCE);
129170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setProjectionMap(sPresenceProjectionMap);
129270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.appendWhere(mContactsProvider.getContactsRestrictionExceptionAsNestedQuery(
129370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                        android.provider.Contacts.Presence.PERSON_ID));
129470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                break;
129570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
129670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            case PRESENCE_ID:
129770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(Tables.PRESENCE);
129870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setProjectionMap(sPresenceProjectionMap);
129970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.appendWhere(mContactsProvider.getContactsRestrictionExceptionAsNestedQuery(
130070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                        android.provider.Contacts.Presence.PERSON_ID));
130170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Presence._ID + "=");
130270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
130370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                break;
130470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
1305c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            case SEARCH_SUGGESTIONS:
1306c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
1307c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                // No legacy compatibility for search suggestions
1308a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                return mGlobalSearchSupport.handleSearchSuggestionsQuery(db, uri, limit);
1309c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
131033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case DELETED_PEOPLE:
131133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case DELETED_GROUPS:
131233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                throw new UnsupportedOperationException();
131333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov
1314f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            default:
1315f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                throw new IllegalArgumentException("Unknown URL " + uri);
1316f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1317f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1318f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // Perform the query and set the notification uri
1319f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final Cursor c = qb.query(db, projection, selection, selectionArgs,
1320f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                groupBy, null, sortOrder, limit);
1321f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (c != null) {
13226cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov            c.setNotificationUri(mContext.getContentResolver(), RawContacts.CONTENT_URI);
1323f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1324e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        DatabaseUtils.dumpCursor(c);
1325f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return c;
1326f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1327f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1328f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    /**
1329f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     * Called when a change has been made.
1330f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     *
1331f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     * @param uri the uri that the change was made to
1332f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     */
1333f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private void onChange(Uri uri) {
1334f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContext.getContentResolver().notifyChange(android.provider.Contacts.CONTENT_URI, null);
1335f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1336f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov}
1337