LegacyApiSupport.java revision 71e051c79a57af70ec7b095074c3e7faf9507b52
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;
24a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.StatusUpdatesColumns;
25f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.Tables;
26f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
27caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikovimport android.accounts.Account;
28c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.app.SearchManager;
29f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentUris;
30f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentValues;
31f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.Context;
32f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.UriMatcher;
33f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.Cursor;
34e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.database.DatabaseUtils;
35f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteDatabase;
36044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikovimport android.database.sqlite.SQLiteDoneException;
37f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteQueryBuilder;
38f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteStatement;
39f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.net.Uri;
4067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikovimport android.provider.BaseColumns;
41f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract;
42e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.Contacts.ContactMethods;
4361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikovimport android.provider.Contacts.Extensions;
44f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.Contacts.People;
4571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikovimport android.provider.ContactsContract.Contacts;
46e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.Data;
470f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.Groups;
4870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikovimport android.provider.ContactsContract.Presence;
49c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract.RawContacts;
50e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email;
510f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership;
52e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im;
53f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Note;
543cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization;
55e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone;
56c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo;
57f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName;
5867dde51ab932dc84d95a203b113989b13437f13dJeff Sharkeyimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
59b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamiltonimport android.util.Log;
60f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
61f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport java.util.HashMap;
62622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkeyimport java.util.Locale;
63f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
64b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamiltonpublic class LegacyApiSupport {
65f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
66caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private static final String TAG = "ContactsProviderV1";
67caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
686f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov    private static final String NON_EXISTENT_ACCOUNT_TYPE = "android.INVALID_ACCOUNT_TYPE";
6928153f2e3dda944e983f6dd0ab80aca63631ddfaJeff Hamilton    private static final String NON_EXISTENT_ACCOUNT_NAME = "invalid";
706f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov
71f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
72f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
73f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE = 1;
74f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE_ID = 2;
75f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE_UPDATE_CONTACT_TIME = 3;
763cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final int ORGANIZATIONS = 4;
773cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final int ORGANIZATIONS_ID = 5;
78e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_CONTACTMETHODS = 6;
79e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_CONTACTMETHODS_ID = 7;
80e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int CONTACTMETHODS = 8;
81e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int CONTACTMETHODS_ID = 9;
82e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_PHONES = 10;
83e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_PHONES_ID = 11;
84e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PHONES = 12;
85e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PHONES_ID = 13;
860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int EXTENSIONS = 14;
870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int EXTENSIONS_ID = 15;
880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_EXTENSIONS = 16;
890f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_EXTENSIONS_ID = 17;
900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPS = 18;
910f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPS_ID = 19;
920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPMEMBERSHIP = 20;
930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPMEMBERSHIP_ID = 21;
940f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_GROUPMEMBERSHIP = 22;
950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_GROUPMEMBERSHIP_ID = 23;
96c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PEOPLE_PHOTO = 24;
97c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PHOTOS = 25;
98c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PHOTOS_ID = 26;
99445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov    private static final int PEOPLE_FILTER = 29;
10033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov    private static final int DELETED_PEOPLE = 30;
10133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov    private static final int DELETED_GROUPS = 31;
102c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    private static final int SEARCH_SUGGESTIONS = 32;
103b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov    private static final int SEARCH_SHORTCUT = 33;
104b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov    private static final int PHONES_FILTER = 34;
1051b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final int LIVE_FOLDERS_PEOPLE = 35;
1061b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final int LIVE_FOLDERS_PEOPLE_GROUP_NAME = 36;
1071b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final int LIVE_FOLDERS_PEOPLE_WITH_PHONES = 37;
1081b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final int LIVE_FOLDERS_PEOPLE_FAVORITES = 38;
109bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov    private static final int CONTACTMETHODS_EMAIL = 39;
11071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    private static final int GROUP_NAME_MEMBERS = 40;
111c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
112e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String PEOPLE_JOINS =
1135ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            " LEFT OUTER JOIN data name ON (raw_contacts._id = name.raw_contact_id"
114e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = name.mimetype_id)"
115e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + StructuredName.CONTENT_ITEM_TYPE + "')"
1165ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data organization ON (raw_contacts._id = organization.raw_contact_id"
117e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = organization.mimetype_id)"
118e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Organization.CONTENT_ITEM_TYPE + "' AND organization.is_primary)"
1195ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data email ON (raw_contacts._id = email.raw_contact_id"
120e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = email.mimetype_id)"
121e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Email.CONTENT_ITEM_TYPE + "' AND email.is_primary)"
1225ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data note ON (raw_contacts._id = note.raw_contact_id"
123e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = note.mimetype_id)"
124e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Note.CONTENT_ITEM_TYPE + "')"
1255ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data phone ON (raw_contacts._id = phone.raw_contact_id"
126e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = phone.mimetype_id)"
127e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Phone.CONTENT_ITEM_TYPE + "' AND phone.is_primary)";
128e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
129d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    public static final String DATA_JOINS =
130d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            " JOIN mimetypes ON (mimetypes._id = data.mimetype_id)"
1315ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " JOIN raw_contacts ON (raw_contacts._id = data.raw_contact_id)"
132d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            + PEOPLE_JOINS;
133d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
13470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    public static final String PRESENCE_JOINS =
13570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            " LEFT OUTER JOIN presence ON ("
13670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov            + " presence.presence_id = (SELECT max(presence_id) FROM presence"
1375dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov            + " WHERE people._id = presence_raw_contact_id))";
13870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
139e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String PHONETIC_NAME_SQL = "trim(trim("
140e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_GIVEN_NAME + ",' ')||' '||"
141e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_MIDDLE_NAME + ",' '))||' '||"
142e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_FAMILY_NAME + ",' ')) ";
143e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
144e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String CONTACT_METHOD_KIND_SQL =
145d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            "CAST ((CASE WHEN mimetype='" + Email.CONTENT_ITEM_TYPE + "'"
146e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                + " THEN " + android.provider.Contacts.KIND_EMAIL
147e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                + " ELSE"
148e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + " (CASE WHEN mimetype='" + Im.CONTENT_ITEM_TYPE +"'"
149e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " THEN " + android.provider.Contacts.KIND_IM
150e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " ELSE"
15167dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey                        + " (CASE WHEN mimetype='" + StructuredPostal.CONTENT_ITEM_TYPE + "'"
152e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " THEN "  + android.provider.Contacts.KIND_POSTAL
153e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " ELSE"
154e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                                + " NULL"
155e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " END)"
156e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " END)"
157d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                + " END) AS INTEGER)";
158f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
15997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov    private static final String IM_PROTOCOL_SQL =
16097f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov            "(CASE WHEN " + Presence.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM
16197f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " THEN 'custom:'||" + Presence.CUSTOM_PROTOCOL
16297f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " ELSE 'pre:'||" + Presence.PROTOCOL
16397f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " END)";
16497f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov
16597f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov    private static String CONTACT_METHOD_DATA_SQL =
16697f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov            "(CASE WHEN " + Data.MIMETYPE + "='" + Im.CONTENT_ITEM_TYPE + "'"
16797f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " THEN (CASE WHEN " + Tables.DATA + "." + Im.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM
16897f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                    + " THEN 'custom:'||" + Tables.DATA + "." + Im.CUSTOM_PROTOCOL
16997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                    + " ELSE 'pre:'||" + Tables.DATA + "." + Im.PROTOCOL
17097f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                    + " END)"
171f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                + " ELSE " + Tables.DATA + "." + Email.DATA
17297f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " END)";
17397f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov
1741b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final Uri LIVE_FOLDERS_CONTACTS_URI = Uri.withAppendedPath(
1751b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            ContactsContract.AUTHORITY_URI, "live_folders/contacts");
1761b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
1771b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final Uri LIVE_FOLDERS_CONTACTS_WITH_PHONES_URI = Uri.withAppendedPath(
1781b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            ContactsContract.AUTHORITY_URI, "live_folders/contacts_with_phones");
1791b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
1801b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final Uri LIVE_FOLDERS_CONTACTS_FAVORITES_URI = Uri.withAppendedPath(
1811b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            ContactsContract.AUTHORITY_URI, "live_folders/favorites");
18297f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov
183f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public interface LegacyTables {
184d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String PEOPLE = "view_v1_people";
1855dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov        public static final String PEOPLE_JOIN_PRESENCE = "view_v1_people people " + PRESENCE_JOINS;
186d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String GROUPS = "view_v1_groups";
187d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String ORGANIZATIONS = "view_v1_organizations";
188d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String CONTACT_METHODS = "view_v1_contact_methods";
189d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String PHONES = "view_v1_phones";
190d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String EXTENSIONS = "view_v1_extensions";
191d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String GROUP_MEMBERSHIP = "view_v1_group_membership";
192c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String PHOTOS = "view_v1_photos";
193f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
194f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
195e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] ORGANIZATION_MIME_TYPES = new String[] {
196e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Organization.CONTENT_ITEM_TYPE
197e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
198e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
199e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] CONTACT_METHOD_MIME_TYPES = new String[] {
200e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Email.CONTENT_ITEM_TYPE,
201e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Im.CONTENT_ITEM_TYPE,
20267dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey        StructuredPostal.CONTENT_ITEM_TYPE,
203e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
204e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
205e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] PHONE_MIME_TYPES = new String[] {
206e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Phone.CONTENT_ITEM_TYPE
207e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
208e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
209044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private static final String[] PHOTO_MIME_TYPES = new String[] {
210044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Photo.CONTENT_ITEM_TYPE
211044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    };
212044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
213044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private static final String[] EXTENSION_MIME_TYPES = new String[] {
214044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE
215044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    };
216044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
21767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private interface IdQuery {
21867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        String[] COLUMNS = { BaseColumns._ID };
219c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
220c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int _ID = 0;
221c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
222c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
223c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    /**
224c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     * A custom data row that is used to store legacy photo data fields no
225c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     * longer directly supported by the API.
226c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     */
227c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private interface LegacyPhotoData {
228c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/photo_v1_extras";
229c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
230c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String PHOTO_DATA_ID = Data.DATA1;
231c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String LOCAL_VERSION = Data.DATA2;
232c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String DOWNLOAD_REQUIRED = Data.DATA3;
233c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String EXISTS_ON_SERVER = Data.DATA4;
234c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String SYNC_ERROR = Data.DATA5;
235c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
236c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
237c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    public static final String LEGACY_PHOTO_JOIN =
2385ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            " LEFT OUTER JOIN data legacy_photo ON (raw_contacts._id = legacy_photo.raw_contact_id"
239c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = legacy_photo.mimetype_id)"
240c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'"
241c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + " AND " + DataColumns.CONCRETE_ID + " = legacy_photo." + LegacyPhotoData.PHOTO_DATA_ID
242c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + ")";
243c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
244f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final HashMap<String, String> sPeopleProjectionMap;
2453cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final HashMap<String, String> sOrganizationProjectionMap;
246e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final HashMap<String, String> sContactMethodProjectionMap;
247e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final HashMap<String, String> sPhoneProjectionMap;
2480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sExtensionProjectionMap;
2490f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sGroupProjectionMap;
2500f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sGroupMembershipProjectionMap;
251c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final HashMap<String, String> sPhotoProjectionMap;
252fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
253f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    static {
254f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
255f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // Contacts URI matching table
256f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        UriMatcher matcher = sUriMatcher;
257f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
258f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        String authority = android.provider.Contacts.AUTHORITY;
2590f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "extensions", EXTENSIONS);
2600f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "extensions/#", EXTENSIONS_ID);
2610f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groups", GROUPS);
2620f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groups/#", GROUPS_ID);
26371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        matcher.addURI(authority, "groups/name/*/members", GROUP_NAME_MEMBERS);
264f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/name/*/members/filter/*",
265f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                GROUP_NAME_MEMBERS_FILTER);
266f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/system_id/*/members", GROUP_SYSTEM_ID_MEMBERS);
267f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/system_id/*/members/filter/*",
268f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                GROUP_SYSTEM_ID_MEMBERS_FILTER);
2690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groupmembership", GROUPMEMBERSHIP);
2700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groupmembership/#", GROUPMEMBERSHIP_ID);
271f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groupmembershipraw", GROUPMEMBERSHIP_RAW);
272f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people", PEOPLE);
273f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/strequent", PEOPLE_STREQUENT);
274f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/strequent/filter/*", PEOPLE_STREQUENT_FILTER);
275445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov        matcher.addURI(authority, "people/filter/*", PEOPLE_FILTER);
276f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/with_phones_filter/*",
277f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_WITH_PHONES_FILTER);
278f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/with_email_or_im_filter/*",
279f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_WITH_EMAIL_OR_IM_FILTER);
280f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people/#", PEOPLE_ID);
2810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/extensions", PEOPLE_EXTENSIONS);
2820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/extensions/#", PEOPLE_EXTENSIONS_ID);
283e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/phones", PEOPLE_PHONES);
284e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/phones/#", PEOPLE_PHONES_ID);
285f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/phones_with_presence",
286f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_PHONES_WITH_PRESENCE);
287c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "people/#/photo", PEOPLE_PHOTO);
288f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/photo/data", PEOPLE_PHOTO_DATA);
289e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/contact_methods", PEOPLE_CONTACTMETHODS);
290f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/contact_methods_with_presence",
291f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_CONTACTMETHODS_WITH_PRESENCE);
292e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID);
293f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/organizations", PEOPLE_ORGANIZATIONS);
294f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/organizations/#", PEOPLE_ORGANIZATIONS_ID);
2950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/groupmembership", PEOPLE_GROUPMEMBERSHIP);
2960f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/groupmembership/#", PEOPLE_GROUPMEMBERSHIP_ID);
297f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/raw", PEOPLE_RAW);
298f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/owner", PEOPLE_OWNER);
299f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people/#/update_contact_time",
300f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                PEOPLE_UPDATE_CONTACT_TIME);
30133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov        matcher.addURI(authority, "deleted_people", DELETED_PEOPLE);
30233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov        matcher.addURI(authority, "deleted_groups", DELETED_GROUPS);
303e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "phones", PHONES);
304f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones_with_presence", PHONES_WITH_PRESENCE);
305fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        matcher.addURI(authority, "phones/filter/*", PHONES_FILTER);
306f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones/filter_name/*", PHONES_FILTER_NAME);
307f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones/mobile_filter_name/*",
308f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PHONES_MOBILE_FILTER_NAME);
309e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "phones/#", PHONES_ID);
310c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "photos", PHOTOS);
311c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "photos/#", PHOTOS_ID);
312e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "contact_methods", CONTACTMETHODS);
313bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        matcher.addURI(authority, "contact_methods/email", CONTACTMETHODS_EMAIL);
314f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "contact_methods/email/*", CONTACTMETHODS_EMAIL_FILTER);
315e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "contact_methods/#", CONTACTMETHODS_ID);
316f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "contact_methods/with_presence",
317f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                CONTACTMETHODS_WITH_PRESENCE);
3183cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        matcher.addURI(authority, "organizations", ORGANIZATIONS);
3193cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        matcher.addURI(authority, "organizations/#", ORGANIZATIONS_ID);
320f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "voice_dialer_timestamp", VOICE_DIALER_TIMESTAMP);
321c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY,
322c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                SEARCH_SUGGESTIONS);
323c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY + "/*",
324c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                SEARCH_SUGGESTIONS);
325b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/#",
326b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov                SEARCH_SHORTCUT);
327f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "settings", SETTINGS);
328f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//
3291b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/people", LIVE_FOLDERS_PEOPLE);
3301b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/people/*",
3311b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                LIVE_FOLDERS_PEOPLE_GROUP_NAME);
3321b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/people_with_phones",
3331b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                LIVE_FOLDERS_PEOPLE_WITH_PHONES);
3341b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/favorites",
3351b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                LIVE_FOLDERS_PEOPLE_FAVORITES);
336f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
337f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
338e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        HashMap<String, String> peopleProjectionMap = new HashMap<String, String>();
339d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.NAME, People.NAME);
340d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.DISPLAY_NAME, People.DISPLAY_NAME);
341d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.PHONETIC_NAME, People.PHONETIC_NAME);
342d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.NOTES, People.NOTES);
343d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.TIMES_CONTACTED, People.TIMES_CONTACTED);
344d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.LAST_TIME_CONTACTED, People.LAST_TIME_CONTACTED);
345d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.CUSTOM_RINGTONE, People.CUSTOM_RINGTONE);
346d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.SEND_TO_VOICEMAIL, People.SEND_TO_VOICEMAIL);
347d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.STARRED, People.STARRED);
348ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        peopleProjectionMap.put(People.PRIMARY_ORGANIZATION_ID, People.PRIMARY_ORGANIZATION_ID);
349ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        peopleProjectionMap.put(People.PRIMARY_EMAIL_ID, People.PRIMARY_EMAIL_ID);
350ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        peopleProjectionMap.put(People.PRIMARY_PHONE_ID, People.PRIMARY_PHONE_ID);
351e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
352e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPeopleProjectionMap = new HashMap<String, String>(peopleProjectionMap);
3539155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPeopleProjectionMap.put(People._ID, People._ID);
354d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.NUMBER, People.NUMBER);
355d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.TYPE, People.TYPE);
356d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.LABEL, People.LABEL);
357d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.NUMBER_KEY, People.NUMBER_KEY);
3580126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov        sPeopleProjectionMap.put(People.IM_PROTOCOL, IM_PROTOCOL_SQL + " AS " + People.IM_PROTOCOL);
35970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.IM_HANDLE, People.IM_HANDLE);
36070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.IM_ACCOUNT, People.IM_ACCOUNT);
36170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.PRESENCE_STATUS, People.PRESENCE_STATUS);
362a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov        sPeopleProjectionMap.put(People.PRESENCE_CUSTOM_STATUS,
363a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                "(SELECT " + StatusUpdatesColumns.STATUS +
364a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                " FROM " + Tables.STATUS_UPDATES +
365a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                " JOIN " + Tables.DATA +
366a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                "   ON(" + StatusUpdatesColumns.DATA_ID + "=" + DataColumns.CONCRETE_ID + ")" +
367a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                " WHERE " + DataColumns.CONCRETE_RAW_CONTACT_ID + "=people." + People._ID +
368a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                " ORDER BY " + StatusUpdatesColumns.TIMESTAMP + " DESC " +
369a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                " LIMIT 1" +
370a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                ") AS " + People.PRESENCE_CUSTOM_STATUS);
3713cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
3723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap = new HashMap<String, String>();
3739155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations._ID,
3749155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Organizations._ID);
3753cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.PERSON_ID,
376d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.PERSON_ID);
3773cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.ISPRIMARY,
378d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.ISPRIMARY);
3793cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.COMPANY,
380d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.COMPANY);
3813cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TYPE,
382d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.TYPE);
3833cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.LABEL,
384d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.LABEL);
3853cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TITLE,
386d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.TITLE);
387e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
388e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sContactMethodProjectionMap = new HashMap<String, String>(peopleProjectionMap);
3899155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods._ID, ContactMethods._ID);
390d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.PERSON_ID, ContactMethods.PERSON_ID);
391d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.KIND, ContactMethods.KIND);
392d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.ISPRIMARY, ContactMethods.ISPRIMARY);
393d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.TYPE, ContactMethods.TYPE);
394d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.DATA, ContactMethods.DATA);
395d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.LABEL, ContactMethods.LABEL);
396d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.AUX_DATA, ContactMethods.AUX_DATA);
397e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
398e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap = new HashMap<String, String>(peopleProjectionMap);
3999155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones._ID,
4009155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Phones._ID);
401e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.PERSON_ID,
402d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.PERSON_ID);
403e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.ISPRIMARY,
404d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.ISPRIMARY);
405e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER,
406d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.NUMBER);
407e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.TYPE,
408d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.TYPE);
409e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.LABEL,
410d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.LABEL);
411e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER_KEY,
412d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.NUMBER_KEY);
4130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
4140f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap = new HashMap<String, String>();
4159155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions._ID,
4169155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Extensions._ID);
4170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.PERSON_ID,
418d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.PERSON_ID);
4190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.NAME,
420d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.NAME);
4210f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.VALUE,
422d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.VALUE);
4230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
4240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap = new HashMap<String, String>();
4250f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups._ID,
426d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups._ID);
4270f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.NAME,
428d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.NAME);
4290f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.NOTES,
430d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.NOTES);
4310f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.SYSTEM_ID,
432d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.SYSTEM_ID);
4330f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
4340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap = new HashMap<String, String>();
4359155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership._ID,
4369155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.GroupMembership._ID);
4370f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.PERSON_ID,
438d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.GroupMembership.PERSON_ID);
4390f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.GROUP_ID,
440d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.GroupMembership.GROUP_ID);
441c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
442c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap = new HashMap<String, String>();
4439155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos._ID,
4449155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Photos._ID);
445c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.PERSON_ID,
446c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.PERSON_ID);
447c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.DATA,
448c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.DATA);
449c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.LOCAL_VERSION,
450c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.LOCAL_VERSION);
451c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.DOWNLOAD_REQUIRED,
452c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.DOWNLOAD_REQUIRED);
453c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.EXISTS_ON_SERVER,
454c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.EXISTS_ON_SERVER);
455c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.SYNC_ERROR,
456c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.SYNC_ERROR);
457f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
458f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
459f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final Context mContext;
460f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final OpenHelper mOpenHelper;
461f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final ContactsProvider2 mContactsProvider;
462f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final NameSplitter mPhoneticNameSplitter;
463a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov    private final GlobalSearchSupport mGlobalSearchSupport;
464f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
465d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov    /** Precompiled sql statement for incrementing times contacted for a contact */
4663cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private final SQLiteStatement mLastTimeContactedUpdate;
467044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private final SQLiteStatement mDataMimetypeQuery;
468044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private final SQLiteStatement mDataRawContactIdQuery;
4693cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
4703cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private final ContentValues mValues = new ContentValues();
47167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private final ContentValues mValues2 = new ContentValues();
47267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private final ContentValues mValues3 = new ContentValues();
473caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private Account mAccount;
474a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
475044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private long mMimetypeEmail;
476044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private long mMimetypeIm;
477044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private long mMimetypePostal;
478044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
479f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public LegacyApiSupport(Context context, OpenHelper openHelper,
480a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov            ContactsProvider2 contactsProvider, GlobalSearchSupport globalSearchSupport) {
481f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContext = context;
482f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContactsProvider = contactsProvider;
483f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mOpenHelper = openHelper;
484a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        mGlobalSearchSupport = globalSearchSupport;
485f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
486622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey        mPhoneticNameSplitter = new NameSplitter("", "", "", context
487622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey                .getString(com.android.internal.R.string.common_name_conjunctions), Locale
488622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey                .getDefault());
489f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
490f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
4915ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mLastTimeContactedUpdate = db.compileStatement("UPDATE " + Tables.RAW_CONTACTS + " SET "
4926cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts.TIMES_CONTACTED + "="
4936cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts.TIMES_CONTACTED + "+1,"
4946cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts.LAST_TIME_CONTACTED + "=? WHERE "
4956cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts._ID + "=?");
496044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
497044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mDataMimetypeQuery = db.compileStatement(
498044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                "SELECT " + DataColumns.MIMETYPE_ID +
499044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                " FROM " + Tables.DATA +
500044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                " WHERE " + Data._ID + "=?");
501044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
502044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mDataRawContactIdQuery = db.compileStatement(
503044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                "SELECT " + Data.RAW_CONTACT_ID +
504044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                " FROM " + Tables.DATA +
505044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                " WHERE " + Data._ID + "=?");
506044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
507044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mMimetypeEmail = mOpenHelper.getMimeTypeId(Email.CONTENT_ITEM_TYPE);
508044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mMimetypeIm = mOpenHelper.getMimeTypeId(Im.CONTENT_ITEM_TYPE);
509044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mMimetypePostal = mOpenHelper.getMimeTypeId(StructuredPostal.CONTENT_ITEM_TYPE);
510f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
511f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
512caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private void ensureDefaultAccount() {
513caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        if (mAccount == null) {
514caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov            mAccount = mContactsProvider.getDefaultAccount();
5156f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov            if (mAccount == null) {
5166f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov
5176f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov                // This fall-through account will not match any data in the database, which
5186f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov                // is the expected behavior
51928153f2e3dda944e983f6dd0ab80aca63631ddfaJeff Hamilton                mAccount = new Account(NON_EXISTENT_ACCOUNT_NAME, NON_EXISTENT_ACCOUNT_TYPE);
5206f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov            }
521caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        }
522caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
523d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
524b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamilton    public static void createDatabase(SQLiteDatabase db) {
525b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamilton        Log.i(TAG, "Bootstrapping database legacy support");
526d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
527ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        String peopleColumns = "name." + StructuredName.DISPLAY_NAME
528d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NAME + ", " +
5295ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME
530d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.DISPLAY_NAME + ", " +
531d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PHONETIC_NAME_SQL
532d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PHONETIC_NAME + " , " +
533d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "note." + Note.NOTE
534d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NOTES + ", " +
535caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
536caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
5375ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED
538d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.TIMES_CONTACTED + ", " +
5395ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED
540d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.LAST_TIME_CONTACTED + ", " +
5415ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE
542d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.CUSTOM_RINGTONE + ", " +
5435ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL
544d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.SEND_TO_VOICEMAIL + ", " +
5455ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.STARRED
546d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.STARRED + ", " +
547d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "organization." + Data._ID
548d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_ORGANIZATION_ID + ", " +
549d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "email." + Data._ID
550d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_EMAIL_ID + ", " +
551d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Data._ID
552d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_PHONE_ID + ", " +
553d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.NUMBER
554d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NUMBER + ", " +
555d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.TYPE
556d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.TYPE + ", " +
557d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.LABEL
558d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.LABEL + ", " +
559d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + PhoneColumns.NORMALIZED_NUMBER
560ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                        + " AS " + People.NUMBER_KEY;
561ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov
562ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PEOPLE + ";");
563ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PEOPLE + " AS SELECT " +
564ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                RawContactsColumns.CONCRETE_ID
565ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                        + " AS " + android.provider.Contacts.People._ID + ", " +
566ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                peopleColumns +
5675ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.RAW_CONTACTS + PEOPLE_JOINS +
568ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                " WHERE " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
569ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                " AND " + RawContacts.IS_RESTRICTED + "=0" + ";");
570d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
571d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.ORGANIZATIONS + ";");
572d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.ORGANIZATIONS + " AS SELECT " +
573d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
574d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations._ID + ", " +
5755ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Data.RAW_CONTACT_ID
576d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.PERSON_ID + ", " +
577d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Data.IS_PRIMARY
578d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.ISPRIMARY + ", " +
579caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
580caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
581d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.COMPANY
582d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.COMPANY + ", " +
583d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.TYPE
584d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.TYPE + ", " +
585d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.LABEL
586d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.LABEL + ", " +
587d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.TITLE
588caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.TITLE +
5895ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS +
590d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
59133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Organization.CONTENT_ITEM_TYPE + "'"
592caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
593caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
594d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
595d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
596d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.CONTACT_METHODS + ";");
597d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.CONTACT_METHODS + " AS SELECT " +
598d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
599d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods._ID + ", " +
600d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
601d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.PERSON_ID + ", " +
602d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                CONTACT_METHOD_KIND_SQL
603d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.KIND + ", " +
604d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_IS_PRIMARY
605d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.ISPRIMARY + ", " +
606f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                Tables.DATA + "." + Email.TYPE
607d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.TYPE + ", " +
60897f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                CONTACT_METHOD_DATA_SQL
609d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.DATA + ", " +
610f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                Tables.DATA + "." + Email.LABEL
611d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.LABEL + ", " +
612d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_DATA14
613d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.AUX_DATA + ", " +
614ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                peopleColumns +
615d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS +
61633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                " WHERE " + ContactMethods.KIND + " IS NOT NULL"
617caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                    + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
618caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                    + " AND " + RawContacts.IS_RESTRICTED + "=0" +
619d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
620d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
621d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
622d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHONES + ";");
623d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PHONES + " AS SELECT " +
624d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
625d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones._ID + ", " +
626d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
627d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.PERSON_ID + ", " +
628d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_IS_PRIMARY
629d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.ISPRIMARY + ", " +
630d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.NUMBER
631d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NUMBER + ", " +
632d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.TYPE
633d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.TYPE + ", " +
634d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.LABEL
635d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.LABEL + ", " +
636d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PhoneColumns.CONCRETE_NORMALIZED_NUMBER
637d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NUMBER_KEY + ", " +
638ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                peopleColumns +
639d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS +
640d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
64133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Phone.CONTENT_ITEM_TYPE + "'"
642caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
643caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
644d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
645d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
646d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.EXTENSIONS + ";");
647d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.EXTENSIONS + " AS SELECT " +
648d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
649d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions._ID + ", " +
650d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
651d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.PERSON_ID + ", " +
652caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
653caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
654d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                ExtensionsColumns.NAME
655d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.NAME + ", " +
656d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                ExtensionsColumns.VALUE
657caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.VALUE +
6585ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS +
659d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
66033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE + "'"
661caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
662caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
663d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
664d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
665d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUPS + ";");
666d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.GROUPS + " AS SELECT " +
667d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                GroupsColumns.CONCRETE_ID + " AS " + android.provider.Contacts.Groups._ID + ", " +
668caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Groups.ACCOUNT_NAME + ", " +
669caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Groups.ACCOUNT_TYPE + ", " +
670d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.TITLE + " AS " + android.provider.Contacts.Groups.NAME + ", " +
671d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.NOTES + " AS " + android.provider.Contacts.Groups.NOTES + " , " +
672d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.SYSTEM_ID + " AS " + android.provider.Contacts.Groups.SYSTEM_ID +
673d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.GROUPS +
674d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
675d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
676d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUP_MEMBERSHIP + ";");
677d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.GROUP_MEMBERSHIP + " AS SELECT " +
678d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
679d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership._ID + ", " +
680d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
681d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.PERSON_ID + ", " +
682caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_NAME
683caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " +  RawContacts.ACCOUNT_NAME + ", " +
684caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_TYPE
685caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " +  RawContacts.ACCOUNT_TYPE + ", " +
686d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                GroupMembership.GROUP_ROW_ID
687d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.GROUP_ID + ", " +
688d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.TITLE
689d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.NAME + ", " +
690d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.NOTES
691d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.NOTES + " , " +
692d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.SYSTEM_ID
693caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.SYSTEM_ID +
6945ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_GROUPS +
695d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
69633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + GroupMembership.CONTENT_ITEM_TYPE + "'"
6975ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
698d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
699c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
700c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHOTOS + ";");
701c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PHOTOS + " AS SELECT " +
702c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                DataColumns.CONCRETE_ID
703c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos._ID + ", " +
704d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
705c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.PERSON_ID + ", " +
706caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
707caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
708c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                Tables.DATA + "." + Photo.PHOTO
709c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.DATA + ", " +
710c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.EXISTS_ON_SERVER
711c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.EXISTS_ON_SERVER + ", " +
712c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.DOWNLOAD_REQUIRED
713c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.DOWNLOAD_REQUIRED + ", " +
714c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.LOCAL_VERSION
715c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.LOCAL_VERSION + ", " +
716c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.SYNC_ERROR
717caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.SYNC_ERROR +
718c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS + LEGACY_PHOTO_JOIN +
719c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
72033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Photo.CONTENT_ITEM_TYPE + "'"
721caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
722caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
723c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        ";");
724d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    }
725d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
726f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public Uri insert(Uri uri, ContentValues values) {
72767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        ensureDefaultAccount();
728f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final int match = sUriMatcher.match(uri);
729f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        long id = 0;
730f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch (match) {
731f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE:
7323cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                id = insertPeople(values);
7333cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
7343cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
7353cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS:
7363cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                id = insertOrganization(values);
737f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
738f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
7390f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS: {
7405ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
7415ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertContactMethod(rawContactId, values);
742e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
7430f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
744e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case CONTACTMETHODS: {
7465ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values, ContactMethods.PERSON_ID);
7475ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertContactMethod(rawContactId, values);
748e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
7490f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
750e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7510f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PHONES: {
7525ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.Phones.PERSON_ID);
7545ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertPhone(rawContactId, values);
7550f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7560f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
75894743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton            case PEOPLE_PHONES: {
75994743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
76094743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton                id = insertPhone(rawContactId, values);
76194743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton                break;
76294743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton            }
76394743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton
7640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS: {
7655ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.Extensions.PERSON_ID);
7675ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertExtension(rawContactId, values);
7680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
7710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS:
7720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                id = insertGroup(values);
773e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
774e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7750f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP: {
7765ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.GroupMembership.PERSON_ID);
7780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                long groupId = getRequiredValue(values,
7790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.GroupMembership.GROUP_ID);
7805ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertGroupMembership(rawContactId, groupId);
7810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
784f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            default:
785f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
786f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
787f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
788f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (id < 0) {
789f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            return null;
790f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
791f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
792f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final Uri result = ContentUris.withAppendedId(uri, id);
793f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        onChange(result);
794f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return result;
795f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
796f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
7970f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private long getRequiredValue(ContentValues values, String column) {
7980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        if (!values.containsKey(column)) {
7990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            throw new RuntimeException("Required value: " + column);
800e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        }
801e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return values.getAsLong(column);
803e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
804e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8053cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private long insertPeople(ContentValues values) {
806044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parsePeopleValues(values);
807caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
80867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri contactUri = mContactsProvider.insertInTransaction(RawContacts.CONTENT_URI, mValues);
80967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long rawContactId = ContentUris.parseId(contactUri);
81067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
81167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues2.size() != 0) {
81267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mValues2.put(Data.RAW_CONTACT_ID, rawContactId);
81367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues2);
81467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
81567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues3.size() != 0) {
81667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mValues3.put(Data.RAW_CONTACT_ID, rawContactId);
81767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues3);
81867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
819f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
82067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return rawContactId;
82167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
82267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
8233cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private long insertOrganization(ContentValues values) {
824044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseOrganizationValues(values);
8255ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.RAW_CONTACT_ID,
8263cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.PERSON_ID);
8273cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
82867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
8293cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8303cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        return ContentUris.parseId(uri);
8313cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    }
832f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
8335ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertPhone(long rawContactId, ContentValues values) {
834044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parsePhoneValues(values);
8355ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
836e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
83767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
838e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
839e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        return ContentUris.parseId(uri);
840e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
841e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8425ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertContactMethod(long rawContactId, ContentValues values) {
843e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Integer kind = values.getAsInteger(ContactMethods.KIND);
844e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        if (kind == null) {
845e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            throw new RuntimeException("Required value: " + ContactMethods.KIND);
846e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        }
847e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
848044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseContactMethodValues(kind, values);
849e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
850044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
85167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
852e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        return ContentUris.parseId(uri);
853e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
854e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8555ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertExtension(long rawContactId, ContentValues values) {
8560f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.clear();
8570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
8585ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
8590f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(Data.MIMETYPE, android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE);
8600f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
861044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseExtensionValues(values);
8620f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
86367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
8640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
8650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
8660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
8670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private long insertGroup(ContentValues values) {
868044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseGroupValues(values);
8690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
870df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        mValues.put(Groups.ACCOUNT_NAME, mAccount.name);
871df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        mValues.put(Groups.ACCOUNT_TYPE, mAccount.type);
872caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
87367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Groups.CONTENT_URI, mValues);
8740f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
8750f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
8760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
8775ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertGroupMembership(long rawContactId, long groupId) {
8780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.clear();
8790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
8800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE);
8815ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(GroupMembership.RAW_CONTACT_ID, rawContactId);
8820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(GroupMembership.GROUP_ROW_ID, groupId);
8830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
88467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
8850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
8860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
8870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
888f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
88967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        ensureDefaultAccount();
89067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
89167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int match = sUriMatcher.match(uri);
892c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int count = 0;
893f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch(match) {
89467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case PEOPLE_UPDATE_CONTACT_TIME: {
895f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                count = updateContactTime(uri, values);
896f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
89767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
898c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
899c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PEOPLE_PHOTO: {
9005ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
9015ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                return updatePhoto(rawContactId, values);
902c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            }
903c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
90467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case -1: {
90567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
90667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
90767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
90867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            default: {
90967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                count = updateAll(uri, match, values, selection, selectionArgs);
91067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
91167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
91267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
91367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (count > 0) {
91467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContext.getContentResolver().notifyChange(uri, null);
91567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
91667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
91767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return count;
91867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
91967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
92067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private int updateAll(Uri uri, final int match, ContentValues values, String selection,
92167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            String[] selectionArgs) {
92267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Cursor c = query(uri, IdQuery.COLUMNS, selection, selectionArgs, null, null);
92367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (c == null) {
92467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            return 0;
92567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
92667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
92767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int count = 0;
92867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        try {
92967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            while (c.moveToNext()) {
93067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                long id = c.getLong(IdQuery._ID);
93167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                count += update(match, id, values);
93267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
93367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        } finally {
93467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            c.close();
93567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
93667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
93767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return count;
93867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
93967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
94067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    public int update(int match, long id, ContentValues values) {
94167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int count = 0;
94267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        switch(match) {
94367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case PEOPLE:
94467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case PEOPLE_ID: {
94567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                count = updatePeople(id, values);
94667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                break;
94767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
94867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
949044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case ORGANIZATIONS:
950044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case ORGANIZATIONS_ID: {
951044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updateOrganizations(id, values);
952044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
953044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
954044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
955044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHONES:
956044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHONES_ID: {
957044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updatePhones(id, values);
958044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
959044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
960044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
961044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case CONTACTMETHODS:
962044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case CONTACTMETHODS_ID: {
963044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updateContactMethods(id, values);
964044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
965044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
966044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
967044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case EXTENSIONS:
968044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case EXTENSIONS_ID: {
969044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updateExtensions(id, values);
970044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
971044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
972044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
973044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case GROUPS:
974044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case GROUPS_ID: {
975044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updateGroups(id, values);
976c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
977044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
978c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
979044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS:
980c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PHOTOS_ID:
981044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updatePhotoByDataId(id, values);
982c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
98367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
984c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
98567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return count;
98667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
987c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
98867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private int updatePeople(long rawContactId, ContentValues values) {
989044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parsePeopleValues(values);
99067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
991044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        int count = mContactsProvider.update(RawContacts.CONTENT_URI,
992044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues, RawContacts._ID + "=" + rawContactId, null);
99367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
99467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (count == 0) {
99567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            return 0;
996f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
997f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
99867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues2.size() != 0) {
99967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            Uri dataUri = findFirstDataRow(rawContactId, StructuredName.CONTENT_ITEM_TYPE);
100067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            if (dataUri != null) {
100167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.update(dataUri, mValues2, null, null);
100267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            } else {
100367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mValues2.put(Data.RAW_CONTACT_ID, rawContactId);
100467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues2);
100567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
100667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
100767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
100867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues3.size() != 0) {
100967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            Uri dataUri = findFirstDataRow(rawContactId, Note.CONTENT_ITEM_TYPE);
101067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            if (dataUri != null) {
101167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.update(dataUri, mValues3, null, null);
101267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            } else {
101367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mValues3.put(Data.RAW_CONTACT_ID, rawContactId);
101467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues3);
101567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
1016f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
101767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
1018f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return count;
1019f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1020f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1021044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updateOrganizations(long dataId, ContentValues values) {
1022044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseOrganizationValues(values);
1023044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1024044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1025044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Data._ID + "=" + dataId, null);
1026044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1027044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1028044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updatePhones(long dataId, ContentValues values) {
1029044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parsePhoneValues(values);
1030044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1031044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1032044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Data._ID + "=" + dataId, null);
1033044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1034044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1035044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updateContactMethods(long dataId, ContentValues values) {
1036044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        int kind;
1037044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1038044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mDataMimetypeQuery.bindLong(1, dataId);
1039044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long mimetype_id;
1040044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        try {
1041044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mimetype_id = mDataMimetypeQuery.simpleQueryForLong();
1042044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } catch (SQLiteDoneException e) {
1043044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            // Data row not found
1044044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            return 0;
1045044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1046044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1047044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (mimetype_id == mMimetypeEmail) {
1048044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            kind = android.provider.Contacts.KIND_EMAIL;
1049044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } else if (mimetype_id == mMimetypeIm) {
1050044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            kind = android.provider.Contacts.KIND_IM;
1051044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } else if (mimetype_id == mMimetypePostal) {
1052044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            kind = android.provider.Contacts.KIND_POSTAL;
1053044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } else {
1054044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1055044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            // Non-legacy kind: return "Not found"
1056044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            return 0;
1057044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1058044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1059044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseContactMethodValues(kind, values);
1060044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1061044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1062044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Data._ID + "=" + dataId, null);
1063044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1064044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1065044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updateExtensions(long dataId, ContentValues values) {
1066044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseExtensionValues(values);
1067044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1068044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1069044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Data._ID + "=" + dataId, null);
1070044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1071044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1072044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updateGroups(long groupId, ContentValues values) {
1073044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseGroupValues(values);
1074044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1075044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Groups.CONTENT_URI, mValues,
1076044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Groups._ID + "=" + groupId, null);
1077044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1078044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1079f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private int updateContactTime(Uri uri, ContentValues values) {
1080f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1081f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // TODO check sanctions
1082f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1083f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        long lastTimeContacted;
1084f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (values.containsKey(People.LAST_TIME_CONTACTED)) {
1085f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            lastTimeContacted = values.getAsLong(People.LAST_TIME_CONTACTED);
1086f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        } else {
1087f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            lastTimeContacted = System.currentTimeMillis();
1088f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1089f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
10905ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
1091d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov        long contactId = mOpenHelper.getContactId(rawContactId);
1092d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov        if (contactId != 0) {
1093d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov            mContactsProvider.updateContactTime(contactId, lastTimeContacted);
1094f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        } else {
1095f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            mLastTimeContactedUpdate.bindLong(1, lastTimeContacted);
10965ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mLastTimeContactedUpdate.bindLong(2, rawContactId);
1097f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            mLastTimeContactedUpdate.execute();
1098f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1099f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return 1;
1100f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1101f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
11025ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private int updatePhoto(long rawContactId, ContentValues values) {
1103c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1104c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        // TODO check sanctions
1105c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1106c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int count;
1107c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
110867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long dataId = findFirstDataId(rawContactId, Photo.CONTENT_ITEM_TYPE);
1109c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1110c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.clear();
1111c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA);
1112c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.put(Photo.PHOTO, bytes);
1113c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1114c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        if (dataId == -1) {
1115c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE);
11165ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(Data.RAW_CONTACT_ID, rawContactId);
111767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            Uri dataUri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
1118c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            dataId = ContentUris.parseId(dataUri);
1119c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            count = 1;
1120c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        } else {
1121c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            Uri dataUri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
112267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            count = mContactsProvider.updateInTransaction(dataUri, mValues, null, null);
1123c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        }
1124c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1125044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        updateLegacyPhotoData(rawContactId, dataId, values);
1126044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1127044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return count;
1128044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1129044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1130044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updatePhotoByDataId(long dataId, ContentValues values) {
1131044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1132044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mDataRawContactIdQuery.bindLong(1, dataId);
1133044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long rawContactId;
1134044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1135044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        try {
1136044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            rawContactId = mDataRawContactIdQuery.simpleQueryForLong();
1137044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } catch (SQLiteDoneException e) {
1138044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            // Data row not found
1139044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            return 0;
1140044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1141044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1142044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (values.containsKey(android.provider.Contacts.Photos.DATA)) {
1143044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA);
1144044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mValues.clear();
1145044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mValues.put(Photo.PHOTO, bytes);
1146044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1147044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    Data._ID + "=" + dataId, null);
1148044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1149044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1150044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        updateLegacyPhotoData(rawContactId, dataId, values);
1151044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1152044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return 1;
1153044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1154044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1155044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void updateLegacyPhotoData(long rawContactId, long dataId, ContentValues values) {
1156c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.clear();
1157c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.LOCAL_VERSION,
1158c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.LOCAL_VERSION);
1159c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.DOWNLOAD_REQUIRED,
1160c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.DOWNLOAD_REQUIRED);
1161c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.EXISTS_ON_SERVER,
1162c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.EXISTS_ON_SERVER);
1163c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        OpenHelper.copyStringValue(mValues, LegacyPhotoData.SYNC_ERROR,
1164c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.SYNC_ERROR);
1165c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
116667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int updated = mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1167c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                Data.MIMETYPE + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'"
11685ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Data.RAW_CONTACT_ID + "=" + rawContactId
1169c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AND " + LegacyPhotoData.PHOTO_DATA_ID + "=" + dataId, null);
1170c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        if (updated == 0) {
11715ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(Data.RAW_CONTACT_ID, rawContactId);
1172c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(Data.MIMETYPE, LegacyPhotoData.CONTENT_ITEM_TYPE);
1173c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(LegacyPhotoData.PHOTO_DATA_ID, dataId);
117467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
1175c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        }
1176044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1177c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1178044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parsePeopleValues(ContentValues values) {
1179044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1180044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues2.clear();
1181044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues3.clear();
1182044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1183044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, RawContacts.CUSTOM_RINGTONE,
1184044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.CUSTOM_RINGTONE);
1185044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, RawContacts.SEND_TO_VOICEMAIL,
1186044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.SEND_TO_VOICEMAIL);
1187044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, RawContacts.LAST_TIME_CONTACTED,
1188044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.LAST_TIME_CONTACTED);
1189044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, RawContacts.TIMES_CONTACTED,
1190044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.TIMES_CONTACTED);
1191044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, RawContacts.STARRED,
1192044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.STARRED);
1193044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(RawContacts.ACCOUNT_NAME, mAccount.name);
1194044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(RawContacts.ACCOUNT_TYPE, mAccount.type);
1195044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1196044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (values.containsKey(People.NAME) || values.containsKey(People.PHONETIC_NAME)) {
1197044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mValues2.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
1198044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            OpenHelper.copyStringValue(mValues2, StructuredName.DISPLAY_NAME,
1199044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    values, People.NAME);
1200044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            if (values.containsKey(People.PHONETIC_NAME)) {
1201044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                String phoneticName = values.getAsString(People.PHONETIC_NAME);
1202044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                NameSplitter.Name parsedName = new NameSplitter.Name();
1203044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mPhoneticNameSplitter.split(parsedName, phoneticName);
1204044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues2.put(StructuredName.PHONETIC_GIVEN_NAME, parsedName.getGivenNames());
1205044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues2.put(StructuredName.PHONETIC_MIDDLE_NAME, parsedName.getMiddleName());
1206044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues2.put(StructuredName.PHONETIC_FAMILY_NAME, parsedName.getFamilyName());
1207044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1208044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1209044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1210044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (values.containsKey(People.NOTES)) {
1211044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mValues3.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE);
1212044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            OpenHelper.copyStringValue(mValues3, Note.NOTE, values, People.NOTES);
1213044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1214044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1215044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1216044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parseOrganizationValues(ContentValues values) {
1217044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1218044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1219044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
1220044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1221044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY,
1222044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.ISPRIMARY);
1223044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1224044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Organization.COMPANY,
1225044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.COMPANY);
1226044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1227044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        // TYPE values happen to remain the same between V1 and V2 - can just copy the value
1228044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Organization.TYPE,
1229044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.TYPE);
1230044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1231044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Organization.LABEL,
1232044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.LABEL);
1233044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Organization.TITLE,
1234044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.TITLE);
1235044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1236044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1237044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parsePhoneValues(ContentValues values) {
1238044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1239044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1240044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
1241044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1242044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY,
1243044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Phones.ISPRIMARY);
1244044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1245044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Phone.NUMBER,
1246044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Phones.NUMBER);
1247044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1248044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        // TYPE values happen to remain the same between V1 and V2 - can just copy the value
1249044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Phone.TYPE,
1250044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Phones.TYPE);
1251044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1252044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Phone.LABEL,
1253044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Phones.LABEL);
1254044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1255044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1256044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parseContactMethodValues(int kind, ContentValues values) {
1257044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1258044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1259044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY, values, ContactMethods.ISPRIMARY);
1260044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1261044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        switch (kind) {
1262044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case android.provider.Contacts.KIND_EMAIL: {
1263044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                copyCommonFields(values, Email.CONTENT_ITEM_TYPE, Email.TYPE, Email.LABEL,
1264044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                        Data.DATA14);
1265044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                OpenHelper.copyStringValue(mValues, Email.DATA, values, ContactMethods.DATA);
1266044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1267044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1268044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1269044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case android.provider.Contacts.KIND_IM: {
1270044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                String protocol = values.getAsString(ContactMethods.DATA);
1271044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                if (protocol.startsWith("pre:")) {
1272044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    mValues.put(Im.PROTOCOL, Integer.parseInt(protocol.substring(4)));
1273044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                } else if (protocol.startsWith("custom:")) {
1274044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    mValues.put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM);
1275044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    mValues.put(Im.CUSTOM_PROTOCOL, protocol.substring(7));
1276044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                }
1277044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1278044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                copyCommonFields(values, Im.CONTENT_ITEM_TYPE, Im.TYPE, Im.LABEL, Data.DATA14);
1279044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1280044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1281044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1282044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case android.provider.Contacts.KIND_POSTAL: {
1283044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                copyCommonFields(values, StructuredPostal.CONTENT_ITEM_TYPE, StructuredPostal.TYPE,
1284044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                        StructuredPostal.LABEL, Data.DATA14);
1285044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                OpenHelper.copyStringValue(mValues, StructuredPostal.FORMATTED_ADDRESS, values,
1286044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                        ContactMethods.DATA);
1287044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1288044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1289044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1290044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1291044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1292044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void copyCommonFields(ContentValues values, String mimeType, String typeColumn,
1293044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            String labelColumn, String auxDataColumn) {
1294044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(Data.MIMETYPE, mimeType);
1295044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyLongValue(mValues, typeColumn, values, ContactMethods.TYPE);
1296044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, labelColumn, values, ContactMethods.LABEL);
1297044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, auxDataColumn, values, ContactMethods.AUX_DATA);
1298044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1299044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1300044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parseGroupValues(ContentValues values) {
1301044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1302044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1303044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Groups.TITLE,
1304044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Groups.NAME);
1305044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Groups.NOTES,
1306044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Groups.NOTES);
1307044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, Groups.SYSTEM_ID,
1308044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Groups.SYSTEM_ID);
1309044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1310044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1311044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parseExtensionValues(ContentValues values) {
1312044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, ExtensionsColumns.NAME,
1313044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.People.Extensions.NAME);
1314044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        OpenHelper.copyStringValue(mValues, ExtensionsColumns.VALUE,
1315044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.People.Extensions.VALUE);
1316c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
1317c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
131867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private Uri findFirstDataRow(long rawContactId, String contentItemType) {
131967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long dataId = findFirstDataId(rawContactId, contentItemType);
132067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (dataId == -1) {
132167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            return null;
132267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
132367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
132467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
132567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
132667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
132767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private long findFirstDataId(long rawContactId, String mimeType) {
132867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long dataId = -1;
132967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Cursor c = mContactsProvider.query(Data.CONTENT_URI, IdQuery.COLUMNS,
133067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                Data.RAW_CONTACT_ID + "=" + rawContactId + " AND "
133167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                        + Data.MIMETYPE + "='" + mimeType + "'",
133267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                null, null);
133367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        try {
133467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            if (c.moveToFirst()) {
133567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                dataId = c.getLong(IdQuery._ID);
133667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
133767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        } finally {
133867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            c.close();
133967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
134067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return dataId;
134167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
134267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
1343044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
13443cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    public int delete(Uri uri, String selection, String[] selectionArgs) {
1345044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Cursor c = query(uri, IdQuery.COLUMNS, selection, selectionArgs, null, null);
1346044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (c == null) {
1347044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            return 0;
1348044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1349044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1350044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        int count = 0;
1351044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        try {
1352044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            while (c.moveToNext()) {
1353044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                long id = c.getLong(IdQuery._ID);
1354044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count += delete(uri, id);
1355044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1356044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } finally {
1357044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            c.close();
1358044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1359044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1360044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return count;
1361044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1362044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1363044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public int delete(Uri uri, long id) {
13643cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        final int match = sUriMatcher.match(uri);
13653cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        int count = 0;
13663cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        switch (match) {
1367044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PEOPLE:
136833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case PEOPLE_ID:
136933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                count = mContactsProvider.deleteRawContact(ContentUris.parseId(uri), false);
137033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                break;
137133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov
1372044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PEOPLE_PHOTO:
1373044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues.clear();
1374044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues.putNull(android.provider.Contacts.Photos.DATA);
1375044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                updatePhoto(id, mValues);
1376044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1377044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1378044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case ORGANIZATIONS:
13793cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS_ID:
1380e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1381e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        ORGANIZATION_MIME_TYPES);
1382e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1383e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1384044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case CONTACTMETHODS:
1385e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS_ID:
1386e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1387e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        CONTACT_METHOD_MIME_TYPES);
1388e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1389e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1390044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1391044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHONES:
1392e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES_ID:
1393e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1394e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        PHONE_MIME_TYPES);
13953cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
13963cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
1397044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case EXTENSIONS:
1398044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case EXTENSIONS_ID:
1399044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1400044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                        EXTENSION_MIME_TYPES);
1401044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1402044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1403044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS:
1404044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS_ID:
1405044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1406044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                        PHOTO_MIME_TYPES);
1407044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1408044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1409044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
14103cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            default:
14113cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
14123cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        }
14133cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
14143cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        return count;
14153cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    }
14163cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
1417f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
1418c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            String sortOrder, String limit) {
1419caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        ensureDefaultAccount();
1420caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
1421f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final SQLiteDatabase db = mOpenHelper.getReadableDatabase();
1422f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
1423f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        String groupBy = null;
1424f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1425f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final int match = sUriMatcher.match(uri);
1426f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch (match) {
1427f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE: {
142870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1429f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
143067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1431f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
1432f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            }
1433f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1434f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE_ID:
143570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1436f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
143767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1438caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + People._ID + "=");
1439f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1440f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
1441f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1442445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov            case PEOPLE_FILTER: {
1443445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1444445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
144567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1446445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                String filterParam = uri.getPathSegments().get(2);
1447caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + People._ID + " IN "
14485ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + mContactsProvider.getRawContactsByFilterAsNestedQuery(filterParam));
1449445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                break;
1450445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov            }
1451445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov
145271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov            case GROUP_NAME_MEMBERS:
145371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
145471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
145571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                applyRawContactsAccount(qb);
145671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                String group = uri.getPathSegments().get(2);
145771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                qb.appendWhere(" AND " + buildGroupNameMatchWhereClause(group));
145871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                break;
145971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
14603cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS:
14615dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.ORGANIZATIONS + " organizations");
1462d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sOrganizationProjectionMap);
146367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
14643cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
14653cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
14663cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS_ID:
14675dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.ORGANIZATIONS + " organizations");
14683cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                qb.setProjectionMap(sOrganizationProjectionMap);
146967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1470d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Organizations._ID + "=");
1471e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1472e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1473e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1474e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS:
14755dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1476d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
147767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1478e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1479e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1480e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS_ID:
14815dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1482e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
148367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1484d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods._ID + "=");
1485e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1486e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1487e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1488bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov            case CONTACTMETHODS_EMAIL:
1489bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1490bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
1491bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                applyRawContactsAccount(qb);
1492bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + "="
1493bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                        + android.provider.Contacts.KIND_EMAIL);
1494bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                break;
1495bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov
1496e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS:
14975dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1498e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
149967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1500d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "=");
1501e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1502e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL");
1503e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1504e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1505e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS_ID:
15065dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1507e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
150867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1509d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "=");
1510e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1511d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods._ID + "=");
1512e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
1513e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL");
1514e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1515e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1516e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES:
15175dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1518d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
151967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1520e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1521e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1522e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES_ID:
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._ID + "=");
1527e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1528e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1529e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1530fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov            case PHONES_FILTER:
15315dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1532fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
153367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1534fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                if (uri.getPathSegments().size() > 2) {
1535fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                    String filterParam = uri.getLastPathSegment();
1536e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov                    qb.appendWhere(" AND person =");
1537e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov                    qb.appendWhere(mOpenHelper.buildPhoneLookupAsNestedQuery(filterParam));
1538fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                }
1539fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                break;
1540fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
1541e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_PHONES:
15425dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1543e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
154467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1545d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "=");
1546e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1547e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1548e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1549e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_PHONES_ID:
15505dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1551e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
155267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1553d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "=");
15543cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1555d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "=");
1556e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
15573cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
15583cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
15590f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS:
15605dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
1561d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
156267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
15630f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
15640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
15650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS_ID:
15665dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
15670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
156867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1569d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "=");
15700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
15710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
15720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
15730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_EXTENSIONS:
15745dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
15750f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
157667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1577d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "=");
15780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
15790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
15800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
15810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_EXTENSIONS_ID:
15825dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
15830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
158467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1585d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "=");
15860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1587d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "=");
15880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
15890f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
15900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
15910f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS:
15925dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUPS + " groups");
15930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupProjectionMap);
159467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyGroupAccount(qb);
15950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
15960f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
15970f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS_ID:
15985dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUPS + " groups");
15990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupProjectionMap);
160067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyGroupAccount(qb);
1601caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Groups._ID + "=");
16020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
16030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
16040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
16050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP:
16065dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
1607d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
160867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
16090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
16100f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
16110f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP_ID:
16125dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
16130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
161467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1615d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "=");
16160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
16170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
16180f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
16190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_GROUPMEMBERSHIP:
16205dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
16210f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
162267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1623d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "=");
16240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
16250f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
16260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
16270f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_GROUPMEMBERSHIP_ID:
16285dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
16290f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
163067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1631d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "=");
16320f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1633d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "=");
16340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
16350f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
16360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
1637c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PEOPLE_PHOTO:
16385dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHOTOS + " photos");
1639c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.setProjectionMap(sPhotoProjectionMap);
164067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1641c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Photos.PERSON_ID + "=");
1642c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1643c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                limit = "1";
1644c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
1645c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1646044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS:
1647044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.setTables(LegacyTables.PHOTOS + " photos");
1648044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.setProjectionMap(sPhotoProjectionMap);
1649044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                applyRawContactsAccount(qb);
1650044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1651044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1652044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS_ID:
1653044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.setTables(LegacyTables.PHOTOS + " photos");
1654044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.setProjectionMap(sPhotoProjectionMap);
1655044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                applyRawContactsAccount(qb);
1656044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Photos._ID + "=");
1657044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1658044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1659044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1660c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            case SEARCH_SUGGESTIONS:
1661c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
1662c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                // No legacy compatibility for search suggestions
1663a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                return mGlobalSearchSupport.handleSearchSuggestionsQuery(db, uri, limit);
1664c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
1665b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov            case SEARCH_SHORTCUT: {
1666b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov                long contactId = ContentUris.parseId(uri);
1667b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov                return mGlobalSearchSupport.handleSearchShortcutRefresh(db, contactId, projection);
1668b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov            }
1669b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov
16701b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE:
16711b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_URI,
16721b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
16731b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
16741b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE_WITH_PHONES:
16751b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_WITH_PHONES_URI,
16761b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
16771b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
16781b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE_FAVORITES:
16791b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_FAVORITES_URI,
16801b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
16811b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
16821b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE_GROUP_NAME:
16831b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(Uri.withAppendedPath(LIVE_FOLDERS_CONTACTS_URI,
16841b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        Uri.encode(uri.getLastPathSegment())),
16851b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
16861b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
168733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case DELETED_PEOPLE:
168833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case DELETED_GROUPS:
168933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                throw new UnsupportedOperationException();
169033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov
1691f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            default:
1692f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                throw new IllegalArgumentException("Unknown URL " + uri);
1693f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1694f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1695f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // Perform the query and set the notification uri
1696f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final Cursor c = qb.query(db, projection, selection, selectionArgs,
1697f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                groupBy, null, sortOrder, limit);
1698f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (c != null) {
16993fe48cf2c81f6e89b78e919661e2b0b828a2144eDmitri Plotnikov            c.setNotificationUri(mContext.getContentResolver(),
17003fe48cf2c81f6e89b78e919661e2b0b828a2144eDmitri Plotnikov                    android.provider.Contacts.CONTENT_URI);
1701f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1702f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return c;
1703f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1704f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
170567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void applyRawContactsAccount(SQLiteQueryBuilder qb) {
1706caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        StringBuilder sb = new StringBuilder();
170767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        appendRawContactsAccount(sb);
170867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        qb.appendWhere(sb.toString());
170967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
171067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
171167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void appendRawContactsAccount(StringBuilder sb) {
1712caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(RawContacts.ACCOUNT_NAME + "=");
1713df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.name);
1714caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(" AND " + RawContacts.ACCOUNT_TYPE + "=");
1715df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.type);
1716caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
1717caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
171867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void applyGroupAccount(SQLiteQueryBuilder qb) {
1719caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        StringBuilder sb = new StringBuilder();
172067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        appendGroupAccount(sb);
172167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        qb.appendWhere(sb.toString());
172267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
172367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
172467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void appendGroupAccount(StringBuilder sb) {
1725caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(Groups.ACCOUNT_NAME + "=");
1726df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.name);
1727caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(" AND " + Groups.ACCOUNT_TYPE + "=");
1728df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.type);
1729caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
1730caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
1731f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    /**
173271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     * Build a WHERE clause that restricts the query to match people that are a member of
173371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     * a group with a particular name. The projection map of the query must include
173471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     * {@link People#_ID}.
173571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     *
173671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     * @param groupName The name of the group
173771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     * @return The where clause.
173871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     */
173971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    private String buildGroupNameMatchWhereClause(String groupName) {
174071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        return "people._id IN "
174171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                + "(SELECT " + DataColumns.CONCRETE_RAW_CONTACT_ID
174271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                + " FROM " + Tables.DATA_JOIN_MIMETYPES
174371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                + " WHERE " + Data.MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE
174471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                        + "' AND " + GroupMembership.GROUP_ROW_ID + "="
174571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                                + "(SELECT " + Tables.GROUPS + "." + Groups._ID
174671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                                + " FROM " + Tables.GROUPS
174771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                                + " WHERE " + Groups.TITLE + "="
174871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                                        + DatabaseUtils.sqlEscapeString(groupName) + "))";
174971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    }
175071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
175171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    /**
1752f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     * Called when a change has been made.
1753f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     *
1754f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     * @param uri the uri that the change was made to
1755f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     */
1756f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private void onChange(Uri uri) {
1757f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContext.getContentResolver().notifyChange(android.provider.Contacts.CONTENT_URI, null);
1758f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
175961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
176061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    public String getType(Uri uri) {
176161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        int match = sUriMatcher.match(uri);
176261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        switch (match) {
176361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case EXTENSIONS:
176461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_EXTENSIONS:
176561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return Extensions.CONTENT_TYPE;
176661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case EXTENSIONS_ID:
176761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_EXTENSIONS_ID:
176861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return Extensions.CONTENT_ITEM_TYPE;
176961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE:
177061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/person";
177161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_ID:
177261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/person";
177361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_PHONES:
177461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/phone";
177561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_PHONES_ID:
177661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/phone";
177761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_CONTACTMETHODS:
177861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/contact-methods";
177961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_CONTACTMETHODS_ID:
178061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return getContactMethodType(uri);
178161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHONES:
178261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/phone";
178361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHONES_ID:
178461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/phone";
178561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHONES_FILTER:
178661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/phone";
178761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHOTOS_ID:
178861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/photo";
178961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHOTOS:
179061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/photo";
179161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_PHOTO:
179261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/photo";
179361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case CONTACTMETHODS:
179461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/contact-methods";
179561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case CONTACTMETHODS_ID:
179661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return getContactMethodType(uri);
179761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case ORGANIZATIONS:
179861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/organizations";
179961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case ORGANIZATIONS_ID:
180061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/organization";
180161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case SEARCH_SUGGESTIONS:
180261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return SearchManager.SUGGEST_MIME_TYPE;
180361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case SEARCH_SHORTCUT:
180461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return SearchManager.SHORTCUT_MIME_TYPE;
180561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            default:
180661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                throw new IllegalArgumentException("Unknown URI");
180761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        }
180861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    }
180961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
181061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    private String getContactMethodType(Uri url) {
181161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        String mime = null;
181261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
181361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        Cursor c = query(url, new String[] {ContactMethods.KIND}, null, null, null, null);
181461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        if (c != null) {
181561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            try {
181661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                if (c.moveToFirst()) {
181761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                    int kind = c.getInt(0);
181861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                    switch (kind) {
18191b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                    case android.provider.Contacts.KIND_EMAIL:
182061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        mime = "vnd.android.cursor.item/email";
182161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        break;
182261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
18231b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                    case android.provider.Contacts.KIND_IM:
182461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        mime = "vnd.android.cursor.item/jabber-im";
182561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        break;
182661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
18271b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                    case android.provider.Contacts.KIND_POSTAL:
182861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        mime = "vnd.android.cursor.item/postal-address";
182961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        break;
183061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                    }
183161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                }
183261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            } finally {
183361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                c.close();
183461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            }
183561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        }
183661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        return mime;
183761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    }
1838f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov}
1839