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