LegacyApiSupport.java revision b38ed2c5ffeb20efc677b4a9229db4a00603aa8d
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
18b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.DataColumns;
19b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.ExtensionsColumns;
20b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.GroupsColumns;
21b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.MimetypesColumns;
22b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.PhoneColumns;
23b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.PresenceColumns;
24b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.RawContactsColumns;
25b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.StatusUpdatesColumns;
26b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.Tables;
27f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
28caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikovimport android.accounts.Account;
29c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.app.SearchManager;
30f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentUris;
31f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentValues;
32f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.Context;
33f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.UriMatcher;
34f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.Cursor;
35e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.database.DatabaseUtils;
36f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteDatabase;
37044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikovimport android.database.sqlite.SQLiteDoneException;
38f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteQueryBuilder;
39f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteStatement;
40f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.net.Uri;
4167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikovimport android.provider.BaseColumns;
42f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract;
43e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.Contacts.ContactMethods;
4461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikovimport android.provider.Contacts.Extensions;
45f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.Contacts.People;
46e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.Data;
470f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.Groups;
48c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract.RawContacts;
4982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikovimport android.provider.ContactsContract.StatusUpdates;
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 =
1350a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov            " LEFT OUTER JOIN " + Tables.PRESENCE +
1360a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov            " ON (" + Tables.PRESENCE + "." + StatusUpdates.DATA_ID + "=" +
1370a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov                    "(SELECT MAX(" + StatusUpdates.DATA_ID + ")" +
1380a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov                    " FROM " + Tables.PRESENCE +
1390a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov                    " WHERE people._id = " + PresenceColumns.RAW_CONTACT_ID + ")" +
1400a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov            " )";
14170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
142e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String PHONETIC_NAME_SQL = "trim(trim("
143e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_GIVEN_NAME + ",' ')||' '||"
144e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_MIDDLE_NAME + ",' '))||' '||"
145e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_FAMILY_NAME + ",' ')) ";
146e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
147e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String CONTACT_METHOD_KIND_SQL =
148d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            "CAST ((CASE WHEN mimetype='" + Email.CONTENT_ITEM_TYPE + "'"
149e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                + " THEN " + android.provider.Contacts.KIND_EMAIL
150e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                + " ELSE"
151e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + " (CASE WHEN mimetype='" + Im.CONTENT_ITEM_TYPE +"'"
152e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " THEN " + android.provider.Contacts.KIND_IM
153e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " ELSE"
15467dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey                        + " (CASE WHEN mimetype='" + StructuredPostal.CONTENT_ITEM_TYPE + "'"
155e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " THEN "  + android.provider.Contacts.KIND_POSTAL
156e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " ELSE"
157e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                                + " NULL"
158e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " END)"
159e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " END)"
160d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                + " END) AS INTEGER)";
161f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
16297f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov    private static final String IM_PROTOCOL_SQL =
16382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov            "(CASE WHEN " + StatusUpdates.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM
16482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov                + " THEN 'custom:'||" + StatusUpdates.CUSTOM_PROTOCOL
16582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov                + " ELSE 'pre:'||" + StatusUpdates.PROTOCOL
16697f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " END)";
16797f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov
16897f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov    private static String CONTACT_METHOD_DATA_SQL =
16997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov            "(CASE WHEN " + Data.MIMETYPE + "='" + Im.CONTENT_ITEM_TYPE + "'"
17097f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " THEN (CASE WHEN " + Tables.DATA + "." + Im.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM
17197f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                    + " THEN 'custom:'||" + Tables.DATA + "." + Im.CUSTOM_PROTOCOL
17297f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                    + " ELSE 'pre:'||" + Tables.DATA + "." + Im.PROTOCOL
17397f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                    + " END)"
174f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                + " ELSE " + Tables.DATA + "." + Email.DATA
17597f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " END)";
17697f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov
1771b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final Uri LIVE_FOLDERS_CONTACTS_URI = Uri.withAppendedPath(
1781b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            ContactsContract.AUTHORITY_URI, "live_folders/contacts");
1791b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
1801b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final Uri LIVE_FOLDERS_CONTACTS_WITH_PHONES_URI = Uri.withAppendedPath(
1811b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            ContactsContract.AUTHORITY_URI, "live_folders/contacts_with_phones");
1821b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
1831b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final Uri LIVE_FOLDERS_CONTACTS_FAVORITES_URI = Uri.withAppendedPath(
1841b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            ContactsContract.AUTHORITY_URI, "live_folders/favorites");
18597f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov
186f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public interface LegacyTables {
187d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String PEOPLE = "view_v1_people";
1885dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov        public static final String PEOPLE_JOIN_PRESENCE = "view_v1_people people " + PRESENCE_JOINS;
189d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String GROUPS = "view_v1_groups";
190d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String ORGANIZATIONS = "view_v1_organizations";
191d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String CONTACT_METHODS = "view_v1_contact_methods";
192d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String PHONES = "view_v1_phones";
193d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String EXTENSIONS = "view_v1_extensions";
194d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String GROUP_MEMBERSHIP = "view_v1_group_membership";
195c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String PHOTOS = "view_v1_photos";
196f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
197f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
198e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] ORGANIZATION_MIME_TYPES = new String[] {
199e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Organization.CONTENT_ITEM_TYPE
200e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
201e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
202e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] CONTACT_METHOD_MIME_TYPES = new String[] {
203e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Email.CONTENT_ITEM_TYPE,
204e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Im.CONTENT_ITEM_TYPE,
20567dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey        StructuredPostal.CONTENT_ITEM_TYPE,
206e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
207e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
208e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] PHONE_MIME_TYPES = new String[] {
209e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Phone.CONTENT_ITEM_TYPE
210e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
211e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
212044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private static final String[] PHOTO_MIME_TYPES = new String[] {
213044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Photo.CONTENT_ITEM_TYPE
214044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    };
215044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
216044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private static final String[] EXTENSION_MIME_TYPES = new String[] {
217044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE
218044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    };
219044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
22067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private interface IdQuery {
22167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        String[] COLUMNS = { BaseColumns._ID };
222c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
223c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int _ID = 0;
224c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
225c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
226c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    /**
227c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     * A custom data row that is used to store legacy photo data fields no
228c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     * longer directly supported by the API.
229c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     */
230c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private interface LegacyPhotoData {
231c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/photo_v1_extras";
232c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
233c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String PHOTO_DATA_ID = Data.DATA1;
234c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String LOCAL_VERSION = Data.DATA2;
235c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String DOWNLOAD_REQUIRED = Data.DATA3;
236c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String EXISTS_ON_SERVER = Data.DATA4;
237c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String SYNC_ERROR = Data.DATA5;
238c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
239c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
240c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    public static final String LEGACY_PHOTO_JOIN =
2415ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            " LEFT OUTER JOIN data legacy_photo ON (raw_contacts._id = legacy_photo.raw_contact_id"
242c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = legacy_photo.mimetype_id)"
243c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'"
244c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + " AND " + DataColumns.CONCRETE_ID + " = legacy_photo." + LegacyPhotoData.PHOTO_DATA_ID
245c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + ")";
246c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
247f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final HashMap<String, String> sPeopleProjectionMap;
2483cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final HashMap<String, String> sOrganizationProjectionMap;
249e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final HashMap<String, String> sContactMethodProjectionMap;
250e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final HashMap<String, String> sPhoneProjectionMap;
2510f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sExtensionProjectionMap;
2520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sGroupProjectionMap;
2530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sGroupMembershipProjectionMap;
254c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final HashMap<String, String> sPhotoProjectionMap;
255fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
256f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    static {
257f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
258f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // Contacts URI matching table
259f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        UriMatcher matcher = sUriMatcher;
260f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
261f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        String authority = android.provider.Contacts.AUTHORITY;
2620f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "extensions", EXTENSIONS);
2630f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "extensions/#", EXTENSIONS_ID);
2640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groups", GROUPS);
2650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groups/#", GROUPS_ID);
26671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        matcher.addURI(authority, "groups/name/*/members", GROUP_NAME_MEMBERS);
267f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/name/*/members/filter/*",
268f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                GROUP_NAME_MEMBERS_FILTER);
269f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/system_id/*/members", GROUP_SYSTEM_ID_MEMBERS);
270f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/system_id/*/members/filter/*",
271f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                GROUP_SYSTEM_ID_MEMBERS_FILTER);
2720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groupmembership", GROUPMEMBERSHIP);
2730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groupmembership/#", GROUPMEMBERSHIP_ID);
274f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groupmembershipraw", GROUPMEMBERSHIP_RAW);
275f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people", PEOPLE);
276f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/strequent", PEOPLE_STREQUENT);
277f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/strequent/filter/*", PEOPLE_STREQUENT_FILTER);
278445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov        matcher.addURI(authority, "people/filter/*", PEOPLE_FILTER);
279f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/with_phones_filter/*",
280f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_WITH_PHONES_FILTER);
281f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/with_email_or_im_filter/*",
282f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_WITH_EMAIL_OR_IM_FILTER);
283f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people/#", PEOPLE_ID);
2840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/extensions", PEOPLE_EXTENSIONS);
2850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/extensions/#", PEOPLE_EXTENSIONS_ID);
286e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/phones", PEOPLE_PHONES);
287e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/phones/#", PEOPLE_PHONES_ID);
288f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/phones_with_presence",
289f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_PHONES_WITH_PRESENCE);
290c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "people/#/photo", PEOPLE_PHOTO);
291f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/photo/data", PEOPLE_PHOTO_DATA);
292e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/contact_methods", PEOPLE_CONTACTMETHODS);
293f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/contact_methods_with_presence",
294f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_CONTACTMETHODS_WITH_PRESENCE);
295e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID);
296f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/organizations", PEOPLE_ORGANIZATIONS);
297f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/organizations/#", PEOPLE_ORGANIZATIONS_ID);
2980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/groupmembership", PEOPLE_GROUPMEMBERSHIP);
2990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/groupmembership/#", PEOPLE_GROUPMEMBERSHIP_ID);
300f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/raw", PEOPLE_RAW);
301f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/owner", PEOPLE_OWNER);
302f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people/#/update_contact_time",
303f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                PEOPLE_UPDATE_CONTACT_TIME);
30433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov        matcher.addURI(authority, "deleted_people", DELETED_PEOPLE);
30533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov        matcher.addURI(authority, "deleted_groups", DELETED_GROUPS);
306e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "phones", PHONES);
307f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones_with_presence", PHONES_WITH_PRESENCE);
308fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        matcher.addURI(authority, "phones/filter/*", PHONES_FILTER);
309f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones/filter_name/*", PHONES_FILTER_NAME);
310f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones/mobile_filter_name/*",
311f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PHONES_MOBILE_FILTER_NAME);
312e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "phones/#", PHONES_ID);
313c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "photos", PHOTOS);
314c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "photos/#", PHOTOS_ID);
315e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "contact_methods", CONTACTMETHODS);
316bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        matcher.addURI(authority, "contact_methods/email", CONTACTMETHODS_EMAIL);
317f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "contact_methods/email/*", CONTACTMETHODS_EMAIL_FILTER);
318e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "contact_methods/#", CONTACTMETHODS_ID);
319f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "contact_methods/with_presence",
320f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                CONTACTMETHODS_WITH_PRESENCE);
3213cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        matcher.addURI(authority, "organizations", ORGANIZATIONS);
3223cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        matcher.addURI(authority, "organizations/#", ORGANIZATIONS_ID);
323f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "voice_dialer_timestamp", VOICE_DIALER_TIMESTAMP);
324c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY,
325c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                SEARCH_SUGGESTIONS);
326c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY + "/*",
327c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                SEARCH_SUGGESTIONS);
328b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/#",
329b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov                SEARCH_SHORTCUT);
330f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "settings", SETTINGS);
331f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//
3321b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/people", LIVE_FOLDERS_PEOPLE);
3331b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/people/*",
3341b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                LIVE_FOLDERS_PEOPLE_GROUP_NAME);
3351b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/people_with_phones",
3361b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                LIVE_FOLDERS_PEOPLE_WITH_PHONES);
3371b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/favorites",
3381b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                LIVE_FOLDERS_PEOPLE_FAVORITES);
339f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
340f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
341e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        HashMap<String, String> peopleProjectionMap = new HashMap<String, String>();
342d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.NAME, People.NAME);
343d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.DISPLAY_NAME, People.DISPLAY_NAME);
344d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.PHONETIC_NAME, People.PHONETIC_NAME);
345d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.NOTES, People.NOTES);
346d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.TIMES_CONTACTED, People.TIMES_CONTACTED);
347d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.LAST_TIME_CONTACTED, People.LAST_TIME_CONTACTED);
348d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.CUSTOM_RINGTONE, People.CUSTOM_RINGTONE);
349d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.SEND_TO_VOICEMAIL, People.SEND_TO_VOICEMAIL);
350d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.STARRED, People.STARRED);
351ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        peopleProjectionMap.put(People.PRIMARY_ORGANIZATION_ID, People.PRIMARY_ORGANIZATION_ID);
352ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        peopleProjectionMap.put(People.PRIMARY_EMAIL_ID, People.PRIMARY_EMAIL_ID);
353ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        peopleProjectionMap.put(People.PRIMARY_PHONE_ID, People.PRIMARY_PHONE_ID);
354e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
355e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPeopleProjectionMap = new HashMap<String, String>(peopleProjectionMap);
3569155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPeopleProjectionMap.put(People._ID, People._ID);
357d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.NUMBER, People.NUMBER);
358d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.TYPE, People.TYPE);
359d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.LABEL, People.LABEL);
360d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.NUMBER_KEY, People.NUMBER_KEY);
3610126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov        sPeopleProjectionMap.put(People.IM_PROTOCOL, IM_PROTOCOL_SQL + " AS " + People.IM_PROTOCOL);
36270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.IM_HANDLE, People.IM_HANDLE);
36370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.IM_ACCOUNT, People.IM_ACCOUNT);
36470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.PRESENCE_STATUS, People.PRESENCE_STATUS);
365a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov        sPeopleProjectionMap.put(People.PRESENCE_CUSTOM_STATUS,
3660cc388933e698760d4985a7d7be1325f9c8305e9Dmitri Plotnikov                "(SELECT " + StatusUpdates.STATUS +
367a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                " FROM " + Tables.STATUS_UPDATES +
368a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                " JOIN " + Tables.DATA +
369a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                "   ON(" + StatusUpdatesColumns.DATA_ID + "=" + DataColumns.CONCRETE_ID + ")" +
370a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                " WHERE " + DataColumns.CONCRETE_RAW_CONTACT_ID + "=people." + People._ID +
3710cc388933e698760d4985a7d7be1325f9c8305e9Dmitri Plotnikov                " ORDER BY " + StatusUpdates.STATUS_TIMESTAMP + " DESC " +
372a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                " LIMIT 1" +
373a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                ") AS " + People.PRESENCE_CUSTOM_STATUS);
3743cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
3753cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap = new HashMap<String, String>();
3769155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations._ID,
3779155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Organizations._ID);
3783cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.PERSON_ID,
379d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.PERSON_ID);
3803cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.ISPRIMARY,
381d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.ISPRIMARY);
3823cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.COMPANY,
383d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.COMPANY);
3843cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TYPE,
385d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.TYPE);
3863cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.LABEL,
387d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.LABEL);
3883cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TITLE,
389d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.TITLE);
390e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
391e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sContactMethodProjectionMap = new HashMap<String, String>(peopleProjectionMap);
3929155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods._ID, ContactMethods._ID);
393d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.PERSON_ID, ContactMethods.PERSON_ID);
394d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.KIND, ContactMethods.KIND);
395d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.ISPRIMARY, ContactMethods.ISPRIMARY);
396d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.TYPE, ContactMethods.TYPE);
397d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.DATA, ContactMethods.DATA);
398d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.LABEL, ContactMethods.LABEL);
399d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.AUX_DATA, ContactMethods.AUX_DATA);
400e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
401e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap = new HashMap<String, String>(peopleProjectionMap);
4029155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones._ID,
4039155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Phones._ID);
404e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.PERSON_ID,
405d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.PERSON_ID);
406e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.ISPRIMARY,
407d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.ISPRIMARY);
408e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER,
409d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.NUMBER);
410e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.TYPE,
411d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.TYPE);
412e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.LABEL,
413d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.LABEL);
414e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER_KEY,
415d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.NUMBER_KEY);
4160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
4170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap = new HashMap<String, String>();
4189155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions._ID,
4199155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Extensions._ID);
4200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.PERSON_ID,
421d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.PERSON_ID);
4220f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.NAME,
423d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.NAME);
4240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.VALUE,
425d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.VALUE);
4260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
4270f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap = new HashMap<String, String>();
4280f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups._ID,
429d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups._ID);
4300f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.NAME,
431d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.NAME);
4320f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.NOTES,
433d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.NOTES);
4340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.SYSTEM_ID,
435d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.SYSTEM_ID);
4360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
437d4b57da3f07bc530db69015d363c61a768a4713aDmitri Plotnikov        sGroupMembershipProjectionMap = new HashMap<String, String>(sGroupProjectionMap);
4389155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership._ID,
4399155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.GroupMembership._ID);
4400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.PERSON_ID,
441d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.GroupMembership.PERSON_ID);
4420f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.GROUP_ID,
443d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.GroupMembership.GROUP_ID);
444c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
445c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap = new HashMap<String, String>();
4469155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos._ID,
4479155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Photos._ID);
448c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.PERSON_ID,
449c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.PERSON_ID);
450c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.DATA,
451c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.DATA);
452c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.LOCAL_VERSION,
453c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.LOCAL_VERSION);
454c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.DOWNLOAD_REQUIRED,
455c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.DOWNLOAD_REQUIRED);
456c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.EXISTS_ON_SERVER,
457c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.EXISTS_ON_SERVER);
458c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.SYNC_ERROR,
459c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.SYNC_ERROR);
460f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
461f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
462f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final Context mContext;
463b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov    private final ContactsDatabaseHelper mDbHelper;
464f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final ContactsProvider2 mContactsProvider;
465f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final NameSplitter mPhoneticNameSplitter;
466a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov    private final GlobalSearchSupport mGlobalSearchSupport;
467f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
468d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov    /** Precompiled sql statement for incrementing times contacted for a contact */
4693cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private final SQLiteStatement mLastTimeContactedUpdate;
470044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private final SQLiteStatement mDataMimetypeQuery;
471044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private final SQLiteStatement mDataRawContactIdQuery;
4723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
4733cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private final ContentValues mValues = new ContentValues();
47467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private final ContentValues mValues2 = new ContentValues();
47567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private final ContentValues mValues3 = new ContentValues();
476caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private Account mAccount;
477a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
478044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private long mMimetypeEmail;
479044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private long mMimetypeIm;
480044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private long mMimetypePostal;
481044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
482b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov    public LegacyApiSupport(Context context, ContactsDatabaseHelper contactsDatabaseHelper,
483a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov            ContactsProvider2 contactsProvider, GlobalSearchSupport globalSearchSupport) {
484f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContext = context;
485f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContactsProvider = contactsProvider;
486b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        mDbHelper = contactsDatabaseHelper;
487a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        mGlobalSearchSupport = globalSearchSupport;
488f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
489622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey        mPhoneticNameSplitter = new NameSplitter("", "", "", context
490622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey                .getString(com.android.internal.R.string.common_name_conjunctions), Locale
491622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey                .getDefault());
492f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
493b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        SQLiteDatabase db = mDbHelper.getReadableDatabase();
4945ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mLastTimeContactedUpdate = db.compileStatement("UPDATE " + Tables.RAW_CONTACTS + " SET "
4956cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts.LAST_TIME_CONTACTED + "=? WHERE "
4966cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov                + RawContacts._ID + "=?");
497044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
498044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mDataMimetypeQuery = db.compileStatement(
499044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                "SELECT " + DataColumns.MIMETYPE_ID +
500044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                " FROM " + Tables.DATA +
501044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                " WHERE " + Data._ID + "=?");
502044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
503044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mDataRawContactIdQuery = db.compileStatement(
504044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                "SELECT " + Data.RAW_CONTACT_ID +
505044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                " FROM " + Tables.DATA +
506044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                " WHERE " + Data._ID + "=?");
507044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
508b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        mMimetypeEmail = mDbHelper.getMimeTypeId(Email.CONTENT_ITEM_TYPE);
509b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        mMimetypeIm = mDbHelper.getMimeTypeId(Im.CONTENT_ITEM_TYPE);
510b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        mMimetypePostal = mDbHelper.getMimeTypeId(StructuredPostal.CONTENT_ITEM_TYPE);
511f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
512f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
513caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private void ensureDefaultAccount() {
514caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        if (mAccount == null) {
515caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov            mAccount = mContactsProvider.getDefaultAccount();
5166f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov            if (mAccount == null) {
5176f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov
5186f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov                // This fall-through account will not match any data in the database, which
5196f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov                // is the expected behavior
52028153f2e3dda944e983f6dd0ab80aca63631ddfaJeff Hamilton                mAccount = new Account(NON_EXISTENT_ACCOUNT_NAME, NON_EXISTENT_ACCOUNT_TYPE);
5216f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov            }
522caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        }
523caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
524d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
525b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamilton    public static void createDatabase(SQLiteDatabase db) {
526b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamilton        Log.i(TAG, "Bootstrapping database legacy support");
527d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
528ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        String peopleColumns = "name." + StructuredName.DISPLAY_NAME
529d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NAME + ", " +
5305ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME
531d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.DISPLAY_NAME + ", " +
532d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PHONETIC_NAME_SQL
533d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PHONETIC_NAME + " , " +
534d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "note." + Note.NOTE
535d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NOTES + ", " +
536caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
537caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
5385ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED
539d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.TIMES_CONTACTED + ", " +
5405ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED
541d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.LAST_TIME_CONTACTED + ", " +
5425ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE
543d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.CUSTOM_RINGTONE + ", " +
5445ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL
545d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.SEND_TO_VOICEMAIL + ", " +
5465ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.STARRED
547d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.STARRED + ", " +
548d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "organization." + Data._ID
549d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_ORGANIZATION_ID + ", " +
550d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "email." + Data._ID
551d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_EMAIL_ID + ", " +
552d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Data._ID
553d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_PHONE_ID + ", " +
554d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.NUMBER
555d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NUMBER + ", " +
556d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.TYPE
557d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.TYPE + ", " +
558d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.LABEL
559d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.LABEL + ", " +
560d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + PhoneColumns.NORMALIZED_NUMBER
561ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                        + " AS " + People.NUMBER_KEY;
562ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov
563ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PEOPLE + ";");
564ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PEOPLE + " AS SELECT " +
565ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                RawContactsColumns.CONCRETE_ID
566ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                        + " AS " + android.provider.Contacts.People._ID + ", " +
567ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                peopleColumns +
5685ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.RAW_CONTACTS + PEOPLE_JOINS +
569ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                " WHERE " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
570ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                " AND " + RawContacts.IS_RESTRICTED + "=0" + ";");
571d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
572d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.ORGANIZATIONS + ";");
573d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.ORGANIZATIONS + " AS SELECT " +
574d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
575d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations._ID + ", " +
5765ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Data.RAW_CONTACT_ID
577d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.PERSON_ID + ", " +
578d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Data.IS_PRIMARY
579d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.ISPRIMARY + ", " +
580caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
581caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
582d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.COMPANY
583d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.COMPANY + ", " +
584d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.TYPE
585d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.TYPE + ", " +
586d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.LABEL
587d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.LABEL + ", " +
588d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.TITLE
589caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.TITLE +
5905ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS +
591d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
59233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Organization.CONTENT_ITEM_TYPE + "'"
593caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
594caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
595d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
596d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
597d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.CONTACT_METHODS + ";");
598d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.CONTACT_METHODS + " AS SELECT " +
599d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
600d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods._ID + ", " +
601d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
602d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.PERSON_ID + ", " +
603d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                CONTACT_METHOD_KIND_SQL
604d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.KIND + ", " +
605d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_IS_PRIMARY
606d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.ISPRIMARY + ", " +
607f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                Tables.DATA + "." + Email.TYPE
608d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.TYPE + ", " +
60997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                CONTACT_METHOD_DATA_SQL
610d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.DATA + ", " +
611f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                Tables.DATA + "." + Email.LABEL
612d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.LABEL + ", " +
613d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_DATA14
614d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.AUX_DATA + ", " +
615ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                peopleColumns +
616d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS +
61733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                " WHERE " + ContactMethods.KIND + " IS NOT NULL"
618caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                    + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
619caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                    + " AND " + RawContacts.IS_RESTRICTED + "=0" +
620d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
621d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
622d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
623d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHONES + ";");
624d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PHONES + " AS SELECT " +
625d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
626d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones._ID + ", " +
627d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
628d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.PERSON_ID + ", " +
629d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_IS_PRIMARY
630d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.ISPRIMARY + ", " +
631d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.NUMBER
632d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NUMBER + ", " +
633d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.TYPE
634d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.TYPE + ", " +
635d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.LABEL
636d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.LABEL + ", " +
637d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PhoneColumns.CONCRETE_NORMALIZED_NUMBER
638d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NUMBER_KEY + ", " +
639ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                peopleColumns +
640d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS +
641d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
64233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Phone.CONTENT_ITEM_TYPE + "'"
643caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
644caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
645d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
646d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
647d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.EXTENSIONS + ";");
648d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.EXTENSIONS + " AS SELECT " +
649d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
650d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions._ID + ", " +
651d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
652d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.PERSON_ID + ", " +
653caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
654caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
655d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                ExtensionsColumns.NAME
656d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.NAME + ", " +
657d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                ExtensionsColumns.VALUE
658caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.VALUE +
6595ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS +
660d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
66133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE + "'"
662caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
663caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
664d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
665d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
666d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUPS + ";");
667d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.GROUPS + " AS SELECT " +
668d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                GroupsColumns.CONCRETE_ID + " AS " + android.provider.Contacts.Groups._ID + ", " +
669caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Groups.ACCOUNT_NAME + ", " +
670caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Groups.ACCOUNT_TYPE + ", " +
671d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.TITLE + " AS " + android.provider.Contacts.Groups.NAME + ", " +
672d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.NOTES + " AS " + android.provider.Contacts.Groups.NOTES + " , " +
673d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.SYSTEM_ID + " AS " + android.provider.Contacts.Groups.SYSTEM_ID +
674d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.GROUPS +
675d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
676d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
677d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUP_MEMBERSHIP + ";");
678d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.GROUP_MEMBERSHIP + " AS SELECT " +
679d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
680d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership._ID + ", " +
681d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
682d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.PERSON_ID + ", " +
683caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_NAME
684caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " +  RawContacts.ACCOUNT_NAME + ", " +
685caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_TYPE
686caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " +  RawContacts.ACCOUNT_TYPE + ", " +
687d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                GroupMembership.GROUP_ROW_ID
688d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.GROUP_ID + ", " +
689d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.TITLE
690d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.NAME + ", " +
691d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.NOTES
692d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.NOTES + " , " +
693d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.SYSTEM_ID
694caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.SYSTEM_ID +
6955ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_GROUPS +
696d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
69733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + GroupMembership.CONTENT_ITEM_TYPE + "'"
6985ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
699d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
700c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
701c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHOTOS + ";");
702c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PHOTOS + " AS SELECT " +
703c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                DataColumns.CONCRETE_ID
704c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos._ID + ", " +
705d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
706c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.PERSON_ID + ", " +
707caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_NAME + ", " +
708caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                RawContacts.ACCOUNT_TYPE + ", " +
709c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                Tables.DATA + "." + Photo.PHOTO
710c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.DATA + ", " +
711c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.EXISTS_ON_SERVER
712c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.EXISTS_ON_SERVER + ", " +
713c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.DOWNLOAD_REQUIRED
714c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.DOWNLOAD_REQUIRED + ", " +
715c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.LOCAL_VERSION
716c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.LOCAL_VERSION + ", " +
717c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.SYNC_ERROR
718caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.SYNC_ERROR +
719c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS + LEGACY_PHOTO_JOIN +
720c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
72133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Photo.CONTENT_ITEM_TYPE + "'"
722caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0"
723caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AND " + RawContacts.IS_RESTRICTED + "=0" +
724c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        ";");
725d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    }
726d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
727f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public Uri insert(Uri uri, ContentValues values) {
72867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        ensureDefaultAccount();
729f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final int match = sUriMatcher.match(uri);
730f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        long id = 0;
731f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch (match) {
732f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE:
7333cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                id = insertPeople(values);
7343cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
7353cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
7363cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS:
7373cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                id = insertOrganization(values);
738f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
739f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
7400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS: {
7415ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
7425ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertContactMethod(rawContactId, values);
743e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
7440f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
745e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case CONTACTMETHODS: {
7475ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values, ContactMethods.PERSON_ID);
7485ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertContactMethod(rawContactId, values);
749e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
7500f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
751e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PHONES: {
7535ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7540f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.Phones.PERSON_ID);
7555ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertPhone(rawContactId, values);
7560f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7580f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
75994743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton            case PEOPLE_PHONES: {
76094743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
76194743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton                id = insertPhone(rawContactId, values);
76294743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton                break;
76394743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton            }
76494743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton
7650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS: {
7665ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.Extensions.PERSON_ID);
7685ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertExtension(rawContactId, values);
7690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
7720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS:
7730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                id = insertGroup(values);
774e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
775e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP: {
7775ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
7780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.GroupMembership.PERSON_ID);
7790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                long groupId = getRequiredValue(values,
7800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.GroupMembership.GROUP_ID);
7815ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertGroupMembership(rawContactId, groupId);
7820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
7830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
7840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
785f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            default:
786f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
787f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
788f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
789f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (id < 0) {
790f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            return null;
791f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
792f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
793f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final Uri result = ContentUris.withAppendedId(uri, id);
794f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        onChange(result);
795f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return result;
796f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
797f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
7980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private long getRequiredValue(ContentValues values, String column) {
7990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        if (!values.containsKey(column)) {
8000f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            throw new RuntimeException("Required value: " + column);
801e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        }
802e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return values.getAsLong(column);
804e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
805e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8063cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private long insertPeople(ContentValues values) {
807044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parsePeopleValues(values);
808caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
80967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri contactUri = mContactsProvider.insertInTransaction(RawContacts.CONTENT_URI, mValues);
81067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long rawContactId = ContentUris.parseId(contactUri);
81167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
81267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues2.size() != 0) {
81367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mValues2.put(Data.RAW_CONTACT_ID, rawContactId);
81467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues2);
81567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
81667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues3.size() != 0) {
81767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mValues3.put(Data.RAW_CONTACT_ID, rawContactId);
81867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues3);
81967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
820f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
82167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return rawContactId;
82267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
82367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
8243cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private long insertOrganization(ContentValues values) {
825044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseOrganizationValues(values);
826b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, Data.RAW_CONTACT_ID,
8273cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.PERSON_ID);
8283cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
82967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
8303cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8313cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        return ContentUris.parseId(uri);
8323cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    }
833f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
8345ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertPhone(long rawContactId, ContentValues values) {
835044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parsePhoneValues(values);
8365ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
837e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
83867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
839e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
840e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        return ContentUris.parseId(uri);
841e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
842e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8435ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertContactMethod(long rawContactId, ContentValues values) {
844e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Integer kind = values.getAsInteger(ContactMethods.KIND);
845e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        if (kind == null) {
846e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            throw new RuntimeException("Required value: " + ContactMethods.KIND);
847e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        }
848e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
849044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseContactMethodValues(kind, values);
850e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
851044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
85267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
853e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        return ContentUris.parseId(uri);
854e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
855e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8565ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertExtension(long rawContactId, ContentValues values) {
8570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.clear();
8580f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
8595ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
8600f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(Data.MIMETYPE, android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE);
8610f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
862044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseExtensionValues(values);
8630f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
86467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
8650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
8660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
8670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
8680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private long insertGroup(ContentValues values) {
869044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseGroupValues(values);
8700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
871df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        mValues.put(Groups.ACCOUNT_NAME, mAccount.name);
872df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        mValues.put(Groups.ACCOUNT_TYPE, mAccount.type);
873caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
87467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Groups.CONTENT_URI, mValues);
8750f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
8760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
8770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
8785ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertGroupMembership(long rawContactId, long groupId) {
8790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.clear();
8800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
8810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE);
8825ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(GroupMembership.RAW_CONTACT_ID, rawContactId);
8830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(GroupMembership.GROUP_ROW_ID, groupId);
8840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
88567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
8860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
8870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
8880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
889f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
89067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        ensureDefaultAccount();
89167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
89267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int match = sUriMatcher.match(uri);
893c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int count = 0;
894f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch(match) {
89567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case PEOPLE_UPDATE_CONTACT_TIME: {
896f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                count = updateContactTime(uri, values);
897f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
89867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
899c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
900c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PEOPLE_PHOTO: {
9015ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
9025ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                return updatePhoto(rawContactId, values);
903c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            }
904c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
90567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case -1: {
90667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
90767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
90867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
90967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            default: {
91067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                count = updateAll(uri, match, values, selection, selectionArgs);
91167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
91267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
91367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
91467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (count > 0) {
91567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContext.getContentResolver().notifyChange(uri, null);
91667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
91767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
91867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return count;
91967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
92067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
92167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private int updateAll(Uri uri, final int match, ContentValues values, String selection,
92267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            String[] selectionArgs) {
92367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Cursor c = query(uri, IdQuery.COLUMNS, selection, selectionArgs, null, null);
92467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (c == null) {
92567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            return 0;
92667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
92767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
92867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int count = 0;
92967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        try {
93067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            while (c.moveToNext()) {
93167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                long id = c.getLong(IdQuery._ID);
93267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                count += update(match, id, values);
93367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
93467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        } finally {
93567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            c.close();
93667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
93767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
93867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return count;
93967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
94067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
94167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    public int update(int match, long id, ContentValues values) {
94267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int count = 0;
94367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        switch(match) {
94467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case PEOPLE:
94567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case PEOPLE_ID: {
94667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                count = updatePeople(id, values);
94767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                break;
94867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
94967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
950044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case ORGANIZATIONS:
951044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case ORGANIZATIONS_ID: {
952044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updateOrganizations(id, values);
953044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
954044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
955044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
956044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHONES:
957044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHONES_ID: {
958044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updatePhones(id, values);
959044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
960044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
961044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
962044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case CONTACTMETHODS:
963044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case CONTACTMETHODS_ID: {
964044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updateContactMethods(id, values);
965044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
966044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
967044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
968044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case EXTENSIONS:
969044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case EXTENSIONS_ID: {
970044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updateExtensions(id, values);
971044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
972044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
973044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
974044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case GROUPS:
975044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case GROUPS_ID: {
976044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updateGroups(id, values);
977c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
978044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
979c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
980044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS:
981c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PHOTOS_ID:
982044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updatePhotoByDataId(id, values);
983c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
98467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
985c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
98667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return count;
98767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
988c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
98967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private int updatePeople(long rawContactId, ContentValues values) {
990044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parsePeopleValues(values);
99167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
992044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        int count = mContactsProvider.update(RawContacts.CONTENT_URI,
993044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues, RawContacts._ID + "=" + rawContactId, null);
99467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
99567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (count == 0) {
99667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            return 0;
997f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
998f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
99967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues2.size() != 0) {
100067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            Uri dataUri = findFirstDataRow(rawContactId, StructuredName.CONTENT_ITEM_TYPE);
100167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            if (dataUri != null) {
100267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.update(dataUri, mValues2, null, null);
100367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            } else {
100467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mValues2.put(Data.RAW_CONTACT_ID, rawContactId);
100567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues2);
100667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
100767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
100867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
100967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues3.size() != 0) {
101067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            Uri dataUri = findFirstDataRow(rawContactId, Note.CONTENT_ITEM_TYPE);
101167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            if (dataUri != null) {
101267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.update(dataUri, mValues3, null, null);
101367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            } else {
101467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mValues3.put(Data.RAW_CONTACT_ID, rawContactId);
101567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues3);
101667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
1017f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
101867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
1019f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return count;
1020f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1021f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1022044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updateOrganizations(long dataId, ContentValues values) {
1023044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseOrganizationValues(values);
1024044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1025044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1026044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Data._ID + "=" + dataId, null);
1027044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1028044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1029044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updatePhones(long dataId, ContentValues values) {
1030044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parsePhoneValues(values);
1031044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1032044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1033044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Data._ID + "=" + dataId, null);
1034044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1035044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1036044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updateContactMethods(long dataId, ContentValues values) {
1037044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        int kind;
1038044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1039044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mDataMimetypeQuery.bindLong(1, dataId);
1040044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long mimetype_id;
1041044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        try {
1042044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mimetype_id = mDataMimetypeQuery.simpleQueryForLong();
1043044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } catch (SQLiteDoneException e) {
1044044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            // Data row not found
1045044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            return 0;
1046044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1047044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1048044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (mimetype_id == mMimetypeEmail) {
1049044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            kind = android.provider.Contacts.KIND_EMAIL;
1050044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } else if (mimetype_id == mMimetypeIm) {
1051044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            kind = android.provider.Contacts.KIND_IM;
1052044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } else if (mimetype_id == mMimetypePostal) {
1053044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            kind = android.provider.Contacts.KIND_POSTAL;
1054044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } else {
1055044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1056044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            // Non-legacy kind: return "Not found"
1057044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            return 0;
1058044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1059044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1060044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseContactMethodValues(kind, values);
1061044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1062044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1063044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Data._ID + "=" + dataId, null);
1064044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1065044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1066044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updateExtensions(long dataId, ContentValues values) {
1067044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseExtensionValues(values);
1068044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1069044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1070044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Data._ID + "=" + dataId, null);
1071044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1072044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1073044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updateGroups(long groupId, ContentValues values) {
1074044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseGroupValues(values);
1075044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1076044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Groups.CONTENT_URI, mValues,
1077044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Groups._ID + "=" + groupId, null);
1078044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1079044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1080f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private int updateContactTime(Uri uri, ContentValues values) {
1081f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1082f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // TODO check sanctions
1083f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1084f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        long lastTimeContacted;
1085f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (values.containsKey(People.LAST_TIME_CONTACTED)) {
1086f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            lastTimeContacted = values.getAsLong(People.LAST_TIME_CONTACTED);
1087f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        } else {
1088f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            lastTimeContacted = System.currentTimeMillis();
1089f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1090f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
10915ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
1092b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        long contactId = mDbHelper.getContactId(rawContactId);
1093d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov        if (contactId != 0) {
1094ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton            mContactsProvider.updateContactLastContactedTime(contactId, lastTimeContacted);
1095f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1096ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton
1097ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton        mLastTimeContactedUpdate.bindLong(1, lastTimeContacted);
1098ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton        mLastTimeContactedUpdate.bindLong(2, rawContactId);
1099ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton        mLastTimeContactedUpdate.execute();
1100ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton
1101f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return 1;
1102f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1103f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
11045ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private int updatePhoto(long rawContactId, ContentValues values) {
1105c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1106c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        // TODO check sanctions
1107c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1108c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int count;
1109c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
111067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long dataId = findFirstDataId(rawContactId, Photo.CONTENT_ITEM_TYPE);
1111c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1112c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.clear();
1113c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA);
1114c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.put(Photo.PHOTO, bytes);
1115c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1116c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        if (dataId == -1) {
1117c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE);
11185ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(Data.RAW_CONTACT_ID, rawContactId);
111967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            Uri dataUri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
1120c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            dataId = ContentUris.parseId(dataUri);
1121c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            count = 1;
1122c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        } else {
1123c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            Uri dataUri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
112467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            count = mContactsProvider.updateInTransaction(dataUri, mValues, null, null);
1125c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        }
1126c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1127044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        updateLegacyPhotoData(rawContactId, dataId, values);
1128044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1129044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return count;
1130044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1131044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1132044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updatePhotoByDataId(long dataId, ContentValues values) {
1133044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1134044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mDataRawContactIdQuery.bindLong(1, dataId);
1135044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long rawContactId;
1136044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1137044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        try {
1138044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            rawContactId = mDataRawContactIdQuery.simpleQueryForLong();
1139044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } catch (SQLiteDoneException e) {
1140044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            // Data row not found
1141044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            return 0;
1142044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1143044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1144044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (values.containsKey(android.provider.Contacts.Photos.DATA)) {
1145044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA);
1146044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mValues.clear();
1147044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mValues.put(Photo.PHOTO, bytes);
1148044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1149044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    Data._ID + "=" + dataId, null);
1150044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1151044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1152044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        updateLegacyPhotoData(rawContactId, dataId, values);
1153044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1154044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return 1;
1155044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1156044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1157044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void updateLegacyPhotoData(long rawContactId, long dataId, ContentValues values) {
1158c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.clear();
1159b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, LegacyPhotoData.LOCAL_VERSION,
1160c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.LOCAL_VERSION);
1161b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, LegacyPhotoData.DOWNLOAD_REQUIRED,
1162c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.DOWNLOAD_REQUIRED);
1163b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, LegacyPhotoData.EXISTS_ON_SERVER,
1164c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.EXISTS_ON_SERVER);
1165b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, LegacyPhotoData.SYNC_ERROR,
1166c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.SYNC_ERROR);
1167c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
116867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int updated = mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1169c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                Data.MIMETYPE + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'"
11705ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Data.RAW_CONTACT_ID + "=" + rawContactId
1171c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AND " + LegacyPhotoData.PHOTO_DATA_ID + "=" + dataId, null);
1172c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        if (updated == 0) {
11735ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(Data.RAW_CONTACT_ID, rawContactId);
1174c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(Data.MIMETYPE, LegacyPhotoData.CONTENT_ITEM_TYPE);
1175c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(LegacyPhotoData.PHOTO_DATA_ID, dataId);
117667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
1177c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        }
1178044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1179c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1180044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parsePeopleValues(ContentValues values) {
1181044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1182044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues2.clear();
1183044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues3.clear();
1184044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1185b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, RawContacts.CUSTOM_RINGTONE,
1186044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.CUSTOM_RINGTONE);
1187b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, RawContacts.SEND_TO_VOICEMAIL,
1188044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.SEND_TO_VOICEMAIL);
1189b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, RawContacts.LAST_TIME_CONTACTED,
1190044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.LAST_TIME_CONTACTED);
1191b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, RawContacts.TIMES_CONTACTED,
1192044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.TIMES_CONTACTED);
1193b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, RawContacts.STARRED,
1194044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.STARRED);
1195044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(RawContacts.ACCOUNT_NAME, mAccount.name);
1196044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(RawContacts.ACCOUNT_TYPE, mAccount.type);
1197044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1198044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (values.containsKey(People.NAME) || values.containsKey(People.PHONETIC_NAME)) {
1199044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mValues2.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
1200b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov            ContactsDatabaseHelper.copyStringValue(mValues2, StructuredName.DISPLAY_NAME,
1201044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    values, People.NAME);
1202044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            if (values.containsKey(People.PHONETIC_NAME)) {
1203044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                String phoneticName = values.getAsString(People.PHONETIC_NAME);
1204044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                NameSplitter.Name parsedName = new NameSplitter.Name();
1205044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mPhoneticNameSplitter.split(parsedName, phoneticName);
1206044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues2.put(StructuredName.PHONETIC_GIVEN_NAME, parsedName.getGivenNames());
1207044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues2.put(StructuredName.PHONETIC_MIDDLE_NAME, parsedName.getMiddleName());
1208044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues2.put(StructuredName.PHONETIC_FAMILY_NAME, parsedName.getFamilyName());
1209044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1210044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1211044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1212044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (values.containsKey(People.NOTES)) {
1213044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mValues3.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE);
1214b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov            ContactsDatabaseHelper.copyStringValue(mValues3, Note.NOTE, values, People.NOTES);
1215044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1216044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1217044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1218044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parseOrganizationValues(ContentValues values) {
1219044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1220044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1221044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
1222044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1223b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, Data.IS_PRIMARY,
1224044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.ISPRIMARY);
1225044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1226b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, Organization.COMPANY,
1227044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.COMPANY);
1228044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1229044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        // TYPE values happen to remain the same between V1 and V2 - can just copy the value
1230b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, Organization.TYPE,
1231044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.TYPE);
1232044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1233b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, Organization.LABEL,
1234044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.LABEL);
1235b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, Organization.TITLE,
1236044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.TITLE);
1237044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1238044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1239044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parsePhoneValues(ContentValues values) {
1240044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1241044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1242044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
1243044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1244b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, Data.IS_PRIMARY,
1245044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Phones.ISPRIMARY);
1246044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1247b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, Phone.NUMBER,
1248044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Phones.NUMBER);
1249044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1250044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        // TYPE values happen to remain the same between V1 and V2 - can just copy the value
1251b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, Phone.TYPE,
1252044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Phones.TYPE);
1253044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1254b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, Phone.LABEL,
1255044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Phones.LABEL);
1256044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1257044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1258044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parseContactMethodValues(int kind, ContentValues values) {
1259044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1260044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1261b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, Data.IS_PRIMARY, values,
1262b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                ContactMethods.ISPRIMARY);
1263044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1264044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        switch (kind) {
1265044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case android.provider.Contacts.KIND_EMAIL: {
1266044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                copyCommonFields(values, Email.CONTENT_ITEM_TYPE, Email.TYPE, Email.LABEL,
1267044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                        Data.DATA14);
1268b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                ContactsDatabaseHelper.copyStringValue(mValues, Email.DATA, values,
1269b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                        ContactMethods.DATA);
1270044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1271044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1272044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1273044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case android.provider.Contacts.KIND_IM: {
1274044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                String protocol = values.getAsString(ContactMethods.DATA);
1275044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                if (protocol.startsWith("pre:")) {
1276044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    mValues.put(Im.PROTOCOL, Integer.parseInt(protocol.substring(4)));
1277044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                } else if (protocol.startsWith("custom:")) {
1278044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    mValues.put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM);
1279044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    mValues.put(Im.CUSTOM_PROTOCOL, protocol.substring(7));
1280044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                }
1281044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1282044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                copyCommonFields(values, Im.CONTENT_ITEM_TYPE, Im.TYPE, Im.LABEL, Data.DATA14);
1283044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1284044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1285044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1286044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case android.provider.Contacts.KIND_POSTAL: {
1287044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                copyCommonFields(values, StructuredPostal.CONTENT_ITEM_TYPE, StructuredPostal.TYPE,
1288044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                        StructuredPostal.LABEL, Data.DATA14);
1289b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                ContactsDatabaseHelper.copyStringValue(mValues, StructuredPostal.FORMATTED_ADDRESS,
1290b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                        values, ContactMethods.DATA);
1291044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1292044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1293044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1294044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1295044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1296044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void copyCommonFields(ContentValues values, String mimeType, String typeColumn,
1297044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            String labelColumn, String auxDataColumn) {
1298044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(Data.MIMETYPE, mimeType);
1299b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, typeColumn, values,
1300b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                ContactMethods.TYPE);
1301b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, labelColumn, values,
1302b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                ContactMethods.LABEL);
1303b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, auxDataColumn, values,
1304b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                ContactMethods.AUX_DATA);
1305044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1306044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1307044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parseGroupValues(ContentValues values) {
1308044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1309044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1310b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, Groups.TITLE,
1311044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Groups.NAME);
1312b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, Groups.NOTES,
1313044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Groups.NOTES);
1314b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, Groups.SYSTEM_ID,
1315044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Groups.SYSTEM_ID);
1316044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1317044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1318044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parseExtensionValues(ContentValues values) {
1319b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, ExtensionsColumns.NAME,
1320044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.People.Extensions.NAME);
1321b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, ExtensionsColumns.VALUE,
1322044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.People.Extensions.VALUE);
1323c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
1324c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
132567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private Uri findFirstDataRow(long rawContactId, String contentItemType) {
132667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long dataId = findFirstDataId(rawContactId, contentItemType);
132767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (dataId == -1) {
132867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            return null;
132967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
133067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
133167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
133267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
133367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
133467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private long findFirstDataId(long rawContactId, String mimeType) {
133567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long dataId = -1;
133667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Cursor c = mContactsProvider.query(Data.CONTENT_URI, IdQuery.COLUMNS,
133767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                Data.RAW_CONTACT_ID + "=" + rawContactId + " AND "
133867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                        + Data.MIMETYPE + "='" + mimeType + "'",
133967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                null, null);
134067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        try {
134167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            if (c.moveToFirst()) {
134267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                dataId = c.getLong(IdQuery._ID);
134367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
134467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        } finally {
134567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            c.close();
134667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
134767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return dataId;
134867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
134967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
1350044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
13513cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    public int delete(Uri uri, String selection, String[] selectionArgs) {
1352044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Cursor c = query(uri, IdQuery.COLUMNS, selection, selectionArgs, null, null);
1353044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (c == null) {
1354044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            return 0;
1355044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1356044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1357044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        int count = 0;
1358044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        try {
1359044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            while (c.moveToNext()) {
1360044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                long id = c.getLong(IdQuery._ID);
1361044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count += delete(uri, id);
1362044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1363044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } finally {
1364044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            c.close();
1365044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1366044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1367044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return count;
1368044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1369044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1370044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public int delete(Uri uri, long id) {
13713cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        final int match = sUriMatcher.match(uri);
13723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        int count = 0;
13733cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        switch (match) {
1374044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PEOPLE:
137533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case PEOPLE_ID:
137633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                count = mContactsProvider.deleteRawContact(ContentUris.parseId(uri), false);
137733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                break;
137833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov
1379044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PEOPLE_PHOTO:
1380044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues.clear();
1381044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues.putNull(android.provider.Contacts.Photos.DATA);
1382044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                updatePhoto(id, mValues);
1383044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1384044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1385044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case ORGANIZATIONS:
13863cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS_ID:
1387e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1388e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        ORGANIZATION_MIME_TYPES);
1389e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1390e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1391044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case CONTACTMETHODS:
1392e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS_ID:
1393e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1394e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        CONTACT_METHOD_MIME_TYPES);
1395e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1396e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1397044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1398044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHONES:
1399e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES_ID:
1400e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1401e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        PHONE_MIME_TYPES);
14023cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
14033cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
1404044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case EXTENSIONS:
1405044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case EXTENSIONS_ID:
1406044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1407044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                        EXTENSION_MIME_TYPES);
1408044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1409044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1410044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS:
1411044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS_ID:
1412044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = mContactsProvider.deleteData(ContentUris.parseId(uri),
1413044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                        PHOTO_MIME_TYPES);
1414044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1415044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1416044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
14173cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            default:
14183cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                throw new UnsupportedOperationException("Unknown uri: " + uri);
14193cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        }
14203cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
14213cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        return count;
14223cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    }
14233cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
1424f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
1425c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            String sortOrder, String limit) {
1426caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        ensureDefaultAccount();
1427caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
1428b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        final SQLiteDatabase db = mDbHelper.getReadableDatabase();
1429f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
1430f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        String groupBy = null;
1431f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1432f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final int match = sUriMatcher.match(uri);
1433f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch (match) {
1434f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE: {
143570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1436f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
143767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1438f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
1439f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            }
1440f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1441f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE_ID:
144270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1443f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
144467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1445caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + People._ID + "=");
1446f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1447f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
1448f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1449445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov            case PEOPLE_FILTER: {
1450445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1451445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
145267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1453445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                String filterParam = uri.getPathSegments().get(2);
1454caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + People._ID + " IN "
14555ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + mContactsProvider.getRawContactsByFilterAsNestedQuery(filterParam));
1456445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                break;
1457445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov            }
1458445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov
145971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov            case GROUP_NAME_MEMBERS:
146071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
146171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
146271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                applyRawContactsAccount(qb);
146371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                String group = uri.getPathSegments().get(2);
146471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                qb.appendWhere(" AND " + buildGroupNameMatchWhereClause(group));
146571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                break;
146671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
14673cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS:
14685dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.ORGANIZATIONS + " organizations");
1469d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sOrganizationProjectionMap);
147067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
14713cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
14723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
14733cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS_ID:
14745dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.ORGANIZATIONS + " organizations");
14753cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                qb.setProjectionMap(sOrganizationProjectionMap);
147667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1477d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Organizations._ID + "=");
1478e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1479e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1480e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1481e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS:
14825dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1483d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
148467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1485e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1486e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1487e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS_ID:
14885dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1489e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
149067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1491d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods._ID + "=");
1492e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1493e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1494e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1495bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov            case CONTACTMETHODS_EMAIL:
1496bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1497bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
1498bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                applyRawContactsAccount(qb);
1499bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + "="
1500bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                        + android.provider.Contacts.KIND_EMAIL);
1501bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                break;
1502bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov
1503e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS:
15045dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1505e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
150667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1507d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "=");
1508e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1509e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL");
1510e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1511e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1512e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS_ID:
15135dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1514e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
151567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1516d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "=");
1517e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1518d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods._ID + "=");
1519e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
1520e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL");
1521e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1522e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1523e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES:
15245dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1525d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
152667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1527e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1528e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1529e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES_ID:
15305dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1531e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
153267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1533d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "=");
1534e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1535e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1536e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1537fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov            case PHONES_FILTER:
15385dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1539fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
154067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1541fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                if (uri.getPathSegments().size() > 2) {
1542fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                    String filterParam = uri.getLastPathSegment();
1543e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov                    qb.appendWhere(" AND person =");
1544b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                    qb.appendWhere(mDbHelper.buildPhoneLookupAsNestedQuery(filterParam));
1545fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                }
1546fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                break;
1547fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
1548e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_PHONES:
15495dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1550e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
155167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1552d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "=");
1553e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1554e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1555e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1556e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_PHONES_ID:
15575dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1558e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
155967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1560d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "=");
15613cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1562d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "=");
1563e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
15643cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
15653cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
15660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS:
15675dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
1568d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
156967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
15700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
15710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
15720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS_ID:
15735dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
15740f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
157567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1576d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "=");
15770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
15780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
15790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
15800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_EXTENSIONS:
15815dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
15820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
158367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1584d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "=");
15850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
15860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
15870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
15880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_EXTENSIONS_ID:
15895dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
15900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
159167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1592d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "=");
15930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1594d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "=");
15950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
15960f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
15970f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
15980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS:
15995dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUPS + " groups");
16000f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupProjectionMap);
160167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyGroupAccount(qb);
16020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
16030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
16040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS_ID:
16055dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUPS + " groups");
16060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupProjectionMap);
160767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyGroupAccount(qb);
1608caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Groups._ID + "=");
16090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
16100f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
16110f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
16120f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP:
16135dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
1614d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
161567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
16160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
16170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
16180f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP_ID:
16195dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
16200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
162167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1622d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "=");
16230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
16240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
16250f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
16260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_GROUPMEMBERSHIP:
16275dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
16280f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
162967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1630d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "=");
16310f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
16320f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
16330f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
16340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_GROUPMEMBERSHIP_ID:
16355dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
16360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
163767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1638d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "=");
16390f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1640d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "=");
16410f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
16420f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
16430f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
1644c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PEOPLE_PHOTO:
16455dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHOTOS + " photos");
1646c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.setProjectionMap(sPhotoProjectionMap);
164767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1648c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Photos.PERSON_ID + "=");
1649c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1650c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                limit = "1";
1651c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
1652c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1653044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS:
1654044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.setTables(LegacyTables.PHOTOS + " photos");
1655044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.setProjectionMap(sPhotoProjectionMap);
1656044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                applyRawContactsAccount(qb);
1657044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1658044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1659044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS_ID:
1660044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.setTables(LegacyTables.PHOTOS + " photos");
1661044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.setProjectionMap(sPhotoProjectionMap);
1662044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                applyRawContactsAccount(qb);
1663044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Photos._ID + "=");
1664044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1665044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1666044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1667c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            case SEARCH_SUGGESTIONS:
1668c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
1669c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                // No legacy compatibility for search suggestions
1670a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                return mGlobalSearchSupport.handleSearchSuggestionsQuery(db, uri, limit);
1671c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
1672b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov            case SEARCH_SHORTCUT: {
1673b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov                long contactId = ContentUris.parseId(uri);
1674b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov                return mGlobalSearchSupport.handleSearchShortcutRefresh(db, contactId, projection);
1675b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov            }
1676b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov
16771b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE:
16781b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_URI,
16791b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
16801b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
16811b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE_WITH_PHONES:
16821b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_WITH_PHONES_URI,
16831b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
16841b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
16851b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE_FAVORITES:
16861b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_FAVORITES_URI,
16871b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
16881b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
16891b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE_GROUP_NAME:
16901b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(Uri.withAppendedPath(LIVE_FOLDERS_CONTACTS_URI,
16911b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        Uri.encode(uri.getLastPathSegment())),
16921b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
16931b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
169433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case DELETED_PEOPLE:
169533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case DELETED_GROUPS:
169633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                throw new UnsupportedOperationException();
169733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov
1698f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            default:
1699f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                throw new IllegalArgumentException("Unknown URL " + uri);
1700f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1701f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1702f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // Perform the query and set the notification uri
1703f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final Cursor c = qb.query(db, projection, selection, selectionArgs,
1704f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                groupBy, null, sortOrder, limit);
1705f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (c != null) {
17063fe48cf2c81f6e89b78e919661e2b0b828a2144eDmitri Plotnikov            c.setNotificationUri(mContext.getContentResolver(),
17073fe48cf2c81f6e89b78e919661e2b0b828a2144eDmitri Plotnikov                    android.provider.Contacts.CONTENT_URI);
1708f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1709f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return c;
1710f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1711f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
171267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void applyRawContactsAccount(SQLiteQueryBuilder qb) {
1713caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        StringBuilder sb = new StringBuilder();
171467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        appendRawContactsAccount(sb);
171567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        qb.appendWhere(sb.toString());
171667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
171767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
171867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void appendRawContactsAccount(StringBuilder sb) {
1719caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(RawContacts.ACCOUNT_NAME + "=");
1720df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.name);
1721caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(" AND " + RawContacts.ACCOUNT_TYPE + "=");
1722df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.type);
1723caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
1724caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
172567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void applyGroupAccount(SQLiteQueryBuilder qb) {
1726caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        StringBuilder sb = new StringBuilder();
172767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        appendGroupAccount(sb);
172867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        qb.appendWhere(sb.toString());
172967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
173067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
173167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void appendGroupAccount(StringBuilder sb) {
1732caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(Groups.ACCOUNT_NAME + "=");
1733df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.name);
1734caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        sb.append(" AND " + Groups.ACCOUNT_TYPE + "=");
1735df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana        DatabaseUtils.appendEscapedSQLString(sb, mAccount.type);
1736caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
1737caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
1738f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    /**
173971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     * Build a WHERE clause that restricts the query to match people that are a member of
174071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     * a group with a particular name. The projection map of the query must include
174171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     * {@link People#_ID}.
174271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     *
174371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     * @param groupName The name of the group
174471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     * @return The where clause.
174571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     */
174671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    private String buildGroupNameMatchWhereClause(String groupName) {
174771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        return "people._id IN "
174871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                + "(SELECT " + DataColumns.CONCRETE_RAW_CONTACT_ID
174971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                + " FROM " + Tables.DATA_JOIN_MIMETYPES
175071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                + " WHERE " + Data.MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE
175171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                        + "' AND " + GroupMembership.GROUP_ROW_ID + "="
175271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                                + "(SELECT " + Tables.GROUPS + "." + Groups._ID
175371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                                + " FROM " + Tables.GROUPS
175471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                                + " WHERE " + Groups.TITLE + "="
175571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                                        + DatabaseUtils.sqlEscapeString(groupName) + "))";
175671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    }
175771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
175871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    /**
1759f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     * Called when a change has been made.
1760f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     *
1761f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     * @param uri the uri that the change was made to
1762f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     */
1763f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private void onChange(Uri uri) {
1764f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContext.getContentResolver().notifyChange(android.provider.Contacts.CONTENT_URI, null);
1765f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
176661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
176761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    public String getType(Uri uri) {
176861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        int match = sUriMatcher.match(uri);
176961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        switch (match) {
177061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case EXTENSIONS:
177161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_EXTENSIONS:
177261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return Extensions.CONTENT_TYPE;
177361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case EXTENSIONS_ID:
177461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_EXTENSIONS_ID:
177561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return Extensions.CONTENT_ITEM_TYPE;
177661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE:
177761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/person";
177861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_ID:
177961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/person";
178061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_PHONES:
178161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/phone";
178261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_PHONES_ID:
178361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/phone";
178461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_CONTACTMETHODS:
178561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/contact-methods";
178661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_CONTACTMETHODS_ID:
178761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return getContactMethodType(uri);
178861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHONES:
178961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/phone";
179061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHONES_ID:
179161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/phone";
179261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHONES_FILTER:
179361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/phone";
179461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHOTOS_ID:
179561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/photo";
179661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHOTOS:
179761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/photo";
179861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_PHOTO:
179961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/photo";
180061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case CONTACTMETHODS:
180161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/contact-methods";
180261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case CONTACTMETHODS_ID:
180361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return getContactMethodType(uri);
180461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case ORGANIZATIONS:
180561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/organizations";
180661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case ORGANIZATIONS_ID:
180761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/organization";
180861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case SEARCH_SUGGESTIONS:
180961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return SearchManager.SUGGEST_MIME_TYPE;
181061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case SEARCH_SHORTCUT:
181161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return SearchManager.SHORTCUT_MIME_TYPE;
181261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            default:
181361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                throw new IllegalArgumentException("Unknown URI");
181461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        }
181561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    }
181661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
181761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    private String getContactMethodType(Uri url) {
181861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        String mime = null;
181961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
182061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        Cursor c = query(url, new String[] {ContactMethods.KIND}, null, null, null, null);
182161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        if (c != null) {
182261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            try {
182361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                if (c.moveToFirst()) {
182461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                    int kind = c.getInt(0);
182561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                    switch (kind) {
18261b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                    case android.provider.Contacts.KIND_EMAIL:
182761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        mime = "vnd.android.cursor.item/email";
182861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        break;
182961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
18301b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                    case android.provider.Contacts.KIND_IM:
183161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        mime = "vnd.android.cursor.item/jabber-im";
183261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        break;
183361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
18341b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                    case android.provider.Contacts.KIND_POSTAL:
183561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        mime = "vnd.android.cursor.item/postal-address";
183661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        break;
183761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                    }
183861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                }
183961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            } finally {
184061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                c.close();
184161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            }
184261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        }
184361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        return mime;
184461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    }
1845f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov}
1846