LegacyApiSupport.java revision e80e514a6175ad2ee03ea6eff6201e0e47d5a710
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 183cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikovimport com.android.providers.contacts.OpenHelper.ContactsColumns; 19e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.DataColumns; 20e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.MimetypesColumns; 21e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.PhoneColumns; 22f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport com.android.providers.contacts.OpenHelper.Tables; 23f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 24f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentUris; 25f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.ContentValues; 26f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.Context; 27f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.content.UriMatcher; 28f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.Cursor; 29e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.database.DatabaseUtils; 30f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteDatabase; 31f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteQueryBuilder; 32f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.database.sqlite.SQLiteStatement; 33f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.net.Uri; 34f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract; 35e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.Contacts.ContactMethods; 36f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.Contacts.People; 373cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikovimport android.provider.ContactsContract.Contacts; 38e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.Data; 39e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email; 40e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im; 41f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Note; 423cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization; 43e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone; 44e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Postal; 45f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 46f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 47f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovimport java.util.HashMap; 48f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 49f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikovpublic class LegacyApiSupport { 50f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 51f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 52f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 53f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final int PEOPLE = 1; 54f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final int PEOPLE_ID = 2; 55f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final int PEOPLE_UPDATE_CONTACT_TIME = 3; 563cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private static final int ORGANIZATIONS = 4; 573cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private static final int ORGANIZATIONS_ID = 5; 58e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_CONTACTMETHODS = 6; 59e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_CONTACTMETHODS_ID = 7; 60e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int CONTACTMETHODS = 8; 61e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int CONTACTMETHODS_ID = 9; 62e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_PHONES = 10; 63e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PEOPLE_PHONES_ID = 11; 64e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PHONES = 12; 65e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final int PHONES_ID = 13; 66e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 67e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String PEOPLE_JOINS = 68e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov " LEFT OUTER JOIN data name ON (contacts._id = name.contact_id" 69e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = name.mimetype_id)" 70e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + StructuredName.CONTENT_ITEM_TYPE + "')" 71e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " LEFT OUTER JOIN data organization ON (contacts._id = organization.contact_id" 72e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = organization.mimetype_id)" 73e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Organization.CONTENT_ITEM_TYPE + "' AND organization.is_primary)" 74e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " LEFT OUTER JOIN data email ON (contacts._id = email.contact_id" 75e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = email.mimetype_id)" 76e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Email.CONTENT_ITEM_TYPE + "' AND email.is_primary)" 77e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " LEFT OUTER JOIN data note ON (contacts._id = note.contact_id" 78e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = note.mimetype_id)" 79e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Note.CONTENT_ITEM_TYPE + "')" 80e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " LEFT OUTER JOIN data phone ON (contacts._id = phone.contact_id" 81e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AND (SELECT mimetype FROM mimetypes WHERE mimetypes._id = phone.mimetype_id)" 82e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "='" + Phone.CONTENT_ITEM_TYPE + "' AND phone.is_primary)"; 83e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 84e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String PHONETIC_NAME_SQL = "trim(trim(" 85e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_GIVEN_NAME + ",' ')||' '||" 86e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_MIDDLE_NAME + ",' '))||' '||" 87e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + "ifnull(name." + StructuredName.PHONETIC_FAMILY_NAME + ",' ')) "; 88e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 89e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String CONTACT_METHOD_KIND_SQL = 90e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov "(CASE WHEN mimetype='" + Email.CONTENT_ITEM_TYPE + "'" 91e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_EMAIL 92e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 93e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " (CASE WHEN mimetype='" + Im.CONTENT_ITEM_TYPE +"'" 94e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_IM 95e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 96e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " (CASE WHEN mimetype='" + Postal.CONTENT_ITEM_TYPE + "'" 97e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " THEN " + android.provider.Contacts.KIND_POSTAL 98e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " ELSE" 99e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " NULL" 100e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " END)" 101e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " END)" 102e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " END)"; 103f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 104f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public interface LegacyTables { 105e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String PEOPLE = "contacts" + PEOPLE_JOINS; 106e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 107e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String DATA = "data" 108e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " JOIN mimetypes ON (mimetypes._id = data.mimetype_id)" 109e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " JOIN contacts ON (contacts._id = data.contact_id)" 110e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + PEOPLE_JOINS; 111f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 112f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 113e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] ORGANIZATION_MIME_TYPES = new String[] { 114e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Organization.CONTENT_ITEM_TYPE 115e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 116e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 117e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] CONTACT_METHOD_MIME_TYPES = new String[] { 118e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Email.CONTENT_ITEM_TYPE, 119e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Im.CONTENT_ITEM_TYPE, 120e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Postal.CONTENT_ITEM_TYPE, 121e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 122e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 123e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final String[] PHONE_MIME_TYPES = new String[] { 124e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Phone.CONTENT_ITEM_TYPE 125e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov }; 126e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 127f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private static final HashMap<String, String> sPeopleProjectionMap; 1283cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private static final HashMap<String, String> sOrganizationProjectionMap; 129e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final HashMap<String, String> sContactMethodProjectionMap; 130e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private static final HashMap<String, String> sPhoneProjectionMap; 131f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 132f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov static { 133f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 134f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // Contacts URI matching table 135f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov UriMatcher matcher = sUriMatcher; 136f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 137f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String authority = android.provider.Contacts.AUTHORITY; 138f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "extensions", EXTENSIONS); 139f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "extensions/#", EXTENSIONS_ID); 140f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups", GROUPS); 141f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/#", GROUPS_ID); 142f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/name/*/members", GROUP_NAME_MEMBERS); 143f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/name/*/members/filter/*", 144f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// GROUP_NAME_MEMBERS_FILTER); 145f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/system_id/*/members", GROUP_SYSTEM_ID_MEMBERS); 146f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groups/system_id/*/members/filter/*", 147f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// GROUP_SYSTEM_ID_MEMBERS_FILTER); 148f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groupmembership", GROUPMEMBERSHIP); 149f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groupmembership/#", GROUPMEMBERSHIP_ID); 150f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "groupmembershipraw", GROUPMEMBERSHIP_RAW); 151f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people", PEOPLE); 152f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/strequent", PEOPLE_STREQUENT); 153f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/strequent/filter/*", PEOPLE_STREQUENT_FILTER); 154f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/filter/*", PEOPLE_FILTER); 155f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/with_phones_filter/*", 156f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_WITH_PHONES_FILTER); 157f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/with_email_or_im_filter/*", 158f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_WITH_EMAIL_OR_IM_FILTER); 159f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people/#", PEOPLE_ID); 160f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/extensions", PEOPLE_EXTENSIONS); 161f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/extensions/#", PEOPLE_EXTENSIONS_ID); 162e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/phones", PEOPLE_PHONES); 163e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/phones/#", PEOPLE_PHONES_ID); 164f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/phones_with_presence", 165f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_PHONES_WITH_PRESENCE); 166f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/photo", PEOPLE_PHOTO); 167f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/photo/data", PEOPLE_PHOTO_DATA); 168e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/contact_methods", PEOPLE_CONTACTMETHODS); 169f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/contact_methods_with_presence", 170f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PEOPLE_CONTACTMETHODS_WITH_PRESENCE); 171e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID); 172f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/organizations", PEOPLE_ORGANIZATIONS); 173f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/organizations/#", PEOPLE_ORGANIZATIONS_ID); 174f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/groupmembership", PEOPLE_GROUPMEMBERSHIP); 175f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/#/groupmembership/#", PEOPLE_GROUPMEMBERSHIP_ID); 176f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/raw", PEOPLE_RAW); 177f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "people/owner", PEOPLE_OWNER); 178f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov matcher.addURI(authority, "people/#/update_contact_time", 179f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov PEOPLE_UPDATE_CONTACT_TIME); 180f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "deleted_people", DELETED_PEOPLE); 181f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "deleted_groups", DELETED_GROUPS); 182e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "phones", PHONES); 183f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones_with_presence", PHONES_WITH_PRESENCE); 184f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones/filter/*", PHONES_FILTER); 185f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones/filter_name/*", PHONES_FILTER_NAME); 186f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "phones/mobile_filter_name/*", 187f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// PHONES_MOBILE_FILTER_NAME); 188e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "phones/#", PHONES_ID); 189f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "photos", PHOTOS); 190f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "photos/#", PHOTOS_ID); 191e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "contact_methods", CONTACTMETHODS); 192f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "contact_methods/email", CONTACTMETHODS_EMAIL); 193f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "contact_methods/email/*", CONTACTMETHODS_EMAIL_FILTER); 194e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov matcher.addURI(authority, "contact_methods/#", CONTACTMETHODS_ID); 195f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "contact_methods/with_presence", 196f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// CONTACTMETHODS_WITH_PRESENCE); 197f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "presence", PRESENCE); 198f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "presence/#", PRESENCE_ID); 1993cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov matcher.addURI(authority, "organizations", ORGANIZATIONS); 2003cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov matcher.addURI(authority, "organizations/#", ORGANIZATIONS_ID); 201f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "voice_dialer_timestamp", VOICE_DIALER_TIMESTAMP); 202f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY, 203f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// SEARCH_SUGGESTIONS); 204f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", 205f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// SEARCH_SUGGESTIONS); 206f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/#", 207f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// SEARCH_SHORTCUT); 208f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "settings", SETTINGS); 209f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// 210f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "live_folders/people", LIVE_FOLDERS_PEOPLE); 211f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "live_folders/people/*", 212f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// LIVE_FOLDERS_PEOPLE_GROUP_NAME); 213f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "live_folders/people_with_phones", 214f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// LIVE_FOLDERS_PEOPLE_WITH_PHONES); 215f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(authority, "live_folders/favorites", 216f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// LIVE_FOLDERS_PEOPLE_FAVORITES); 217f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// 218f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// // Call log URI matching table 219f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(CALL_LOG_AUTHORITY, "calls", CALLS); 220f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(CALL_LOG_AUTHORITY, "calls/filter/*", CALLS_FILTER); 221f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov// matcher.addURI(CALL_LOG_AUTHORITY, "calls/#", CALLS_ID); 222f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 223f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 224e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov HashMap<String, String> peopleProjectionMap = new HashMap<String, String>(); 225e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov peopleProjectionMap.put(People.NAME, 226f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov "name." + StructuredName.DISPLAY_NAME + " AS " + People.NAME); 227e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov peopleProjectionMap.put(People.DISPLAY_NAME, 2283cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov Tables.CONTACTS + "." + ContactsColumns.DISPLAY_NAME + " AS " + People.DISPLAY_NAME); 229e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov peopleProjectionMap.put(People.PHONETIC_NAME, PHONETIC_NAME_SQL + "AS " + People.PHONETIC_NAME); 230e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov peopleProjectionMap.put(People.NOTES, 231f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov "note." + Note.NOTE + " AS " + People.NOTES); 232e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov peopleProjectionMap.put(People.TIMES_CONTACTED, 2333cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov Tables.CONTACTS + "." + Contacts.TIMES_CONTACTED 234f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov + " AS " + People.TIMES_CONTACTED); 235e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov peopleProjectionMap.put(People.LAST_TIME_CONTACTED, 2363cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov Tables.CONTACTS + "." + Contacts.LAST_TIME_CONTACTED 237f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov + " AS " + People.LAST_TIME_CONTACTED); 238e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov peopleProjectionMap.put(People.CUSTOM_RINGTONE, 2393cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov Tables.CONTACTS + "." + Contacts.CUSTOM_RINGTONE 240f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov + " AS " + People.CUSTOM_RINGTONE); 241e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov peopleProjectionMap.put(People.SEND_TO_VOICEMAIL, 2423cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov Tables.CONTACTS + "." + Contacts.SEND_TO_VOICEMAIL 243f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov + " AS " + People.SEND_TO_VOICEMAIL); 244e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov peopleProjectionMap.put(People.STARRED, 2453cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov Tables.CONTACTS + "." + Contacts.STARRED 246f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov + " AS " + People.STARRED); 247e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 248e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPeopleProjectionMap = new HashMap<String, String>(peopleProjectionMap); 2493cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sPeopleProjectionMap.put(People.PRIMARY_ORGANIZATION_ID, 250e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov "organization." + Data._ID + " AS " + People.PRIMARY_ORGANIZATION_ID); 251e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPeopleProjectionMap.put(People.PRIMARY_EMAIL_ID, 252e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov "email." + Data._ID + " AS " + People.PRIMARY_EMAIL_ID); 253e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPeopleProjectionMap.put(People.PRIMARY_PHONE_ID, 254e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov "phone." + Data._ID + " AS " + People.PRIMARY_PHONE_ID); 255e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPeopleProjectionMap.put(People.NUMBER, 256e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov "phone." + Phone.NUMBER + " AS " + People.NUMBER); 257e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPeopleProjectionMap.put(People.TYPE, 258e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov "phone." + Phone.TYPE + " AS " + People.TYPE); 259e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPeopleProjectionMap.put(People.LABEL, 260e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov "phone." + Phone.LABEL + " AS " + People.LABEL); 261e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPeopleProjectionMap.put(People.NUMBER_KEY, 262e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov "phone." + PhoneColumns.NORMALIZED_NUMBER + " AS " + People.NUMBER_KEY); 2633cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 2643cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap = new HashMap<String, String>(); 2653cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.PERSON_ID, 2663cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov Data.CONTACT_ID + " AS " + android.provider.Contacts.Organizations.PERSON_ID); 2673cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.ISPRIMARY, 2683cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov Data.IS_PRIMARY + " AS " + android.provider.Contacts.Organizations.ISPRIMARY); 2693cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.COMPANY, 2703cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov Organization.COMPANY + " AS " + android.provider.Contacts.Organizations.COMPANY); 2713cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TYPE, 2723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov Organization.TYPE + " AS " + android.provider.Contacts.Organizations.TYPE); 2733cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.LABEL, 2743cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov Organization.LABEL + " AS " + android.provider.Contacts.Organizations.LABEL); 2753cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov sOrganizationProjectionMap.put(android.provider.Contacts.Organizations.TITLE, 2763cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov Organization.TITLE + " AS " + android.provider.Contacts.Organizations.TITLE); 277e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 278e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sContactMethodProjectionMap = new HashMap<String, String>(peopleProjectionMap); 279e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.PERSON_ID, 280e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov DataColumns.CONCRETE_CONTACT_ID + " AS " + ContactMethods.PERSON_ID); 281e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.KIND, 282e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov CONTACT_METHOD_KIND_SQL + " AS " + ContactMethods.KIND); 283e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.ISPRIMARY, 284e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov DataColumns.CONCRETE_IS_PRIMARY + " AS " + ContactMethods.ISPRIMARY); 285e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.TYPE, 286e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov DataColumns.CONCRETE_DATA1 + " AS " + ContactMethods.TYPE); 287e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.DATA, 288e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov DataColumns.CONCRETE_DATA2 + " AS " + ContactMethods.DATA); 289e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.LABEL, 290e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov DataColumns.CONCRETE_DATA3 + " AS " + ContactMethods.LABEL); 291e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sContactMethodProjectionMap.put(ContactMethods.AUX_DATA, 292e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov DataColumns.CONCRETE_DATA4 + " AS " + ContactMethods.AUX_DATA); 293e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 294e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap = new HashMap<String, String>(peopleProjectionMap); 295e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.PERSON_ID, 296e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov DataColumns.CONCRETE_CONTACT_ID 297e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AS " + android.provider.Contacts.Phones.PERSON_ID); 298e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.ISPRIMARY, 299e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov DataColumns.CONCRETE_IS_PRIMARY 300e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AS " + android.provider.Contacts.Phones.ISPRIMARY); 301e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER, 302e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Tables.DATA + "." + Phone.NUMBER 303e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NUMBER); 304e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.TYPE, 305e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Tables.DATA + "." + Phone.TYPE 306e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AS " + android.provider.Contacts.Phones.TYPE); 307e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.LABEL, 308e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Tables.DATA + "." + Phone.LABEL 309e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AS " + android.provider.Contacts.Phones.LABEL); 310e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov sPhoneProjectionMap.put(android.provider.Contacts.Phones.NUMBER_KEY, 311e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov PhoneColumns.CONCRETE_NORMALIZED_NUMBER 312e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + " AS " + android.provider.Contacts.Phones.NUMBER_KEY); 313f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 314f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 315f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final Context mContext; 316f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final OpenHelper mOpenHelper; 317f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final ContactsProvider2 mContactsProvider; 318f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private final NameSplitter mPhoneticNameSplitter; 319f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 320e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov /** Precompiled sql statement for incrementing times contacted for an aggregate */ 3213cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private final SQLiteStatement mLastTimeContactedUpdate; 3223cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 3233cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private final ContentValues mValues = new ContentValues(); 3243cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 325f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public LegacyApiSupport(Context context, OpenHelper openHelper, 326f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov ContactsProvider2 contactsProvider) { 327f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContext = context; 328f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContactsProvider = contactsProvider; 329f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mOpenHelper = openHelper; 330f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 331f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mPhoneticNameSplitter = new NameSplitter("", "", "", 332f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov context.getString(com.android.internal.R.string.common_name_conjunctions)); 333f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 334f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov SQLiteDatabase db = mOpenHelper.getReadableDatabase(); 335f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mLastTimeContactedUpdate = db.compileStatement("UPDATE " + Tables.CONTACTS + " SET " 3363cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov + Contacts.TIMES_CONTACTED + "=" 3373cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov + Contacts.TIMES_CONTACTED + "+1," 3383cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov + Contacts.LAST_TIME_CONTACTED + "=? WHERE " 3393cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov + Contacts._ID + "=?"); 340f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 341f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 342f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public Uri insert(Uri uri, ContentValues values) { 343f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final int match = sUriMatcher.match(uri); 344f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long id = 0; 345f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch (match) { 346f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE: 3473cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov id = insertPeople(values); 3483cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 3493cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 3503cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS: 3513cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov id = insertOrganization(values); 352f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 353f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 354e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_CONTACTMETHODS: 355e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov long contactId = Long.parseLong(uri.getPathSegments().get(1)); 356e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov id = insertContactMethod(contactId, values); 357e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 358e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 359e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS: 360e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov id = insertContactMethod(getRequiredContactIdValue(values), values); 361e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 362e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 363e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES: 364e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov id = insertPhone(getRequiredContactIdValue(values), values); 365e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 366e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 367f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov default: 368f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 369f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 370f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 371f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (id < 0) { 372f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return null; 373f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 374f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 375f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final Uri result = ContentUris.withAppendedId(uri, id); 376f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov onChange(result); 377f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return result; 378f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 379f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 380e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private long getRequiredContactIdValue(ContentValues values) { 381e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov if (!values.containsKey(ContactMethods.PERSON_ID)) { 382e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov throw new RuntimeException("Required value: " + ContactMethods.PERSON_ID); 383e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 384e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 385e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov return values.getAsLong(ContactMethods.PERSON_ID); 386e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 387e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 3883cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private long insertPeople(ContentValues values) { 3893cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.clear(); 390f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 391f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // TODO: remove this once not required 3923cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(ContactsContract.Contacts.PACKAGE, "DefaultPackage"); 393f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 3943cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, Contacts.CUSTOM_RINGTONE, 395f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.CUSTOM_RINGTONE); 3963cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyLongValue(mValues, Contacts.SEND_TO_VOICEMAIL, 397f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.SEND_TO_VOICEMAIL); 3983cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyLongValue(mValues, Contacts.LAST_TIME_CONTACTED, 399f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.LAST_TIME_CONTACTED); 4003cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyLongValue(mValues, Contacts.TIMES_CONTACTED, 401f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.TIMES_CONTACTED); 4023cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyLongValue(mValues, Contacts.STARRED, 403f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.STARRED); 4043cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov Uri contactUri = mContactsProvider.insert(Contacts.CONTENT_URI, mValues); 405f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long contactId = ContentUris.parseId(contactUri); 406f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 407f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.NAME) || values.containsKey(People.PHONETIC_NAME)) { 4083cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.clear(); 4093cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(ContactsContract.Data.CONTACT_ID, contactId); 4103cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(ContactsContract.Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 4113cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, StructuredName.DISPLAY_NAME, 412f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov values, People.NAME); 413f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.PHONETIC_NAME)) { 414f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String phoneticName = values.getAsString(People.PHONETIC_NAME); 415f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov NameSplitter.Name parsedName = new NameSplitter.Name(); 416f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mPhoneticNameSplitter.split(parsedName, phoneticName); 4173cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(StructuredName.PHONETIC_GIVEN_NAME, parsedName.getGivenNames()); 4183cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(StructuredName.PHONETIC_MIDDLE_NAME, parsedName.getMiddleName()); 4193cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(StructuredName.PHONETIC_FAMILY_NAME, parsedName.getFamilyName()); 420f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 421f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 4223cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mContactsProvider.insert(ContactsContract.Data.CONTENT_URI, mValues); 423f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 424f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 425f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.NOTES)) { 4263cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.clear(); 4273cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(Data.CONTACT_ID, contactId); 4283cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE); 4293cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, Note.NOTE, values, People.NOTES); 4303cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mContactsProvider.insert(Data.CONTENT_URI, mValues); 431f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 432f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 433f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // TODO instant aggregation 434f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return contactId; 435f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 436f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 4373cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov private long insertOrganization(ContentValues values) { 4383cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.clear(); 4393cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 4403cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyLongValue(mValues, Data.CONTACT_ID, 4413cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.PERSON_ID); 4423cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov mValues.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE); 4433cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 4443cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY, 4453cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.ISPRIMARY); 4463cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 4473cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, Organization.COMPANY, 4483cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.COMPANY); 4493cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 4503cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov // TYPE values happen to remain the same between V1 and V2 - can just copy the value 4513cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyLongValue(mValues, Organization.TYPE, 4523cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.TYPE); 4533cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 4543cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, Organization.LABEL, 4553cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.LABEL); 4563cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov OpenHelper.copyStringValue(mValues, Organization.TITLE, 4573cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov values, android.provider.Contacts.Organizations.TITLE); 4583cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 4593cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues); 4603cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 4613cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov return ContentUris.parseId(uri); 4623cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 463f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 464e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private long insertPhone(long requiredContactIdValue, ContentValues values) { 465e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.clear(); 466e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 467e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyLongValue(mValues, Data.CONTACT_ID, 468e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov values, android.provider.Contacts.Phones.PERSON_ID); 469e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 470e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 471e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY, 472e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov values, android.provider.Contacts.Phones.ISPRIMARY); 473e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 474e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Phone.NUMBER, 475e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov values, android.provider.Contacts.Phones.NUMBER); 476e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 477e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov // TYPE values happen to remain the same between V1 and V2 - can just copy the value 478e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyLongValue(mValues, Phone.TYPE, 479e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov values, android.provider.Contacts.Phones.TYPE); 480e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 481e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, Phone.LABEL, 482e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov values, android.provider.Contacts.Phones.LABEL); 483e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 484e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues); 485e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 486e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov return ContentUris.parseId(uri); 487e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 488e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 489e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private long insertContactMethod(long contactId, ContentValues values) { 490e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Integer kind = values.getAsInteger(ContactMethods.KIND); 491e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov if (kind == null) { 492e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov throw new RuntimeException("Required value: " + ContactMethods.KIND); 493e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 494e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 495e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.clear(); 496e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.put(Data.CONTACT_ID, contactId); 497e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 498e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyLongValue(mValues, Data.IS_PRIMARY, values, ContactMethods.ISPRIMARY); 499e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 500e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov switch (kind) { 501e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case android.provider.Contacts.KIND_EMAIL: 502e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov copyCommonFields(values, Email.CONTENT_ITEM_TYPE, Email.TYPE, Email.LABEL, 503e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Email.DATA, Data.DATA4); 504e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 505e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 506e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case android.provider.Contacts.KIND_IM: 507e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov copyCommonFields(values, Im.CONTENT_ITEM_TYPE, Im.TYPE, Im.LABEL, 508e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Email.DATA, Data.DATA4); 509e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 510e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 511e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case android.provider.Contacts.KIND_POSTAL: 512e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov copyCommonFields(values, Postal.CONTENT_ITEM_TYPE, Postal.TYPE, Postal.LABEL, 513e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Postal.DATA, Data.DATA4); 514e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 515e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 516e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 517e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov Uri uri = mContactsProvider.insert(Data.CONTENT_URI, mValues); 518e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov return ContentUris.parseId(uri); 519e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 520e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 521e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov private void copyCommonFields(ContentValues values, String mimeType, String typeColumn, 522e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov String labelColumn, String dataColumn, String auxDataColumn) { 523e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mValues.put(Data.MIMETYPE, mimeType); 524e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyLongValue(mValues, typeColumn, values, ContactMethods.TYPE); 525e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, labelColumn, values, ContactMethods.LABEL); 526e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, dataColumn, values, ContactMethods.DATA); 527e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov OpenHelper.copyStringValue(mValues, auxDataColumn, values, ContactMethods.AUX_DATA); 528e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 529e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 530f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 531f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final int match = sUriMatcher.match(uri); 532f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov int count; 533f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch(match) { 534f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE_UPDATE_CONTACT_TIME: 535f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov count = updateContactTime(uri, values); 536f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 537f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov default: 538f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 539f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 540f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 541f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (count > 0) { 542f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContext.getContentResolver().notifyChange(uri, null); 543f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 544f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return count; 545f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 546f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 547f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private int updateContactTime(Uri uri, ContentValues values) { 548f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 549f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // TODO check sanctions 550f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 551f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long lastTimeContacted; 552f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (values.containsKey(People.LAST_TIME_CONTACTED)) { 553f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov lastTimeContacted = values.getAsLong(People.LAST_TIME_CONTACTED); 554f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } else { 555f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov lastTimeContacted = System.currentTimeMillis(); 556f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 557f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 558f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long contactId = Long.parseLong(uri.getPathSegments().get(1)); 559f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long aggregateId = mOpenHelper.getAggregateId(contactId); 560f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (aggregateId != 0) { 561f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContactsProvider.updateContactTime(aggregateId, lastTimeContacted); 562f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } else { 563f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mLastTimeContactedUpdate.bindLong(1, lastTimeContacted); 564f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mLastTimeContactedUpdate.bindLong(2, contactId); 565f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mLastTimeContactedUpdate.execute(); 566f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 567f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return 1; 568f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 569f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 5703cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov public int delete(Uri uri, String selection, String[] selectionArgs) { 5713cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov final int match = sUriMatcher.match(uri); 5723cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov int count = 0; 5733cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov switch (match) { 5743cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS_ID: 575e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 576e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov ORGANIZATION_MIME_TYPES); 577e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 578e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 579e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS_ID: 580e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 581e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov CONTACT_METHOD_MIME_TYPES); 582e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 583e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 584e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES_ID: 585e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov count = mContactsProvider.deleteData(ContentUris.parseId(uri), 586e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov PHONE_MIME_TYPES); 5873cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 5883cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 5893cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov default: 5903cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov throw new UnsupportedOperationException("Unknown uri: " + uri); 5913cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 5923cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 5933cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov return count; 5943cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov } 5953cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 596f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 597f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String sortOrder) { 598f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final SQLiteDatabase db = mOpenHelper.getReadableDatabase(); 599f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 600f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String groupBy = null; 601f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov String limit = null; 602f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 603f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final int match = sUriMatcher.match(uri); 604f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov switch (match) { 605f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE: { 606f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.setTables(LegacyTables.PEOPLE); 607f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 608f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 609f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 610f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 611f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov case PEOPLE_ID: 612f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.setTables(LegacyTables.PEOPLE); 613f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.setProjectionMap(sPeopleProjectionMap); 614f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.appendWhere("contacts._id="); 615f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 616f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov break; 617f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 6183cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS: 6193cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov // TODO 6203cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 6213cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 6223cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov case ORGANIZATIONS_ID: 623e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov // TODO exclude mimetype from this join 624e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setTables(Tables.DATA_JOIN_MIMETYPE_CONTACTS); 6253cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov qb.setProjectionMap(sOrganizationProjectionMap); 626e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 627e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + DataColumns.CONCRETE_ID + "="); 628e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 629e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 630e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 631e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS: 632e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov // TODO 633e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 634e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 635e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case CONTACTMETHODS_ID: 636e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setTables(LegacyTables.DATA); 637e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 638e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 639e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + DataColumns.CONCRETE_ID + "="); 640e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 641e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL"); 642e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 643e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 644e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_CONTACTMETHODS: 645e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setTables(LegacyTables.DATA); 646e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 647e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 648e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + DataColumns.CONCRETE_CONTACT_ID + "="); 649e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 650e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL"); 651e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 652e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 653e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_CONTACTMETHODS_ID: 654e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setTables(LegacyTables.DATA); 655e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sContactMethodProjectionMap); 656e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 657e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + DataColumns.CONCRETE_CONTACT_ID + "="); 658e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 659e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + DataColumns.CONCRETE_ID + "="); 660e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 661e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + ContactMethods.KIND + " IS NOT NULL"); 662e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 663e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 664e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES: 665e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov // TODO 666e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 667e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 668e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PHONES_ID: 669e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setTables(LegacyTables.DATA); 670e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 671e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 672e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + DataColumns.CONCRETE_ID + "="); 673e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 674e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 675e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + Phone.CONTENT_ITEM_TYPE + "'"); 676e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 677e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 678e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_PHONES: 679e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setTables(LegacyTables.DATA); 680e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 681e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 682e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + DataColumns.CONCRETE_CONTACT_ID + "="); 683e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 684e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 685e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + Phone.CONTENT_ITEM_TYPE + "'"); 686e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov break; 687e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 688e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov case PEOPLE_PHONES_ID: 689e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setTables(LegacyTables.DATA); 690e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.setProjectionMap(sPhoneProjectionMap); 691e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov mContactsProvider.applyDataRestrictionExceptions(qb); 692e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + DataColumns.CONCRETE_CONTACT_ID + "="); 6933cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(1)); 694e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + DataColumns.CONCRETE_ID + "="); 695e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(uri.getPathSegments().get(3)); 696e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov qb.appendWhere(" AND " + MimetypesColumns.CONCRETE_MIMETYPE + "='" 697e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov + Phone.CONTENT_ITEM_TYPE + "'"); 6983cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov break; 6993cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov 700f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov default: 701f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov throw new IllegalArgumentException("Unknown URL " + uri); 702f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 703f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 704f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov // Perform the query and set the notification uri 705f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov final Cursor c = qb.query(db, projection, selection, selectionArgs, 706f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov groupBy, null, sortOrder, limit); 707f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (c != null) { 708f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov c.setNotificationUri(mContext.getContentResolver(), Contacts.CONTENT_URI); 709f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 710e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov DatabaseUtils.dumpCursor(c); 711f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return c; 712f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 713f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 714f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov /** 715f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * Called when a change has been made. 716f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * 717f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov * @param uri the uri that the change was made to 718f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov */ 719f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private void onChange(Uri uri) { 720f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov mContext.getContentResolver().notifyChange(android.provider.Contacts.CONTENT_URI, null); 721f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 722f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov} 723