LegacyApiSupport.java revision 97f9a162b7632481988bf8639b83f37dcb42b586
1f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov/* 2f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project 3f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * 4f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); 5f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * you may not use this file except in compliance with the License. 6f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * You may obtain a copy of the License at 7f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * 8f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 9f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * 10f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 11f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, 12f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * See the License for the specific language governing permissions and 14f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * limitations under the License 15f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov */ 16f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovpackage com.android.providers.contacts; 17f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 18e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.DataColumns; 190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.ExtensionsColumns; 200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.GroupsColumns; 21e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.MimetypesColumns; 22e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.PhoneColumns; 230126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.PresenceColumns; 24c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport com.android.providers.contacts.OpenHelper.RawContactsColumns; 25f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.Tables; 26f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 27caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikovimport android.accounts.Account; 28c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.app.SearchManager; 29f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentUris; 30f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentValues; 31f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.Context; 32f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.UriMatcher; 33f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.Cursor; 34e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.database.DatabaseUtils; 35f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteDatabase; 36f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteQueryBuilder; 37f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteStatement; 38f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.net.Uri; 39f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract; 40e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.Contacts.ContactMethods; 41f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.Contacts.People; 42e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.Data; 430f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.Groups; 4470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikovimport android.provider.ContactsContract.Presence; 45c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract.RawContacts; 46e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email; 470f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 48e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im; 49f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Note; 503cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization; 51e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone; 52c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo; 53f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 5467dde51ab932dc84d95a203b113989b13437f13dJeff Sharkeyimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal; 55f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 56f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport java.util.HashMap; 57f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 58d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikovpublic class LegacyApiSupport implements OpenHelper.Delegate { 59f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 60caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov private static final String TAG = "ContactsProviderV1"; 61caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 626f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov private static final String NON_EXISTENT_ACCOUNT_TYPE = "android.INVALID_ACCOUNT_TYPE"; 6328153f2e3dda944e983f6dd0ab80aca63631ddfaJeff Hamilton private static final String NON_EXISTENT_ACCOUNT_NAME = "invalid"; 646f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov 65f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 66f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 67f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final int PEOPLE = 1; 68f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final int PEOPLE_ID = 2; 69f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final int PEOPLE_UPDATE_CONTACT_TIME = 3; 703cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private static final int ORGANIZATIONS = 4; 713cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private static final int ORGANIZATIONS_ID = 5; 72e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_CONTACTMETHODS = 6; 73e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_CONTACTMETHODS_ID = 7; 74e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int CONTACTMETHODS = 8; 75e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int CONTACTMETHODS_ID = 9; 76e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_PHONES = 10; 77e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_PHONES_ID = 11; 78e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PHONES = 12; 79e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PHONES_ID = 13; 800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int EXTENSIONS = 14; 810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int EXTENSIONS_ID = 15; 820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int PEOPLE_EXTENSIONS = 16; 830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int PEOPLE_EXTENSIONS_ID = 17; 840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int GROUPS = 18; 850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int GROUPS_ID = 19; 860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int GROUPMEMBERSHIP = 20; 870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int GROUPMEMBERSHIP_ID = 21; 880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int PEOPLE_GROUPMEMBERSHIP = 22; 890f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int PEOPLE_GROUPMEMBERSHIP_ID = 23; 90c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private static final int PEOPLE_PHOTO = 24; 91c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private static final int PHOTOS = 25; 92c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private static final int PHOTOS_ID = 26; 93445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov private static final int PEOPLE_FILTER = 29; 9433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov private static final int DELETED_PEOPLE = 30; 9533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov private static final int DELETED_GROUPS = 31; 96c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov private static final int SEARCH_SUGGESTIONS = 32; 97fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov private static final int PHONES_FILTER = 33; 98c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 99e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String PEOPLE_JOINS = 1005ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " LEFT OUTER JOIN data name ON (raw_contacts._id = name.raw_contact_id" 101e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = name.mimetype_id)" 102e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + StructuredName.CONTENT_ITEM_TYPE + "')" 1035ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " LEFT OUTER JOIN data organization ON (raw_contacts._id = organization.raw_contact_id" 104e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = organization.mimetype_id)" 105e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Organization.CONTENT_ITEM_TYPE + "' AND organization.is_primary)" 1065ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " LEFT OUTER JOIN data email ON (raw_contacts._id = email.raw_contact_id" 107e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = email.mimetype_id)" 108e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Email.CONTENT_ITEM_TYPE + "' AND email.is_primary)" 1095ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " LEFT OUTER JOIN data note ON (raw_contacts._id = note.raw_contact_id" 110e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = note.mimetype_id)" 111e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Note.CONTENT_ITEM_TYPE + "')" 1125ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " LEFT OUTER JOIN data phone ON (raw_contacts._id = phone.raw_contact_id" 113e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = phone.mimetype_id)" 114e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Phone.CONTENT_ITEM_TYPE + "' AND phone.is_primary)"; 115e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 116d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String DATA_JOINS = 117d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " JOIN mimetypes ON (mimetypes._id = data.mimetype_id)" 1185ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " JOIN raw_contacts ON (raw_contacts._id = data.raw_contact_id)" 119d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + PEOPLE_JOINS; 120d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 12170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov public static final String PRESENCE_JOINS = 12270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov " LEFT OUTER JOIN presence ON (" 12370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov + " presence.presence_id = (SELECT max(presence_id) FROM presence" 1245d0fa81285aea6cc545686a9d32736933b446482Jeff Sharkey + " WHERE view_v1_people._id = presence_raw_contact_id))"; 12570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 126e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String PHONETIC_NAME_SQL = "trim(trim(" 127e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_GIVEN_NAME + ",' ')||' '||" 128e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_MIDDLE_NAME + ",' '))||' '||" 129e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_FAMILY_NAME + ",' ')) "; 130e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 131e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String CONTACT_METHOD_KIND_SQL = 132d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "CAST ((CASE WHEN mimetype='" + Email.CONTENT_ITEM_TYPE + "'" 133e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_EMAIL 134e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 135e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " (CASE WHEN mimetype='" + Im.CONTENT_ITEM_TYPE +"'" 136e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_IM 137e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 13867dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey + " (CASE WHEN mimetype='" + StructuredPostal.CONTENT_ITEM_TYPE + "'" 139e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_POSTAL 140e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 141e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " NULL" 142e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " END)" 143e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " END)" 144d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " END) AS INTEGER)"; 145f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 14697f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov private static final String IM_PROTOCOL_SQL = 14797f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov "(CASE WHEN " + Presence.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM 14897f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " THEN 'custom:'||" + Presence.CUSTOM_PROTOCOL 14997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " ELSE 'pre:'||" + Presence.PROTOCOL 15097f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " END)"; 15197f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov 15297f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov private static String CONTACT_METHOD_DATA_SQL = 15397f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov "(CASE WHEN " + Data.MIMETYPE + "='" + Im.CONTENT_ITEM_TYPE + "'" 15497f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " THEN (CASE WHEN " + Tables.DATA + "." + Im.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM 15597f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " THEN 'custom:'||" + Tables.DATA + "." + Im.CUSTOM_PROTOCOL 15697f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " ELSE 'pre:'||" + Tables.DATA + "." + Im.PROTOCOL 15797f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " END)" 15897f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " ELSE " + DataColumns.CONCRETE_DATA2 15997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " END)"; 16097f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov 16197f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov 162f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public interface LegacyTables { 163d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String PEOPLE = "view_v1_people"; 16470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov public static final String PEOPLE_JOIN_PRESENCE = "view_v1_people" + PRESENCE_JOINS; 165d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String GROUPS = "view_v1_groups"; 166d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String ORGANIZATIONS = "view_v1_organizations"; 167d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String CONTACT_METHODS = "view_v1_contact_methods"; 168d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String PHONES = "view_v1_phones"; 169d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String EXTENSIONS = "view_v1_extensions"; 170d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String GROUP_MEMBERSHIP = "view_v1_group_membership"; 171c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String PHOTOS = "view_v1_photos"; 17270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov public static final String PRESENCE_JOIN_CONTACTS = Tables.PRESENCE + 1735ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " LEFT OUTER JOIN " + Tables.RAW_CONTACTS 1740126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov + " ON (" + Tables.PRESENCE + "." + PresenceColumns.RAW_CONTACT_ID + "=" 1756cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContactsColumns.CONCRETE_ID + ")"; 176f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 177f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 178e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] ORGANIZATION_MIME_TYPES = new String[] { 179e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Organization.CONTENT_ITEM_TYPE 180e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 181e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 182e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] CONTACT_METHOD_MIME_TYPES = new String[] { 183e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Email.CONTENT_ITEM_TYPE, 184e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Im.CONTENT_ITEM_TYPE, 18567dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey StructuredPostal.CONTENT_ITEM_TYPE, 186e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 187e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 188e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] PHONE_MIME_TYPES = new String[] { 189e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Phone.CONTENT_ITEM_TYPE 190e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 191e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 192c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private interface PhotoQuery { 193c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov String[] COLUMNS = { Data._ID }; 194c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 195c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov int _ID = 0; 196c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 197c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 198c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov /** 199c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov * A custom data row that is used to store legacy photo data fields no 200c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov * longer directly supported by the API. 201c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov */ 202c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private interface LegacyPhotoData { 203c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/photo_v1_extras"; 204c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 205c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String PHOTO_DATA_ID = Data.DATA1; 206c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String LOCAL_VERSION = Data.DATA2; 207c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String DOWNLOAD_REQUIRED = Data.DATA3; 208c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String EXISTS_ON_SERVER = Data.DATA4; 209c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String SYNC_ERROR = Data.DATA5; 210c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 211c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 212c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String LEGACY_PHOTO_JOIN = 2135ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " LEFT OUTER JOIN data legacy_photo ON (raw_contacts._id = legacy_photo.raw_contact_id" 214c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = legacy_photo.mimetype_id)" 215c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'" 216c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AND " + DataColumns.CONCRETE_ID + " = legacy_photo." + LegacyPhotoData.PHOTO_DATA_ID 217c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + ")"; 218c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 219f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final HashMap<String, String> sPeopleProjectionMap; 2203cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private static final HashMap<String, String> sOrganizationProjectionMap; 221e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final HashMap<String, String> sContactMethodProjectionMap; 222e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final HashMap<String, String> sPhoneProjectionMap; 2230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final HashMap<String, String> sExtensionProjectionMap; 2240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final HashMap<String, String> sGroupProjectionMap; 2250f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final HashMap<String, String> sGroupMembershipProjectionMap; 226c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private static final HashMap<String, String> sPhotoProjectionMap; 227fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov 228f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov static { 229f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 230f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // Contacts URI matching table 231f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov UriMatcher matcher = sUriMatcher; 232f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 233f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String authority = android.provider.Contacts.AUTHORITY; 2340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "extensions", EXTENSIONS); 2350f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "extensions/#", EXTENSIONS_ID); 2360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groups", GROUPS); 2370f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groups/#", GROUPS_ID); 238f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/name/*/members", GROUP_NAME_MEMBERS); 239f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/name/*/members/filter/*", 240f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// GROUP_NAME_MEMBERS_FILTER); 241f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/system_id/*/members", GROUP_SYSTEM_ID_MEMBERS); 242f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/system_id/*/members/filter/*", 243f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// GROUP_SYSTEM_ID_MEMBERS_FILTER); 2440f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groupmembership", GROUPMEMBERSHIP); 2450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groupmembership/#", GROUPMEMBERSHIP_ID); 246f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groupmembershipraw", GROUPMEMBERSHIP_RAW); 247f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people", PEOPLE); 248f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/strequent", PEOPLE_STREQUENT); 249f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/strequent/filter/*", PEOPLE_STREQUENT_FILTER); 250445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov matcher.addURI(authority, "people/filter/*", PEOPLE_FILTER); 251f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/with_phones_filter/*", 252f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_WITH_PHONES_FILTER); 253f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/with_email_or_im_filter/*", 254f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_WITH_EMAIL_OR_IM_FILTER); 255f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people/#", PEOPLE_ID); 2560f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/extensions", PEOPLE_EXTENSIONS); 2570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/extensions/#", PEOPLE_EXTENSIONS_ID); 258e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/phones", PEOPLE_PHONES); 259e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/phones/#", PEOPLE_PHONES_ID); 260f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/phones_with_presence", 261f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_PHONES_WITH_PRESENCE); 262c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov matcher.addURI(authority, "people/#/photo", PEOPLE_PHOTO); 263f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/photo/data", PEOPLE_PHOTO_DATA); 264e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/contact_methods", PEOPLE_CONTACTMETHODS); 265f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/contact_methods_with_presence", 266f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_CONTACTMETHODS_WITH_PRESENCE); 267e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID); 268f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/organizations", PEOPLE_ORGANIZATIONS); 269f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/organizations/#", PEOPLE_ORGANIZATIONS_ID); 2700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/groupmembership", PEOPLE_GROUPMEMBERSHIP); 2710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/groupmembership/#", PEOPLE_GROUPMEMBERSHIP_ID); 272f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/raw", PEOPLE_RAW); 273f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/owner", PEOPLE_OWNER); 274f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people/#/update_contact_time", 275f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov PEOPLE_UPDATE_CONTACT_TIME); 27633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov matcher.addURI(authority, "deleted_people", DELETED_PEOPLE); 27733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov matcher.addURI(authority, "deleted_groups", DELETED_GROUPS); 278e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "phones", PHONES); 279f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones_with_presence", PHONES_WITH_PRESENCE); 280fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov matcher.addURI(authority, "phones/filter/*", PHONES_FILTER); 281f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones/filter_name/*", PHONES_FILTER_NAME); 282f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones/mobile_filter_name/*", 283f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PHONES_MOBILE_FILTER_NAME); 284e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "phones/#", PHONES_ID); 285c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov matcher.addURI(authority, "photos", PHOTOS); 286c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov matcher.addURI(authority, "photos/#", PHOTOS_ID); 287e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "contact_methods", CONTACTMETHODS); 288f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "contact_methods/email", CONTACTMETHODS_EMAIL); 289f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "contact_methods/email/*", CONTACTMETHODS_EMAIL_FILTER); 290e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "contact_methods/#", CONTACTMETHODS_ID); 291f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "contact_methods/with_presence", 292f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// CONTACTMETHODS_WITH_PRESENCE); 2933cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov matcher.addURI(authority, "organizations", ORGANIZATIONS); 2943cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov matcher.addURI(authority, "organizations/#", ORGANIZATIONS_ID); 295f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "voice_dialer_timestamp", VOICE_DIALER_TIMESTAMP); 296c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY, 297c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov SEARCH_SUGGESTIONS); 298c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", 299c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov SEARCH_SUGGESTIONS); 300f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/#", 301f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// SEARCH_SHORTCUT); 302f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "settings", SETTINGS); 303f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// 304f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "live_folders/people", LIVE_FOLDERS_PEOPLE); 305f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "live_folders/people/*", 306f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// LIVE_FOLDERS_PEOPLE_GROUP_NAME); 307f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "live_folders/people_with_phones", 308f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// LIVE_FOLDERS_PEOPLE_WITH_PHONES); 309f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "live_folders/favorites", 310f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// LIVE_FOLDERS_PEOPLE_FAVORITES); 311f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 312f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 313e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov HashMap<String, String> peopleProjectionMap = new HashMap<String, String>(); 314d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.NAME, People.NAME); 315d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.DISPLAY_NAME, People.DISPLAY_NAME); 316d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.PHONETIC_NAME, People.PHONETIC_NAME); 317d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.NOTES, People.NOTES); 318d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.TIMES_CONTACTED, People.TIMES_CONTACTED); 319d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.LAST_TIME_CONTACTED, People.LAST_TIME_CONTACTED); 320d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.CUSTOM_RINGTONE, People.CUSTOM_RINGTONE); 321d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.SEND_TO_VOICEMAIL, People.SEND_TO_VOICEMAIL); 322d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.STARRED, People.STARRED); 323e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 324e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPeopleProjectionMap = new HashMap<String, String>(peopleProjectionMap); 3259155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sPeopleProjectionMap.put(People._ID, People._ID); 326d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.PRIMARY_ORGANIZATION_ID, People.PRIMARY_ORGANIZATION_ID); 327d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.PRIMARY_EMAIL_ID, People.PRIMARY_EMAIL_ID); 328d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.PRIMARY_PHONE_ID, People.PRIMARY_PHONE_ID); 329d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.NUMBER, People.NUMBER); 330d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.TYPE, People.TYPE); 331d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.LABEL, People.LABEL); 332d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.NUMBER_KEY, People.NUMBER_KEY); 3330126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov sPeopleProjectionMap.put(People.IM_PROTOCOL, IM_PROTOCOL_SQL + " AS " + People.IM_PROTOCOL); 33470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.IM_HANDLE, People.IM_HANDLE); 33570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.IM_ACCOUNT, People.IM_ACCOUNT); 33670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.PRESENCE_STATUS, People.PRESENCE_STATUS); 33770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.PRESENCE_CUSTOM_STATUS, People.PRESENCE_CUSTOM_STATUS); 3383cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 3393cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap = new HashMap<String, String>(); 3409155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations._ID, 3419155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.Organizations._ID); 3423cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.PERSON_ID, 343d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.PERSON_ID); 3443cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.ISPRIMARY, 345d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.ISPRIMARY); 3463cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.COMPANY, 347d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.COMPANY); 3483cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TYPE, 349d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.TYPE); 3503cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.LABEL, 351d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.LABEL); 3523cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TITLE, 353d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.TITLE); 354e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 355e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sContactMethodProjectionMap = new HashMap<String, String>(peopleProjectionMap); 3569155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods._ID, ContactMethods._ID); 357d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.PERSON_ID, ContactMethods.PERSON_ID); 358d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.KIND, ContactMethods.KIND); 359d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.ISPRIMARY, ContactMethods.ISPRIMARY); 360d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.TYPE, ContactMethods.TYPE); 361d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.DATA, ContactMethods.DATA); 362d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.LABEL, ContactMethods.LABEL); 363d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.AUX_DATA, ContactMethods.AUX_DATA); 364e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 365e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap = new HashMap<String, String>(peopleProjectionMap); 3669155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones._ID, 3679155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.Phones._ID); 368e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.PERSON_ID, 369d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.PERSON_ID); 370e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.ISPRIMARY, 371d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.ISPRIMARY); 372e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER, 373d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.NUMBER); 374e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.TYPE, 375d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.TYPE); 376e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.LABEL, 377d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.LABEL); 378e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER_KEY, 379d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.NUMBER_KEY); 3800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 3810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap = new HashMap<String, String>(); 3829155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions._ID, 3839155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.Extensions._ID); 3840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions.PERSON_ID, 385d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Extensions.PERSON_ID); 3860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions.NAME, 387d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Extensions.NAME); 3880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions.VALUE, 389d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Extensions.VALUE); 3900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 3910f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap = new HashMap<String, String>(); 3920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups._ID, 393d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups._ID); 3940f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups.NAME, 395d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups.NAME); 3960f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups.NOTES, 397d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups.NOTES); 3980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups.SYSTEM_ID, 399d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups.SYSTEM_ID); 4000f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 4010f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupMembershipProjectionMap = new HashMap<String, String>(); 4029155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership._ID, 4039155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.GroupMembership._ID); 4040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.PERSON_ID, 405d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.GroupMembership.PERSON_ID); 4060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.GROUP_ID, 407d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.GroupMembership.GROUP_ID); 408c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 409c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap = new HashMap<String, String>(); 4109155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos._ID, 4119155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.Photos._ID); 412c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.PERSON_ID, 413c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.PERSON_ID); 414c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.DATA, 415c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.DATA); 416c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.LOCAL_VERSION, 417c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.LOCAL_VERSION); 418c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.DOWNLOAD_REQUIRED, 419c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.DOWNLOAD_REQUIRED); 420c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.EXISTS_ON_SERVER, 421c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.EXISTS_ON_SERVER); 422c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.SYNC_ERROR, 423c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.SYNC_ERROR); 424f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 425f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 426f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final Context mContext; 427f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final OpenHelper mOpenHelper; 428f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final ContactsProvider2 mContactsProvider; 429f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final NameSplitter mPhoneticNameSplitter; 430a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov private final GlobalSearchSupport mGlobalSearchSupport; 431f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 432d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov /** Precompiled sql statement for incrementing times contacted for a contact */ 4333cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private final SQLiteStatement mLastTimeContactedUpdate; 4343cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 4353cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private final ContentValues mValues = new ContentValues(); 436caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov private Account mAccount; 437a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 438f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public LegacyApiSupport(Context context, OpenHelper openHelper, 439a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov ContactsProvider2 contactsProvider, GlobalSearchSupport globalSearchSupport) { 440f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContext = context; 441f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContactsProvider = contactsProvider; 442f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mOpenHelper = openHelper; 443a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov mGlobalSearchSupport = globalSearchSupport; 444d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov mOpenHelper.setDelegate(this); 445f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 446f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mPhoneticNameSplitter = new NameSplitter("", "", "", 447f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov context.getString(com.android.internal.R.string.common_name_conjunctions)); 448f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 449f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov SQLiteDatabase db = mOpenHelper.getReadableDatabase(); 4505ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mLastTimeContactedUpdate = db.compileStatement("UPDATE " + Tables.RAW_CONTACTS + " SET " 4516cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContacts.TIMES_CONTACTED + "=" 4526cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContacts.TIMES_CONTACTED + "+1," 4536cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContacts.LAST_TIME_CONTACTED + "=? WHERE " 4546cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContacts._ID + "=?"); 455f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 456f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 457caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov private void ensureDefaultAccount() { 458caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov if (mAccount == null) { 459caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov mAccount = mContactsProvider.getDefaultAccount(); 4606f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov if (mAccount == null) { 4616f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov 4626f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov // This fall-through account will not match any data in the database, which 4636f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov // is the expected behavior 46428153f2e3dda944e983f6dd0ab80aca63631ddfaJeff Hamilton mAccount = new Account(NON_EXISTENT_ACCOUNT_NAME, NON_EXISTENT_ACCOUNT_TYPE); 4656f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov } 466caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 467caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 468d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 469d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public void createDatabase(SQLiteDatabase db) { 470d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 471d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PEOPLE + ";"); 472d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.PEOPLE + " AS SELECT " + 4736cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContactsColumns.CONCRETE_ID 474d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.People._ID + ", " + 475d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "name." + StructuredName.DISPLAY_NAME 476d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.NAME + ", " + 4775ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME 478d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.DISPLAY_NAME + ", " + 479d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov PHONETIC_NAME_SQL 480d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PHONETIC_NAME + " , " + 481d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "note." + Note.NOTE 482d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.NOTES + ", " + 483caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 484caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 4855ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED 486d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.TIMES_CONTACTED + ", " + 4875ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED 488d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.LAST_TIME_CONTACTED + ", " + 4895ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE 490d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.CUSTOM_RINGTONE + ", " + 4915ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL 492d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.SEND_TO_VOICEMAIL + ", " + 4935ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.STARRED 494d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.STARRED + ", " + 495d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "organization." + Data._ID 496d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PRIMARY_ORGANIZATION_ID + ", " + 497d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "email." + Data._ID 498d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PRIMARY_EMAIL_ID + ", " + 499d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Data._ID 500d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PRIMARY_PHONE_ID + ", " + 501d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Phone.NUMBER 502d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.NUMBER + ", " + 503d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Phone.TYPE 504d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.TYPE + ", " + 505d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Phone.LABEL 506d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.LABEL + ", " + 507d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + PhoneColumns.NORMALIZED_NUMBER 508caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + People.NUMBER_KEY + 5095ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + PEOPLE_JOINS + 510caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov " WHERE " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 511caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 512d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 513d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 514d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.ORGANIZATIONS + ";"); 515d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.ORGANIZATIONS + " AS SELECT " + 516d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 517d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations._ID + ", " + 5185ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Data.RAW_CONTACT_ID 519d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.PERSON_ID + ", " + 520d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Data.IS_PRIMARY 521d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.ISPRIMARY + ", " + 522caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 523caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 524d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.COMPANY 525d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.COMPANY + ", " + 526d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.TYPE 527d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.TYPE + ", " + 528d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.LABEL 529d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.LABEL + ", " + 530d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.TITLE 531caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.TITLE + 5325ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS + 533d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 53433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + Organization.CONTENT_ITEM_TYPE + "'" 535caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 536caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 537d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 538d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 539d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.CONTACT_METHODS + ";"); 540d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.CONTACT_METHODS + " AS SELECT " + 541d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 542d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods._ID + ", " + 543d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 544d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.PERSON_ID + ", " + 545d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov CONTACT_METHOD_KIND_SQL 546d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.KIND + ", " + 547d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_IS_PRIMARY 548d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.ISPRIMARY + ", " + 549d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_DATA1 550d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.TYPE + ", " + 55197f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov CONTACT_METHOD_DATA_SQL 552d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.DATA + ", " + 553d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_DATA3 554d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.LABEL + ", " + 555d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_DATA14 556d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.AUX_DATA + ", " + 557d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "name." + StructuredName.DISPLAY_NAME 558d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.NAME + ", " + 5595ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME 560d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.DISPLAY_NAME + ", " + 561caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 562caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 563d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov PHONETIC_NAME_SQL 564d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.PHONETIC_NAME + " , " + 565d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "note." + Note.NOTE 566d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.NOTES + ", " + 5675ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED 568d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.TIMES_CONTACTED + ", " + 5695ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED 570d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.LAST_TIME_CONTACTED + ", " + 5715ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE 572d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.CUSTOM_RINGTONE + ", " + 5735ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL 574d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.SEND_TO_VOICEMAIL + ", " + 5755ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.STARRED 576caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + ContactMethods.STARRED + 577d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.DATA + DATA_JOINS + 57833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov " WHERE " + ContactMethods.KIND + " IS NOT NULL" 579caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 580caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 581d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 582d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 583d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 584d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHONES + ";"); 585d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.PHONES + " AS SELECT " + 586d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 587d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones._ID + ", " + 588d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 589d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.PERSON_ID + ", " + 590d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_IS_PRIMARY 591d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.ISPRIMARY + ", " + 592d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Tables.DATA + "." + Phone.NUMBER 593d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NUMBER + ", " + 594d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Tables.DATA + "." + Phone.TYPE 595d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.TYPE + ", " + 596d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Tables.DATA + "." + Phone.LABEL 597d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.LABEL + ", " + 598d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov PhoneColumns.CONCRETE_NORMALIZED_NUMBER 599d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NUMBER_KEY + ", " + 600d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "name." + StructuredName.DISPLAY_NAME 601d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NAME + ", " + 6025ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME 603d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.DISPLAY_NAME + ", " + 604caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 605caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 606d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov PHONETIC_NAME_SQL 607d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.PHONETIC_NAME + " , " + 608d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "note." + Note.NOTE 609d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NOTES + ", " + 6105ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED 611d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.TIMES_CONTACTED + ", " + 6125ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED 613d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.LAST_TIME_CONTACTED + ", " + 6145ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE 615d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.CUSTOM_RINGTONE + ", " + 6165ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL 617d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.SEND_TO_VOICEMAIL + ", " + 6185ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.STARRED 619caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.STARRED + 620d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.DATA + DATA_JOINS + 621d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 62233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + Phone.CONTENT_ITEM_TYPE + "'" 623caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 624caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 625d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 626d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 627d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.EXTENSIONS + ";"); 628d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.EXTENSIONS + " AS SELECT " + 629d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 630d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions._ID + ", " + 631d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 632d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions.PERSON_ID + ", " + 633caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 634caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 635d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ExtensionsColumns.NAME 636d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions.NAME + ", " + 637d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ExtensionsColumns.VALUE 638caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions.VALUE + 6395ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS + 640d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 64133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE + "'" 642caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 643caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 644d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 645d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 646d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUPS + ";"); 647d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.GROUPS + " AS SELECT " + 648d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov GroupsColumns.CONCRETE_ID + " AS " + android.provider.Contacts.Groups._ID + ", " + 649caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov Groups.ACCOUNT_NAME + ", " + 650caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov Groups.ACCOUNT_TYPE + ", " + 651d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.TITLE + " AS " + android.provider.Contacts.Groups.NAME + ", " + 652d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.NOTES + " AS " + android.provider.Contacts.Groups.NOTES + " , " + 653d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.SYSTEM_ID + " AS " + android.provider.Contacts.Groups.SYSTEM_ID + 654d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.GROUPS + 655d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 656d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 657d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUP_MEMBERSHIP + ";"); 658d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.GROUP_MEMBERSHIP + " AS SELECT " + 659d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 660d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership._ID + ", " + 661d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 662d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.PERSON_ID + ", " + 663caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_NAME 664caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + RawContacts.ACCOUNT_NAME + ", " + 665caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_TYPE 666caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + RawContacts.ACCOUNT_TYPE + ", " + 667d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov GroupMembership.GROUP_ROW_ID 668d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.GROUP_ID + ", " + 669d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.TITLE 670d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.NAME + ", " + 671d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.NOTES 672d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.NOTES + " , " + 673d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.SYSTEM_ID 674caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.SYSTEM_ID + 6755ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " FROM " + Tables.DATA_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_GROUPS + 676d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 67733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + GroupMembership.CONTENT_ITEM_TYPE + "'" 6785ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" + 679d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 680c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 681c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHOTOS + ";"); 682c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.PHOTOS + " AS SELECT " + 683c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov DataColumns.CONCRETE_ID 684c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos._ID + ", " + 685d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 686c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.PERSON_ID + ", " + 687caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 688caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 689c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Tables.DATA + "." + Photo.PHOTO 690c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.DATA + ", " + 691c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.EXISTS_ON_SERVER 692c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.EXISTS_ON_SERVER + ", " + 693c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.DOWNLOAD_REQUIRED 694c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.DOWNLOAD_REQUIRED + ", " + 695c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.LOCAL_VERSION 696c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.LOCAL_VERSION + ", " + 697c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.SYNC_ERROR 698caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.SYNC_ERROR + 699c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov " FROM " + Tables.DATA + DATA_JOINS + LEGACY_PHOTO_JOIN + 700c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 70133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + Photo.CONTENT_ITEM_TYPE + "'" 702caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 703caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 704c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov ";"); 705d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov } 706d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 707f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public Uri insert(Uri uri, ContentValues values) { 708f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final int match = sUriMatcher.match(uri); 709f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long id = 0; 710f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch (match) { 711f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE: 7123cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov id = insertPeople(values); 7133cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 7143cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 7153cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS: 7163cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov id = insertOrganization(values); 717f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 718f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 7190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_CONTACTMETHODS: { 7205ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = Long.parseLong(uri.getPathSegments().get(1)); 7215ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertContactMethod(rawContactId, values); 722e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 7230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 724e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7250f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case CONTACTMETHODS: { 7265ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = getRequiredValue(values, ContactMethods.PERSON_ID); 7275ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertContactMethod(rawContactId, values); 728e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 7290f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 730e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7310f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PHONES: { 7325ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = getRequiredValue(values, 7330f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.Phones.PERSON_ID); 7345ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertPhone(rawContactId, values); 7350f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 7360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 7370f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 7380f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case EXTENSIONS: { 7395ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = getRequiredValue(values, 7400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.Extensions.PERSON_ID); 7415ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertExtension(rawContactId, values); 7420f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 7430f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 7440f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 7450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPS: 7460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov id = insertGroup(values); 747e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 748e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7490f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPMEMBERSHIP: { 7505ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = getRequiredValue(values, 7510f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.GroupMembership.PERSON_ID); 7520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov long groupId = getRequiredValue(values, 7530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.GroupMembership.GROUP_ID); 7545ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertGroupMembership(rawContactId, groupId); 7550f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 7560f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 7570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 758f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov default: 759f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 760f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 761f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 762f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (id < 0) { 763f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return null; 764f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 765f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 766f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final Uri result = ContentUris.withAppendedId(uri, id); 767f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov onChange(result); 768f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return result; 769f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 770f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 7710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private long getRequiredValue(ContentValues values, String column) { 7720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov if (!values.containsKey(column)) { 7730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov throw new RuntimeException("Required value: " + column); 774e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 775e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return values.getAsLong(column); 777e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 778e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7793cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private long insertPeople(ContentValues values) { 780caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov ensureDefaultAccount(); 781caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 7823cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.clear(); 783f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 7846cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov OpenHelper.copyStringValue(mValues, RawContacts.CUSTOM_RINGTONE, 785f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.CUSTOM_RINGTONE); 7866cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov OpenHelper.copyLongValue(mValues, RawContacts.SEND_TO_VOICEMAIL, 787f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.SEND_TO_VOICEMAIL); 7886cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov OpenHelper.copyLongValue(mValues, RawContacts.LAST_TIME_CONTACTED, 789f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.LAST_TIME_CONTACTED); 7906cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov OpenHelper.copyLongValue(mValues, RawContacts.TIMES_CONTACTED, 791f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.TIMES_CONTACTED); 7926cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov OpenHelper.copyLongValue(mValues, RawContacts.STARRED, 793f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.STARRED); 794df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana mValues.put(RawContacts.ACCOUNT_NAME, mAccount.name); 795df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana mValues.put(RawContacts.ACCOUNT_TYPE, mAccount.type); 7966cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Uri contactUri = mContactsProvider.insert(RawContacts.CONTENT_URI, mValues); 7975ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = ContentUris.parseId(contactUri); 798f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 799f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.NAME) || values.containsKey(People.PHONETIC_NAME)) { 8003cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.clear(); 8015ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); 8023cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(ContactsContract.Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 8033cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, StructuredName.DISPLAY_NAME, 804f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.NAME); 805f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.PHONETIC_NAME)) { 806f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String phoneticName = values.getAsString(People.PHONETIC_NAME); 807f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov NameSplitter.Name parsedName = new NameSplitter.Name(); 808f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mPhoneticNameSplitter.split(parsedName, phoneticName); 8093cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(StructuredName.PHONETIC_GIVEN_NAME, parsedName.getGivenNames()); 8103cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(StructuredName.PHONETIC_MIDDLE_NAME, parsedName.getMiddleName()); 8113cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(StructuredName.PHONETIC_FAMILY_NAME, parsedName.getFamilyName()); 812f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 813f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 8143cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mContactsProvider.insert(ContactsContract.Data.CONTENT_URI, mValues); 815f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 816f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 817f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.NOTES)) { 8183cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.clear(); 8195ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 8203cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE); 8213cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, Note.NOTE, values, People.NOTES); 8223cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mContactsProvider.insert(Data.CONTENT_URI, mValues); 823f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 824f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 825f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // TODO instant aggregation 8265ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov return rawContactId; 827f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 828f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 8293cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private long insertOrganization(ContentValues values) { 8303cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.clear(); 8313cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8325ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov OpenHelper.copyLongValue(mValues, Data.RAW_CONTACT_ID, 8333cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.PERSON_ID); 8343cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE); 8353cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8363cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY, 8373cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.ISPRIMARY); 8383cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8393cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, Organization.COMPANY, 8403cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.COMPANY); 8413cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8423cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov // TYPE values happen to remain the same between V1 and V2 - can just copy the value 8433cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyLongValue(mValues, Organization.TYPE, 8443cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.TYPE); 8453cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8463cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, Organization.LABEL, 8473cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.LABEL); 8483cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, Organization.TITLE, 8493cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.TITLE); 8503cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8513cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues); 8523cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8533cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov return ContentUris.parseId(uri); 8543cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 855f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 8565ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private long insertPhone(long rawContactId, ContentValues values) { 857e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.clear(); 858e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 8595ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 860e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 861e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 862e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY, 863e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov values, android.provider.Contacts.Phones.ISPRIMARY); 864e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 865e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Phone.NUMBER, 866e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov values, android.provider.Contacts.Phones.NUMBER); 867e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 868e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov // TYPE values happen to remain the same between V1 and V2 - can just copy the value 869e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyLongValue(mValues, Phone.TYPE, 870e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov values, android.provider.Contacts.Phones.TYPE); 871e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 872e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Phone.LABEL, 873e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov values, android.provider.Contacts.Phones.LABEL); 874e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 875e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues); 876e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 877e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov return ContentUris.parseId(uri); 878e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 879e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 8805ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private long insertContactMethod(long rawContactId, ContentValues values) { 881e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Integer kind = values.getAsInteger(ContactMethods.KIND); 882e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov if (kind == null) { 883e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov throw new RuntimeException("Required value: " + ContactMethods.KIND); 884e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 885e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 886e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.clear(); 8875ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 888e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 889e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY, values, ContactMethods.ISPRIMARY); 890e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 891e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov switch (kind) { 8920126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov case android.provider.Contacts.KIND_EMAIL: { 893e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov copyCommonFields(values, Email.CONTENT_ITEM_TYPE, Email.TYPE, Email.LABEL, 8940126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov Data.DATA14); 8950126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Email.DATA, values, ContactMethods.DATA); 896e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 8970126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov } 8980126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov 8990126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov case android.provider.Contacts.KIND_IM: { 9000126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov String protocol = values.getAsString(ContactMethods.DATA); 9010126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov if (protocol.startsWith("pre:")) { 9020126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov mValues.put(Im.PROTOCOL, Integer.parseInt(protocol.substring(4))); 9030126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov } else if (protocol.startsWith("custom:")) { 9040126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov mValues.put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM); 9050126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov mValues.put(Im.CUSTOM_PROTOCOL, protocol.substring(7)); 9060126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov } 907e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 9080126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov copyCommonFields(values, Im.CONTENT_ITEM_TYPE, Im.TYPE, Im.LABEL, Data.DATA14); 909e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 9100126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov } 911e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 9120126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov case android.provider.Contacts.KIND_POSTAL: { 91367dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey copyCommonFields(values, StructuredPostal.CONTENT_ITEM_TYPE, StructuredPostal.TYPE, 9140126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov StructuredPostal.LABEL, Data.DATA14); 9150126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov OpenHelper.copyStringValue(mValues, StructuredPostal.FORMATTED_ADDRESS, values, 9160126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov ContactMethods.DATA); 917e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 9180126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov } 919e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 920e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 921e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues); 922e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov return ContentUris.parseId(uri); 923e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 924e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 925e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private void copyCommonFields(ContentValues values, String mimeType, String typeColumn, 9260126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov String labelColumn, String auxDataColumn) { 927e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.put(Data.MIMETYPE, mimeType); 928e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyLongValue(mValues, typeColumn, values, ContactMethods.TYPE); 929e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, labelColumn, values, ContactMethods.LABEL); 930e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, auxDataColumn, values, ContactMethods.AUX_DATA); 931e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 932e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 9335ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private long insertExtension(long rawContactId, ContentValues values) { 9340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.clear(); 9350f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9365ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 9370f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(Data.MIMETYPE, android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE); 9380f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9390f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov OpenHelper.copyStringValue(mValues, ExtensionsColumns.NAME, 9400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov values, android.provider.Contacts.People.Extensions.NAME); 9410f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov OpenHelper.copyStringValue(mValues, ExtensionsColumns.VALUE, 9420f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov values, android.provider.Contacts.People.Extensions.VALUE); 9430f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9440f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues); 9450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return ContentUris.parseId(uri); 9460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 9470f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private long insertGroup(ContentValues values) { 949caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov ensureDefaultAccount(); 9500f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.clear(); 9510f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Groups.TITLE, 9530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov values, android.provider.Contacts.Groups.NAME); 9540f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Groups.NOTES, 9550f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov values, android.provider.Contacts.Groups.NOTES); 9560f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Groups.SYSTEM_ID, 9570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov values, android.provider.Contacts.Groups.SYSTEM_ID); 9580f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 959df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana mValues.put(Groups.ACCOUNT_NAME, mAccount.name); 960df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana mValues.put(Groups.ACCOUNT_TYPE, mAccount.type); 961caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 9620f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov Uri uri = mContactsProvider.insert(Groups.CONTENT_URI, mValues); 9630f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return ContentUris.parseId(uri); 9640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 9650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9665ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private long insertGroupMembership(long rawContactId, long groupId) { 9670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.clear(); 9680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); 9705ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(GroupMembership.RAW_CONTACT_ID, rawContactId); 9710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(GroupMembership.GROUP_ROW_ID, groupId); 9720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues); 9740f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return ContentUris.parseId(uri); 9750f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 9760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 977f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 978f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final int match = sUriMatcher.match(uri); 979c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov int count = 0; 980f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch(match) { 981f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE_UPDATE_CONTACT_TIME: 982f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov count = updateContactTime(uri, values); 983f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 984c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 985c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PEOPLE_PHOTO: { 9865ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = Long.parseLong(uri.getPathSegments().get(1)); 9875ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov return updatePhoto(rawContactId, values); 988c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 989c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 990c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PHOTOS: 991c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov // TODO 992c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov break; 993c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 994c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PHOTOS_ID: 995c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov // TODO 996c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov break; 997c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 998c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 999f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov default: 1000f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 1001f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1002f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1003f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (count > 0) { 1004f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContext.getContentResolver().notifyChange(uri, null); 1005f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1006f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return count; 1007f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1008f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1009c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1010f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private int updateContactTime(Uri uri, ContentValues values) { 1011f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1012f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // TODO check sanctions 1013f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1014f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long lastTimeContacted; 1015f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.LAST_TIME_CONTACTED)) { 1016f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov lastTimeContacted = values.getAsLong(People.LAST_TIME_CONTACTED); 1017f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } else { 1018f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov lastTimeContacted = System.currentTimeMillis(); 1019f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1020f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 10215ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = Long.parseLong(uri.getPathSegments().get(1)); 1022d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId = mOpenHelper.getContactId(rawContactId); 1023d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov if (contactId != 0) { 1024d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov mContactsProvider.updateContactTime(contactId, lastTimeContacted); 1025f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } else { 1026f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mLastTimeContactedUpdate.bindLong(1, lastTimeContacted); 10275ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mLastTimeContactedUpdate.bindLong(2, rawContactId); 1028f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mLastTimeContactedUpdate.execute(); 1029f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1030f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return 1; 1031f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1032f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 10335ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private int updatePhoto(long rawContactId, ContentValues values) { 1034c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1035c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov // TODO check sanctions 1036c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1037c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov int count; 1038c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1039c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov long dataId = -1; 1040c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Cursor c = mContactsProvider.query(Data.CONTENT_URI, PhotoQuery.COLUMNS, 10415ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Data.RAW_CONTACT_ID + "=" + rawContactId + " AND " 1042c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + Data.MIMETYPE + "=" + mOpenHelper.getMimeTypeId(Photo.CONTENT_ITEM_TYPE), 1043c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov null, null); 1044c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov try { 1045c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov if (c.moveToFirst()) { 1046c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov dataId = c.getLong(PhotoQuery._ID); 1047c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1048c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } finally { 1049c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov c.close(); 1050c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1051c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1052c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.clear(); 1053c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA); 1054c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(Photo.PHOTO, bytes); 1055c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1056c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov if (dataId == -1) { 1057c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 10585ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 1059c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Uri dataUri = mContactsProvider.insert(Data.CONTENT_URI, mValues); 1060c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov dataId = ContentUris.parseId(dataUri); 1061c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov count = 1; 1062c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } else { 1063c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Uri dataUri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId); 1064c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov count = mContactsProvider.update(dataUri, mValues, null, null); 1065c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1066c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1067c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.clear(); 1068c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov OpenHelper.copyStringValue(mValues, LegacyPhotoData.LOCAL_VERSION, 1069c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.LOCAL_VERSION); 1070c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov OpenHelper.copyStringValue(mValues, LegacyPhotoData.DOWNLOAD_REQUIRED, 1071c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.DOWNLOAD_REQUIRED); 1072c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov OpenHelper.copyStringValue(mValues, LegacyPhotoData.EXISTS_ON_SERVER, 1073c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.EXISTS_ON_SERVER); 1074c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov OpenHelper.copyStringValue(mValues, LegacyPhotoData.SYNC_ERROR, 1075c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.SYNC_ERROR); 1076c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1077c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov int updated = mContactsProvider.update(Data.CONTENT_URI, mValues, 1078c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Data.MIMETYPE + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'" 10795ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " AND " + Data.RAW_CONTACT_ID + "=" + rawContactId 1080c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AND " + LegacyPhotoData.PHOTO_DATA_ID + "=" + dataId, null); 1081c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov if (updated == 0) { 10825ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 1083c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(Data.MIMETYPE, LegacyPhotoData.CONTENT_ITEM_TYPE); 1084c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(LegacyPhotoData.PHOTO_DATA_ID, dataId); 1085c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mContactsProvider.insert(Data.CONTENT_URI, mValues); 1086c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1087c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1088c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov return count; 1089c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1090c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 10913cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov public int delete(Uri uri, String selection, String[] selectionArgs) { 10923cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov final int match = sUriMatcher.match(uri); 10933cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov int count = 0; 10943cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov switch (match) { 109533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov case PEOPLE_ID: 109633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov count = mContactsProvider.deleteRawContact(ContentUris.parseId(uri), false); 109733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov break; 109833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 10993cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS_ID: 1100e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1101e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov ORGANIZATION_MIME_TYPES); 1102e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1103e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1104e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS_ID: 1105e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1106e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov CONTACT_METHOD_MIME_TYPES); 1107e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1108e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1109e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES_ID: 1110e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1111e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov PHONE_MIME_TYPES); 11123cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 11133cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 11143cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov default: 11153cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 11163cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 11173cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 11183cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov return count; 11193cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 11203cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 1121f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 1122c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov String sortOrder, String limit) { 1123caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov ensureDefaultAccount(); 1124caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 1125f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final SQLiteDatabase db = mOpenHelper.getReadableDatabase(); 1126f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 1127f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String groupBy = null; 1128f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1129f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final int match = sUriMatcher.match(uri); 1130f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch (match) { 1131f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE: { 113270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 1133f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 1134caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1135f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 1136f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1137f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1138f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE_ID: 113970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 1140f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 1141caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1142caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov qb.appendWhere(" AND " + People._ID + "="); 1143f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1144f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 1145f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1146445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov case PEOPLE_FILTER: { 1147445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 1148445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 1149caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1150445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov String filterParam = uri.getPathSegments().get(2); 1151caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov qb.appendWhere(" AND " + People._ID + " IN " 11525ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + mContactsProvider.getRawContactsByFilterAsNestedQuery(filterParam)); 1153445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov break; 1154445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov } 1155445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov 11563cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS: 1157d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.ORGANIZATIONS); 1158d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sOrganizationProjectionMap); 1159caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 11603cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 11613cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 11623cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS_ID: 1163d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.ORGANIZATIONS); 11643cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov qb.setProjectionMap(sOrganizationProjectionMap); 1165caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1166d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Organizations._ID + "="); 1167e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1168e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1169e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1170e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS: 1171d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS); 1172d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 1173caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1174e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1175e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1176e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS_ID: 1177d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS); 1178e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 1179caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1180d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods._ID + "="); 1181e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1182e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1183e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1184e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_CONTACTMETHODS: 1185d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS); 1186e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 1187caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1188d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "="); 1189e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1190e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL"); 1191e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1192e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1193e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_CONTACTMETHODS_ID: 1194d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS); 1195e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 1196caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1197d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "="); 1198e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1199d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods._ID + "="); 1200e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 1201e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL"); 1202e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1203e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1204e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES: 1205d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.PHONES); 1206d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 1207caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1208e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1209e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1210e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES_ID: 1211d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.PHONES); 1212e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 1213caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1214d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "="); 1215e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1216e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1217e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1218fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov case PHONES_FILTER: 1219fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov qb.setTables(LegacyTables.PHONES); 1220fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 1221fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov applyRawContactsAccount(qb, uri); 1222fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov if (uri.getPathSegments().size() > 2) { 1223fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov String filterParam = uri.getLastPathSegment(); 1224e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov qb.appendWhere(" AND person ="); 1225e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov qb.appendWhere(mOpenHelper.buildPhoneLookupAsNestedQuery(filterParam)); 1226fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov } 1227fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov break; 1228fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov 1229e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_PHONES: 1230d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.PHONES); 1231e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 1232caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1233d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "="); 1234e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1235e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1236e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1237e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_PHONES_ID: 1238d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.PHONES); 1239e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 1240caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1241d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "="); 12423cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1243d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "="); 1244e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 12453cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 12463cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 12470f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case EXTENSIONS: 1248d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS); 1249d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 1250caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 12510f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 12520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 12530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case EXTENSIONS_ID: 1254d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS); 12550f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 1256caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1257d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "="); 12580f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 12590f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 12600f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 12610f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_EXTENSIONS: 1262d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS); 12630f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 1264caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1265d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "="); 12660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 12670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 12680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 12690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_EXTENSIONS_ID: 1270d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS); 12710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 1272caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1273d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "="); 12740f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1275d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "="); 12760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 12770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 12780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 12790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPS: 1280d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.GROUPS); 12810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupProjectionMap); 1282caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyGroupAccount(qb, uri); 12830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 12840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 12850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPS_ID: 1286d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.GROUPS); 12870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupProjectionMap); 1288caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyGroupAccount(qb, uri); 1289caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Groups._ID + "="); 12900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 12910f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 12920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 12930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPMEMBERSHIP: 1294d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP); 1295d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 1296caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 12970f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 12980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 12990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPMEMBERSHIP_ID: 1300d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP); 13010f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 1302caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1303d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "="); 13040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 13050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 13060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 13070f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_GROUPMEMBERSHIP: 1308d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP); 13090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 1310caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1311d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "="); 13120f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 13130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 13140f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 13150f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_GROUPMEMBERSHIP_ID: 1316d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP); 13170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 1318caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1319d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "="); 13200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1321d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "="); 13220f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 13230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 13240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 1325c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PEOPLE_PHOTO: 1326c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov qb.setTables(LegacyTables.PHOTOS); 1327c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov qb.setProjectionMap(sPhotoProjectionMap); 1328caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov applyRawContactsAccount(qb, uri); 1329c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Photos.PERSON_ID + "="); 1330c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1331c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov limit = "1"; 1332c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov break; 1333c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1334c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov case SEARCH_SUGGESTIONS: 1335c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 1336c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov // No legacy compatibility for search suggestions 1337a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov return mGlobalSearchSupport.handleSearchSuggestionsQuery(db, uri, limit); 1338c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 133933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov case DELETED_PEOPLE: 134033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov case DELETED_GROUPS: 134133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov throw new UnsupportedOperationException(); 134233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 1343f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov default: 1344f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov throw new IllegalArgumentException("Unknown URL " + uri); 1345f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1346f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1347f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // Perform the query and set the notification uri 1348f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final Cursor c = qb.query(db, projection, selection, selectionArgs, 1349f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov groupBy, null, sortOrder, limit); 1350f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (c != null) { 13516cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov c.setNotificationUri(mContext.getContentResolver(), RawContacts.CONTENT_URI); 1352f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1353f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return c; 1354f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1355f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1356caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov private void applyRawContactsAccount(SQLiteQueryBuilder qb, Uri uri) { 1357caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov StringBuilder sb = new StringBuilder(); 1358caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov sb.append(RawContacts.ACCOUNT_NAME + "="); 1359df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana DatabaseUtils.appendEscapedSQLString(sb, mAccount.name); 1360caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov sb.append(" AND " + RawContacts.ACCOUNT_TYPE + "="); 1361df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana DatabaseUtils.appendEscapedSQLString(sb, mAccount.type); 1362caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov qb.appendWhere(sb.toString()); 1363caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 1364caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 1365caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov private void applyGroupAccount(SQLiteQueryBuilder qb, Uri uri) { 1366caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov StringBuilder sb = new StringBuilder(); 1367caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov sb.append(Groups.ACCOUNT_NAME + "="); 1368df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana DatabaseUtils.appendEscapedSQLString(sb, mAccount.name); 1369caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov sb.append(" AND " + Groups.ACCOUNT_TYPE + "="); 1370df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana DatabaseUtils.appendEscapedSQLString(sb, mAccount.type); 1371caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov qb.appendWhere(sb.toString()); 1372caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 1373caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 1374f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov /** 1375f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * Called when a change has been made. 1376f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * 1377f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * @param uri the uri that the change was made to 1378f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov */ 1379f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private void onChange(Uri uri) { 1380f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContext.getContentResolver().notifyChange(android.provider.Contacts.CONTENT_URI, null); 1381f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1382f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov} 1383