LegacyApiSupport.java revision 33b41fdb8d7c3c654cb070799c9d6e2b4ab16078
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 186cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.RawContactsColumns; 19e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.DataColumns; 200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.ExtensionsColumns; 210f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.GroupsColumns; 220f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.GroupMembershipColumns; 23e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.MimetypesColumns; 24e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.PhoneColumns; 25f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.Tables; 26f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 27f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentUris; 28f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentValues; 29f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.Context; 30f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.UriMatcher; 31f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.Cursor; 32e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.database.DatabaseUtils; 33f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteDatabase; 34f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteQueryBuilder; 35f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteStatement; 36f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.net.Uri; 3770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikovimport android.provider.BaseColumns; 38f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract; 39e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.Contacts.ContactMethods; 40f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.Contacts.People; 4167dde51ab932dc84d95a203b113989b13437f13dJeff Sharkeyimport android.provider.ContactsContract.CommonDataKinds; 426cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikovimport android.provider.ContactsContract.RawContacts; 43e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.Data; 440f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.Groups; 4570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikovimport android.provider.ContactsContract.Presence; 46e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email; 470f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 48e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im; 49f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Note; 503cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization; 51e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone; 52c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo; 53f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 5467dde51ab932dc84d95a203b113989b13437f13dJeff Sharkeyimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal; 55c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikovimport android.text.TextUtils; 56f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 57f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport java.util.HashMap; 58f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 59d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikovpublic class LegacyApiSupport implements OpenHelper.Delegate { 60f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 61f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 62f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 63f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final int PEOPLE = 1; 64f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final int PEOPLE_ID = 2; 65f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final int PEOPLE_UPDATE_CONTACT_TIME = 3; 663cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private static final int ORGANIZATIONS = 4; 673cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private static final int ORGANIZATIONS_ID = 5; 68e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_CONTACTMETHODS = 6; 69e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_CONTACTMETHODS_ID = 7; 70e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int CONTACTMETHODS = 8; 71e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int CONTACTMETHODS_ID = 9; 72e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_PHONES = 10; 73e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_PHONES_ID = 11; 74e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PHONES = 12; 75e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PHONES_ID = 13; 760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int EXTENSIONS = 14; 770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int EXTENSIONS_ID = 15; 780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int PEOPLE_EXTENSIONS = 16; 790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int PEOPLE_EXTENSIONS_ID = 17; 800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int GROUPS = 18; 810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int GROUPS_ID = 19; 820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int GROUPMEMBERSHIP = 20; 830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int GROUPMEMBERSHIP_ID = 21; 840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int PEOPLE_GROUPMEMBERSHIP = 22; 850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final int PEOPLE_GROUPMEMBERSHIP_ID = 23; 86c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private static final int PEOPLE_PHOTO = 24; 87c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private static final int PHOTOS = 25; 88c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private static final int PHOTOS_ID = 26; 8970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov private static final int PRESENCE = 27; 9070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov private static final int PRESENCE_ID = 28; 91445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov private static final int PEOPLE_FILTER = 29; 9233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov private static final int DELETED_PEOPLE = 30; 9333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov private static final int DELETED_GROUPS = 31; 9433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 96e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String PEOPLE_JOINS = 97e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov " LEFT OUTER JOIN data name ON (contacts._id = name.contact_id" 98e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = name.mimetype_id)" 99e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + StructuredName.CONTENT_ITEM_TYPE + "')" 100e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " LEFT OUTER JOIN data organization ON (contacts._id = organization.contact_id" 101e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = organization.mimetype_id)" 102e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Organization.CONTENT_ITEM_TYPE + "' AND organization.is_primary)" 103e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " LEFT OUTER JOIN data email ON (contacts._id = email.contact_id" 104e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = email.mimetype_id)" 105e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Email.CONTENT_ITEM_TYPE + "' AND email.is_primary)" 106e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " LEFT OUTER JOIN data note ON (contacts._id = note.contact_id" 107e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = note.mimetype_id)" 108e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Note.CONTENT_ITEM_TYPE + "')" 109e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " LEFT OUTER JOIN data phone ON (contacts._id = phone.contact_id" 110e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = phone.mimetype_id)" 111e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Phone.CONTENT_ITEM_TYPE + "' AND phone.is_primary)"; 112e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 113d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String DATA_JOINS = 114d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " JOIN mimetypes ON (mimetypes._id = data.mimetype_id)" 115d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " JOIN contacts ON (contacts._id = data.contact_id)" 116d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + PEOPLE_JOINS; 117d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 11870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov public static final String PRESENCE_JOINS = 11970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov " LEFT OUTER JOIN presence ON (" 12070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov + " presence.presence_id = (SELECT max(presence_id) FROM presence" 12170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov + " WHERE view_v1_people._id = presence.contact_id))"; 12270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 123e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String PHONETIC_NAME_SQL = "trim(trim(" 124e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_GIVEN_NAME + ",' ')||' '||" 125e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_MIDDLE_NAME + ",' '))||' '||" 126e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_FAMILY_NAME + ",' ')) "; 127e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 128e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String CONTACT_METHOD_KIND_SQL = 129d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "CAST ((CASE WHEN mimetype='" + Email.CONTENT_ITEM_TYPE + "'" 130e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_EMAIL 131e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 132e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " (CASE WHEN mimetype='" + Im.CONTENT_ITEM_TYPE +"'" 133e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_IM 134e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 13567dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey + " (CASE WHEN mimetype='" + StructuredPostal.CONTENT_ITEM_TYPE + "'" 136e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_POSTAL 137e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 138e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " NULL" 139e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " END)" 140e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " END)" 141d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " END) AS INTEGER)"; 142f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 143f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public interface LegacyTables { 144d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String PEOPLE = "view_v1_people"; 14570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov public static final String PEOPLE_JOIN_PRESENCE = "view_v1_people" + PRESENCE_JOINS; 146d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String GROUPS = "view_v1_groups"; 147d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String ORGANIZATIONS = "view_v1_organizations"; 148d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String CONTACT_METHODS = "view_v1_contact_methods"; 149d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String PHONES = "view_v1_phones"; 150d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String EXTENSIONS = "view_v1_extensions"; 151d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public static final String GROUP_MEMBERSHIP = "view_v1_group_membership"; 152c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String PHOTOS = "view_v1_photos"; 15370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov public static final String PRESENCE_JOIN_CONTACTS = Tables.PRESENCE + 15470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov " LEFT OUTER JOIN " + Tables.CONTACTS 15570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov + " ON (" + Tables.PRESENCE + "." + Presence.CONTACT_ID + "=" 1566cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContactsColumns.CONCRETE_ID + ")"; 157f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 158f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 159e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] ORGANIZATION_MIME_TYPES = new String[] { 160e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Organization.CONTENT_ITEM_TYPE 161e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 162e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 163e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] CONTACT_METHOD_MIME_TYPES = new String[] { 164e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Email.CONTENT_ITEM_TYPE, 165e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Im.CONTENT_ITEM_TYPE, 16667dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey StructuredPostal.CONTENT_ITEM_TYPE, 167e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 168e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 169e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] PHONE_MIME_TYPES = new String[] { 170e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Phone.CONTENT_ITEM_TYPE 171e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 172e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 173c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private interface PhotoQuery { 174c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov String[] COLUMNS = { Data._ID }; 175c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 176c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov int _ID = 0; 177c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 178c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 179c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov /** 180c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov * A custom data row that is used to store legacy photo data fields no 181c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov * longer directly supported by the API. 182c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov */ 183c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private interface LegacyPhotoData { 184c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/photo_v1_extras"; 185c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 186c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String PHOTO_DATA_ID = Data.DATA1; 187c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String LOCAL_VERSION = Data.DATA2; 188c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String DOWNLOAD_REQUIRED = Data.DATA3; 189c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String EXISTS_ON_SERVER = Data.DATA4; 190c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String SYNC_ERROR = Data.DATA5; 191c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 192c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 193c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov public static final String LEGACY_PHOTO_JOIN = 194c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov " LEFT OUTER JOIN data legacy_photo ON (contacts._id = legacy_photo.contact_id" 195c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = legacy_photo.mimetype_id)" 196c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'" 197c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AND " + DataColumns.CONCRETE_ID + " = legacy_photo." + LegacyPhotoData.PHOTO_DATA_ID 198c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + ")"; 199c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 200f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final HashMap<String, String> sPeopleProjectionMap; 2013cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private static final HashMap<String, String> sOrganizationProjectionMap; 202e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final HashMap<String, String> sContactMethodProjectionMap; 203e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final HashMap<String, String> sPhoneProjectionMap; 2040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final HashMap<String, String> sExtensionProjectionMap; 2050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final HashMap<String, String> sGroupProjectionMap; 2060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private static final HashMap<String, String> sGroupMembershipProjectionMap; 207c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private static final HashMap<String, String> sPhotoProjectionMap; 20870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov private static final HashMap<String, String> sPresenceProjectionMap; 209f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 210f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov static { 211f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 212f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // Contacts URI matching table 213f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov UriMatcher matcher = sUriMatcher; 214f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 215f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String authority = android.provider.Contacts.AUTHORITY; 2160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "extensions", EXTENSIONS); 2170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "extensions/#", EXTENSIONS_ID); 2180f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groups", GROUPS); 2190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groups/#", GROUPS_ID); 220f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/name/*/members", GROUP_NAME_MEMBERS); 221f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/name/*/members/filter/*", 222f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// GROUP_NAME_MEMBERS_FILTER); 223f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/system_id/*/members", GROUP_SYSTEM_ID_MEMBERS); 224f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/system_id/*/members/filter/*", 225f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// GROUP_SYSTEM_ID_MEMBERS_FILTER); 2260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groupmembership", GROUPMEMBERSHIP); 2270f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "groupmembership/#", GROUPMEMBERSHIP_ID); 228f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groupmembershipraw", GROUPMEMBERSHIP_RAW); 229f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people", PEOPLE); 230f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/strequent", PEOPLE_STREQUENT); 231f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/strequent/filter/*", PEOPLE_STREQUENT_FILTER); 232445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov matcher.addURI(authority, "people/filter/*", PEOPLE_FILTER); 233f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/with_phones_filter/*", 234f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_WITH_PHONES_FILTER); 235f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/with_email_or_im_filter/*", 236f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_WITH_EMAIL_OR_IM_FILTER); 237f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people/#", PEOPLE_ID); 2380f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/extensions", PEOPLE_EXTENSIONS); 2390f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/extensions/#", PEOPLE_EXTENSIONS_ID); 240e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/phones", PEOPLE_PHONES); 241e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/phones/#", PEOPLE_PHONES_ID); 242f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/phones_with_presence", 243f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_PHONES_WITH_PRESENCE); 244c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov matcher.addURI(authority, "people/#/photo", PEOPLE_PHOTO); 245f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/photo/data", PEOPLE_PHOTO_DATA); 246e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/contact_methods", PEOPLE_CONTACTMETHODS); 247f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/contact_methods_with_presence", 248f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_CONTACTMETHODS_WITH_PRESENCE); 249e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID); 250f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/organizations", PEOPLE_ORGANIZATIONS); 251f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/organizations/#", PEOPLE_ORGANIZATIONS_ID); 2520f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/groupmembership", PEOPLE_GROUPMEMBERSHIP); 2530f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov matcher.addURI(authority, "people/#/groupmembership/#", PEOPLE_GROUPMEMBERSHIP_ID); 254f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/raw", PEOPLE_RAW); 255f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/owner", PEOPLE_OWNER); 256f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people/#/update_contact_time", 257f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov PEOPLE_UPDATE_CONTACT_TIME); 25833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov matcher.addURI(authority, "deleted_people", DELETED_PEOPLE); 25933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov matcher.addURI(authority, "deleted_groups", DELETED_GROUPS); 260e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "phones", PHONES); 261f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones_with_presence", PHONES_WITH_PRESENCE); 262f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones/filter/*", PHONES_FILTER); 263f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones/filter_name/*", PHONES_FILTER_NAME); 264f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones/mobile_filter_name/*", 265f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PHONES_MOBILE_FILTER_NAME); 266e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "phones/#", PHONES_ID); 267c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov matcher.addURI(authority, "photos", PHOTOS); 268c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov matcher.addURI(authority, "photos/#", PHOTOS_ID); 269e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "contact_methods", CONTACTMETHODS); 270f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "contact_methods/email", CONTACTMETHODS_EMAIL); 271f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "contact_methods/email/*", CONTACTMETHODS_EMAIL_FILTER); 272e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "contact_methods/#", CONTACTMETHODS_ID); 273f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "contact_methods/with_presence", 274f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// CONTACTMETHODS_WITH_PRESENCE); 27570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov matcher.addURI(authority, "presence", PRESENCE); 27670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov matcher.addURI(authority, "presence/#", PRESENCE_ID); 2773cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov matcher.addURI(authority, "organizations", ORGANIZATIONS); 2783cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov matcher.addURI(authority, "organizations/#", ORGANIZATIONS_ID); 279f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "voice_dialer_timestamp", VOICE_DIALER_TIMESTAMP); 280f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY, 281f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// SEARCH_SUGGESTIONS); 282f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", 283f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// SEARCH_SUGGESTIONS); 284f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/#", 285f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// SEARCH_SHORTCUT); 286f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "settings", SETTINGS); 287f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// 288f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "live_folders/people", LIVE_FOLDERS_PEOPLE); 289f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "live_folders/people/*", 290f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// LIVE_FOLDERS_PEOPLE_GROUP_NAME); 291f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "live_folders/people_with_phones", 292f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// LIVE_FOLDERS_PEOPLE_WITH_PHONES); 293f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "live_folders/favorites", 294f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// LIVE_FOLDERS_PEOPLE_FAVORITES); 295f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// 296f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// // Call log URI matching table 297f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(CALL_LOG_AUTHORITY, "calls", CALLS); 298f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(CALL_LOG_AUTHORITY, "calls/filter/*", CALLS_FILTER); 299f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(CALL_LOG_AUTHORITY, "calls/#", CALLS_ID); 300f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 301f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 302e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov HashMap<String, String> peopleProjectionMap = new HashMap<String, String>(); 303d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.NAME, People.NAME); 304d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.DISPLAY_NAME, People.DISPLAY_NAME); 305d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.PHONETIC_NAME, People.PHONETIC_NAME); 306d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.NOTES, People.NOTES); 307d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.TIMES_CONTACTED, People.TIMES_CONTACTED); 308d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.LAST_TIME_CONTACTED, People.LAST_TIME_CONTACTED); 309d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.CUSTOM_RINGTONE, People.CUSTOM_RINGTONE); 310d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.SEND_TO_VOICEMAIL, People.SEND_TO_VOICEMAIL); 311d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov peopleProjectionMap.put(People.STARRED, People.STARRED); 312e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 313e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPeopleProjectionMap = new HashMap<String, String>(peopleProjectionMap); 314d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.PRIMARY_ORGANIZATION_ID, People.PRIMARY_ORGANIZATION_ID); 315d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.PRIMARY_EMAIL_ID, People.PRIMARY_EMAIL_ID); 316d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.PRIMARY_PHONE_ID, People.PRIMARY_PHONE_ID); 317d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.NUMBER, People.NUMBER); 318d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.TYPE, People.TYPE); 319d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.LABEL, People.LABEL); 320d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sPeopleProjectionMap.put(People.NUMBER_KEY, People.NUMBER_KEY); 32170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.IM_PROTOCOL, People.IM_PROTOCOL); 32270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.IM_HANDLE, People.IM_HANDLE); 32370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.IM_ACCOUNT, People.IM_ACCOUNT); 32470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.PRESENCE_STATUS, People.PRESENCE_STATUS); 32570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPeopleProjectionMap.put(People.PRESENCE_CUSTOM_STATUS, People.PRESENCE_CUSTOM_STATUS); 3263cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 3273cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap = new HashMap<String, String>(); 3283cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.PERSON_ID, 329d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.PERSON_ID); 3303cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.ISPRIMARY, 331d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.ISPRIMARY); 3323cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.COMPANY, 333d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.COMPANY); 3343cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TYPE, 335d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.TYPE); 3363cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.LABEL, 337d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.LABEL); 3383cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TITLE, 339d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Organizations.TITLE); 340e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 341e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sContactMethodProjectionMap = new HashMap<String, String>(peopleProjectionMap); 342d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.PERSON_ID, ContactMethods.PERSON_ID); 343d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.KIND, ContactMethods.KIND); 344d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.ISPRIMARY, ContactMethods.ISPRIMARY); 345d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.TYPE, ContactMethods.TYPE); 346d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.DATA, ContactMethods.DATA); 347d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.LABEL, ContactMethods.LABEL); 348d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.AUX_DATA, ContactMethods.AUX_DATA); 349e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 350e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap = new HashMap<String, String>(peopleProjectionMap); 351e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.PERSON_ID, 352d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.PERSON_ID); 353e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.ISPRIMARY, 354d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.ISPRIMARY); 355e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER, 356d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.NUMBER); 357e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.TYPE, 358d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.TYPE); 359e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.LABEL, 360d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.LABEL); 361e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER_KEY, 362d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Phones.NUMBER_KEY); 3630f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 3640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap = new HashMap<String, String>(); 3650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions.PERSON_ID, 366d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Extensions.PERSON_ID); 3670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions.NAME, 368d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Extensions.NAME); 3690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sExtensionProjectionMap.put(android.provider.Contacts.Extensions.VALUE, 370d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Extensions.VALUE); 3710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 3720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap = new HashMap<String, String>(); 3730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups._ID, 374d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups._ID); 3750f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups.NAME, 376d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups.NAME); 3770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups.NOTES, 378d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups.NOTES); 3790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupProjectionMap.put(android.provider.Contacts.Groups.SYSTEM_ID, 380d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.Groups.SYSTEM_ID); 3810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 3820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupMembershipProjectionMap = new HashMap<String, String>(); 3830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.PERSON_ID, 384d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.GroupMembership.PERSON_ID); 3850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov sGroupMembershipProjectionMap.put(android.provider.Contacts.GroupMembership.GROUP_ID, 386d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov android.provider.Contacts.GroupMembership.GROUP_ID); 387c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 388c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap = new HashMap<String, String>(); 389c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.PERSON_ID, 390c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.PERSON_ID); 391c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.DATA, 392c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.DATA); 393c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.LOCAL_VERSION, 394c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.LOCAL_VERSION); 395c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.DOWNLOAD_REQUIRED, 396c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.DOWNLOAD_REQUIRED); 397c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.EXISTS_ON_SERVER, 398c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.EXISTS_ON_SERVER); 399c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov sPhotoProjectionMap.put(android.provider.Contacts.Photos.SYNC_ERROR, 400c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov android.provider.Contacts.Photos.SYNC_ERROR); 40170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 40270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPresenceProjectionMap = new HashMap<String, String>(); 40370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPresenceProjectionMap.put(android.provider.Contacts.Presence._ID, 40470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov Tables.PRESENCE + "." + Presence._ID 40570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov + " AS " + android.provider.Contacts.Presence._ID); 40670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPresenceProjectionMap.put(android.provider.Contacts.Presence.PERSON_ID, 40770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov Tables.PRESENCE + "." + Presence.CONTACT_ID 40870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov + " AS " + android.provider.Contacts.Presence.PERSON_ID); 40970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPresenceProjectionMap.put(android.provider.Contacts.Presence.IM_PROTOCOL, 41070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov Presence.IM_PROTOCOL 41170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov + " AS " + android.provider.Contacts.Presence.IM_PROTOCOL); 41270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPresenceProjectionMap.put(android.provider.Contacts.Presence.IM_HANDLE, 41370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov Presence.IM_HANDLE 41470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov + " AS " + android.provider.Contacts.Presence.IM_HANDLE); 41570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPresenceProjectionMap.put(android.provider.Contacts.Presence.IM_ACCOUNT, 41670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov Presence.IM_ACCOUNT 41770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov + " AS " + android.provider.Contacts.Presence.IM_ACCOUNT); 41870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPresenceProjectionMap.put(android.provider.Contacts.Presence.PRESENCE_STATUS, 41970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov Presence.PRESENCE_STATUS 42070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov + " AS " + android.provider.Contacts.Presence.PRESENCE_STATUS); 42170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov sPresenceProjectionMap.put(android.provider.Contacts.Presence.PRESENCE_CUSTOM_STATUS, 42270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov Presence.PRESENCE_CUSTOM_STATUS 42370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov + " AS " + android.provider.Contacts.Presence.PRESENCE_CUSTOM_STATUS); 424f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 425f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 426f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final Context mContext; 427f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final OpenHelper mOpenHelper; 428f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final ContactsProvider2 mContactsProvider; 429f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final NameSplitter mPhoneticNameSplitter; 430f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 431e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov /** Precompiled sql statement for incrementing times contacted for an aggregate */ 4323cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private final SQLiteStatement mLastTimeContactedUpdate; 4333cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 4343cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private final ContentValues mValues = new ContentValues(); 4353cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 436f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public LegacyApiSupport(Context context, OpenHelper openHelper, 437f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov ContactsProvider2 contactsProvider) { 438f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContext = context; 439f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContactsProvider = contactsProvider; 440f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mOpenHelper = openHelper; 441d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov mOpenHelper.setDelegate(this); 442f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 443f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mPhoneticNameSplitter = new NameSplitter("", "", "", 444f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov context.getString(com.android.internal.R.string.common_name_conjunctions)); 445f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 446f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov SQLiteDatabase db = mOpenHelper.getReadableDatabase(); 447f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mLastTimeContactedUpdate = db.compileStatement("UPDATE " + Tables.CONTACTS + " SET " 4486cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContacts.TIMES_CONTACTED + "=" 4496cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContacts.TIMES_CONTACTED + "+1," 4506cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContacts.LAST_TIME_CONTACTED + "=? WHERE " 4516cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov + RawContacts._ID + "=?"); 452f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 453f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 454d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 455d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov public void createDatabase(SQLiteDatabase db) { 456d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 457d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PEOPLE + ";"); 458d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.PEOPLE + " AS SELECT " + 4596cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContactsColumns.CONCRETE_ID 460d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.People._ID + ", " + 461d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "name." + StructuredName.DISPLAY_NAME 462d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.NAME + ", " + 4636cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContactsColumns.DISPLAY_NAME 464d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.DISPLAY_NAME + ", " + 465d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov PHONETIC_NAME_SQL 466d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PHONETIC_NAME + " , " + 467d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "note." + Note.NOTE 468d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.NOTES + ", " + 4696cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContacts.TIMES_CONTACTED 470d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.TIMES_CONTACTED + ", " + 4716cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED 472d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.LAST_TIME_CONTACTED + ", " + 4736cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContacts.CUSTOM_RINGTONE 474d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.CUSTOM_RINGTONE + ", " + 4756cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL 476d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.SEND_TO_VOICEMAIL + ", " + 4776cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContacts.STARRED 478d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.STARRED + ", " + 479d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "organization." + Data._ID 480d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PRIMARY_ORGANIZATION_ID + ", " + 481d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "email." + Data._ID 482d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PRIMARY_EMAIL_ID + ", " + 483d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Data._ID 484d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.PRIMARY_PHONE_ID + ", " + 485d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Phone.NUMBER 486d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.NUMBER + ", " + 487d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Phone.TYPE 488d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.TYPE + ", " + 489d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + Phone.LABEL 490d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + People.LABEL + ", " + 491d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "phone." + PhoneColumns.NORMALIZED_NUMBER 49270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov + " AS " + People.NUMBER_KEY + ", " + 4936cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.IS_RESTRICTED + 494d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.CONTACTS + PEOPLE_JOINS + 49533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov " WHERE " + Tables.CONTACTS + "." + RawContacts.DELETED + "=0" + 496d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 497d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 498d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.ORGANIZATIONS + ";"); 499d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.ORGANIZATIONS + " AS SELECT " + 500d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 501d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations._ID + ", " + 502d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Data.CONTACT_ID 503d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.PERSON_ID + ", " + 504d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Data.IS_PRIMARY 505d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.ISPRIMARY + ", " + 506d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.COMPANY 507d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.COMPANY + ", " + 508d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.TYPE 509d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.TYPE + ", " + 510d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.LABEL 511d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.LABEL + ", " + 512d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Organization.TITLE 513d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Organizations.TITLE + ", " + 5146cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.IS_RESTRICTED + 515d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.DATA_JOIN_MIMETYPE_CONTACTS + 516d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 51733b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + Organization.CONTENT_ITEM_TYPE + "'" 51833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + " AND " + Tables.CONTACTS + "." + RawContacts.DELETED + "=0" + 519d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 520d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 521d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.CONTACT_METHODS + ";"); 522d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.CONTACT_METHODS + " AS SELECT " + 523d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 524d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods._ID + ", " + 525d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_CONTACT_ID 526d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.PERSON_ID + ", " + 527d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov CONTACT_METHOD_KIND_SQL 528d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.KIND + ", " + 529d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_IS_PRIMARY 530d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.ISPRIMARY + ", " + 531d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_DATA1 532d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.TYPE + ", " + 533d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_DATA2 534d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.DATA + ", " + 535d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_DATA3 536d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.LABEL + ", " + 537d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_DATA14 538d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.AUX_DATA + ", " + 539d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "name." + StructuredName.DISPLAY_NAME 540d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.NAME + ", " + 5416cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContactsColumns.DISPLAY_NAME 542d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.DISPLAY_NAME + ", " + 543d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov PHONETIC_NAME_SQL 544d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.PHONETIC_NAME + " , " + 545d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "note." + Note.NOTE 546d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.NOTES + ", " + 5476cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContacts.TIMES_CONTACTED 548d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.TIMES_CONTACTED + ", " + 5496cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED 550d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.LAST_TIME_CONTACTED + ", " + 5516cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContacts.CUSTOM_RINGTONE 552d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.CUSTOM_RINGTONE + ", " + 5536cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL 554d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.SEND_TO_VOICEMAIL + ", " + 5556cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContacts.STARRED 556d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + ContactMethods.STARRED + ", " + 5576cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.IS_RESTRICTED + 558d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.DATA + DATA_JOINS + 55933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov " WHERE " + ContactMethods.KIND + " IS NOT NULL" 56033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + " AND " + Tables.CONTACTS + "." + RawContacts.DELETED + "=0" + 561d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 562d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 563d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 564d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHONES + ";"); 565d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.PHONES + " AS SELECT " + 566d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 567d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones._ID + ", " + 568d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_CONTACT_ID 569d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.PERSON_ID + ", " + 570d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_IS_PRIMARY 571d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.ISPRIMARY + ", " + 572d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Tables.DATA + "." + Phone.NUMBER 573d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NUMBER + ", " + 574d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Tables.DATA + "." + Phone.TYPE 575d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.TYPE + ", " + 576d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Tables.DATA + "." + Phone.LABEL 577d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.LABEL + ", " + 578d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov PhoneColumns.CONCRETE_NORMALIZED_NUMBER 579d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NUMBER_KEY + ", " + 580d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "name." + StructuredName.DISPLAY_NAME 581d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NAME + ", " + 5826cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContactsColumns.DISPLAY_NAME 583d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.DISPLAY_NAME + ", " + 584d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov PHONETIC_NAME_SQL 585d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.PHONETIC_NAME + " , " + 586d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov "note." + Note.NOTE 587d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NOTES + ", " + 5886cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContacts.TIMES_CONTACTED 589d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.TIMES_CONTACTED + ", " + 5906cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED 591d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.LAST_TIME_CONTACTED + ", " + 5926cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContacts.CUSTOM_RINGTONE 593d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.CUSTOM_RINGTONE + ", " + 5946cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL 595d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.SEND_TO_VOICEMAIL + ", " + 5966cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Tables.CONTACTS + "." + RawContacts.STARRED 597d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Phones.STARRED + ", " + 5986cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.IS_RESTRICTED + 599d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.DATA + DATA_JOINS + 600d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 60133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + Phone.CONTENT_ITEM_TYPE + "'" 60233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + " AND " + Tables.CONTACTS + "." + RawContacts.DELETED + "=0" + 603d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 604d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 605d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.EXTENSIONS + ";"); 606d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.EXTENSIONS + " AS SELECT " + 607d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 608d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions._ID + ", " + 609d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_CONTACT_ID 610d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions.PERSON_ID + ", " + 611d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ExtensionsColumns.NAME 612d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions.NAME + ", " + 613d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ExtensionsColumns.VALUE 614d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.Extensions.VALUE + ", " + 6156cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.IS_RESTRICTED + 616d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.DATA_JOIN_MIMETYPE_CONTACTS + 617d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 61833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE + "'" 61933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + " AND " + Tables.CONTACTS + "." + RawContacts.DELETED + "=0" + 620d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 621d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 622d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUPS + ";"); 623d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.GROUPS + " AS SELECT " + 624d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov GroupsColumns.CONCRETE_ID + " AS " + android.provider.Contacts.Groups._ID + ", " + 625d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.TITLE + " AS " + android.provider.Contacts.Groups.NAME + ", " + 626d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.NOTES + " AS " + android.provider.Contacts.Groups.NOTES + " , " + 627d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.SYSTEM_ID + " AS " + android.provider.Contacts.Groups.SYSTEM_ID + 628d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.GROUPS + 629d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 630d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 631d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.GROUP_MEMBERSHIP + ";"); 632d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.GROUP_MEMBERSHIP + " AS SELECT " + 633d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_ID 634d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership._ID + ", " + 635d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov DataColumns.CONCRETE_CONTACT_ID 636d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.PERSON_ID + ", " + 637d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov GroupMembership.GROUP_ROW_ID 638d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.GROUP_ID + ", " + 639d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.TITLE 640d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.NAME + ", " + 641d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.NOTES 642d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.NOTES + " , " + 643d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov Groups.SYSTEM_ID 644d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov + " AS " + android.provider.Contacts.GroupMembership.SYSTEM_ID + ", " + 6456cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.IS_RESTRICTED + 646d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " FROM " + Tables.DATA_JOIN_PACKAGES_MIMETYPES_CONTACTS_GROUPS + 647d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 64833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + GroupMembership.CONTENT_ITEM_TYPE + "'" 64933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + " AND " + Tables.CONTACTS + "." + RawContacts.DELETED + "=0" + 650d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov ";"); 651c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 652c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + LegacyTables.PHOTOS + ";"); 653c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov db.execSQL("CREATE VIEW " + LegacyTables.PHOTOS + " AS SELECT " + 654c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov DataColumns.CONCRETE_ID 655c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos._ID + ", " + 656c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov DataColumns.CONCRETE_CONTACT_ID 657c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.PERSON_ID + ", " + 658c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Tables.DATA + "." + Photo.PHOTO 659c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.DATA + ", " + 660c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.EXISTS_ON_SERVER 661c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.EXISTS_ON_SERVER + ", " + 662c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.DOWNLOAD_REQUIRED 663c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.DOWNLOAD_REQUIRED + ", " + 664c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.LOCAL_VERSION 665c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.LOCAL_VERSION + ", " + 666c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov "legacy_photo." + LegacyPhotoData.SYNC_ERROR 667c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AS " + android.provider.Contacts.Photos.SYNC_ERROR + ", " + 6686cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.IS_RESTRICTED + 669c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov " FROM " + Tables.DATA + DATA_JOINS + LEGACY_PHOTO_JOIN + 670c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov " WHERE " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 67133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + Photo.CONTENT_ITEM_TYPE + "'" 67233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov + " AND " + Tables.CONTACTS + "." + RawContacts.DELETED + "=0" + 673c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov ";"); 674d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov } 675d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov 676f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public Uri insert(Uri uri, ContentValues values) { 677f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final int match = sUriMatcher.match(uri); 678f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long id = 0; 679f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch (match) { 680f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE: 6813cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov id = insertPeople(values); 6823cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 6833cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 6843cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS: 6853cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov id = insertOrganization(values); 686f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 687f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 6880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_CONTACTMETHODS: { 689e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov long contactId = Long.parseLong(uri.getPathSegments().get(1)); 690e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov id = insertContactMethod(contactId, values); 691e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 6920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 693e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 6940f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case CONTACTMETHODS: { 6950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov long contactId = getRequiredValue(values, ContactMethods.PERSON_ID); 6960f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov id = insertContactMethod(contactId, values); 697e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 6980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 699e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7000f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PHONES: { 7010f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov long contactId = getRequiredValue(values, 7020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.Phones.PERSON_ID); 7030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov id = insertPhone(contactId, values); 7040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 7050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 7060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 7070f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case EXTENSIONS: { 7080f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov long contactId = getRequiredValue(values, 7090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.Extensions.PERSON_ID); 7100f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov id = insertExtension(contactId, values); 7110f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 7120f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 7130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 7140f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPS: 7150f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov id = insertGroup(values); 716e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 717e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7180f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPMEMBERSHIP: { 7190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov long contactId = getRequiredValue(values, 7200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.GroupMembership.PERSON_ID); 7210f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov long groupId = getRequiredValue(values, 7220f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov android.provider.Contacts.GroupMembership.GROUP_ID); 7230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov id = insertGroupMembership(contactId, groupId); 7240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 7250f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 7260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 72770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov case PRESENCE: { 72870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov id = insertPresence(values); 72970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov break; 73070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov } 73170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 732f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov default: 733f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 734f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 735f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 736f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (id < 0) { 737f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return null; 738f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 739f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 740f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final Uri result = ContentUris.withAppendedId(uri, id); 741f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov onChange(result); 742f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return result; 743f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 744f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 7450f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private long getRequiredValue(ContentValues values, String column) { 7460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov if (!values.containsKey(column)) { 7470f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov throw new RuntimeException("Required value: " + column); 748e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 749e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7500f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return values.getAsLong(column); 751e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 752e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 7533cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private long insertPeople(ContentValues values) { 7543cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.clear(); 755f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 7566cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov OpenHelper.copyStringValue(mValues, RawContacts.CUSTOM_RINGTONE, 757f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.CUSTOM_RINGTONE); 7586cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov OpenHelper.copyLongValue(mValues, RawContacts.SEND_TO_VOICEMAIL, 759f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.SEND_TO_VOICEMAIL); 7606cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov OpenHelper.copyLongValue(mValues, RawContacts.LAST_TIME_CONTACTED, 761f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.LAST_TIME_CONTACTED); 7626cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov OpenHelper.copyLongValue(mValues, RawContacts.TIMES_CONTACTED, 763f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.TIMES_CONTACTED); 7646cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov OpenHelper.copyLongValue(mValues, RawContacts.STARRED, 765f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.STARRED); 7666cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov Uri contactUri = mContactsProvider.insert(RawContacts.CONTENT_URI, mValues); 767f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long contactId = ContentUris.parseId(contactUri); 768f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 769f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.NAME) || values.containsKey(People.PHONETIC_NAME)) { 7703cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.clear(); 7713cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(ContactsContract.Data.CONTACT_ID, contactId); 7723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(ContactsContract.Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 7733cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, StructuredName.DISPLAY_NAME, 774f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.NAME); 775f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.PHONETIC_NAME)) { 776f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String phoneticName = values.getAsString(People.PHONETIC_NAME); 777f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov NameSplitter.Name parsedName = new NameSplitter.Name(); 778f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mPhoneticNameSplitter.split(parsedName, phoneticName); 7793cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(StructuredName.PHONETIC_GIVEN_NAME, parsedName.getGivenNames()); 7803cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(StructuredName.PHONETIC_MIDDLE_NAME, parsedName.getMiddleName()); 7813cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(StructuredName.PHONETIC_FAMILY_NAME, parsedName.getFamilyName()); 782f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 783f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 7843cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mContactsProvider.insert(ContactsContract.Data.CONTENT_URI, mValues); 785f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 786f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 787f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.NOTES)) { 7883cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.clear(); 7893cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(Data.CONTACT_ID, contactId); 7903cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE); 7913cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, Note.NOTE, values, People.NOTES); 7923cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mContactsProvider.insert(Data.CONTENT_URI, mValues); 793f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 794f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 795f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // TODO instant aggregation 796f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return contactId; 797f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 798f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 7993cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private long insertOrganization(ContentValues values) { 8003cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.clear(); 8013cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8023cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyLongValue(mValues, Data.CONTACT_ID, 8033cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.PERSON_ID); 8043cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE); 8053cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8063cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY, 8073cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.ISPRIMARY); 8083cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8093cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, Organization.COMPANY, 8103cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.COMPANY); 8113cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8123cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov // TYPE values happen to remain the same between V1 and V2 - can just copy the value 8133cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyLongValue(mValues, Organization.TYPE, 8143cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.TYPE); 8153cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8163cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, Organization.LABEL, 8173cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.LABEL); 8183cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, Organization.TITLE, 8193cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.TITLE); 8203cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8213cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues); 8223cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 8233cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov return ContentUris.parseId(uri); 8243cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 825f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 8260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private long insertPhone(long contactId, ContentValues values) { 827e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.clear(); 828e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 8290f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(Data.CONTACT_ID, contactId); 830e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 831e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 832e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY, 833e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov values, android.provider.Contacts.Phones.ISPRIMARY); 834e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 835e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Phone.NUMBER, 836e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov values, android.provider.Contacts.Phones.NUMBER); 837e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 838e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov // TYPE values happen to remain the same between V1 and V2 - can just copy the value 839e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyLongValue(mValues, Phone.TYPE, 840e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov values, android.provider.Contacts.Phones.TYPE); 841e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 842e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Phone.LABEL, 843e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov values, android.provider.Contacts.Phones.LABEL); 844e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 845e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues); 846e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 847e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov return ContentUris.parseId(uri); 848e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 849e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 850e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private long insertContactMethod(long contactId, ContentValues values) { 851e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Integer kind = values.getAsInteger(ContactMethods.KIND); 852e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov if (kind == null) { 853e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov throw new RuntimeException("Required value: " + ContactMethods.KIND); 854e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 855e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 856e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.clear(); 857e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.put(Data.CONTACT_ID, contactId); 858e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 859e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY, values, ContactMethods.ISPRIMARY); 860e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 861e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov switch (kind) { 862e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case android.provider.Contacts.KIND_EMAIL: 863e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov copyCommonFields(values, Email.CONTENT_ITEM_TYPE, Email.TYPE, Email.LABEL, 8640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov Email.DATA, Data.DATA14); 865e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 866e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 867e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case android.provider.Contacts.KIND_IM: 868e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov copyCommonFields(values, Im.CONTENT_ITEM_TYPE, Im.TYPE, Im.LABEL, 8690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov Email.DATA, Data.DATA14); 870e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 871e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 872e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case android.provider.Contacts.KIND_POSTAL: 87367dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey copyCommonFields(values, StructuredPostal.CONTENT_ITEM_TYPE, StructuredPostal.TYPE, 87467dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey StructuredPostal.LABEL, StructuredPostal.FORMATTED_ADDRESS, Data.DATA14); 875e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 876e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 877e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 878e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues); 879e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov return ContentUris.parseId(uri); 880e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 881e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 882e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private void copyCommonFields(ContentValues values, String mimeType, String typeColumn, 883e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov String labelColumn, String dataColumn, String auxDataColumn) { 884e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.put(Data.MIMETYPE, mimeType); 885e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyLongValue(mValues, typeColumn, values, ContactMethods.TYPE); 886e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, labelColumn, values, ContactMethods.LABEL); 887e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, dataColumn, values, ContactMethods.DATA); 888e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, auxDataColumn, values, ContactMethods.AUX_DATA); 889e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 890e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 8910f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private long insertExtension(long contactId, ContentValues values) { 8920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.clear(); 8930f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 8940f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(Data.CONTACT_ID, contactId); 8950f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(Data.MIMETYPE, android.provider.Contacts.Extensions.CONTENT_ITEM_TYPE); 8960f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 8970f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov OpenHelper.copyStringValue(mValues, ExtensionsColumns.NAME, 8980f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov values, android.provider.Contacts.People.Extensions.NAME); 8990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov OpenHelper.copyStringValue(mValues, ExtensionsColumns.VALUE, 9000f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov values, android.provider.Contacts.People.Extensions.VALUE); 9010f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9020f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues); 9030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return ContentUris.parseId(uri); 9040f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 9050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private long insertGroup(ContentValues values) { 9070f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.clear(); 9080f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Groups.TITLE, 9100f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov values, android.provider.Contacts.Groups.NAME); 9110f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Groups.NOTES, 9120f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov values, android.provider.Contacts.Groups.NOTES); 9130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Groups.SYSTEM_ID, 9140f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov values, android.provider.Contacts.Groups.SYSTEM_ID); 9150f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov Uri uri = mContactsProvider.insert(Groups.CONTENT_URI, mValues); 9170f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return ContentUris.parseId(uri); 9180f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 9190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov private long insertGroupMembership(long contactId, long groupId) { 9210f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.clear(); 9220f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); 9240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(GroupMembership.CONTACT_ID, contactId); 9250f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mValues.put(GroupMembership.GROUP_ROW_ID, groupId); 9260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 9270f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues); 9280f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov return ContentUris.parseId(uri); 9290f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 9300f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 93170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov private long insertPresence(ContentValues values) { 93270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov mValues.clear(); 93370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 93470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov OpenHelper.copyLongValue(mValues, Presence._ID, 93570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov values, android.provider.Contacts.Presence._ID); 93670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov OpenHelper.copyLongValue(mValues, Presence.CONTACT_ID, 93770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov values, android.provider.Contacts.Presence.PERSON_ID); 93870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov OpenHelper.copyStringValue(mValues, Presence.IM_PROTOCOL, 93970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov values, android.provider.Contacts.Presence.IM_PROTOCOL); 94070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov OpenHelper.copyStringValue(mValues, Presence.IM_HANDLE, 94170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov values, android.provider.Contacts.Presence.IM_HANDLE); 94270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov OpenHelper.copyStringValue(mValues, Presence.IM_ACCOUNT, 94370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov values, android.provider.Contacts.Presence.IM_ACCOUNT); 94470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov OpenHelper.copyLongValue(mValues, Presence.PRESENCE_STATUS, 94570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov values, android.provider.Contacts.Presence.PRESENCE_STATUS); 94670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov OpenHelper.copyStringValue(mValues, Presence.PRESENCE_CUSTOM_STATUS, 94770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov values, android.provider.Contacts.Presence.PRESENCE_CUSTOM_STATUS); 94870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 94970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov return mContactsProvider.insertPresence(mValues); 95070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov } 95170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 952f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 953f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final int match = sUriMatcher.match(uri); 954c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov int count = 0; 955f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch(match) { 956f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE_UPDATE_CONTACT_TIME: 957f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov count = updateContactTime(uri, values); 958f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 959c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 960c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PEOPLE_PHOTO: { 961c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov long contactId = Long.parseLong(uri.getPathSegments().get(1)); 962c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov return updatePhoto(contactId, values); 963c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 964c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 965c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PHOTOS: 966c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov // TODO 967c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov break; 968c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 969c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PHOTOS_ID: 970c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov // TODO 971c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov break; 972c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 973c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 974f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov default: 975f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 976f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 977f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 978f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (count > 0) { 979f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContext.getContentResolver().notifyChange(uri, null); 980f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 981f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return count; 982f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 983f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 984c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 985f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private int updateContactTime(Uri uri, ContentValues values) { 986f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 987f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // TODO check sanctions 988f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 989f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long lastTimeContacted; 990f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.LAST_TIME_CONTACTED)) { 991f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov lastTimeContacted = values.getAsLong(People.LAST_TIME_CONTACTED); 992f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } else { 993f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov lastTimeContacted = System.currentTimeMillis(); 994f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 995f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 996f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long contactId = Long.parseLong(uri.getPathSegments().get(1)); 997f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long aggregateId = mOpenHelper.getAggregateId(contactId); 998f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (aggregateId != 0) { 999f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContactsProvider.updateContactTime(aggregateId, lastTimeContacted); 1000f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } else { 1001f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mLastTimeContactedUpdate.bindLong(1, lastTimeContacted); 1002f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mLastTimeContactedUpdate.bindLong(2, contactId); 1003f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mLastTimeContactedUpdate.execute(); 1004f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1005f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return 1; 1006f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1007f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1008c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov private int updatePhoto(long contactId, ContentValues values) { 1009c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1010c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov // TODO check sanctions 1011c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1012c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov int count; 1013c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1014c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov long dataId = -1; 1015c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Cursor c = mContactsProvider.query(Data.CONTENT_URI, PhotoQuery.COLUMNS, 1016c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Data.CONTACT_ID + "=" + contactId + " AND " 1017c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + Data.MIMETYPE + "=" + mOpenHelper.getMimeTypeId(Photo.CONTENT_ITEM_TYPE), 1018c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov null, null); 1019c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov try { 1020c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov if (c.moveToFirst()) { 1021c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov dataId = c.getLong(PhotoQuery._ID); 1022c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1023c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } finally { 1024c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov c.close(); 1025c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1026c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1027c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.clear(); 1028c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov byte[] bytes = values.getAsByteArray(android.provider.Contacts.Photos.DATA); 1029c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(Photo.PHOTO, bytes); 1030c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1031c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov if (dataId == -1) { 1032c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 1033c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(Data.CONTACT_ID, contactId); 1034c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Uri dataUri = mContactsProvider.insert(Data.CONTENT_URI, mValues); 1035c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov dataId = ContentUris.parseId(dataUri); 1036c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov count = 1; 1037c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } else { 1038c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Uri dataUri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId); 1039c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov count = mContactsProvider.update(dataUri, mValues, null, null); 1040c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1041c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1042c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.clear(); 1043c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov OpenHelper.copyStringValue(mValues, LegacyPhotoData.LOCAL_VERSION, 1044c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.LOCAL_VERSION); 1045c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov OpenHelper.copyStringValue(mValues, LegacyPhotoData.DOWNLOAD_REQUIRED, 1046c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.DOWNLOAD_REQUIRED); 1047c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov OpenHelper.copyStringValue(mValues, LegacyPhotoData.EXISTS_ON_SERVER, 1048c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.EXISTS_ON_SERVER); 1049c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov OpenHelper.copyStringValue(mValues, LegacyPhotoData.SYNC_ERROR, 1050c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov values, android.provider.Contacts.Photos.SYNC_ERROR); 1051c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1052c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov int updated = mContactsProvider.update(Data.CONTENT_URI, mValues, 1053c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov Data.MIMETYPE + "='" + LegacyPhotoData.CONTENT_ITEM_TYPE + "'" 1054c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AND " + Data.CONTACT_ID + "=" + contactId 1055c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov + " AND " + LegacyPhotoData.PHOTO_DATA_ID + "=" + dataId, null); 1056c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov if (updated == 0) { 1057c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(Data.CONTACT_ID, contactId); 1058c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(Data.MIMETYPE, LegacyPhotoData.CONTENT_ITEM_TYPE); 1059c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mValues.put(LegacyPhotoData.PHOTO_DATA_ID, dataId); 1060c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mContactsProvider.insert(Data.CONTENT_URI, mValues); 1061c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1062c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 1063c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov return count; 1064c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov } 1065c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 10663cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov public int delete(Uri uri, String selection, String[] selectionArgs) { 10673cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov final int match = sUriMatcher.match(uri); 10683cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov int count = 0; 10693cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov switch (match) { 107033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov case PEOPLE_ID: 107133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov count = mContactsProvider.deleteRawContact(ContentUris.parseId(uri), false); 107233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov break; 107333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 10743cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS_ID: 1075e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1076e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov ORGANIZATION_MIME_TYPES); 1077e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1078e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1079e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS_ID: 1080e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1081e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov CONTACT_METHOD_MIME_TYPES); 1082e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1083e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1084e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES_ID: 1085e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 1086e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov PHONE_MIME_TYPES); 10873cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 10883cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 10893cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov default: 10903cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 10913cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 10923cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 10933cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov return count; 10943cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 10953cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 1096f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 1097f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String sortOrder) { 1098f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final SQLiteDatabase db = mOpenHelper.getReadableDatabase(); 1099f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 1100f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String groupBy = null; 1101f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String limit = null; 1102f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1103f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final int match = sUriMatcher.match(uri); 1104f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch (match) { 1105f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE: { 110670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 1107f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 1108f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 1109f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1110f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1111f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE_ID: 111270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 1113f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 1114d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(People._ID + "="); 1115f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1116f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 1117f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1118445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov case PEOPLE_FILTER: { 1119445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); 1120445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 1121445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov String filterParam = uri.getPathSegments().get(2); 1122445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov qb.appendWhere(People._ID + " IN " 1123445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov + mContactsProvider.getContactsByFilterAsNestedQuery(filterParam)); 1124445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov break; 1125445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov } 1126445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov 11273cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS: 1128d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.ORGANIZATIONS); 1129d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sOrganizationProjectionMap); 1130d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 11313cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 11323cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 11333cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS_ID: 1134d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.ORGANIZATIONS); 11353cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov qb.setProjectionMap(sOrganizationProjectionMap); 1136e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 1137d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Organizations._ID + "="); 1138e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1139e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1140e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1141e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS: 1142d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS); 1143d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 1144d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 1145e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1146e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1147e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS_ID: 1148d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS); 1149e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 1150e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 1151d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods._ID + "="); 1152e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1153e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1154e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1155e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_CONTACTMETHODS: 1156d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS); 1157e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 1158e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 1159d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "="); 1160e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1161e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL"); 1162e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1163e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1164e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_CONTACTMETHODS_ID: 1165d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.CONTACT_METHODS); 1166e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 1167e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 1168d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.PERSON_ID + "="); 1169e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1170d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + ContactMethods._ID + "="); 1171e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 1172e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL"); 1173e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1174e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1175e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES: 1176d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.PHONES); 1177d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 1178d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 1179e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1180e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1181e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES_ID: 1182d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.PHONES); 1183e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 1184e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 1185d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "="); 1186e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1187e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1188e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1189e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_PHONES: 1190d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.PHONES); 1191e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 1192e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 1193d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "="); 1194e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1195e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 1196e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 1197e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_PHONES_ID: 1198d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.PHONES); 1199e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 1200e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 1201d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones.PERSON_ID + "="); 12023cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1203d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Phones._ID + "="); 1204e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 12053cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 12063cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 12070f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case EXTENSIONS: 1208d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS); 1209d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 1210d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 12110f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 12120f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 12130f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case EXTENSIONS_ID: 1214d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS); 12150f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 12160f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 1217d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "="); 12180f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 12190f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 12200f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 12210f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_EXTENSIONS: 1222d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS); 12230f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 12240f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 1225d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "="); 12260f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 12270f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 12280f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 12290f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_EXTENSIONS_ID: 1230d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.EXTENSIONS); 12310f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sExtensionProjectionMap); 12320f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 1233d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions.PERSON_ID + "="); 12340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1235d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Extensions._ID + "="); 12360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 12370f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 12380f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 12390f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPS: 1240d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.GROUPS); 12410f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupProjectionMap); 12420f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 12430f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 12440f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPS_ID: 1245d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.GROUPS); 12460f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupProjectionMap); 1247d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(android.provider.Contacts.Groups._ID + "="); 12480f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 12490f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 12500f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 12510f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPMEMBERSHIP: 1252d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP); 1253d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 1254d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 12550f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 12560f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 12570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case GROUPMEMBERSHIP_ID: 1258d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP); 12590f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 12600f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 1261d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "="); 12620f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 12630f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 12640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 12650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_GROUPMEMBERSHIP: 1266d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP); 12670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 12680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 1269d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "="); 12700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 12710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 12720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 12730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov case PEOPLE_GROUPMEMBERSHIP_ID: 1274d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.setTables(LegacyTables.GROUP_MEMBERSHIP); 12750f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.setProjectionMap(sGroupMembershipProjectionMap); 12760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 1277d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership.PERSON_ID + "="); 12780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1279d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.GroupMembership._ID + "="); 12800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 12810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov break; 12820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 1283c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov case PEOPLE_PHOTO: 1284c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov qb.setTables(LegacyTables.PHOTOS); 1285c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov qb.setProjectionMap(sPhotoProjectionMap); 1286c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 1287c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Photos.PERSON_ID + "="); 1288c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 1289c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov limit = "1"; 1290c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov break; 1291c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov 129270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov case PRESENCE: 129370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.setTables(Tables.PRESENCE); 129470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.setProjectionMap(sPresenceProjectionMap); 129570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.appendWhere(mContactsProvider.getContactsRestrictionExceptionAsNestedQuery( 129670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov android.provider.Contacts.Presence.PERSON_ID)); 129770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov break; 129870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 129970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov case PRESENCE_ID: 130070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.setTables(Tables.PRESENCE); 130170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.setProjectionMap(sPresenceProjectionMap); 130270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.appendWhere(mContactsProvider.getContactsRestrictionExceptionAsNestedQuery( 130370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov android.provider.Contacts.Presence.PERSON_ID)); 130470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.appendWhere(" AND " + android.provider.Contacts.Presence._ID + "="); 130570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 130670b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov break; 130770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov 130833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov case DELETED_PEOPLE: 130933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov case DELETED_GROUPS: 131033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov throw new UnsupportedOperationException(); 131133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov 1312f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov default: 1313f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov throw new IllegalArgumentException("Unknown URL " + uri); 1314f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1315f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1316f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // Perform the query and set the notification uri 1317f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final Cursor c = qb.query(db, projection, selection, selectionArgs, 1318f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov groupBy, null, sortOrder, limit); 1319f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (c != null) { 13206cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov c.setNotificationUri(mContext.getContentResolver(), RawContacts.CONTENT_URI); 1321f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1322e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov DatabaseUtils.dumpCursor(c); 1323f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return c; 1324f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1325f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 1326f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov /** 1327f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * Called when a change has been made. 1328f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * 1329f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * @param uri the uri that the change was made to 1330f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov */ 1331f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private void onChange(Uri uri) { 1332f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContext.getContentResolver().notifyChange(android.provider.Contacts.CONTENT_URI, null); 1333f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 1334f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov} 1335