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