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