LegacyApiSupport.java revision b38ed2c5ffeb20efc677b4a9229db4a00603aa8d
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 18b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.DataColumns; 19b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.ExtensionsColumns; 20b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.GroupsColumns; 21b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.MimetypesColumns; 22b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.PhoneColumns; 23b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.PresenceColumns; 24b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.RawContactsColumns; 25b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.StatusUpdatesColumns; 26b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikovimport com.android.providers.contacts.ContactsDatabaseHelper.Tables; 27f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 28caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikovimport android.accounts.Account; 29c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.app.SearchManager; 30f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentUris; 31f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentValues; 32f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.Context; 33f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.UriMatcher; 34f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.Cursor; 35e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.database.DatabaseUtils; 36f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteDatabase; 37044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikovimport android.database.sqlite.SQLiteDoneException; 38f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteQueryBuilder; 39f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteStatement; 40f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.net.Uri; 4167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikovimport android.provider.BaseColumns; 42f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract; 43e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.Contacts.ContactMethods; 4461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikovimport android.provider.Contacts.Extensions; 45f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.Contacts.People; 46e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.Data; 470f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.Groups; 48c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.provider.ContactsContract.RawContacts; 4982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikovimport android.provider.ContactsContract.StatusUpdates; 50e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email; 510f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 52e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im; 53f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Note; 543cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization; 55e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone; 56c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo; 57f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 5867dde51ab932dc84d95a203b113989b13437f13dJeff Sharkeyimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal; 59b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamiltonimport android.util.Log; 60f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 61f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport java.util.HashMap; 62622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkeyimport java.util.Locale; 63f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 64b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamiltonpublic class LegacyApiSupport { 65f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 66caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov private static final String TAG = "ContactsProviderV1"; 67caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 686f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov private static final String NON_EXISTENT_ACCOUNT_TYPE = "android.INVALID_ACCOUNT_TYPE"; 6928153f2e3dda944e983f6dd0ab80aca63631ddfaJeff Hamilton private static final String NON_EXISTENT_ACCOUNT_NAME = "invalid"; 706f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov 71f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 72f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 73f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final int PEOPLE = 1; 74f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final int PEOPLE_ID = 2; 75f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final int PEOPLE_UPDATE_CONTACT_TIME = 3; 763cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private static final int ORGANIZATIONS = 4; 773cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private static final int ORGANIZATIONS_ID = 5; 78e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_CONTACTMETHODS = 6; 79e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_CONTACTMETHODS_ID = 7; 80e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int CONTACTMETHODS = 8; 81e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int CONTACTMETHODS_ID = 9; 82e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_PHONES = 10; 83e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_PHONES_ID = 11; 84e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PHONES = 12; 85e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PHONES_ID = 13; 860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int EXTENSIONS = 14; 870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int EXTENSIONS_ID = 15; 880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int PEOPLE_EXTENSIONS = 16; 890f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int PEOPLE_EXTENSIONS_ID = 17; 900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int GROUPS = 18; 910f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int GROUPS_ID = 19; 920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int GROUPMEMBERSHIP = 20; 930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int GROUPMEMBERSHIP_ID = 21; 940f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int PEOPLE_GROUPMEMBERSHIP = 22; 950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int PEOPLE_GROUPMEMBERSHIP_ID = 23; 96c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private static final int PEOPLE_PHOTO = 24; 97c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private static final int PHOTOS = 25; 98c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private static final int PHOTOS_ID = 26; 99445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov private static final int PEOPLE_FILTER = 29; 10033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov private static final int DELETED_PEOPLE = 30; 10133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov private static final int DELETED_GROUPS = 31; 102c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov private static final int SEARCH_SUGGESTIONS = 32; 103b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov private static final int SEARCH_SHORTCUT = 33; 104b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov private static final int PHONES_FILTER = 34; 1051b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private static final int LIVE_FOLDERS_PEOPLE = 35; 1061b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private static final int LIVE_FOLDERS_PEOPLE_GROUP_NAME = 36; 1071b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private static final int LIVE_FOLDERS_PEOPLE_WITH_PHONES = 37; 1081b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private static final int LIVE_FOLDERS_PEOPLE_FAVORITES = 38; 109bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov private static final int CONTACTMETHODS_EMAIL = 39; 11071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov private static final int GROUP_NAME_MEMBERS = 40; 111c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 112e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String PEOPLE_JOINS = 1135ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " LEFT OUTER JOIN data name ON (raw_contacts._id = name.raw_contact_id" 114e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = name.mimetype_id)" 115e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + StructuredName.CONTENT_ITEM_TYPE + "')" 1165ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " LEFT OUTER JOIN data organization ON (raw_contacts._id = organization.raw_contact_id" 117e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = organization.mimetype_id)" 118e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Organization.CONTENT_ITEM_TYPE + "' AND organization.is_primary)" 1195ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " LEFT OUTER JOIN data email ON (raw_contacts._id = email.raw_contact_id" 120e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = email.mimetype_id)" 121e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Email.CONTENT_ITEM_TYPE + "' AND email.is_primary)" 1225ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " LEFT OUTER JOIN data note ON (raw_contacts._id = note.raw_contact_id" 123e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = note.mimetype_id)" 124e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Note.CONTENT_ITEM_TYPE + "')" 1255ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " LEFT OUTER JOIN data phone ON (raw_contacts._id = phone.raw_contact_id" 126e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = phone.mimetype_id)" 127e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Phone.CONTENT_ITEM_TYPE + "' AND phone.is_primary)"; 128e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 129d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String DATA_JOINS = 130d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " JOIN mimetypes ON (mimetypes._id = data.mimetype_id)" 1315ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " JOIN raw_contacts ON (raw_contacts._id = data.raw_contact_id)" 132d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + PEOPLE_JOINS; 133d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 13470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov public static final String PRESENCE_JOINS = 1350a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov " LEFT OUTER JOIN " + Tables.PRESENCE + 1360a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov " ON (" + Tables.PRESENCE + "." + StatusUpdates.DATA_ID + "=" + 1370a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov "(SELECT MAX(" + StatusUpdates.DATA_ID + ")" + 1380a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov " FROM " + Tables.PRESENCE + 1390a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov " WHERE people._id = " + PresenceColumns.RAW_CONTACT_ID + ")" + 1400a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov " )"; 14170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 142e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String PHONETIC_NAME_SQL = "trim(trim(" 143e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_GIVEN_NAME + ",' ')||' '||" 144e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_MIDDLE_NAME + ",' '))||' '||" 145e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_FAMILY_NAME + ",' ')) "; 146e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 147e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String CONTACT_METHOD_KIND_SQL = 148d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "CAST ((CASE WHEN mimetype='" + Email.CONTENT_ITEM_TYPE + "'" 149e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_EMAIL 150e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 151e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " (CASE WHEN mimetype='" + Im.CONTENT_ITEM_TYPE +"'" 152e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_IM 153e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 15467dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey + " (CASE WHEN mimetype='" + StructuredPostal.CONTENT_ITEM_TYPE + "'" 155e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_POSTAL 156e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 157e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " NULL" 158e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " END)" 159e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " END)" 160d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " END) AS INTEGER)"; 161f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 16297f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov private static final String IM_PROTOCOL_SQL = 16382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov "(CASE WHEN " + StatusUpdates.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM 16482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov + " THEN 'custom:'||" + StatusUpdates.CUSTOM_PROTOCOL 16582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov + " ELSE 'pre:'||" + StatusUpdates.PROTOCOL 16697f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " END)"; 16797f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov 16897f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov private static String CONTACT_METHOD_DATA_SQL = 16997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov "(CASE WHEN " + Data.MIMETYPE + "='" + Im.CONTENT_ITEM_TYPE + "'" 17097f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " THEN (CASE WHEN " + Tables.DATA + "." + Im.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM 17197f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " THEN 'custom:'||" + Tables.DATA + "." + Im.CUSTOM_PROTOCOL 17297f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " ELSE 'pre:'||" + Tables.DATA + "." + Im.PROTOCOL 17397f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " END)" 174f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov + " ELSE " + Tables.DATA + "." + Email.DATA 17597f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " END)"; 17697f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov 1771b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private static final Uri LIVE_FOLDERS_CONTACTS_URI = Uri.withAppendedPath( 1781b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov ContactsContract.AUTHORITY_URI, "live_folders/contacts"); 1791b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 1801b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private static final Uri LIVE_FOLDERS_CONTACTS_WITH_PHONES_URI = Uri.withAppendedPath( 1811b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov ContactsContract.AUTHORITY_URI, "live_folders/contacts_with_phones"); 1821b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 1831b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private static final Uri LIVE_FOLDERS_CONTACTS_FAVORITES_URI = Uri.withAppendedPath( 1841b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov ContactsContract.AUTHORITY_URI, "live_folders/favorites"); 18597f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov 186f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public interface LegacyTables { 187d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String PEOPLE = "view_v1_people"; 1885dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov public static final String PEOPLE_JOIN_PRESENCE = "view_v1_people people " + PRESENCE_JOINS; 189d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String GROUPS = "view_v1_groups"; 190d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String ORGANIZATIONS = "view_v1_organizations"; 191d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String CONTACT_METHODS = "view_v1_contact_methods"; 192d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String PHONES = "view_v1_phones"; 193d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String EXTENSIONS = "view_v1_extensions"; 194d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String GROUP_MEMBERSHIP = "view_v1_group_membership"; 195c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String PHOTOS = "view_v1_photos"; 196f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 197f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 198e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] ORGANIZATION_MIME_TYPES = new String[] { 199e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Organization.CONTENT_ITEM_TYPE 200e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 201e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 202e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] CONTACT_METHOD_MIME_TYPES = new String[] { 203e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Email.CONTENT_ITEM_TYPE, 204e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Im.CONTENT_ITEM_TYPE, 20567dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey StructuredPostal.CONTENT_ITEM_TYPE, 206e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 207e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 208e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] PHONE_MIME_TYPES = new String[] { 209e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Phone.CONTENT_ITEM_TYPE 210e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 211e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 212044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private static final String[] PHOTO_MIME_TYPES = new String[] { 213044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Photo.CONTENT_ITEM_TYPE 214044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov }; 215044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 216044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private static final String[] EXTENSION_MIME_TYPES = new String[] { 217044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE 218044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov }; 219044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 22067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private interface IdQuery { 22167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov String[] COLUMNS = { BaseColumns._ID }; 222c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 223c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov int _ID = 0; 224c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 225c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 226c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov /** 227c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov * A custom data row that is used to store legacy photo data fields no 228c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov * longer directly supported by the API. 229c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov */ 230c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private interface LegacyPhotoData { 231c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/photo_v1_extras"; 232c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 233c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String PHOTO_DATA_ID = Data.DATA1; 234c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String LOCAL_VERSION = Data.DATA2; 235c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String DOWNLOAD_REQUIRED = Data.DATA3; 236c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String EXISTS_ON_SERVER = Data.DATA4; 237c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String SYNC_ERROR = Data.DATA5; 238c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 239c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 240c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String LEGACY_PHOTO_JOIN = 2415ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " LEFT OUTER JOIN data legacy_photo ON (raw_contacts._id = legacy_photo.raw_contact_id" 242c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = legacy_photo.mimetype_id)" 243c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'" 244c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AND " + DataColumns.CONCRETE_ID + " = legacy_photo." + LegacyPhotoData.PHOTO_DATA_ID 245c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + ")"; 246c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 247f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final HashMap<String, String> sPeopleProjectionMap; 2483cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private static final HashMap<String, String> sOrganizationProjectionMap; 249e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final HashMap<String, String> sContactMethodProjectionMap; 250e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final HashMap<String, String> sPhoneProjectionMap; 2510f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final HashMap<String, String> sExtensionProjectionMap; 2520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final HashMap<String, String> sGroupProjectionMap; 2530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final HashMap<String, String> sGroupMembershipProjectionMap; 254c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private static final HashMap<String, String> sPhotoProjectionMap; 255fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov 256f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov static { 257f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 258f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // Contacts URI matching table 259f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov UriMatcher matcher = sUriMatcher; 260f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 261f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String authority = android.provider.Contacts.AUTHORITY; 2620f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "extensions", EXTENSIONS); 2630f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "extensions/#", EXTENSIONS_ID); 2640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groups", GROUPS); 2650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groups/#", GROUPS_ID); 26671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov matcher.addURI(authority, "groups/name/*/members", GROUP_NAME_MEMBERS); 267f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/name/*/members/filter/*", 268f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// GROUP_NAME_MEMBERS_FILTER); 269f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/system_id/*/members", GROUP_SYSTEM_ID_MEMBERS); 270f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/system_id/*/members/filter/*", 271f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// GROUP_SYSTEM_ID_MEMBERS_FILTER); 2720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groupmembership", GROUPMEMBERSHIP); 2730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groupmembership/#", GROUPMEMBERSHIP_ID); 274f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groupmembershipraw", GROUPMEMBERSHIP_RAW); 275f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people", PEOPLE); 276f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/strequent", PEOPLE_STREQUENT); 277f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/strequent/filter/*", PEOPLE_STREQUENT_FILTER); 278445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov matcher.addURI(authority, "people/filter/*", PEOPLE_FILTER); 279f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/with_phones_filter/*", 280f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_WITH_PHONES_FILTER); 281f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/with_email_or_im_filter/*", 282f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_WITH_EMAIL_OR_IM_FILTER); 283f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people/#", PEOPLE_ID); 2840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/extensions", PEOPLE_EXTENSIONS); 2850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/extensions/#", PEOPLE_EXTENSIONS_ID); 286e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/phones", PEOPLE_PHONES); 287e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/phones/#", PEOPLE_PHONES_ID); 288f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/phones_with_presence", 289f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_PHONES_WITH_PRESENCE); 290c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov matcher.addURI(authority, "people/#/photo", PEOPLE_PHOTO); 291f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/photo/data", PEOPLE_PHOTO_DATA); 292e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/contact_methods", PEOPLE_CONTACTMETHODS); 293f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/contact_methods_with_presence", 294f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_CONTACTMETHODS_WITH_PRESENCE); 295e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID); 296f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/organizations", PEOPLE_ORGANIZATIONS); 297f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/organizations/#", PEOPLE_ORGANIZATIONS_ID); 2980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/groupmembership", PEOPLE_GROUPMEMBERSHIP); 2990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/groupmembership/#", PEOPLE_GROUPMEMBERSHIP_ID); 300f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/raw", PEOPLE_RAW); 301f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/owner", PEOPLE_OWNER); 302f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people/#/update_contact_time", 303f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov PEOPLE_UPDATE_CONTACT_TIME); 30433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov matcher.addURI(authority, "deleted_people", DELETED_PEOPLE); 30533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov matcher.addURI(authority, "deleted_groups", DELETED_GROUPS); 306e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "phones", PHONES); 307f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones_with_presence", PHONES_WITH_PRESENCE); 308fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov matcher.addURI(authority, "phones/filter/*", PHONES_FILTER); 309f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones/filter_name/*", PHONES_FILTER_NAME); 310f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones/mobile_filter_name/*", 311f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PHONES_MOBILE_FILTER_NAME); 312e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "phones/#", PHONES_ID); 313c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov matcher.addURI(authority, "photos", PHOTOS); 314c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov matcher.addURI(authority, "photos/#", PHOTOS_ID); 315e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "contact_methods", CONTACTMETHODS); 316bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov matcher.addURI(authority, "contact_methods/email", CONTACTMETHODS_EMAIL); 317f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "contact_methods/email/*", CONTACTMETHODS_EMAIL_FILTER); 318e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "contact_methods/#", CONTACTMETHODS_ID); 319f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "contact_methods/with_presence", 320f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// CONTACTMETHODS_WITH_PRESENCE); 3213cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov matcher.addURI(authority, "organizations", ORGANIZATIONS); 3223cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov matcher.addURI(authority, "organizations/#", ORGANIZATIONS_ID); 323f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "voice_dialer_timestamp", VOICE_DIALER_TIMESTAMP); 324c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY, 325c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov SEARCH_SUGGESTIONS); 326c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", 327c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov SEARCH_SUGGESTIONS); 328b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/#", 329b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov SEARCH_SHORTCUT); 330f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "settings", SETTINGS); 331f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// 3321b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov matcher.addURI(authority, "live_folders/people", LIVE_FOLDERS_PEOPLE); 3331b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov matcher.addURI(authority, "live_folders/people/*", 3341b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov LIVE_FOLDERS_PEOPLE_GROUP_NAME); 3351b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov matcher.addURI(authority, "live_folders/people_with_phones", 3361b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov LIVE_FOLDERS_PEOPLE_WITH_PHONES); 3371b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov matcher.addURI(authority, "live_folders/favorites", 3381b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov LIVE_FOLDERS_PEOPLE_FAVORITES); 339f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 340f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 341e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov HashMap<String, String> peopleProjectionMap = new HashMap<String, String>(); 342d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.NAME, People.NAME); 343d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.DISPLAY_NAME, People.DISPLAY_NAME); 344d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.PHONETIC_NAME, People.PHONETIC_NAME); 345d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.NOTES, People.NOTES); 346d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.TIMES_CONTACTED, People.TIMES_CONTACTED); 347d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.LAST_TIME_CONTACTED, People.LAST_TIME_CONTACTED); 348d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.CUSTOM_RINGTONE, People.CUSTOM_RINGTONE); 349d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.SEND_TO_VOICEMAIL, People.SEND_TO_VOICEMAIL); 350d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.STARRED, People.STARRED); 351ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov peopleProjectionMap.put(People.PRIMARY_ORGANIZATION_ID, People.PRIMARY_ORGANIZATION_ID); 352ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov peopleProjectionMap.put(People.PRIMARY_EMAIL_ID, People.PRIMARY_EMAIL_ID); 353ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov peopleProjectionMap.put(People.PRIMARY_PHONE_ID, People.PRIMARY_PHONE_ID); 354e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 355e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPeopleProjectionMap = new HashMap<String, String>(peopleProjectionMap); 3569155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sPeopleProjectionMap.put(People._ID, People._ID); 357d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.NUMBER, People.NUMBER); 358d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.TYPE, People.TYPE); 359d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.LABEL, People.LABEL); 360d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.NUMBER_KEY, People.NUMBER_KEY); 3610126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov sPeopleProjectionMap.put(People.IM_PROTOCOL, IM_PROTOCOL_SQL + " AS " + People.IM_PROTOCOL); 36270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.IM_HANDLE, People.IM_HANDLE); 36370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.IM_ACCOUNT, People.IM_ACCOUNT); 36470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.PRESENCE_STATUS, People.PRESENCE_STATUS); 365a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov sPeopleProjectionMap.put(People.PRESENCE_CUSTOM_STATUS, 3660cc388933e698760d4985a7d7be1325f9c8305e9Dmitri Plotnikov "(SELECT " + StatusUpdates.STATUS + 367a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov " FROM " + Tables.STATUS_UPDATES + 368a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov " JOIN " + Tables.DATA + 369a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov " ON(" + StatusUpdatesColumns.DATA_ID + "=" + DataColumns.CONCRETE_ID + ")" + 370a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov " WHERE " + DataColumns.CONCRETE_RAW_CONTACT_ID + "=people." + People._ID + 3710cc388933e698760d4985a7d7be1325f9c8305e9Dmitri Plotnikov " ORDER BY " + StatusUpdates.STATUS_TIMESTAMP + " DESC " + 372a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov " LIMIT 1" + 373a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov ") AS " + People.PRESENCE_CUSTOM_STATUS); 3743cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 3753cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap = new HashMap<String, String>(); 3769155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations._ID, 3779155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.Organizations._ID); 3783cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.PERSON_ID, 379d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.PERSON_ID); 3803cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.ISPRIMARY, 381d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.ISPRIMARY); 3823cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.COMPANY, 383d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.COMPANY); 3843cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TYPE, 385d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.TYPE); 3863cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.LABEL, 387d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.LABEL); 3883cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TITLE, 389d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.TITLE); 390e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 391e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sContactMethodProjectionMap = new HashMap<String, String>(peopleProjectionMap); 3929155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods._ID, ContactMethods._ID); 393d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.PERSON_ID, ContactMethods.PERSON_ID); 394d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.KIND, ContactMethods.KIND); 395d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.ISPRIMARY, ContactMethods.ISPRIMARY); 396d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.TYPE, ContactMethods.TYPE); 397d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.DATA, ContactMethods.DATA); 398d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.LABEL, ContactMethods.LABEL); 399d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.AUX_DATA, ContactMethods.AUX_DATA); 400e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 401e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap = new HashMap<String, String>(peopleProjectionMap); 4029155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones._ID, 4039155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.Phones._ID); 404e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.PERSON_ID, 405d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.PERSON_ID); 406e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.ISPRIMARY, 407d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.ISPRIMARY); 408e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER, 409d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.NUMBER); 410e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.TYPE, 411d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.TYPE); 412e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.LABEL, 413d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.LABEL); 414e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER_KEY, 415d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.NUMBER_KEY); 4160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 4170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap = new HashMap<String, String>(); 4189155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions._ID, 4199155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.Extensions._ID); 4200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions.PERSON_ID, 421d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Extensions.PERSON_ID); 4220f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions.NAME, 423d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Extensions.NAME); 4240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions.VALUE, 425d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Extensions.VALUE); 4260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 4270f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap = new HashMap<String, String>(); 4280f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups._ID, 429d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups._ID); 4300f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups.NAME, 431d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups.NAME); 4320f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups.NOTES, 433d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups.NOTES); 4340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups.SYSTEM_ID, 435d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups.SYSTEM_ID); 4360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 437d4b57da3f07bc530db69015d363c61a768a4713aDmitri Plotnikov sGroupMembershipProjectionMap = new HashMap<String, String>(sGroupProjectionMap); 4389155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership._ID, 4399155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.GroupMembership._ID); 4400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.PERSON_ID, 441d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.GroupMembership.PERSON_ID); 4420f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.GROUP_ID, 443d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.GroupMembership.GROUP_ID); 444c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 445c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap = new HashMap<String, String>(); 4469155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos._ID, 4479155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.Photos._ID); 448c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.PERSON_ID, 449c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.PERSON_ID); 450c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.DATA, 451c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.DATA); 452c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.LOCAL_VERSION, 453c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.LOCAL_VERSION); 454c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.DOWNLOAD_REQUIRED, 455c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.DOWNLOAD_REQUIRED); 456c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.EXISTS_ON_SERVER, 457c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.EXISTS_ON_SERVER); 458c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.SYNC_ERROR, 459c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.SYNC_ERROR); 460f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 461f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 462f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final Context mContext; 463b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov private final ContactsDatabaseHelper mDbHelper; 464f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final ContactsProvider2 mContactsProvider; 465f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final NameSplitter mPhoneticNameSplitter; 466a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov private final GlobalSearchSupport mGlobalSearchSupport; 467f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 468d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov /** Precompiled sql statement for incrementing times contacted for a contact */ 4693cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private final SQLiteStatement mLastTimeContactedUpdate; 470044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private final SQLiteStatement mDataMimetypeQuery; 471044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private final SQLiteStatement mDataRawContactIdQuery; 4723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 4733cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private final ContentValues mValues = new ContentValues(); 47467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private final ContentValues mValues2 = new ContentValues(); 47567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private final ContentValues mValues3 = new ContentValues(); 476caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov private Account mAccount; 477a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 478044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private long mMimetypeEmail; 479044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private long mMimetypeIm; 480044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private long mMimetypePostal; 481044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 482b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov public LegacyApiSupport(Context context, ContactsDatabaseHelper contactsDatabaseHelper, 483a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov ContactsProvider2 contactsProvider, GlobalSearchSupport globalSearchSupport) { 484f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContext = context; 485f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContactsProvider = contactsProvider; 486b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov mDbHelper = contactsDatabaseHelper; 487a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov mGlobalSearchSupport = globalSearchSupport; 488f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 489622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey mPhoneticNameSplitter = new NameSplitter("", "", "", context 490622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey .getString(com.android.internal.R.string.common_name_conjunctions), Locale 491622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey .getDefault()); 492f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 493b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov SQLiteDatabase db = mDbHelper.getReadableDatabase(); 4945ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mLastTimeContactedUpdate = db.compileStatement("UPDATE " + Tables.RAW_CONTACTS + " SET " 4956cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContacts.LAST_TIME_CONTACTED + "=? WHERE " 4966cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContacts._ID + "=?"); 497044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 498044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mDataMimetypeQuery = db.compileStatement( 499044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov "SELECT " + DataColumns.MIMETYPE_ID + 500044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov " FROM " + Tables.DATA + 501044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov " WHERE " + Data._ID + "=?"); 502044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 503044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mDataRawContactIdQuery = db.compileStatement( 504044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov "SELECT " + Data.RAW_CONTACT_ID + 505044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov " FROM " + Tables.DATA + 506044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov " WHERE " + Data._ID + "=?"); 507044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 508b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov mMimetypeEmail = mDbHelper.getMimeTypeId(Email.CONTENT_ITEM_TYPE); 509b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov mMimetypeIm = mDbHelper.getMimeTypeId(Im.CONTENT_ITEM_TYPE); 510b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov mMimetypePostal = mDbHelper.getMimeTypeId(StructuredPostal.CONTENT_ITEM_TYPE); 511f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 512f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 513caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov private void ensureDefaultAccount() { 514caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov if (mAccount == null) { 515caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov mAccount = mContactsProvider.getDefaultAccount(); 5166f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov if (mAccount == null) { 5176f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov 5186f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov // This fall-through account will not match any data in the database, which 5196f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov // is the expected behavior 52028153f2e3dda944e983f6dd0ab80aca63631ddfaJeff Hamilton mAccount = new Account(NON_EXISTENT_ACCOUNT_NAME, NON_EXISTENT_ACCOUNT_TYPE); 5216f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov } 522caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 523caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 524d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 525b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamilton public static void createDatabase(SQLiteDatabase db) { 526b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamilton Log.i(TAG, "Bootstrapping database legacy support"); 527d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 528ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov String peopleColumns = "name." + StructuredName.DISPLAY_NAME 529d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.NAME + ", " + 5305ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME 531d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.DISPLAY_NAME + ", " + 532d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov PHONETIC_NAME_SQL 533d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PHONETIC_NAME + " , " + 534d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "note." + Note.NOTE 535d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.NOTES + ", " + 536caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 537caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 5385ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED 539d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.TIMES_CONTACTED + ", " + 5405ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED 541d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.LAST_TIME_CONTACTED + ", " + 5425ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE 543d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.CUSTOM_RINGTONE + ", " + 5445ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL 545d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.SEND_TO_VOICEMAIL + ", " + 5465ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.STARRED 547d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.STARRED + ", " + 548d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "organization." + Data._ID 549d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PRIMARY_ORGANIZATION_ID + ", " + 550d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "email." + Data._ID 551d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PRIMARY_EMAIL_ID + ", " + 552d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Data._ID 553d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PRIMARY_PHONE_ID + ", " + 554d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Phone.NUMBER 555d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.NUMBER + ", " + 556d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Phone.TYPE 557d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.TYPE + ", " + 558d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Phone.LABEL 559d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.LABEL + ", " + 560d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + PhoneColumns.NORMALIZED_NUMBER 561ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov + " AS " + People.NUMBER_KEY; 562ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov 563ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PEOPLE + ";"); 564ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.PEOPLE + " AS SELECT " + 565ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov RawContactsColumns.CONCRETE_ID 566ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov + " AS " + android.provider.Contacts.People._ID + ", " + 567ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov peopleColumns + 5685ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + PEOPLE_JOINS + 569ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov " WHERE " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" + 570ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov " AND " + RawContacts.IS_RESTRICTED + "=0" + ";"); 571d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 572d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.ORGANIZATIONS + ";"); 573d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.ORGANIZATIONS + " AS SELECT " + 574d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 575d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations._ID + ", " + 5765ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Data.RAW_CONTACT_ID 577d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.PERSON_ID + ", " + 578d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Data.IS_PRIMARY 579d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.ISPRIMARY + ", " + 580caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 581caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 582d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.COMPANY 583d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.COMPANY + ", " + 584d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.TYPE 585d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.TYPE + ", " + 586d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.LABEL 587d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.LABEL + ", " + 588d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.TITLE 589caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.TITLE + 5905ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS + 591d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 59233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + Organization.CONTENT_ITEM_TYPE + "'" 593caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 594caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 595d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 596d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 597d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.CONTACT_METHODS + ";"); 598d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.CONTACT_METHODS + " AS SELECT " + 599d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 600d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods._ID + ", " + 601d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 602d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.PERSON_ID + ", " + 603d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov CONTACT_METHOD_KIND_SQL 604d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.KIND + ", " + 605d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_IS_PRIMARY 606d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.ISPRIMARY + ", " + 607f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov Tables.DATA + "." + Email.TYPE 608d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.TYPE + ", " + 60997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov CONTACT_METHOD_DATA_SQL 610d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.DATA + ", " + 611f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov Tables.DATA + "." + Email.LABEL 612d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.LABEL + ", " + 613d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_DATA14 614d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.AUX_DATA + ", " + 615ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov peopleColumns + 616d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.DATA + DATA_JOINS + 61733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov " WHERE " + ContactMethods.KIND + " IS NOT NULL" 618caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 619caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 620d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 621d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 622d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 623d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHONES + ";"); 624d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.PHONES + " AS SELECT " + 625d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 626d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones._ID + ", " + 627d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 628d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.PERSON_ID + ", " + 629d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_IS_PRIMARY 630d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.ISPRIMARY + ", " + 631d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Tables.DATA + "." + Phone.NUMBER 632d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NUMBER + ", " + 633d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Tables.DATA + "." + Phone.TYPE 634d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.TYPE + ", " + 635d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Tables.DATA + "." + Phone.LABEL 636d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.LABEL + ", " + 637d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov PhoneColumns.CONCRETE_NORMALIZED_NUMBER 638d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NUMBER_KEY + ", " + 639ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov peopleColumns + 640d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.DATA + DATA_JOINS + 641d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 64233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + Phone.CONTENT_ITEM_TYPE + "'" 643caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 644caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 645d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 646d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 647d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.EXTENSIONS + ";"); 648d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.EXTENSIONS + " AS SELECT " + 649d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 650d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions._ID + ", " + 651d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 652d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions.PERSON_ID + ", " + 653caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 654caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 655d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ExtensionsColumns.NAME 656d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions.NAME + ", " + 657d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ExtensionsColumns.VALUE 658caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions.VALUE + 6595ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS + 660d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 66133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE + "'" 662caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 663caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 664d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 665d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 666d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUPS + ";"); 667d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.GROUPS + " AS SELECT " + 668d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov GroupsColumns.CONCRETE_ID + " AS " + android.provider.Contacts.Groups._ID + ", " + 669caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov Groups.ACCOUNT_NAME + ", " + 670caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov Groups.ACCOUNT_TYPE + ", " + 671d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.TITLE + " AS " + android.provider.Contacts.Groups.NAME + ", " + 672d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.NOTES + " AS " + android.provider.Contacts.Groups.NOTES + " , " + 673d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.SYSTEM_ID + " AS " + android.provider.Contacts.Groups.SYSTEM_ID + 674d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.GROUPS + 675d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 676d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 677d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUP_MEMBERSHIP + ";"); 678d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.GROUP_MEMBERSHIP + " AS SELECT " + 679d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 680d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership._ID + ", " + 681d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 682d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.PERSON_ID + ", " + 683caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_NAME 684caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + RawContacts.ACCOUNT_NAME + ", " + 685caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_TYPE 686caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + RawContacts.ACCOUNT_TYPE + ", " + 687d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov GroupMembership.GROUP_ROW_ID 688d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.GROUP_ID + ", " + 689d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.TITLE 690d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.NAME + ", " + 691d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.NOTES 692d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.NOTES + " , " + 693d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.SYSTEM_ID 694caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.SYSTEM_ID + 6955ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " FROM " + Tables.DATA_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_GROUPS + 696d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 69733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + GroupMembership.CONTENT_ITEM_TYPE + "'" 6985ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" + 699d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 700c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 701c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHOTOS + ";"); 702c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.PHOTOS + " AS SELECT " + 703c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov DataColumns.CONCRETE_ID 704c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos._ID + ", " + 705d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 706c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.PERSON_ID + ", " + 707caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 708caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 709c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Tables.DATA + "." + Photo.PHOTO 710c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.DATA + ", " + 711c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.EXISTS_ON_SERVER 712c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.EXISTS_ON_SERVER + ", " + 713c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.DOWNLOAD_REQUIRED 714c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.DOWNLOAD_REQUIRED + ", " + 715c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.LOCAL_VERSION 716c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.LOCAL_VERSION + ", " + 717c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.SYNC_ERROR 718caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.SYNC_ERROR + 719c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov " FROM " + Tables.DATA + DATA_JOINS + LEGACY_PHOTO_JOIN + 720c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 72133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + Photo.CONTENT_ITEM_TYPE + "'" 722caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 723caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 724c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov ";"); 725d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov } 726d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 727f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public Uri insert(Uri uri, ContentValues values) { 72867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov ensureDefaultAccount(); 729f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final int match = sUriMatcher.match(uri); 730f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long id = 0; 731f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch (match) { 732f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE: 7333cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov id = insertPeople(values); 7343cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 7353cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 7363cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS: 7373cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov id = insertOrganization(values); 738f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 739f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 7400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_CONTACTMETHODS: { 7415ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = Long.parseLong(uri.getPathSegments().get(1)); 7425ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertContactMethod(rawContactId, values); 743e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 7440f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 745e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case CONTACTMETHODS: { 7475ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = getRequiredValue(values, ContactMethods.PERSON_ID); 7485ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertContactMethod(rawContactId, values); 749e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 7500f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 751e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PHONES: { 7535ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = getRequiredValue(values, 7540f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.Phones.PERSON_ID); 7555ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertPhone(rawContactId, values); 7560f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 7570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 7580f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 75994743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton case PEOPLE_PHONES: { 76094743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton long rawContactId = Long.parseLong(uri.getPathSegments().get(1)); 76194743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton id = insertPhone(rawContactId, values); 76294743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton break; 76394743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton } 76494743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton 7650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case EXTENSIONS: { 7665ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = getRequiredValue(values, 7670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.Extensions.PERSON_ID); 7685ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertExtension(rawContactId, values); 7690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 7700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 7710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 7720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPS: 7730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov id = insertGroup(values); 774e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 775e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPMEMBERSHIP: { 7775ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = getRequiredValue(values, 7780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.GroupMembership.PERSON_ID); 7790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov long groupId = getRequiredValue(values, 7800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.GroupMembership.GROUP_ID); 7815ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertGroupMembership(rawContactId, groupId); 7820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 7830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 7840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 785f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov default: 786f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 787f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 788f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 789f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (id < 0) { 790f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return null; 791f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 792f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 793f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final Uri result = ContentUris.withAppendedId(uri, id); 794f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov onChange(result); 795f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return result; 796f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 797f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 7980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private long getRequiredValue(ContentValues values, String column) { 7990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov if (!values.containsKey(column)) { 8000f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov throw new RuntimeException("Required value: " + column); 801e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 802e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 8030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return values.getAsLong(column); 804e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 805e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 8063cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private long insertPeople(ContentValues values) { 807044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parsePeopleValues(values); 808caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 80967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri contactUri = mContactsProvider.insertInTransaction(RawContacts.CONTENT_URI, mValues); 81067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov long rawContactId = ContentUris.parseId(contactUri); 81167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 81267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (mValues2.size() != 0) { 81367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mValues2.put(Data.RAW_CONTACT_ID, rawContactId); 81467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues2); 81567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 81667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (mValues3.size() != 0) { 81767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mValues3.put(Data.RAW_CONTACT_ID, rawContactId); 81867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues3); 81967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 820f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 82167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return rawContactId; 82267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 82367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 8243cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private long insertOrganization(ContentValues values) { 825044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parseOrganizationValues(values); 826b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, Data.RAW_CONTACT_ID, 8273cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.PERSON_ID); 8283cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 82967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 8303cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8313cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov return ContentUris.parseId(uri); 8323cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 833f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 8345ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private long insertPhone(long rawContactId, ContentValues values) { 835044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parsePhoneValues(values); 8365ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 837e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 83867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 839e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 840e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov return ContentUris.parseId(uri); 841e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 842e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 8435ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private long insertContactMethod(long rawContactId, ContentValues values) { 844e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Integer kind = values.getAsInteger(ContactMethods.KIND); 845e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov if (kind == null) { 846e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov throw new RuntimeException("Required value: " + ContactMethods.KIND); 847e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 848e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 849044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parseContactMethodValues(kind, values); 850e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 851044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 85267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 853e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov return ContentUris.parseId(uri); 854e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 855e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 8565ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private long insertExtension(long rawContactId, ContentValues values) { 8570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.clear(); 8580f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 8595ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 8600f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(Data.MIMETYPE, android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE); 8610f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 862044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parseExtensionValues(values); 8630f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 86467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 8650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return ContentUris.parseId(uri); 8660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 8670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 8680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private long insertGroup(ContentValues values) { 869044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parseGroupValues(values); 8700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 871df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana mValues.put(Groups.ACCOUNT_NAME, mAccount.name); 872df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana mValues.put(Groups.ACCOUNT_TYPE, mAccount.type); 873caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 87467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Groups.CONTENT_URI, mValues); 8750f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return ContentUris.parseId(uri); 8760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 8770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 8785ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private long insertGroupMembership(long rawContactId, long groupId) { 8790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.clear(); 8800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 8810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); 8825ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(GroupMembership.RAW_CONTACT_ID, rawContactId); 8830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(GroupMembership.GROUP_ROW_ID, groupId); 8840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 88567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 8860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return ContentUris.parseId(uri); 8870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 8880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 889f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 89067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov ensureDefaultAccount(); 89167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 89267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov int match = sUriMatcher.match(uri); 893c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov int count = 0; 894f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch(match) { 89567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov case PEOPLE_UPDATE_CONTACT_TIME: { 896f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov count = updateContactTime(uri, values); 897f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 89867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 899c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 900c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PEOPLE_PHOTO: { 9015ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = Long.parseLong(uri.getPathSegments().get(1)); 9025ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov return updatePhoto(rawContactId, values); 903c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 904c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 90567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov case -1: { 90667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 90767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 90867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 90967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov default: { 91067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov count = updateAll(uri, match, values, selection, selectionArgs); 91167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 91267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 91367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 91467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (count > 0) { 91567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContext.getContentResolver().notifyChange(uri, null); 91667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 91767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 91867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return count; 91967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 92067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 92167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private int updateAll(Uri uri, final int match, ContentValues values, String selection, 92267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov String[] selectionArgs) { 92367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Cursor c = query(uri, IdQuery.COLUMNS, selection, selectionArgs, null, null); 92467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (c == null) { 92567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return 0; 92667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 92767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 92867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov int count = 0; 92967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov try { 93067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov while (c.moveToNext()) { 93167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov long id = c.getLong(IdQuery._ID); 93267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov count += update(match, id, values); 93367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 93467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } finally { 93567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov c.close(); 93667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 93767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 93867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return count; 93967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 94067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 94167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov public int update(int match, long id, ContentValues values) { 94267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov int count = 0; 94367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov switch(match) { 94467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov case PEOPLE: 94567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov case PEOPLE_ID: { 94667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov count = updatePeople(id, values); 94767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov break; 94867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 94967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 950044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case ORGANIZATIONS: 951044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case ORGANIZATIONS_ID: { 952044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count = updateOrganizations(id, values); 953044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 954044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 955044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 956044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PHONES: 957044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PHONES_ID: { 958044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count = updatePhones(id, values); 959044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 960044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 961044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 962044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case CONTACTMETHODS: 963044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case CONTACTMETHODS_ID: { 964044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count = updateContactMethods(id, values); 965044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 966044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 967044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 968044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case EXTENSIONS: 969044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case EXTENSIONS_ID: { 970044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count = updateExtensions(id, values); 971044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 972044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 973044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 974044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case GROUPS: 975044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case GROUPS_ID: { 976044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count = updateGroups(id, values); 977c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov break; 978044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 979c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 980044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PHOTOS: 981c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PHOTOS_ID: 982044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count = updatePhotoByDataId(id, values); 983c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov break; 98467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 985c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 98667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return count; 98767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 988c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 98967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private int updatePeople(long rawContactId, ContentValues values) { 990044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parsePeopleValues(values); 99167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 992044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov int count = mContactsProvider.update(RawContacts.CONTENT_URI, 993044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues, RawContacts._ID + "=" + rawContactId, null); 99467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 99567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (count == 0) { 99667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return 0; 997f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 998f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 99967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (mValues2.size() != 0) { 100067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri dataUri = findFirstDataRow(rawContactId, StructuredName.CONTENT_ITEM_TYPE); 100167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (dataUri != null) { 100267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.update(dataUri, mValues2, null, null); 100367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } else { 100467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mValues2.put(Data.RAW_CONTACT_ID, rawContactId); 100567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues2); 100667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 100767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 100867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 100967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (mValues3.size() != 0) { 101067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri dataUri = findFirstDataRow(rawContactId, Note.CONTENT_ITEM_TYPE); 101167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (dataUri != null) { 101267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.update(dataUri, mValues3, null, null); 101367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } else { 101467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mValues3.put(Data.RAW_CONTACT_ID, rawContactId); 101567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues3); 101667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 1017f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 101867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 1019f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return count; 1020f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1021f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1022044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private int updateOrganizations(long dataId, ContentValues values) { 1023044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parseOrganizationValues(values); 1024044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1025044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues, 1026044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Data._ID + "=" + dataId, null); 1027044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1028044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1029044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private int updatePhones(long dataId, ContentValues values) { 1030044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parsePhoneValues(values); 1031044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1032044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues, 1033044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Data._ID + "=" + dataId, null); 1034044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1035044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1036044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private int updateContactMethods(long dataId, ContentValues values) { 1037044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov int kind; 1038044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1039044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mDataMimetypeQuery.bindLong(1, dataId); 1040044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov long mimetype_id; 1041044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov try { 1042044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mimetype_id = mDataMimetypeQuery.simpleQueryForLong(); 1043044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } catch (SQLiteDoneException e) { 1044044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov // Data row not found 1045044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return 0; 1046044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1047044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1048044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov if (mimetype_id == mMimetypeEmail) { 1049044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov kind = android.provider.Contacts.KIND_EMAIL; 1050044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } else if (mimetype_id == mMimetypeIm) { 1051044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov kind = android.provider.Contacts.KIND_IM; 1052044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } else if (mimetype_id == mMimetypePostal) { 1053044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov kind = android.provider.Contacts.KIND_POSTAL; 1054044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } else { 1055044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1056044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov // Non-legacy kind: return "Not found" 1057044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return 0; 1058044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1059044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1060044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parseContactMethodValues(kind, values); 1061044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1062044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues, 1063044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Data._ID + "=" + dataId, null); 1064044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1065044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1066044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private int updateExtensions(long dataId, ContentValues values) { 1067044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parseExtensionValues(values); 1068044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1069044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues, 1070044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Data._ID + "=" + dataId, null); 1071044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1072044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1073044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private int updateGroups(long groupId, ContentValues values) { 1074044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parseGroupValues(values); 1075044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1076044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return mContactsProvider.updateInTransaction(Groups.CONTENT_URI, mValues, 1077044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Groups._ID + "=" + groupId, null); 1078044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1079044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1080f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private int updateContactTime(Uri uri, ContentValues values) { 1081f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1082f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // TODO check sanctions 1083f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1084f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long lastTimeContacted; 1085f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.LAST_TIME_CONTACTED)) { 1086f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov lastTimeContacted = values.getAsLong(People.LAST_TIME_CONTACTED); 1087f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } else { 1088f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov lastTimeContacted = System.currentTimeMillis(); 1089f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1090f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 10915ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = Long.parseLong(uri.getPathSegments().get(1)); 1092b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov long contactId = mDbHelper.getContactId(rawContactId); 1093d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov if (contactId != 0) { 1094ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton mContactsProvider.updateContactLastContactedTime(contactId, lastTimeContacted); 1095f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1096ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton 1097ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton mLastTimeContactedUpdate.bindLong(1, lastTimeContacted); 1098ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton mLastTimeContactedUpdate.bindLong(2, rawContactId); 1099ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton mLastTimeContactedUpdate.execute(); 1100ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton 1101f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return 1; 1102f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1103f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 11045ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private int updatePhoto(long rawContactId, ContentValues values) { 1105c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1106c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov // TODO check sanctions 1107c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1108c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov int count; 1109c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 111067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov long dataId = findFirstDataId(rawContactId, Photo.CONTENT_ITEM_TYPE); 1111c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1112c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.clear(); 1113c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA); 1114c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(Photo.PHOTO, bytes); 1115c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1116c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov if (dataId == -1) { 1117c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 11185ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 111967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri dataUri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 1120c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov dataId = ContentUris.parseId(dataUri); 1121c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov count = 1; 1122c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } else { 1123c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Uri dataUri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId); 112467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov count = mContactsProvider.updateInTransaction(dataUri, mValues, null, null); 1125c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1126c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1127044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov updateLegacyPhotoData(rawContactId, dataId, values); 1128044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1129044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return count; 1130044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1131044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1132044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private int updatePhotoByDataId(long dataId, ContentValues values) { 1133044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1134044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mDataRawContactIdQuery.bindLong(1, dataId); 1135044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov long rawContactId; 1136044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1137044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov try { 1138044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov rawContactId = mDataRawContactIdQuery.simpleQueryForLong(); 1139044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } catch (SQLiteDoneException e) { 1140044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov // Data row not found 1141044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return 0; 1142044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1143044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1144044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov if (values.containsKey(android.provider.Contacts.Photos.DATA)) { 1145044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA); 1146044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.clear(); 1147044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(Photo.PHOTO, bytes); 1148044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues, 1149044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Data._ID + "=" + dataId, null); 1150044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1151044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1152044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov updateLegacyPhotoData(rawContactId, dataId, values); 1153044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1154044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return 1; 1155044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1156044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1157044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private void updateLegacyPhotoData(long rawContactId, long dataId, ContentValues values) { 1158c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.clear(); 1159b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, LegacyPhotoData.LOCAL_VERSION, 1160c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.LOCAL_VERSION); 1161b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, LegacyPhotoData.DOWNLOAD_REQUIRED, 1162c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.DOWNLOAD_REQUIRED); 1163b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, LegacyPhotoData.EXISTS_ON_SERVER, 1164c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.EXISTS_ON_SERVER); 1165b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, LegacyPhotoData.SYNC_ERROR, 1166c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.SYNC_ERROR); 1167c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 116867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov int updated = mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues, 1169c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Data.MIMETYPE + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'" 11705ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " AND " + Data.RAW_CONTACT_ID + "=" + rawContactId 1171c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AND " + LegacyPhotoData.PHOTO_DATA_ID + "=" + dataId, null); 1172c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov if (updated == 0) { 11735ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 1174c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(Data.MIMETYPE, LegacyPhotoData.CONTENT_ITEM_TYPE); 1175c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(LegacyPhotoData.PHOTO_DATA_ID, dataId); 117667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 1177c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1178044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1179c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1180044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private void parsePeopleValues(ContentValues values) { 1181044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.clear(); 1182044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues2.clear(); 1183044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues3.clear(); 1184044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1185b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, RawContacts.CUSTOM_RINGTONE, 1186044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, People.CUSTOM_RINGTONE); 1187b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, RawContacts.SEND_TO_VOICEMAIL, 1188044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, People.SEND_TO_VOICEMAIL); 1189b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, RawContacts.LAST_TIME_CONTACTED, 1190044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, People.LAST_TIME_CONTACTED); 1191b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, RawContacts.TIMES_CONTACTED, 1192044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, People.TIMES_CONTACTED); 1193b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, RawContacts.STARRED, 1194044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, People.STARRED); 1195044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(RawContacts.ACCOUNT_NAME, mAccount.name); 1196044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(RawContacts.ACCOUNT_TYPE, mAccount.type); 1197044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1198044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov if (values.containsKey(People.NAME) || values.containsKey(People.PHONETIC_NAME)) { 1199044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues2.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 1200b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues2, StructuredName.DISPLAY_NAME, 1201044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, People.NAME); 1202044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov if (values.containsKey(People.PHONETIC_NAME)) { 1203044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov String phoneticName = values.getAsString(People.PHONETIC_NAME); 1204044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov NameSplitter.Name parsedName = new NameSplitter.Name(); 1205044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mPhoneticNameSplitter.split(parsedName, phoneticName); 1206044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues2.put(StructuredName.PHONETIC_GIVEN_NAME, parsedName.getGivenNames()); 1207044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues2.put(StructuredName.PHONETIC_MIDDLE_NAME, parsedName.getMiddleName()); 1208044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues2.put(StructuredName.PHONETIC_FAMILY_NAME, parsedName.getFamilyName()); 1209044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1210044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1211044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1212044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov if (values.containsKey(People.NOTES)) { 1213044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues3.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE); 1214b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues3, Note.NOTE, values, People.NOTES); 1215044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1216044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1217044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1218044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private void parseOrganizationValues(ContentValues values) { 1219044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.clear(); 1220044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1221044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE); 1222044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1223b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, Data.IS_PRIMARY, 1224044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Organizations.ISPRIMARY); 1225044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1226b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Organization.COMPANY, 1227044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Organizations.COMPANY); 1228044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1229044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov // TYPE values happen to remain the same between V1 and V2 - can just copy the value 1230b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, Organization.TYPE, 1231044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Organizations.TYPE); 1232044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1233b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Organization.LABEL, 1234044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Organizations.LABEL); 1235b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Organization.TITLE, 1236044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Organizations.TITLE); 1237044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1238044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1239044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private void parsePhoneValues(ContentValues values) { 1240044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.clear(); 1241044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1242044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 1243044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1244b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, Data.IS_PRIMARY, 1245044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Phones.ISPRIMARY); 1246044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1247b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Phone.NUMBER, 1248044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Phones.NUMBER); 1249044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1250044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov // TYPE values happen to remain the same between V1 and V2 - can just copy the value 1251b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, Phone.TYPE, 1252044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Phones.TYPE); 1253044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1254b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Phone.LABEL, 1255044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Phones.LABEL); 1256044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1257044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1258044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private void parseContactMethodValues(int kind, ContentValues values) { 1259044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.clear(); 1260044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1261b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, Data.IS_PRIMARY, values, 1262b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactMethods.ISPRIMARY); 1263044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1264044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov switch (kind) { 1265044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case android.provider.Contacts.KIND_EMAIL: { 1266044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov copyCommonFields(values, Email.CONTENT_ITEM_TYPE, Email.TYPE, Email.LABEL, 1267044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Data.DATA14); 1268b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Email.DATA, values, 1269b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactMethods.DATA); 1270044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 1271044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1272044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1273044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case android.provider.Contacts.KIND_IM: { 1274044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov String protocol = values.getAsString(ContactMethods.DATA); 1275044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov if (protocol.startsWith("pre:")) { 1276044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(Im.PROTOCOL, Integer.parseInt(protocol.substring(4))); 1277044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } else if (protocol.startsWith("custom:")) { 1278044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM); 1279044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(Im.CUSTOM_PROTOCOL, protocol.substring(7)); 1280044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1281044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1282044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov copyCommonFields(values, Im.CONTENT_ITEM_TYPE, Im.TYPE, Im.LABEL, Data.DATA14); 1283044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 1284044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1285044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1286044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case android.provider.Contacts.KIND_POSTAL: { 1287044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov copyCommonFields(values, StructuredPostal.CONTENT_ITEM_TYPE, StructuredPostal.TYPE, 1288044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov StructuredPostal.LABEL, Data.DATA14); 1289b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, StructuredPostal.FORMATTED_ADDRESS, 1290b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov values, ContactMethods.DATA); 1291044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 1292044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1293044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1294044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1295044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1296044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private void copyCommonFields(ContentValues values, String mimeType, String typeColumn, 1297044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov String labelColumn, String auxDataColumn) { 1298044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(Data.MIMETYPE, mimeType); 1299b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, typeColumn, values, 1300b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactMethods.TYPE); 1301b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, labelColumn, values, 1302b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactMethods.LABEL); 1303b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, auxDataColumn, values, 1304b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactMethods.AUX_DATA); 1305044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1306044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1307044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private void parseGroupValues(ContentValues values) { 1308044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.clear(); 1309044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1310b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Groups.TITLE, 1311044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Groups.NAME); 1312b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Groups.NOTES, 1313044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Groups.NOTES); 1314b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Groups.SYSTEM_ID, 1315044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Groups.SYSTEM_ID); 1316044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1317044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1318044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private void parseExtensionValues(ContentValues values) { 1319b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, ExtensionsColumns.NAME, 1320044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.People.Extensions.NAME); 1321b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, ExtensionsColumns.VALUE, 1322044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.People.Extensions.VALUE); 1323c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1324c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 132567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private Uri findFirstDataRow(long rawContactId, String contentItemType) { 132667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov long dataId = findFirstDataId(rawContactId, contentItemType); 132767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (dataId == -1) { 132867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return null; 132967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 133067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 133167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return ContentUris.withAppendedId(Data.CONTENT_URI, dataId); 133267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 133367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 133467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private long findFirstDataId(long rawContactId, String mimeType) { 133567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov long dataId = -1; 133667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Cursor c = mContactsProvider.query(Data.CONTENT_URI, IdQuery.COLUMNS, 133767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Data.RAW_CONTACT_ID + "=" + rawContactId + " AND " 133867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov + Data.MIMETYPE + "='" + mimeType + "'", 133967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov null, null); 134067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov try { 134167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (c.moveToFirst()) { 134267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov dataId = c.getLong(IdQuery._ID); 134367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 134467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } finally { 134567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov c.close(); 134667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 134767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return dataId; 134867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 134967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 1350044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 13513cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov public int delete(Uri uri, String selection, String[] selectionArgs) { 1352044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Cursor c = query(uri, IdQuery.COLUMNS, selection, selectionArgs, null, null); 1353044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov if (c == null) { 1354044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return 0; 1355044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1356044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1357044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov int count = 0; 1358044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov try { 1359044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov while (c.moveToNext()) { 1360044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov long id = c.getLong(IdQuery._ID); 1361044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count += delete(uri, id); 1362044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1363044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } finally { 1364044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov c.close(); 1365044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1366044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1367044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return count; 1368044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1369044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1370044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov public int delete(Uri uri, long id) { 13713cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov final int match = sUriMatcher.match(uri); 13723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov int count = 0; 13733cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov switch (match) { 1374044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PEOPLE: 137533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov case PEOPLE_ID: 137633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov count = mContactsProvider.deleteRawContact(ContentUris.parseId(uri), false); 137733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov break; 137833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 1379044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PEOPLE_PHOTO: 1380044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.clear(); 1381044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.putNull(android.provider.Contacts.Photos.DATA); 1382044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov updatePhoto(id, mValues); 1383044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 1384044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1385044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case ORGANIZATIONS: 13863cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS_ID: 1387e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1388e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov ORGANIZATION_MIME_TYPES); 1389e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1390e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1391044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case CONTACTMETHODS: 1392e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS_ID: 1393e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1394e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov CONTACT_METHOD_MIME_TYPES); 1395e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1396e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1397044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1398044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PHONES: 1399e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES_ID: 1400e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1401e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov PHONE_MIME_TYPES); 14023cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 14033cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 1404044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case EXTENSIONS: 1405044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case EXTENSIONS_ID: 1406044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1407044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov EXTENSION_MIME_TYPES); 1408044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 1409044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1410044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PHOTOS: 1411044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PHOTOS_ID: 1412044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1413044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov PHOTO_MIME_TYPES); 1414044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1415044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 1416044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 14173cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov default: 14183cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 14193cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 14203cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 14213cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov return count; 14223cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 14233cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 1424f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 1425c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov String sortOrder, String limit) { 1426caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov ensureDefaultAccount(); 1427caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 1428b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov final SQLiteDatabase db = mDbHelper.getReadableDatabase(); 1429f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 1430f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String groupBy = null; 1431f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1432f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final int match = sUriMatcher.match(uri); 1433f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch (match) { 1434f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE: { 143570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 1436f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 143767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1438f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 1439f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1440f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1441f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE_ID: 144270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 1443f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 144467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1445caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov qb.appendWhere(" AND " + People._ID + "="); 1446f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1447f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 1448f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1449445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov case PEOPLE_FILTER: { 1450445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 1451445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 145267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1453445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov String filterParam = uri.getPathSegments().get(2); 1454caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov qb.appendWhere(" AND " + People._ID + " IN " 14555ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + mContactsProvider.getRawContactsByFilterAsNestedQuery(filterParam)); 1456445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov break; 1457445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov } 1458445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov 145971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov case GROUP_NAME_MEMBERS: 146071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 146171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 146271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov applyRawContactsAccount(qb); 146371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov String group = uri.getPathSegments().get(2); 146471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov qb.appendWhere(" AND " + buildGroupNameMatchWhereClause(group)); 146571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov break; 146671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov 14673cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS: 14685dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.ORGANIZATIONS + " organizations"); 1469d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sOrganizationProjectionMap); 147067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 14713cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 14723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 14733cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS_ID: 14745dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.ORGANIZATIONS + " organizations"); 14753cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov qb.setProjectionMap(sOrganizationProjectionMap); 147667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1477d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Organizations._ID + "="); 1478e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1479e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1480e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1481e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS: 14825dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods"); 1483d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 148467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1485e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1486e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1487e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS_ID: 14885dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods"); 1489e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 149067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1491d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods._ID + "="); 1492e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1493e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1494e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1495bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov case CONTACTMETHODS_EMAIL: 1496bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods"); 1497bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 1498bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov applyRawContactsAccount(qb); 1499bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.KIND + "=" 1500bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov + android.provider.Contacts.KIND_EMAIL); 1501bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov break; 1502bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov 1503e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_CONTACTMETHODS: 15045dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods"); 1505e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 150667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1507d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "="); 1508e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1509e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL"); 1510e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1511e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1512e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_CONTACTMETHODS_ID: 15135dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods"); 1514e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 151567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1516d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "="); 1517e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1518d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods._ID + "="); 1519e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 1520e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL"); 1521e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1522e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1523e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES: 15245dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHONES + " phones"); 1525d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 152667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1527e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1528e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1529e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES_ID: 15305dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHONES + " phones"); 1531e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 153267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1533d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "="); 1534e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1535e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1536e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1537fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov case PHONES_FILTER: 15385dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHONES + " phones"); 1539fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 154067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1541fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov if (uri.getPathSegments().size() > 2) { 1542fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov String filterParam = uri.getLastPathSegment(); 1543e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov qb.appendWhere(" AND person ="); 1544b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov qb.appendWhere(mDbHelper.buildPhoneLookupAsNestedQuery(filterParam)); 1545fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov } 1546fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov break; 1547fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov 1548e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_PHONES: 15495dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHONES + " phones"); 1550e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 155167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1552d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "="); 1553e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1554e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1555e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1556e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_PHONES_ID: 15575dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHONES + " phones"); 1558e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 155967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1560d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "="); 15613cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1562d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "="); 1563e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 15643cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 15653cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 15660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case EXTENSIONS: 15675dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS + " extensions"); 1568d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 156967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 15700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 15710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 15720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case EXTENSIONS_ID: 15735dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS + " extensions"); 15740f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 157567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1576d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "="); 15770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 15780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 15790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 15800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_EXTENSIONS: 15815dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS + " extensions"); 15820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 158367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1584d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "="); 15850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 15860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 15870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 15880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_EXTENSIONS_ID: 15895dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS + " extensions"); 15900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 159167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1592d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "="); 15930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1594d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "="); 15950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 15960f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 15970f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 15980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPS: 15995dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUPS + " groups"); 16000f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupProjectionMap); 160167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyGroupAccount(qb); 16020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 16030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 16040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPS_ID: 16055dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUPS + " groups"); 16060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupProjectionMap); 160767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyGroupAccount(qb); 1608caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Groups._ID + "="); 16090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 16100f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 16110f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 16120f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPMEMBERSHIP: 16135dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership"); 1614d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 161567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 16160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 16170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 16180f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPMEMBERSHIP_ID: 16195dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership"); 16200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 162167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1622d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "="); 16230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 16240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 16250f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 16260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_GROUPMEMBERSHIP: 16275dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership"); 16280f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 162967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1630d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "="); 16310f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 16320f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 16330f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 16340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_GROUPMEMBERSHIP_ID: 16355dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership"); 16360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 163767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1638d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "="); 16390f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1640d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "="); 16410f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 16420f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 16430f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 1644c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PEOPLE_PHOTO: 16455dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHOTOS + " photos"); 1646c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov qb.setProjectionMap(sPhotoProjectionMap); 164767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1648c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Photos.PERSON_ID + "="); 1649c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1650c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov limit = "1"; 1651c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov break; 1652c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1653044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PHOTOS: 1654044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov qb.setTables(LegacyTables.PHOTOS + " photos"); 1655044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov qb.setProjectionMap(sPhotoProjectionMap); 1656044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov applyRawContactsAccount(qb); 1657044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 1658044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1659044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PHOTOS_ID: 1660044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov qb.setTables(LegacyTables.PHOTOS + " photos"); 1661044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov qb.setProjectionMap(sPhotoProjectionMap); 1662044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov applyRawContactsAccount(qb); 1663044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Photos._ID + "="); 1664044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1665044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 1666044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1667c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov case SEARCH_SUGGESTIONS: 1668c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 1669c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov // No legacy compatibility for search suggestions 1670a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov return mGlobalSearchSupport.handleSearchSuggestionsQuery(db, uri, limit); 1671c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 1672b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov case SEARCH_SHORTCUT: { 1673b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov long contactId = ContentUris.parseId(uri); 1674b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov return mGlobalSearchSupport.handleSearchShortcutRefresh(db, contactId, projection); 1675b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov } 1676b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov 16771b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case LIVE_FOLDERS_PEOPLE: 16781b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_URI, 16791b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov projection, selection, selectionArgs, sortOrder); 16801b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 16811b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case LIVE_FOLDERS_PEOPLE_WITH_PHONES: 16821b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_WITH_PHONES_URI, 16831b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov projection, selection, selectionArgs, sortOrder); 16841b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 16851b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case LIVE_FOLDERS_PEOPLE_FAVORITES: 16861b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_FAVORITES_URI, 16871b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov projection, selection, selectionArgs, sortOrder); 16881b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 16891b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case LIVE_FOLDERS_PEOPLE_GROUP_NAME: 16901b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov return mContactsProvider.query(Uri.withAppendedPath(LIVE_FOLDERS_CONTACTS_URI, 16911b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov Uri.encode(uri.getLastPathSegment())), 16921b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov projection, selection, selectionArgs, sortOrder); 16931b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 169433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov case DELETED_PEOPLE: 169533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov case DELETED_GROUPS: 169633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov throw new UnsupportedOperationException(); 169733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 1698f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov default: 1699f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov throw new IllegalArgumentException("Unknown URL " + uri); 1700f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1701f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1702f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // Perform the query and set the notification uri 1703f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final Cursor c = qb.query(db, projection, selection, selectionArgs, 1704f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov groupBy, null, sortOrder, limit); 1705f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (c != null) { 17063fe48cf2c81f6e89b78e919661e2b0b828a2144eDmitri Plotnikov c.setNotificationUri(mContext.getContentResolver(), 17073fe48cf2c81f6e89b78e919661e2b0b828a2144eDmitri Plotnikov android.provider.Contacts.CONTENT_URI); 1708f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1709f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return c; 1710f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1711f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 171267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private void applyRawContactsAccount(SQLiteQueryBuilder qb) { 1713caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov StringBuilder sb = new StringBuilder(); 171467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov appendRawContactsAccount(sb); 171567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov qb.appendWhere(sb.toString()); 171667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 171767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 171867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private void appendRawContactsAccount(StringBuilder sb) { 1719caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov sb.append(RawContacts.ACCOUNT_NAME + "="); 1720df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana DatabaseUtils.appendEscapedSQLString(sb, mAccount.name); 1721caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov sb.append(" AND " + RawContacts.ACCOUNT_TYPE + "="); 1722df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana DatabaseUtils.appendEscapedSQLString(sb, mAccount.type); 1723caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 1724caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 172567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private void applyGroupAccount(SQLiteQueryBuilder qb) { 1726caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov StringBuilder sb = new StringBuilder(); 172767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov appendGroupAccount(sb); 172867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov qb.appendWhere(sb.toString()); 172967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 173067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 173167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private void appendGroupAccount(StringBuilder sb) { 1732caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov sb.append(Groups.ACCOUNT_NAME + "="); 1733df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana DatabaseUtils.appendEscapedSQLString(sb, mAccount.name); 1734caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov sb.append(" AND " + Groups.ACCOUNT_TYPE + "="); 1735df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana DatabaseUtils.appendEscapedSQLString(sb, mAccount.type); 1736caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 1737caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 1738f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov /** 173971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov * Build a WHERE clause that restricts the query to match people that are a member of 174071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov * a group with a particular name. The projection map of the query must include 174171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov * {@link People#_ID}. 174271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov * 174371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov * @param groupName The name of the group 174471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov * @return The where clause. 174571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov */ 174671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov private String buildGroupNameMatchWhereClause(String groupName) { 174771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov return "people._id IN " 174871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov + "(SELECT " + DataColumns.CONCRETE_RAW_CONTACT_ID 174971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov + " FROM " + Tables.DATA_JOIN_MIMETYPES 175071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov + " WHERE " + Data.MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE 175171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov + "' AND " + GroupMembership.GROUP_ROW_ID + "=" 175271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov + "(SELECT " + Tables.GROUPS + "." + Groups._ID 175371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov + " FROM " + Tables.GROUPS 175471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov + " WHERE " + Groups.TITLE + "=" 175571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov + DatabaseUtils.sqlEscapeString(groupName) + "))"; 175671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov } 175771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov 175871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov /** 1759f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * Called when a change has been made. 1760f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * 1761f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * @param uri the uri that the change was made to 1762f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov */ 1763f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private void onChange(Uri uri) { 1764f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContext.getContentResolver().notifyChange(android.provider.Contacts.CONTENT_URI, null); 1765f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 176661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov 176761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov public String getType(Uri uri) { 176861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov int match = sUriMatcher.match(uri); 176961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov switch (match) { 177061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case EXTENSIONS: 177161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_EXTENSIONS: 177261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return Extensions.CONTENT_TYPE; 177361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case EXTENSIONS_ID: 177461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_EXTENSIONS_ID: 177561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return Extensions.CONTENT_ITEM_TYPE; 177661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE: 177761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/person"; 177861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_ID: 177961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/person"; 178061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_PHONES: 178161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/phone"; 178261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_PHONES_ID: 178361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/phone"; 178461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_CONTACTMETHODS: 178561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/contact-methods"; 178661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_CONTACTMETHODS_ID: 178761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return getContactMethodType(uri); 178861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PHONES: 178961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/phone"; 179061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PHONES_ID: 179161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/phone"; 179261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PHONES_FILTER: 179361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/phone"; 179461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PHOTOS_ID: 179561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/photo"; 179661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PHOTOS: 179761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/photo"; 179861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_PHOTO: 179961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/photo"; 180061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case CONTACTMETHODS: 180161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/contact-methods"; 180261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case CONTACTMETHODS_ID: 180361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return getContactMethodType(uri); 180461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case ORGANIZATIONS: 180561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/organizations"; 180661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case ORGANIZATIONS_ID: 180761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/organization"; 180861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case SEARCH_SUGGESTIONS: 180961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return SearchManager.SUGGEST_MIME_TYPE; 181061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case SEARCH_SHORTCUT: 181161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return SearchManager.SHORTCUT_MIME_TYPE; 181261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov default: 181361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov throw new IllegalArgumentException("Unknown URI"); 181461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 181561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 181661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov 181761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov private String getContactMethodType(Uri url) { 181861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov String mime = null; 181961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov 182061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov Cursor c = query(url, new String[] {ContactMethods.KIND}, null, null, null, null); 182161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov if (c != null) { 182261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov try { 182361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov if (c.moveToFirst()) { 182461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov int kind = c.getInt(0); 182561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov switch (kind) { 18261b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case android.provider.Contacts.KIND_EMAIL: 182761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov mime = "vnd.android.cursor.item/email"; 182861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov break; 182961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov 18301b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case android.provider.Contacts.KIND_IM: 183161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov mime = "vnd.android.cursor.item/jabber-im"; 183261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov break; 183361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov 18341b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case android.provider.Contacts.KIND_POSTAL: 183561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov mime = "vnd.android.cursor.item/postal-address"; 183661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov break; 183761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 183861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 183961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } finally { 184061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov c.close(); 184161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 184261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 184361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return mime; 184461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 1845f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov} 1846