LegacyApiSupport.java revision fb362d1a5df250a49fad06db323b0d41fe0e3757
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
26caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikovimport android.accounts.Account;
27c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.app.SearchManager;
28f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentUris;
29f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentValues;
30f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.Context;
31f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.UriMatcher;
32f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.Cursor;
33e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.database.DatabaseUtils;
34f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteDatabase;
35f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteQueryBuilder;
36f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteStatement;
37f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.net.Uri;
38f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract;
39e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.Contacts.ContactMethods;
40f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.Contacts.People;
41e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.Data;
420f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.Groups;
4370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikovimport android.provider.ContactsContract.Presence;
44c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract.RawContacts;
45e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email;
460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership;
47e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im;
48f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Note;
493cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization;
50e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone;
51c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo;
52f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName;
5367dde51ab932dc84d95a203b113989b13437f13dJeff Sharkeyimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
54f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
55f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport java.util.HashMap;
56f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
57d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikovpublic class LegacyApiSupport implements OpenHelper.Delegate {
58f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
59caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private static final String TAG = "ContactsProviderV1";
60caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
61f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
62f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
63f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE = 1;
64f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE_ID = 2;
65f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE_UPDATE_CONTACT_TIME = 3;
663cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final int ORGANIZATIONS = 4;
673cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final int ORGANIZATIONS_ID = 5;
68e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_CONTACTMETHODS = 6;
69e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_CONTACTMETHODS_ID = 7;
70e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int CONTACTMETHODS = 8;
71e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int CONTACTMETHODS_ID = 9;
72e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_PHONES = 10;
73e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_PHONES_ID = 11;
74e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PHONES = 12;
75e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PHONES_ID = 13;
760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int EXTENSIONS = 14;
770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int EXTENSIONS_ID = 15;
780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_EXTENSIONS = 16;
790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_EXTENSIONS_ID = 17;
800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPS = 18;
810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPS_ID = 19;
820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPMEMBERSHIP = 20;
830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPMEMBERSHIP_ID = 21;
840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_GROUPMEMBERSHIP = 22;
850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_GROUPMEMBERSHIP_ID = 23;
86c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PEOPLE_PHOTO = 24;
87c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PHOTOS = 25;
88c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PHOTOS_ID = 26;
8970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    private static final int PRESENCE = 27;
9070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    private static final int PRESENCE_ID = 28;
91445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov    private static final int PEOPLE_FILTER = 29;
9233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov    private static final int DELETED_PEOPLE = 30;
9333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov    private static final int DELETED_GROUPS = 31;
94c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    private static final int SEARCH_SUGGESTIONS = 32;
95fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov    private static final int PHONES_FILTER = 33;
96c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
97e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String PEOPLE_JOINS =
985ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            " LEFT OUTER JOIN data name ON (raw_contacts._id = name.raw_contact_id"
99e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = name.mimetype_id)"
100e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + StructuredName.CONTENT_ITEM_TYPE + "')"
1015ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data organization ON (raw_contacts._id = organization.raw_contact_id"
102e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = organization.mimetype_id)"
103e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Organization.CONTENT_ITEM_TYPE + "' AND organization.is_primary)"
1045ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data email ON (raw_contacts._id = email.raw_contact_id"
105e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = email.mimetype_id)"
106e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Email.CONTENT_ITEM_TYPE + "' AND email.is_primary)"
1075ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data note ON (raw_contacts._id = note.raw_contact_id"
108e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = note.mimetype_id)"
109e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Note.CONTENT_ITEM_TYPE + "')"
1105ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data phone ON (raw_contacts._id = phone.raw_contact_id"
111e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = phone.mimetype_id)"
112e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Phone.CONTENT_ITEM_TYPE + "' AND phone.is_primary)";
113e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
114d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    public static final String DATA_JOINS =
115d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            " JOIN mimetypes ON (mimetypes._id = data.mimetype_id)"
1165ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " JOIN raw_contacts ON (raw_contacts._id = data.raw_contact_id)"
117d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            + PEOPLE_JOINS;
118d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
11970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    public static final String PRESENCE_JOINS =
12070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            " LEFT OUTER JOIN presence ON ("
12170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            + " presence.presence_id = (SELECT max(presence_id) FROM presence"
1225d0fa81285aea6cc545686a9d32736933b446482Jeff Sharkey            + " WHERE view_v1_people._id = presence_raw_contact_id))";
12370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
124e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String PHONETIC_NAME_SQL = "trim(trim("
125e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_GIVEN_NAME + ",' ')||' '||"
126e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_MIDDLE_NAME + ",' '))||' '||"
127e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_FAMILY_NAME + ",' ')) ";
128e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
129e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String CONTACT_METHOD_KIND_SQL =
130d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            "CAST ((CASE WHEN mimetype='" + Email.CONTENT_ITEM_TYPE + "'"
131e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                + " THEN " + android.provider.Contacts.KIND_EMAIL
132e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                + " ELSE"
133e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + " (CASE WHEN mimetype='" + Im.CONTENT_ITEM_TYPE +"'"
134e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " THEN " + android.provider.Contacts.KIND_IM
135e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " ELSE"
13667dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey                        + " (CASE WHEN mimetype='" + StructuredPostal.CONTENT_ITEM_TYPE + "'"
137e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " THEN "  + android.provider.Contacts.KIND_POSTAL
138e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " ELSE"
139e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                                + " NULL"
140e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " END)"
141e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " END)"
142d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                + " END) AS INTEGER)";
143f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
144f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public interface LegacyTables {
145d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String PEOPLE = "view_v1_people";
14670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        public static final String PEOPLE_JOIN_PRESENCE = "view_v1_people" + PRESENCE_JOINS;
147d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String GROUPS = "view_v1_groups";
148d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String ORGANIZATIONS = "view_v1_organizations";
149d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String CONTACT_METHODS = "view_v1_contact_methods";
150d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String PHONES = "view_v1_phones";
151d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String EXTENSIONS = "view_v1_extensions";
152d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String GROUP_MEMBERSHIP = "view_v1_group_membership";
153c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String PHOTOS = "view_v1_photos";
15470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        public static final String PRESENCE_JOIN_CONTACTS = Tables.PRESENCE +
1555ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " LEFT OUTER JOIN " + Tables.RAW_CONTACTS
1565ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                + " ON (" + Tables.PRESENCE + "." + Presence.RAW_CONTACT_ID + "="
1576cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContactsColumns.CONCRETE_ID + ")";
158f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
159f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
160e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] ORGANIZATION_MIME_TYPES = new String[] {
161e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Organization.CONTENT_ITEM_TYPE
162e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
163e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
164e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] CONTACT_METHOD_MIME_TYPES = new String[] {
165e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Email.CONTENT_ITEM_TYPE,
166e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Im.CONTENT_ITEM_TYPE,
16767dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey        StructuredPostal.CONTENT_ITEM_TYPE,
168e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
169e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
170e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] PHONE_MIME_TYPES = new String[] {
171e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Phone.CONTENT_ITEM_TYPE
172e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
173e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
174c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private interface PhotoQuery {
175c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        String[] COLUMNS = { Data._ID };
176c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
177c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int _ID = 0;
178c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
179c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
180c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    /**
181c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     * A custom data row that is used to store legacy photo data fields no
182c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     * longer directly supported by the API.
183c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     */
184c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private interface LegacyPhotoData {
185c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/photo_v1_extras";
186c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
187c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String PHOTO_DATA_ID = Data.DATA1;
188c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String LOCAL_VERSION = Data.DATA2;
189c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String DOWNLOAD_REQUIRED = Data.DATA3;
190c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String EXISTS_ON_SERVER = Data.DATA4;
191c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String SYNC_ERROR = Data.DATA5;
192c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
193c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
194c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    public static final String LEGACY_PHOTO_JOIN =
1955ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            " LEFT OUTER JOIN data legacy_photo ON (raw_contacts._id = legacy_photo.raw_contact_id"
196c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = legacy_photo.mimetype_id)"
197c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'"
198c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + " AND " + DataColumns.CONCRETE_ID + " = legacy_photo." + LegacyPhotoData.PHOTO_DATA_ID
199c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + ")";
200c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
201f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final HashMap<String, String> sPeopleProjectionMap;
2023cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final HashMap<String, String> sOrganizationProjectionMap;
203e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final HashMap<String, String> sContactMethodProjectionMap;
204e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final HashMap<String, String> sPhoneProjectionMap;
2050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sExtensionProjectionMap;
2060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sGroupProjectionMap;
2070f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sGroupMembershipProjectionMap;
208c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final HashMap<String, String> sPhotoProjectionMap;
20970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    private static final HashMap<String, String> sPresenceProjectionMap;
210f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
211fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
212f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    static {
213f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
214f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // Contacts URI matching table
215f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        UriMatcher matcher = sUriMatcher;
216f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
217f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        String authority = android.provider.Contacts.AUTHORITY;
2180f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "extensions", EXTENSIONS);
2190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "extensions/#", EXTENSIONS_ID);
2200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groups", GROUPS);
2210f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groups/#", GROUPS_ID);
222f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/name/*/members", GROUP_NAME_MEMBERS);
223f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/name/*/members/filter/*",
224f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                GROUP_NAME_MEMBERS_FILTER);
225f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/system_id/*/members", GROUP_SYSTEM_ID_MEMBERS);
226f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/system_id/*/members/filter/*",
227f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                GROUP_SYSTEM_ID_MEMBERS_FILTER);
2280f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groupmembership", GROUPMEMBERSHIP);
2290f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groupmembership/#", GROUPMEMBERSHIP_ID);
230f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groupmembershipraw", GROUPMEMBERSHIP_RAW);
231f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people", PEOPLE);
232f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/strequent", PEOPLE_STREQUENT);
233f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/strequent/filter/*", PEOPLE_STREQUENT_FILTER);
234445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov        matcher.addURI(authority, "people/filter/*", PEOPLE_FILTER);
235f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/with_phones_filter/*",
236f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_WITH_PHONES_FILTER);
237f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/with_email_or_im_filter/*",
238f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_WITH_EMAIL_OR_IM_FILTER);
239f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people/#", PEOPLE_ID);
2400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/extensions", PEOPLE_EXTENSIONS);
2410f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/extensions/#", PEOPLE_EXTENSIONS_ID);
242e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/phones", PEOPLE_PHONES);
243e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/phones/#", PEOPLE_PHONES_ID);
244f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/phones_with_presence",
245f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_PHONES_WITH_PRESENCE);
246c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "people/#/photo", PEOPLE_PHOTO);
247f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/photo/data", PEOPLE_PHOTO_DATA);
248e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/contact_methods", PEOPLE_CONTACTMETHODS);
249f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/contact_methods_with_presence",
250f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_CONTACTMETHODS_WITH_PRESENCE);
251e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID);
252f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/organizations", PEOPLE_ORGANIZATIONS);
253f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/organizations/#", PEOPLE_ORGANIZATIONS_ID);
2540f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/groupmembership", PEOPLE_GROUPMEMBERSHIP);
2550f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/groupmembership/#", PEOPLE_GROUPMEMBERSHIP_ID);
256f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/raw", PEOPLE_RAW);
257f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/owner", PEOPLE_OWNER);
258f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people/#/update_contact_time",
259f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                PEOPLE_UPDATE_CONTACT_TIME);
26033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov        matcher.addURI(authority, "deleted_people", DELETED_PEOPLE);
26133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov        matcher.addURI(authority, "deleted_groups", DELETED_GROUPS);
262e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "phones", PHONES);
263f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones_with_presence", PHONES_WITH_PRESENCE);
264fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        matcher.addURI(authority, "phones/filter/*", PHONES_FILTER);
265f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones/filter_name/*", PHONES_FILTER_NAME);
266f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones/mobile_filter_name/*",
267f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PHONES_MOBILE_FILTER_NAME);
268e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "phones/#", PHONES_ID);
269c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "photos", PHOTOS);
270c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "photos/#", PHOTOS_ID);
271e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "contact_methods", CONTACTMETHODS);
272f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "contact_methods/email", CONTACTMETHODS_EMAIL);
273f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "contact_methods/email/*", CONTACTMETHODS_EMAIL_FILTER);
274e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "contact_methods/#", CONTACTMETHODS_ID);
275f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "contact_methods/with_presence",
276f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                CONTACTMETHODS_WITH_PRESENCE);
27770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        matcher.addURI(authority, "presence", PRESENCE);
27870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        matcher.addURI(authority, "presence/#", PRESENCE_ID);
2793cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        matcher.addURI(authority, "organizations", ORGANIZATIONS);
2803cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        matcher.addURI(authority, "organizations/#", ORGANIZATIONS_ID);
281f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "voice_dialer_timestamp", VOICE_DIALER_TIMESTAMP);
282c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY,
283c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                SEARCH_SUGGESTIONS);
284c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY + "/*",
285c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                SEARCH_SUGGESTIONS);
286f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/#",
287f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                SEARCH_SHORTCUT);
288f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "settings", SETTINGS);
289f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//
290f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "live_folders/people", LIVE_FOLDERS_PEOPLE);
291f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "live_folders/people/*",
292f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                LIVE_FOLDERS_PEOPLE_GROUP_NAME);
293f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "live_folders/people_with_phones",
294f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                LIVE_FOLDERS_PEOPLE_WITH_PHONES);
295f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "live_folders/favorites",
296f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                LIVE_FOLDERS_PEOPLE_FAVORITES);
297f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
298f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
299e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        HashMap<String, String> peopleProjectionMap = new HashMap<String, String>();
300d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.NAME, People.NAME);
301d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.DISPLAY_NAME, People.DISPLAY_NAME);
302d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.PHONETIC_NAME, People.PHONETIC_NAME);
303d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.NOTES, People.NOTES);
304d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.TIMES_CONTACTED, People.TIMES_CONTACTED);
305d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.LAST_TIME_CONTACTED, People.LAST_TIME_CONTACTED);
306d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.CUSTOM_RINGTONE, People.CUSTOM_RINGTONE);
307d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.SEND_TO_VOICEMAIL, People.SEND_TO_VOICEMAIL);
308d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.STARRED, People.STARRED);
309e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
310e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPeopleProjectionMap = new HashMap<String, String>(peopleProjectionMap);
3119155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPeopleProjectionMap.put(People._ID, People._ID);
312d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.PRIMARY_ORGANIZATION_ID, People.PRIMARY_ORGANIZATION_ID);
313d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.PRIMARY_EMAIL_ID, People.PRIMARY_EMAIL_ID);
314d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.PRIMARY_PHONE_ID, People.PRIMARY_PHONE_ID);
315d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.NUMBER, People.NUMBER);
316d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.TYPE, People.TYPE);
317d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.LABEL, People.LABEL);
318d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.NUMBER_KEY, People.NUMBER_KEY);
31970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.IM_PROTOCOL, People.IM_PROTOCOL);
32070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.IM_HANDLE, People.IM_HANDLE);
32170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.IM_ACCOUNT, People.IM_ACCOUNT);
32270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.PRESENCE_STATUS, People.PRESENCE_STATUS);
32370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.PRESENCE_CUSTOM_STATUS, People.PRESENCE_CUSTOM_STATUS);
3243cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
3253cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap = new HashMap<String, String>();
3269155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations._ID,
3279155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Organizations._ID);
3283cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.PERSON_ID,
329d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.PERSON_ID);
3303cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.ISPRIMARY,
331d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.ISPRIMARY);
3323cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.COMPANY,
333d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.COMPANY);
3343cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TYPE,
335d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.TYPE);
3363cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.LABEL,
337d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.LABEL);
3383cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TITLE,
339d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.TITLE);
340e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
341e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sContactMethodProjectionMap = new HashMap<String, String>(peopleProjectionMap);
3429155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods._ID, ContactMethods._ID);
343d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.PERSON_ID, ContactMethods.PERSON_ID);
344d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.KIND, ContactMethods.KIND);
345d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.ISPRIMARY, ContactMethods.ISPRIMARY);
346d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.TYPE, ContactMethods.TYPE);
347d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.DATA, ContactMethods.DATA);
348d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.LABEL, ContactMethods.LABEL);
349d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.AUX_DATA, ContactMethods.AUX_DATA);
350e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
351e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap = new HashMap<String, String>(peopleProjectionMap);
3529155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones._ID,
3539155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Phones._ID);
354e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.PERSON_ID,
355d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.PERSON_ID);
356e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.ISPRIMARY,
357d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.ISPRIMARY);
358e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER,
359d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.NUMBER);
360e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.TYPE,
361d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.TYPE);
362e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.LABEL,
363d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.LABEL);
364e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER_KEY,
365d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.NUMBER_KEY);
3660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
3670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap = new HashMap<String, String>();
3689155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions._ID,
3699155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Extensions._ID);
3700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.PERSON_ID,
371d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.PERSON_ID);
3720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.NAME,
373d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.NAME);
3740f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.VALUE,
375d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.VALUE);
3760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
3770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap = new HashMap<String, String>();
3780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups._ID,
379d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups._ID);
3800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.NAME,
381d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.NAME);
3820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.NOTES,
383d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.NOTES);
3840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.SYSTEM_ID,
385d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.SYSTEM_ID);
3860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
3870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap = new HashMap<String, String>();
3889155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership._ID,
3899155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.GroupMembership._ID);
3900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.PERSON_ID,
391d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.GroupMembership.PERSON_ID);
3920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.GROUP_ID,
393d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.GroupMembership.GROUP_ID);
394c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
395c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap = new HashMap<String, String>();
3969155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos._ID,
3979155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Photos._ID);
398c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.PERSON_ID,
399c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.PERSON_ID);
400c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.DATA,
401c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.DATA);
402c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.LOCAL_VERSION,
403c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.LOCAL_VERSION);
404c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.DOWNLOAD_REQUIRED,
405c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.DOWNLOAD_REQUIRED);
406c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.EXISTS_ON_SERVER,
407c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.EXISTS_ON_SERVER);
408c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.SYNC_ERROR,
409c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.SYNC_ERROR);
41070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
41170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPresenceProjectionMap = new HashMap<String, String>();
41270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPresenceProjectionMap.put(android.provider.Contacts.Presence._ID,
41370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                Tables.PRESENCE + "." + Presence._ID
41470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                        + " AS " + android.provider.Contacts.Presence._ID);
41570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPresenceProjectionMap.put(android.provider.Contacts.Presence.PERSON_ID,
4165ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.PRESENCE + "." + Presence.RAW_CONTACT_ID
41770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                        + " AS " + android.provider.Contacts.Presence.PERSON_ID);
41870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPresenceProjectionMap.put(android.provider.Contacts.Presence.IM_PROTOCOL,
41970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                Presence.IM_PROTOCOL
42070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                    + " AS " + android.provider.Contacts.Presence.IM_PROTOCOL);
42170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPresenceProjectionMap.put(android.provider.Contacts.Presence.IM_HANDLE,
42270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                Presence.IM_HANDLE
42370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                    + " AS " + android.provider.Contacts.Presence.IM_HANDLE);
42470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPresenceProjectionMap.put(android.provider.Contacts.Presence.IM_ACCOUNT,
42570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                Presence.IM_ACCOUNT
42670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                    + " AS " + android.provider.Contacts.Presence.IM_ACCOUNT);
42770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPresenceProjectionMap.put(android.provider.Contacts.Presence.PRESENCE_STATUS,
42870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                Presence.PRESENCE_STATUS
42970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                    + " AS " + android.provider.Contacts.Presence.PRESENCE_STATUS);
43070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPresenceProjectionMap.put(android.provider.Contacts.Presence.PRESENCE_CUSTOM_STATUS,
43170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                Presence.PRESENCE_CUSTOM_STATUS
43270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                    + " AS " + android.provider.Contacts.Presence.PRESENCE_CUSTOM_STATUS);
433f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
434f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
435f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final Context mContext;
436f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final OpenHelper mOpenHelper;
437f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final ContactsProvider2 mContactsProvider;
438f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final NameSplitter mPhoneticNameSplitter;
439a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov    private final GlobalSearchSupport mGlobalSearchSupport;
440f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
441d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov    /** Precompiled sql statement for incrementing times contacted for a contact */
4423cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private final SQLiteStatement mLastTimeContactedUpdate;
4433cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
4443cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private final ContentValues mValues = new ContentValues();
445caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private Account mAccount;
446a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
447f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public LegacyApiSupport(Context context, OpenHelper openHelper,
448a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov            ContactsProvider2 contactsProvider, GlobalSearchSupport globalSearchSupport) {
449f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContext = context;
450f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContactsProvider = contactsProvider;
451f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mOpenHelper = openHelper;
452a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        mGlobalSearchSupport = globalSearchSupport;
453d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        mOpenHelper.setDelegate(this);
454f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
455f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mPhoneticNameSplitter = new NameSplitter("", "", "",
456f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                context.getString(com.android.internal.R.string.common_name_conjunctions));
457f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
458f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
4595ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mLastTimeContactedUpdate = db.compileStatement("UPDATE " + Tables.RAW_CONTACTS + " SET "
4606cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts.TIMES_CONTACTED + "="
4616cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts.TIMES_CONTACTED + "+1,"
4626cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts.LAST_TIME_CONTACTED + "=? WHERE "
4636cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts._ID + "=?");
464f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
465f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
466caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private void ensureDefaultAccount() {
467caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        if (mAccount == null) {
468caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov            mAccount = mContactsProvider.getDefaultAccount();
469caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        }
470caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
471d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
472d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    public void createDatabase(SQLiteDatabase db) {
473d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
474d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PEOPLE + ";");
475d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PEOPLE + " AS SELECT " +
4766cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                RawContactsColumns.CONCRETE_ID
477d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.People._ID + ", " +
478d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "name." + StructuredName.DISPLAY_NAME
479d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NAME + ", " +
4805ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME
481d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.DISPLAY_NAME + ", " +
482d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PHONETIC_NAME_SQL
483d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PHONETIC_NAME + " , " +
484d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "note." + Note.NOTE
485d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NOTES + ", " +
486caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
487caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
4885ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED
489d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.TIMES_CONTACTED + ", " +
4905ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED
491d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.LAST_TIME_CONTACTED + ", " +
4925ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE
493d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.CUSTOM_RINGTONE + ", " +
4945ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL
495d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.SEND_TO_VOICEMAIL + ", " +
4965ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.STARRED
497d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.STARRED + ", " +
498d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "organization." + Data._ID
499d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_ORGANIZATION_ID + ", " +
500d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "email." + Data._ID
501d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_EMAIL_ID + ", " +
502d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Data._ID
503d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_PHONE_ID + ", " +
504d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.NUMBER
505d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NUMBER + ", " +
506d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.TYPE
507d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.TYPE + ", " +
508d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.LABEL
509d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.LABEL + ", " +
510d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + PhoneColumns.NORMALIZED_NUMBER
511caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + People.NUMBER_KEY +
5125ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.RAW_CONTACTS + PEOPLE_JOINS +
513caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                " WHERE " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
514caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
515d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
516d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
517d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.ORGANIZATIONS + ";");
518d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.ORGANIZATIONS + " AS SELECT " +
519d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
520d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations._ID + ", " +
5215ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Data.RAW_CONTACT_ID
522d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.PERSON_ID + ", " +
523d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Data.IS_PRIMARY
524d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.ISPRIMARY + ", " +
525caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
526caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
527d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.COMPANY
528d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.COMPANY + ", " +
529d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.TYPE
530d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.TYPE + ", " +
531d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.LABEL
532d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.LABEL + ", " +
533d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.TITLE
534caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.TITLE +
5355ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS +
536d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
53733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Organization.CONTENT_ITEM_TYPE + "'"
538caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
539caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
540d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
541d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
542d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.CONTACT_METHODS + ";");
543d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.CONTACT_METHODS + " AS SELECT " +
544d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
545d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods._ID + ", " +
546d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
547d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.PERSON_ID + ", " +
548d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                CONTACT_METHOD_KIND_SQL
549d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.KIND + ", " +
550d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_IS_PRIMARY
551d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.ISPRIMARY + ", " +
552d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_DATA1
553d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.TYPE + ", " +
554d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_DATA2
555d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.DATA + ", " +
556d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_DATA3
557d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.LABEL + ", " +
558d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_DATA14
559d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.AUX_DATA + ", " +
560d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "name." + StructuredName.DISPLAY_NAME
561d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.NAME + ", " +
5625ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME
563d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.DISPLAY_NAME + ", " +
564caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
565caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
566d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PHONETIC_NAME_SQL
567d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.PHONETIC_NAME + " , " +
568d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "note." + Note.NOTE
569d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.NOTES + ", " +
5705ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED
571d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.TIMES_CONTACTED + ", " +
5725ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED
573d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.LAST_TIME_CONTACTED + ", " +
5745ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE
575d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.CUSTOM_RINGTONE + ", " +
5765ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL
577d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.SEND_TO_VOICEMAIL + ", " +
5785ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.STARRED
579caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + ContactMethods.STARRED +
580d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS +
58133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                " WHERE " + ContactMethods.KIND + " IS NOT NULL"
582caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                    + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
583caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                    + " AND " + RawContacts.IS_RESTRICTED + "=0" +
584d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
585d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
586d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
587d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHONES + ";");
588d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PHONES + " AS SELECT " +
589d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
590d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones._ID + ", " +
591d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
592d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.PERSON_ID + ", " +
593d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_IS_PRIMARY
594d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.ISPRIMARY + ", " +
595d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.NUMBER
596d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NUMBER + ", " +
597d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.TYPE
598d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.TYPE + ", " +
599d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.LABEL
600d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.LABEL + ", " +
601d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PhoneColumns.CONCRETE_NORMALIZED_NUMBER
602d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NUMBER_KEY + ", " +
603d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "name." + StructuredName.DISPLAY_NAME
604d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NAME + ", " +
6055ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME
606d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.DISPLAY_NAME + ", " +
607caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
608caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
609d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PHONETIC_NAME_SQL
610d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.PHONETIC_NAME + " , " +
611d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "note." + Note.NOTE
612d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NOTES + ", " +
6135ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED
614d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.TIMES_CONTACTED + ", " +
6155ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED
616d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.LAST_TIME_CONTACTED + ", " +
6175ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE
618d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.CUSTOM_RINGTONE + ", " +
6195ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL
620d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.SEND_TO_VOICEMAIL + ", " +
6215ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.STARRED
622caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.STARRED +
623d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS +
624d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
62533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Phone.CONTENT_ITEM_TYPE + "'"
626caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
627caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
628d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
629d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
630d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.EXTENSIONS + ";");
631d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.EXTENSIONS + " AS SELECT " +
632d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
633d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions._ID + ", " +
634d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
635d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.PERSON_ID + ", " +
636caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
637caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
638d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                ExtensionsColumns.NAME
639d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.NAME + ", " +
640d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                ExtensionsColumns.VALUE
641caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.VALUE +
6425ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS +
643d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
64433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE + "'"
645caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
646caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
647d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
648d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
649d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUPS + ";");
650d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.GROUPS + " AS SELECT " +
651d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                GroupsColumns.CONCRETE_ID + " AS " + android.provider.Contacts.Groups._ID + ", " +
652caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Groups.ACCOUNT_NAME + ", " +
653caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Groups.ACCOUNT_TYPE + ", " +
654d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.TITLE + " AS " + android.provider.Contacts.Groups.NAME + ", " +
655d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.NOTES + " AS " + android.provider.Contacts.Groups.NOTES + " , " +
656d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.SYSTEM_ID + " AS " + android.provider.Contacts.Groups.SYSTEM_ID +
657d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.GROUPS +
658d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
659d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
660d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUP_MEMBERSHIP + ";");
661d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.GROUP_MEMBERSHIP + " AS SELECT " +
662d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
663d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership._ID + ", " +
664d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
665d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.PERSON_ID + ", " +
666caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_NAME
667caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " +  RawContacts.ACCOUNT_NAME + ", " +
668caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_TYPE
669caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " +  RawContacts.ACCOUNT_TYPE + ", " +
670d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                GroupMembership.GROUP_ROW_ID
671d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.GROUP_ID + ", " +
672d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.TITLE
673d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.NAME + ", " +
674d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.NOTES
675d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.NOTES + " , " +
676d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.SYSTEM_ID
677caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.SYSTEM_ID +
6785ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_GROUPS +
679d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
68033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + GroupMembership.CONTENT_ITEM_TYPE + "'"
6815ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
682d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
683c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
684c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHOTOS + ";");
685c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PHOTOS + " AS SELECT " +
686c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                DataColumns.CONCRETE_ID
687c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos._ID + ", " +
688d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
689c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.PERSON_ID + ", " +
690caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
691caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
692c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                Tables.DATA + "." + Photo.PHOTO
693c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.DATA + ", " +
694c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.EXISTS_ON_SERVER
695c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.EXISTS_ON_SERVER + ", " +
696c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.DOWNLOAD_REQUIRED
697c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.DOWNLOAD_REQUIRED + ", " +
698c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.LOCAL_VERSION
699c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.LOCAL_VERSION + ", " +
700c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.SYNC_ERROR
701caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.SYNC_ERROR +
702c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS + LEGACY_PHOTO_JOIN +
703c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
70433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Photo.CONTENT_ITEM_TYPE + "'"
705caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
706caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
707c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        ";");
708d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    }
709d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
710f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public Uri insert(Uri uri, ContentValues values) {
711f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final int match = sUriMatcher.match(uri);
712f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        long id = 0;
713f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch (match) {
714f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE:
7153cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                id = insertPeople(values);
7163cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
7173cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
7183cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS:
7193cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                id = insertOrganization(values);
720f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
721f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
7220f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS: {
7235ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
7245ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertContactMethod(rawContactId, values);
725e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
7260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
727e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7280f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case CONTACTMETHODS: {
7295ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values, ContactMethods.PERSON_ID);
7305ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertContactMethod(rawContactId, values);
731e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
7320f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
733e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PHONES: {
7355ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.Phones.PERSON_ID);
7375ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertPhone(rawContactId, values);
7380f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7390f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
7410f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS: {
7425ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7430f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.Extensions.PERSON_ID);
7445ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertExtension(rawContactId, values);
7450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7470f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
7480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS:
7490f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                id = insertGroup(values);
750e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
751e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP: {
7535ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7540f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.GroupMembership.PERSON_ID);
7550f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                long groupId = getRequiredValue(values,
7560f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.GroupMembership.GROUP_ID);
7575ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertGroupMembership(rawContactId, groupId);
7580f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7590f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7600f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
76170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            case PRESENCE: {
76270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                id = insertPresence(values);
76370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                break;
76470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            }
76570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
766f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            default:
767f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
768f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
769f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
770f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (id < 0) {
771f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            return null;
772f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
773f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
774f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final Uri result = ContentUris.withAppendedId(uri, id);
775f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        onChange(result);
776f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return result;
777f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
778f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
7790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private long getRequiredValue(ContentValues values, String column) {
7800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        if (!values.containsKey(column)) {
7810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            throw new RuntimeException("Required value: " + column);
782e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        }
783e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return values.getAsLong(column);
785e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
786e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7873cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private long insertPeople(ContentValues values) {
788caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        ensureDefaultAccount();
789caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
7903cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        mValues.clear();
791f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
7926cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, RawContacts.CUSTOM_RINGTONE,
793f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                values, People.CUSTOM_RINGTONE);
7946cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, RawContacts.SEND_TO_VOICEMAIL,
795f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                values, People.SEND_TO_VOICEMAIL);
7966cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, RawContacts.LAST_TIME_CONTACTED,
797f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                values, People.LAST_TIME_CONTACTED);
7986cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, RawContacts.TIMES_CONTACTED,
799f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                values, People.TIMES_CONTACTED);
8006cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, RawContacts.STARRED,
801f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                values, People.STARRED);
802df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        mValues.put(RawContacts.ACCOUNT_NAME, mAccount.name);
803df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        mValues.put(RawContacts.ACCOUNT_TYPE, mAccount.type);
8046cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov        Uri contactUri = mContactsProvider.insert(RawContacts.CONTENT_URI, mValues);
8055ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        long rawContactId = ContentUris.parseId(contactUri);
806f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
807f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (values.containsKey(People.NAME) || values.containsKey(People.PHONETIC_NAME)) {
8083cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            mValues.clear();
8095ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
8103cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            mValues.put(ContactsContract.Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
8113cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            OpenHelper.copyStringValue(mValues, StructuredName.DISPLAY_NAME,
812f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                    values, People.NAME);
813f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            if (values.containsKey(People.PHONETIC_NAME)) {
814f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                String phoneticName = values.getAsString(People.PHONETIC_NAME);
815f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                NameSplitter.Name parsedName = new NameSplitter.Name();
816f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                mPhoneticNameSplitter.split(parsedName, phoneticName);
8173cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                mValues.put(StructuredName.PHONETIC_GIVEN_NAME, parsedName.getGivenNames());
8183cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                mValues.put(StructuredName.PHONETIC_MIDDLE_NAME, parsedName.getMiddleName());
8193cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                mValues.put(StructuredName.PHONETIC_FAMILY_NAME, parsedName.getFamilyName());
820f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            }
821f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
8223cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            mContactsProvider.insert(ContactsContract.Data.CONTENT_URI, mValues);
823f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
824f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
825f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (values.containsKey(People.NOTES)) {
8263cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            mValues.clear();
8275ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(Data.RAW_CONTACT_ID, rawContactId);
8283cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            mValues.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE);
8293cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            OpenHelper.copyStringValue(mValues, Note.NOTE, values, People.NOTES);
8303cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            mContactsProvider.insert(Data.CONTENT_URI, mValues);
831f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
832f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
833f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // TODO instant aggregation
8345ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        return rawContactId;
835f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
836f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
8373cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private long insertOrganization(ContentValues values) {
8383cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        mValues.clear();
8393cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8405ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.RAW_CONTACT_ID,
8413cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.PERSON_ID);
8423cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        mValues.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
8433cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8443cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY,
8453cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.ISPRIMARY);
8463cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8473cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        OpenHelper.copyStringValue(mValues, Organization.COMPANY,
8483cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.COMPANY);
8493cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8503cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        // TYPE values happen to remain the same between V1 and V2 - can just copy the value
8513cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        OpenHelper.copyLongValue(mValues, Organization.TYPE,
8523cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.TYPE);
8533cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8543cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        OpenHelper.copyStringValue(mValues, Organization.LABEL,
8553cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.LABEL);
8563cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        OpenHelper.copyStringValue(mValues, Organization.TITLE,
8573cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.TITLE);
8583cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8593cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues);
8603cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8613cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        return ContentUris.parseId(uri);
8623cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    }
863f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
8645ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertPhone(long rawContactId, ContentValues values) {
865e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        mValues.clear();
866e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8675ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
868e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        mValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
869e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
870e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY,
871e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                values, android.provider.Contacts.Phones.ISPRIMARY);
872e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
873e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Phone.NUMBER,
874e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                values, android.provider.Contacts.Phones.NUMBER);
875e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
876e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        // TYPE values happen to remain the same between V1 and V2 - can just copy the value
877e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Phone.TYPE,
878e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                values, android.provider.Contacts.Phones.TYPE);
879e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
880e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Phone.LABEL,
881e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                values, android.provider.Contacts.Phones.LABEL);
882e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
883e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues);
884e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
885e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        return ContentUris.parseId(uri);
886e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
887e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8885ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertContactMethod(long rawContactId, ContentValues values) {
889e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Integer kind = values.getAsInteger(ContactMethods.KIND);
890e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        if (kind == null) {
891e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            throw new RuntimeException("Required value: " + ContactMethods.KIND);
892e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        }
893e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
894e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        mValues.clear();
8955ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
896e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
897e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY, values, ContactMethods.ISPRIMARY);
898e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
899e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        switch (kind) {
900e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case android.provider.Contacts.KIND_EMAIL:
901e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                copyCommonFields(values, Email.CONTENT_ITEM_TYPE, Email.TYPE, Email.LABEL,
9020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        Email.DATA, Data.DATA14);
903e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
904e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
905e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case android.provider.Contacts.KIND_IM:
906e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                copyCommonFields(values, Im.CONTENT_ITEM_TYPE, Im.TYPE, Im.LABEL,
9070f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        Email.DATA, Data.DATA14);
908e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
909e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
910e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case android.provider.Contacts.KIND_POSTAL:
91167dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey                copyCommonFields(values, StructuredPostal.CONTENT_ITEM_TYPE, StructuredPostal.TYPE,
91267dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey                        StructuredPostal.LABEL, StructuredPostal.FORMATTED_ADDRESS, Data.DATA14);
913e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
914e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        }
915e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
916e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues);
917e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        return ContentUris.parseId(uri);
918e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
919e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
920e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private void copyCommonFields(ContentValues values, String mimeType, String typeColumn,
921e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            String labelColumn, String dataColumn, String auxDataColumn) {
922e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        mValues.put(Data.MIMETYPE, mimeType);
923e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, typeColumn, values, ContactMethods.TYPE);
924e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, labelColumn, values, ContactMethods.LABEL);
925e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, dataColumn, values, ContactMethods.DATA);
926e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, auxDataColumn, values, ContactMethods.AUX_DATA);
927e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
928e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
9295ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertExtension(long rawContactId, ContentValues values) {
9300f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.clear();
9310f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9325ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
9330f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(Data.MIMETYPE, android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE);
9340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9350f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, ExtensionsColumns.NAME,
9360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                values, android.provider.Contacts.People.Extensions.NAME);
9370f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, ExtensionsColumns.VALUE,
9380f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                values, android.provider.Contacts.People.Extensions.VALUE);
9390f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues);
9410f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
9420f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
9430f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9440f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private long insertGroup(ContentValues values) {
945caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        ensureDefaultAccount();
9460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.clear();
9470f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Groups.TITLE,
9490f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                values, android.provider.Contacts.Groups.NAME);
9500f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Groups.NOTES,
9510f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                values, android.provider.Contacts.Groups.NOTES);
9520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Groups.SYSTEM_ID,
9530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                values, android.provider.Contacts.Groups.SYSTEM_ID);
9540f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
955df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        mValues.put(Groups.ACCOUNT_NAME, mAccount.name);
956df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        mValues.put(Groups.ACCOUNT_TYPE, mAccount.type);
957caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
9580f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        Uri uri = mContactsProvider.insert(Groups.CONTENT_URI, mValues);
9590f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
9600f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
9610f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9625ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertGroupMembership(long rawContactId, long groupId) {
9630f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.clear();
9640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE);
9665ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(GroupMembership.RAW_CONTACT_ID, rawContactId);
9670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(GroupMembership.GROUP_ROW_ID, groupId);
9680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues);
9700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
9710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
9720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
97370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    private long insertPresence(ContentValues values) {
97470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        mValues.clear();
97570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
976caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        String protocol = values.getAsString(android.provider.Contacts.Presence.IM_PROTOCOL);
977caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        if (protocol == null) {
978caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov            throw new IllegalArgumentException("IM_PROTOCOL is required");
979caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        }
980caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
981caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        if (protocol.startsWith("pre:")) {
982caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov            mValues.put(Presence.IM_PROTOCOL, Integer.parseInt(protocol.substring(4)));
983caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        } else if (protocol.startsWith("custom:")) {
984caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov            mValues.put(Presence.IM_PROTOCOL, Im.PROTOCOL_CUSTOM);
985caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov            // TODO add support for custom protocol
986caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        }
987caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
98870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        OpenHelper.copyLongValue(mValues, Presence._ID,
98970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                values, android.provider.Contacts.Presence._ID);
9905ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Presence.RAW_CONTACT_ID,
99170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                values, android.provider.Contacts.Presence.PERSON_ID);
99270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        OpenHelper.copyStringValue(mValues, Presence.IM_HANDLE,
99370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                values, android.provider.Contacts.Presence.IM_HANDLE);
99470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        OpenHelper.copyStringValue(mValues, Presence.IM_ACCOUNT,
99570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                values, android.provider.Contacts.Presence.IM_ACCOUNT);
99670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        OpenHelper.copyLongValue(mValues, Presence.PRESENCE_STATUS,
99770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                values, android.provider.Contacts.Presence.PRESENCE_STATUS);
99870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        OpenHelper.copyStringValue(mValues, Presence.PRESENCE_CUSTOM_STATUS,
99970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                values, android.provider.Contacts.Presence.PRESENCE_CUSTOM_STATUS);
100070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
100170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        return mContactsProvider.insertPresence(mValues);
100270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    }
100370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
1004f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
1005f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final int match = sUriMatcher.match(uri);
1006c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int count = 0;
1007f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch(match) {
1008f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE_UPDATE_CONTACT_TIME:
1009f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                count = updateContactTime(uri, values);
1010f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
1011c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1012c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PEOPLE_PHOTO: {
10135ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
10145ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                return updatePhoto(rawContactId, values);
1015c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            }
1016c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1017c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PHOTOS:
1018c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                // TODO
1019c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
1020c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1021c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PHOTOS_ID:
1022c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                // TODO
1023c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
1024c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1025c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1026f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            default:
1027f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
1028f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1029f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1030f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (count > 0) {
1031f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            mContext.getContentResolver().notifyChange(uri, null);
1032f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1033f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return count;
1034f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1035f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1036c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1037f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private int updateContactTime(Uri uri, ContentValues values) {
1038f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1039f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // TODO check sanctions
1040f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1041f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        long lastTimeContacted;
1042f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (values.containsKey(People.LAST_TIME_CONTACTED)) {
1043f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            lastTimeContacted = values.getAsLong(People.LAST_TIME_CONTACTED);
1044f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        } else {
1045f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            lastTimeContacted = System.currentTimeMillis();
1046f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1047f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
10485ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
1049d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov        long contactId = mOpenHelper.getContactId(rawContactId);
1050d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov        if (contactId != 0) {
1051d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov            mContactsProvider.updateContactTime(contactId, lastTimeContacted);
1052f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        } else {
1053f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            mLastTimeContactedUpdate.bindLong(1, lastTimeContacted);
10545ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mLastTimeContactedUpdate.bindLong(2, rawContactId);
1055f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            mLastTimeContactedUpdate.execute();
1056f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1057f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return 1;
1058f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1059f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
10605ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private int updatePhoto(long rawContactId, ContentValues values) {
1061c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1062c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        // TODO check sanctions
1063c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1064c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int count;
1065c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1066c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        long dataId = -1;
1067c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        Cursor c = mContactsProvider.query(Data.CONTENT_URI, PhotoQuery.COLUMNS,
10685ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Data.RAW_CONTACT_ID + "=" + rawContactId + " AND "
1069c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + Data.MIMETYPE + "=" + mOpenHelper.getMimeTypeId(Photo.CONTENT_ITEM_TYPE),
1070c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                null, null);
1071c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        try {
1072c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            if (c.moveToFirst()) {
1073c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                dataId = c.getLong(PhotoQuery._ID);
1074c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            }
1075c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        } finally {
1076c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            c.close();
1077c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        }
1078c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1079c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.clear();
1080c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA);
1081c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.put(Photo.PHOTO, bytes);
1082c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1083c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        if (dataId == -1) {
1084c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE);
10855ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(Data.RAW_CONTACT_ID, rawContactId);
1086c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            Uri dataUri = mContactsProvider.insert(Data.CONTENT_URI, mValues);
1087c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            dataId = ContentUris.parseId(dataUri);
1088c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            count = 1;
1089c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        } else {
1090c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            Uri dataUri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
1091c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            count = mContactsProvider.update(dataUri, mValues, null, null);
1092c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        }
1093c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1094c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.clear();
1095c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.LOCAL_VERSION,
1096c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.LOCAL_VERSION);
1097c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.DOWNLOAD_REQUIRED,
1098c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.DOWNLOAD_REQUIRED);
1099c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.EXISTS_ON_SERVER,
1100c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.EXISTS_ON_SERVER);
1101c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.SYNC_ERROR,
1102c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.SYNC_ERROR);
1103c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1104c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int updated = mContactsProvider.update(Data.CONTENT_URI, mValues,
1105c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                Data.MIMETYPE + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'"
11065ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Data.RAW_CONTACT_ID + "=" + rawContactId
1107c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AND " + LegacyPhotoData.PHOTO_DATA_ID + "=" + dataId, null);
1108c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        if (updated == 0) {
11095ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(Data.RAW_CONTACT_ID, rawContactId);
1110c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(Data.MIMETYPE, LegacyPhotoData.CONTENT_ITEM_TYPE);
1111c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(LegacyPhotoData.PHOTO_DATA_ID, dataId);
1112c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mContactsProvider.insert(Data.CONTENT_URI, mValues);
1113c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        }
1114c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1115c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        return count;
1116c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
1117c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
11183cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    public int delete(Uri uri, String selection, String[] selectionArgs) {
11193cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        final int match = sUriMatcher.match(uri);
11203cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        int count = 0;
11213cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        switch (match) {
112233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case PEOPLE_ID:
112333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                count = mContactsProvider.deleteRawContact(ContentUris.parseId(uri), false);
112433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                break;
112533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov
11263cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS_ID:
1127e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1128e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        ORGANIZATION_MIME_TYPES);
1129e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1130e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1131e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS_ID:
1132e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1133e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        CONTACT_METHOD_MIME_TYPES);
1134e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1135e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1136e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES_ID:
1137e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1138e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        PHONE_MIME_TYPES);
11393cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
11403cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
11413cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            default:
11423cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
11433cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        }
11443cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
11453cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        return count;
11463cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    }
11473cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
1148f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
1149c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            String sortOrder, String limit) {
1150caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        ensureDefaultAccount();
1151caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
1152f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final SQLiteDatabase db = mOpenHelper.getReadableDatabase();
1153f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
1154f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        String groupBy = null;
1155f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1156f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final int match = sUriMatcher.match(uri);
1157f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch (match) {
1158f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE: {
115970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1160f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
1161caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1162f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
1163f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            }
1164f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1165f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE_ID:
116670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1167f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
1168caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1169caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + People._ID + "=");
1170f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1171f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
1172f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1173445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov            case PEOPLE_FILTER: {
1174445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1175445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
1176caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1177445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                String filterParam = uri.getPathSegments().get(2);
1178caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + People._ID + " IN "
11795ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + mContactsProvider.getRawContactsByFilterAsNestedQuery(filterParam));
1180445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                break;
1181445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov            }
1182445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov
11833cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS:
1184d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.ORGANIZATIONS);
1185d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sOrganizationProjectionMap);
1186caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
11873cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
11883cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
11893cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS_ID:
1190d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.ORGANIZATIONS);
11913cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                qb.setProjectionMap(sOrganizationProjectionMap);
1192caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1193d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Organizations._ID + "=");
1194e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1195e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1196e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1197e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS:
1198d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS);
1199d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
1200caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1201e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1202e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1203e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS_ID:
1204d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS);
1205e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
1206caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1207d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods._ID + "=");
1208e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1209e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1210e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1211e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS:
1212d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS);
1213e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
1214caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1215d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "=");
1216e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1217e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL");
1218e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1219e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1220e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS_ID:
1221d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS);
1222e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
1223caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1224d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "=");
1225e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1226d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods._ID + "=");
1227e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
1228e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL");
1229e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1230e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1231e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES:
1232d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.PHONES);
1233d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
1234caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1235e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1236e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1237e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES_ID:
1238d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.PHONES);
1239e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
1240caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1241d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "=");
1242e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1243e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1244e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1245fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov            case PHONES_FILTER:
1246fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                qb.setTables(LegacyTables.PHONES);
1247fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
1248fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                applyRawContactsAccount(qb, uri);
1249fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                if (uri.getPathSegments().size() > 2) {
1250fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                    String filterParam = uri.getLastPathSegment();
1251fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                    StringBuilder sb = new StringBuilder();
1252fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                    sb.append(" AND person =");
1253fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                    mOpenHelper.appendRawContactsByPhoneNumberAsNestedQuery(sb, filterParam);
1254fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                    qb.appendWhere(sb.toString());
1255fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                }
1256fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                break;
1257fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
1258e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_PHONES:
1259d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.PHONES);
1260e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
1261caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1262d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "=");
1263e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1264e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1265e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1266e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_PHONES_ID:
1267d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.PHONES);
1268e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
1269caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1270d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "=");
12713cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1272d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "=");
1273e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
12743cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
12753cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
12760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS:
1277d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS);
1278d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
1279caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
12800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
12810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
12820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS_ID:
1283d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS);
12840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
1285caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1286d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "=");
12870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
12880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
12890f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
12900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_EXTENSIONS:
1291d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS);
12920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
1293caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1294d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "=");
12950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
12960f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
12970f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
12980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_EXTENSIONS_ID:
1299d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS);
13000f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
1301caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1302d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "=");
13030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1304d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "=");
13050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
13060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
13070f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
13080f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS:
1309d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.GROUPS);
13100f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupProjectionMap);
1311caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyGroupAccount(qb, uri);
13120f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
13130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
13140f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS_ID:
1315d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.GROUPS);
13160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupProjectionMap);
1317caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyGroupAccount(qb, uri);
1318caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Groups._ID + "=");
13190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
13200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
13210f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
13220f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP:
1323d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP);
1324d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
1325caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
13260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
13270f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
13280f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP_ID:
1329d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP);
13300f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
1331caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1332d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "=");
13330f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
13340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
13350f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
13360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_GROUPMEMBERSHIP:
1337d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP);
13380f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
1339caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1340d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "=");
13410f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
13420f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
13430f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
13440f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_GROUPMEMBERSHIP_ID:
1345d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP);
13460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
1347caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1348d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "=");
13490f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1350d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "=");
13510f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
13520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
13530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
1354c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PEOPLE_PHOTO:
1355c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.setTables(LegacyTables.PHOTOS);
1356c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.setProjectionMap(sPhotoProjectionMap);
1357caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                applyRawContactsAccount(qb, uri);
1358c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Photos.PERSON_ID + "=");
1359c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1360c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                limit = "1";
1361c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
1362c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
136370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            case PRESENCE:
136470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(Tables.PRESENCE);
136570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setProjectionMap(sPresenceProjectionMap);
136670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.appendWhere(mContactsProvider.getContactsRestrictionExceptionAsNestedQuery(
136770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                        android.provider.Contacts.Presence.PERSON_ID));
136870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                break;
136970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
137070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            case PRESENCE_ID:
137170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(Tables.PRESENCE);
137270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setProjectionMap(sPresenceProjectionMap);
137370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.appendWhere(mContactsProvider.getContactsRestrictionExceptionAsNestedQuery(
137470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                        android.provider.Contacts.Presence.PERSON_ID));
137570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Presence._ID + "=");
137670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
137770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                break;
137870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
1379c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            case SEARCH_SUGGESTIONS:
1380c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
1381c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                // No legacy compatibility for search suggestions
1382a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                return mGlobalSearchSupport.handleSearchSuggestionsQuery(db, uri, limit);
1383c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
138433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case DELETED_PEOPLE:
138533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case DELETED_GROUPS:
138633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                throw new UnsupportedOperationException();
138733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov
1388f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            default:
1389f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                throw new IllegalArgumentException("Unknown URL " + uri);
1390f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1391f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1392f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // Perform the query and set the notification uri
1393f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final Cursor c = qb.query(db, projection, selection, selectionArgs,
1394f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                groupBy, null, sortOrder, limit);
1395f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (c != null) {
13966cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov            c.setNotificationUri(mContext.getContentResolver(), RawContacts.CONTENT_URI);
1397f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1398f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return c;
1399f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1400f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1401caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private void applyRawContactsAccount(SQLiteQueryBuilder qb, Uri uri) {
1402caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        StringBuilder sb = new StringBuilder();
1403caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(RawContacts.ACCOUNT_NAME + "=");
1404df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.name);
1405caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(" AND " + RawContacts.ACCOUNT_TYPE + "=");
1406df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.type);
1407caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        qb.appendWhere(sb.toString());
1408caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
1409caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
1410caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private void applyGroupAccount(SQLiteQueryBuilder qb, Uri uri) {
1411caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        StringBuilder sb = new StringBuilder();
1412caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(Groups.ACCOUNT_NAME + "=");
1413df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.name);
1414caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(" AND " + Groups.ACCOUNT_TYPE + "=");
1415df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.type);
1416caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        qb.appendWhere(sb.toString());
1417caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
1418caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
1419f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    /**
1420f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     * Called when a change has been made.
1421f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     *
1422f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     * @param uri the uri that the change was made to
1423f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     */
1424f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private void onChange(Uri uri) {
1425f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContext.getContentResolver().notifyChange(android.provider.Contacts.CONTENT_URI, null);
1426f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1427f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov}
1428