LegacyApiSupport.java revision 3b2770e909f82c90218aee49d6f9f107aa4b7feb
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; 1113b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov private static final int GROUP_SYSTEM_ID_MEMBERS = 41; 1123b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov private static final int PEOPLE_ORGANIZATIONS = 42; 1133b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov private static final int PEOPLE_ORGANIZATIONS_ID = 43; 114c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 115e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String PEOPLE_JOINS = 1165ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " LEFT OUTER JOIN data name ON (raw_contacts._id = name.raw_contact_id" 117e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = name.mimetype_id)" 118e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + StructuredName.CONTENT_ITEM_TYPE + "')" 1195ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " LEFT OUTER JOIN data organization ON (raw_contacts._id = organization.raw_contact_id" 120e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = organization.mimetype_id)" 121e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Organization.CONTENT_ITEM_TYPE + "' AND organization.is_primary)" 1225ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " LEFT OUTER JOIN data email ON (raw_contacts._id = email.raw_contact_id" 123e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = email.mimetype_id)" 124e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Email.CONTENT_ITEM_TYPE + "' AND email.is_primary)" 1255ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " LEFT OUTER JOIN data note ON (raw_contacts._id = note.raw_contact_id" 126e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = note.mimetype_id)" 127e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Note.CONTENT_ITEM_TYPE + "')" 1285ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " LEFT OUTER JOIN data phone ON (raw_contacts._id = phone.raw_contact_id" 129e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = phone.mimetype_id)" 130e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Phone.CONTENT_ITEM_TYPE + "' AND phone.is_primary)"; 131e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 132d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String DATA_JOINS = 133d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " JOIN mimetypes ON (mimetypes._id = data.mimetype_id)" 1345ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " JOIN raw_contacts ON (raw_contacts._id = data.raw_contact_id)" 135d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + PEOPLE_JOINS; 136d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 13770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov public static final String PRESENCE_JOINS = 1380a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov " LEFT OUTER JOIN " + Tables.PRESENCE + 1390a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov " ON (" + Tables.PRESENCE + "." + StatusUpdates.DATA_ID + "=" + 1400a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov "(SELECT MAX(" + StatusUpdates.DATA_ID + ")" + 1410a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov " FROM " + Tables.PRESENCE + 1420a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov " WHERE people._id = " + PresenceColumns.RAW_CONTACT_ID + ")" + 1430a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov " )"; 14470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 145e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String PHONETIC_NAME_SQL = "trim(trim(" 146e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_GIVEN_NAME + ",' ')||' '||" 147e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_MIDDLE_NAME + ",' '))||' '||" 148e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_FAMILY_NAME + ",' ')) "; 149e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 150e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String CONTACT_METHOD_KIND_SQL = 151d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "CAST ((CASE WHEN mimetype='" + Email.CONTENT_ITEM_TYPE + "'" 152e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_EMAIL 153e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 154e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " (CASE WHEN mimetype='" + Im.CONTENT_ITEM_TYPE +"'" 155e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_IM 156e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 15767dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey + " (CASE WHEN mimetype='" + StructuredPostal.CONTENT_ITEM_TYPE + "'" 158e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_POSTAL 159e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 160e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " NULL" 161e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " END)" 162e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " END)" 163d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " END) AS INTEGER)"; 164f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 16597f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov private static final String IM_PROTOCOL_SQL = 16682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov "(CASE WHEN " + StatusUpdates.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM 16782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov + " THEN 'custom:'||" + StatusUpdates.CUSTOM_PROTOCOL 16882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov + " ELSE 'pre:'||" + StatusUpdates.PROTOCOL 16997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " END)"; 17097f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov 17197f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov private static String CONTACT_METHOD_DATA_SQL = 17297f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov "(CASE WHEN " + Data.MIMETYPE + "='" + Im.CONTENT_ITEM_TYPE + "'" 17397f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " THEN (CASE WHEN " + Tables.DATA + "." + Im.PROTOCOL + "=" + Im.PROTOCOL_CUSTOM 17497f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " THEN 'custom:'||" + Tables.DATA + "." + Im.CUSTOM_PROTOCOL 17597f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " ELSE 'pre:'||" + Tables.DATA + "." + Im.PROTOCOL 17697f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " END)" 177f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov + " ELSE " + Tables.DATA + "." + Email.DATA 17897f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov + " END)"; 17997f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov 1801b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private static final Uri LIVE_FOLDERS_CONTACTS_URI = Uri.withAppendedPath( 1811b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov ContactsContract.AUTHORITY_URI, "live_folders/contacts"); 1821b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 1831b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private static final Uri LIVE_FOLDERS_CONTACTS_WITH_PHONES_URI = Uri.withAppendedPath( 1841b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov ContactsContract.AUTHORITY_URI, "live_folders/contacts_with_phones"); 1851b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 1861b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov private static final Uri LIVE_FOLDERS_CONTACTS_FAVORITES_URI = Uri.withAppendedPath( 1871b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov ContactsContract.AUTHORITY_URI, "live_folders/favorites"); 18897f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov 189f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public interface LegacyTables { 190d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String PEOPLE = "view_v1_people"; 1915dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov public static final String PEOPLE_JOIN_PRESENCE = "view_v1_people people " + PRESENCE_JOINS; 192d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String GROUPS = "view_v1_groups"; 193d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String ORGANIZATIONS = "view_v1_organizations"; 194d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String CONTACT_METHODS = "view_v1_contact_methods"; 195d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String PHONES = "view_v1_phones"; 196d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String EXTENSIONS = "view_v1_extensions"; 197d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String GROUP_MEMBERSHIP = "view_v1_group_membership"; 198c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String PHOTOS = "view_v1_photos"; 199f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 200f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 201e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] ORGANIZATION_MIME_TYPES = new String[] { 202e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Organization.CONTENT_ITEM_TYPE 203e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 204e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 205e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] CONTACT_METHOD_MIME_TYPES = new String[] { 206e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Email.CONTENT_ITEM_TYPE, 207e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Im.CONTENT_ITEM_TYPE, 20867dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey StructuredPostal.CONTENT_ITEM_TYPE, 209e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 210e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 211e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] PHONE_MIME_TYPES = new String[] { 212e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Phone.CONTENT_ITEM_TYPE 213e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 214e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 215044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private static final String[] PHOTO_MIME_TYPES = new String[] { 216044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Photo.CONTENT_ITEM_TYPE 217044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov }; 218044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 219044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private static final String[] EXTENSION_MIME_TYPES = new String[] { 220044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE 221044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov }; 222044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 22367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private interface IdQuery { 22467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov String[] COLUMNS = { BaseColumns._ID }; 225c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 226c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov int _ID = 0; 227c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 228c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 229c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov /** 230c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov * A custom data row that is used to store legacy photo data fields no 231c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov * longer directly supported by the API. 232c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov */ 233c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private interface LegacyPhotoData { 234c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/photo_v1_extras"; 235c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 236c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String PHOTO_DATA_ID = Data.DATA1; 237c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String LOCAL_VERSION = Data.DATA2; 238c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String DOWNLOAD_REQUIRED = Data.DATA3; 239c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String EXISTS_ON_SERVER = Data.DATA4; 240c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String SYNC_ERROR = Data.DATA5; 241c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 242c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 243c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String LEGACY_PHOTO_JOIN = 2445ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " LEFT OUTER JOIN data legacy_photo ON (raw_contacts._id = legacy_photo.raw_contact_id" 245c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = legacy_photo.mimetype_id)" 246c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'" 247c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AND " + DataColumns.CONCRETE_ID + " = legacy_photo." + LegacyPhotoData.PHOTO_DATA_ID 248c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + ")"; 249c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 250f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final HashMap<String, String> sPeopleProjectionMap; 2513cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private static final HashMap<String, String> sOrganizationProjectionMap; 252e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final HashMap<String, String> sContactMethodProjectionMap; 253e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final HashMap<String, String> sPhoneProjectionMap; 2540f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final HashMap<String, String> sExtensionProjectionMap; 2550f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final HashMap<String, String> sGroupProjectionMap; 2560f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final HashMap<String, String> sGroupMembershipProjectionMap; 257c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private static final HashMap<String, String> sPhotoProjectionMap; 258fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov 259f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov static { 260f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 261f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // Contacts URI matching table 262f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov UriMatcher matcher = sUriMatcher; 263f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 264f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String authority = android.provider.Contacts.AUTHORITY; 2650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "extensions", EXTENSIONS); 2660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "extensions/#", EXTENSIONS_ID); 2670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groups", GROUPS); 2680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groups/#", GROUPS_ID); 26971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov matcher.addURI(authority, "groups/name/*/members", GROUP_NAME_MEMBERS); 270f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/name/*/members/filter/*", 271f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// GROUP_NAME_MEMBERS_FILTER); 2723b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov matcher.addURI(authority, "groups/system_id/*/members", GROUP_SYSTEM_ID_MEMBERS); 273f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/system_id/*/members/filter/*", 274f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// GROUP_SYSTEM_ID_MEMBERS_FILTER); 2750f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groupmembership", GROUPMEMBERSHIP); 2760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groupmembership/#", GROUPMEMBERSHIP_ID); 277f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groupmembershipraw", GROUPMEMBERSHIP_RAW); 278f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people", PEOPLE); 279f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/strequent", PEOPLE_STREQUENT); 280f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/strequent/filter/*", PEOPLE_STREQUENT_FILTER); 281445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov matcher.addURI(authority, "people/filter/*", PEOPLE_FILTER); 282f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/with_phones_filter/*", 283f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_WITH_PHONES_FILTER); 284f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/with_email_or_im_filter/*", 285f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_WITH_EMAIL_OR_IM_FILTER); 286f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people/#", PEOPLE_ID); 2870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/extensions", PEOPLE_EXTENSIONS); 2880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/extensions/#", PEOPLE_EXTENSIONS_ID); 289e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/phones", PEOPLE_PHONES); 290e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/phones/#", PEOPLE_PHONES_ID); 291f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/phones_with_presence", 292f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_PHONES_WITH_PRESENCE); 293c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov matcher.addURI(authority, "people/#/photo", PEOPLE_PHOTO); 294f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/photo/data", PEOPLE_PHOTO_DATA); 295e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/contact_methods", PEOPLE_CONTACTMETHODS); 296f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/contact_methods_with_presence", 297f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_CONTACTMETHODS_WITH_PRESENCE); 298e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID); 299e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov matcher.addURI(authority, "people/#/organizations", PEOPLE_ORGANIZATIONS); 300e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov matcher.addURI(authority, "people/#/organizations/#", PEOPLE_ORGANIZATIONS_ID); 3010f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/groupmembership", PEOPLE_GROUPMEMBERSHIP); 3020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/groupmembership/#", PEOPLE_GROUPMEMBERSHIP_ID); 303f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/raw", PEOPLE_RAW); 304f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/owner", PEOPLE_OWNER); 305f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people/#/update_contact_time", 306f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov PEOPLE_UPDATE_CONTACT_TIME); 30733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov matcher.addURI(authority, "deleted_people", DELETED_PEOPLE); 30833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov matcher.addURI(authority, "deleted_groups", DELETED_GROUPS); 309e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "phones", PHONES); 310f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones_with_presence", PHONES_WITH_PRESENCE); 311fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov matcher.addURI(authority, "phones/filter/*", PHONES_FILTER); 312f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones/filter_name/*", PHONES_FILTER_NAME); 313f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones/mobile_filter_name/*", 314f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PHONES_MOBILE_FILTER_NAME); 315e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "phones/#", PHONES_ID); 316c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov matcher.addURI(authority, "photos", PHOTOS); 317c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov matcher.addURI(authority, "photos/#", PHOTOS_ID); 318e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "contact_methods", CONTACTMETHODS); 319bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov matcher.addURI(authority, "contact_methods/email", CONTACTMETHODS_EMAIL); 320f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "contact_methods/email/*", CONTACTMETHODS_EMAIL_FILTER); 321e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "contact_methods/#", CONTACTMETHODS_ID); 322f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "contact_methods/with_presence", 323f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// CONTACTMETHODS_WITH_PRESENCE); 3243cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov matcher.addURI(authority, "organizations", ORGANIZATIONS); 3253cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov matcher.addURI(authority, "organizations/#", ORGANIZATIONS_ID); 326f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "voice_dialer_timestamp", VOICE_DIALER_TIMESTAMP); 327c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY, 328c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov SEARCH_SUGGESTIONS); 329c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", 330c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov SEARCH_SUGGESTIONS); 331b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/#", 332b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov SEARCH_SHORTCUT); 333f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "settings", SETTINGS); 334f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// 3351b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov matcher.addURI(authority, "live_folders/people", LIVE_FOLDERS_PEOPLE); 3361b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov matcher.addURI(authority, "live_folders/people/*", 3371b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov LIVE_FOLDERS_PEOPLE_GROUP_NAME); 3381b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov matcher.addURI(authority, "live_folders/people_with_phones", 3391b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov LIVE_FOLDERS_PEOPLE_WITH_PHONES); 3401b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov matcher.addURI(authority, "live_folders/favorites", 3411b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov LIVE_FOLDERS_PEOPLE_FAVORITES); 342f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 343f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 344e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov HashMap<String, String> peopleProjectionMap = new HashMap<String, String>(); 345d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.NAME, People.NAME); 346d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.DISPLAY_NAME, People.DISPLAY_NAME); 347d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.PHONETIC_NAME, People.PHONETIC_NAME); 348d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.NOTES, People.NOTES); 349d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.TIMES_CONTACTED, People.TIMES_CONTACTED); 350d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.LAST_TIME_CONTACTED, People.LAST_TIME_CONTACTED); 351d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.CUSTOM_RINGTONE, People.CUSTOM_RINGTONE); 352d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.SEND_TO_VOICEMAIL, People.SEND_TO_VOICEMAIL); 353d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.STARRED, People.STARRED); 354ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov peopleProjectionMap.put(People.PRIMARY_ORGANIZATION_ID, People.PRIMARY_ORGANIZATION_ID); 355ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov peopleProjectionMap.put(People.PRIMARY_EMAIL_ID, People.PRIMARY_EMAIL_ID); 356ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov peopleProjectionMap.put(People.PRIMARY_PHONE_ID, People.PRIMARY_PHONE_ID); 357e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 358e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPeopleProjectionMap = new HashMap<String, String>(peopleProjectionMap); 3599155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sPeopleProjectionMap.put(People._ID, People._ID); 360d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.NUMBER, People.NUMBER); 361d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.TYPE, People.TYPE); 362d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.LABEL, People.LABEL); 363d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.NUMBER_KEY, People.NUMBER_KEY); 3640126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov sPeopleProjectionMap.put(People.IM_PROTOCOL, IM_PROTOCOL_SQL + " AS " + People.IM_PROTOCOL); 36570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.IM_HANDLE, People.IM_HANDLE); 36670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.IM_ACCOUNT, People.IM_ACCOUNT); 36770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.PRESENCE_STATUS, People.PRESENCE_STATUS); 368a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov sPeopleProjectionMap.put(People.PRESENCE_CUSTOM_STATUS, 3690cc388933e698760d4985a7d7be1325f9c8305e9Dmitri Plotnikov "(SELECT " + StatusUpdates.STATUS + 370a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov " FROM " + Tables.STATUS_UPDATES + 371a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov " JOIN " + Tables.DATA + 372a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov " ON(" + StatusUpdatesColumns.DATA_ID + "=" + DataColumns.CONCRETE_ID + ")" + 373a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov " WHERE " + DataColumns.CONCRETE_RAW_CONTACT_ID + "=people." + People._ID + 3740cc388933e698760d4985a7d7be1325f9c8305e9Dmitri Plotnikov " ORDER BY " + StatusUpdates.STATUS_TIMESTAMP + " DESC " + 375a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov " LIMIT 1" + 376a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov ") AS " + People.PRESENCE_CUSTOM_STATUS); 3773cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 3783cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap = new HashMap<String, String>(); 3799155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations._ID, 3809155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.Organizations._ID); 3813cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.PERSON_ID, 382d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.PERSON_ID); 3833cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.ISPRIMARY, 384d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.ISPRIMARY); 3853cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.COMPANY, 386d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.COMPANY); 3873cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TYPE, 388d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.TYPE); 3893cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.LABEL, 390d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.LABEL); 3913cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TITLE, 392d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.TITLE); 393e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 394e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sContactMethodProjectionMap = new HashMap<String, String>(peopleProjectionMap); 3959155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods._ID, ContactMethods._ID); 396d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.PERSON_ID, ContactMethods.PERSON_ID); 397d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.KIND, ContactMethods.KIND); 398d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.ISPRIMARY, ContactMethods.ISPRIMARY); 399d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.TYPE, ContactMethods.TYPE); 400d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.DATA, ContactMethods.DATA); 401d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.LABEL, ContactMethods.LABEL); 402d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.AUX_DATA, ContactMethods.AUX_DATA); 403e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 404e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap = new HashMap<String, String>(peopleProjectionMap); 4059155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones._ID, 4069155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.Phones._ID); 407e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.PERSON_ID, 408d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.PERSON_ID); 409e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.ISPRIMARY, 410d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.ISPRIMARY); 411e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER, 412d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.NUMBER); 413e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.TYPE, 414d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.TYPE); 415e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.LABEL, 416d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.LABEL); 417e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER_KEY, 418d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.NUMBER_KEY); 4190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 4200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap = new HashMap<String, String>(); 4219155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions._ID, 4229155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.Extensions._ID); 4230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions.PERSON_ID, 424d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Extensions.PERSON_ID); 4250f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions.NAME, 426d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Extensions.NAME); 4270f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions.VALUE, 428d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Extensions.VALUE); 4290f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 4300f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap = new HashMap<String, String>(); 4310f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups._ID, 432d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups._ID); 4330f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups.NAME, 434d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups.NAME); 4350f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups.NOTES, 436d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups.NOTES); 4370f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups.SYSTEM_ID, 438d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups.SYSTEM_ID); 4390f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 440d4b57da3f07bc530db69015d363c61a768a4713aDmitri Plotnikov sGroupMembershipProjectionMap = new HashMap<String, String>(sGroupProjectionMap); 4419155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership._ID, 4429155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.GroupMembership._ID); 4430f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.PERSON_ID, 444d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.GroupMembership.PERSON_ID); 4450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.GROUP_ID, 446d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.GroupMembership.GROUP_ID); 447c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 448c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap = new HashMap<String, String>(); 4499155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos._ID, 4509155470a5d8e7834ca742f66ede487e4f6e391eaDmitri Plotnikov android.provider.Contacts.Photos._ID); 451c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.PERSON_ID, 452c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.PERSON_ID); 453c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.DATA, 454c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.DATA); 455c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.LOCAL_VERSION, 456c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.LOCAL_VERSION); 457c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.DOWNLOAD_REQUIRED, 458c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.DOWNLOAD_REQUIRED); 459c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.EXISTS_ON_SERVER, 460c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.EXISTS_ON_SERVER); 461c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.SYNC_ERROR, 462c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.SYNC_ERROR); 463f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 464f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 465f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final Context mContext; 466b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov private final ContactsDatabaseHelper mDbHelper; 467f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final ContactsProvider2 mContactsProvider; 468f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final NameSplitter mPhoneticNameSplitter; 469a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov private final GlobalSearchSupport mGlobalSearchSupport; 470f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 471d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov /** Precompiled sql statement for incrementing times contacted for a contact */ 4723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private final SQLiteStatement mLastTimeContactedUpdate; 473044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private final SQLiteStatement mDataMimetypeQuery; 474044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private final SQLiteStatement mDataRawContactIdQuery; 4753cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 4763cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private final ContentValues mValues = new ContentValues(); 47767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private final ContentValues mValues2 = new ContentValues(); 47867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private final ContentValues mValues3 = new ContentValues(); 479caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov private Account mAccount; 480a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 481044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private long mMimetypeEmail; 482044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private long mMimetypeIm; 483044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private long mMimetypePostal; 484044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 485b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov public LegacyApiSupport(Context context, ContactsDatabaseHelper contactsDatabaseHelper, 486a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov ContactsProvider2 contactsProvider, GlobalSearchSupport globalSearchSupport) { 487f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContext = context; 488f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContactsProvider = contactsProvider; 489b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov mDbHelper = contactsDatabaseHelper; 490a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov mGlobalSearchSupport = globalSearchSupport; 491f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 492622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey mPhoneticNameSplitter = new NameSplitter("", "", "", context 493622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey .getString(com.android.internal.R.string.common_name_conjunctions), Locale 494622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey .getDefault()); 495f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 496b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov SQLiteDatabase db = mDbHelper.getReadableDatabase(); 4975ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mLastTimeContactedUpdate = db.compileStatement("UPDATE " + Tables.RAW_CONTACTS + " SET " 4986cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContacts.LAST_TIME_CONTACTED + "=? WHERE " 4996cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContacts._ID + "=?"); 500044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 501044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mDataMimetypeQuery = db.compileStatement( 502044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov "SELECT " + DataColumns.MIMETYPE_ID + 503044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov " FROM " + Tables.DATA + 504044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov " WHERE " + Data._ID + "=?"); 505044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 506044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mDataRawContactIdQuery = db.compileStatement( 507044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov "SELECT " + Data.RAW_CONTACT_ID + 508044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov " FROM " + Tables.DATA + 509044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov " WHERE " + Data._ID + "=?"); 510044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 511b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov mMimetypeEmail = mDbHelper.getMimeTypeId(Email.CONTENT_ITEM_TYPE); 512b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov mMimetypeIm = mDbHelper.getMimeTypeId(Im.CONTENT_ITEM_TYPE); 513b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov mMimetypePostal = mDbHelper.getMimeTypeId(StructuredPostal.CONTENT_ITEM_TYPE); 514f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 515f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 516caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov private void ensureDefaultAccount() { 517caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov if (mAccount == null) { 518caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov mAccount = mContactsProvider.getDefaultAccount(); 5196f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov if (mAccount == null) { 5206f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov 5216f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov // This fall-through account will not match any data in the database, which 5226f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov // is the expected behavior 52328153f2e3dda944e983f6dd0ab80aca63631ddfaJeff Hamilton mAccount = new Account(NON_EXISTENT_ACCOUNT_NAME, NON_EXISTENT_ACCOUNT_TYPE); 5246f7446a25ecb55ee213eaa7702837cdf32e68777Dmitri Plotnikov } 525caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 526caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 527d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 528b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamilton public static void createDatabase(SQLiteDatabase db) { 529b61f0d658092919aa2bb201787cf3fcbe1d3d048Jeff Hamilton Log.i(TAG, "Bootstrapping database legacy support"); 530d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 531ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov String peopleColumns = "name." + StructuredName.DISPLAY_NAME 532d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.NAME + ", " + 5335ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContactsColumns.DISPLAY_NAME 534d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.DISPLAY_NAME + ", " + 535d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov PHONETIC_NAME_SQL 536d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PHONETIC_NAME + " , " + 537d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "note." + Note.NOTE 538d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.NOTES + ", " + 539caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 540caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 5415ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED 542d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.TIMES_CONTACTED + ", " + 5435ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED 544d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.LAST_TIME_CONTACTED + ", " + 5455ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE 546d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.CUSTOM_RINGTONE + ", " + 5475ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL 548d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.SEND_TO_VOICEMAIL + ", " + 5495ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.STARRED 550d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.STARRED + ", " + 551d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "organization." + Data._ID 552d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PRIMARY_ORGANIZATION_ID + ", " + 553d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "email." + Data._ID 554d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PRIMARY_EMAIL_ID + ", " + 555d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Data._ID 556d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PRIMARY_PHONE_ID + ", " + 557d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Phone.NUMBER 558d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.NUMBER + ", " + 559d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Phone.TYPE 560d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.TYPE + ", " + 561d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Phone.LABEL 562d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.LABEL + ", " + 563d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + PhoneColumns.NORMALIZED_NUMBER 564ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov + " AS " + People.NUMBER_KEY; 565ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov 566ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PEOPLE + ";"); 567ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.PEOPLE + " AS SELECT " + 568ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov RawContactsColumns.CONCRETE_ID 569ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov + " AS " + android.provider.Contacts.People._ID + ", " + 570ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov peopleColumns + 5715ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + PEOPLE_JOINS + 572ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov " WHERE " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" + 573ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov " AND " + RawContacts.IS_RESTRICTED + "=0" + ";"); 574d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 575d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.ORGANIZATIONS + ";"); 576d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.ORGANIZATIONS + " AS SELECT " + 577d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 578d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations._ID + ", " + 5795ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Data.RAW_CONTACT_ID 580d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.PERSON_ID + ", " + 581d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Data.IS_PRIMARY 582d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.ISPRIMARY + ", " + 583caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 584caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 585d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.COMPANY 586d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.COMPANY + ", " + 587d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.TYPE 588d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.TYPE + ", " + 589d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.LABEL 590d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.LABEL + ", " + 591d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.TITLE 592caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.TITLE + 5935ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS + 594d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 59533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + Organization.CONTENT_ITEM_TYPE + "'" 596caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 597caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 598d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 599d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 600d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.CONTACT_METHODS + ";"); 601d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.CONTACT_METHODS + " AS SELECT " + 602d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 603d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods._ID + ", " + 604d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 605d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.PERSON_ID + ", " + 606d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov CONTACT_METHOD_KIND_SQL 607d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.KIND + ", " + 608d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_IS_PRIMARY 609d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.ISPRIMARY + ", " + 610f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov Tables.DATA + "." + Email.TYPE 611d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.TYPE + ", " + 61297f9a162b7632481988bf8639b83f37dcb42b586Dmitri Plotnikov CONTACT_METHOD_DATA_SQL 613d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.DATA + ", " + 614f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov Tables.DATA + "." + Email.LABEL 615d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.LABEL + ", " + 616d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_DATA14 617d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.AUX_DATA + ", " + 618ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov peopleColumns + 619d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.DATA + DATA_JOINS + 62033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov " WHERE " + ContactMethods.KIND + " IS NOT NULL" 621caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 622caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 623d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 624d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 625d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 626d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHONES + ";"); 627d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.PHONES + " AS SELECT " + 628d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 629d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones._ID + ", " + 630d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 631d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.PERSON_ID + ", " + 632d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_IS_PRIMARY 633d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.ISPRIMARY + ", " + 634d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Tables.DATA + "." + Phone.NUMBER 635d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NUMBER + ", " + 636d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Tables.DATA + "." + Phone.TYPE 637d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.TYPE + ", " + 638d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Tables.DATA + "." + Phone.LABEL 639d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.LABEL + ", " + 640d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov PhoneColumns.CONCRETE_NORMALIZED_NUMBER 641d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NUMBER_KEY + ", " + 642ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov peopleColumns + 643d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.DATA + DATA_JOINS + 644d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 64533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + Phone.CONTENT_ITEM_TYPE + "'" 646caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 647caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 648d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 649d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 650d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.EXTENSIONS + ";"); 651d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.EXTENSIONS + " AS SELECT " + 652d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 653d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions._ID + ", " + 654d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 655d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions.PERSON_ID + ", " + 656caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 657caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 658d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ExtensionsColumns.NAME 659d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions.NAME + ", " + 660d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ExtensionsColumns.VALUE 661caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions.VALUE + 6625ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " FROM " + Tables.DATA_JOIN_MIMETYPE_RAW_CONTACTS + 663d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 66433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE + "'" 665caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 666caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 667d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 668d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 669d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUPS + ";"); 670d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.GROUPS + " AS SELECT " + 671d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov GroupsColumns.CONCRETE_ID + " AS " + android.provider.Contacts.Groups._ID + ", " + 672caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov Groups.ACCOUNT_NAME + ", " + 673caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov Groups.ACCOUNT_TYPE + ", " + 674d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.TITLE + " AS " + android.provider.Contacts.Groups.NAME + ", " + 675d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.NOTES + " AS " + android.provider.Contacts.Groups.NOTES + " , " + 676d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.SYSTEM_ID + " AS " + android.provider.Contacts.Groups.SYSTEM_ID + 677d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.GROUPS + 678d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 679d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 680d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUP_MEMBERSHIP + ";"); 681d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.GROUP_MEMBERSHIP + " AS SELECT " + 682d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 683d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership._ID + ", " + 684d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 685d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.PERSON_ID + ", " + 686caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_NAME 687caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + RawContacts.ACCOUNT_NAME + ", " + 688caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_TYPE 689caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + RawContacts.ACCOUNT_TYPE + ", " + 690d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov GroupMembership.GROUP_ROW_ID 691d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.GROUP_ID + ", " + 692d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.TITLE 693d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.NAME + ", " + 694d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.NOTES 695d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.NOTES + " , " + 696d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.SYSTEM_ID 697caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.SYSTEM_ID + 6985ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov " FROM " + Tables.DATA_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_GROUPS + 699d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 70033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + GroupMembership.CONTENT_ITEM_TYPE + "'" 7015ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" + 702d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 703c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 704c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHOTOS + ";"); 705c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.PHOTOS + " AS SELECT " + 706c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov DataColumns.CONCRETE_ID 707c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos._ID + ", " + 708d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DataColumns.CONCRETE_RAW_CONTACT_ID 709c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.PERSON_ID + ", " + 710caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_NAME + ", " + 711caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 712c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Tables.DATA + "." + Photo.PHOTO 713c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.DATA + ", " + 714c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.EXISTS_ON_SERVER 715c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.EXISTS_ON_SERVER + ", " + 716c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.DOWNLOAD_REQUIRED 717c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.DOWNLOAD_REQUIRED + ", " + 718c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.LOCAL_VERSION 719c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.LOCAL_VERSION + ", " + 720c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.SYNC_ERROR 721caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.SYNC_ERROR + 722c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov " FROM " + Tables.DATA + DATA_JOINS + LEGACY_PHOTO_JOIN + 723c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 72433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + Photo.CONTENT_ITEM_TYPE + "'" 725caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + Tables.RAW_CONTACTS + "." + RawContacts.DELETED + "=0" 726caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov + " AND " + RawContacts.IS_RESTRICTED + "=0" + 727c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov ";"); 728d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov } 729d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 730f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public Uri insert(Uri uri, ContentValues values) { 73167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov ensureDefaultAccount(); 732f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final int match = sUriMatcher.match(uri); 733f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long id = 0; 734f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch (match) { 735f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE: 7363cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov id = insertPeople(values); 7373cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 7383cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 7393cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS: 7403cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov id = insertOrganization(values); 741f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 742f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 7430f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_CONTACTMETHODS: { 7445ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = Long.parseLong(uri.getPathSegments().get(1)); 7455ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertContactMethod(rawContactId, values); 746e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 7470f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 748e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7490f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case CONTACTMETHODS: { 7505ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = getRequiredValue(values, ContactMethods.PERSON_ID); 7515ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertContactMethod(rawContactId, values); 752e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 7530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 754e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7550f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PHONES: { 7565ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = getRequiredValue(values, 7570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.Phones.PERSON_ID); 7585ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertPhone(rawContactId, values); 7590f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 7600f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 7610f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 76294743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton case PEOPLE_PHONES: { 76394743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton long rawContactId = Long.parseLong(uri.getPathSegments().get(1)); 76494743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton id = insertPhone(rawContactId, values); 76594743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton break; 76694743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton } 76794743330ca80ad334340bef51b2a093242721bb0Jeff Hamilton 7680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case EXTENSIONS: { 7695ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = getRequiredValue(values, 7700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.Extensions.PERSON_ID); 7715ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertExtension(rawContactId, values); 7720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 7730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 7740f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 7750f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPS: 7760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov id = insertGroup(values); 777e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 778e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPMEMBERSHIP: { 7805ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = getRequiredValue(values, 7810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.GroupMembership.PERSON_ID); 7820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov long groupId = getRequiredValue(values, 7830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.GroupMembership.GROUP_ID); 7845ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov id = insertGroupMembership(rawContactId, groupId); 7850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 7860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 7870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 788f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov default: 789f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 790f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 791f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 792f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (id < 0) { 793f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return null; 794f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 795f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 796f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final Uri result = ContentUris.withAppendedId(uri, id); 797f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov onChange(result); 798f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return result; 799f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 800f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 8010f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private long getRequiredValue(ContentValues values, String column) { 8020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov if (!values.containsKey(column)) { 8030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov throw new RuntimeException("Required value: " + column); 804e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 805e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 8060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return values.getAsLong(column); 807e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 808e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 8093cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private long insertPeople(ContentValues values) { 810044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parsePeopleValues(values); 811caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 81267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri contactUri = mContactsProvider.insertInTransaction(RawContacts.CONTENT_URI, mValues); 81367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov long rawContactId = ContentUris.parseId(contactUri); 81467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 81567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (mValues2.size() != 0) { 81667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mValues2.put(Data.RAW_CONTACT_ID, rawContactId); 81767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues2); 81867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 81967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (mValues3.size() != 0) { 82067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mValues3.put(Data.RAW_CONTACT_ID, rawContactId); 82167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues3); 82267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 823f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 82467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return rawContactId; 82567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 82667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 8273cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private long insertOrganization(ContentValues values) { 828044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parseOrganizationValues(values); 829b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, Data.RAW_CONTACT_ID, 8303cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.PERSON_ID); 8313cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 83267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 8333cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8343cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov return ContentUris.parseId(uri); 8353cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 836f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 8375ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private long insertPhone(long rawContactId, ContentValues values) { 838044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parsePhoneValues(values); 8395ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 840e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 84167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 842e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 843e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov return ContentUris.parseId(uri); 844e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 845e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 8465ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private long insertContactMethod(long rawContactId, ContentValues values) { 847e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Integer kind = values.getAsInteger(ContactMethods.KIND); 848e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov if (kind == null) { 849e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov throw new RuntimeException("Required value: " + ContactMethods.KIND); 850e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 851e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 852044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parseContactMethodValues(kind, values); 853e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 854044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 85567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 856e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov return ContentUris.parseId(uri); 857e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 858e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 8595ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private long insertExtension(long rawContactId, ContentValues values) { 8600f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.clear(); 8610f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 8625ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 8630f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(Data.MIMETYPE, android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE); 8640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 865044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parseExtensionValues(values); 8660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 86767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 8680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return ContentUris.parseId(uri); 8690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 8700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 8710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private long insertGroup(ContentValues values) { 872044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parseGroupValues(values); 8730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 874df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana mValues.put(Groups.ACCOUNT_NAME, mAccount.name); 875df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana mValues.put(Groups.ACCOUNT_TYPE, mAccount.type); 876caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 87767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Groups.CONTENT_URI, mValues); 8780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return ContentUris.parseId(uri); 8790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 8800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 8815ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private long insertGroupMembership(long rawContactId, long groupId) { 8820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.clear(); 8830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 8840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); 8855ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(GroupMembership.RAW_CONTACT_ID, rawContactId); 8860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(GroupMembership.GROUP_ROW_ID, groupId); 8870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 88867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri uri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 8890f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return ContentUris.parseId(uri); 8900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 8910f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 892f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 89367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov ensureDefaultAccount(); 89467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 89567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov int match = sUriMatcher.match(uri); 896c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov int count = 0; 897f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch(match) { 89867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov case PEOPLE_UPDATE_CONTACT_TIME: { 899f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov count = updateContactTime(uri, values); 900f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 90167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 902c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 903c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PEOPLE_PHOTO: { 9045ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = Long.parseLong(uri.getPathSegments().get(1)); 9055ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov return updatePhoto(rawContactId, values); 906c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 907c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 90867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov case -1: { 90967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 91067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 91167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 91267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov default: { 91367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov count = updateAll(uri, match, values, selection, selectionArgs); 91467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 91567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 91667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 91767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (count > 0) { 91867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContext.getContentResolver().notifyChange(uri, null); 91967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 92067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 92167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return count; 92267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 92367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 92467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private int updateAll(Uri uri, final int match, ContentValues values, String selection, 92567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov String[] selectionArgs) { 92667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Cursor c = query(uri, IdQuery.COLUMNS, selection, selectionArgs, null, null); 92767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (c == null) { 92867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return 0; 92967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 93067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 93167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov int count = 0; 93267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov try { 93367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov while (c.moveToNext()) { 93467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov long id = c.getLong(IdQuery._ID); 93567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov count += update(match, id, values); 93667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 93767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } finally { 93867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov c.close(); 93967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 94067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 94167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return count; 94267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 94367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 94467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov public int update(int match, long id, ContentValues values) { 94567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov int count = 0; 94667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov switch(match) { 94767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov case PEOPLE: 94867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov case PEOPLE_ID: { 94967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov count = updatePeople(id, values); 95067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov break; 95167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 95267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 953044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case ORGANIZATIONS: 954044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case ORGANIZATIONS_ID: { 955044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count = updateOrganizations(id, values); 956044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 957044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 958044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 959044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PHONES: 960044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PHONES_ID: { 961044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count = updatePhones(id, values); 962044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 963044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 964044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 965044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case CONTACTMETHODS: 966044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case CONTACTMETHODS_ID: { 967044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count = updateContactMethods(id, values); 968044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 969044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 970044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 971044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case EXTENSIONS: 972044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case EXTENSIONS_ID: { 973044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count = updateExtensions(id, values); 974044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 975044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 976044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 977044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case GROUPS: 978044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case GROUPS_ID: { 979044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count = updateGroups(id, values); 980c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov break; 981044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 982c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 983044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PHOTOS: 984c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PHOTOS_ID: 985044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count = updatePhotoByDataId(id, values); 986c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov break; 98767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 988c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 98967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return count; 99067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 991c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 99267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private int updatePeople(long rawContactId, ContentValues values) { 993044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parsePeopleValues(values); 99467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 995044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov int count = mContactsProvider.update(RawContacts.CONTENT_URI, 996044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues, RawContacts._ID + "=" + rawContactId, null); 99767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 99867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (count == 0) { 99967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return 0; 1000f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1001f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 100267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (mValues2.size() != 0) { 100367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri dataUri = findFirstDataRow(rawContactId, StructuredName.CONTENT_ITEM_TYPE); 100467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (dataUri != null) { 100567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.update(dataUri, mValues2, null, null); 100667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } else { 100767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mValues2.put(Data.RAW_CONTACT_ID, rawContactId); 100867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues2); 100967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 101067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 101167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 101267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (mValues3.size() != 0) { 101367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri dataUri = findFirstDataRow(rawContactId, Note.CONTENT_ITEM_TYPE); 101467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (dataUri != null) { 101567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.update(dataUri, mValues3, null, null); 101667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } else { 101767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mValues3.put(Data.RAW_CONTACT_ID, rawContactId); 101867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues3); 101967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 1020f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 102167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 1022f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return count; 1023f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1024f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1025044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private int updateOrganizations(long dataId, ContentValues values) { 1026044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parseOrganizationValues(values); 1027044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1028044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues, 1029044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Data._ID + "=" + dataId, null); 1030044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1031044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1032044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private int updatePhones(long dataId, ContentValues values) { 1033044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parsePhoneValues(values); 1034044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1035044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues, 1036044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Data._ID + "=" + dataId, null); 1037044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1038044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1039044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private int updateContactMethods(long dataId, ContentValues values) { 1040044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov int kind; 1041044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1042044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mDataMimetypeQuery.bindLong(1, dataId); 1043044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov long mimetype_id; 1044044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov try { 1045044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mimetype_id = mDataMimetypeQuery.simpleQueryForLong(); 1046044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } catch (SQLiteDoneException e) { 1047044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov // Data row not found 1048044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return 0; 1049044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1050044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1051044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov if (mimetype_id == mMimetypeEmail) { 1052044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov kind = android.provider.Contacts.KIND_EMAIL; 1053044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } else if (mimetype_id == mMimetypeIm) { 1054044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov kind = android.provider.Contacts.KIND_IM; 1055044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } else if (mimetype_id == mMimetypePostal) { 1056044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov kind = android.provider.Contacts.KIND_POSTAL; 1057044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } else { 1058044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1059044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov // Non-legacy kind: return "Not found" 1060044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return 0; 1061044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1062044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1063044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parseContactMethodValues(kind, values); 1064044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1065044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues, 1066044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Data._ID + "=" + dataId, null); 1067044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1068044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1069044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private int updateExtensions(long dataId, ContentValues values) { 1070044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parseExtensionValues(values); 1071044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1072044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues, 1073044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Data._ID + "=" + dataId, null); 1074044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1075044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1076044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private int updateGroups(long groupId, ContentValues values) { 1077044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov parseGroupValues(values); 1078044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1079044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return mContactsProvider.updateInTransaction(Groups.CONTENT_URI, mValues, 1080044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Groups._ID + "=" + groupId, null); 1081044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1082044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1083f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private int updateContactTime(Uri uri, ContentValues values) { 1084f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1085f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // TODO check sanctions 1086f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1087f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long lastTimeContacted; 1088f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.LAST_TIME_CONTACTED)) { 1089f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov lastTimeContacted = values.getAsLong(People.LAST_TIME_CONTACTED); 1090f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } else { 1091f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov lastTimeContacted = System.currentTimeMillis(); 1092f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1093f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 10945ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov long rawContactId = Long.parseLong(uri.getPathSegments().get(1)); 1095b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov long contactId = mDbHelper.getContactId(rawContactId); 1096d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov if (contactId != 0) { 1097ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton mContactsProvider.updateContactLastContactedTime(contactId, lastTimeContacted); 1098f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1099ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton 1100ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton mLastTimeContactedUpdate.bindLong(1, lastTimeContacted); 1101ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton mLastTimeContactedUpdate.bindLong(2, rawContactId); 1102ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton mLastTimeContactedUpdate.execute(); 1103ba965ceeb86dd9404d43f418daae357bc4afbdcdJeff Hamilton 1104f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return 1; 1105f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1106f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 11075ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov private int updatePhoto(long rawContactId, ContentValues values) { 1108c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1109c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov // TODO check sanctions 1110c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1111c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov int count; 1112c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 111367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov long dataId = findFirstDataId(rawContactId, Photo.CONTENT_ITEM_TYPE); 1114c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1115c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.clear(); 1116c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA); 1117c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(Photo.PHOTO, bytes); 1118c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1119c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov if (dataId == -1) { 1120c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 11215ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 112267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Uri dataUri = mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 1123c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov dataId = ContentUris.parseId(dataUri); 1124c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov count = 1; 1125c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } else { 1126c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Uri dataUri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId); 112767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov count = mContactsProvider.updateInTransaction(dataUri, mValues, null, null); 1128c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1129c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1130044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov updateLegacyPhotoData(rawContactId, dataId, values); 1131044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1132044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return count; 1133044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1134044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1135044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private int updatePhotoByDataId(long dataId, ContentValues values) { 1136044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1137044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mDataRawContactIdQuery.bindLong(1, dataId); 1138044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov long rawContactId; 1139044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1140044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov try { 1141044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov rawContactId = mDataRawContactIdQuery.simpleQueryForLong(); 1142044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } catch (SQLiteDoneException e) { 1143044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov // Data row not found 1144044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return 0; 1145044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1146044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1147044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov if (values.containsKey(android.provider.Contacts.Photos.DATA)) { 1148044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA); 1149044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.clear(); 1150044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(Photo.PHOTO, bytes); 1151044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues, 1152044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Data._ID + "=" + dataId, null); 1153044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1154044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1155044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov updateLegacyPhotoData(rawContactId, dataId, values); 1156044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1157044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return 1; 1158044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1159044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1160044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private void updateLegacyPhotoData(long rawContactId, long dataId, ContentValues values) { 1161c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.clear(); 1162b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, LegacyPhotoData.LOCAL_VERSION, 1163c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.LOCAL_VERSION); 1164b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, LegacyPhotoData.DOWNLOAD_REQUIRED, 1165c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.DOWNLOAD_REQUIRED); 1166b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, LegacyPhotoData.EXISTS_ON_SERVER, 1167c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.EXISTS_ON_SERVER); 1168b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, LegacyPhotoData.SYNC_ERROR, 1169c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.SYNC_ERROR); 1170c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 117167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov int updated = mContactsProvider.updateInTransaction(Data.CONTENT_URI, mValues, 1172c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Data.MIMETYPE + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'" 11735ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " AND " + Data.RAW_CONTACT_ID + "=" + rawContactId 1174c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AND " + LegacyPhotoData.PHOTO_DATA_ID + "=" + dataId, null); 1175c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov if (updated == 0) { 11765ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov mValues.put(Data.RAW_CONTACT_ID, rawContactId); 1177c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(Data.MIMETYPE, LegacyPhotoData.CONTENT_ITEM_TYPE); 1178c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(LegacyPhotoData.PHOTO_DATA_ID, dataId); 117967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov mContactsProvider.insertInTransaction(Data.CONTENT_URI, mValues); 1180c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1181044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1182c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1183044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private void parsePeopleValues(ContentValues values) { 1184044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.clear(); 1185044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues2.clear(); 1186044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues3.clear(); 1187044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1188b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, RawContacts.CUSTOM_RINGTONE, 1189044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, People.CUSTOM_RINGTONE); 1190b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, RawContacts.SEND_TO_VOICEMAIL, 1191044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, People.SEND_TO_VOICEMAIL); 1192b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, RawContacts.LAST_TIME_CONTACTED, 1193044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, People.LAST_TIME_CONTACTED); 1194b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, RawContacts.TIMES_CONTACTED, 1195044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, People.TIMES_CONTACTED); 1196b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, RawContacts.STARRED, 1197044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, People.STARRED); 1198044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(RawContacts.ACCOUNT_NAME, mAccount.name); 1199044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(RawContacts.ACCOUNT_TYPE, mAccount.type); 1200044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1201044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov if (values.containsKey(People.NAME) || values.containsKey(People.PHONETIC_NAME)) { 1202044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues2.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 1203b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues2, StructuredName.DISPLAY_NAME, 1204044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, People.NAME); 1205044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov if (values.containsKey(People.PHONETIC_NAME)) { 1206044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov String phoneticName = values.getAsString(People.PHONETIC_NAME); 1207044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov NameSplitter.Name parsedName = new NameSplitter.Name(); 1208044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mPhoneticNameSplitter.split(parsedName, phoneticName); 1209044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues2.put(StructuredName.PHONETIC_GIVEN_NAME, parsedName.getGivenNames()); 1210044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues2.put(StructuredName.PHONETIC_MIDDLE_NAME, parsedName.getMiddleName()); 1211044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues2.put(StructuredName.PHONETIC_FAMILY_NAME, parsedName.getFamilyName()); 1212044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1213044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1214044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1215044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov if (values.containsKey(People.NOTES)) { 1216044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues3.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE); 1217b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues3, Note.NOTE, values, People.NOTES); 1218044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1219044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1220044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1221044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private void parseOrganizationValues(ContentValues values) { 1222044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.clear(); 1223044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1224044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE); 1225044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1226b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, Data.IS_PRIMARY, 1227044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Organizations.ISPRIMARY); 1228044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1229b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Organization.COMPANY, 1230044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Organizations.COMPANY); 1231044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1232044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov // TYPE values happen to remain the same between V1 and V2 - can just copy the value 1233b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, Organization.TYPE, 1234044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Organizations.TYPE); 1235044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1236b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Organization.LABEL, 1237044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Organizations.LABEL); 1238b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Organization.TITLE, 1239044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Organizations.TITLE); 1240044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1241044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1242044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private void parsePhoneValues(ContentValues values) { 1243044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.clear(); 1244044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1245044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 1246044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1247b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, Data.IS_PRIMARY, 1248044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Phones.ISPRIMARY); 1249044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1250b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Phone.NUMBER, 1251044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Phones.NUMBER); 1252044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1253044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov // TYPE values happen to remain the same between V1 and V2 - can just copy the value 1254b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, Phone.TYPE, 1255044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Phones.TYPE); 1256044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1257b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Phone.LABEL, 1258044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Phones.LABEL); 1259044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1260044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1261044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private void parseContactMethodValues(int kind, ContentValues values) { 1262044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.clear(); 1263044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1264b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, Data.IS_PRIMARY, values, 1265b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactMethods.ISPRIMARY); 1266044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1267044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov switch (kind) { 1268044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case android.provider.Contacts.KIND_EMAIL: { 1269044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov copyCommonFields(values, Email.CONTENT_ITEM_TYPE, Email.TYPE, Email.LABEL, 1270044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Data.DATA14); 1271b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Email.DATA, values, 1272b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactMethods.DATA); 1273044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 1274044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1275044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1276044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case android.provider.Contacts.KIND_IM: { 1277044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov String protocol = values.getAsString(ContactMethods.DATA); 1278044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov if (protocol.startsWith("pre:")) { 1279044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(Im.PROTOCOL, Integer.parseInt(protocol.substring(4))); 1280044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } else if (protocol.startsWith("custom:")) { 1281044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM); 1282044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(Im.CUSTOM_PROTOCOL, protocol.substring(7)); 1283044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1284044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1285044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov copyCommonFields(values, Im.CONTENT_ITEM_TYPE, Im.TYPE, Im.LABEL, Data.DATA14); 1286044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 1287044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1288044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1289044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case android.provider.Contacts.KIND_POSTAL: { 1290044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov copyCommonFields(values, StructuredPostal.CONTENT_ITEM_TYPE, StructuredPostal.TYPE, 1291044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov StructuredPostal.LABEL, Data.DATA14); 1292b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, StructuredPostal.FORMATTED_ADDRESS, 1293b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov values, ContactMethods.DATA); 1294044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 1295044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1296044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1297044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1298044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1299044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private void copyCommonFields(ContentValues values, String mimeType, String typeColumn, 1300044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov String labelColumn, String auxDataColumn) { 1301044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.put(Data.MIMETYPE, mimeType); 1302b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyLongValue(mValues, typeColumn, values, 1303b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactMethods.TYPE); 1304b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, labelColumn, values, 1305b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactMethods.LABEL); 1306b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, auxDataColumn, values, 1307b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactMethods.AUX_DATA); 1308044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1309044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1310044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private void parseGroupValues(ContentValues values) { 1311044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.clear(); 1312044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1313b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Groups.TITLE, 1314044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Groups.NAME); 1315b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Groups.NOTES, 1316044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Groups.NOTES); 1317b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, Groups.SYSTEM_ID, 1318044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.Groups.SYSTEM_ID); 1319044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1320044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1321044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov private void parseExtensionValues(ContentValues values) { 1322b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, ExtensionsColumns.NAME, 1323044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.People.Extensions.NAME); 1324b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper.copyStringValue(mValues, ExtensionsColumns.VALUE, 1325044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov values, android.provider.Contacts.People.Extensions.VALUE); 1326c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1327c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 132867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private Uri findFirstDataRow(long rawContactId, String contentItemType) { 132967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov long dataId = findFirstDataId(rawContactId, contentItemType); 133067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (dataId == -1) { 133167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return null; 133267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 133367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 133467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return ContentUris.withAppendedId(Data.CONTENT_URI, dataId); 133567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 133667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 133767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private long findFirstDataId(long rawContactId, String mimeType) { 133867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov long dataId = -1; 133967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Cursor c = mContactsProvider.query(Data.CONTENT_URI, IdQuery.COLUMNS, 134067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov Data.RAW_CONTACT_ID + "=" + rawContactId + " AND " 134167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov + Data.MIMETYPE + "='" + mimeType + "'", 134267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov null, null); 134367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov try { 134467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov if (c.moveToFirst()) { 134567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov dataId = c.getLong(IdQuery._ID); 134667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 134767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } finally { 134867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov c.close(); 134967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 135067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov return dataId; 135167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 135267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 1353044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 13543cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov public int delete(Uri uri, String selection, String[] selectionArgs) { 1355044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov Cursor c = query(uri, IdQuery.COLUMNS, selection, selectionArgs, null, null); 1356044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov if (c == null) { 1357044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return 0; 1358044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1359044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1360044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov int count = 0; 1361044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov try { 1362044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov while (c.moveToNext()) { 1363044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov long id = c.getLong(IdQuery._ID); 1364044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count += delete(uri, id); 1365044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1366044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } finally { 1367044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov c.close(); 1368044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1369044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1370044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov return count; 1371044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov } 1372044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1373044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov public int delete(Uri uri, long id) { 13743cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov final int match = sUriMatcher.match(uri); 13753cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov int count = 0; 13763cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov switch (match) { 1377044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PEOPLE: 137833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov case PEOPLE_ID: 137933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov count = mContactsProvider.deleteRawContact(ContentUris.parseId(uri), false); 138033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov break; 138133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 1382044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PEOPLE_PHOTO: 1383044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.clear(); 1384044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov mValues.putNull(android.provider.Contacts.Photos.DATA); 1385044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov updatePhoto(id, mValues); 1386044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 1387044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1388044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case ORGANIZATIONS: 13893cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS_ID: 1390e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1391e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov ORGANIZATION_MIME_TYPES); 1392e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1393e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1394044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case CONTACTMETHODS: 1395e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS_ID: 1396e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1397e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov CONTACT_METHOD_MIME_TYPES); 1398e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1399e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1400044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1401044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PHONES: 1402e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES_ID: 1403e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1404e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov PHONE_MIME_TYPES); 14053cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 14063cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 1407044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case EXTENSIONS: 1408044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case EXTENSIONS_ID: 1409044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1410044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov EXTENSION_MIME_TYPES); 1411044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 1412044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1413044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PHOTOS: 1414044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PHOTOS_ID: 1415044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1416044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov PHOTO_MIME_TYPES); 1417044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1418044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 1419044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 14203cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov default: 14213cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 14223cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 14233cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 14243cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov return count; 14253cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 14263cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 1427f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 1428c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov String sortOrder, String limit) { 1429caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov ensureDefaultAccount(); 1430caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 1431b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov final SQLiteDatabase db = mDbHelper.getReadableDatabase(); 1432f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 1433f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String groupBy = null; 1434f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1435f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final int match = sUriMatcher.match(uri); 1436f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch (match) { 1437f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE: { 143870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 1439f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 144067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1441f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 1442f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1443f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1444f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE_ID: 144570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 1446f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 144767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1448caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov qb.appendWhere(" AND " + People._ID + "="); 1449f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1450f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 1451f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1452445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov case PEOPLE_FILTER: { 1453445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 1454445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 145567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1456445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov String filterParam = uri.getPathSegments().get(2); 1457caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov qb.appendWhere(" AND " + People._ID + " IN " 14585ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + mContactsProvider.getRawContactsByFilterAsNestedQuery(filterParam)); 1459445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov break; 1460445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov } 1461445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov 146271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov case GROUP_NAME_MEMBERS: 146371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 146471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 146571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov applyRawContactsAccount(qb); 146671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov String group = uri.getPathSegments().get(2); 146771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov qb.appendWhere(" AND " + buildGroupNameMatchWhereClause(group)); 146871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov break; 146971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov 14703b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov case GROUP_SYSTEM_ID_MEMBERS: 14713b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 14723b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 14733b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov applyRawContactsAccount(qb); 14743b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov String systemId = uri.getPathSegments().get(2); 14753b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov qb.appendWhere(" AND " + buildGroupSystemIdMatchWhereClause(systemId)); 14763b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov break; 14773b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov 14783cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS: 14795dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.ORGANIZATIONS + " organizations"); 1480d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sOrganizationProjectionMap); 148167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 14823cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 14833cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 14843cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS_ID: 14855dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.ORGANIZATIONS + " organizations"); 14863cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov qb.setProjectionMap(sOrganizationProjectionMap); 148767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1488d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Organizations._ID + "="); 1489e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1490e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1491e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1492e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov case PEOPLE_ORGANIZATIONS: 1493e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov qb.setTables(LegacyTables.ORGANIZATIONS + " organizations"); 1494e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov qb.setProjectionMap(sOrganizationProjectionMap); 1495e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov applyRawContactsAccount(qb); 1496e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Organizations.PERSON_ID + "="); 1497e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1498e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov break; 1499e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov 1500e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov case PEOPLE_ORGANIZATIONS_ID: 1501e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov qb.setTables(LegacyTables.ORGANIZATIONS + " organizations"); 1502e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov qb.setProjectionMap(sOrganizationProjectionMap); 1503e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov applyRawContactsAccount(qb); 1504e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Organizations.PERSON_ID + "="); 1505e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1506e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Organizations._ID + "="); 1507e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 1508e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov break; 1509e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov 1510e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS: 15115dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods"); 1512d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 151367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1514e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1515e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1516e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS_ID: 15175dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods"); 1518e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 151967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1520d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods._ID + "="); 1521e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1522e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1523e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1524bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov case CONTACTMETHODS_EMAIL: 1525bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods"); 1526bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 1527bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov applyRawContactsAccount(qb); 1528bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.KIND + "=" 1529bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov + android.provider.Contacts.KIND_EMAIL); 1530bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov break; 1531bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov 1532e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_CONTACTMETHODS: 15335dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods"); 1534e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 153567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1536d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "="); 1537e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1538e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL"); 1539e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1540e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1541e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_CONTACTMETHODS_ID: 15425dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS + " contact_methods"); 1543e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 154467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1545d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "="); 1546e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1547d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods._ID + "="); 1548e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 1549e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL"); 1550e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1551e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1552e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES: 15535dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHONES + " phones"); 1554d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 155567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1556e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1557e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1558e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES_ID: 15595dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHONES + " phones"); 1560e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 156167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1562d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "="); 1563e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1564e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1565e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1566fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov case PHONES_FILTER: 15675dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHONES + " phones"); 1568fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 156967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1570fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov if (uri.getPathSegments().size() > 2) { 1571fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov String filterParam = uri.getLastPathSegment(); 1572e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov qb.appendWhere(" AND person ="); 1573b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov qb.appendWhere(mDbHelper.buildPhoneLookupAsNestedQuery(filterParam)); 1574fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov } 1575fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov break; 1576fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov 1577e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_PHONES: 15785dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHONES + " phones"); 1579e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 158067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1581d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "="); 1582e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1583e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1584e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1585e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_PHONES_ID: 15865dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHONES + " phones"); 1587e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 158867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1589d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "="); 15903cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1591d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "="); 1592e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 15933cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 15943cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 15950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case EXTENSIONS: 15965dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS + " extensions"); 1597d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 159867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 15990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 16000f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 16010f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case EXTENSIONS_ID: 16025dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS + " extensions"); 16030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 160467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1605d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "="); 16060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 16070f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 16080f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 16090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_EXTENSIONS: 16105dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS + " extensions"); 16110f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 161267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1613d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "="); 16140f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 16150f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 16160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 16170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_EXTENSIONS_ID: 16185dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS + " extensions"); 16190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 162067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1621d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "="); 16220f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1623d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "="); 16240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 16250f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 16260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 16270f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPS: 16285dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUPS + " groups"); 16290f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupProjectionMap); 163067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyGroupAccount(qb); 16310f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 16320f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 16330f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPS_ID: 16345dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUPS + " groups"); 16350f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupProjectionMap); 163667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyGroupAccount(qb); 1637caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Groups._ID + "="); 16380f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 16390f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 16400f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 16410f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPMEMBERSHIP: 16425dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership"); 1643d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 164467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 16450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 16460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 16470f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPMEMBERSHIP_ID: 16485dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership"); 16490f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 165067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1651d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "="); 16520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 16530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 16540f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 16550f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_GROUPMEMBERSHIP: 16565dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership"); 16570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 165867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1659d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "="); 16600f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 16610f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 16620f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 16630f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_GROUPMEMBERSHIP_ID: 16645dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP + " groupmembership"); 16650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 166667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1667d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "="); 16680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1669d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "="); 16700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 16710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 16720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 1673c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PEOPLE_PHOTO: 16745dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov qb.setTables(LegacyTables.PHOTOS + " photos"); 1675c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov qb.setProjectionMap(sPhotoProjectionMap); 167667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov applyRawContactsAccount(qb); 1677c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Photos.PERSON_ID + "="); 1678c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1679c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov limit = "1"; 1680c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov break; 1681c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1682044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PHOTOS: 1683044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov qb.setTables(LegacyTables.PHOTOS + " photos"); 1684044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov qb.setProjectionMap(sPhotoProjectionMap); 1685044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov applyRawContactsAccount(qb); 1686044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 1687044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1688044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov case PHOTOS_ID: 1689044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov qb.setTables(LegacyTables.PHOTOS + " photos"); 1690044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov qb.setProjectionMap(sPhotoProjectionMap); 1691044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov applyRawContactsAccount(qb); 1692044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Photos._ID + "="); 1693044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1694044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov break; 1695044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov 1696c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov case SEARCH_SUGGESTIONS: 1697c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 1698c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov // No legacy compatibility for search suggestions 1699a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov return mGlobalSearchSupport.handleSearchSuggestionsQuery(db, uri, limit); 1700c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 1701b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov case SEARCH_SHORTCUT: { 1702b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov long contactId = ContentUris.parseId(uri); 1703b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov return mGlobalSearchSupport.handleSearchShortcutRefresh(db, contactId, projection); 1704b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov } 1705b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov 17061b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case LIVE_FOLDERS_PEOPLE: 17071b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_URI, 17081b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov projection, selection, selectionArgs, sortOrder); 17091b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 17101b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case LIVE_FOLDERS_PEOPLE_WITH_PHONES: 17111b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_WITH_PHONES_URI, 17121b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov projection, selection, selectionArgs, sortOrder); 17131b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 17141b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case LIVE_FOLDERS_PEOPLE_FAVORITES: 17151b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov return mContactsProvider.query(LIVE_FOLDERS_CONTACTS_FAVORITES_URI, 17161b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov projection, selection, selectionArgs, sortOrder); 17171b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 17181b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case LIVE_FOLDERS_PEOPLE_GROUP_NAME: 17191b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov return mContactsProvider.query(Uri.withAppendedPath(LIVE_FOLDERS_CONTACTS_URI, 17201b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov Uri.encode(uri.getLastPathSegment())), 17211b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov projection, selection, selectionArgs, sortOrder); 17221b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov 172333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov case DELETED_PEOPLE: 172433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov case DELETED_GROUPS: 172533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov throw new UnsupportedOperationException(); 172633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 1727f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov default: 1728f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov throw new IllegalArgumentException("Unknown URL " + uri); 1729f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1730f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1731f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // Perform the query and set the notification uri 1732f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final Cursor c = qb.query(db, projection, selection, selectionArgs, 1733f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov groupBy, null, sortOrder, limit); 1734f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (c != null) { 17353fe48cf2c81f6e89b78e919661e2b0b828a2144eDmitri Plotnikov c.setNotificationUri(mContext.getContentResolver(), 17363fe48cf2c81f6e89b78e919661e2b0b828a2144eDmitri Plotnikov android.provider.Contacts.CONTENT_URI); 1737f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1738f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return c; 1739f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1740f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 174167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private void applyRawContactsAccount(SQLiteQueryBuilder qb) { 1742caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov StringBuilder sb = new StringBuilder(); 174367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov appendRawContactsAccount(sb); 174467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov qb.appendWhere(sb.toString()); 174567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 174667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 174767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private void appendRawContactsAccount(StringBuilder sb) { 1748caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov sb.append(RawContacts.ACCOUNT_NAME + "="); 1749df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana DatabaseUtils.appendEscapedSQLString(sb, mAccount.name); 1750caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov sb.append(" AND " + RawContacts.ACCOUNT_TYPE + "="); 1751df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana DatabaseUtils.appendEscapedSQLString(sb, mAccount.type); 1752caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 1753caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 175467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private void applyGroupAccount(SQLiteQueryBuilder qb) { 1755caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov StringBuilder sb = new StringBuilder(); 175667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov appendGroupAccount(sb); 175767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov qb.appendWhere(sb.toString()); 175867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov } 175967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov 176067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov private void appendGroupAccount(StringBuilder sb) { 1761caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov sb.append(Groups.ACCOUNT_NAME + "="); 1762df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana DatabaseUtils.appendEscapedSQLString(sb, mAccount.name); 1763caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov sb.append(" AND " + Groups.ACCOUNT_TYPE + "="); 1764df9fd6b239de5829b04cb413e4dfa3e6da649c38Fred Quintana DatabaseUtils.appendEscapedSQLString(sb, mAccount.type); 1765caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 1766caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 1767f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov /** 176871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov * Build a WHERE clause that restricts the query to match people that are a member of 176971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov * a group with a particular name. The projection map of the query must include 177071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov * {@link People#_ID}. 177171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov * 177271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov * @param groupName The name of the group 177371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov * @return The where clause. 177471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov */ 177571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov private String buildGroupNameMatchWhereClause(String groupName) { 177671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov return "people._id IN " 177771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov + "(SELECT " + DataColumns.CONCRETE_RAW_CONTACT_ID 177871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov + " FROM " + Tables.DATA_JOIN_MIMETYPES 177971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov + " WHERE " + Data.MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE 178071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov + "' AND " + GroupMembership.GROUP_ROW_ID + "=" 178171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov + "(SELECT " + Tables.GROUPS + "." + Groups._ID 178271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov + " FROM " + Tables.GROUPS 178371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov + " WHERE " + Groups.TITLE + "=" 178471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov + DatabaseUtils.sqlEscapeString(groupName) + "))"; 178571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov } 178671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov 178771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov /** 17883b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov * Build a WHERE clause that restricts the query to match people that are a member of 17893b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov * a group with a particular system id. The projection map of the query must include 17903b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov * {@link People#_ID}. 17913b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov * 17923b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov * @param groupName The name of the group 17933b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov * @return The where clause. 17943b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov */ 17953b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov private String buildGroupSystemIdMatchWhereClause(String systemId) { 17963b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov return "people._id IN " 17973b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov + "(SELECT " + DataColumns.CONCRETE_RAW_CONTACT_ID 17983b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov + " FROM " + Tables.DATA_JOIN_MIMETYPES 17993b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov + " WHERE " + Data.MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE 18003b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov + "' AND " + GroupMembership.GROUP_ROW_ID + "=" 18013b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov + "(SELECT " + Tables.GROUPS + "." + Groups._ID 18023b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov + " FROM " + Tables.GROUPS 18033b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov + " WHERE " + Groups.SYSTEM_ID + "=" 18043b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov + DatabaseUtils.sqlEscapeString(systemId) + "))"; 18053b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov } 18063b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov 18073b2770e909f82c90218aee49d6f9f107aa4b7febDmitri Plotnikov /** 1808f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * Called when a change has been made. 1809f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * 1810f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * @param uri the uri that the change was made to 1811f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov */ 1812f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private void onChange(Uri uri) { 1813f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContext.getContentResolver().notifyChange(android.provider.Contacts.CONTENT_URI, null); 1814f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 181561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov 181661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov public String getType(Uri uri) { 181761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov int match = sUriMatcher.match(uri); 181861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov switch (match) { 181961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case EXTENSIONS: 182061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_EXTENSIONS: 182161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return Extensions.CONTENT_TYPE; 182261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case EXTENSIONS_ID: 182361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_EXTENSIONS_ID: 182461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return Extensions.CONTENT_ITEM_TYPE; 182561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE: 182661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/person"; 182761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_ID: 182861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/person"; 182961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_PHONES: 183061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/phone"; 183161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_PHONES_ID: 183261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/phone"; 183361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_CONTACTMETHODS: 183461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/contact-methods"; 183561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_CONTACTMETHODS_ID: 183661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return getContactMethodType(uri); 183761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PHONES: 183861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/phone"; 183961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PHONES_ID: 184061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/phone"; 184161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PHONES_FILTER: 184261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/phone"; 184361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PHOTOS_ID: 184461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/photo"; 184561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PHOTOS: 184661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/photo"; 184761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case PEOPLE_PHOTO: 184861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/photo"; 184961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case CONTACTMETHODS: 185061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/contact-methods"; 185161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case CONTACTMETHODS_ID: 185261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return getContactMethodType(uri); 185361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case ORGANIZATIONS: 185461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.dir/organizations"; 185561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case ORGANIZATIONS_ID: 185661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return "vnd.android.cursor.item/organization"; 185761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case SEARCH_SUGGESTIONS: 185861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return SearchManager.SUGGEST_MIME_TYPE; 185961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov case SEARCH_SHORTCUT: 186061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return SearchManager.SHORTCUT_MIME_TYPE; 186161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov default: 186261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov throw new IllegalArgumentException("Unknown URI"); 186361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 186461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 186561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov 186661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov private String getContactMethodType(Uri url) { 186761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov String mime = null; 186861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov 186961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov Cursor c = query(url, new String[] {ContactMethods.KIND}, null, null, null, null); 187061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov if (c != null) { 187161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov try { 187261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov if (c.moveToFirst()) { 187361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov int kind = c.getInt(0); 187461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov switch (kind) { 18751b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case android.provider.Contacts.KIND_EMAIL: 187661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov mime = "vnd.android.cursor.item/email"; 187761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov break; 187861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov 18791b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case android.provider.Contacts.KIND_IM: 188061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov mime = "vnd.android.cursor.item/jabber-im"; 188161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov break; 188261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov 18831b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov case android.provider.Contacts.KIND_POSTAL: 188461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov mime = "vnd.android.cursor.item/postal-address"; 188561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov break; 188661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 188761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 188861efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } finally { 188961efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov c.close(); 189061efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 189161efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 189261efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov return mime; 189361efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov } 1894f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov} 1895