LegacyApiSupport.java revision bce6ee29f2d971ceae2bfce85a06bb3ecec6537a
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;
3867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikovimport android.provider.BaseColumns;
39f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract;
40e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.Contacts.ContactMethods;
4161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikovimport android.provider.Contacts.Extensions;
42f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.Contacts.People;
43e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.Data;
440f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.Groups;
4570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikovimport android.provider.ContactsContract.Presence;
46c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract.RawContacts;
47e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email;
480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership;
49e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im;
50f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Note;
513cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization;
52e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone;
53c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo;
54f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName;
5567dde51ab932dc84d95a203b113989b13437f13dJeff Sharkeyimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
56b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamiltonimport android.util.Log;
57f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
58f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport java.util.HashMap;
59622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkeyimport java.util.Locale;
60f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
61b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamiltonpublic class LegacyApiSupport {
62f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
63caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private static final String TAG = "ContactsProviderV1";
64caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
656f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov    private static final String NON_EXISTENT_ACCOUNT_TYPE = "android.INVALID_ACCOUNT_TYPE";
6628153f2e3dda944e983f6dd0ab80aca63631ddfaJeff Hamilton    private static final String NON_EXISTENT_ACCOUNT_NAME = "invalid";
676f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov
68f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
69f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
70f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE = 1;
71f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE_ID = 2;
72f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE_UPDATE_CONTACT_TIME = 3;
733cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final int ORGANIZATIONS = 4;
743cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final int ORGANIZATIONS_ID = 5;
75e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_CONTACTMETHODS = 6;
76e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_CONTACTMETHODS_ID = 7;
77e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int CONTACTMETHODS = 8;
78e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int CONTACTMETHODS_ID = 9;
79e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_PHONES = 10;
80e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_PHONES_ID = 11;
81e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PHONES = 12;
82e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PHONES_ID = 13;
830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int EXTENSIONS = 14;
840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int EXTENSIONS_ID = 15;
850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_EXTENSIONS = 16;
860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_EXTENSIONS_ID = 17;
870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPS = 18;
880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPS_ID = 19;
890f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPMEMBERSHIP = 20;
900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPMEMBERSHIP_ID = 21;
910f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_GROUPMEMBERSHIP = 22;
920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_GROUPMEMBERSHIP_ID = 23;
93c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PEOPLE_PHOTO = 24;
94c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PHOTOS = 25;
95c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PHOTOS_ID = 26;
96445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov    private static final int PEOPLE_FILTER = 29;
9733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov    private static final int DELETED_PEOPLE = 30;
9833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov    private static final int DELETED_GROUPS = 31;
99c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    private static final int SEARCH_SUGGESTIONS = 32;
100b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov    private static final int SEARCH_SHORTCUT = 33;
101b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov    private static final int PHONES_FILTER = 34;
1021b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final int LIVE_FOLDERS_PEOPLE = 35;
1031b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final int LIVE_FOLDERS_PEOPLE_GROUP_NAME = 36;
1041b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final int LIVE_FOLDERS_PEOPLE_WITH_PHONES = 37;
1051b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final int LIVE_FOLDERS_PEOPLE_FAVORITES = 38;
106bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov    private static final int CONTACTMETHODS_EMAIL = 39;
107c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
108e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String PEOPLE_JOINS =
1095ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            " LEFT OUTER JOIN data name ON (raw_contacts._id = name.raw_contact_id"
110e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = name.mimetype_id)"
111e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + StructuredName.CONTENT_ITEM_TYPE + "')"
1125ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data organization ON (raw_contacts._id = organization.raw_contact_id"
113e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = organization.mimetype_id)"
114e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Organization.CONTENT_ITEM_TYPE + "' AND organization.is_primary)"
1155ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data email ON (raw_contacts._id = email.raw_contact_id"
116e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = email.mimetype_id)"
117e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Email.CONTENT_ITEM_TYPE + "' AND email.is_primary)"
1185ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data note ON (raw_contacts._id = note.raw_contact_id"
119e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = note.mimetype_id)"
120e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Note.CONTENT_ITEM_TYPE + "')"
1215ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data phone ON (raw_contacts._id = phone.raw_contact_id"
122e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = phone.mimetype_id)"
123e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Phone.CONTENT_ITEM_TYPE + "' AND phone.is_primary)";
124e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
125d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    public static final String DATA_JOINS =
126d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            " JOIN mimetypes ON (mimetypes._id = data.mimetype_id)"
1275ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " JOIN raw_contacts ON (raw_contacts._id = data.raw_contact_id)"
128d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            + PEOPLE_JOINS;
129d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
13070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    public static final String PRESENCE_JOINS =
13170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            " LEFT OUTER JOIN presence ON ("
13270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            + " presence.presence_id = (SELECT max(presence_id) FROM presence"
1335dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov            + " WHERE people._id = presence_raw_contact_id))";
13470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
135e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String PHONETIC_NAME_SQL = "trim(trim("
136e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_GIVEN_NAME + ",' ')||' '||"
137e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_MIDDLE_NAME + ",' '))||' '||"
138e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_FAMILY_NAME + ",' ')) ";
139e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
140e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String CONTACT_METHOD_KIND_SQL =
141d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            "CAST ((CASE WHEN mimetype='" + Email.CONTENT_ITEM_TYPE + "'"
142e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                + " THEN " + android.provider.Contacts.KIND_EMAIL
143e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                + " ELSE"
144e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + " (CASE WHEN mimetype='" + Im.CONTENT_ITEM_TYPE +"'"
145e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " THEN " + android.provider.Contacts.KIND_IM
146e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " ELSE"
14767dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey                        + " (CASE WHEN mimetype='" + StructuredPostal.CONTENT_ITEM_TYPE + "'"
148e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " THEN "  + android.provider.Contacts.KIND_POSTAL
149e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " ELSE"
150e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                                + " NULL"
151e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " END)"
152e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " END)"
153d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                + " END) AS INTEGER)";
154f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
15597f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov    private static final String IM_PROTOCOL_SQL =
15697f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov            "(CASE WHEN " + Presence.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM
15797f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " THEN 'custom:'||" + Presence.CUSTOM_PROTOCOL
15897f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " ELSE 'pre:'||" + Presence.PROTOCOL
15997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " END)";
16097f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov
16197f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov    private static String CONTACT_METHOD_DATA_SQL =
16297f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov            "(CASE WHEN " + Data.MIMETYPE + "='" + Im.CONTENT_ITEM_TYPE + "'"
16397f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " THEN (CASE WHEN " + Tables.DATA + "." + Im.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM
16497f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                    + " THEN 'custom:'||" + Tables.DATA + "." + Im.CUSTOM_PROTOCOL
16597f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                    + " ELSE 'pre:'||" + Tables.DATA + "." + Im.PROTOCOL
16697f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                    + " END)"
16797f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " ELSE " + DataColumns.CONCRETE_DATA2
16897f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " END)";
16997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov
1701b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final Uri LIVE_FOLDERS_CONTACTS_URI = Uri.withAppendedPath(
1711b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            ContactsContract.AUTHORITY_URI, "live_folders/contacts");
1721b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
1731b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final Uri LIVE_FOLDERS_CONTACTS_WITH_PHONES_URI = Uri.withAppendedPath(
1741b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            ContactsContract.AUTHORITY_URI, "live_folders/contacts_with_phones");
1751b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
1761b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final Uri LIVE_FOLDERS_CONTACTS_FAVORITES_URI = Uri.withAppendedPath(
1771b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            ContactsContract.AUTHORITY_URI, "live_folders/favorites");
17897f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov
179f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public interface LegacyTables {
180d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String PEOPLE = "view_v1_people";
1815dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov        public static final String PEOPLE_JOIN_PRESENCE = "view_v1_people people " + PRESENCE_JOINS;
182d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String GROUPS = "view_v1_groups";
183d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String ORGANIZATIONS = "view_v1_organizations";
184d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String CONTACT_METHODS = "view_v1_contact_methods";
185d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String PHONES = "view_v1_phones";
186d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String EXTENSIONS = "view_v1_extensions";
187d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String GROUP_MEMBERSHIP = "view_v1_group_membership";
188c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String PHOTOS = "view_v1_photos";
189f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
190f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
191e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] ORGANIZATION_MIME_TYPES = new String[] {
192e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Organization.CONTENT_ITEM_TYPE
193e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
194e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
195e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] CONTACT_METHOD_MIME_TYPES = new String[] {
196e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Email.CONTENT_ITEM_TYPE,
197e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Im.CONTENT_ITEM_TYPE,
19867dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey        StructuredPostal.CONTENT_ITEM_TYPE,
199e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
200e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
201e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] PHONE_MIME_TYPES = new String[] {
202e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Phone.CONTENT_ITEM_TYPE
203e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
204e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
20567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private interface IdQuery {
20667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        String[] COLUMNS = { BaseColumns._ID };
207c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
208c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int _ID = 0;
209c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
210c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
211c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    /**
212c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     * A custom data row that is used to store legacy photo data fields no
213c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     * longer directly supported by the API.
214c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     */
215c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private interface LegacyPhotoData {
216c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/photo_v1_extras";
217c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
218c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String PHOTO_DATA_ID = Data.DATA1;
219c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String LOCAL_VERSION = Data.DATA2;
220c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String DOWNLOAD_REQUIRED = Data.DATA3;
221c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String EXISTS_ON_SERVER = Data.DATA4;
222c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String SYNC_ERROR = Data.DATA5;
223c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
224c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
225c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    public static final String LEGACY_PHOTO_JOIN =
2265ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            " LEFT OUTER JOIN data legacy_photo ON (raw_contacts._id = legacy_photo.raw_contact_id"
227c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = legacy_photo.mimetype_id)"
228c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'"
229c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + " AND " + DataColumns.CONCRETE_ID + " = legacy_photo." + LegacyPhotoData.PHOTO_DATA_ID
230c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + ")";
231c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
232f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final HashMap<String, String> sPeopleProjectionMap;
2333cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final HashMap<String, String> sOrganizationProjectionMap;
234e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final HashMap<String, String> sContactMethodProjectionMap;
235e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final HashMap<String, String> sPhoneProjectionMap;
2360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sExtensionProjectionMap;
2370f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sGroupProjectionMap;
2380f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sGroupMembershipProjectionMap;
239c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final HashMap<String, String> sPhotoProjectionMap;
240fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
241f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    static {
242f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
243f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // Contacts URI matching table
244f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        UriMatcher matcher = sUriMatcher;
245f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
246f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        String authority = android.provider.Contacts.AUTHORITY;
2470f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "extensions", EXTENSIONS);
2480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "extensions/#", EXTENSIONS_ID);
2490f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groups", GROUPS);
2500f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groups/#", GROUPS_ID);
251f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/name/*/members", GROUP_NAME_MEMBERS);
252f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/name/*/members/filter/*",
253f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                GROUP_NAME_MEMBERS_FILTER);
254f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/system_id/*/members", GROUP_SYSTEM_ID_MEMBERS);
255f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/system_id/*/members/filter/*",
256f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                GROUP_SYSTEM_ID_MEMBERS_FILTER);
2570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groupmembership", GROUPMEMBERSHIP);
2580f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groupmembership/#", GROUPMEMBERSHIP_ID);
259f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groupmembershipraw", GROUPMEMBERSHIP_RAW);
260f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people", PEOPLE);
261f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/strequent", PEOPLE_STREQUENT);
262f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/strequent/filter/*", PEOPLE_STREQUENT_FILTER);
263445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov        matcher.addURI(authority, "people/filter/*", PEOPLE_FILTER);
264f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/with_phones_filter/*",
265f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_WITH_PHONES_FILTER);
266f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/with_email_or_im_filter/*",
267f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_WITH_EMAIL_OR_IM_FILTER);
268f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people/#", PEOPLE_ID);
2690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/extensions", PEOPLE_EXTENSIONS);
2700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/extensions/#", PEOPLE_EXTENSIONS_ID);
271e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/phones", PEOPLE_PHONES);
272e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/phones/#", PEOPLE_PHONES_ID);
273f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/phones_with_presence",
274f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_PHONES_WITH_PRESENCE);
275c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "people/#/photo", PEOPLE_PHOTO);
276f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/photo/data", PEOPLE_PHOTO_DATA);
277e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/contact_methods", PEOPLE_CONTACTMETHODS);
278f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/contact_methods_with_presence",
279f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_CONTACTMETHODS_WITH_PRESENCE);
280e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID);
281f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/organizations", PEOPLE_ORGANIZATIONS);
282f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/organizations/#", PEOPLE_ORGANIZATIONS_ID);
2830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/groupmembership", PEOPLE_GROUPMEMBERSHIP);
2840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/groupmembership/#", PEOPLE_GROUPMEMBERSHIP_ID);
285f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/raw", PEOPLE_RAW);
286f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/owner", PEOPLE_OWNER);
287f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people/#/update_contact_time",
288f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                PEOPLE_UPDATE_CONTACT_TIME);
28933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov        matcher.addURI(authority, "deleted_people", DELETED_PEOPLE);
29033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov        matcher.addURI(authority, "deleted_groups", DELETED_GROUPS);
291e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "phones", PHONES);
292f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones_with_presence", PHONES_WITH_PRESENCE);
293fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        matcher.addURI(authority, "phones/filter/*", PHONES_FILTER);
294f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones/filter_name/*", PHONES_FILTER_NAME);
295f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones/mobile_filter_name/*",
296f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PHONES_MOBILE_FILTER_NAME);
297e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "phones/#", PHONES_ID);
298c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "photos", PHOTOS);
299c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "photos/#", PHOTOS_ID);
300e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "contact_methods", CONTACTMETHODS);
301bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        matcher.addURI(authority, "contact_methods/email", CONTACTMETHODS_EMAIL);
302f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "contact_methods/email/*", CONTACTMETHODS_EMAIL_FILTER);
303e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "contact_methods/#", CONTACTMETHODS_ID);
304f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "contact_methods/with_presence",
305f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                CONTACTMETHODS_WITH_PRESENCE);
3063cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        matcher.addURI(authority, "organizations", ORGANIZATIONS);
3073cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        matcher.addURI(authority, "organizations/#", ORGANIZATIONS_ID);
308f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "voice_dialer_timestamp", VOICE_DIALER_TIMESTAMP);
309c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY,
310c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                SEARCH_SUGGESTIONS);
311c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY + "/*",
312c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                SEARCH_SUGGESTIONS);
313b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/#",
314b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov                SEARCH_SHORTCUT);
315f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "settings", SETTINGS);
316f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//
3171b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/people", LIVE_FOLDERS_PEOPLE);
3181b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/people/*",
3191b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                LIVE_FOLDERS_PEOPLE_GROUP_NAME);
3201b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/people_with_phones",
3211b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                LIVE_FOLDERS_PEOPLE_WITH_PHONES);
3221b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/favorites",
3231b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                LIVE_FOLDERS_PEOPLE_FAVORITES);
324f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
325f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
326e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        HashMap<String, String> peopleProjectionMap = new HashMap<String, String>();
327d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.NAME, People.NAME);
328d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.DISPLAY_NAME, People.DISPLAY_NAME);
329d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.PHONETIC_NAME, People.PHONETIC_NAME);
330d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.NOTES, People.NOTES);
331d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.TIMES_CONTACTED, People.TIMES_CONTACTED);
332d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.LAST_TIME_CONTACTED, People.LAST_TIME_CONTACTED);
333d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.CUSTOM_RINGTONE, People.CUSTOM_RINGTONE);
334d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.SEND_TO_VOICEMAIL, People.SEND_TO_VOICEMAIL);
335d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.STARRED, People.STARRED);
336e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
337e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPeopleProjectionMap = new HashMap<String, String>(peopleProjectionMap);
3389155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPeopleProjectionMap.put(People._ID, People._ID);
339d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.PRIMARY_ORGANIZATION_ID, People.PRIMARY_ORGANIZATION_ID);
340d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.PRIMARY_EMAIL_ID, People.PRIMARY_EMAIL_ID);
341d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.PRIMARY_PHONE_ID, People.PRIMARY_PHONE_ID);
342d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.NUMBER, People.NUMBER);
343d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.TYPE, People.TYPE);
344d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.LABEL, People.LABEL);
345d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.NUMBER_KEY, People.NUMBER_KEY);
3460126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov        sPeopleProjectionMap.put(People.IM_PROTOCOL, IM_PROTOCOL_SQL + " AS " + People.IM_PROTOCOL);
34770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.IM_HANDLE, People.IM_HANDLE);
34870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.IM_ACCOUNT, People.IM_ACCOUNT);
34970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.PRESENCE_STATUS, People.PRESENCE_STATUS);
35070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.PRESENCE_CUSTOM_STATUS, People.PRESENCE_CUSTOM_STATUS);
3513cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
3523cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap = new HashMap<String, String>();
3539155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations._ID,
3549155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Organizations._ID);
3553cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.PERSON_ID,
356d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.PERSON_ID);
3573cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.ISPRIMARY,
358d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.ISPRIMARY);
3593cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.COMPANY,
360d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.COMPANY);
3613cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TYPE,
362d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.TYPE);
3633cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.LABEL,
364d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.LABEL);
3653cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TITLE,
366d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.TITLE);
367e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
368e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sContactMethodProjectionMap = new HashMap<String, String>(peopleProjectionMap);
3699155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods._ID, ContactMethods._ID);
370d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.PERSON_ID, ContactMethods.PERSON_ID);
371d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.KIND, ContactMethods.KIND);
372d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.ISPRIMARY, ContactMethods.ISPRIMARY);
373d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.TYPE, ContactMethods.TYPE);
374d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.DATA, ContactMethods.DATA);
375d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.LABEL, ContactMethods.LABEL);
376d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.AUX_DATA, ContactMethods.AUX_DATA);
377e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
378e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap = new HashMap<String, String>(peopleProjectionMap);
3799155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones._ID,
3809155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Phones._ID);
381e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.PERSON_ID,
382d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.PERSON_ID);
383e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.ISPRIMARY,
384d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.ISPRIMARY);
385e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER,
386d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.NUMBER);
387e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.TYPE,
388d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.TYPE);
389e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.LABEL,
390d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.LABEL);
391e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER_KEY,
392d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.NUMBER_KEY);
3930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
3940f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap = new HashMap<String, String>();
3959155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions._ID,
3969155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Extensions._ID);
3970f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.PERSON_ID,
398d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.PERSON_ID);
3990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.NAME,
400d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.NAME);
4010f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.VALUE,
402d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.VALUE);
4030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
4040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap = new HashMap<String, String>();
4050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups._ID,
406d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups._ID);
4070f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.NAME,
408d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.NAME);
4090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.NOTES,
410d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.NOTES);
4110f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.SYSTEM_ID,
412d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.SYSTEM_ID);
4130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
4140f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap = new HashMap<String, String>();
4159155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership._ID,
4169155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.GroupMembership._ID);
4170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.PERSON_ID,
418d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.GroupMembership.PERSON_ID);
4190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.GROUP_ID,
420d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.GroupMembership.GROUP_ID);
421c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
422c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap = new HashMap<String, String>();
4239155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos._ID,
4249155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Photos._ID);
425c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.PERSON_ID,
426c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.PERSON_ID);
427c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.DATA,
428c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.DATA);
429c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.LOCAL_VERSION,
430c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.LOCAL_VERSION);
431c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.DOWNLOAD_REQUIRED,
432c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.DOWNLOAD_REQUIRED);
433c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.EXISTS_ON_SERVER,
434c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.EXISTS_ON_SERVER);
435c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.SYNC_ERROR,
436c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.SYNC_ERROR);
437f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
438f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
439f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final Context mContext;
440f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final OpenHelper mOpenHelper;
441f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final ContactsProvider2 mContactsProvider;
442f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final NameSplitter mPhoneticNameSplitter;
443a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov    private final GlobalSearchSupport mGlobalSearchSupport;
444f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
445d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov    /** Precompiled sql statement for incrementing times contacted for a contact */
4463cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private final SQLiteStatement mLastTimeContactedUpdate;
4473cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
4483cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private final ContentValues mValues = new ContentValues();
44967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private final ContentValues mValues2 = new ContentValues();
45067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private final ContentValues mValues3 = new ContentValues();
451caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private Account mAccount;
452a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
453f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public LegacyApiSupport(Context context, OpenHelper openHelper,
454a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov            ContactsProvider2 contactsProvider, GlobalSearchSupport globalSearchSupport) {
455f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContext = context;
456f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContactsProvider = contactsProvider;
457f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mOpenHelper = openHelper;
458a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        mGlobalSearchSupport = globalSearchSupport;
459f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
460622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey        mPhoneticNameSplitter = new NameSplitter("", "", "", context
461622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey                .getString(com.android.internal.R.string.common_name_conjunctions), Locale
462622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey                .getDefault());
463f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
464f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
4655ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mLastTimeContactedUpdate = db.compileStatement("UPDATE " + Tables.RAW_CONTACTS + " SET "
4666cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts.TIMES_CONTACTED + "="
4676cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts.TIMES_CONTACTED + "+1,"
4686cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts.LAST_TIME_CONTACTED + "=? WHERE "
4696cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts._ID + "=?");
470f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
471f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
472caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private void ensureDefaultAccount() {
473caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        if (mAccount == null) {
474caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov            mAccount = mContactsProvider.getDefaultAccount();
4756f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov            if (mAccount == null) {
4766f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov
4776f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov                // This fall-through account will not match any data in the database, which
4786f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov                // is the expected behavior
47928153f2e3dda944e983f6dd0ab80aca63631ddfaJeff Hamilton                mAccount = new Account(NON_EXISTENT_ACCOUNT_NAME, NON_EXISTENT_ACCOUNT_TYPE);
4806f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov            }
481caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        }
482caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
483d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
484b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamilton    public static void createDatabase(SQLiteDatabase db) {
485b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamilton        Log.i(TAG, "Bootstrapping database legacy support");
486d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
487d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PEOPLE + ";");
488d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PEOPLE + " AS SELECT " +
4896cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                RawContactsColumns.CONCRETE_ID
490d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.People._ID + ", " +
491d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "name." + StructuredName.DISPLAY_NAME
492d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NAME + ", " +
4935ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME
494d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.DISPLAY_NAME + ", " +
495d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PHONETIC_NAME_SQL
496d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PHONETIC_NAME + " , " +
497d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "note." + Note.NOTE
498d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NOTES + ", " +
499caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
500caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
5015ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED
502d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.TIMES_CONTACTED + ", " +
5035ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED
504d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.LAST_TIME_CONTACTED + ", " +
5055ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE
506d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.CUSTOM_RINGTONE + ", " +
5075ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL
508d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.SEND_TO_VOICEMAIL + ", " +
5095ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.STARRED
510d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.STARRED + ", " +
511d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "organization." + Data._ID
512d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_ORGANIZATION_ID + ", " +
513d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "email." + Data._ID
514d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_EMAIL_ID + ", " +
515d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Data._ID
516d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_PHONE_ID + ", " +
517d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.NUMBER
518d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NUMBER + ", " +
519d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.TYPE
520d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.TYPE + ", " +
521d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.LABEL
522d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.LABEL + ", " +
523d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + PhoneColumns.NORMALIZED_NUMBER
524caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + People.NUMBER_KEY +
5255ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.RAW_CONTACTS + PEOPLE_JOINS +
526caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                " WHERE " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
527caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
528d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
529d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
530d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.ORGANIZATIONS + ";");
531d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.ORGANIZATIONS + " AS SELECT " +
532d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
533d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations._ID + ", " +
5345ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Data.RAW_CONTACT_ID
535d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.PERSON_ID + ", " +
536d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Data.IS_PRIMARY
537d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.ISPRIMARY + ", " +
538caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
539caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
540d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.COMPANY
541d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.COMPANY + ", " +
542d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.TYPE
543d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.TYPE + ", " +
544d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.LABEL
545d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.LABEL + ", " +
546d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.TITLE
547caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.TITLE +
5485ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS +
549d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
55033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Organization.CONTENT_ITEM_TYPE + "'"
551caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
552caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
553d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
554d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
555d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.CONTACT_METHODS + ";");
556d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.CONTACT_METHODS + " AS SELECT " +
557d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
558d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods._ID + ", " +
559d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
560d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.PERSON_ID + ", " +
561d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                CONTACT_METHOD_KIND_SQL
562d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.KIND + ", " +
563d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_IS_PRIMARY
564d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.ISPRIMARY + ", " +
565d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_DATA1
566d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.TYPE + ", " +
56797f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                CONTACT_METHOD_DATA_SQL
568d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.DATA + ", " +
569d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_DATA3
570d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.LABEL + ", " +
571d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_DATA14
572d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.AUX_DATA + ", " +
573d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "name." + StructuredName.DISPLAY_NAME
574d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.NAME + ", " +
5755ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME
576d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.DISPLAY_NAME + ", " +
577caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
578caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
579d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PHONETIC_NAME_SQL
580d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.PHONETIC_NAME + " , " +
581d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "note." + Note.NOTE
582d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.NOTES + ", " +
5835ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED
584d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.TIMES_CONTACTED + ", " +
5855ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED
586d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.LAST_TIME_CONTACTED + ", " +
5875ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE
588d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.CUSTOM_RINGTONE + ", " +
5895ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL
590d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.SEND_TO_VOICEMAIL + ", " +
5915ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.STARRED
592caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + ContactMethods.STARRED +
593d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS +
59433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                " WHERE " + ContactMethods.KIND + " IS NOT NULL"
595caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                    + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
596caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                    + " AND " + RawContacts.IS_RESTRICTED + "=0" +
597d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
598d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
599d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
600d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHONES + ";");
601d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PHONES + " AS SELECT " +
602d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
603d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones._ID + ", " +
604d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
605d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.PERSON_ID + ", " +
606d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_IS_PRIMARY
607d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.ISPRIMARY + ", " +
608d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.NUMBER
609d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NUMBER + ", " +
610d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.TYPE
611d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.TYPE + ", " +
612d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.LABEL
613d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.LABEL + ", " +
614d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PhoneColumns.CONCRETE_NORMALIZED_NUMBER
615d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NUMBER_KEY + ", " +
616d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "name." + StructuredName.DISPLAY_NAME
617d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NAME + ", " +
6185ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME
619d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.DISPLAY_NAME + ", " +
620caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
621caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
622d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PHONETIC_NAME_SQL
623d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.PHONETIC_NAME + " , " +
624d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "note." + Note.NOTE
625d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NOTES + ", " +
6265ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED
627d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.TIMES_CONTACTED + ", " +
6285ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED
629d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.LAST_TIME_CONTACTED + ", " +
6305ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE
631d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.CUSTOM_RINGTONE + ", " +
6325ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL
633d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.SEND_TO_VOICEMAIL + ", " +
6345ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.STARRED
635caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.STARRED +
636d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS +
637d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
63833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Phone.CONTENT_ITEM_TYPE + "'"
639caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
640caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
641d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
642d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
643d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.EXTENSIONS + ";");
644d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.EXTENSIONS + " AS SELECT " +
645d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
646d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions._ID + ", " +
647d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
648d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.PERSON_ID + ", " +
649caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
650caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
651d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                ExtensionsColumns.NAME
652d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.NAME + ", " +
653d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                ExtensionsColumns.VALUE
654caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.VALUE +
6555ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS +
656d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
65733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE + "'"
658caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
659caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
660d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
661d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
662d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUPS + ";");
663d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.GROUPS + " AS SELECT " +
664d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                GroupsColumns.CONCRETE_ID + " AS " + android.provider.Contacts.Groups._ID + ", " +
665caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Groups.ACCOUNT_NAME + ", " +
666caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Groups.ACCOUNT_TYPE + ", " +
667d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.TITLE + " AS " + android.provider.Contacts.Groups.NAME + ", " +
668d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.NOTES + " AS " + android.provider.Contacts.Groups.NOTES + " , " +
669d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.SYSTEM_ID + " AS " + android.provider.Contacts.Groups.SYSTEM_ID +
670d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.GROUPS +
671d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
672d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
673d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUP_MEMBERSHIP + ";");
674d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.GROUP_MEMBERSHIP + " AS SELECT " +
675d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
676d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership._ID + ", " +
677d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
678d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.PERSON_ID + ", " +
679caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_NAME
680caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " +  RawContacts.ACCOUNT_NAME + ", " +
681caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_TYPE
682caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " +  RawContacts.ACCOUNT_TYPE + ", " +
683d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                GroupMembership.GROUP_ROW_ID
684d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.GROUP_ID + ", " +
685d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.TITLE
686d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.NAME + ", " +
687d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.NOTES
688d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.NOTES + " , " +
689d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.SYSTEM_ID
690caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.SYSTEM_ID +
6915ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_GROUPS +
692d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
69333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + GroupMembership.CONTENT_ITEM_TYPE + "'"
6945ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
695d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
696c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
697c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHOTOS + ";");
698c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PHOTOS + " AS SELECT " +
699c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                DataColumns.CONCRETE_ID
700c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos._ID + ", " +
701d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
702c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.PERSON_ID + ", " +
703caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
704caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
705c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                Tables.DATA + "." + Photo.PHOTO
706c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.DATA + ", " +
707c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.EXISTS_ON_SERVER
708c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.EXISTS_ON_SERVER + ", " +
709c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.DOWNLOAD_REQUIRED
710c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.DOWNLOAD_REQUIRED + ", " +
711c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.LOCAL_VERSION
712c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.LOCAL_VERSION + ", " +
713c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.SYNC_ERROR
714caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.SYNC_ERROR +
715c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS + LEGACY_PHOTO_JOIN +
716c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
71733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Photo.CONTENT_ITEM_TYPE + "'"
718caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
719caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
720c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        ";");
721d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    }
722d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
723f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public Uri insert(Uri uri, ContentValues values) {
72467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        ensureDefaultAccount();
725f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final int match = sUriMatcher.match(uri);
726f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        long id = 0;
727f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch (match) {
728f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE:
7293cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                id = insertPeople(values);
7303cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
7313cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
7323cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS:
7333cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                id = insertOrganization(values);
734f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
735f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
7360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS: {
7375ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
7385ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertContactMethod(rawContactId, values);
739e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
7400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
741e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7420f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case CONTACTMETHODS: {
7435ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values, ContactMethods.PERSON_ID);
7445ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertContactMethod(rawContactId, values);
745e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
7460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
747e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PHONES: {
7495ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7500f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.Phones.PERSON_ID);
7515ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertPhone(rawContactId, values);
7520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7540f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
75594743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton            case PEOPLE_PHONES: {
75694743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
75794743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton                id = insertPhone(rawContactId, values);
75894743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton                break;
75994743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton            }
76094743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton
7610f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS: {
7625ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7630f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.Extensions.PERSON_ID);
7645ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertExtension(rawContactId, values);
7650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
7680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS:
7690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                id = insertGroup(values);
770e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
771e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP: {
7735ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7740f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.GroupMembership.PERSON_ID);
7750f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                long groupId = getRequiredValue(values,
7760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.GroupMembership.GROUP_ID);
7775ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertGroupMembership(rawContactId, groupId);
7780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
781f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            default:
782f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
783f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
784f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
785f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (id < 0) {
786f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            return null;
787f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
788f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
789f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final Uri result = ContentUris.withAppendedId(uri, id);
790f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        onChange(result);
791f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return result;
792f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
793f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
7940f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private long getRequiredValue(ContentValues values, String column) {
7950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        if (!values.containsKey(column)) {
7960f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            throw new RuntimeException("Required value: " + column);
797e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        }
798e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return values.getAsLong(column);
800e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
801e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8023cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private long insertPeople(ContentValues values) {
80367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        parsePeopleValues(values, mValues, mValues2, mValues3);
804caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
80567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri contactUri = mContactsProvider.insertInTransaction(RawContacts.CONTENT_URI, mValues);
80667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long rawContactId = ContentUris.parseId(contactUri);
80767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
80867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues2.size() != 0) {
80967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mValues2.put(Data.RAW_CONTACT_ID, rawContactId);
81067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues2);
81167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
81267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues3.size() != 0) {
81367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mValues3.put(Data.RAW_CONTACT_ID, rawContactId);
81467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues3);
81567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
816f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
81767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        // TODO instant aggregation
81867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return rawContactId;
81967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
82067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
82167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void parsePeopleValues(ContentValues values, ContentValues peopleValues,
82267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            ContentValues nameValues, ContentValues noteValues) {
82367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        peopleValues.clear();
82467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        nameValues.clear();
82567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        noteValues.clear();
82667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
82767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        OpenHelper.copyStringValue(peopleValues, RawContacts.CUSTOM_RINGTONE,
828f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                values, People.CUSTOM_RINGTONE);
82967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        OpenHelper.copyLongValue(peopleValues, RawContacts.SEND_TO_VOICEMAIL,
830f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                values, People.SEND_TO_VOICEMAIL);
83167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        OpenHelper.copyLongValue(peopleValues, RawContacts.LAST_TIME_CONTACTED,
832f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                values, People.LAST_TIME_CONTACTED);
83367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        OpenHelper.copyLongValue(peopleValues, RawContacts.TIMES_CONTACTED,
834f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                values, People.TIMES_CONTACTED);
83567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        OpenHelper.copyLongValue(peopleValues, RawContacts.STARRED,
836f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                values, People.STARRED);
83767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        peopleValues.put(RawContacts.ACCOUNT_NAME, mAccount.name);
83867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        peopleValues.put(RawContacts.ACCOUNT_TYPE, mAccount.type);
839f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
840f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (values.containsKey(People.NAME) || values.containsKey(People.PHONETIC_NAME)) {
84167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            nameValues.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
84267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            OpenHelper.copyStringValue(nameValues, StructuredName.DISPLAY_NAME,
843f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                    values, People.NAME);
844f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            if (values.containsKey(People.PHONETIC_NAME)) {
845f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                String phoneticName = values.getAsString(People.PHONETIC_NAME);
846f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                NameSplitter.Name parsedName = new NameSplitter.Name();
847f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                mPhoneticNameSplitter.split(parsedName, phoneticName);
84867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                nameValues.put(StructuredName.PHONETIC_GIVEN_NAME, parsedName.getGivenNames());
84967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                nameValues.put(StructuredName.PHONETIC_MIDDLE_NAME, parsedName.getMiddleName());
85067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                nameValues.put(StructuredName.PHONETIC_FAMILY_NAME, parsedName.getFamilyName());
851f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            }
852f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
853f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
854f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (values.containsKey(People.NOTES)) {
85567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            noteValues.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE);
85667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            OpenHelper.copyStringValue(noteValues, Note.NOTE, values, People.NOTES);
857f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
858f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
859f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
8603cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private long insertOrganization(ContentValues values) {
8613cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        mValues.clear();
8623cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8635ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.RAW_CONTACT_ID,
8643cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.PERSON_ID);
8653cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        mValues.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
8663cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8673cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY,
8683cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.ISPRIMARY);
8693cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8703cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        OpenHelper.copyStringValue(mValues, Organization.COMPANY,
8713cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.COMPANY);
8723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8733cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        // TYPE values happen to remain the same between V1 and V2 - can just copy the value
8743cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        OpenHelper.copyLongValue(mValues, Organization.TYPE,
8753cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.TYPE);
8763cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8773cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        OpenHelper.copyStringValue(mValues, Organization.LABEL,
8783cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.LABEL);
8793cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        OpenHelper.copyStringValue(mValues, Organization.TITLE,
8803cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.TITLE);
8813cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
88267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
8833cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8843cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        return ContentUris.parseId(uri);
8853cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    }
886f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
8875ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertPhone(long rawContactId, ContentValues values) {
888e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        mValues.clear();
889e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8905ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
891e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        mValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
892e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
893e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY,
894e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                values, android.provider.Contacts.Phones.ISPRIMARY);
895e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
896e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Phone.NUMBER,
897e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                values, android.provider.Contacts.Phones.NUMBER);
898e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
899e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        // TYPE values happen to remain the same between V1 and V2 - can just copy the value
900e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Phone.TYPE,
901e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                values, android.provider.Contacts.Phones.TYPE);
902e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
903e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Phone.LABEL,
904e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                values, android.provider.Contacts.Phones.LABEL);
905e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
90667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
907e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
908e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        return ContentUris.parseId(uri);
909e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
910e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
9115ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertContactMethod(long rawContactId, ContentValues values) {
912e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Integer kind = values.getAsInteger(ContactMethods.KIND);
913e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        if (kind == null) {
914e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            throw new RuntimeException("Required value: " + ContactMethods.KIND);
915e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        }
916e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
917e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        mValues.clear();
9185ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
919e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
920e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY, values, ContactMethods.ISPRIMARY);
921e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
922e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        switch (kind) {
9230126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov            case android.provider.Contacts.KIND_EMAIL: {
924e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                copyCommonFields(values, Email.CONTENT_ITEM_TYPE, Email.TYPE, Email.LABEL,
9250126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov                        Data.DATA14);
9260126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov                OpenHelper.copyStringValue(mValues, Email.DATA, values, ContactMethods.DATA);
927e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
9280126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov            }
9290126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov
9300126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov            case android.provider.Contacts.KIND_IM: {
9310126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov                String protocol = values.getAsString(ContactMethods.DATA);
9320126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov                if (protocol.startsWith("pre:")) {
9330126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov                    mValues.put(Im.PROTOCOL, Integer.parseInt(protocol.substring(4)));
9340126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov                } else if (protocol.startsWith("custom:")) {
9350126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov                    mValues.put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM);
9360126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov                    mValues.put(Im.CUSTOM_PROTOCOL, protocol.substring(7));
9370126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov                }
938e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
9390126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov                copyCommonFields(values, Im.CONTENT_ITEM_TYPE, Im.TYPE, Im.LABEL, Data.DATA14);
940e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
9410126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov            }
942e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
9430126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov            case android.provider.Contacts.KIND_POSTAL: {
94467dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey                copyCommonFields(values, StructuredPostal.CONTENT_ITEM_TYPE, StructuredPostal.TYPE,
9450126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov                        StructuredPostal.LABEL, Data.DATA14);
9460126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov                OpenHelper.copyStringValue(mValues, StructuredPostal.FORMATTED_ADDRESS, values,
9470126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov                        ContactMethods.DATA);
948e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
9490126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov            }
950e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        }
951e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
95267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
953e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        return ContentUris.parseId(uri);
954e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
955e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
956e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private void copyCommonFields(ContentValues values, String mimeType, String typeColumn,
9570126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov            String labelColumn, String auxDataColumn) {
958e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        mValues.put(Data.MIMETYPE, mimeType);
959e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, typeColumn, values, ContactMethods.TYPE);
960e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, labelColumn, values, ContactMethods.LABEL);
961e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, auxDataColumn, values, ContactMethods.AUX_DATA);
962e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
963e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
9645ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertExtension(long rawContactId, ContentValues values) {
9650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.clear();
9660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9675ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
9680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(Data.MIMETYPE, android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE);
9690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, ExtensionsColumns.NAME,
9710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                values, android.provider.Contacts.People.Extensions.NAME);
9720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, ExtensionsColumns.VALUE,
9730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                values, android.provider.Contacts.People.Extensions.VALUE);
9740f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
97567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
9760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
9770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
9780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private long insertGroup(ContentValues values) {
9800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.clear();
9810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Groups.TITLE,
9830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                values, android.provider.Contacts.Groups.NAME);
9840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Groups.NOTES,
9850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                values, android.provider.Contacts.Groups.NOTES);
9860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Groups.SYSTEM_ID,
9870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                values, android.provider.Contacts.Groups.SYSTEM_ID);
9880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
989df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        mValues.put(Groups.ACCOUNT_NAME, mAccount.name);
990df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        mValues.put(Groups.ACCOUNT_TYPE, mAccount.type);
991caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
99267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Groups.CONTENT_URI, mValues);
9930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
9940f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
9950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9965ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertGroupMembership(long rawContactId, long groupId) {
9970f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.clear();
9980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE);
10005ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(GroupMembership.RAW_CONTACT_ID, rawContactId);
10010f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(GroupMembership.GROUP_ROW_ID, groupId);
10020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
100367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
10040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
10050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
10060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
1007f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
100867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        ensureDefaultAccount();
100967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
101067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int match = sUriMatcher.match(uri);
1011c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int count = 0;
1012f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch(match) {
101367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case PEOPLE_UPDATE_CONTACT_TIME: {
1014f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                count = updateContactTime(uri, values);
1015f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
101667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
1017c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1018c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PEOPLE_PHOTO: {
10195ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
10205ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                return updatePhoto(rawContactId, values);
1021c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            }
1022c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
102367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case -1: {
102467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
102567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
102667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
102767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            default: {
102867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                count = updateAll(uri, match, values, selection, selectionArgs);
102967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
103067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
103167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
103267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (count > 0) {
103367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContext.getContentResolver().notifyChange(uri, null);
103467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
103567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
103667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return count;
103767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
103867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
103967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private int updateAll(Uri uri, final int match, ContentValues values, String selection,
104067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            String[] selectionArgs) {
104167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Cursor c = query(uri, IdQuery.COLUMNS, selection, selectionArgs, null, null);
104267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (c == null) {
104367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            return 0;
104467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
104567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
104667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int count = 0;
104767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        try {
104867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            while (c.moveToNext()) {
104967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                long id = c.getLong(IdQuery._ID);
105067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                count += update(match, id, values);
105167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
105267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        } finally {
105367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            c.close();
105467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
105567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
105667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return count;
105767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
105867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
105967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    public int update(int match, long id, ContentValues values) {
106067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int count = 0;
106167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        switch(match) {
106267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case PEOPLE:
106367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case PEOPLE_ID: {
106467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                count = updatePeople(id, values);
106567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                break;
106667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
106767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
1068c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PHOTOS:
1069c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                // TODO
1070c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
1071c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1072c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PHOTOS_ID:
1073c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                // TODO
1074c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
107567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
1076c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
107767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return count;
107867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
1079c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
108067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private int updatePeople(long rawContactId, ContentValues values) {
108167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        parsePeopleValues(values, mValues, mValues2, mValues3);
108267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
108367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int count = mContactsProvider.update(
108467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId),
108567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mValues, null, null);
108667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
108767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (count == 0) {
108867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            return 0;
1089f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1090f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
109167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues2.size() != 0) {
109267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            Uri dataUri = findFirstDataRow(rawContactId, StructuredName.CONTENT_ITEM_TYPE);
109367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            if (dataUri != null) {
109467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.update(dataUri, mValues2, null, null);
109567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            } else {
109667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mValues2.put(Data.RAW_CONTACT_ID, rawContactId);
109767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues2);
109867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
109967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
110067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
110167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues3.size() != 0) {
110267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            Uri dataUri = findFirstDataRow(rawContactId, Note.CONTENT_ITEM_TYPE);
110367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            if (dataUri != null) {
110467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.update(dataUri, mValues3, null, null);
110567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            } else {
110667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mValues3.put(Data.RAW_CONTACT_ID, rawContactId);
110767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues3);
110867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
1109f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
111067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
1111f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return count;
1112f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1113f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1114f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private int updateContactTime(Uri uri, ContentValues values) {
1115f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1116f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // TODO check sanctions
1117f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1118f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        long lastTimeContacted;
1119f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (values.containsKey(People.LAST_TIME_CONTACTED)) {
1120f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            lastTimeContacted = values.getAsLong(People.LAST_TIME_CONTACTED);
1121f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        } else {
1122f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            lastTimeContacted = System.currentTimeMillis();
1123f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1124f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
11255ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
1126d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov        long contactId = mOpenHelper.getContactId(rawContactId);
1127d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov        if (contactId != 0) {
1128d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov            mContactsProvider.updateContactTime(contactId, lastTimeContacted);
1129f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        } else {
1130f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            mLastTimeContactedUpdate.bindLong(1, lastTimeContacted);
11315ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mLastTimeContactedUpdate.bindLong(2, rawContactId);
1132f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            mLastTimeContactedUpdate.execute();
1133f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1134f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return 1;
1135f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1136f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
11375ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private int updatePhoto(long rawContactId, ContentValues values) {
1138c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1139c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        // TODO check sanctions
1140c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1141c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int count;
1142c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
114367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long dataId = findFirstDataId(rawContactId, Photo.CONTENT_ITEM_TYPE);
1144c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1145c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.clear();
1146c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA);
1147c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.put(Photo.PHOTO, bytes);
1148c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1149c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        if (dataId == -1) {
1150c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE);
11515ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(Data.RAW_CONTACT_ID, rawContactId);
115267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            Uri dataUri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
1153c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            dataId = ContentUris.parseId(dataUri);
1154c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            count = 1;
1155c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        } else {
1156c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            Uri dataUri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
115767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            count = mContactsProvider.updateInTransaction(dataUri, mValues, null, null);
1158c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        }
1159c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1160c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.clear();
1161c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.LOCAL_VERSION,
1162c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.LOCAL_VERSION);
1163c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.DOWNLOAD_REQUIRED,
1164c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.DOWNLOAD_REQUIRED);
1165c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.EXISTS_ON_SERVER,
1166c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.EXISTS_ON_SERVER);
1167c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.SYNC_ERROR,
1168c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.SYNC_ERROR);
1169c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
117067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int updated = mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1171c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                Data.MIMETYPE + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'"
11725ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Data.RAW_CONTACT_ID + "=" + rawContactId
1173c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AND " + LegacyPhotoData.PHOTO_DATA_ID + "=" + dataId, null);
1174c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        if (updated == 0) {
11755ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(Data.RAW_CONTACT_ID, rawContactId);
1176c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(Data.MIMETYPE, LegacyPhotoData.CONTENT_ITEM_TYPE);
1177c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(LegacyPhotoData.PHOTO_DATA_ID, dataId);
117867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
1179c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        }
1180c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1181c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        return count;
1182c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
1183c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
118467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private Uri findFirstDataRow(long rawContactId, String contentItemType) {
118567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long dataId = findFirstDataId(rawContactId, contentItemType);
118667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (dataId == -1) {
118767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            return null;
118867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
118967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
119067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
119167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
119267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
119367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private long findFirstDataId(long rawContactId, String mimeType) {
119467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long dataId = -1;
119567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Cursor c = mContactsProvider.query(Data.CONTENT_URI, IdQuery.COLUMNS,
119667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                Data.RAW_CONTACT_ID + "=" + rawContactId + " AND "
119767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                        + Data.MIMETYPE + "='" + mimeType + "'",
119867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                null, null);
119967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        try {
120067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            if (c.moveToFirst()) {
120167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                dataId = c.getLong(IdQuery._ID);
120267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
120367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        } finally {
120467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            c.close();
120567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
120667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return dataId;
120767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
120867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
12093cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    public int delete(Uri uri, String selection, String[] selectionArgs) {
12103cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        final int match = sUriMatcher.match(uri);
12113cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        int count = 0;
12123cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        switch (match) {
121333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case PEOPLE_ID:
121433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                count = mContactsProvider.deleteRawContact(ContentUris.parseId(uri), false);
121533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                break;
121633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov
12173cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS_ID:
1218e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1219e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        ORGANIZATION_MIME_TYPES);
1220e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1221e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1222e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS_ID:
1223e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1224e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        CONTACT_METHOD_MIME_TYPES);
1225e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1226e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1227e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES_ID:
1228e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1229e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        PHONE_MIME_TYPES);
12303cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
12313cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
12323cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            default:
12333cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
12343cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        }
12353cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
12363cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        return count;
12373cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    }
12383cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
1239f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
1240c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            String sortOrder, String limit) {
1241caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        ensureDefaultAccount();
1242caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
1243f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final SQLiteDatabase db = mOpenHelper.getReadableDatabase();
1244f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
1245f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        String groupBy = null;
1246f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1247f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final int match = sUriMatcher.match(uri);
1248f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch (match) {
1249f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE: {
125070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1251f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
125267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1253f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
1254f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            }
1255f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1256f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE_ID:
125770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1258f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
125967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1260caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + People._ID + "=");
1261f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1262f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
1263f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1264445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov            case PEOPLE_FILTER: {
1265445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1266445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
126767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1268445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                String filterParam = uri.getPathSegments().get(2);
1269caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + People._ID + " IN "
12705ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + mContactsProvider.getRawContactsByFilterAsNestedQuery(filterParam));
1271445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                break;
1272445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov            }
1273445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov
12743cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS:
12755dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.ORGANIZATIONS + " organizations");
1276d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sOrganizationProjectionMap);
127767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
12783cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
12793cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
12803cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS_ID:
12815dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.ORGANIZATIONS + " organizations");
12823cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                qb.setProjectionMap(sOrganizationProjectionMap);
128367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1284d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Organizations._ID + "=");
1285e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1286e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1287e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1288e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS:
12895dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1290d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
129167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1292e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1293e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1294e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS_ID:
12955dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1296e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
129767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1298d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods._ID + "=");
1299e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1300e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1301e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1302bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov            case CONTACTMETHODS_EMAIL:
1303bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1304bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
1305bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                applyRawContactsAccount(qb);
1306bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + "="
1307bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                        + android.provider.Contacts.KIND_EMAIL);
1308bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                break;
1309bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov
1310e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS:
13115dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1312e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
131367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1314d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "=");
1315e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1316e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL");
1317e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1318e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1319e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS_ID:
13205dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1321e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
132267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1323d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "=");
1324e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1325d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods._ID + "=");
1326e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
1327e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL");
1328e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1329e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1330e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES:
13315dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1332d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
133367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1334e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1335e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1336e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES_ID:
13375dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1338e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
133967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1340d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "=");
1341e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1342e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1343e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1344fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov            case PHONES_FILTER:
13455dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1346fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
134767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1348fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                if (uri.getPathSegments().size() > 2) {
1349fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                    String filterParam = uri.getLastPathSegment();
1350e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov                    qb.appendWhere(" AND person =");
1351e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov                    qb.appendWhere(mOpenHelper.buildPhoneLookupAsNestedQuery(filterParam));
1352fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                }
1353fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                break;
1354fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
1355e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_PHONES:
13565dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1357e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
135867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1359d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "=");
1360e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1361e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1362e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1363e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_PHONES_ID:
13645dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1365e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
136667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1367d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "=");
13683cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1369d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "=");
1370e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
13713cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
13723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
13730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS:
13745dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
1375d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
137667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
13770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
13780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
13790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS_ID:
13805dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
13810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
138267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1383d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "=");
13840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
13850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
13860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
13870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_EXTENSIONS:
13885dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
13890f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
139067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1391d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "=");
13920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
13930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
13940f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
13950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_EXTENSIONS_ID:
13965dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
13970f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
139867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1399d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "=");
14000f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1401d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "=");
14020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
14030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
14040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
14050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS:
14065dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUPS + " groups");
14070f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupProjectionMap);
140867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyGroupAccount(qb);
14090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
14100f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
14110f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS_ID:
14125dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUPS + " groups");
14130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupProjectionMap);
141467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyGroupAccount(qb);
1415caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Groups._ID + "=");
14160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
14170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
14180f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
14190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP:
14205dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
1421d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
142267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
14230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
14240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
14250f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP_ID:
14265dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
14270f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
142867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1429d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "=");
14300f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
14310f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
14320f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
14330f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_GROUPMEMBERSHIP:
14345dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
14350f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
143667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1437d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "=");
14380f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
14390f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
14400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
14410f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_GROUPMEMBERSHIP_ID:
14425dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
14430f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
144467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1445d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "=");
14460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1447d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "=");
14480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
14490f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
14500f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
1451c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PEOPLE_PHOTO:
14525dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHOTOS + " photos");
1453c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.setProjectionMap(sPhotoProjectionMap);
145467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1455c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Photos.PERSON_ID + "=");
1456c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1457c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                limit = "1";
1458c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
1459c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1460c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            case SEARCH_SUGGESTIONS:
1461c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
1462c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                // No legacy compatibility for search suggestions
1463a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                return mGlobalSearchSupport.handleSearchSuggestionsQuery(db, uri, limit);
1464c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
1465b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov            case SEARCH_SHORTCUT: {
1466b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov                long contactId = ContentUris.parseId(uri);
1467b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov                return mGlobalSearchSupport.handleSearchShortcutRefresh(db, contactId, projection);
1468b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov            }
1469b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov
14701b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE:
14711b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_URI,
14721b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
14731b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
14741b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE_WITH_PHONES:
14751b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_WITH_PHONES_URI,
14761b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
14771b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
14781b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE_FAVORITES:
14791b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_FAVORITES_URI,
14801b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
14811b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
14821b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE_GROUP_NAME:
14831b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(Uri.withAppendedPath(LIVE_FOLDERS_CONTACTS_URI,
14841b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        Uri.encode(uri.getLastPathSegment())),
14851b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
14861b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
148733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case DELETED_PEOPLE:
148833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case DELETED_GROUPS:
148933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                throw new UnsupportedOperationException();
149033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov
1491f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            default:
1492f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                throw new IllegalArgumentException("Unknown URL " + uri);
1493f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1494f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1495f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // Perform the query and set the notification uri
1496f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final Cursor c = qb.query(db, projection, selection, selectionArgs,
1497f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                groupBy, null, sortOrder, limit);
1498f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (c != null) {
14993fe48cf2c81f6e89b78e919661e2b0b828a2144eDmitri Plotnikov            c.setNotificationUri(mContext.getContentResolver(),
15003fe48cf2c81f6e89b78e919661e2b0b828a2144eDmitri Plotnikov                    android.provider.Contacts.CONTENT_URI);
1501f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1502f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return c;
1503f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1504f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
150567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void applyRawContactsAccount(SQLiteQueryBuilder qb) {
1506caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        StringBuilder sb = new StringBuilder();
150767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        appendRawContactsAccount(sb);
150867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        qb.appendWhere(sb.toString());
150967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
151067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
151167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void appendRawContactsAccount(StringBuilder sb) {
1512caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(RawContacts.ACCOUNT_NAME + "=");
1513df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.name);
1514caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(" AND " + RawContacts.ACCOUNT_TYPE + "=");
1515df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.type);
1516caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
1517caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
151867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void applyGroupAccount(SQLiteQueryBuilder qb) {
1519caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        StringBuilder sb = new StringBuilder();
152067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        appendGroupAccount(sb);
152167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        qb.appendWhere(sb.toString());
152267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
152367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
152467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void appendGroupAccount(StringBuilder sb) {
1525caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(Groups.ACCOUNT_NAME + "=");
1526df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.name);
1527caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(" AND " + Groups.ACCOUNT_TYPE + "=");
1528df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.type);
1529caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
1530caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
1531f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    /**
1532f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     * Called when a change has been made.
1533f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     *
1534f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     * @param uri the uri that the change was made to
1535f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     */
1536f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private void onChange(Uri uri) {
1537f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContext.getContentResolver().notifyChange(android.provider.Contacts.CONTENT_URI, null);
1538f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
153961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
154061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    public String getType(Uri uri) {
154161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        int match = sUriMatcher.match(uri);
154261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        switch (match) {
154361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case EXTENSIONS:
154461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_EXTENSIONS:
154561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return Extensions.CONTENT_TYPE;
154661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case EXTENSIONS_ID:
154761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_EXTENSIONS_ID:
154861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return Extensions.CONTENT_ITEM_TYPE;
154961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE:
155061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/person";
155161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_ID:
155261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/person";
155361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_PHONES:
155461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/phone";
155561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_PHONES_ID:
155661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/phone";
155761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_CONTACTMETHODS:
155861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/contact-methods";
155961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_CONTACTMETHODS_ID:
156061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return getContactMethodType(uri);
156161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHONES:
156261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/phone";
156361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHONES_ID:
156461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/phone";
156561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHONES_FILTER:
156661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/phone";
156761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHOTOS_ID:
156861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/photo";
156961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHOTOS:
157061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/photo";
157161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_PHOTO:
157261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/photo";
157361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case CONTACTMETHODS:
157461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/contact-methods";
157561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case CONTACTMETHODS_ID:
157661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return getContactMethodType(uri);
157761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case ORGANIZATIONS:
157861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/organizations";
157961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case ORGANIZATIONS_ID:
158061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/organization";
158161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case SEARCH_SUGGESTIONS:
158261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return SearchManager.SUGGEST_MIME_TYPE;
158361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case SEARCH_SHORTCUT:
158461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return SearchManager.SHORTCUT_MIME_TYPE;
158561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            default:
158661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                throw new IllegalArgumentException("Unknown URI");
158761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        }
158861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    }
158961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
159061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    private String getContactMethodType(Uri url) {
159161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        String mime = null;
159261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
159361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        Cursor c = query(url, new String[] {ContactMethods.KIND}, null, null, null, null);
159461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        if (c != null) {
159561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            try {
159661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                if (c.moveToFirst()) {
159761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                    int kind = c.getInt(0);
159861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                    switch (kind) {
15991b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                    case android.provider.Contacts.KIND_EMAIL:
160061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        mime = "vnd.android.cursor.item/email";
160161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        break;
160261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
16031b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                    case android.provider.Contacts.KIND_IM:
160461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        mime = "vnd.android.cursor.item/jabber-im";
160561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        break;
160661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
16071b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                    case android.provider.Contacts.KIND_POSTAL:
160861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        mime = "vnd.android.cursor.item/postal-address";
160961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        break;
161061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                    }
161161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                }
161261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            } finally {
161361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                c.close();
161461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            }
161561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        }
161661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        return mime;
161761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    }
1618f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov}
1619