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
18caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikovimport android.accounts.Account;
19c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.app.SearchManager;
20f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentUris;
21f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentValues;
22f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.Context;
23f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.UriMatcher;
24f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.Cursor;
25e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.database.DatabaseUtils;
261c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikovimport android.database.SQLException;
27f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteDatabase;
28044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikovimport android.database.sqlite.SQLiteDoneException;
29f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteQueryBuilder;
30f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteStatement;
31f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.net.Uri;
3267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikovimport android.provider.BaseColumns;
33e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.Contacts.ContactMethods;
3461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikovimport android.provider.Contacts.Extensions;
35f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.Contacts.People;
3642c817741879588db9014739f4dc194621e97381Dmitri Plotnikovimport android.provider.ContactsContract;
37e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email;
380f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership;
39e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im;
40f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Note;
413cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization;
42e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone;
43c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo;
44f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName;
4567dde51ab932dc84d95a203b113989b13437f13dJeff Sharkeyimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
4642c817741879588db9014739f4dc194621e97381Dmitri Plotnikovimport android.provider.ContactsContract.Contacts;
4742c817741879588db9014739f4dc194621e97381Dmitri Plotnikovimport android.provider.ContactsContract.Data;
4842c817741879588db9014739f4dc194621e97381Dmitri Plotnikovimport android.provider.ContactsContract.Groups;
4942c817741879588db9014739f4dc194621e97381Dmitri Plotnikovimport android.provider.ContactsContract.RawContacts;
5042c817741879588db9014739f4dc194621e97381Dmitri Plotnikovimport android.provider.ContactsContract.Settings;
5142c817741879588db9014739f4dc194621e97381Dmitri Plotnikovimport android.provider.ContactsContract.StatusUpdates;
52155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikovimport android.text.TextUtils;
53b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamiltonimport android.util.Log;
54f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
5538210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.AccountsColumns;
5638210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.DataColumns;
5738210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.ExtensionsColumns;
5838210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.GroupsColumns;
5938210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.MimetypesColumns;
6038210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.NameLookupColumns;
6138210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.NameLookupType;
6238210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.PhoneLookupColumns;
6338210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.PresenceColumns;
6438210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.RawContactsColumns;
6538210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.StatusUpdatesColumns;
6638210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper.Tables;
6738210445730ee04c351c7cc1b3800cfe23e34325Makoto Onuki
68f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport java.util.HashMap;
69622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkeyimport java.util.Locale;
70f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
711c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov@SuppressWarnings("deprecation")
72b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamiltonpublic class LegacyApiSupport {
73f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
74caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private static final String TAG = "ContactsProviderV1";
75caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
76f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
77f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
78f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE = 1;
79f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE_ID = 2;
80f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final int PEOPLE_UPDATE_CONTACT_TIME = 3;
813cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final int ORGANIZATIONS = 4;
823cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final int ORGANIZATIONS_ID = 5;
83e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_CONTACTMETHODS = 6;
84e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_CONTACTMETHODS_ID = 7;
85e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int CONTACTMETHODS = 8;
86e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int CONTACTMETHODS_ID = 9;
87e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_PHONES = 10;
88e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PEOPLE_PHONES_ID = 11;
89e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PHONES = 12;
90e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final int PHONES_ID = 13;
910f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int EXTENSIONS = 14;
920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int EXTENSIONS_ID = 15;
930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_EXTENSIONS = 16;
940f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_EXTENSIONS_ID = 17;
950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPS = 18;
960f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPS_ID = 19;
970f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPMEMBERSHIP = 20;
980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int GROUPMEMBERSHIP_ID = 21;
990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_GROUPMEMBERSHIP = 22;
1000f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final int PEOPLE_GROUPMEMBERSHIP_ID = 23;
101c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PEOPLE_PHOTO = 24;
102c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PHOTOS = 25;
103c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final int PHOTOS_ID = 26;
104445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov    private static final int PEOPLE_FILTER = 29;
10533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov    private static final int DELETED_PEOPLE = 30;
10633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov    private static final int DELETED_GROUPS = 31;
107c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    private static final int SEARCH_SUGGESTIONS = 32;
108b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov    private static final int SEARCH_SHORTCUT = 33;
109b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov    private static final int PHONES_FILTER = 34;
1101b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final int LIVE_FOLDERS_PEOPLE = 35;
1111b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final int LIVE_FOLDERS_PEOPLE_GROUP_NAME = 36;
1121b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final int LIVE_FOLDERS_PEOPLE_WITH_PHONES = 37;
1131b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final int LIVE_FOLDERS_PEOPLE_FAVORITES = 38;
114bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov    private static final int CONTACTMETHODS_EMAIL = 39;
11571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    private static final int GROUP_NAME_MEMBERS = 40;
1163b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov    private static final int GROUP_SYSTEM_ID_MEMBERS = 41;
1173b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov    private static final int PEOPLE_ORGANIZATIONS = 42;
1183b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov    private static final int PEOPLE_ORGANIZATIONS_ID = 43;
1191c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    private static final int SETTINGS = 44;
120c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
121e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String PEOPLE_JOINS =
1229d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki            " JOIN " + Tables.ACCOUNTS + " ON ("
1239d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki                + RawContactsColumns.CONCRETE_ACCOUNT_ID + "=" + AccountsColumns.CONCRETE_ID + ")"
1249d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki            + " LEFT OUTER JOIN data name ON (raw_contacts._id = name.raw_contact_id"
125e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = name.mimetype_id)"
126e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + StructuredName.CONTENT_ITEM_TYPE + "')"
1275ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data organization ON (raw_contacts._id = organization.raw_contact_id"
128e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = organization.mimetype_id)"
129e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Organization.CONTENT_ITEM_TYPE + "' AND organization.is_primary)"
1305ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data email ON (raw_contacts._id = email.raw_contact_id"
131e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = email.mimetype_id)"
132e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Email.CONTENT_ITEM_TYPE + "' AND email.is_primary)"
1335ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data note ON (raw_contacts._id = note.raw_contact_id"
134e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = note.mimetype_id)"
135e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Note.CONTENT_ITEM_TYPE + "')"
1365ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " LEFT OUTER JOIN data phone ON (raw_contacts._id = phone.raw_contact_id"
137e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = phone.mimetype_id)"
138e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + "='" + Phone.CONTENT_ITEM_TYPE + "' AND phone.is_primary)";
139e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
140d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    public static final String DATA_JOINS =
141d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            " JOIN mimetypes ON (mimetypes._id = data.mimetype_id)"
1425ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            + " JOIN raw_contacts ON (raw_contacts._id = data.raw_contact_id)"
143d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            + PEOPLE_JOINS;
144d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
14570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    public static final String PRESENCE_JOINS =
1460a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov            " LEFT OUTER JOIN " + Tables.PRESENCE +
1470a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov            " ON (" + Tables.PRESENCE + "." + StatusUpdates.DATA_ID + "=" +
1480a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov                    "(SELECT MAX(" + StatusUpdates.DATA_ID + ")" +
1490a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov                    " FROM " + Tables.PRESENCE +
1500a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov                    " WHERE people._id = " + PresenceColumns.RAW_CONTACT_ID + ")" +
1510a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov            " )";
15270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov
153e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String PHONETIC_NAME_SQL = "trim(trim("
154e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_GIVEN_NAME + ",' ')||' '||"
155e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_MIDDLE_NAME + ",' '))||' '||"
156e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            + "ifnull(name." + StructuredName.PHONETIC_FAMILY_NAME + ",' ')) ";
157e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
158e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String CONTACT_METHOD_KIND_SQL =
159d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov            "CAST ((CASE WHEN mimetype='" + Email.CONTENT_ITEM_TYPE + "'"
160e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                + " THEN " + android.provider.Contacts.KIND_EMAIL
161e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                + " ELSE"
162e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                    + " (CASE WHEN mimetype='" + Im.CONTENT_ITEM_TYPE +"'"
163e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " THEN " + android.provider.Contacts.KIND_IM
164e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " ELSE"
16567dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey                        + " (CASE WHEN mimetype='" + StructuredPostal.CONTENT_ITEM_TYPE + "'"
166e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " THEN "  + android.provider.Contacts.KIND_POSTAL
167e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " ELSE"
168e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                                + " NULL"
169e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                            + " END)"
170e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                        + " END)"
171d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                + " END) AS INTEGER)";
172f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
17397f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov    private static final String IM_PROTOCOL_SQL =
17482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov            "(CASE WHEN " + StatusUpdates.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM
17582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov                + " THEN 'custom:'||" + StatusUpdates.CUSTOM_PROTOCOL
17682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov                + " ELSE 'pre:'||" + StatusUpdates.PROTOCOL
17797f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " END)";
17897f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov
17997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov    private static String CONTACT_METHOD_DATA_SQL =
18097f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov            "(CASE WHEN " + Data.MIMETYPE + "='" + Im.CONTENT_ITEM_TYPE + "'"
18197f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " THEN (CASE WHEN " + Tables.DATA + "." + Im.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM
18297f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                    + " THEN 'custom:'||" + Tables.DATA + "." + Im.CUSTOM_PROTOCOL
18397f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                    + " ELSE 'pre:'||" + Tables.DATA + "." + Im.PROTOCOL
18497f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                    + " END)"
185f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                + " ELSE " + Tables.DATA + "." + Email.DATA
18697f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                + " END)";
18797f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov
1881b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final Uri LIVE_FOLDERS_CONTACTS_URI = Uri.withAppendedPath(
1891b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            ContactsContract.AUTHORITY_URI, "live_folders/contacts");
1901b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
1911b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final Uri LIVE_FOLDERS_CONTACTS_WITH_PHONES_URI = Uri.withAppendedPath(
1921b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            ContactsContract.AUTHORITY_URI, "live_folders/contacts_with_phones");
1931b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
1941b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov    private static final Uri LIVE_FOLDERS_CONTACTS_FAVORITES_URI = Uri.withAppendedPath(
1951b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            ContactsContract.AUTHORITY_URI, "live_folders/favorites");
19697f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov
1976e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori    private static final String CONTACTS_UPDATE_LASTTIMECONTACTED =
1986e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori            "UPDATE " + Tables.CONTACTS +
1996e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori            " SET " + Contacts.LAST_TIME_CONTACTED + "=? " +
2006e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori            "WHERE " + Contacts._ID + "=?";
2016e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori    private static final String RAWCONTACTS_UPDATE_LASTTIMECONTACTED =
2026e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori            "UPDATE " + Tables.RAW_CONTACTS + " SET "
2036e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori            + RawContacts.LAST_TIME_CONTACTED + "=? WHERE "
2046e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori            + RawContacts._ID + "=?";
2056e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori
2066e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori    private String[] mSelectionArgs1 = new String[1];
2076e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori    private String[] mSelectionArgs2 = new String[2];
2086e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori
209f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public interface LegacyTables {
210d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String PEOPLE = "view_v1_people";
2115dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov        public static final String PEOPLE_JOIN_PRESENCE = "view_v1_people people " + PRESENCE_JOINS;
212d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String GROUPS = "view_v1_groups";
213d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String ORGANIZATIONS = "view_v1_organizations";
214d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String CONTACT_METHODS = "view_v1_contact_methods";
215d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String PHONES = "view_v1_phones";
216d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String EXTENSIONS = "view_v1_extensions";
217d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        public static final String GROUP_MEMBERSHIP = "view_v1_group_membership";
218c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String PHOTOS = "view_v1_photos";
2191c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        public static final String SETTINGS = "v1_settings";
220f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
221f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
222e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] ORGANIZATION_MIME_TYPES = new String[] {
223e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Organization.CONTENT_ITEM_TYPE
224e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
225e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
226e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] CONTACT_METHOD_MIME_TYPES = new String[] {
227e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Email.CONTENT_ITEM_TYPE,
228e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Im.CONTENT_ITEM_TYPE,
22967dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey        StructuredPostal.CONTENT_ITEM_TYPE,
230e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
231e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
232e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final String[] PHONE_MIME_TYPES = new String[] {
233e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Phone.CONTENT_ITEM_TYPE
234e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    };
235e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
236044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private static final String[] PHOTO_MIME_TYPES = new String[] {
237044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Photo.CONTENT_ITEM_TYPE
238044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    };
239044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
2401c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    private static final String[] GROUP_MEMBERSHIP_MIME_TYPES = new String[] {
2411c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        GroupMembership.CONTENT_ITEM_TYPE
2421c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    };
2431c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
244044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private static final String[] EXTENSION_MIME_TYPES = new String[] {
245044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE
246044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    };
247044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
24867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private interface IdQuery {
24967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        String[] COLUMNS = { BaseColumns._ID };
250c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
251c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int _ID = 0;
252c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
253c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
254c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    /**
255c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     * A custom data row that is used to store legacy photo data fields no
256c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     * longer directly supported by the API.
257c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov     */
258c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private interface LegacyPhotoData {
259c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/photo_v1_extras";
260c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
261c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String PHOTO_DATA_ID = Data.DATA1;
262c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String LOCAL_VERSION = Data.DATA2;
263c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String DOWNLOAD_REQUIRED = Data.DATA3;
264c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String EXISTS_ON_SERVER = Data.DATA4;
265c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        public static final String SYNC_ERROR = Data.DATA5;
266c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
267c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
268c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    public static final String LEGACY_PHOTO_JOIN =
2695ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            " LEFT OUTER JOIN data legacy_photo ON (raw_contacts._id = legacy_photo.raw_contact_id"
270c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = legacy_photo.mimetype_id)"
271c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'"
272c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + " AND " + DataColumns.CONCRETE_ID + " = legacy_photo." + LegacyPhotoData.PHOTO_DATA_ID
273c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            + ")";
274c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
275f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final HashMap<String, String> sPeopleProjectionMap;
2763cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private static final HashMap<String, String> sOrganizationProjectionMap;
277e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final HashMap<String, String> sContactMethodProjectionMap;
278e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private static final HashMap<String, String> sPhoneProjectionMap;
2790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sExtensionProjectionMap;
2800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sGroupProjectionMap;
2810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private static final HashMap<String, String> sGroupMembershipProjectionMap;
282c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    private static final HashMap<String, String> sPhotoProjectionMap;
283fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
284f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    static {
285f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
286f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // Contacts URI matching table
287f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        UriMatcher matcher = sUriMatcher;
288f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
289f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        String authority = android.provider.Contacts.AUTHORITY;
2900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "extensions", EXTENSIONS);
2910f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "extensions/#", EXTENSIONS_ID);
2920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groups", GROUPS);
2930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groups/#", GROUPS_ID);
29471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        matcher.addURI(authority, "groups/name/*/members", GROUP_NAME_MEMBERS);
295f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/name/*/members/filter/*",
296f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                GROUP_NAME_MEMBERS_FILTER);
2973b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov        matcher.addURI(authority, "groups/system_id/*/members", GROUP_SYSTEM_ID_MEMBERS);
298f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groups/system_id/*/members/filter/*",
299f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                GROUP_SYSTEM_ID_MEMBERS_FILTER);
3000f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groupmembership", GROUPMEMBERSHIP);
3010f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "groupmembership/#", GROUPMEMBERSHIP_ID);
302f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "groupmembershipraw", GROUPMEMBERSHIP_RAW);
303f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people", PEOPLE);
304f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/strequent", PEOPLE_STREQUENT);
305f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/strequent/filter/*", PEOPLE_STREQUENT_FILTER);
306445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov        matcher.addURI(authority, "people/filter/*", PEOPLE_FILTER);
307f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/with_phones_filter/*",
308f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_WITH_PHONES_FILTER);
309f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/with_email_or_im_filter/*",
310f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_WITH_EMAIL_OR_IM_FILTER);
311f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people/#", PEOPLE_ID);
3120f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/extensions", PEOPLE_EXTENSIONS);
3130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/extensions/#", PEOPLE_EXTENSIONS_ID);
314e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/phones", PEOPLE_PHONES);
315e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/phones/#", PEOPLE_PHONES_ID);
316f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/phones_with_presence",
317f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_PHONES_WITH_PRESENCE);
318c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "people/#/photo", PEOPLE_PHOTO);
319f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/photo/data", PEOPLE_PHOTO_DATA);
320e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/contact_methods", PEOPLE_CONTACTMETHODS);
321f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/#/contact_methods_with_presence",
322f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PEOPLE_CONTACTMETHODS_WITH_PRESENCE);
323e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID);
324e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov        matcher.addURI(authority, "people/#/organizations", PEOPLE_ORGANIZATIONS);
325e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov        matcher.addURI(authority, "people/#/organizations/#", PEOPLE_ORGANIZATIONS_ID);
3260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/groupmembership", PEOPLE_GROUPMEMBERSHIP);
3270f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        matcher.addURI(authority, "people/#/groupmembership/#", PEOPLE_GROUPMEMBERSHIP_ID);
328f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/raw", PEOPLE_RAW);
329f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "people/owner", PEOPLE_OWNER);
330f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        matcher.addURI(authority, "people/#/update_contact_time",
331f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                PEOPLE_UPDATE_CONTACT_TIME);
33233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov        matcher.addURI(authority, "deleted_people", DELETED_PEOPLE);
33333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov        matcher.addURI(authority, "deleted_groups", DELETED_GROUPS);
334e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "phones", PHONES);
335f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones_with_presence", PHONES_WITH_PRESENCE);
336fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        matcher.addURI(authority, "phones/filter/*", PHONES_FILTER);
337f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones/filter_name/*", PHONES_FILTER_NAME);
338f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "phones/mobile_filter_name/*",
339f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                PHONES_MOBILE_FILTER_NAME);
340e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "phones/#", PHONES_ID);
341c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "photos", PHOTOS);
342c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        matcher.addURI(authority, "photos/#", PHOTOS_ID);
343e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "contact_methods", CONTACTMETHODS);
344bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        matcher.addURI(authority, "contact_methods/email", CONTACTMETHODS_EMAIL);
345f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "contact_methods/email/*", CONTACTMETHODS_EMAIL_FILTER);
346e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        matcher.addURI(authority, "contact_methods/#", CONTACTMETHODS_ID);
347f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "contact_methods/with_presence",
348f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//                CONTACTMETHODS_WITH_PRESENCE);
3493cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        matcher.addURI(authority, "organizations", ORGANIZATIONS);
3503cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        matcher.addURI(authority, "organizations/#", ORGANIZATIONS_ID);
351f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov//        matcher.addURI(authority, "voice_dialer_timestamp", VOICE_DIALER_TIMESTAMP);
352c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY,
353c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                SEARCH_SUGGESTIONS);
354c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY + "/*",
355c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                SEARCH_SUGGESTIONS);
3562d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/*",
357b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov                SEARCH_SHORTCUT);
3581c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        matcher.addURI(authority, "settings", SETTINGS);
3591c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
3601b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/people", LIVE_FOLDERS_PEOPLE);
3611b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/people/*",
3621b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                LIVE_FOLDERS_PEOPLE_GROUP_NAME);
3631b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/people_with_phones",
3641b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                LIVE_FOLDERS_PEOPLE_WITH_PHONES);
3651b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov        matcher.addURI(authority, "live_folders/favorites",
3661b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                LIVE_FOLDERS_PEOPLE_FAVORITES);
367f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
368f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
369e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        HashMap<String, String> peopleProjectionMap = new HashMap<String, String>();
370d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.NAME, People.NAME);
371d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.DISPLAY_NAME, People.DISPLAY_NAME);
372d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.PHONETIC_NAME, People.PHONETIC_NAME);
373d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.NOTES, People.NOTES);
374d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.TIMES_CONTACTED, People.TIMES_CONTACTED);
375d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.LAST_TIME_CONTACTED, People.LAST_TIME_CONTACTED);
376d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.CUSTOM_RINGTONE, People.CUSTOM_RINGTONE);
377d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.SEND_TO_VOICEMAIL, People.SEND_TO_VOICEMAIL);
378d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        peopleProjectionMap.put(People.STARRED, People.STARRED);
379ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        peopleProjectionMap.put(People.PRIMARY_ORGANIZATION_ID, People.PRIMARY_ORGANIZATION_ID);
380ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        peopleProjectionMap.put(People.PRIMARY_EMAIL_ID, People.PRIMARY_EMAIL_ID);
381ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        peopleProjectionMap.put(People.PRIMARY_PHONE_ID, People.PRIMARY_PHONE_ID);
382e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
383e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPeopleProjectionMap = new HashMap<String, String>(peopleProjectionMap);
3849155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPeopleProjectionMap.put(People._ID, People._ID);
385d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.NUMBER, People.NUMBER);
386d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.TYPE, People.TYPE);
387d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.LABEL, People.LABEL);
388d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sPeopleProjectionMap.put(People.NUMBER_KEY, People.NUMBER_KEY);
3890126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov        sPeopleProjectionMap.put(People.IM_PROTOCOL, IM_PROTOCOL_SQL + " AS " + People.IM_PROTOCOL);
39070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.IM_HANDLE, People.IM_HANDLE);
39170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.IM_ACCOUNT, People.IM_ACCOUNT);
39270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        sPeopleProjectionMap.put(People.PRESENCE_STATUS, People.PRESENCE_STATUS);
393a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov        sPeopleProjectionMap.put(People.PRESENCE_CUSTOM_STATUS,
3940cc388933e698760d4985a7d7be1325f9c8305e9Dmitri Plotnikov                "(SELECT " + StatusUpdates.STATUS +
395a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                " FROM " + Tables.STATUS_UPDATES +
396a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                " JOIN " + Tables.DATA +
397a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                "   ON(" + StatusUpdatesColumns.DATA_ID + "=" + DataColumns.CONCRETE_ID + ")" +
398a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                " WHERE " + DataColumns.CONCRETE_RAW_CONTACT_ID + "=people." + People._ID +
3990cc388933e698760d4985a7d7be1325f9c8305e9Dmitri Plotnikov                " ORDER BY " + StatusUpdates.STATUS_TIMESTAMP + " DESC " +
400a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                " LIMIT 1" +
401a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov                ") AS " + People.PRESENCE_CUSTOM_STATUS);
4023cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
4033cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap = new HashMap<String, String>();
4049155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations._ID,
4059155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Organizations._ID);
4063cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.PERSON_ID,
407d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.PERSON_ID);
4083cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.ISPRIMARY,
409d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.ISPRIMARY);
4103cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.COMPANY,
411d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.COMPANY);
4123cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TYPE,
413d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.TYPE);
4143cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.LABEL,
415d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.LABEL);
4163cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TITLE,
417d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Organizations.TITLE);
418e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
419e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sContactMethodProjectionMap = new HashMap<String, String>(peopleProjectionMap);
4209155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods._ID, ContactMethods._ID);
421d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.PERSON_ID, ContactMethods.PERSON_ID);
422d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.KIND, ContactMethods.KIND);
423d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.ISPRIMARY, ContactMethods.ISPRIMARY);
424d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.TYPE, ContactMethods.TYPE);
425d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.DATA, ContactMethods.DATA);
426d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.LABEL, ContactMethods.LABEL);
427d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        sContactMethodProjectionMap.put(ContactMethods.AUX_DATA, ContactMethods.AUX_DATA);
428e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
429e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap = new HashMap<String, String>(peopleProjectionMap);
4309155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones._ID,
4319155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Phones._ID);
432e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.PERSON_ID,
433d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.PERSON_ID);
434e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.ISPRIMARY,
435d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.ISPRIMARY);
436e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER,
437d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.NUMBER);
438e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.TYPE,
439d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.TYPE);
440e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.LABEL,
441d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.LABEL);
442e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER_KEY,
443d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Phones.NUMBER_KEY);
4440f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
4450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap = new HashMap<String, String>();
4469155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions._ID,
4479155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Extensions._ID);
4480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.PERSON_ID,
449d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.PERSON_ID);
4500f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.NAME,
451d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.NAME);
4520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sExtensionProjectionMap.put(android.provider.Contacts.Extensions.VALUE,
453d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Extensions.VALUE);
4540f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
4550f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap = new HashMap<String, String>();
4560f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups._ID,
457d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups._ID);
4580f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.NAME,
459d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.NAME);
4600f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.NOTES,
461d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.NOTES);
4620f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupProjectionMap.put(android.provider.Contacts.Groups.SYSTEM_ID,
463d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.Groups.SYSTEM_ID);
4640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
465d4b57da3f07bc530db69015d363c61a768a4713aDmitri Plotnikov        sGroupMembershipProjectionMap = new HashMap<String, String>(sGroupProjectionMap);
4669155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership._ID,
4679155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.GroupMembership._ID);
4680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.PERSON_ID,
469d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.GroupMembership.PERSON_ID);
4700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.GROUP_ID,
471d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                android.provider.Contacts.GroupMembership.GROUP_ID);
4721c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        sGroupMembershipProjectionMap.put(
4731c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                android.provider.Contacts.GroupMembership.GROUP_SYNC_ID,
4741c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                android.provider.Contacts.GroupMembership.GROUP_SYNC_ID);
4751c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        sGroupMembershipProjectionMap.put(
4761c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                android.provider.Contacts.GroupMembership.GROUP_SYNC_ACCOUNT,
4771c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                android.provider.Contacts.GroupMembership.GROUP_SYNC_ACCOUNT);
4781c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        sGroupMembershipProjectionMap.put(
4791c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                android.provider.Contacts.GroupMembership.GROUP_SYNC_ACCOUNT_TYPE,
4801c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                android.provider.Contacts.GroupMembership.GROUP_SYNC_ACCOUNT_TYPE);
481c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
482c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap = new HashMap<String, String>();
4839155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos._ID,
4849155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov                android.provider.Contacts.Photos._ID);
485c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.PERSON_ID,
486c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.PERSON_ID);
487c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.DATA,
488c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.DATA);
489c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.LOCAL_VERSION,
490c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.LOCAL_VERSION);
491c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.DOWNLOAD_REQUIRED,
492c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.DOWNLOAD_REQUIRED);
493c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.EXISTS_ON_SERVER,
494c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.EXISTS_ON_SERVER);
495c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        sPhotoProjectionMap.put(android.provider.Contacts.Photos.SYNC_ERROR,
496c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                android.provider.Contacts.Photos.SYNC_ERROR);
497f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
498f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
499f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final Context mContext;
500b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov    private final ContactsDatabaseHelper mDbHelper;
501f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final ContactsProvider2 mContactsProvider;
502f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private final NameSplitter mPhoneticNameSplitter;
503a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov    private final GlobalSearchSupport mGlobalSearchSupport;
504f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
505044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private final SQLiteStatement mDataMimetypeQuery;
506044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private final SQLiteStatement mDataRawContactIdQuery;
5073cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
5083cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private final ContentValues mValues = new ContentValues();
50967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private final ContentValues mValues2 = new ContentValues();
51067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private final ContentValues mValues3 = new ContentValues();
511e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov    private boolean mDefaultAccountKnown;
512caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private Account mAccount;
513a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
5149d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki    private final long mMimetypeEmail;
5159d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki    private final long mMimetypeIm;
5169d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki    private final long mMimetypePostal;
517044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
518e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov
519b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov    public LegacyApiSupport(Context context, ContactsDatabaseHelper contactsDatabaseHelper,
520a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov            ContactsProvider2 contactsProvider, GlobalSearchSupport globalSearchSupport) {
521f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContext = context;
522f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContactsProvider = contactsProvider;
523b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        mDbHelper = contactsDatabaseHelper;
524a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        mGlobalSearchSupport = globalSearchSupport;
525f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
526622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey        mPhoneticNameSplitter = new NameSplitter("", "", "", context
527622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey                .getString(com.android.internal.R.string.common_name_conjunctions), Locale
528622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey                .getDefault());
529f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
530b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        SQLiteDatabase db = mDbHelper.getReadableDatabase();
531044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mDataMimetypeQuery = db.compileStatement(
532044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                "SELECT " + DataColumns.MIMETYPE_ID +
533044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                " FROM " + Tables.DATA +
534044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                " WHERE " + Data._ID + "=?");
535044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
536044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mDataRawContactIdQuery = db.compileStatement(
537044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                "SELECT " + Data.RAW_CONTACT_ID +
538044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                " FROM " + Tables.DATA +
539044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                " WHERE " + Data._ID + "=?");
540044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
541b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        mMimetypeEmail = mDbHelper.getMimeTypeId(Email.CONTENT_ITEM_TYPE);
542b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        mMimetypeIm = mDbHelper.getMimeTypeId(Im.CONTENT_ITEM_TYPE);
543b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        mMimetypePostal = mDbHelper.getMimeTypeId(StructuredPostal.CONTENT_ITEM_TYPE);
544f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
545f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
546caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private void ensureDefaultAccount() {
547e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov        if (!mDefaultAccountKnown) {
548caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov            mAccount = mContactsProvider.getDefaultAccount();
549e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov            mDefaultAccountKnown = true;
550caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        }
551caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
552d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
553b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamilton    public static void createDatabase(SQLiteDatabase db) {
554b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamilton        Log.i(TAG, "Bootstrapping database legacy support");
5551c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        createViews(db);
5561c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        createSettingsTable(db);
5571c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    }
5581c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
5591c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    public static void createViews(SQLiteDatabase db) {
560d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
561ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        String peopleColumns = "name." + StructuredName.DISPLAY_NAME
562d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NAME + ", " +
5635ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME
564d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.DISPLAY_NAME + ", " +
565d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                PHONETIC_NAME_SQL
566d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PHONETIC_NAME + " , " +
567d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "note." + Note.NOTE
568d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NOTES + ", " +
5699d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki                AccountsColumns.CONCRETE_ACCOUNT_NAME + ", " +
5709d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki                AccountsColumns.CONCRETE_ACCOUNT_TYPE + ", " +
5715ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED
572d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.TIMES_CONTACTED + ", " +
5735ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED
574d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.LAST_TIME_CONTACTED + ", " +
5755ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE
576d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.CUSTOM_RINGTONE + ", " +
5775ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL
578d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.SEND_TO_VOICEMAIL + ", " +
5795ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Tables.RAW_CONTACTS + "." + RawContacts.STARRED
580d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.STARRED + ", " +
581d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "organization." + Data._ID
582d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_ORGANIZATION_ID + ", " +
583d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "email." + Data._ID
584d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_EMAIL_ID + ", " +
585d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Data._ID
586d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.PRIMARY_PHONE_ID + ", " +
587d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.NUMBER
588d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.NUMBER + ", " +
589d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.TYPE
590d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.TYPE + ", " +
591d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                "phone." + Phone.LABEL
592d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + People.LABEL + ", " +
59342c817741879588db9014739f4dc194621e97381Dmitri Plotnikov                "_PHONE_NUMBER_STRIPPED_REVERSED(phone." + Phone.NUMBER + ")"
594ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                        + " AS " + People.NUMBER_KEY;
595ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov
596ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PEOPLE + ";");
597ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PEOPLE + " AS SELECT " +
598ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                RawContactsColumns.CONCRETE_ID
599ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                        + " AS " + android.provider.Contacts.People._ID + ", " +
600ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                peopleColumns +
6015ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.RAW_CONTACTS + PEOPLE_JOINS +
602ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann                " WHERE " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0;");
603d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
604d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.ORGANIZATIONS + ";");
605d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.ORGANIZATIONS + " AS SELECT " +
606d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
607d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations._ID + ", " +
6085ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                Data.RAW_CONTACT_ID
609d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.PERSON_ID + ", " +
610d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Data.IS_PRIMARY
611d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.ISPRIMARY + ", " +
6129d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki                AccountsColumns.CONCRETE_ACCOUNT_NAME + ", " +
6139d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki                AccountsColumns.CONCRETE_ACCOUNT_TYPE + ", " +
614d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.COMPANY
615d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.COMPANY + ", " +
616d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.TYPE
617d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.TYPE + ", " +
618d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.LABEL
619d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.LABEL + ", " +
620d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organization.TITLE
621caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Organizations.TITLE +
6225ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS +
623d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
62433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Organization.CONTENT_ITEM_TYPE + "'"
625ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
626d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
627d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
628d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.CONTACT_METHODS + ";");
629d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.CONTACT_METHODS + " AS SELECT " +
630d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
631d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods._ID + ", " +
632d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
633d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.PERSON_ID + ", " +
634d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                CONTACT_METHOD_KIND_SQL
635d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.KIND + ", " +
636d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_IS_PRIMARY
637d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.ISPRIMARY + ", " +
638f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                Tables.DATA + "." + Email.TYPE
639d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.TYPE + ", " +
64097f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov                CONTACT_METHOD_DATA_SQL
641d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.DATA + ", " +
642f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov                Tables.DATA + "." + Email.LABEL
643d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.LABEL + ", " +
644d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_DATA14
645d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + ContactMethods.AUX_DATA + ", " +
646ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                peopleColumns +
647d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS +
64833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                " WHERE " + ContactMethods.KIND + " IS NOT NULL"
649ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann                    + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
650d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
651d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
652d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
653d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHONES + ";");
65442c817741879588db9014739f4dc194621e97381Dmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PHONES + " AS SELECT DISTINCT " +
655d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
656d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones._ID + ", " +
657d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
658d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.PERSON_ID + ", " +
659d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_IS_PRIMARY
660d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.ISPRIMARY + ", " +
661d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.NUMBER
662d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NUMBER + ", " +
663d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.TYPE
664d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.TYPE + ", " +
665d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Tables.DATA + "." + Phone.LABEL
666d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.LABEL + ", " +
66742c817741879588db9014739f4dc194621e97381Dmitri Plotnikov                "_PHONE_NUMBER_STRIPPED_REVERSED(" + Tables.DATA + "." + Phone.NUMBER + ")"
668d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Phones.NUMBER_KEY + ", " +
669ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov                peopleColumns +
67047ab23770b9f010a5e5277cda68267fe0613a1ccDmitri Plotnikov                " FROM " + Tables.DATA
67147ab23770b9f010a5e5277cda68267fe0613a1ccDmitri Plotnikov                        + " JOIN " + Tables.PHONE_LOOKUP
67247ab23770b9f010a5e5277cda68267fe0613a1ccDmitri Plotnikov                        + " ON (" + Tables.DATA + "._id = "
67347ab23770b9f010a5e5277cda68267fe0613a1ccDmitri Plotnikov                                + Tables.PHONE_LOOKUP + "." + PhoneLookupColumns.DATA_ID + ")"
67447ab23770b9f010a5e5277cda68267fe0613a1ccDmitri Plotnikov                        + DATA_JOINS +
675d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
67633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Phone.CONTENT_ITEM_TYPE + "'"
677ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
678d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
679d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
680d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.EXTENSIONS + ";");
681d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.EXTENSIONS + " AS SELECT " +
682d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
683d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions._ID + ", " +
684d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
685d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.PERSON_ID + ", " +
6869d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki                AccountsColumns.CONCRETE_ACCOUNT_NAME + ", " +
6879d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki                AccountsColumns.CONCRETE_ACCOUNT_TYPE + ", " +
688d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                ExtensionsColumns.NAME
689d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.NAME + ", " +
690d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                ExtensionsColumns.VALUE
691caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Extensions.VALUE +
6925ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS +
693d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
69433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE + "'"
695ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
696d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
697d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
698d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUPS + ";");
699d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.GROUPS + " AS SELECT " +
700d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                GroupsColumns.CONCRETE_ID + " AS " + android.provider.Contacts.Groups._ID + ", " +
7019d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki                AccountsColumns.CONCRETE_ACCOUNT_NAME + ", " +
7029d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki                AccountsColumns.CONCRETE_ACCOUNT_TYPE + ", " +
703d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.TITLE + " AS " + android.provider.Contacts.Groups.NAME + ", " +
704d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.NOTES + " AS " + android.provider.Contacts.Groups.NOTES + " , " +
705d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.SYSTEM_ID + " AS " + android.provider.Contacts.Groups.SYSTEM_ID +
706d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " FROM " + Tables.GROUPS +
7079d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki                " JOIN " + Tables.ACCOUNTS + " ON (" +
7089d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki                GroupsColumns.CONCRETE_ACCOUNT_ID + "=" + AccountsColumns.CONCRETE_ID + ")" +
709d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
710d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
711d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUP_MEMBERSHIP + ";");
712d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.GROUP_MEMBERSHIP + " AS SELECT " +
713d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                DataColumns.CONCRETE_ID
714d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership._ID + ", " +
715d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
716d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.PERSON_ID + ", " +
7179d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki                AccountsColumns.CONCRETE_ACCOUNT_NAME + ", " +
7189d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki                AccountsColumns.CONCRETE_ACCOUNT_TYPE + ", " +
719d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                GroupMembership.GROUP_ROW_ID
720d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.GROUP_ID + ", " +
721d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.TITLE
722d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.NAME + ", " +
723d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.NOTES
7241c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.NOTES + ", " +
725d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Groups.SYSTEM_ID
7261c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                        + " AS " + android.provider.Contacts.GroupMembership.SYSTEM_ID + ", " +
7271c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                GroupsColumns.CONCRETE_SOURCE_ID
7281c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                        + " AS "
7291c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                        + android.provider.Contacts.GroupMembership.GROUP_SYNC_ID + ", " +
7309d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki                AccountsColumns.CONCRETE_ACCOUNT_NAME
7311c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                        + " AS "
7321c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                        + android.provider.Contacts.GroupMembership.GROUP_SYNC_ACCOUNT + ", " +
7339d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki                AccountsColumns.CONCRETE_ACCOUNT_TYPE
7341c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                        + " AS "
7351c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                        + android.provider.Contacts.GroupMembership.GROUP_SYNC_ACCOUNT_TYPE +
7365ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                " FROM " + Tables.DATA_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_GROUPS +
737d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
73833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + GroupMembership.CONTENT_ITEM_TYPE + "'"
7395ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
740d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        ";");
741c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
742c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHOTOS + ";");
743c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        db.execSQL("CREATE VIEW " + LegacyTables.PHOTOS + " AS SELECT " +
744c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                DataColumns.CONCRETE_ID
745c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos._ID + ", " +
746d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov                DataColumns.CONCRETE_RAW_CONTACT_ID
747c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.PERSON_ID + ", " +
7489d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki                AccountsColumns.CONCRETE_ACCOUNT_NAME + ", " +
7499d990d339c9e3a9e03f6fe13c260d36665f00e61Makoto Onuki                AccountsColumns.CONCRETE_ACCOUNT_TYPE + ", " +
750c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                Tables.DATA + "." + Photo.PHOTO
751c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.DATA + ", " +
752c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.EXISTS_ON_SERVER
753c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.EXISTS_ON_SERVER + ", " +
754c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.DOWNLOAD_REQUIRED
755c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.DOWNLOAD_REQUIRED + ", " +
756c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.LOCAL_VERSION
757c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.LOCAL_VERSION + ", " +
758c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                "legacy_photo." + LegacyPhotoData.SYNC_ERROR
759caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                        + " AS " + android.provider.Contacts.Photos.SYNC_ERROR +
760c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                " FROM " + Tables.DATA + DATA_JOINS + LEGACY_PHOTO_JOIN +
761c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='"
76233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                        + Photo.CONTENT_ITEM_TYPE + "'"
763ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann                        + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" +
764c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        ";");
7651c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
7661c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    }
7671c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
7681c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    public static void createSettingsTable(SQLiteDatabase db) {
7691c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        db.execSQL("DROP TABLE IF EXISTS " + LegacyTables.SETTINGS + ";");
7701c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        db.execSQL("CREATE TABLE " + LegacyTables.SETTINGS + " (" +
7711c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                android.provider.Contacts.Settings._ID + " INTEGER PRIMARY KEY," +
7721c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                android.provider.Contacts.Settings._SYNC_ACCOUNT + " TEXT," +
7731c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                android.provider.Contacts.Settings._SYNC_ACCOUNT_TYPE + " TEXT," +
7741c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                android.provider.Contacts.Settings.KEY + " STRING NOT NULL," +
7751c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                android.provider.Contacts.Settings.VALUE + " STRING " +
7761c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        ");");
777d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    }
778d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov
779f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public Uri insert(Uri uri, ContentValues values) {
78067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        ensureDefaultAccount();
781f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final int match = sUriMatcher.match(uri);
782f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        long id = 0;
783f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch (match) {
784f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE:
7853cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                id = insertPeople(values);
7863cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
7873cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
7883cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS:
7893cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                id = insertOrganization(values);
790f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
791f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
7920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS: {
7935ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
7945ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertContactMethod(rawContactId, values);
795e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
7960f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
797e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
7980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case CONTACTMETHODS: {
7995ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values, ContactMethods.PERSON_ID);
8005ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertContactMethod(rawContactId, values);
801e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
8020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
803e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PHONES: {
8055ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
8060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.Phones.PERSON_ID);
8075ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertPhone(rawContactId, values);
8080f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
8090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
8100f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
81194743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton            case PEOPLE_PHONES: {
81294743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
81394743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton                id = insertPhone(rawContactId, values);
81494743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton                break;
81594743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton            }
81694743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton
8170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS: {
8185ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
8190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.Extensions.PERSON_ID);
8205ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertExtension(rawContactId, values);
8210f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
8220f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
8230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
8240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS:
8250f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                id = insertGroup(values);
826e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
827e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8280f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP: {
8295ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = getRequiredValue(values,
8300f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.GroupMembership.PERSON_ID);
8310f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                long groupId = getRequiredValue(values,
8320f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                        android.provider.Contacts.GroupMembership.GROUP_ID);
8335ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                id = insertGroupMembership(rawContactId, groupId);
8340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
8350f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            }
8360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
837f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            default:
838fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov                throw new UnsupportedOperationException(mDbHelper.exceptionMessage(uri));
839f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
840f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
841f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (id < 0) {
842f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            return null;
843f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
844f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
845f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final Uri result = ContentUris.withAppendedId(uri, id);
846f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        onChange(result);
847f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return result;
848f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
849f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
8500f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private long getRequiredValue(ContentValues values, String column) {
8510f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        if (!values.containsKey(column)) {
8520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            throw new RuntimeException("Required value: " + column);
853e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        }
854e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8550f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return values.getAsLong(column);
856e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
857e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8583cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private long insertPeople(ContentValues values) {
859044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parsePeopleValues(values);
860caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
86167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri contactUri = mContactsProvider.insertInTransaction(RawContacts.CONTENT_URI, mValues);
86267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long rawContactId = ContentUris.parseId(contactUri);
86367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
86467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues2.size() != 0) {
86567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mValues2.put(Data.RAW_CONTACT_ID, rawContactId);
86667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues2);
86767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
86867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues3.size() != 0) {
86967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mValues3.put(Data.RAW_CONTACT_ID, rawContactId);
87067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues3);
87167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
872f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
87367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return rawContactId;
87467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
87567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
8763cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    private long insertOrganization(ContentValues values) {
877044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseOrganizationValues(values);
878b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, Data.RAW_CONTACT_ID,
8793cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                values, android.provider.Contacts.Organizations.PERSON_ID);
8803cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
88167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
8823cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
8833cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        return ContentUris.parseId(uri);
8843cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    }
885f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
8865ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertPhone(long rawContactId, ContentValues values) {
887044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parsePhoneValues(values);
8885ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
889e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
89067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
891e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
892e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        return ContentUris.parseId(uri);
893e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
894e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
8955ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertContactMethod(long rawContactId, ContentValues values) {
896e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        Integer kind = values.getAsInteger(ContactMethods.KIND);
897e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        if (kind == null) {
898e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            throw new RuntimeException("Required value: " + ContactMethods.KIND);
899e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        }
900e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
901044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseContactMethodValues(kind, values);
902e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
903044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
90467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
905e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        return ContentUris.parseId(uri);
906e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
907e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
9085ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertExtension(long rawContactId, ContentValues values) {
9090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.clear();
9100f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9115ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(Data.RAW_CONTACT_ID, rawContactId);
9120f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(Data.MIMETYPE, android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE);
9130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
914044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseExtensionValues(values);
9150f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
91667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
9170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
9180f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
9190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    private long insertGroup(ContentValues values) {
921044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseGroupValues(values);
9220f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
923e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov        if (mAccount != null) {
924e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov            mValues.put(Groups.ACCOUNT_NAME, mAccount.name);
925e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov            mValues.put(Groups.ACCOUNT_TYPE, mAccount.type);
926e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov        }
927caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
92867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Groups.CONTENT_URI, mValues);
9290f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
9300f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
9310f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9325ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private long insertGroupMembership(long rawContactId, long groupId) {
9330f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.clear();
9340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
9350f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE);
9365ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov        mValues.put(GroupMembership.RAW_CONTACT_ID, rawContactId);
9370f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        mValues.put(GroupMembership.GROUP_ROW_ID, groupId);
9380f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
93967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
9400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        return ContentUris.parseId(uri);
9410f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    }
9420f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
943f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
94467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        ensureDefaultAccount();
94567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
94667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int match = sUriMatcher.match(uri);
947c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int count = 0;
948f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch(match) {
94967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case PEOPLE_UPDATE_CONTACT_TIME: {
950f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                count = updateContactTime(uri, values);
951f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
95267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
953c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
954c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PEOPLE_PHOTO: {
9555ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
9565ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                return updatePhoto(rawContactId, values);
957c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            }
958c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
9591c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            case SETTINGS: {
9601c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                return updateSettings(values);
9611c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            }
9621c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
9631c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            case GROUPMEMBERSHIP:
9641c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            case GROUPMEMBERSHIP_ID:
96567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case -1: {
966fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov                throw new UnsupportedOperationException(mDbHelper.exceptionMessage(uri));
96767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
96867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
96967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            default: {
97067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                count = updateAll(uri, match, values, selection, selectionArgs);
97167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
97267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
97367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
97467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (count > 0) {
97567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContext.getContentResolver().notifyChange(uri, null);
97667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
97767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
97867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return count;
97967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
98067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
98167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private int updateAll(Uri uri, final int match, ContentValues values, String selection,
98267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            String[] selectionArgs) {
98367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Cursor c = query(uri, IdQuery.COLUMNS, selection, selectionArgs, null, null);
98467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (c == null) {
98567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            return 0;
98667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
98767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
98867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int count = 0;
98967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        try {
99067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            while (c.moveToNext()) {
99167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                long id = c.getLong(IdQuery._ID);
99267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                count += update(match, id, values);
99367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
99467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        } finally {
99567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            c.close();
99667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
99767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
99867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return count;
99967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
100067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
100167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    public int update(int match, long id, ContentValues values) {
100267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int count = 0;
100367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        switch(match) {
100467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case PEOPLE:
100567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            case PEOPLE_ID: {
100667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                count = updatePeople(id, values);
100767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                break;
100867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
100967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
1010044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case ORGANIZATIONS:
1011044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case ORGANIZATIONS_ID: {
1012044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updateOrganizations(id, values);
1013044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1014044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1015044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1016044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHONES:
1017044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHONES_ID: {
1018044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updatePhones(id, values);
1019044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1020044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1021044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1022044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case CONTACTMETHODS:
1023044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case CONTACTMETHODS_ID: {
1024044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updateContactMethods(id, values);
1025044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1026044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1027044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1028044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case EXTENSIONS:
1029044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case EXTENSIONS_ID: {
1030044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updateExtensions(id, values);
1031044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1032044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1033044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1034044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case GROUPS:
1035044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case GROUPS_ID: {
1036044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updateGroups(id, values);
1037c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
1038044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1039c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1040044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS:
1041c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PHOTOS_ID:
1042044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                count = updatePhotoByDataId(id, values);
1043c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
104467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
1045c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
104667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return count;
104767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
1048c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
104967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private int updatePeople(long rawContactId, ContentValues values) {
1050044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parsePeopleValues(values);
105167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
105249d48c0a709c1efa8593acadadd31350bfc75d9aDmitri Plotnikov        int count = mContactsProvider.updateInTransaction(RawContacts.CONTENT_URI,
1053044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues, RawContacts._ID + "=" + rawContactId, null);
105467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
105567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (count == 0) {
105667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            return 0;
1057f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1058f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
105967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues2.size() != 0) {
106067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            Uri dataUri = findFirstDataRow(rawContactId, StructuredName.CONTENT_ITEM_TYPE);
106167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            if (dataUri != null) {
106249d48c0a709c1efa8593acadadd31350bfc75d9aDmitri Plotnikov                mContactsProvider.updateInTransaction(dataUri, mValues2, null, null);
106367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            } else {
106467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mValues2.put(Data.RAW_CONTACT_ID, rawContactId);
106567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues2);
106667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
106767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
106867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
106967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (mValues3.size() != 0) {
107067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            Uri dataUri = findFirstDataRow(rawContactId, Note.CONTENT_ITEM_TYPE);
107167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            if (dataUri != null) {
107249d48c0a709c1efa8593acadadd31350bfc75d9aDmitri Plotnikov                mContactsProvider.updateInTransaction(dataUri, mValues3, null, null);
107367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            } else {
107467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mValues3.put(Data.RAW_CONTACT_ID, rawContactId);
107567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues3);
107667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
1077f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
107867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
1079f6c1658fa38b4a94ceab295767938388ec735240Dmitri Plotnikov        if (values.containsKey(People.LAST_TIME_CONTACTED) &&
1080f6c1658fa38b4a94ceab295767938388ec735240Dmitri Plotnikov                !values.containsKey(People.TIMES_CONTACTED)) {
1081f6c1658fa38b4a94ceab295767938388ec735240Dmitri Plotnikov            updateContactTime(rawContactId, values);
1082f6c1658fa38b4a94ceab295767938388ec735240Dmitri Plotnikov        }
1083f6c1658fa38b4a94ceab295767938388ec735240Dmitri Plotnikov
1084f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return count;
1085f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1086f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1087044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updateOrganizations(long dataId, ContentValues values) {
1088044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseOrganizationValues(values);
1089044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1090044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1091044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Data._ID + "=" + dataId, null);
1092044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1093044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1094044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updatePhones(long dataId, ContentValues values) {
1095044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parsePhoneValues(values);
1096044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1097044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1098044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Data._ID + "=" + dataId, null);
1099044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1100044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1101044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updateContactMethods(long dataId, ContentValues values) {
1102044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        int kind;
1103044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1104044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mDataMimetypeQuery.bindLong(1, dataId);
1105044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long mimetype_id;
1106044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        try {
1107044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mimetype_id = mDataMimetypeQuery.simpleQueryForLong();
1108044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } catch (SQLiteDoneException e) {
1109044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            // Data row not found
1110044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            return 0;
1111044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1112044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1113044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (mimetype_id == mMimetypeEmail) {
1114044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            kind = android.provider.Contacts.KIND_EMAIL;
1115044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } else if (mimetype_id == mMimetypeIm) {
1116044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            kind = android.provider.Contacts.KIND_IM;
1117044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } else if (mimetype_id == mMimetypePostal) {
1118044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            kind = android.provider.Contacts.KIND_POSTAL;
1119044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } else {
1120044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1121044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            // Non-legacy kind: return "Not found"
1122044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            return 0;
1123044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1124044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1125044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseContactMethodValues(kind, values);
1126044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1127044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1128044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Data._ID + "=" + dataId, null);
1129044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1130044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1131044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updateExtensions(long dataId, ContentValues values) {
1132044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseExtensionValues(values);
1133044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1134044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1135044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Data._ID + "=" + dataId, null);
1136044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1137044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1138044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updateGroups(long groupId, ContentValues values) {
1139044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        parseGroupValues(values);
1140044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1141044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return mContactsProvider.updateInTransaction(Groups.CONTENT_URI, mValues,
1142044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                Groups._ID + "=" + groupId, null);
1143044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1144044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1145f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private int updateContactTime(Uri uri, ContentValues values) {
1146f6c1658fa38b4a94ceab295767938388ec735240Dmitri Plotnikov        long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
1147f6c1658fa38b4a94ceab295767938388ec735240Dmitri Plotnikov        updateContactTime(rawContactId, values);
1148f6c1658fa38b4a94ceab295767938388ec735240Dmitri Plotnikov        return 1;
1149f6c1658fa38b4a94ceab295767938388ec735240Dmitri Plotnikov    }
1150f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1151f6c1658fa38b4a94ceab295767938388ec735240Dmitri Plotnikov    private void updateContactTime(long rawContactId, ContentValues values) {
1152f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        long lastTimeContacted;
1153f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (values.containsKey(People.LAST_TIME_CONTACTED)) {
1154f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            lastTimeContacted = values.getAsLong(People.LAST_TIME_CONTACTED);
1155f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        } else {
1156f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            lastTimeContacted = System.currentTimeMillis();
1157f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1158f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1159f6c1658fa38b4a94ceab295767938388ec735240Dmitri Plotnikov        // TODO check sanctions
1160b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        long contactId = mDbHelper.getContactId(rawContactId);
11616e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori        SQLiteDatabase mDb = mDbHelper.getWritableDatabase();
11626e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori        mSelectionArgs2[0] = String.valueOf(lastTimeContacted);
1163d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov        if (contactId != 0) {
11646e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori            mSelectionArgs2[1] = String.valueOf(contactId);
11656e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori            mDb.execSQL(CONTACTS_UPDATE_LASTTIMECONTACTED, mSelectionArgs2);
11666e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori            // increment times_contacted column
11676e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori            mSelectionArgs1[0] = String.valueOf(contactId);
11686e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori            mDb.execSQL(ContactsProvider2.UPDATE_TIMES_CONTACTED_CONTACTS_TABLE, mSelectionArgs1);
1169f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
11706e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori        mSelectionArgs2[1] = String.valueOf(rawContactId);
11716e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori        mDb.execSQL(RAWCONTACTS_UPDATE_LASTTIMECONTACTED, mSelectionArgs2);
11726e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori        // increment times_contacted column
11736e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori        mSelectionArgs1[0] = String.valueOf(contactId);
11746e38acbd1e72c62a6f8917297aed97e35c0c4697Vasu Nori        mDb.execSQL(ContactsProvider2.UPDATE_TIMES_CONTACTED_RAWCONTACTS_TABLE, mSelectionArgs1);
1175f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1176f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
11775ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov    private int updatePhoto(long rawContactId, ContentValues values) {
1178c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1179c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        // TODO check sanctions
1180c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1181c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        int count;
1182c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
118367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long dataId = findFirstDataId(rawContactId, Photo.CONTENT_ITEM_TYPE);
1184c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1185c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.clear();
1186c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA);
1187c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.put(Photo.PHOTO, bytes);
1188c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1189c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        if (dataId == -1) {
1190c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE);
11915ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(Data.RAW_CONTACT_ID, rawContactId);
119267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            Uri dataUri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
1193c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            dataId = ContentUris.parseId(dataUri);
1194c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            count = 1;
1195c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        } else {
1196c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            Uri dataUri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
119767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            count = mContactsProvider.updateInTransaction(dataUri, mValues, null, null);
1198c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        }
1199c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1200044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        updateLegacyPhotoData(rawContactId, dataId, values);
1201044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1202044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return count;
1203044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1204044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1205044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private int updatePhotoByDataId(long dataId, ContentValues values) {
1206044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1207044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mDataRawContactIdQuery.bindLong(1, dataId);
1208044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long rawContactId;
1209044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1210044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        try {
1211044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            rawContactId = mDataRawContactIdQuery.simpleQueryForLong();
1212044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } catch (SQLiteDoneException e) {
1213044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            // Data row not found
1214044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            return 0;
1215044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1216044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1217044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (values.containsKey(android.provider.Contacts.Photos.DATA)) {
1218044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA);
1219044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mValues.clear();
1220044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mValues.put(Photo.PHOTO, bytes);
1221044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1222044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    Data._ID + "=" + dataId, null);
1223044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1224044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1225044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        updateLegacyPhotoData(rawContactId, dataId, values);
1226044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1227044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return 1;
1228044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1229044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1230044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void updateLegacyPhotoData(long rawContactId, long dataId, ContentValues values) {
1231c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        mValues.clear();
1232b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, LegacyPhotoData.LOCAL_VERSION,
1233c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.LOCAL_VERSION);
1234b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, LegacyPhotoData.DOWNLOAD_REQUIRED,
1235c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.DOWNLOAD_REQUIRED);
1236b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, LegacyPhotoData.EXISTS_ON_SERVER,
1237c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.EXISTS_ON_SERVER);
1238b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, LegacyPhotoData.SYNC_ERROR,
1239c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                values, android.provider.Contacts.Photos.SYNC_ERROR);
1240c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
124167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        int updated = mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues,
1242c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                Data.MIMETYPE + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'"
12435ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov                        + " AND " + Data.RAW_CONTACT_ID + "=" + rawContactId
1244c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                        + " AND " + LegacyPhotoData.PHOTO_DATA_ID + "=" + dataId, null);
1245c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        if (updated == 0) {
12465ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov            mValues.put(Data.RAW_CONTACT_ID, rawContactId);
1247c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(Data.MIMETYPE, LegacyPhotoData.CONTENT_ITEM_TYPE);
1248c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            mValues.put(LegacyPhotoData.PHOTO_DATA_ID, dataId);
124967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues);
1250c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        }
1251044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1252c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
12531c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    private int updateSettings(ContentValues values) {
12541c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        SQLiteDatabase db = mDbHelper.getWritableDatabase();
12551c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        String accountName = values.getAsString(android.provider.Contacts.Settings._SYNC_ACCOUNT);
12561c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        String accountType =
12571c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                values.getAsString(android.provider.Contacts.Settings._SYNC_ACCOUNT_TYPE);
12581c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        String key = values.getAsString(android.provider.Contacts.Settings.KEY);
12591c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        if (key == null) {
12601c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            throw new IllegalArgumentException("you must specify the key when updating settings");
12611c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        }
12621c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        updateSetting(db, accountName, accountType, values);
12631c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        if (key.equals(android.provider.Contacts.Settings.SYNC_EVERYTHING)) {
12641c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            mValues.clear();
12651c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            mValues.put(Settings.SHOULD_SYNC,
12661c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                    values.getAsInteger(android.provider.Contacts.Settings.VALUE));
12671c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            String selection;
12681c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            String[] selectionArgs;
12691c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            if (accountName != null && accountType != null) {
1270f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro
12711c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                selectionArgs = new String[]{accountName, accountType};
12721c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                selection = Settings.ACCOUNT_NAME + "=?"
1273f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro                        + " AND " + Settings.ACCOUNT_TYPE + "=?"
1274f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro                        + " AND " + Settings.DATA_SET + " IS NULL";
12751c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            } else {
12761c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                selectionArgs = null;
12771c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                selection = Settings.ACCOUNT_NAME + " IS NULL"
1278f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro                        + " AND " + Settings.ACCOUNT_TYPE + " IS NULL"
1279f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro                        + " AND " + Settings.DATA_SET + " IS NULL";
12801c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            }
12811c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            int count = mContactsProvider.updateInTransaction(Settings.CONTENT_URI, mValues,
12821c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                    selection, selectionArgs);
12831c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            if (count == 0) {
12841c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                mValues.put(Settings.ACCOUNT_NAME, accountName);
12851c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                mValues.put(Settings.ACCOUNT_TYPE, accountType);
12861c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                mContactsProvider.insertInTransaction(Settings.CONTENT_URI, mValues);
12871c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            }
12881c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        }
12891c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        return 1;
12901c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    }
12911c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
12921c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    private void updateSetting(SQLiteDatabase db, String accountName, String accountType,
12931c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            ContentValues values) {
12941c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        final String key = values.getAsString(android.provider.Contacts.Settings.KEY);
12951c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        if (accountName == null || accountType == null) {
12961c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            db.delete(LegacyTables.SETTINGS, "_sync_account IS NULL AND key=?", new String[]{key});
12971c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        } else {
12981c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            db.delete(LegacyTables.SETTINGS, "_sync_account=? AND _sync_account_type=? AND key=?",
12991c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                    new String[]{accountName, accountType, key});
13001c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        }
13011c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        long rowId = db.insert(LegacyTables.SETTINGS,
13021c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                android.provider.Contacts.Settings.KEY, values);
13031c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        if (rowId < 0) {
13041c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            throw new SQLException("error updating settings with " + values);
13051c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        }
13061c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    }
13071c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
13081c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    private interface SettingsMatchQuery {
13091c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        String SQL =
13101c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            "SELECT "
13111c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                    + ContactsContract.Settings.ACCOUNT_NAME + ","
13121c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                    + ContactsContract.Settings.ACCOUNT_TYPE + ","
13131c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                    + ContactsContract.Settings.SHOULD_SYNC +
13141c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            " FROM " + Tables.SETTINGS + " LEFT OUTER JOIN " + LegacyTables.SETTINGS +
13151c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            " ON (" + ContactsContract.Settings.ACCOUNT_NAME + "="
13161c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                              + android.provider.Contacts.Settings._SYNC_ACCOUNT +
13171c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                      " AND " + ContactsContract.Settings.ACCOUNT_TYPE + "="
13181c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                              + android.provider.Contacts.Settings._SYNC_ACCOUNT_TYPE +
1319f9b77edaf5855bf6932fbc4b4b4342273669efefDave Santoro                      " AND " + ContactsContract.Settings.DATA_SET + " IS NULL" +
13201c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                      " AND " + android.provider.Contacts.Settings.KEY + "='"
13211c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                              + android.provider.Contacts.Settings.SYNC_EVERYTHING + "'" +
13221c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            ")" +
13231c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            " WHERE " + ContactsContract.Settings.SHOULD_SYNC + "<>"
13241c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                            + android.provider.Contacts.Settings.VALUE;
13251c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
13261c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        int ACCOUNT_NAME = 0;
13271c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        int ACCOUNT_TYPE = 1;
13281c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        int SHOULD_SYNC = 2;
13291c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    }
13301c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
13311c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    /**
13321c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov     * Brings legacy settings table in sync with the new settings.
13331c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov     */
13341c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    public void copySettingsToLegacySettings() {
13351c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        SQLiteDatabase db = mDbHelper.getWritableDatabase();
13361c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        Cursor cursor = db.rawQuery(SettingsMatchQuery.SQL, null);
13371c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        try {
13381c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            while(cursor.moveToNext()) {
13391c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                String accountName = cursor.getString(SettingsMatchQuery.ACCOUNT_NAME);
13401c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                String accountType = cursor.getString(SettingsMatchQuery.ACCOUNT_TYPE);
13411c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                String value = cursor.getString(SettingsMatchQuery.SHOULD_SYNC);
13421c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                mValues.clear();
13431c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                mValues.put(android.provider.Contacts.Settings._SYNC_ACCOUNT, accountName);
13441c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                mValues.put(android.provider.Contacts.Settings._SYNC_ACCOUNT_TYPE, accountType);
13451c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                mValues.put(android.provider.Contacts.Settings.KEY,
13461c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                        android.provider.Contacts.Settings.SYNC_EVERYTHING);
13471c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                mValues.put(android.provider.Contacts.Settings.VALUE, value);
13481c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                updateSetting(db, accountName, accountType, mValues);
13491c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            }
13501c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        } finally {
13511c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            cursor.close();
13521c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        }
13531c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    }
13541c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
1355044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parsePeopleValues(ContentValues values) {
1356044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1357044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues2.clear();
1358044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues3.clear();
1359044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1360b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, RawContacts.CUSTOM_RINGTONE,
1361044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.CUSTOM_RINGTONE);
1362b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, RawContacts.SEND_TO_VOICEMAIL,
1363044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.SEND_TO_VOICEMAIL);
1364b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, RawContacts.LAST_TIME_CONTACTED,
1365044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.LAST_TIME_CONTACTED);
1366b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, RawContacts.TIMES_CONTACTED,
1367044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.TIMES_CONTACTED);
1368b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, RawContacts.STARRED,
1369044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, People.STARRED);
1370e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov        if (mAccount != null) {
1371e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov            mValues.put(RawContacts.ACCOUNT_NAME, mAccount.name);
1372e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov            mValues.put(RawContacts.ACCOUNT_TYPE, mAccount.type);
1373e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov        }
1374044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1375044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (values.containsKey(People.NAME) || values.containsKey(People.PHONETIC_NAME)) {
1376044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mValues2.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
1377b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov            ContactsDatabaseHelper.copyStringValue(mValues2, StructuredName.DISPLAY_NAME,
1378044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    values, People.NAME);
1379044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            if (values.containsKey(People.PHONETIC_NAME)) {
1380044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                String phoneticName = values.getAsString(People.PHONETIC_NAME);
1381044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                NameSplitter.Name parsedName = new NameSplitter.Name();
1382044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mPhoneticNameSplitter.split(parsedName, phoneticName);
1383044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues2.put(StructuredName.PHONETIC_GIVEN_NAME, parsedName.getGivenNames());
1384044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues2.put(StructuredName.PHONETIC_MIDDLE_NAME, parsedName.getMiddleName());
1385044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues2.put(StructuredName.PHONETIC_FAMILY_NAME, parsedName.getFamilyName());
1386044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1387044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1388044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1389044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (values.containsKey(People.NOTES)) {
1390044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            mValues3.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE);
1391b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov            ContactsDatabaseHelper.copyStringValue(mValues3, Note.NOTE, values, People.NOTES);
1392044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1393044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1394044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1395044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parseOrganizationValues(ContentValues values) {
1396044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1397044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1398044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
1399044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1400b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, Data.IS_PRIMARY,
1401044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.ISPRIMARY);
1402044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1403b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, Organization.COMPANY,
1404044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.COMPANY);
1405044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1406044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        // TYPE values happen to remain the same between V1 and V2 - can just copy the value
1407b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, Organization.TYPE,
1408044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.TYPE);
1409044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1410b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, Organization.LABEL,
1411044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.LABEL);
1412b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, Organization.TITLE,
1413044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Organizations.TITLE);
1414044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1415044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1416044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parsePhoneValues(ContentValues values) {
1417044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1418044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1419044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
1420044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1421b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, Data.IS_PRIMARY,
1422044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Phones.ISPRIMARY);
1423044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1424b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, Phone.NUMBER,
1425044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Phones.NUMBER);
1426044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1427044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        // TYPE values happen to remain the same between V1 and V2 - can just copy the value
1428b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, Phone.TYPE,
1429044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Phones.TYPE);
1430044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1431b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, Phone.LABEL,
1432044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Phones.LABEL);
1433044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1434044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1435044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parseContactMethodValues(int kind, ContentValues values) {
1436044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1437044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1438b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, Data.IS_PRIMARY, values,
1439b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                ContactMethods.ISPRIMARY);
1440044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1441044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        switch (kind) {
1442044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case android.provider.Contacts.KIND_EMAIL: {
1443044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                copyCommonFields(values, Email.CONTENT_ITEM_TYPE, Email.TYPE, Email.LABEL,
1444044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                        Data.DATA14);
1445b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                ContactsDatabaseHelper.copyStringValue(mValues, Email.DATA, values,
1446b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                        ContactMethods.DATA);
1447044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1448044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1449044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1450044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case android.provider.Contacts.KIND_IM: {
1451044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                String protocol = values.getAsString(ContactMethods.DATA);
1452044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                if (protocol.startsWith("pre:")) {
1453044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    mValues.put(Im.PROTOCOL, Integer.parseInt(protocol.substring(4)));
1454044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                } else if (protocol.startsWith("custom:")) {
1455044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    mValues.put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM);
1456044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                    mValues.put(Im.CUSTOM_PROTOCOL, protocol.substring(7));
1457044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                }
1458044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1459044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                copyCommonFields(values, Im.CONTENT_ITEM_TYPE, Im.TYPE, Im.LABEL, Data.DATA14);
1460044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1461044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1462044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1463044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case android.provider.Contacts.KIND_POSTAL: {
1464044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                copyCommonFields(values, StructuredPostal.CONTENT_ITEM_TYPE, StructuredPostal.TYPE,
1465044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                        StructuredPostal.LABEL, Data.DATA14);
1466b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                ContactsDatabaseHelper.copyStringValue(mValues, StructuredPostal.FORMATTED_ADDRESS,
1467b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                        values, ContactMethods.DATA);
1468044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1469044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1470044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1471044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1472044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1473044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void copyCommonFields(ContentValues values, String mimeType, String typeColumn,
1474044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            String labelColumn, String auxDataColumn) {
1475044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.put(Data.MIMETYPE, mimeType);
1476b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyLongValue(mValues, typeColumn, values,
1477b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                ContactMethods.TYPE);
1478b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, labelColumn, values,
1479b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                ContactMethods.LABEL);
1480b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, auxDataColumn, values,
1481b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                ContactMethods.AUX_DATA);
1482044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1483044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1484044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parseGroupValues(ContentValues values) {
1485044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mValues.clear();
1486044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1487b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, Groups.TITLE,
1488044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Groups.NAME);
1489b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, Groups.NOTES,
1490044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Groups.NOTES);
1491b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, Groups.SYSTEM_ID,
1492044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.Groups.SYSTEM_ID);
1493044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1494044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1495044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void parseExtensionValues(ContentValues values) {
1496b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, ExtensionsColumns.NAME,
1497044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.People.Extensions.NAME);
1498b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        ContactsDatabaseHelper.copyStringValue(mValues, ExtensionsColumns.VALUE,
1499044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                values, android.provider.Contacts.People.Extensions.VALUE);
1500c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    }
1501c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
150267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private Uri findFirstDataRow(long rawContactId, String contentItemType) {
150367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long dataId = findFirstDataId(rawContactId, contentItemType);
150467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        if (dataId == -1) {
150567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            return null;
150667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
150767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
150867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
150967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
151067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
151167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private long findFirstDataId(long rawContactId, String mimeType) {
151267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long dataId = -1;
151367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Cursor c = mContactsProvider.query(Data.CONTENT_URI, IdQuery.COLUMNS,
151467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                Data.RAW_CONTACT_ID + "=" + rawContactId + " AND "
151567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                        + Data.MIMETYPE + "='" + mimeType + "'",
151667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                null, null);
151767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        try {
151867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            if (c.moveToFirst()) {
151967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                dataId = c.getLong(IdQuery._ID);
152067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            }
152167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        } finally {
152267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov            c.close();
152367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        }
152467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        return dataId;
152567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
152667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
1527044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
15283cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    public int delete(Uri uri, String selection, String[] selectionArgs) {
15291c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        final int match = sUriMatcher.match(uri);
15301c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        if (match == -1 || match == SETTINGS) {
1531fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov            throw new UnsupportedOperationException(mDbHelper.exceptionMessage(uri));
15321c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        }
15331c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
1534044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Cursor c = query(uri, IdQuery.COLUMNS, selection, selectionArgs, null, null);
1535044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        if (c == null) {
1536044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            return 0;
1537044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1538044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1539044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        int count = 0;
1540044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        try {
1541044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            while (c.moveToNext()) {
1542044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                long id = c.getLong(IdQuery._ID);
15431c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                count += delete(uri, match, id);
1544044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            }
1545044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        } finally {
1546044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            c.close();
1547044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        }
1548044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1549044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        return count;
1550044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
1551044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
15521c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    public int delete(Uri uri, int match, long id) {
15533cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        int count = 0;
15543cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        switch (match) {
1555044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PEOPLE:
155633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case PEOPLE_ID:
1557fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov                count = mContactsProvider.deleteRawContact(id, mDbHelper.getContactId(id), false);
155833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov                break;
155933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov
1560044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PEOPLE_PHOTO:
1561044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues.clear();
1562044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                mValues.putNull(android.provider.Contacts.Photos.DATA);
1563044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                updatePhoto(id, mValues);
1564044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1565044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1566044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case ORGANIZATIONS:
15673cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS_ID:
1568d810b894f0a677d7f6db0dfd9e2d7e4c9987e21cDmitri Plotnikov                count = mContactsProvider.deleteData(id, ORGANIZATION_MIME_TYPES);
1569e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1570e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1571044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case CONTACTMETHODS:
1572e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS_ID:
1573d810b894f0a677d7f6db0dfd9e2d7e4c9987e21cDmitri Plotnikov                count = mContactsProvider.deleteData(id, CONTACT_METHOD_MIME_TYPES);
1574e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1575e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1576044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHONES:
1577e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES_ID:
1578d810b894f0a677d7f6db0dfd9e2d7e4c9987e21cDmitri Plotnikov                count = mContactsProvider.deleteData(id, PHONE_MIME_TYPES);
15793cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
15803cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
1581044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case EXTENSIONS:
1582044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case EXTENSIONS_ID:
1583d810b894f0a677d7f6db0dfd9e2d7e4c9987e21cDmitri Plotnikov                count = mContactsProvider.deleteData(id, EXTENSION_MIME_TYPES);
1584044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1585044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1586044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS:
1587044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS_ID:
1588d810b894f0a677d7f6db0dfd9e2d7e4c9987e21cDmitri Plotnikov                count = mContactsProvider.deleteData(id, PHOTO_MIME_TYPES);
15891c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                break;
15901c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
15911c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            case GROUPMEMBERSHIP:
15921c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            case GROUPMEMBERSHIP_ID:
15931c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                count = mContactsProvider.deleteData(id, GROUP_MEMBERSHIP_MIME_TYPES);
15941c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                break;
1595044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
15961c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            case GROUPS:
15971c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            case GROUPS_ID:
15981c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                count = mContactsProvider.deleteGroup(uri, id, false);
1599044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1600044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
16013cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            default:
1602fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov                throw new UnsupportedOperationException(mDbHelper.exceptionMessage(uri));
16033cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        }
16043cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
16053cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov        return count;
16063cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    }
16073cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
1608f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
1609c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            String sortOrder, String limit) {
1610caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        ensureDefaultAccount();
1611caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
1612b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov        final SQLiteDatabase db = mDbHelper.getReadableDatabase();
1613f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
1614f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        String groupBy = null;
1615f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1616f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final int match = sUriMatcher.match(uri);
1617f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        switch (match) {
1618f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE: {
161970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1620f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
162167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1622f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
1623f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            }
1624f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1625f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            case PEOPLE_ID:
162670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1627f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
162867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1629caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + People._ID + "=");
1630f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1631f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                break;
1632f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1633445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov            case PEOPLE_FILTER: {
1634445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
1635445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
163667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1637445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                String filterParam = uri.getPathSegments().get(2);
1638caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + People._ID + " IN "
1639155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov                        + getRawContactsByFilterAsNestedQuery(filterParam));
1640445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov                break;
1641445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov            }
1642445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov
164371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov            case GROUP_NAME_MEMBERS:
164471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
164571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
164671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                applyRawContactsAccount(qb);
164771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                String group = uri.getPathSegments().get(2);
164871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                qb.appendWhere(" AND " + buildGroupNameMatchWhereClause(group));
164971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                break;
165071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
16513b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov            case GROUP_SYSTEM_ID_MEMBERS:
16523b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov                qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE);
16533b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov                qb.setProjectionMap(sPeopleProjectionMap);
16543b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov                applyRawContactsAccount(qb);
16553b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov                String systemId = uri.getPathSegments().get(2);
16563b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov                qb.appendWhere(" AND " + buildGroupSystemIdMatchWhereClause(systemId));
16573b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov                break;
16583b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov
16593cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS:
16605dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.ORGANIZATIONS + " organizations");
1661d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sOrganizationProjectionMap);
166267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
16633cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
16643cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
16653cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            case ORGANIZATIONS_ID:
16665dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.ORGANIZATIONS + " organizations");
16673cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                qb.setProjectionMap(sOrganizationProjectionMap);
166867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1669d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Organizations._ID + "=");
1670e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1671e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1672e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1673e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov            case PEOPLE_ORGANIZATIONS:
1674e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov                qb.setTables(LegacyTables.ORGANIZATIONS + " organizations");
1675e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov                qb.setProjectionMap(sOrganizationProjectionMap);
1676e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov                applyRawContactsAccount(qb);
1677e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Organizations.PERSON_ID + "=");
1678e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1679e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov                break;
1680e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov
1681e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov            case PEOPLE_ORGANIZATIONS_ID:
1682e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov                qb.setTables(LegacyTables.ORGANIZATIONS + " organizations");
1683e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov                qb.setProjectionMap(sOrganizationProjectionMap);
1684e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov                applyRawContactsAccount(qb);
1685e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Organizations.PERSON_ID + "=");
1686e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1687e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Organizations._ID + "=");
1688e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
1689e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov                break;
1690e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov
1691e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS:
16925dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1693d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
169467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1695e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1696e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1697e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case CONTACTMETHODS_ID:
16985dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1699e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
170067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1701d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods._ID + "=");
1702e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1703e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1704e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1705bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov            case CONTACTMETHODS_EMAIL:
1706bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1707bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
1708bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                applyRawContactsAccount(qb);
1709bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + "="
1710bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                        + android.provider.Contacts.KIND_EMAIL);
1711bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                break;
1712bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov
1713e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS:
17145dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1715e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
171667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1717d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "=");
1718e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1719e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL");
1720e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1721e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1722e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_CONTACTMETHODS_ID:
17235dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods");
1724e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sContactMethodProjectionMap);
172567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1726d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "=");
1727e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1728d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods._ID + "=");
1729e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
1730e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL");
1731e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1732e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1733e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES:
17345dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1735d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
173667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1737e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1738e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1739e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PHONES_ID:
17405dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1741e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
174267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1743d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "=");
1744e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1745e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1746e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1747fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov            case PHONES_FILTER:
17485dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1749fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
175067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1751fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                if (uri.getPathSegments().size() > 2) {
1752fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                    String filterParam = uri.getLastPathSegment();
1753e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov                    qb.appendWhere(" AND person =");
1754b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov                    qb.appendWhere(mDbHelper.buildPhoneLookupAsNestedQuery(filterParam));
175542c817741879588db9014739f4dc194621e97381Dmitri Plotnikov                    qb.setDistinct(true);
1756fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                }
1757fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov                break;
1758fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
1759e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_PHONES:
17605dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1761e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
176267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1763d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "=");
1764e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1765e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                break;
1766e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
1767e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            case PEOPLE_PHONES_ID:
17685dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHONES + " phones");
1769e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.setProjectionMap(sPhoneProjectionMap);
177067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1771d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "=");
17723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1773d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "=");
1774e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
17753cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov                break;
17763cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov
17770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS:
17785dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
1779d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
178067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
17810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
17820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
17830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case EXTENSIONS_ID:
17845dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
17850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
178667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1787d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "=");
17880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
17890f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
17900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
17910f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_EXTENSIONS:
17925dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
17930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
179467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1795d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "=");
17960f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
17970f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
17980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
17990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_EXTENSIONS_ID:
18005dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.EXTENSIONS + " extensions");
18010f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sExtensionProjectionMap);
180267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1803d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "=");
18040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1805d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "=");
18060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
18070f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
18080f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
18090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS:
18105dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUPS + " groups");
18110f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupProjectionMap);
181267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyGroupAccount(qb);
18130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
18140f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
18150f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPS_ID:
18165dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUPS + " groups");
18170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupProjectionMap);
181867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyGroupAccount(qb);
1819caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Groups._ID + "=");
18200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
18210f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
18220f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
18230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP:
18245dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
1825d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
182667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
18270f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
18280f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
18290f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case GROUPMEMBERSHIP_ID:
18305dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
18310f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
183267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1833d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "=");
18340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
18350f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
18360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
18370f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_GROUPMEMBERSHIP:
18385dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
18390f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
184067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1841d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "=");
18420f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
18430f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
18440f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
18450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov            case PEOPLE_GROUPMEMBERSHIP_ID:
18465dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership");
18470f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.setProjectionMap(sGroupMembershipProjectionMap);
184867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1849d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "=");
18500f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1851d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "=");
18520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(3));
18530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov                break;
18540f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov
1855c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov            case PEOPLE_PHOTO:
18565dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                qb.setTables(LegacyTables.PHOTOS + " photos");
1857c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.setProjectionMap(sPhotoProjectionMap);
185867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov                applyRawContactsAccount(qb);
1859c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Photos.PERSON_ID + "=");
1860c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1861c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                limit = "1";
1862c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov                break;
1863c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov
1864044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS:
1865044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.setTables(LegacyTables.PHOTOS + " photos");
1866044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.setProjectionMap(sPhotoProjectionMap);
1867044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                applyRawContactsAccount(qb);
1868044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1869044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1870044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            case PHOTOS_ID:
1871044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.setTables(LegacyTables.PHOTOS + " photos");
1872044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.setProjectionMap(sPhotoProjectionMap);
1873044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                applyRawContactsAccount(qb);
1874044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.appendWhere(" AND " + android.provider.Contacts.Photos._ID + "=");
1875044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                qb.appendWhere(uri.getPathSegments().get(1));
1876044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                break;
1877044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
1878c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            case SEARCH_SUGGESTIONS:
1879174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov                return mGlobalSearchSupport.handleSearchSuggestionsQuery(
1880174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov                        db, uri, projection, limit);
1881c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
1882b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov            case SEARCH_SHORTCUT: {
18832d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill                String lookupKey = uri.getLastPathSegment();
1884174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov                String filter = ContactsProvider2.getQueryParameter(uri, "filter");
1885174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov                return mGlobalSearchSupport.handleSearchShortcutRefresh(
1886174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov                        db, projection, lookupKey, filter);
1887b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov            }
1888b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov
18891b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE:
18901b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_URI,
18911b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
18921b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
18931b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE_WITH_PHONES:
18941b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_WITH_PHONES_URI,
18951b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
18961b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
18971b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE_FAVORITES:
18981b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_FAVORITES_URI,
18991b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
19001b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
19011b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov            case LIVE_FOLDERS_PEOPLE_GROUP_NAME:
19021b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                return mContactsProvider.query(Uri.withAppendedPath(LIVE_FOLDERS_CONTACTS_URI,
19031b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        Uri.encode(uri.getLastPathSegment())),
19041b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                        projection, selection, selectionArgs, sortOrder);
19051b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov
190633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case DELETED_PEOPLE:
190733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov            case DELETED_GROUPS:
1908fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov                throw new UnsupportedOperationException(mDbHelper.exceptionMessage(uri));
190933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov
19101c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov            case SETTINGS:
19111c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                copySettingsToLegacySettings();
19121c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                qb.setTables(LegacyTables.SETTINGS);
19131c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                break;
19141c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
1915f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov            default:
1916fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov                throw new IllegalArgumentException(mDbHelper.exceptionMessage(uri));
1917f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1918f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
1919f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        // Perform the query and set the notification uri
1920f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        final Cursor c = qb.query(db, projection, selection, selectionArgs,
1921f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov                groupBy, null, sortOrder, limit);
1922f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        if (c != null) {
19233fe48cf2c81f6e89b78e919661e2b0b828a2144eDmitri Plotnikov            c.setNotificationUri(mContext.getContentResolver(),
19243fe48cf2c81f6e89b78e919661e2b0b828a2144eDmitri Plotnikov                    android.provider.Contacts.CONTENT_URI);
1925f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        }
1926f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        return c;
1927f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
1928f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
192967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void applyRawContactsAccount(SQLiteQueryBuilder qb) {
1930caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        StringBuilder sb = new StringBuilder();
193167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        appendRawContactsAccount(sb);
193267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        qb.appendWhere(sb.toString());
193367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
193467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
193567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void appendRawContactsAccount(StringBuilder sb) {
1936e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov        if (mAccount != null) {
1937e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov            sb.append(RawContacts.ACCOUNT_NAME + "=");
1938e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov            DatabaseUtils.appendEscapedSQLString(sb, mAccount.name);
1939e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov            sb.append(" AND " + RawContacts.ACCOUNT_TYPE + "=");
1940e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov            DatabaseUtils.appendEscapedSQLString(sb, mAccount.type);
1941e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov        } else {
1942e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov            sb.append(RawContacts.ACCOUNT_NAME + " IS NULL" +
1943e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov                    " AND " + RawContacts.ACCOUNT_TYPE + " IS NULL");
1944e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov        }
1945caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
1946caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
194767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void applyGroupAccount(SQLiteQueryBuilder qb) {
1948caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        StringBuilder sb = new StringBuilder();
194967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        appendGroupAccount(sb);
195067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        qb.appendWhere(sb.toString());
195167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
195267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
195367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void appendGroupAccount(StringBuilder sb) {
1954e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov        if (mAccount != null) {
1955e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov            sb.append(Groups.ACCOUNT_NAME + "=");
1956e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov            DatabaseUtils.appendEscapedSQLString(sb, mAccount.name);
1957e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov            sb.append(" AND " + Groups.ACCOUNT_TYPE + "=");
1958e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov            DatabaseUtils.appendEscapedSQLString(sb, mAccount.type);
1959e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov        } else {
1960e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov            sb.append(Groups.ACCOUNT_NAME + " IS NULL" +
1961e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov                    " AND " + Groups.ACCOUNT_TYPE + " IS NULL");
1962e0f854c10f7a3aeebc9a7be9fb2bb101d70c01e4Dmitri Plotnikov        }
1963caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
1964caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
1965f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    /**
196671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     * Build a WHERE clause that restricts the query to match people that are a member of
196771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     * a group with a particular name. The projection map of the query must include
196871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     * {@link People#_ID}.
196971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     *
197071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     * @param groupName The name of the group
197171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     * @return The where clause.
197271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov     */
197371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    private String buildGroupNameMatchWhereClause(String groupName) {
197471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        return "people._id IN "
197571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                + "(SELECT " + DataColumns.CONCRETE_RAW_CONTACT_ID
197671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                + " FROM " + Tables.DATA_JOIN_MIMETYPES
197771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                + " WHERE " + Data.MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE
197871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                        + "' AND " + GroupMembership.GROUP_ROW_ID + "="
197971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                                + "(SELECT " + Tables.GROUPS + "." + Groups._ID
198071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                                + " FROM " + Tables.GROUPS
198171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                                + " WHERE " + Groups.TITLE + "="
198271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                                        + DatabaseUtils.sqlEscapeString(groupName) + "))";
198371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    }
198471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
198571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    /**
19863b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov     * Build a WHERE clause that restricts the query to match people that are a member of
19873b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov     * a group with a particular system id. The projection map of the query must include
19883b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov     * {@link People#_ID}.
19893b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov     *
19903b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov     * @param groupName The name of the group
19913b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov     * @return The where clause.
19923b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov     */
19933b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov    private String buildGroupSystemIdMatchWhereClause(String systemId) {
19943b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov        return "people._id IN "
19953b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov                + "(SELECT " + DataColumns.CONCRETE_RAW_CONTACT_ID
19963b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov                + " FROM " + Tables.DATA_JOIN_MIMETYPES
19973b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov                + " WHERE " + Data.MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE
19983b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov                        + "' AND " + GroupMembership.GROUP_ROW_ID + "="
19993b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov                                + "(SELECT " + Tables.GROUPS + "." + Groups._ID
20003b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov                                + " FROM " + Tables.GROUPS
20013b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov                                + " WHERE " + Groups.SYSTEM_ID + "="
20023b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov                                        + DatabaseUtils.sqlEscapeString(systemId) + "))";
20033b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov    }
20043b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov
2005155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov    private String getRawContactsByFilterAsNestedQuery(String filterParam) {
2006155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov        StringBuilder sb = new StringBuilder();
2007155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov        String normalizedName = NameNormalizer.normalize(filterParam);
2008155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov        if (TextUtils.isEmpty(normalizedName)) {
2009155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov            // Effectively an empty IN clause - SQL syntax does not allow an actual empty list here
2010155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov            sb.append("(0)");
2011155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov        } else {
2012155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov            sb.append("(" +
2013155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov                    "SELECT " + NameLookupColumns.RAW_CONTACT_ID +
2014155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov                    " FROM " + Tables.NAME_LOOKUP +
2015155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov                    " WHERE " + NameLookupColumns.NORMALIZED_NAME +
2016155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov                    " GLOB '");
2017155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov            // Should not use a "?" argument placeholder here, because
2018155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov            // that would prevent the SQL optimizer from using the index on NORMALIZED_NAME.
2019155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov            sb.append(normalizedName);
2020155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov            sb.append("*' AND " + NameLookupColumns.NAME_TYPE + " IN ("
2021155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov                    + NameLookupType.NAME_COLLATION_KEY + ","
2022155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov                    + NameLookupType.NICKNAME);
2023155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov            if (true) {
2024155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov                sb.append("," + NameLookupType.EMAIL_BASED_NICKNAME);
2025155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov            }
2026155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov            sb.append("))");
2027155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov        }
2028155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov        return sb.toString();
2029155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov    }
2030155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov
20313b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov    /**
2032f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     * Called when a change has been made.
2033f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     *
2034f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     * @param uri the uri that the change was made to
2035f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov     */
2036f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private void onChange(Uri uri) {
2037f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov        mContext.getContentResolver().notifyChange(android.provider.Contacts.CONTENT_URI, null);
2038f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    }
203961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
204061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    public String getType(Uri uri) {
204161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        int match = sUriMatcher.match(uri);
204261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        switch (match) {
204361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case EXTENSIONS:
204461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_EXTENSIONS:
204561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return Extensions.CONTENT_TYPE;
204661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case EXTENSIONS_ID:
204761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_EXTENSIONS_ID:
204861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return Extensions.CONTENT_ITEM_TYPE;
204961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE:
205061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/person";
205161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_ID:
205261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/person";
205361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_PHONES:
205461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/phone";
205561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_PHONES_ID:
205661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/phone";
205761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_CONTACTMETHODS:
205861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/contact-methods";
205961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_CONTACTMETHODS_ID:
206061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return getContactMethodType(uri);
206161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHONES:
206261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/phone";
206361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHONES_ID:
206461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/phone";
206561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHONES_FILTER:
206661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/phone";
206761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHOTOS_ID:
206861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/photo";
206961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PHOTOS:
207061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/photo";
207161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case PEOPLE_PHOTO:
207261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/photo";
207361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case CONTACTMETHODS:
207461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/contact-methods";
207561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case CONTACTMETHODS_ID:
207661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return getContactMethodType(uri);
207761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case ORGANIZATIONS:
207861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.dir/organizations";
207961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case ORGANIZATIONS_ID:
208061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return "vnd.android.cursor.item/organization";
208161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case SEARCH_SUGGESTIONS:
208261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return SearchManager.SUGGEST_MIME_TYPE;
208361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            case SEARCH_SHORTCUT:
208461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                return SearchManager.SHORTCUT_MIME_TYPE;
208561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            default:
2086fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov                throw new IllegalArgumentException(mDbHelper.exceptionMessage(uri));
208761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        }
208861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    }
208961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
209061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    private String getContactMethodType(Uri url) {
209161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        String mime = null;
209261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
209361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        Cursor c = query(url, new String[] {ContactMethods.KIND}, null, null, null, null);
209461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        if (c != null) {
209561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            try {
209661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                if (c.moveToFirst()) {
209761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                    int kind = c.getInt(0);
209861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                    switch (kind) {
20991b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                    case android.provider.Contacts.KIND_EMAIL:
210061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        mime = "vnd.android.cursor.item/email";
210161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        break;
210261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
21031b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                    case android.provider.Contacts.KIND_IM:
210461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        mime = "vnd.android.cursor.item/jabber-im";
210561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        break;
210661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
21071b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov                    case android.provider.Contacts.KIND_POSTAL:
210861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        mime = "vnd.android.cursor.item/postal-address";
210961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                        break;
211061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                    }
211161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                }
211261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            } finally {
211361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov                c.close();
211461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov            }
211561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        }
211661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        return mime;
211761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov    }
2118f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov}
2119