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