LegacyApiSupport.java revision 044685c79fb8fb6e15479d0e68d60f8630f6be43
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;
35044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikovimport android.database.sqlite.SQLiteDoneException;
36f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteQueryBuilder;
37f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteStatement;
38f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.net.Uri;
3967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikovimport android.provider.BaseColumns;
40f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract;
41e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.Contacts.ContactMethods;
4261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikovimport android.provider.Contacts.Extensions;
43f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.Contacts.People;
44e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.Data;
450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.Groups;
4670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikovimport android.provider.ContactsContract.Presence;
47c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract.RawContacts;
48e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email;
490f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership;
50e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im;
51f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Note;
523cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization;
53e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone;
54c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo;
55f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName;
5667dde51ab932dc84d95a203b113989b13437f13dJeff Sharkeyimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
57b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamiltonimport android.util.Log;
58f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
59f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport java.util.HashMap;
60622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkeyimport java.util.Locale;
61f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
62b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamiltonpublic class LegacyApiSupport {
63f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
64caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private static final String TAG = "ContactsProviderV1";
65caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
666f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov    private static final String NON_EXISTENT_ACCOUNT_TYPE = "android.INVALID_ACCOUNT_TYPE";
6728153f2e3dda944e983f6dd0ab80aca63631ddfaJeff Hamilton    private static final String NON_EXISTENT_ACCOUNT_NAME = "invalid";
686f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov
69f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
70f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
71f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE = 1;
72f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE_ID = 2;
73f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE_UPDATE_CONTACT_TIME = 3;
743cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final int ORGANIZATIONS = 4;
753cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final int ORGANIZATIONS_ID = 5;
76e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_CONTACTMETHODS = 6;
77e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_CONTACTMETHODS_ID = 7;
78e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int CONTACTMETHODS = 8;
79e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int CONTACTMETHODS_ID = 9;
80e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_PHONES = 10;
81e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_PHONES_ID = 11;
82e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PHONES = 12;
83e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PHONES_ID = 13;
840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int EXTENSIONS = 14;
850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int EXTENSIONS_ID = 15;
860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_EXTENSIONS = 16;
870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_EXTENSIONS_ID = 17;
880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPS = 18;
890f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPS_ID = 19;
900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPMEMBERSHIP = 20;
910f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPMEMBERSHIP_ID = 21;
920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_GROUPMEMBERSHIP = 22;
930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_GROUPMEMBERSHIP_ID = 23;
94c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PEOPLE_PHOTO = 24;
95c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PHOTOS = 25;
96c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PHOTOS_ID = 26;
97445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov    private static final int PEOPLE_FILTER = 29;
9833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov    private static final int DELETED_PEOPLE = 30;
9933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov    private static final int DELETED_GROUPS = 31;
100c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    private static final int SEARCH_SUGGESTIONS = 32;
101b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov    private static final int SEARCH_SHORTCUT = 33;
102b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov    private static final int PHONES_FILTER = 34;
1031b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final int LIVE_FOLDERS_PEOPLE = 35;
1041b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final int LIVE_FOLDERS_PEOPLE_GROUP_NAME = 36;
1051b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final int LIVE_FOLDERS_PEOPLE_WITH_PHONES = 37;
1061b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final int LIVE_FOLDERS_PEOPLE_FAVORITES = 38;
107bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov    private static final int CONTACTMETHODS_EMAIL = 39;
108c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
109e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String PEOPLE_JOINS =
1105ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            " LEFT OUTER JOIN data name ON (raw_contacts._id = name.raw_contact_id"
111e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = name.mimetype_id)"
112e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + StructuredName.CONTENT_ITEM_TYPE + "')"
1135ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data organization ON (raw_contacts._id = organization.raw_contact_id"
114e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = organization.mimetype_id)"
115e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Organization.CONTENT_ITEM_TYPE + "' AND organization.is_primary)"
1165ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data email ON (raw_contacts._id = email.raw_contact_id"
117e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = email.mimetype_id)"
118e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Email.CONTENT_ITEM_TYPE + "' AND email.is_primary)"
1195ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data note ON (raw_contacts._id = note.raw_contact_id"
120e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = note.mimetype_id)"
121e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Note.CONTENT_ITEM_TYPE + "')"
1225ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data phone ON (raw_contacts._id = phone.raw_contact_id"
123e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = phone.mimetype_id)"
124e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Phone.CONTENT_ITEM_TYPE + "' AND phone.is_primary)";
125e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
126d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    public static final String DATA_JOINS =
127d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            " JOIN mimetypes ON (mimetypes._id = data.mimetype_id)"
1285ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " JOIN raw_contacts ON (raw_contacts._id = data.raw_contact_id)"
129d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            + PEOPLE_JOINS;
130d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
13170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    public static final String PRESENCE_JOINS =
13270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            " LEFT OUTER JOIN presence ON ("
13370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            + " presence.presence_id = (SELECT max(presence_id) FROM presence"
1345dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov            + " WHERE people._id = presence_raw_contact_id))";
13570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
136e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String PHONETIC_NAME_SQL = "trim(trim("
137e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_GIVEN_NAME + ",' ')||' '||"
138e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_MIDDLE_NAME + ",' '))||' '||"
139e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_FAMILY_NAME + ",' ')) ";
140e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
141e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String CONTACT_METHOD_KIND_SQL =
142d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            "CAST ((CASE WHEN mimetype='" + Email.CONTENT_ITEM_TYPE + "'"
143e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                + " THEN " + android.provider.Contacts.KIND_EMAIL
144e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                + " ELSE"
145e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + " (CASE WHEN mimetype='" + Im.CONTENT_ITEM_TYPE +"'"
146e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " THEN " + android.provider.Contacts.KIND_IM
147e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " ELSE"
14867dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey                        + " (CASE WHEN mimetype='" + StructuredPostal.CONTENT_ITEM_TYPE + "'"
149e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " THEN "  + android.provider.Contacts.KIND_POSTAL
150e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " ELSE"
151e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                                + " NULL"
152e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " END)"
153e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " END)"
154d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                + " END) AS INTEGER)";
155f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
15697f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov    private static final String IM_PROTOCOL_SQL =
15797f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov            "(CASE WHEN " + Presence.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM
15897f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " THEN 'custom:'||" + Presence.CUSTOM_PROTOCOL
15997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " ELSE 'pre:'||" + Presence.PROTOCOL
16097f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " END)";
16197f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov
16297f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov    private static String CONTACT_METHOD_DATA_SQL =
16397f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov            "(CASE WHEN " + Data.MIMETYPE + "='" + Im.CONTENT_ITEM_TYPE + "'"
16497f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " THEN (CASE WHEN " + Tables.DATA + "." + Im.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM
16597f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                    + " THEN 'custom:'||" + Tables.DATA + "." + Im.CUSTOM_PROTOCOL
16697f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                    + " ELSE 'pre:'||" + Tables.DATA + "." + Im.PROTOCOL
16797f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                    + " END)"
16897f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " ELSE " + DataColumns.CONCRETE_DATA2
16997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " END)";
17097f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov
1711b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final Uri LIVE_FOLDERS_CONTACTS_URI = Uri.withAppendedPath(
1721b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            ContactsContract.AUTHORITY_URI, "live_folders/contacts");
1731b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
1741b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final Uri LIVE_FOLDERS_CONTACTS_WITH_PHONES_URI = Uri.withAppendedPath(
1751b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            ContactsContract.AUTHORITY_URI, "live_folders/contacts_with_phones");
1761b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
1771b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final Uri LIVE_FOLDERS_CONTACTS_FAVORITES_URI = Uri.withAppendedPath(
1781b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            ContactsContract.AUTHORITY_URI, "live_folders/favorites");
17997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov
180f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public interface LegacyTables {
181d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String PEOPLE = "view_v1_people";
1825dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov        public static final String PEOPLE_JOIN_PRESENCE = "view_v1_people people " + PRESENCE_JOINS;
183d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String GROUPS = "view_v1_groups";
184d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String ORGANIZATIONS = "view_v1_organizations";
185d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String CONTACT_METHODS = "view_v1_contact_methods";
186d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String PHONES = "view_v1_phones";
187d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String EXTENSIONS = "view_v1_extensions";
188d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String GROUP_MEMBERSHIP = "view_v1_group_membership";
189c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String PHOTOS = "view_v1_photos";
190f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
191f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
192e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] ORGANIZATION_MIME_TYPES = new String[] {
193e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Organization.CONTENT_ITEM_TYPE
194e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
195e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
196e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] CONTACT_METHOD_MIME_TYPES = new String[] {
197e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Email.CONTENT_ITEM_TYPE,
198e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Im.CONTENT_ITEM_TYPE,
19967dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey        StructuredPostal.CONTENT_ITEM_TYPE,
200e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
201e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
202e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] PHONE_MIME_TYPES = new String[] {
203e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Phone.CONTENT_ITEM_TYPE
204e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
205e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
206044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private static final String[] PHOTO_MIME_TYPES = new String[] {
207044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Photo.CONTENT_ITEM_TYPE
208044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    };
209044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
210044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private static final String[] EXTENSION_MIME_TYPES = new String[] {
211044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE
212044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    };
213044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
21467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private interface IdQuery {
21567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        String[] COLUMNS = { BaseColumns._ID };
216c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
217c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int _ID = 0;
218c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
219c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
220c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    /**
221c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     * A custom data row that is used to store legacy photo data fields no
222c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     * longer directly supported by the API.
223c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     */
224c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private interface LegacyPhotoData {
225c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/photo_v1_extras";
226c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
227c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String PHOTO_DATA_ID = Data.DATA1;
228c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String LOCAL_VERSION = Data.DATA2;
229c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String DOWNLOAD_REQUIRED = Data.DATA3;
230c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String EXISTS_ON_SERVER = Data.DATA4;
231c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String SYNC_ERROR = Data.DATA5;
232c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
233c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
234c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    public static final String LEGACY_PHOTO_JOIN =
2355ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            " LEFT OUTER JOIN data legacy_photo ON (raw_contacts._id = legacy_photo.raw_contact_id"
236c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = legacy_photo.mimetype_id)"
237c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'"
238c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + " AND " + DataColumns.CONCRETE_ID + " = legacy_photo." + LegacyPhotoData.PHOTO_DATA_ID
239c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + ")";
240c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
241f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final HashMap<String, String> sPeopleProjectionMap;
2423cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final HashMap<String, String> sOrganizationProjectionMap;
243e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final HashMap<String, String> sContactMethodProjectionMap;
244e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final HashMap<String, String> sPhoneProjectionMap;
2450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sExtensionProjectionMap;
2460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sGroupProjectionMap;
2470f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sGroupMembershipProjectionMap;
248c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final HashMap<String, String> sPhotoProjectionMap;
249fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
250f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    static {
251f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
252f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // Contacts URI matching table
253f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        UriMatcher matcher = sUriMatcher;
254f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
255f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        String authority = android.provider.Contacts.AUTHORITY;
2560f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "extensions", EXTENSIONS);
2570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "extensions/#", EXTENSIONS_ID);
2580f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groups", GROUPS);
2590f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groups/#", GROUPS_ID);
260f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/name/*/members", GROUP_NAME_MEMBERS);
261f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/name/*/members/filter/*",
262f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                GROUP_NAME_MEMBERS_FILTER);
263f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/system_id/*/members", GROUP_SYSTEM_ID_MEMBERS);
264f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/system_id/*/members/filter/*",
265f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                GROUP_SYSTEM_ID_MEMBERS_FILTER);
2660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groupmembership", GROUPMEMBERSHIP);
2670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groupmembership/#", GROUPMEMBERSHIP_ID);
268f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groupmembershipraw", GROUPMEMBERSHIP_RAW);
269f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people", PEOPLE);
270f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/strequent", PEOPLE_STREQUENT);
271f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/strequent/filter/*", PEOPLE_STREQUENT_FILTER);
272445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov        matcher.addURI(authority, "people/filter/*", PEOPLE_FILTER);
273f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/with_phones_filter/*",
274f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_WITH_PHONES_FILTER);
275f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/with_email_or_im_filter/*",
276f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_WITH_EMAIL_OR_IM_FILTER);
277f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people/#", PEOPLE_ID);
2780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/extensions", PEOPLE_EXTENSIONS);
2790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/extensions/#", PEOPLE_EXTENSIONS_ID);
280e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/phones", PEOPLE_PHONES);
281e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/phones/#", PEOPLE_PHONES_ID);
282f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/phones_with_presence",
283f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_PHONES_WITH_PRESENCE);
284c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "people/#/photo", PEOPLE_PHOTO);
285f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/photo/data", PEOPLE_PHOTO_DATA);
286e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/contact_methods", PEOPLE_CONTACTMETHODS);
287f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/contact_methods_with_presence",
288f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_CONTACTMETHODS_WITH_PRESENCE);
289e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID);
290f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/organizations", PEOPLE_ORGANIZATIONS);
291f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/organizations/#", PEOPLE_ORGANIZATIONS_ID);
2920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/groupmembership", PEOPLE_GROUPMEMBERSHIP);
2930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/groupmembership/#", PEOPLE_GROUPMEMBERSHIP_ID);
294f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/raw", PEOPLE_RAW);
295f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/owner", PEOPLE_OWNER);
296f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people/#/update_contact_time",
297f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                PEOPLE_UPDATE_CONTACT_TIME);
29833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov        matcher.addURI(authority, "deleted_people", DELETED_PEOPLE);
29933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov        matcher.addURI(authority, "deleted_groups", DELETED_GROUPS);
300e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "phones", PHONES);
301f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones_with_presence", PHONES_WITH_PRESENCE);
302fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        matcher.addURI(authority, "phones/filter/*", PHONES_FILTER);
303f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones/filter_name/*", PHONES_FILTER_NAME);
304f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones/mobile_filter_name/*",
305f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PHONES_MOBILE_FILTER_NAME);
306e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "phones/#", PHONES_ID);
307c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "photos", PHOTOS);
308c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "photos/#", PHOTOS_ID);
309e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "contact_methods", CONTACTMETHODS);
310bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        matcher.addURI(authority, "contact_methods/email", CONTACTMETHODS_EMAIL);
311f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "contact_methods/email/*", CONTACTMETHODS_EMAIL_FILTER);
312e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "contact_methods/#", CONTACTMETHODS_ID);
313f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "contact_methods/with_presence",
314f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                CONTACTMETHODS_WITH_PRESENCE);
3153cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        matcher.addURI(authority, "organizations", ORGANIZATIONS);
3163cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        matcher.addURI(authority, "organizations/#", ORGANIZATIONS_ID);
317f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "voice_dialer_timestamp", VOICE_DIALER_TIMESTAMP);
318c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY,
319c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                SEARCH_SUGGESTIONS);
320c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY + "/*",
321c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                SEARCH_SUGGESTIONS);
322b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/#",
323b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov                SEARCH_SHORTCUT);
324f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "settings", SETTINGS);
325f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//
3261b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/people", LIVE_FOLDERS_PEOPLE);
3271b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/people/*",
3281b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                LIVE_FOLDERS_PEOPLE_GROUP_NAME);
3291b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/people_with_phones",
3301b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                LIVE_FOLDERS_PEOPLE_WITH_PHONES);
3311b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/favorites",
3321b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                LIVE_FOLDERS_PEOPLE_FAVORITES);
333f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
334f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
335e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        HashMap<String, String> peopleProjectionMap = new HashMap<String, String>();
336d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.NAME, People.NAME);
337d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.DISPLAY_NAME, People.DISPLAY_NAME);
338d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.PHONETIC_NAME, People.PHONETIC_NAME);
339d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.NOTES, People.NOTES);
340d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.TIMES_CONTACTED, People.TIMES_CONTACTED);
341d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.LAST_TIME_CONTACTED, People.LAST_TIME_CONTACTED);
342d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.CUSTOM_RINGTONE, People.CUSTOM_RINGTONE);
343d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.SEND_TO_VOICEMAIL, People.SEND_TO_VOICEMAIL);
344d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.STARRED, People.STARRED);
345ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        peopleProjectionMap.put(People.PRIMARY_ORGANIZATION_ID, People.PRIMARY_ORGANIZATION_ID);
346ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        peopleProjectionMap.put(People.PRIMARY_EMAIL_ID, People.PRIMARY_EMAIL_ID);
347ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        peopleProjectionMap.put(People.PRIMARY_PHONE_ID, People.PRIMARY_PHONE_ID);
348e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
349e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPeopleProjectionMap = new HashMap<String, String>(peopleProjectionMap);
3509155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPeopleProjectionMap.put(People._ID, People._ID);
351d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.NUMBER, People.NUMBER);
352d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.TYPE, People.TYPE);
353d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.LABEL, People.LABEL);
354d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.NUMBER_KEY, People.NUMBER_KEY);
3550126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov        sPeopleProjectionMap.put(People.IM_PROTOCOL, IM_PROTOCOL_SQL + " AS " + People.IM_PROTOCOL);
35670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.IM_HANDLE, People.IM_HANDLE);
35770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.IM_ACCOUNT, People.IM_ACCOUNT);
35870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.PRESENCE_STATUS, People.PRESENCE_STATUS);
35970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.PRESENCE_CUSTOM_STATUS, People.PRESENCE_CUSTOM_STATUS);
3603cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
3613cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap = new HashMap<String, String>();
3629155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations._ID,
3639155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Organizations._ID);
3643cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.PERSON_ID,
365d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.PERSON_ID);
3663cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.ISPRIMARY,
367d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.ISPRIMARY);
3683cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.COMPANY,
369d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.COMPANY);
3703cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TYPE,
371d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.TYPE);
3723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.LABEL,
373d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.LABEL);
3743cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TITLE,
375d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.TITLE);
376e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
377e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sContactMethodProjectionMap = new HashMap<String, String>(peopleProjectionMap);
3789155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods._ID, ContactMethods._ID);
379d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.PERSON_ID, ContactMethods.PERSON_ID);
380d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.KIND, ContactMethods.KIND);
381d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.ISPRIMARY, ContactMethods.ISPRIMARY);
382d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.TYPE, ContactMethods.TYPE);
383d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.DATA, ContactMethods.DATA);
384d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.LABEL, ContactMethods.LABEL);
385d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.AUX_DATA, ContactMethods.AUX_DATA);
386e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
387e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap = new HashMap<String, String>(peopleProjectionMap);
3889155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones._ID,
3899155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Phones._ID);
390e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.PERSON_ID,
391d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.PERSON_ID);
392e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.ISPRIMARY,
393d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.ISPRIMARY);
394e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER,
395d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.NUMBER);
396e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.TYPE,
397d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.TYPE);
398e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.LABEL,
399d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.LABEL);
400e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER_KEY,
401d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.NUMBER_KEY);
4020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
4030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap = new HashMap<String, String>();
4049155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions._ID,
4059155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Extensions._ID);
4060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.PERSON_ID,
407d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.PERSON_ID);
4080f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.NAME,
409d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.NAME);
4100f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.VALUE,
411d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.VALUE);
4120f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
4130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap = new HashMap<String, String>();
4140f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups._ID,
415d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups._ID);
4160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.NAME,
417d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.NAME);
4180f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.NOTES,
419d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.NOTES);
4200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.SYSTEM_ID,
421d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.SYSTEM_ID);
4220f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
4230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap = new HashMap<String, String>();
4249155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership._ID,
4259155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.GroupMembership._ID);
4260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.PERSON_ID,
427d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.GroupMembership.PERSON_ID);
4280f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.GROUP_ID,
429d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.GroupMembership.GROUP_ID);
430c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
431c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap = new HashMap<String, String>();
4329155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos._ID,
4339155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Photos._ID);
434c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.PERSON_ID,
435c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.PERSON_ID);
436c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.DATA,
437c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.DATA);
438c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.LOCAL_VERSION,
439c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.LOCAL_VERSION);
440c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.DOWNLOAD_REQUIRED,
441c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.DOWNLOAD_REQUIRED);
442c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.EXISTS_ON_SERVER,
443c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.EXISTS_ON_SERVER);
444c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.SYNC_ERROR,
445c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.SYNC_ERROR);
446f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
447f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
448f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final Context mContext;
449f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final OpenHelper mOpenHelper;
450f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final ContactsProvider2 mContactsProvider;
451f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final NameSplitter mPhoneticNameSplitter;
452a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov    private final GlobalSearchSupport mGlobalSearchSupport;
453f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
454d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov    /** Precompiled sql statement for incrementing times contacted for a contact */
4553cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private final SQLiteStatement mLastTimeContactedUpdate;
456044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private final SQLiteStatement mDataMimetypeQuery;
457044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private final SQLiteStatement mDataRawContactIdQuery;
4583cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
4593cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private final ContentValues mValues = new ContentValues();
46067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private final ContentValues mValues2 = new ContentValues();
46167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private final ContentValues mValues3 = new ContentValues();
462caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private Account mAccount;
463a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
464044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private long mMimetypeEmail;
465044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private long mMimetypeIm;
466044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private long mMimetypePostal;
467044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
468f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public LegacyApiSupport(Context context, OpenHelper openHelper,
469a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov            ContactsProvider2 contactsProvider, GlobalSearchSupport globalSearchSupport) {
470f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContext = context;
471f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContactsProvider = contactsProvider;
472f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mOpenHelper = openHelper;
473a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        mGlobalSearchSupport = globalSearchSupport;
474f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
475622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey        mPhoneticNameSplitter = new NameSplitter("", "", "", context
476622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey                .getString(com.android.internal.R.string.common_name_conjunctions), Locale
477622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey                .getDefault());
478f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
479f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
4805ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mLastTimeContactedUpdate = db.compileStatement("UPDATE " + Tables.RAW_CONTACTS + " SET "
4816cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts.TIMES_CONTACTED + "="
4826cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts.TIMES_CONTACTED + "+1,"
4836cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts.LAST_TIME_CONTACTED + "=? WHERE "
4846cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts._ID + "=?");
485044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
486044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mDataMimetypeQuery = db.compileStatement(
487044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                "SELECT " + DataColumns.MIMETYPE_ID +
488044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                " FROM " + Tables.DATA +
489044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                " WHERE " + Data._ID + "=?");
490044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
491044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mDataRawContactIdQuery = db.compileStatement(
492044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                "SELECT " + Data.RAW_CONTACT_ID +
493044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                " FROM " + Tables.DATA +
494044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                " WHERE " + Data._ID + "=?");
495044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
496044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mMimetypeEmail = mOpenHelper.getMimeTypeId(Email.CONTENT_ITEM_TYPE);
497044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mMimetypeIm = mOpenHelper.getMimeTypeId(Im.CONTENT_ITEM_TYPE);
498044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mMimetypePostal = mOpenHelper.getMimeTypeId(StructuredPostal.CONTENT_ITEM_TYPE);
499f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
500f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
501caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private void ensureDefaultAccount() {
502caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        if (mAccount == null) {
503caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov            mAccount = mContactsProvider.getDefaultAccount();
5046f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov            if (mAccount == null) {
5056f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov
5066f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov                // This fall-through account will not match any data in the database, which
5076f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov                // is the expected behavior
50828153f2e3dda944e983f6dd0ab80aca63631ddfaJeff Hamilton                mAccount = new Account(NON_EXISTENT_ACCOUNT_NAME, NON_EXISTENT_ACCOUNT_TYPE);
5096f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov            }
510caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        }
511caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
512d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
513b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamilton    public static void createDatabase(SQLiteDatabase db) {
514b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamilton        Log.i(TAG, "Bootstrapping database legacy support");
515d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
516ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        String peopleColumns = "name." + StructuredName.DISPLAY_NAME
517d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NAME + ", " +
5185ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME
519d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.DISPLAY_NAME + ", " +
520d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PHONETIC_NAME_SQL
521d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PHONETIC_NAME + " , " +
522d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "note." + Note.NOTE
523d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NOTES + ", " +
524caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
525caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
5265ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED
527d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.TIMES_CONTACTED + ", " +
5285ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED
529d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.LAST_TIME_CONTACTED + ", " +
5305ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE
531d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.CUSTOM_RINGTONE + ", " +
5325ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL
533d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.SEND_TO_VOICEMAIL + ", " +
5345ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.STARRED
535d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.STARRED + ", " +
536d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "organization." + Data._ID
537d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_ORGANIZATION_ID + ", " +
538d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "email." + Data._ID
539d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_EMAIL_ID + ", " +
540d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Data._ID
541d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_PHONE_ID + ", " +
542d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.NUMBER
543d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NUMBER + ", " +
544d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.TYPE
545d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.TYPE + ", " +
546d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.LABEL
547d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.LABEL + ", " +
548d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + PhoneColumns.NORMALIZED_NUMBER
549ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                        + " AS " + People.NUMBER_KEY;
550ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov
551ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PEOPLE + ";");
552ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PEOPLE + " AS SELECT " +
553ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                RawContactsColumns.CONCRETE_ID
554ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                        + " AS " + android.provider.Contacts.People._ID + ", " +
555ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                peopleColumns +
5565ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.RAW_CONTACTS + PEOPLE_JOINS +
557ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                " WHERE " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
558ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                " AND " + RawContacts.IS_RESTRICTED + "=0" + ";");
559d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
560d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.ORGANIZATIONS + ";");
561d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.ORGANIZATIONS + " AS SELECT " +
562d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
563d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations._ID + ", " +
5645ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Data.RAW_CONTACT_ID
565d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.PERSON_ID + ", " +
566d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Data.IS_PRIMARY
567d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.ISPRIMARY + ", " +
568caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
569caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
570d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.COMPANY
571d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.COMPANY + ", " +
572d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.TYPE
573d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.TYPE + ", " +
574d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.LABEL
575d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.LABEL + ", " +
576d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.TITLE
577caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.TITLE +
5785ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS +
579d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
58033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Organization.CONTENT_ITEM_TYPE + "'"
581caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
582caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
583d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
584d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
585d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.CONTACT_METHODS + ";");
586d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.CONTACT_METHODS + " AS SELECT " +
587d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
588d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods._ID + ", " +
589d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
590d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.PERSON_ID + ", " +
591d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                CONTACT_METHOD_KIND_SQL
592d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.KIND + ", " +
593d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_IS_PRIMARY
594d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.ISPRIMARY + ", " +
595d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_DATA1
596d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.TYPE + ", " +
59797f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                CONTACT_METHOD_DATA_SQL
598d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.DATA + ", " +
599d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_DATA3
600d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.LABEL + ", " +
601d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_DATA14
602d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.AUX_DATA + ", " +
603ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                peopleColumns +
604d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS +
60533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                " WHERE " + ContactMethods.KIND + " IS NOT NULL"
606caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                    + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
607caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                    + " AND " + RawContacts.IS_RESTRICTED + "=0" +
608d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
609d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
610d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
611d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHONES + ";");
612d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PHONES + " AS SELECT " +
613d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
614d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones._ID + ", " +
615d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
616d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.PERSON_ID + ", " +
617d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_IS_PRIMARY
618d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.ISPRIMARY + ", " +
619d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.NUMBER
620d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NUMBER + ", " +
621d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.TYPE
622d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.TYPE + ", " +
623d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.LABEL
624d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.LABEL + ", " +
625d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PhoneColumns.CONCRETE_NORMALIZED_NUMBER
626d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NUMBER_KEY + ", " +
627ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                peopleColumns +
628d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS +
629d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
63033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Phone.CONTENT_ITEM_TYPE + "'"
631caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
632caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
633d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
634d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
635d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.EXTENSIONS + ";");
636d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.EXTENSIONS + " AS SELECT " +
637d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
638d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions._ID + ", " +
639d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
640d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.PERSON_ID + ", " +
641caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
642caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
643d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                ExtensionsColumns.NAME
644d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.NAME + ", " +
645d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                ExtensionsColumns.VALUE
646caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.VALUE +
6475ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS +
648d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
64933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE + "'"
650caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
651caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
652d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
653d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
654d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUPS + ";");
655d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.GROUPS + " AS SELECT " +
656d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                GroupsColumns.CONCRETE_ID + " AS " + android.provider.Contacts.Groups._ID + ", " +
657caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Groups.ACCOUNT_NAME + ", " +
658caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Groups.ACCOUNT_TYPE + ", " +
659d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.TITLE + " AS " + android.provider.Contacts.Groups.NAME + ", " +
660d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.NOTES + " AS " + android.provider.Contacts.Groups.NOTES + " , " +
661d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.SYSTEM_ID + " AS " + android.provider.Contacts.Groups.SYSTEM_ID +
662d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.GROUPS +
663d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
664d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
665d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUP_MEMBERSHIP + ";");
666d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.GROUP_MEMBERSHIP + " AS SELECT " +
667d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
668d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership._ID + ", " +
669d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
670d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.PERSON_ID + ", " +
671caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_NAME
672caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " +  RawContacts.ACCOUNT_NAME + ", " +
673caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_TYPE
674caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " +  RawContacts.ACCOUNT_TYPE + ", " +
675d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                GroupMembership.GROUP_ROW_ID
676d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.GROUP_ID + ", " +
677d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.TITLE
678d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.NAME + ", " +
679d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.NOTES
680d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.NOTES + " , " +
681d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.SYSTEM_ID
682caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.SYSTEM_ID +
6835ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_GROUPS +
684d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
68533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + GroupMembership.CONTENT_ITEM_TYPE + "'"
6865ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
687d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
688c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
689c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHOTOS + ";");
690c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PHOTOS + " AS SELECT " +
691c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                DataColumns.CONCRETE_ID
692c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos._ID + ", " +
693d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
694c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.PERSON_ID + ", " +
695caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
696caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
697c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                Tables.DATA + "." + Photo.PHOTO
698c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.DATA + ", " +
699c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.EXISTS_ON_SERVER
700c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.EXISTS_ON_SERVER + ", " +
701c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.DOWNLOAD_REQUIRED
702c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.DOWNLOAD_REQUIRED + ", " +
703c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.LOCAL_VERSION
704c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.LOCAL_VERSION + ", " +
705c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.SYNC_ERROR
706caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.SYNC_ERROR +
707c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS + LEGACY_PHOTO_JOIN +
708c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
70933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Photo.CONTENT_ITEM_TYPE + "'"
710caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
711caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
712c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        ";");
713d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    }
714d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
715f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public Uri insert(Uri uri, ContentValues values) {
71667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        ensureDefaultAccount();
717f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final int match = sUriMatcher.match(uri);
718f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        long id = 0;
719f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch (match) {
720f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE:
7213cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                id = insertPeople(values);
7223cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
7233cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
7243cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS:
7253cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                id = insertOrganization(values);
726f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
727f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
7280f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS: {
7295ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
7305ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertContactMethod(rawContactId, values);
731e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
7320f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
733e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case CONTACTMETHODS: {
7355ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values, ContactMethods.PERSON_ID);
7365ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertContactMethod(rawContactId, values);
737e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
7380f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
739e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PHONES: {
7415ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7420f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.Phones.PERSON_ID);
7435ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertPhone(rawContactId, values);
7440f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
74794743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton            case PEOPLE_PHONES: {
74894743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
74994743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton                id = insertPhone(rawContactId, values);
75094743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton                break;
75194743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton            }
75294743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton
7530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS: {
7545ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7550f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.Extensions.PERSON_ID);
7565ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertExtension(rawContactId, values);
7570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7580f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7590f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
7600f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS:
7610f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                id = insertGroup(values);
762e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
763e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP: {
7655ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.GroupMembership.PERSON_ID);
7670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                long groupId = getRequiredValue(values,
7680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.GroupMembership.GROUP_ID);
7695ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertGroupMembership(rawContactId, groupId);
7700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
773f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            default:
774f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
775f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
776f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
777f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (id < 0) {
778f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            return null;
779f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
780f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
781f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final Uri result = ContentUris.withAppendedId(uri, id);
782f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        onChange(result);
783f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return result;
784f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
785f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
7860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private long getRequiredValue(ContentValues values, String column) {
7870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        if (!values.containsKey(column)) {
7880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            throw new RuntimeException("Required value: " + column);
789e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        }
790e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7910f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return values.getAsLong(column);
792e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
793e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7943cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private long insertPeople(ContentValues values) {
795044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parsePeopleValues(values);
796caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
79767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri contactUri = mContactsProvider.insertInTransaction(RawContacts.CONTENT_URI, mValues);
79867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long rawContactId = ContentUris.parseId(contactUri);
79967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
80067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues2.size() != 0) {
80167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mValues2.put(Data.RAW_CONTACT_ID, rawContactId);
80267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues2);
80367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
80467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues3.size() != 0) {
80567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mValues3.put(Data.RAW_CONTACT_ID, rawContactId);
80667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues3);
80767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
808f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
80967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return rawContactId;
81067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
81167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
8123cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private long insertOrganization(ContentValues values) {
813044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseOrganizationValues(values);
8145ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.RAW_CONTACT_ID,
8153cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.PERSON_ID);
8163cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
81767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
8183cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8193cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        return ContentUris.parseId(uri);
8203cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    }
821f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
8225ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertPhone(long rawContactId, ContentValues values) {
823044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parsePhoneValues(values);
8245ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
825e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
82667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
827e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
828e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        return ContentUris.parseId(uri);
829e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
830e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8315ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertContactMethod(long rawContactId, ContentValues values) {
832e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Integer kind = values.getAsInteger(ContactMethods.KIND);
833e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        if (kind == null) {
834e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            throw new RuntimeException("Required value: " + ContactMethods.KIND);
835e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        }
836e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
837044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseContactMethodValues(kind, values);
838e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
839044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
84067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
841e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        return ContentUris.parseId(uri);
842e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
843e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8445ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertExtension(long rawContactId, ContentValues values) {
8450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.clear();
8460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
8475ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
8480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(Data.MIMETYPE, android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE);
8490f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
850044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseExtensionValues(values);
8510f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
85267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
8530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
8540f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
8550f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
8560f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private long insertGroup(ContentValues values) {
857044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseGroupValues(values);
8580f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
859df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        mValues.put(Groups.ACCOUNT_NAME, mAccount.name);
860df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        mValues.put(Groups.ACCOUNT_TYPE, mAccount.type);
861caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
86267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Groups.CONTENT_URI, mValues);
8630f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
8640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
8650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
8665ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertGroupMembership(long rawContactId, long groupId) {
8670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.clear();
8680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
8690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE);
8705ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(GroupMembership.RAW_CONTACT_ID, rawContactId);
8710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(GroupMembership.GROUP_ROW_ID, groupId);
8720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
87367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
8740f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
8750f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
8760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
877f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
87867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        ensureDefaultAccount();
87967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
88067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int match = sUriMatcher.match(uri);
881c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int count = 0;
882f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch(match) {
88367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case PEOPLE_UPDATE_CONTACT_TIME: {
884f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                count = updateContactTime(uri, values);
885f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
88667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
887c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
888c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PEOPLE_PHOTO: {
8895ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
8905ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                return updatePhoto(rawContactId, values);
891c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            }
892c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
89367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case -1: {
89467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
89567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
89667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
89767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            default: {
89867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                count = updateAll(uri, match, values, selection, selectionArgs);
89967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
90067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
90167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
90267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (count > 0) {
90367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContext.getContentResolver().notifyChange(uri, null);
90467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
90567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
90667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return count;
90767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
90867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
90967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private int updateAll(Uri uri, final int match, ContentValues values, String selection,
91067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            String[] selectionArgs) {
91167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Cursor c = query(uri, IdQuery.COLUMNS, selection, selectionArgs, null, null);
91267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (c == null) {
91367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            return 0;
91467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
91567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
91667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int count = 0;
91767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        try {
91867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            while (c.moveToNext()) {
91967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                long id = c.getLong(IdQuery._ID);
92067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                count += update(match, id, values);
92167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
92267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        } finally {
92367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            c.close();
92467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
92567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
92667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return count;
92767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
92867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
92967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    public int update(int match, long id, ContentValues values) {
93067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int count = 0;
93167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        switch(match) {
93267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case PEOPLE:
93367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case PEOPLE_ID: {
93467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                count = updatePeople(id, values);
93567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                break;
93667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
93767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
938044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case ORGANIZATIONS:
939044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case ORGANIZATIONS_ID: {
940044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updateOrganizations(id, values);
941044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
942044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
943044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
944044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHONES:
945044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHONES_ID: {
946044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updatePhones(id, values);
947044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
948044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
949044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
950044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case CONTACTMETHODS:
951044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case CONTACTMETHODS_ID: {
952044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updateContactMethods(id, values);
953044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
954044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
955044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
956044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case EXTENSIONS:
957044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case EXTENSIONS_ID: {
958044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updateExtensions(id, values);
959044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
960044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
961044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
962044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case GROUPS:
963044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case GROUPS_ID: {
964044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updateGroups(id, values);
965c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
966044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
967c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
968044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS:
969c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PHOTOS_ID:
970044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updatePhotoByDataId(id, values);
971c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
97267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
973c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
97467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return count;
97567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
976c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
97767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private int updatePeople(long rawContactId, ContentValues values) {
978044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parsePeopleValues(values);
97967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
980044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        int count = mContactsProvider.update(RawContacts.CONTENT_URI,
981044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues, RawContacts._ID + "=" + rawContactId, null);
98267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
98367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (count == 0) {
98467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            return 0;
985f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
986f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
98767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues2.size() != 0) {
98867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            Uri dataUri = findFirstDataRow(rawContactId, StructuredName.CONTENT_ITEM_TYPE);
98967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            if (dataUri != null) {
99067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.update(dataUri, mValues2, null, null);
99167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            } else {
99267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mValues2.put(Data.RAW_CONTACT_ID, rawContactId);
99367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues2);
99467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
99567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
99667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
99767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues3.size() != 0) {
99867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            Uri dataUri = findFirstDataRow(rawContactId, Note.CONTENT_ITEM_TYPE);
99967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            if (dataUri != null) {
100067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.update(dataUri, mValues3, null, null);
100167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            } else {
100267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mValues3.put(Data.RAW_CONTACT_ID, rawContactId);
100367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues3);
100467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
1005f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
100667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
1007f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return count;
1008f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1009f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1010044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updateOrganizations(long dataId, ContentValues values) {
1011044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseOrganizationValues(values);
1012044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1013044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1014044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Data._ID + "=" + dataId, null);
1015044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1016044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1017044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updatePhones(long dataId, ContentValues values) {
1018044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parsePhoneValues(values);
1019044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1020044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1021044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Data._ID + "=" + dataId, null);
1022044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1023044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1024044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updateContactMethods(long dataId, ContentValues values) {
1025044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        int kind;
1026044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1027044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mDataMimetypeQuery.bindLong(1, dataId);
1028044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long mimetype_id;
1029044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        try {
1030044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mimetype_id = mDataMimetypeQuery.simpleQueryForLong();
1031044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } catch (SQLiteDoneException e) {
1032044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            // Data row not found
1033044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            return 0;
1034044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1035044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1036044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (mimetype_id == mMimetypeEmail) {
1037044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            kind = android.provider.Contacts.KIND_EMAIL;
1038044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } else if (mimetype_id == mMimetypeIm) {
1039044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            kind = android.provider.Contacts.KIND_IM;
1040044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } else if (mimetype_id == mMimetypePostal) {
1041044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            kind = android.provider.Contacts.KIND_POSTAL;
1042044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } else {
1043044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1044044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            // Non-legacy kind: return "Not found"
1045044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            return 0;
1046044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1047044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1048044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseContactMethodValues(kind, values);
1049044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1050044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1051044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Data._ID + "=" + dataId, null);
1052044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1053044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1054044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updateExtensions(long dataId, ContentValues values) {
1055044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseExtensionValues(values);
1056044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1057044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1058044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Data._ID + "=" + dataId, null);
1059044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1060044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1061044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updateGroups(long groupId, ContentValues values) {
1062044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseGroupValues(values);
1063044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1064044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Groups.CONTENT_URI, mValues,
1065044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Groups._ID + "=" + groupId, null);
1066044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1067044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1068f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private int updateContactTime(Uri uri, ContentValues values) {
1069f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1070f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // TODO check sanctions
1071f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1072f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        long lastTimeContacted;
1073f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (values.containsKey(People.LAST_TIME_CONTACTED)) {
1074f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            lastTimeContacted = values.getAsLong(People.LAST_TIME_CONTACTED);
1075f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        } else {
1076f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            lastTimeContacted = System.currentTimeMillis();
1077f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1078f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
10795ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
1080d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov        long contactId = mOpenHelper.getContactId(rawContactId);
1081d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov        if (contactId != 0) {
1082d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov            mContactsProvider.updateContactTime(contactId, lastTimeContacted);
1083f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        } else {
1084f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            mLastTimeContactedUpdate.bindLong(1, lastTimeContacted);
10855ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mLastTimeContactedUpdate.bindLong(2, rawContactId);
1086f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            mLastTimeContactedUpdate.execute();
1087f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1088f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return 1;
1089f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1090f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
10915ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private int updatePhoto(long rawContactId, ContentValues values) {
1092c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1093c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        // TODO check sanctions
1094c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1095c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int count;
1096c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
109767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long dataId = findFirstDataId(rawContactId, Photo.CONTENT_ITEM_TYPE);
1098c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1099c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.clear();
1100c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA);
1101c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.put(Photo.PHOTO, bytes);
1102c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1103c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        if (dataId == -1) {
1104c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE);
11055ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(Data.RAW_CONTACT_ID, rawContactId);
110667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            Uri dataUri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
1107c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            dataId = ContentUris.parseId(dataUri);
1108c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            count = 1;
1109c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        } else {
1110c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            Uri dataUri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
111167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            count = mContactsProvider.updateInTransaction(dataUri, mValues, null, null);
1112c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        }
1113c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1114044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        updateLegacyPhotoData(rawContactId, dataId, values);
1115044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1116044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return count;
1117044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1118044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1119044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updatePhotoByDataId(long dataId, ContentValues values) {
1120044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1121044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mDataRawContactIdQuery.bindLong(1, dataId);
1122044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long rawContactId;
1123044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1124044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        try {
1125044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            rawContactId = mDataRawContactIdQuery.simpleQueryForLong();
1126044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } catch (SQLiteDoneException e) {
1127044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            // Data row not found
1128044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            return 0;
1129044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1130044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1131044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (values.containsKey(android.provider.Contacts.Photos.DATA)) {
1132044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA);
1133044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mValues.clear();
1134044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mValues.put(Photo.PHOTO, bytes);
1135044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1136044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    Data._ID + "=" + dataId, null);
1137044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1138044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1139044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        updateLegacyPhotoData(rawContactId, dataId, values);
1140044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1141044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return 1;
1142044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1143044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1144044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void updateLegacyPhotoData(long rawContactId, long dataId, ContentValues values) {
1145c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.clear();
1146c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.LOCAL_VERSION,
1147c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.LOCAL_VERSION);
1148c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.DOWNLOAD_REQUIRED,
1149c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.DOWNLOAD_REQUIRED);
1150c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.EXISTS_ON_SERVER,
1151c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.EXISTS_ON_SERVER);
1152c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.SYNC_ERROR,
1153c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.SYNC_ERROR);
1154c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
115567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int updated = mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1156c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                Data.MIMETYPE + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'"
11575ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Data.RAW_CONTACT_ID + "=" + rawContactId
1158c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AND " + LegacyPhotoData.PHOTO_DATA_ID + "=" + dataId, null);
1159c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        if (updated == 0) {
11605ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(Data.RAW_CONTACT_ID, rawContactId);
1161c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(Data.MIMETYPE, LegacyPhotoData.CONTENT_ITEM_TYPE);
1162c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(LegacyPhotoData.PHOTO_DATA_ID, dataId);
116367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
1164c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        }
1165044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1166c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1167044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parsePeopleValues(ContentValues values) {
1168044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1169044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues2.clear();
1170044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues3.clear();
1171044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1172044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, RawContacts.CUSTOM_RINGTONE,
1173044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.CUSTOM_RINGTONE);
1174044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, RawContacts.SEND_TO_VOICEMAIL,
1175044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.SEND_TO_VOICEMAIL);
1176044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, RawContacts.LAST_TIME_CONTACTED,
1177044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.LAST_TIME_CONTACTED);
1178044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, RawContacts.TIMES_CONTACTED,
1179044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.TIMES_CONTACTED);
1180044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, RawContacts.STARRED,
1181044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.STARRED);
1182044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(RawContacts.ACCOUNT_NAME, mAccount.name);
1183044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(RawContacts.ACCOUNT_TYPE, mAccount.type);
1184044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1185044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (values.containsKey(People.NAME) || values.containsKey(People.PHONETIC_NAME)) {
1186044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mValues2.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
1187044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            OpenHelper.copyStringValue(mValues2, StructuredName.DISPLAY_NAME,
1188044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    values, People.NAME);
1189044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            if (values.containsKey(People.PHONETIC_NAME)) {
1190044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                String phoneticName = values.getAsString(People.PHONETIC_NAME);
1191044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                NameSplitter.Name parsedName = new NameSplitter.Name();
1192044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mPhoneticNameSplitter.split(parsedName, phoneticName);
1193044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues2.put(StructuredName.PHONETIC_GIVEN_NAME, parsedName.getGivenNames());
1194044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues2.put(StructuredName.PHONETIC_MIDDLE_NAME, parsedName.getMiddleName());
1195044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues2.put(StructuredName.PHONETIC_FAMILY_NAME, parsedName.getFamilyName());
1196044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1197044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1198044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1199044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (values.containsKey(People.NOTES)) {
1200044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mValues3.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE);
1201044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            OpenHelper.copyStringValue(mValues3, Note.NOTE, values, People.NOTES);
1202044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1203044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1204044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1205044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parseOrganizationValues(ContentValues values) {
1206044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1207044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1208044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
1209044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1210044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY,
1211044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.ISPRIMARY);
1212044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1213044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Organization.COMPANY,
1214044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.COMPANY);
1215044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1216044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        // TYPE values happen to remain the same between V1 and V2 - can just copy the value
1217044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Organization.TYPE,
1218044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.TYPE);
1219044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1220044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Organization.LABEL,
1221044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.LABEL);
1222044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Organization.TITLE,
1223044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.TITLE);
1224044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1225044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1226044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parsePhoneValues(ContentValues values) {
1227044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1228044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1229044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
1230044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1231044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY,
1232044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Phones.ISPRIMARY);
1233044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1234044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Phone.NUMBER,
1235044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Phones.NUMBER);
1236044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1237044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        // TYPE values happen to remain the same between V1 and V2 - can just copy the value
1238044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Phone.TYPE,
1239044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Phones.TYPE);
1240044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1241044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Phone.LABEL,
1242044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Phones.LABEL);
1243044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1244044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1245044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parseContactMethodValues(int kind, ContentValues values) {
1246044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1247044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1248044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY, values, ContactMethods.ISPRIMARY);
1249044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1250044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        switch (kind) {
1251044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case android.provider.Contacts.KIND_EMAIL: {
1252044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                copyCommonFields(values, Email.CONTENT_ITEM_TYPE, Email.TYPE, Email.LABEL,
1253044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                        Data.DATA14);
1254044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                OpenHelper.copyStringValue(mValues, Email.DATA, values, ContactMethods.DATA);
1255044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1256044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1257044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1258044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case android.provider.Contacts.KIND_IM: {
1259044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                String protocol = values.getAsString(ContactMethods.DATA);
1260044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                if (protocol.startsWith("pre:")) {
1261044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    mValues.put(Im.PROTOCOL, Integer.parseInt(protocol.substring(4)));
1262044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                } else if (protocol.startsWith("custom:")) {
1263044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    mValues.put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM);
1264044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    mValues.put(Im.CUSTOM_PROTOCOL, protocol.substring(7));
1265044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                }
1266044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1267044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                copyCommonFields(values, Im.CONTENT_ITEM_TYPE, Im.TYPE, Im.LABEL, Data.DATA14);
1268044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1269044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1270044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1271044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case android.provider.Contacts.KIND_POSTAL: {
1272044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                copyCommonFields(values, StructuredPostal.CONTENT_ITEM_TYPE, StructuredPostal.TYPE,
1273044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                        StructuredPostal.LABEL, Data.DATA14);
1274044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                OpenHelper.copyStringValue(mValues, StructuredPostal.FORMATTED_ADDRESS, values,
1275044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                        ContactMethods.DATA);
1276044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1277044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1278044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1279044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1280044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1281044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void copyCommonFields(ContentValues values, String mimeType, String typeColumn,
1282044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            String labelColumn, String auxDataColumn) {
1283044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(Data.MIMETYPE, mimeType);
1284044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, typeColumn, values, ContactMethods.TYPE);
1285044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, labelColumn, values, ContactMethods.LABEL);
1286044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, auxDataColumn, values, ContactMethods.AUX_DATA);
1287044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1288044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1289044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parseGroupValues(ContentValues values) {
1290044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1291044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1292044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Groups.TITLE,
1293044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Groups.NAME);
1294044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Groups.NOTES,
1295044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Groups.NOTES);
1296044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Groups.SYSTEM_ID,
1297044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Groups.SYSTEM_ID);
1298044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1299044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1300044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parseExtensionValues(ContentValues values) {
1301044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, ExtensionsColumns.NAME,
1302044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.People.Extensions.NAME);
1303044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, ExtensionsColumns.VALUE,
1304044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.People.Extensions.VALUE);
1305c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
1306c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
130767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private Uri findFirstDataRow(long rawContactId, String contentItemType) {
130867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long dataId = findFirstDataId(rawContactId, contentItemType);
130967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (dataId == -1) {
131067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            return null;
131167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
131267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
131367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
131467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
131567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
131667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private long findFirstDataId(long rawContactId, String mimeType) {
131767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long dataId = -1;
131867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Cursor c = mContactsProvider.query(Data.CONTENT_URI, IdQuery.COLUMNS,
131967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                Data.RAW_CONTACT_ID + "=" + rawContactId + " AND "
132067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                        + Data.MIMETYPE + "='" + mimeType + "'",
132167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                null, null);
132267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        try {
132367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            if (c.moveToFirst()) {
132467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                dataId = c.getLong(IdQuery._ID);
132567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
132667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        } finally {
132767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            c.close();
132867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
132967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return dataId;
133067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
133167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
1332044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
13333cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    public int delete(Uri uri, String selection, String[] selectionArgs) {
1334044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Cursor c = query(uri, IdQuery.COLUMNS, selection, selectionArgs, null, null);
1335044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (c == null) {
1336044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            return 0;
1337044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1338044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1339044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        int count = 0;
1340044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        try {
1341044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            while (c.moveToNext()) {
1342044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                long id = c.getLong(IdQuery._ID);
1343044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count += delete(uri, id);
1344044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1345044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } finally {
1346044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            c.close();
1347044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1348044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1349044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return count;
1350044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1351044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1352044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public int delete(Uri uri, long id) {
13533cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        final int match = sUriMatcher.match(uri);
13543cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        int count = 0;
13553cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        switch (match) {
1356044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PEOPLE:
135733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case PEOPLE_ID:
135833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                count = mContactsProvider.deleteRawContact(ContentUris.parseId(uri), false);
135933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                break;
136033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov
1361044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PEOPLE_PHOTO:
1362044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues.clear();
1363044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues.putNull(android.provider.Contacts.Photos.DATA);
1364044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                updatePhoto(id, mValues);
1365044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1366044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1367044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case ORGANIZATIONS:
13683cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS_ID:
1369e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1370e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        ORGANIZATION_MIME_TYPES);
1371e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1372e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1373044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case CONTACTMETHODS:
1374e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS_ID:
1375e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1376e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        CONTACT_METHOD_MIME_TYPES);
1377e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1378e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1379044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1380044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHONES:
1381e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES_ID:
1382e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1383e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        PHONE_MIME_TYPES);
13843cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
13853cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
1386044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case EXTENSIONS:
1387044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case EXTENSIONS_ID:
1388044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1389044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                        EXTENSION_MIME_TYPES);
1390044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1391044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1392044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS:
1393044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS_ID:
1394044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1395044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                        PHOTO_MIME_TYPES);
1396044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1397044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1398044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
13993cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            default:
14003cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
14013cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        }
14023cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
14033cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        return count;
14043cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    }
14053cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
1406f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
1407c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            String sortOrder, String limit) {
1408caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        ensureDefaultAccount();
1409caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
1410f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final SQLiteDatabase db = mOpenHelper.getReadableDatabase();
1411f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
1412f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        String groupBy = null;
1413f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1414f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final int match = sUriMatcher.match(uri);
1415f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch (match) {
1416f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE: {
141770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1418f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
141967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1420f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
1421f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            }
1422f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1423f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE_ID:
142470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1425f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
142667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1427caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + People._ID + "=");
1428f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1429f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
1430f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1431445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov            case PEOPLE_FILTER: {
1432445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1433445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
143467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1435445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                String filterParam = uri.getPathSegments().get(2);
1436caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + People._ID + " IN "
14375ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + mContactsProvider.getRawContactsByFilterAsNestedQuery(filterParam));
1438445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                break;
1439445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov            }
1440445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov
14413cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS:
14425dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.ORGANIZATIONS + " organizations");
1443d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sOrganizationProjectionMap);
144467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
14453cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
14463cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
14473cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS_ID:
14485dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.ORGANIZATIONS + " organizations");
14493cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                qb.setProjectionMap(sOrganizationProjectionMap);
145067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1451d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Organizations._ID + "=");
1452e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1453e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1454e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1455e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS:
14565dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1457d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
145867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1459e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1460e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1461e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS_ID:
14625dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1463e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
146467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1465d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods._ID + "=");
1466e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1467e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1468e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1469bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov            case CONTACTMETHODS_EMAIL:
1470bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1471bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
1472bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                applyRawContactsAccount(qb);
1473bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + "="
1474bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                        + android.provider.Contacts.KIND_EMAIL);
1475bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                break;
1476bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov
1477e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS:
14785dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1479e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
148067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1481d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "=");
1482e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1483e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL");
1484e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1485e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1486e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS_ID:
14875dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1488e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
148967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1490d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "=");
1491e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1492d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods._ID + "=");
1493e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
1494e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL");
1495e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1496e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1497e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES:
14985dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1499d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
150067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1501e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1502e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1503e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES_ID:
15045dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1505e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
150667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1507d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "=");
1508e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1509e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1510e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1511fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov            case PHONES_FILTER:
15125dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1513fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
151467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1515fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                if (uri.getPathSegments().size() > 2) {
1516fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                    String filterParam = uri.getLastPathSegment();
1517e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov                    qb.appendWhere(" AND person =");
1518e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov                    qb.appendWhere(mOpenHelper.buildPhoneLookupAsNestedQuery(filterParam));
1519fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                }
1520fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                break;
1521fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
1522e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_PHONES:
15235dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1524e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
152567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1526d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "=");
1527e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1528e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1529e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1530e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_PHONES_ID:
15315dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1532e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
153367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1534d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "=");
15353cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1536d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "=");
1537e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
15383cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
15393cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
15400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS:
15415dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
1542d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
154367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
15440f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
15450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
15460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS_ID:
15475dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
15480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
154967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1550d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "=");
15510f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
15520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
15530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
15540f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_EXTENSIONS:
15555dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
15560f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
155767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1558d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "=");
15590f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
15600f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
15610f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
15620f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_EXTENSIONS_ID:
15635dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
15640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
156567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1566d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "=");
15670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1568d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "=");
15690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
15700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
15710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
15720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS:
15735dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUPS + " groups");
15740f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupProjectionMap);
157567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyGroupAccount(qb);
15760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
15770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
15780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS_ID:
15795dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUPS + " groups");
15800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupProjectionMap);
158167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyGroupAccount(qb);
1582caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Groups._ID + "=");
15830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
15840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
15850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
15860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP:
15875dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
1588d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
158967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
15900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
15910f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
15920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP_ID:
15935dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
15940f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
159567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1596d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "=");
15970f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
15980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
15990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
16000f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_GROUPMEMBERSHIP:
16015dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
16020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
160367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1604d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "=");
16050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
16060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
16070f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
16080f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_GROUPMEMBERSHIP_ID:
16095dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
16100f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
161167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1612d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "=");
16130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1614d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "=");
16150f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
16160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
16170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
1618c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PEOPLE_PHOTO:
16195dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHOTOS + " photos");
1620c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.setProjectionMap(sPhotoProjectionMap);
162167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1622c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Photos.PERSON_ID + "=");
1623c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1624c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                limit = "1";
1625c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
1626c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1627044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS:
1628044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.setTables(LegacyTables.PHOTOS + " photos");
1629044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.setProjectionMap(sPhotoProjectionMap);
1630044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                applyRawContactsAccount(qb);
1631044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1632044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1633044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS_ID:
1634044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.setTables(LegacyTables.PHOTOS + " photos");
1635044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.setProjectionMap(sPhotoProjectionMap);
1636044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                applyRawContactsAccount(qb);
1637044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Photos._ID + "=");
1638044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1639044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1640044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1641c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            case SEARCH_SUGGESTIONS:
1642c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
1643c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                // No legacy compatibility for search suggestions
1644a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                return mGlobalSearchSupport.handleSearchSuggestionsQuery(db, uri, limit);
1645c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
1646b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov            case SEARCH_SHORTCUT: {
1647b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov                long contactId = ContentUris.parseId(uri);
1648b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov                return mGlobalSearchSupport.handleSearchShortcutRefresh(db, contactId, projection);
1649b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov            }
1650b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov
16511b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE:
16521b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_URI,
16531b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
16541b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
16551b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE_WITH_PHONES:
16561b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_WITH_PHONES_URI,
16571b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
16581b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
16591b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE_FAVORITES:
16601b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_FAVORITES_URI,
16611b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
16621b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
16631b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE_GROUP_NAME:
16641b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(Uri.withAppendedPath(LIVE_FOLDERS_CONTACTS_URI,
16651b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        Uri.encode(uri.getLastPathSegment())),
16661b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
16671b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
166833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case DELETED_PEOPLE:
166933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case DELETED_GROUPS:
167033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                throw new UnsupportedOperationException();
167133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov
1672f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            default:
1673f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                throw new IllegalArgumentException("Unknown URL " + uri);
1674f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1675f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1676f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // Perform the query and set the notification uri
1677f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final Cursor c = qb.query(db, projection, selection, selectionArgs,
1678f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                groupBy, null, sortOrder, limit);
1679f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (c != null) {
16803fe48cf2c81f6e89b78e919661e2b0b828a2144eDmitri Plotnikov            c.setNotificationUri(mContext.getContentResolver(),
16813fe48cf2c81f6e89b78e919661e2b0b828a2144eDmitri Plotnikov                    android.provider.Contacts.CONTENT_URI);
1682f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1683f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return c;
1684f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1685f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
168667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void applyRawContactsAccount(SQLiteQueryBuilder qb) {
1687caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        StringBuilder sb = new StringBuilder();
168867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        appendRawContactsAccount(sb);
168967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        qb.appendWhere(sb.toString());
169067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
169167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
169267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void appendRawContactsAccount(StringBuilder sb) {
1693caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(RawContacts.ACCOUNT_NAME + "=");
1694df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.name);
1695caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(" AND " + RawContacts.ACCOUNT_TYPE + "=");
1696df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.type);
1697caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
1698caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
169967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void applyGroupAccount(SQLiteQueryBuilder qb) {
1700caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        StringBuilder sb = new StringBuilder();
170167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        appendGroupAccount(sb);
170267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        qb.appendWhere(sb.toString());
170367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
170467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
170567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void appendGroupAccount(StringBuilder sb) {
1706caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(Groups.ACCOUNT_NAME + "=");
1707df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.name);
1708caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(" AND " + Groups.ACCOUNT_TYPE + "=");
1709df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.type);
1710caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
1711caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
1712f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    /**
1713f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     * Called when a change has been made.
1714f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     *
1715f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     * @param uri the uri that the change was made to
1716f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     */
1717f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private void onChange(Uri uri) {
1718f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContext.getContentResolver().notifyChange(android.provider.Contacts.CONTENT_URI, null);
1719f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
172061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
172161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    public String getType(Uri uri) {
172261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        int match = sUriMatcher.match(uri);
172361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        switch (match) {
172461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case EXTENSIONS:
172561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_EXTENSIONS:
172661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return Extensions.CONTENT_TYPE;
172761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case EXTENSIONS_ID:
172861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_EXTENSIONS_ID:
172961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return Extensions.CONTENT_ITEM_TYPE;
173061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE:
173161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/person";
173261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_ID:
173361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/person";
173461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_PHONES:
173561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/phone";
173661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_PHONES_ID:
173761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/phone";
173861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_CONTACTMETHODS:
173961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/contact-methods";
174061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_CONTACTMETHODS_ID:
174161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return getContactMethodType(uri);
174261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHONES:
174361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/phone";
174461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHONES_ID:
174561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/phone";
174661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHONES_FILTER:
174761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/phone";
174861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHOTOS_ID:
174961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/photo";
175061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHOTOS:
175161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/photo";
175261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_PHOTO:
175361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/photo";
175461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case CONTACTMETHODS:
175561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/contact-methods";
175661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case CONTACTMETHODS_ID:
175761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return getContactMethodType(uri);
175861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case ORGANIZATIONS:
175961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/organizations";
176061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case ORGANIZATIONS_ID:
176161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/organization";
176261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case SEARCH_SUGGESTIONS:
176361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return SearchManager.SUGGEST_MIME_TYPE;
176461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case SEARCH_SHORTCUT:
176561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return SearchManager.SHORTCUT_MIME_TYPE;
176661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            default:
176761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                throw new IllegalArgumentException("Unknown URI");
176861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        }
176961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    }
177061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
177161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    private String getContactMethodType(Uri url) {
177261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        String mime = null;
177361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
177461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        Cursor c = query(url, new String[] {ContactMethods.KIND}, null, null, null, null);
177561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        if (c != null) {
177661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            try {
177761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                if (c.moveToFirst()) {
177861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                    int kind = c.getInt(0);
177961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                    switch (kind) {
17801b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                    case android.provider.Contacts.KIND_EMAIL:
178161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        mime = "vnd.android.cursor.item/email";
178261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        break;
178361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
17841b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                    case android.provider.Contacts.KIND_IM:
178561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        mime = "vnd.android.cursor.item/jabber-im";
178661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        break;
178761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
17881b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                    case android.provider.Contacts.KIND_POSTAL:
178961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        mime = "vnd.android.cursor.item/postal-address";
179061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        break;
179161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                    }
179261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                }
179361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            } finally {
179461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                c.close();
179561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            }
179661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        }
179761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        return mime;
179861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    }
1799f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov}
1800