LegacyApiSupport.java revision bce6ee29f2d971ceae2bfce85a06bb3ecec6537a
1f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov/* 2f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project 3f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * 4f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); 5f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * you may not use this file except in compliance with the License. 6f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * You may obtain a copy of the License at 7f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * 8f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 9f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * 10f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 11f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, 12f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * See the License for the specific language governing permissions and 14f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * limitations under the License 15f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov */ 16f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovpackage com.android.providers.contacts; 17f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 18e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.DataColumns; 190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.ExtensionsColumns; 200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.GroupsColumns; 21e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.MimetypesColumns; 22e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.PhoneColumns; 23c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport com.android.providers.contacts.OpenHelper.RawContactsColumns; 24f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.Tables; 25f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 26caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikovimport android.accounts.Account; 27c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.app.SearchManager; 28f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentUris; 29f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentValues; 30f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.Context; 31f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.UriMatcher; 32f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.Cursor; 33e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.database.DatabaseUtils; 34f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteDatabase; 35f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteQueryBuilder; 36f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteStatement; 37f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.net.Uri; 3867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikovimport android.provider.BaseColumns; 39f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract; 40e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.Contacts.ContactMethods; 4161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikovimport android.provider.Contacts.Extensions; 42f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.Contacts.People; 43e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.Data; 440f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.Groups; 4570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikovimport android.provider.ContactsContract.Presence; 46c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract.RawContacts; 47e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email; 480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 49e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im; 50f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Note; 513cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization; 52e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone; 53c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo; 54f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 5567dde51ab932dc84d95a203b113989b13437f13dJeff Sharkeyimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal; 56b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamiltonimport android.util.Log; 57f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 58f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport java.util.HashMap; 59622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkeyimport java.util.Locale; 60f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 61b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamiltonpublic class LegacyApiSupport { 62f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 63caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov private static final String TAG = "ContactsProviderV1"; 64caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 656f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov private static final String NON_EXISTENT_ACCOUNT_TYPE = "android.INVALID_ACCOUNT_TYPE"; 6628153f2e3dda944e983f6dd0ab80aca63631ddfaJeff Hamilton private static final String NON_EXISTENT_ACCOUNT_NAME = "invalid"; 676f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov 68f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 69f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 70f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final int PEOPLE = 1; 71f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final int PEOPLE_ID = 2; 72f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final int PEOPLE_UPDATE_CONTACT_TIME = 3; 733cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private static final int ORGANIZATIONS = 4; 743cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private static final int ORGANIZATIONS_ID = 5; 75e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_CONTACTMETHODS = 6; 76e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_CONTACTMETHODS_ID = 7; 77e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int CONTACTMETHODS = 8; 78e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int CONTACTMETHODS_ID = 9; 79e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_PHONES = 10; 80e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_PHONES_ID = 11; 81e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PHONES = 12; 82e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PHONES_ID = 13; 830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int EXTENSIONS = 14; 840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int EXTENSIONS_ID = 15; 850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int PEOPLE_EXTENSIONS = 16; 860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int PEOPLE_EXTENSIONS_ID = 17; 870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int GROUPS = 18; 880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int GROUPS_ID = 19; 890f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int GROUPMEMBERSHIP = 20; 900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int GROUPMEMBERSHIP_ID = 21; 910f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int PEOPLE_GROUPMEMBERSHIP = 22; 920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int PEOPLE_GROUPMEMBERSHIP_ID = 23; 93c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private static final int PEOPLE_PHOTO = 24; 94c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private static final int PHOTOS = 25; 95c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private static final int PHOTOS_ID = 26; 96445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov private static final int PEOPLE_FILTER = 29; 9733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov private static final int DELETED_PEOPLE = 30; 9833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov private static final int DELETED_GROUPS = 31; 99c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov private static final int SEARCH_SUGGESTIONS = 32; 100b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov private static final int SEARCH_SHORTCUT = 33; 101b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov private static final int PHONES_FILTER = 34; 1021b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private static final int LIVE_FOLDERS_PEOPLE = 35; 1031b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private static final int LIVE_FOLDERS_PEOPLE_GROUP_NAME = 36; 1041b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private static final int LIVE_FOLDERS_PEOPLE_WITH_PHONES = 37; 1051b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private static final int LIVE_FOLDERS_PEOPLE_FAVORITES = 38; 106bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov private static final int CONTACTMETHODS_EMAIL = 39; 107c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 108e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String PEOPLE_JOINS = 1095ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " LEFT OUTER JOIN data name ON (raw_contacts._id = name.raw_contact_id" 110e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = name.mimetype_id)" 111e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + StructuredName.CONTENT_ITEM_TYPE + "')" 1125ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " LEFT OUTER JOIN data organization ON (raw_contacts._id = organization.raw_contact_id" 113e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = organization.mimetype_id)" 114e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Organization.CONTENT_ITEM_TYPE + "' AND organization.is_primary)" 1155ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " LEFT OUTER JOIN data email ON (raw_contacts._id = email.raw_contact_id" 116e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = email.mimetype_id)" 117e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Email.CONTENT_ITEM_TYPE + "' AND email.is_primary)" 1185ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " LEFT OUTER JOIN data note ON (raw_contacts._id = note.raw_contact_id" 119e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = note.mimetype_id)" 120e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Note.CONTENT_ITEM_TYPE + "')" 1215ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " LEFT OUTER JOIN data phone ON (raw_contacts._id = phone.raw_contact_id" 122e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = phone.mimetype_id)" 123e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Phone.CONTENT_ITEM_TYPE + "' AND phone.is_primary)"; 124e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 125d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String DATA_JOINS = 126d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " JOIN mimetypes ON (mimetypes._id = data.mimetype_id)" 1275ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " JOIN raw_contacts ON (raw_contacts._id = data.raw_contact_id)" 128d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + PEOPLE_JOINS; 129d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 13070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov public static final String PRESENCE_JOINS = 13170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov " LEFT OUTER JOIN presence ON (" 13270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov + " presence.presence_id = (SELECT max(presence_id) FROM presence" 1335dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov + " WHERE people._id = presence_raw_contact_id))"; 13470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 135e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String PHONETIC_NAME_SQL = "trim(trim(" 136e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_GIVEN_NAME + ",' ')||' '||" 137e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_MIDDLE_NAME + ",' '))||' '||" 138e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_FAMILY_NAME + ",' ')) "; 139e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 140e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String CONTACT_METHOD_KIND_SQL = 141d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "CAST ((CASE WHEN mimetype='" + Email.CONTENT_ITEM_TYPE + "'" 142e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_EMAIL 143e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 144e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " (CASE WHEN mimetype='" + Im.CONTENT_ITEM_TYPE +"'" 145e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_IM 146e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 14767dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey + " (CASE WHEN mimetype='" + StructuredPostal.CONTENT_ITEM_TYPE + "'" 148e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_POSTAL 149e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 150e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " NULL" 151e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " END)" 152e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " END)" 153d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " END) AS INTEGER)"; 154f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 15597f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov private static final String IM_PROTOCOL_SQL = 15697f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov "(CASE WHEN " + Presence.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM 15797f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " THEN 'custom:'||" + Presence.CUSTOM_PROTOCOL 15897f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " ELSE 'pre:'||" + Presence.PROTOCOL 15997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " END)"; 16097f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov 16197f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov private static String CONTACT_METHOD_DATA_SQL = 16297f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov "(CASE WHEN " + Data.MIMETYPE + "='" + Im.CONTENT_ITEM_TYPE + "'" 16397f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " THEN (CASE WHEN " + Tables.DATA + "." + Im.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM 16497f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " THEN 'custom:'||" + Tables.DATA + "." + Im.CUSTOM_PROTOCOL 16597f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " ELSE 'pre:'||" + Tables.DATA + "." + Im.PROTOCOL 16697f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " END)" 16797f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " ELSE " + DataColumns.CONCRETE_DATA2 16897f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " END)"; 16997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov 1701b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private static final Uri LIVE_FOLDERS_CONTACTS_URI = Uri.withAppendedPath( 1711b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov ContactsContract.AUTHORITY_URI, "live_folders/contacts"); 1721b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 1731b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private static final Uri LIVE_FOLDERS_CONTACTS_WITH_PHONES_URI = Uri.withAppendedPath( 1741b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov ContactsContract.AUTHORITY_URI, "live_folders/contacts_with_phones"); 1751b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 1761b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private static final Uri LIVE_FOLDERS_CONTACTS_FAVORITES_URI = Uri.withAppendedPath( 1771b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov ContactsContract.AUTHORITY_URI, "live_folders/favorites"); 17897f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov 179f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public interface LegacyTables { 180d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String PEOPLE = "view_v1_people"; 1815dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov public static final String PEOPLE_JOIN_PRESENCE = "view_v1_people people " + PRESENCE_JOINS; 182d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String GROUPS = "view_v1_groups"; 183d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String ORGANIZATIONS = "view_v1_organizations"; 184d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String CONTACT_METHODS = "view_v1_contact_methods"; 185d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String PHONES = "view_v1_phones"; 186d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String EXTENSIONS = "view_v1_extensions"; 187d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String GROUP_MEMBERSHIP = "view_v1_group_membership"; 188c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String PHOTOS = "view_v1_photos"; 189f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 190f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 191e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] ORGANIZATION_MIME_TYPES = new String[] { 192e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Organization.CONTENT_ITEM_TYPE 193e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 194e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 195e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] CONTACT_METHOD_MIME_TYPES = new String[] { 196e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Email.CONTENT_ITEM_TYPE, 197e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Im.CONTENT_ITEM_TYPE, 19867dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey StructuredPostal.CONTENT_ITEM_TYPE, 199e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 200e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 201e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] PHONE_MIME_TYPES = new String[] { 202e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Phone.CONTENT_ITEM_TYPE 203e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 204e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 20567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private interface IdQuery { 20667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov String[] COLUMNS = { BaseColumns._ID }; 207c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 208c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov int _ID = 0; 209c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 210c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 211c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov /** 212c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov * A custom data row that is used to store legacy photo data fields no 213c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov * longer directly supported by the API. 214c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov */ 215c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private interface LegacyPhotoData { 216c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/photo_v1_extras"; 217c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 218c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String PHOTO_DATA_ID = Data.DATA1; 219c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String LOCAL_VERSION = Data.DATA2; 220c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String DOWNLOAD_REQUIRED = Data.DATA3; 221c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String EXISTS_ON_SERVER = Data.DATA4; 222c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String SYNC_ERROR = Data.DATA5; 223c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 224c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 225c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String LEGACY_PHOTO_JOIN = 2265ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " LEFT OUTER JOIN data legacy_photo ON (raw_contacts._id = legacy_photo.raw_contact_id" 227c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = legacy_photo.mimetype_id)" 228c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'" 229c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AND " + DataColumns.CONCRETE_ID + " = legacy_photo." + LegacyPhotoData.PHOTO_DATA_ID 230c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + ")"; 231c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 232f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final HashMap<String, String> sPeopleProjectionMap; 2333cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private static final HashMap<String, String> sOrganizationProjectionMap; 234e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final HashMap<String, String> sContactMethodProjectionMap; 235e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final HashMap<String, String> sPhoneProjectionMap; 2360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final HashMap<String, String> sExtensionProjectionMap; 2370f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final HashMap<String, String> sGroupProjectionMap; 2380f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final HashMap<String, String> sGroupMembershipProjectionMap; 239c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private static final HashMap<String, String> sPhotoProjectionMap; 240fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov 241f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov static { 242f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 243f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // Contacts URI matching table 244f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov UriMatcher matcher = sUriMatcher; 245f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 246f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String authority = android.provider.Contacts.AUTHORITY; 2470f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "extensions", EXTENSIONS); 2480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "extensions/#", EXTENSIONS_ID); 2490f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groups", GROUPS); 2500f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groups/#", GROUPS_ID); 251f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/name/*/members", GROUP_NAME_MEMBERS); 252f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/name/*/members/filter/*", 253f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// GROUP_NAME_MEMBERS_FILTER); 254f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/system_id/*/members", GROUP_SYSTEM_ID_MEMBERS); 255f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/system_id/*/members/filter/*", 256f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// GROUP_SYSTEM_ID_MEMBERS_FILTER); 2570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groupmembership", GROUPMEMBERSHIP); 2580f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groupmembership/#", GROUPMEMBERSHIP_ID); 259f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groupmembershipraw", GROUPMEMBERSHIP_RAW); 260f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people", PEOPLE); 261f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/strequent", PEOPLE_STREQUENT); 262f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/strequent/filter/*", PEOPLE_STREQUENT_FILTER); 263445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov matcher.addURI(authority, "people/filter/*", PEOPLE_FILTER); 264f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/with_phones_filter/*", 265f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_WITH_PHONES_FILTER); 266f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/with_email_or_im_filter/*", 267f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_WITH_EMAIL_OR_IM_FILTER); 268f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people/#", PEOPLE_ID); 2690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/extensions", PEOPLE_EXTENSIONS); 2700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/extensions/#", PEOPLE_EXTENSIONS_ID); 271e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/phones", PEOPLE_PHONES); 272e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/phones/#", PEOPLE_PHONES_ID); 273f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/phones_with_presence", 274f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_PHONES_WITH_PRESENCE); 275c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov matcher.addURI(authority, "people/#/photo", PEOPLE_PHOTO); 276f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/photo/data", PEOPLE_PHOTO_DATA); 277e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/contact_methods", PEOPLE_CONTACTMETHODS); 278f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/contact_methods_with_presence", 279f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_CONTACTMETHODS_WITH_PRESENCE); 280e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID); 281f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/organizations", PEOPLE_ORGANIZATIONS); 282f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/organizations/#", PEOPLE_ORGANIZATIONS_ID); 2830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/groupmembership", PEOPLE_GROUPMEMBERSHIP); 2840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/groupmembership/#", PEOPLE_GROUPMEMBERSHIP_ID); 285f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/raw", PEOPLE_RAW); 286f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/owner", PEOPLE_OWNER); 287f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people/#/update_contact_time", 288f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov PEOPLE_UPDATE_CONTACT_TIME); 28933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov matcher.addURI(authority, "deleted_people", DELETED_PEOPLE); 29033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov matcher.addURI(authority, "deleted_groups", DELETED_GROUPS); 291e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "phones", PHONES); 292f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones_with_presence", PHONES_WITH_PRESENCE); 293fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov matcher.addURI(authority, "phones/filter/*", PHONES_FILTER); 294f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones/filter_name/*", PHONES_FILTER_NAME); 295f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones/mobile_filter_name/*", 296f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PHONES_MOBILE_FILTER_NAME); 297e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "phones/#", PHONES_ID); 298c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov matcher.addURI(authority, "photos", PHOTOS); 299c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov matcher.addURI(authority, "photos/#", PHOTOS_ID); 300e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "contact_methods", CONTACTMETHODS); 301bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov matcher.addURI(authority, "contact_methods/email", CONTACTMETHODS_EMAIL); 302f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "contact_methods/email/*", CONTACTMETHODS_EMAIL_FILTER); 303e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "contact_methods/#", CONTACTMETHODS_ID); 304f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "contact_methods/with_presence", 305f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// CONTACTMETHODS_WITH_PRESENCE); 3063cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov matcher.addURI(authority, "organizations", ORGANIZATIONS); 3073cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov matcher.addURI(authority, "organizations/#", ORGANIZATIONS_ID); 308f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "voice_dialer_timestamp", VOICE_DIALER_TIMESTAMP); 309c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY, 310c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov SEARCH_SUGGESTIONS); 311c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", 312c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov SEARCH_SUGGESTIONS); 313b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/#", 314b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov SEARCH_SHORTCUT); 315f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "settings", SETTINGS); 316f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// 3171b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov matcher.addURI(authority, "live_folders/people", LIVE_FOLDERS_PEOPLE); 3181b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov matcher.addURI(authority, "live_folders/people/*", 3191b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov LIVE_FOLDERS_PEOPLE_GROUP_NAME); 3201b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov matcher.addURI(authority, "live_folders/people_with_phones", 3211b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov LIVE_FOLDERS_PEOPLE_WITH_PHONES); 3221b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov matcher.addURI(authority, "live_folders/favorites", 3231b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov LIVE_FOLDERS_PEOPLE_FAVORITES); 324f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 325f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 326e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov HashMap<String, String> peopleProjectionMap = new HashMap<String, String>(); 327d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.NAME, People.NAME); 328d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.DISPLAY_NAME, People.DISPLAY_NAME); 329d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.PHONETIC_NAME, People.PHONETIC_NAME); 330d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.NOTES, People.NOTES); 331d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.TIMES_CONTACTED, People.TIMES_CONTACTED); 332d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.LAST_TIME_CONTACTED, People.LAST_TIME_CONTACTED); 333d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.CUSTOM_RINGTONE, People.CUSTOM_RINGTONE); 334d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.SEND_TO_VOICEMAIL, People.SEND_TO_VOICEMAIL); 335d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.STARRED, People.STARRED); 336e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 337e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPeopleProjectionMap = new HashMap<String, String>(peopleProjectionMap); 3389155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sPeopleProjectionMap.put(People._ID, People._ID); 339d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.PRIMARY_ORGANIZATION_ID, People.PRIMARY_ORGANIZATION_ID); 340d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.PRIMARY_EMAIL_ID, People.PRIMARY_EMAIL_ID); 341d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.PRIMARY_PHONE_ID, People.PRIMARY_PHONE_ID); 342d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.NUMBER, People.NUMBER); 343d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.TYPE, People.TYPE); 344d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.LABEL, People.LABEL); 345d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.NUMBER_KEY, People.NUMBER_KEY); 3460126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov sPeopleProjectionMap.put(People.IM_PROTOCOL, IM_PROTOCOL_SQL + " AS " + People.IM_PROTOCOL); 34770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.IM_HANDLE, People.IM_HANDLE); 34870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.IM_ACCOUNT, People.IM_ACCOUNT); 34970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.PRESENCE_STATUS, People.PRESENCE_STATUS); 35070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.PRESENCE_CUSTOM_STATUS, People.PRESENCE_CUSTOM_STATUS); 3513cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 3523cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap = new HashMap<String, String>(); 3539155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations._ID, 3549155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.Organizations._ID); 3553cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.PERSON_ID, 356d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.PERSON_ID); 3573cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.ISPRIMARY, 358d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.ISPRIMARY); 3593cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.COMPANY, 360d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.COMPANY); 3613cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TYPE, 362d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.TYPE); 3633cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.LABEL, 364d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.LABEL); 3653cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TITLE, 366d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.TITLE); 367e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 368e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sContactMethodProjectionMap = new HashMap<String, String>(peopleProjectionMap); 3699155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods._ID, ContactMethods._ID); 370d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.PERSON_ID, ContactMethods.PERSON_ID); 371d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.KIND, ContactMethods.KIND); 372d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.ISPRIMARY, ContactMethods.ISPRIMARY); 373d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.TYPE, ContactMethods.TYPE); 374d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.DATA, ContactMethods.DATA); 375d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.LABEL, ContactMethods.LABEL); 376d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.AUX_DATA, ContactMethods.AUX_DATA); 377e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 378e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap = new HashMap<String, String>(peopleProjectionMap); 3799155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones._ID, 3809155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.Phones._ID); 381e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.PERSON_ID, 382d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.PERSON_ID); 383e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.ISPRIMARY, 384d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.ISPRIMARY); 385e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER, 386d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.NUMBER); 387e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.TYPE, 388d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.TYPE); 389e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.LABEL, 390d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.LABEL); 391e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER_KEY, 392d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.NUMBER_KEY); 3930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 3940f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap = new HashMap<String, String>(); 3959155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions._ID, 3969155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.Extensions._ID); 3970f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions.PERSON_ID, 398d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Extensions.PERSON_ID); 3990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions.NAME, 400d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Extensions.NAME); 4010f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions.VALUE, 402d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Extensions.VALUE); 4030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 4040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap = new HashMap<String, String>(); 4050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups._ID, 406d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups._ID); 4070f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups.NAME, 408d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups.NAME); 4090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups.NOTES, 410d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups.NOTES); 4110f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups.SYSTEM_ID, 412d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups.SYSTEM_ID); 4130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 4140f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupMembershipProjectionMap = new HashMap<String, String>(); 4159155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership._ID, 4169155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.GroupMembership._ID); 4170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.PERSON_ID, 418d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.GroupMembership.PERSON_ID); 4190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.GROUP_ID, 420d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.GroupMembership.GROUP_ID); 421c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 422c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap = new HashMap<String, String>(); 4239155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos._ID, 4249155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.Photos._ID); 425c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.PERSON_ID, 426c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.PERSON_ID); 427c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.DATA, 428c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.DATA); 429c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.LOCAL_VERSION, 430c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.LOCAL_VERSION); 431c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.DOWNLOAD_REQUIRED, 432c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.DOWNLOAD_REQUIRED); 433c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.EXISTS_ON_SERVER, 434c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.EXISTS_ON_SERVER); 435c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.SYNC_ERROR, 436c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.SYNC_ERROR); 437f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 438f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 439f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final Context mContext; 440f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final OpenHelper mOpenHelper; 441f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final ContactsProvider2 mContactsProvider; 442f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final NameSplitter mPhoneticNameSplitter; 443a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov private final GlobalSearchSupport mGlobalSearchSupport; 444f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 445d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov /** Precompiled sql statement for incrementing times contacted for a contact */ 4463cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private final SQLiteStatement mLastTimeContactedUpdate; 4473cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 4483cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private final ContentValues mValues = new ContentValues(); 44967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private final ContentValues mValues2 = new ContentValues(); 45067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private final ContentValues mValues3 = new ContentValues(); 451caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov private Account mAccount; 452a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 453f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public LegacyApiSupport(Context context, OpenHelper openHelper, 454a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov ContactsProvider2 contactsProvider, GlobalSearchSupport globalSearchSupport) { 455f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContext = context; 456f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContactsProvider = contactsProvider; 457f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mOpenHelper = openHelper; 458a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov mGlobalSearchSupport = globalSearchSupport; 459f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 460622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey mPhoneticNameSplitter = new NameSplitter("", "", "", context 461622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey .getString(com.android.internal.R.string.common_name_conjunctions), Locale 462622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey .getDefault()); 463f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 464f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov SQLiteDatabase db = mOpenHelper.getReadableDatabase(); 4655ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mLastTimeContactedUpdate = db.compileStatement("UPDATE " + Tables.RAW_CONTACTS + " SET " 4666cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContacts.TIMES_CONTACTED + "=" 4676cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContacts.TIMES_CONTACTED + "+1," 4686cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContacts.LAST_TIME_CONTACTED + "=? WHERE " 4696cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContacts._ID + "=?"); 470f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 471f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 472caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov private void ensureDefaultAccount() { 473caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov if (mAccount == null) { 474caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov mAccount = mContactsProvider.getDefaultAccount(); 4756f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov if (mAccount == null) { 4766f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov 4776f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov // This fall-through account will not match any data in the database, which 4786f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov // is the expected behavior 47928153f2e3dda944e983f6dd0ab80aca63631ddfaJeff Hamilton mAccount = new Account(NON_EXISTENT_ACCOUNT_NAME, NON_EXISTENT_ACCOUNT_TYPE); 4806f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov } 481caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 482caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 483d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 484b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamilton public static void createDatabase(SQLiteDatabase db) { 485b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamilton Log.i(TAG, "Bootstrapping database legacy support"); 486d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 487d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PEOPLE + ";"); 488d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.PEOPLE + " AS SELECT " + 4896cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContactsColumns.CONCRETE_ID 490d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.People._ID + ", " + 491d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "name." + StructuredName.DISPLAY_NAME 492d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.NAME + ", " + 4935ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME 494d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.DISPLAY_NAME + ", " + 495d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov PHONETIC_NAME_SQL 496d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PHONETIC_NAME + " , " + 497d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "note." + Note.NOTE 498d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.NOTES + ", " + 499caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 500caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 5015ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED 502d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.TIMES_CONTACTED + ", " + 5035ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED 504d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.LAST_TIME_CONTACTED + ", " + 5055ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE 506d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.CUSTOM_RINGTONE + ", " + 5075ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL 508d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.SEND_TO_VOICEMAIL + ", " + 5095ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.STARRED 510d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.STARRED + ", " + 511d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "organization." + Data._ID 512d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PRIMARY_ORGANIZATION_ID + ", " + 513d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "email." + Data._ID 514d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PRIMARY_EMAIL_ID + ", " + 515d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Data._ID 516d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PRIMARY_PHONE_ID + ", " + 517d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Phone.NUMBER 518d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.NUMBER + ", " + 519d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Phone.TYPE 520d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.TYPE + ", " + 521d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Phone.LABEL 522d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.LABEL + ", " + 523d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + PhoneColumns.NORMALIZED_NUMBER 524caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + People.NUMBER_KEY + 5255ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + PEOPLE_JOINS + 526caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov " WHERE " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 527caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 528d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 529d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 530d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.ORGANIZATIONS + ";"); 531d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.ORGANIZATIONS + " AS SELECT " + 532d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 533d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations._ID + ", " + 5345ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Data.RAW_CONTACT_ID 535d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.PERSON_ID + ", " + 536d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Data.IS_PRIMARY 537d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.ISPRIMARY + ", " + 538caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 539caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 540d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.COMPANY 541d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.COMPANY + ", " + 542d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.TYPE 543d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.TYPE + ", " + 544d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.LABEL 545d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.LABEL + ", " + 546d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.TITLE 547caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.TITLE + 5485ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS + 549d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 55033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + Organization.CONTENT_ITEM_TYPE + "'" 551caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 552caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 553d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 554d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 555d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.CONTACT_METHODS + ";"); 556d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.CONTACT_METHODS + " AS SELECT " + 557d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 558d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods._ID + ", " + 559d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 560d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.PERSON_ID + ", " + 561d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov CONTACT_METHOD_KIND_SQL 562d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.KIND + ", " + 563d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_IS_PRIMARY 564d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.ISPRIMARY + ", " + 565d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_DATA1 566d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.TYPE + ", " + 56797f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov CONTACT_METHOD_DATA_SQL 568d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.DATA + ", " + 569d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_DATA3 570d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.LABEL + ", " + 571d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_DATA14 572d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.AUX_DATA + ", " + 573d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "name." + StructuredName.DISPLAY_NAME 574d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.NAME + ", " + 5755ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME 576d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.DISPLAY_NAME + ", " + 577caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 578caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 579d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov PHONETIC_NAME_SQL 580d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.PHONETIC_NAME + " , " + 581d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "note." + Note.NOTE 582d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.NOTES + ", " + 5835ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED 584d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.TIMES_CONTACTED + ", " + 5855ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED 586d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.LAST_TIME_CONTACTED + ", " + 5875ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE 588d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.CUSTOM_RINGTONE + ", " + 5895ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL 590d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.SEND_TO_VOICEMAIL + ", " + 5915ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.STARRED 592caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + ContactMethods.STARRED + 593d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.DATA + DATA_JOINS + 59433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov " WHERE " + ContactMethods.KIND + " IS NOT NULL" 595caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 596caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 597d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 598d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 599d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 600d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHONES + ";"); 601d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.PHONES + " AS SELECT " + 602d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 603d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones._ID + ", " + 604d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 605d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.PERSON_ID + ", " + 606d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_IS_PRIMARY 607d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.ISPRIMARY + ", " + 608d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Tables.DATA + "." + Phone.NUMBER 609d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NUMBER + ", " + 610d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Tables.DATA + "." + Phone.TYPE 611d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.TYPE + ", " + 612d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Tables.DATA + "." + Phone.LABEL 613d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.LABEL + ", " + 614d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov PhoneColumns.CONCRETE_NORMALIZED_NUMBER 615d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NUMBER_KEY + ", " + 616d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "name." + StructuredName.DISPLAY_NAME 617d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NAME + ", " + 6185ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME 619d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.DISPLAY_NAME + ", " + 620caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 621caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 622d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov PHONETIC_NAME_SQL 623d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.PHONETIC_NAME + " , " + 624d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "note." + Note.NOTE 625d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NOTES + ", " + 6265ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED 627d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.TIMES_CONTACTED + ", " + 6285ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED 629d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.LAST_TIME_CONTACTED + ", " + 6305ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE 631d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.CUSTOM_RINGTONE + ", " + 6325ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL 633d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.SEND_TO_VOICEMAIL + ", " + 6345ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.STARRED 635caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.STARRED + 636d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.DATA + DATA_JOINS + 637d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 63833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + Phone.CONTENT_ITEM_TYPE + "'" 639caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 640caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 641d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 642d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 643d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.EXTENSIONS + ";"); 644d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.EXTENSIONS + " AS SELECT " + 645d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 646d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions._ID + ", " + 647d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 648d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions.PERSON_ID + ", " + 649caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 650caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 651d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ExtensionsColumns.NAME 652d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions.NAME + ", " + 653d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ExtensionsColumns.VALUE 654caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions.VALUE + 6555ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS + 656d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 65733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE + "'" 658caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 659caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 660d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 661d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 662d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUPS + ";"); 663d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.GROUPS + " AS SELECT " + 664d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov GroupsColumns.CONCRETE_ID + " AS " + android.provider.Contacts.Groups._ID + ", " + 665caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov Groups.ACCOUNT_NAME + ", " + 666caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov Groups.ACCOUNT_TYPE + ", " + 667d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.TITLE + " AS " + android.provider.Contacts.Groups.NAME + ", " + 668d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.NOTES + " AS " + android.provider.Contacts.Groups.NOTES + " , " + 669d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.SYSTEM_ID + " AS " + android.provider.Contacts.Groups.SYSTEM_ID + 670d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.GROUPS + 671d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 672d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 673d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUP_MEMBERSHIP + ";"); 674d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.GROUP_MEMBERSHIP + " AS SELECT " + 675d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 676d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership._ID + ", " + 677d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 678d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.PERSON_ID + ", " + 679caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_NAME 680caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + RawContacts.ACCOUNT_NAME + ", " + 681caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_TYPE 682caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + RawContacts.ACCOUNT_TYPE + ", " + 683d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov GroupMembership.GROUP_ROW_ID 684d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.GROUP_ID + ", " + 685d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.TITLE 686d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.NAME + ", " + 687d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.NOTES 688d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.NOTES + " , " + 689d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.SYSTEM_ID 690caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.SYSTEM_ID + 6915ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " FROM " + Tables.DATA_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_GROUPS + 692d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 69333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + GroupMembership.CONTENT_ITEM_TYPE + "'" 6945ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" + 695d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 696c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 697c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHOTOS + ";"); 698c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.PHOTOS + " AS SELECT " + 699c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov DataColumns.CONCRETE_ID 700c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos._ID + ", " + 701d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 702c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.PERSON_ID + ", " + 703caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 704caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 705c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Tables.DATA + "." + Photo.PHOTO 706c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.DATA + ", " + 707c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.EXISTS_ON_SERVER 708c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.EXISTS_ON_SERVER + ", " + 709c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.DOWNLOAD_REQUIRED 710c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.DOWNLOAD_REQUIRED + ", " + 711c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.LOCAL_VERSION 712c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.LOCAL_VERSION + ", " + 713c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.SYNC_ERROR 714caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.SYNC_ERROR + 715c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov " FROM " + Tables.DATA + DATA_JOINS + LEGACY_PHOTO_JOIN + 716c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 71733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + Photo.CONTENT_ITEM_TYPE + "'" 718caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 719caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 720c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov ";"); 721d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov } 722d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 723f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public Uri insert(Uri uri, ContentValues values) { 72467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov ensureDefaultAccount(); 725f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final int match = sUriMatcher.match(uri); 726f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long id = 0; 727f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch (match) { 728f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE: 7293cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov id = insertPeople(values); 7303cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 7313cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 7323cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS: 7333cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov id = insertOrganization(values); 734f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 735f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 7360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_CONTACTMETHODS: { 7375ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = Long.parseLong(uri.getPathSegments().get(1)); 7385ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertContactMethod(rawContactId, values); 739e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 7400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 741e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7420f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case CONTACTMETHODS: { 7435ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = getRequiredValue(values, ContactMethods.PERSON_ID); 7445ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertContactMethod(rawContactId, values); 745e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 7460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 747e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PHONES: { 7495ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = getRequiredValue(values, 7500f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.Phones.PERSON_ID); 7515ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertPhone(rawContactId, values); 7520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 7530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 7540f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 75594743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton case PEOPLE_PHONES: { 75694743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton long rawContactId = Long.parseLong(uri.getPathSegments().get(1)); 75794743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton id = insertPhone(rawContactId, values); 75894743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton break; 75994743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton } 76094743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton 7610f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case EXTENSIONS: { 7625ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = getRequiredValue(values, 7630f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.Extensions.PERSON_ID); 7645ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertExtension(rawContactId, values); 7650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 7660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 7670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 7680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPS: 7690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov id = insertGroup(values); 770e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 771e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPMEMBERSHIP: { 7735ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = getRequiredValue(values, 7740f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.GroupMembership.PERSON_ID); 7750f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov long groupId = getRequiredValue(values, 7760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.GroupMembership.GROUP_ID); 7775ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertGroupMembership(rawContactId, groupId); 7780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 7790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 7800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 781f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov default: 782f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 783f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 784f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 785f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (id < 0) { 786f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return null; 787f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 788f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 789f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final Uri result = ContentUris.withAppendedId(uri, id); 790f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov onChange(result); 791f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return result; 792f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 793f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 7940f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private long getRequiredValue(ContentValues values, String column) { 7950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov if (!values.containsKey(column)) { 7960f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov throw new RuntimeException("Required value: " + column); 797e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 798e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return values.getAsLong(column); 800e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 801e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 8023cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private long insertPeople(ContentValues values) { 80367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov parsePeopleValues(values, mValues, mValues2, mValues3); 804caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 80567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri contactUri = mContactsProvider.insertInTransaction(RawContacts.CONTENT_URI, mValues); 80667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov long rawContactId = ContentUris.parseId(contactUri); 80767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 80867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (mValues2.size() != 0) { 80967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mValues2.put(Data.RAW_CONTACT_ID, rawContactId); 81067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues2); 81167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 81267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (mValues3.size() != 0) { 81367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mValues3.put(Data.RAW_CONTACT_ID, rawContactId); 81467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues3); 81567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 816f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 81767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov // TODO instant aggregation 81867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return rawContactId; 81967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 82067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 82167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private void parsePeopleValues(ContentValues values, ContentValues peopleValues, 82267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov ContentValues nameValues, ContentValues noteValues) { 82367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov peopleValues.clear(); 82467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov nameValues.clear(); 82567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov noteValues.clear(); 82667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 82767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov OpenHelper.copyStringValue(peopleValues, RawContacts.CUSTOM_RINGTONE, 828f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.CUSTOM_RINGTONE); 82967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov OpenHelper.copyLongValue(peopleValues, RawContacts.SEND_TO_VOICEMAIL, 830f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.SEND_TO_VOICEMAIL); 83167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov OpenHelper.copyLongValue(peopleValues, RawContacts.LAST_TIME_CONTACTED, 832f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.LAST_TIME_CONTACTED); 83367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov OpenHelper.copyLongValue(peopleValues, RawContacts.TIMES_CONTACTED, 834f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.TIMES_CONTACTED); 83567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov OpenHelper.copyLongValue(peopleValues, RawContacts.STARRED, 836f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.STARRED); 83767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov peopleValues.put(RawContacts.ACCOUNT_NAME, mAccount.name); 83867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov peopleValues.put(RawContacts.ACCOUNT_TYPE, mAccount.type); 839f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 840f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.NAME) || values.containsKey(People.PHONETIC_NAME)) { 84167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov nameValues.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 84267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov OpenHelper.copyStringValue(nameValues, StructuredName.DISPLAY_NAME, 843f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.NAME); 844f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.PHONETIC_NAME)) { 845f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String phoneticName = values.getAsString(People.PHONETIC_NAME); 846f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov NameSplitter.Name parsedName = new NameSplitter.Name(); 847f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mPhoneticNameSplitter.split(parsedName, phoneticName); 84867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov nameValues.put(StructuredName.PHONETIC_GIVEN_NAME, parsedName.getGivenNames()); 84967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov nameValues.put(StructuredName.PHONETIC_MIDDLE_NAME, parsedName.getMiddleName()); 85067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov nameValues.put(StructuredName.PHONETIC_FAMILY_NAME, parsedName.getFamilyName()); 851f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 852f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 853f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 854f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.NOTES)) { 85567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov noteValues.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE); 85667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov OpenHelper.copyStringValue(noteValues, Note.NOTE, values, People.NOTES); 857f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 858f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 859f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 8603cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private long insertOrganization(ContentValues values) { 8613cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.clear(); 8623cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8635ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov OpenHelper.copyLongValue(mValues, Data.RAW_CONTACT_ID, 8643cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.PERSON_ID); 8653cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE); 8663cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8673cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY, 8683cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.ISPRIMARY); 8693cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8703cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, Organization.COMPANY, 8713cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.COMPANY); 8723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8733cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov // TYPE values happen to remain the same between V1 and V2 - can just copy the value 8743cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyLongValue(mValues, Organization.TYPE, 8753cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.TYPE); 8763cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8773cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, Organization.LABEL, 8783cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.LABEL); 8793cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, Organization.TITLE, 8803cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.TITLE); 8813cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 88267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 8833cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8843cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov return ContentUris.parseId(uri); 8853cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 886f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 8875ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private long insertPhone(long rawContactId, ContentValues values) { 888e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.clear(); 889e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 8905ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 891e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 892e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 893e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY, 894e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov values, android.provider.Contacts.Phones.ISPRIMARY); 895e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 896e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Phone.NUMBER, 897e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov values, android.provider.Contacts.Phones.NUMBER); 898e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 899e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov // TYPE values happen to remain the same between V1 and V2 - can just copy the value 900e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyLongValue(mValues, Phone.TYPE, 901e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov values, android.provider.Contacts.Phones.TYPE); 902e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 903e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Phone.LABEL, 904e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov values, android.provider.Contacts.Phones.LABEL); 905e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 90667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 907e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 908e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov return ContentUris.parseId(uri); 909e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 910e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 9115ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private long insertContactMethod(long rawContactId, ContentValues values) { 912e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Integer kind = values.getAsInteger(ContactMethods.KIND); 913e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov if (kind == null) { 914e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov throw new RuntimeException("Required value: " + ContactMethods.KIND); 915e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 916e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 917e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.clear(); 9185ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 919e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 920e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY, values, ContactMethods.ISPRIMARY); 921e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 922e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov switch (kind) { 9230126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov case android.provider.Contacts.KIND_EMAIL: { 924e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov copyCommonFields(values, Email.CONTENT_ITEM_TYPE, Email.TYPE, Email.LABEL, 9250126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov Data.DATA14); 9260126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Email.DATA, values, ContactMethods.DATA); 927e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 9280126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov } 9290126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov 9300126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov case android.provider.Contacts.KIND_IM: { 9310126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov String protocol = values.getAsString(ContactMethods.DATA); 9320126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov if (protocol.startsWith("pre:")) { 9330126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov mValues.put(Im.PROTOCOL, Integer.parseInt(protocol.substring(4))); 9340126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov } else if (protocol.startsWith("custom:")) { 9350126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov mValues.put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM); 9360126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov mValues.put(Im.CUSTOM_PROTOCOL, protocol.substring(7)); 9370126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov } 938e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 9390126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov copyCommonFields(values, Im.CONTENT_ITEM_TYPE, Im.TYPE, Im.LABEL, Data.DATA14); 940e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 9410126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov } 942e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 9430126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov case android.provider.Contacts.KIND_POSTAL: { 94467dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey copyCommonFields(values, StructuredPostal.CONTENT_ITEM_TYPE, StructuredPostal.TYPE, 9450126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov StructuredPostal.LABEL, Data.DATA14); 9460126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov OpenHelper.copyStringValue(mValues, StructuredPostal.FORMATTED_ADDRESS, values, 9470126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov ContactMethods.DATA); 948e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 9490126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov } 950e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 951e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 95267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 953e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov return ContentUris.parseId(uri); 954e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 955e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 956e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private void copyCommonFields(ContentValues values, String mimeType, String typeColumn, 9570126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov String labelColumn, String auxDataColumn) { 958e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.put(Data.MIMETYPE, mimeType); 959e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyLongValue(mValues, typeColumn, values, ContactMethods.TYPE); 960e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, labelColumn, values, ContactMethods.LABEL); 961e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, auxDataColumn, values, ContactMethods.AUX_DATA); 962e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 963e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 9645ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private long insertExtension(long rawContactId, ContentValues values) { 9650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.clear(); 9660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9675ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 9680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(Data.MIMETYPE, android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE); 9690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov OpenHelper.copyStringValue(mValues, ExtensionsColumns.NAME, 9710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov values, android.provider.Contacts.People.Extensions.NAME); 9720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov OpenHelper.copyStringValue(mValues, ExtensionsColumns.VALUE, 9730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov values, android.provider.Contacts.People.Extensions.VALUE); 9740f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 97567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 9760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return ContentUris.parseId(uri); 9770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 9780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private long insertGroup(ContentValues values) { 9800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.clear(); 9810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Groups.TITLE, 9830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov values, android.provider.Contacts.Groups.NAME); 9840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Groups.NOTES, 9850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov values, android.provider.Contacts.Groups.NOTES); 9860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Groups.SYSTEM_ID, 9870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov values, android.provider.Contacts.Groups.SYSTEM_ID); 9880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 989df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana mValues.put(Groups.ACCOUNT_NAME, mAccount.name); 990df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana mValues.put(Groups.ACCOUNT_TYPE, mAccount.type); 991caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 99267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Groups.CONTENT_URI, mValues); 9930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return ContentUris.parseId(uri); 9940f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 9950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9965ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private long insertGroupMembership(long rawContactId, long groupId) { 9970f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.clear(); 9980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); 10005ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(GroupMembership.RAW_CONTACT_ID, rawContactId); 10010f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(GroupMembership.GROUP_ROW_ID, groupId); 10020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 100367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 10040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return ContentUris.parseId(uri); 10050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 10060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 1007f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 100867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov ensureDefaultAccount(); 100967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 101067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov int match = sUriMatcher.match(uri); 1011c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov int count = 0; 1012f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch(match) { 101367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov case PEOPLE_UPDATE_CONTACT_TIME: { 1014f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov count = updateContactTime(uri, values); 1015f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 101667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 1017c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1018c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PEOPLE_PHOTO: { 10195ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = Long.parseLong(uri.getPathSegments().get(1)); 10205ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov return updatePhoto(rawContactId, values); 1021c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1022c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 102367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov case -1: { 102467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 102567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 102667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 102767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov default: { 102867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov count = updateAll(uri, match, values, selection, selectionArgs); 102967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 103067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 103167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 103267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (count > 0) { 103367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContext.getContentResolver().notifyChange(uri, null); 103467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 103567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 103667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return count; 103767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 103867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 103967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private int updateAll(Uri uri, final int match, ContentValues values, String selection, 104067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov String[] selectionArgs) { 104167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Cursor c = query(uri, IdQuery.COLUMNS, selection, selectionArgs, null, null); 104267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (c == null) { 104367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return 0; 104467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 104567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 104667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov int count = 0; 104767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov try { 104867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov while (c.moveToNext()) { 104967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov long id = c.getLong(IdQuery._ID); 105067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov count += update(match, id, values); 105167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 105267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } finally { 105367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov c.close(); 105467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 105567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 105667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return count; 105767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 105867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 105967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov public int update(int match, long id, ContentValues values) { 106067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov int count = 0; 106167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov switch(match) { 106267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov case PEOPLE: 106367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov case PEOPLE_ID: { 106467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov count = updatePeople(id, values); 106567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov break; 106667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 106767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 1068c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PHOTOS: 1069c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov // TODO 1070c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov break; 1071c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1072c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PHOTOS_ID: 1073c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov // TODO 1074c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov break; 107567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 1076c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 107767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return count; 107867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 1079c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 108067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private int updatePeople(long rawContactId, ContentValues values) { 108167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov parsePeopleValues(values, mValues, mValues2, mValues3); 108267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 108367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov int count = mContactsProvider.update( 108467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), 108567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mValues, null, null); 108667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 108767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (count == 0) { 108867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return 0; 1089f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1090f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 109167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (mValues2.size() != 0) { 109267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri dataUri = findFirstDataRow(rawContactId, StructuredName.CONTENT_ITEM_TYPE); 109367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (dataUri != null) { 109467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.update(dataUri, mValues2, null, null); 109567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } else { 109667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mValues2.put(Data.RAW_CONTACT_ID, rawContactId); 109767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues2); 109867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 109967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 110067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 110167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (mValues3.size() != 0) { 110267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri dataUri = findFirstDataRow(rawContactId, Note.CONTENT_ITEM_TYPE); 110367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (dataUri != null) { 110467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.update(dataUri, mValues3, null, null); 110567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } else { 110667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mValues3.put(Data.RAW_CONTACT_ID, rawContactId); 110767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues3); 110867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 1109f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 111067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 1111f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return count; 1112f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1113f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1114f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private int updateContactTime(Uri uri, ContentValues values) { 1115f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1116f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // TODO check sanctions 1117f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1118f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long lastTimeContacted; 1119f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.LAST_TIME_CONTACTED)) { 1120f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov lastTimeContacted = values.getAsLong(People.LAST_TIME_CONTACTED); 1121f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } else { 1122f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov lastTimeContacted = System.currentTimeMillis(); 1123f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1124f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 11255ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = Long.parseLong(uri.getPathSegments().get(1)); 1126d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov long contactId = mOpenHelper.getContactId(rawContactId); 1127d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov if (contactId != 0) { 1128d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov mContactsProvider.updateContactTime(contactId, lastTimeContacted); 1129f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } else { 1130f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mLastTimeContactedUpdate.bindLong(1, lastTimeContacted); 11315ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mLastTimeContactedUpdate.bindLong(2, rawContactId); 1132f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mLastTimeContactedUpdate.execute(); 1133f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1134f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return 1; 1135f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1136f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 11375ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private int updatePhoto(long rawContactId, ContentValues values) { 1138c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1139c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov // TODO check sanctions 1140c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1141c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov int count; 1142c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 114367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov long dataId = findFirstDataId(rawContactId, Photo.CONTENT_ITEM_TYPE); 1144c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1145c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.clear(); 1146c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA); 1147c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(Photo.PHOTO, bytes); 1148c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1149c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov if (dataId == -1) { 1150c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 11515ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 115267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri dataUri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 1153c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov dataId = ContentUris.parseId(dataUri); 1154c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov count = 1; 1155c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } else { 1156c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Uri dataUri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId); 115767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov count = mContactsProvider.updateInTransaction(dataUri, mValues, null, null); 1158c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1159c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1160c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.clear(); 1161c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov OpenHelper.copyStringValue(mValues, LegacyPhotoData.LOCAL_VERSION, 1162c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.LOCAL_VERSION); 1163c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov OpenHelper.copyStringValue(mValues, LegacyPhotoData.DOWNLOAD_REQUIRED, 1164c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.DOWNLOAD_REQUIRED); 1165c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov OpenHelper.copyStringValue(mValues, LegacyPhotoData.EXISTS_ON_SERVER, 1166c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.EXISTS_ON_SERVER); 1167c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov OpenHelper.copyStringValue(mValues, LegacyPhotoData.SYNC_ERROR, 1168c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.SYNC_ERROR); 1169c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 117067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov int updated = mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues, 1171c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Data.MIMETYPE + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'" 11725ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " AND " + Data.RAW_CONTACT_ID + "=" + rawContactId 1173c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AND " + LegacyPhotoData.PHOTO_DATA_ID + "=" + dataId, null); 1174c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov if (updated == 0) { 11755ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 1176c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(Data.MIMETYPE, LegacyPhotoData.CONTENT_ITEM_TYPE); 1177c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(LegacyPhotoData.PHOTO_DATA_ID, dataId); 117867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 1179c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1180c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1181c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov return count; 1182c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1183c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 118467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private Uri findFirstDataRow(long rawContactId, String contentItemType) { 118567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov long dataId = findFirstDataId(rawContactId, contentItemType); 118667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (dataId == -1) { 118767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return null; 118867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 118967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 119067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return ContentUris.withAppendedId(Data.CONTENT_URI, dataId); 119167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 119267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 119367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private long findFirstDataId(long rawContactId, String mimeType) { 119467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov long dataId = -1; 119567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Cursor c = mContactsProvider.query(Data.CONTENT_URI, IdQuery.COLUMNS, 119667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Data.RAW_CONTACT_ID + "=" + rawContactId + " AND " 119767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov + Data.MIMETYPE + "='" + mimeType + "'", 119867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov null, null); 119967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov try { 120067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (c.moveToFirst()) { 120167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov dataId = c.getLong(IdQuery._ID); 120267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 120367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } finally { 120467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov c.close(); 120567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 120667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return dataId; 120767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 120867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 12093cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov public int delete(Uri uri, String selection, String[] selectionArgs) { 12103cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov final int match = sUriMatcher.match(uri); 12113cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov int count = 0; 12123cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov switch (match) { 121333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov case PEOPLE_ID: 121433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov count = mContactsProvider.deleteRawContact(ContentUris.parseId(uri), false); 121533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov break; 121633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 12173cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS_ID: 1218e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1219e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov ORGANIZATION_MIME_TYPES); 1220e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1221e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1222e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS_ID: 1223e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1224e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov CONTACT_METHOD_MIME_TYPES); 1225e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1226e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1227e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES_ID: 1228e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1229e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov PHONE_MIME_TYPES); 12303cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 12313cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 12323cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov default: 12333cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 12343cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 12353cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 12363cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov return count; 12373cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 12383cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 1239f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 1240c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov String sortOrder, String limit) { 1241caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov ensureDefaultAccount(); 1242caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 1243f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final SQLiteDatabase db = mOpenHelper.getReadableDatabase(); 1244f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 1245f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String groupBy = null; 1246f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1247f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final int match = sUriMatcher.match(uri); 1248f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch (match) { 1249f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE: { 125070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 1251f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 125267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1253f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 1254f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1255f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1256f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE_ID: 125770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 1258f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 125967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1260caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov qb.appendWhere(" AND " + People._ID + "="); 1261f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1262f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 1263f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1264445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov case PEOPLE_FILTER: { 1265445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 1266445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 126767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1268445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov String filterParam = uri.getPathSegments().get(2); 1269caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov qb.appendWhere(" AND " + People._ID + " IN " 12705ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + mContactsProvider.getRawContactsByFilterAsNestedQuery(filterParam)); 1271445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov break; 1272445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov } 1273445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov 12743cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS: 12755dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.ORGANIZATIONS + " organizations"); 1276d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sOrganizationProjectionMap); 127767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 12783cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 12793cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 12803cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS_ID: 12815dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.ORGANIZATIONS + " organizations"); 12823cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov qb.setProjectionMap(sOrganizationProjectionMap); 128367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1284d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Organizations._ID + "="); 1285e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1286e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1287e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1288e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS: 12895dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods"); 1290d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 129167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1292e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1293e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1294e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS_ID: 12955dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods"); 1296e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 129767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1298d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods._ID + "="); 1299e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1300e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1301e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1302bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov case CONTACTMETHODS_EMAIL: 1303bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods"); 1304bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 1305bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov applyRawContactsAccount(qb); 1306bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.KIND + "=" 1307bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov + android.provider.Contacts.KIND_EMAIL); 1308bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov break; 1309bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov 1310e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_CONTACTMETHODS: 13115dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods"); 1312e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 131367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1314d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "="); 1315e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1316e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL"); 1317e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1318e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1319e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_CONTACTMETHODS_ID: 13205dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods"); 1321e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 132267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1323d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "="); 1324e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1325d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods._ID + "="); 1326e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 1327e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL"); 1328e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1329e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1330e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES: 13315dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHONES + " phones"); 1332d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 133367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1334e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1335e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1336e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES_ID: 13375dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHONES + " phones"); 1338e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 133967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1340d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "="); 1341e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1342e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1343e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1344fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov case PHONES_FILTER: 13455dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHONES + " phones"); 1346fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 134767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1348fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov if (uri.getPathSegments().size() > 2) { 1349fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov String filterParam = uri.getLastPathSegment(); 1350e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov qb.appendWhere(" AND person ="); 1351e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov qb.appendWhere(mOpenHelper.buildPhoneLookupAsNestedQuery(filterParam)); 1352fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov } 1353fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov break; 1354fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov 1355e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_PHONES: 13565dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHONES + " phones"); 1357e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 135867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1359d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "="); 1360e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1361e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1362e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1363e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_PHONES_ID: 13645dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHONES + " phones"); 1365e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 136667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1367d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "="); 13683cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1369d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "="); 1370e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 13713cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 13723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 13730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case EXTENSIONS: 13745dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS + " extensions"); 1375d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 137667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 13770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 13780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 13790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case EXTENSIONS_ID: 13805dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS + " extensions"); 13810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 138267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1383d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "="); 13840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 13850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 13860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 13870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_EXTENSIONS: 13885dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS + " extensions"); 13890f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 139067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1391d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "="); 13920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 13930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 13940f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 13950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_EXTENSIONS_ID: 13965dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS + " extensions"); 13970f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 139867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1399d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "="); 14000f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1401d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "="); 14020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 14030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 14040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 14050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPS: 14065dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUPS + " groups"); 14070f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupProjectionMap); 140867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyGroupAccount(qb); 14090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 14100f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 14110f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPS_ID: 14125dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUPS + " groups"); 14130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupProjectionMap); 141467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyGroupAccount(qb); 1415caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Groups._ID + "="); 14160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 14170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 14180f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 14190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPMEMBERSHIP: 14205dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership"); 1421d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 142267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 14230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 14240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 14250f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPMEMBERSHIP_ID: 14265dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership"); 14270f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 142867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1429d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "="); 14300f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 14310f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 14320f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 14330f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_GROUPMEMBERSHIP: 14345dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership"); 14350f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 143667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1437d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "="); 14380f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 14390f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 14400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 14410f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_GROUPMEMBERSHIP_ID: 14425dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership"); 14430f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 144467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1445d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "="); 14460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1447d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "="); 14480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 14490f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 14500f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 1451c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PEOPLE_PHOTO: 14525dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHOTOS + " photos"); 1453c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov qb.setProjectionMap(sPhotoProjectionMap); 145467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1455c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Photos.PERSON_ID + "="); 1456c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1457c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov limit = "1"; 1458c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov break; 1459c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1460c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov case SEARCH_SUGGESTIONS: 1461c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 1462c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov // No legacy compatibility for search suggestions 1463a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov return mGlobalSearchSupport.handleSearchSuggestionsQuery(db, uri, limit); 1464c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 1465b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov case SEARCH_SHORTCUT: { 1466b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov long contactId = ContentUris.parseId(uri); 1467b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov return mGlobalSearchSupport.handleSearchShortcutRefresh(db, contactId, projection); 1468b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov } 1469b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov 14701b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case LIVE_FOLDERS_PEOPLE: 14711b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_URI, 14721b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov projection, selection, selectionArgs, sortOrder); 14731b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 14741b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case LIVE_FOLDERS_PEOPLE_WITH_PHONES: 14751b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_WITH_PHONES_URI, 14761b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov projection, selection, selectionArgs, sortOrder); 14771b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 14781b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case LIVE_FOLDERS_PEOPLE_FAVORITES: 14791b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_FAVORITES_URI, 14801b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov projection, selection, selectionArgs, sortOrder); 14811b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 14821b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case LIVE_FOLDERS_PEOPLE_GROUP_NAME: 14831b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov return mContactsProvider.query(Uri.withAppendedPath(LIVE_FOLDERS_CONTACTS_URI, 14841b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov Uri.encode(uri.getLastPathSegment())), 14851b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov projection, selection, selectionArgs, sortOrder); 14861b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 148733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov case DELETED_PEOPLE: 148833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov case DELETED_GROUPS: 148933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov throw new UnsupportedOperationException(); 149033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 1491f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov default: 1492f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov throw new IllegalArgumentException("Unknown URL " + uri); 1493f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1494f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1495f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // Perform the query and set the notification uri 1496f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final Cursor c = qb.query(db, projection, selection, selectionArgs, 1497f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov groupBy, null, sortOrder, limit); 1498f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (c != null) { 14993fe48cf2c81f6e89b78e919661e2b0b828a2144eDmitri Plotnikov c.setNotificationUri(mContext.getContentResolver(), 15003fe48cf2c81f6e89b78e919661e2b0b828a2144eDmitri Plotnikov android.provider.Contacts.CONTENT_URI); 1501f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1502f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return c; 1503f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1504f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 150567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private void applyRawContactsAccount(SQLiteQueryBuilder qb) { 1506caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov StringBuilder sb = new StringBuilder(); 150767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov appendRawContactsAccount(sb); 150867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov qb.appendWhere(sb.toString()); 150967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 151067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 151167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private void appendRawContactsAccount(StringBuilder sb) { 1512caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov sb.append(RawContacts.ACCOUNT_NAME + "="); 1513df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana DatabaseUtils.appendEscapedSQLString(sb, mAccount.name); 1514caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov sb.append(" AND " + RawContacts.ACCOUNT_TYPE + "="); 1515df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana DatabaseUtils.appendEscapedSQLString(sb, mAccount.type); 1516caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 1517caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 151867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private void applyGroupAccount(SQLiteQueryBuilder qb) { 1519caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov StringBuilder sb = new StringBuilder(); 152067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov appendGroupAccount(sb); 152167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov qb.appendWhere(sb.toString()); 152267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 152367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 152467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private void appendGroupAccount(StringBuilder sb) { 1525caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov sb.append(Groups.ACCOUNT_NAME + "="); 1526df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana DatabaseUtils.appendEscapedSQLString(sb, mAccount.name); 1527caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov sb.append(" AND " + Groups.ACCOUNT_TYPE + "="); 1528df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana DatabaseUtils.appendEscapedSQLString(sb, mAccount.type); 1529caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 1530caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 1531f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov /** 1532f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * Called when a change has been made. 1533f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * 1534f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * @param uri the uri that the change was made to 1535f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov */ 1536f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private void onChange(Uri uri) { 1537f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContext.getContentResolver().notifyChange(android.provider.Contacts.CONTENT_URI, null); 1538f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 153961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov 154061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov public String getType(Uri uri) { 154161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov int match = sUriMatcher.match(uri); 154261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov switch (match) { 154361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case EXTENSIONS: 154461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_EXTENSIONS: 154561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return Extensions.CONTENT_TYPE; 154661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case EXTENSIONS_ID: 154761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_EXTENSIONS_ID: 154861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return Extensions.CONTENT_ITEM_TYPE; 154961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE: 155061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/person"; 155161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_ID: 155261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/person"; 155361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_PHONES: 155461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/phone"; 155561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_PHONES_ID: 155661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/phone"; 155761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_CONTACTMETHODS: 155861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/contact-methods"; 155961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_CONTACTMETHODS_ID: 156061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return getContactMethodType(uri); 156161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PHONES: 156261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/phone"; 156361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PHONES_ID: 156461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/phone"; 156561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PHONES_FILTER: 156661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/phone"; 156761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PHOTOS_ID: 156861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/photo"; 156961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PHOTOS: 157061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/photo"; 157161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_PHOTO: 157261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/photo"; 157361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case CONTACTMETHODS: 157461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/contact-methods"; 157561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case CONTACTMETHODS_ID: 157661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return getContactMethodType(uri); 157761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case ORGANIZATIONS: 157861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/organizations"; 157961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case ORGANIZATIONS_ID: 158061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/organization"; 158161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case SEARCH_SUGGESTIONS: 158261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return SearchManager.SUGGEST_MIME_TYPE; 158361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case SEARCH_SHORTCUT: 158461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return SearchManager.SHORTCUT_MIME_TYPE; 158561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov default: 158661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov throw new IllegalArgumentException("Unknown URI"); 158761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 158861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 158961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov 159061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov private String getContactMethodType(Uri url) { 159161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov String mime = null; 159261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov 159361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov Cursor c = query(url, new String[] {ContactMethods.KIND}, null, null, null, null); 159461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov if (c != null) { 159561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov try { 159661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov if (c.moveToFirst()) { 159761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov int kind = c.getInt(0); 159861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov switch (kind) { 15991b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case android.provider.Contacts.KIND_EMAIL: 160061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov mime = "vnd.android.cursor.item/email"; 160161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov break; 160261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov 16031b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case android.provider.Contacts.KIND_IM: 160461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov mime = "vnd.android.cursor.item/jabber-im"; 160561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov break; 160661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov 16071b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case android.provider.Contacts.KIND_POSTAL: 160861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov mime = "vnd.android.cursor.item/postal-address"; 160961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov break; 161061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 161161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 161261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } finally { 161361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov c.close(); 161461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 161561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 161661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return mime; 161761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 1618f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov} 1619