ContactsDatabaseHelper.java revision 069fdf5902415ebd6c92e5d889740e0d50cfec8d
1b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey/* 2b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * Copyright (C) 2009 The Android Open Source Project 3b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * 4b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 5b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * you may not use this file except in compliance with the License. 6b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * You may obtain a copy of the License at 7b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * 8b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 9b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * 10b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * Unless required by applicable law or agreed to in writing, software 11b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 12b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * See the License for the specific language governing permissions and 14b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * limitations under the License 15b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 16b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 1728f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millarpackage com.android.providers.contacts; 18b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 1953214b3ed12b0ff9cb589b6559311f2ac142f2e3Bjorn Bringertimport com.android.common.content.SyncStateContentProviderHelper; 2067dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey 2182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikovimport android.content.ContentResolver; 22619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkeyimport android.content.ContentValues; 23b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkeyimport android.content.Context; 24619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkeyimport android.content.pm.ApplicationInfo; 25619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkeyimport android.content.pm.PackageManager; 26619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkeyimport android.content.pm.PackageManager.NameNotFoundException; 27d91272b48f97243533c6580981e12a4847b5783fJeff Hamiltonimport android.content.res.Resources; 288ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikovimport android.database.CharArrayBuffer; 2936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikovimport android.database.Cursor; 30b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkeyimport android.database.DatabaseUtils; 31f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikovimport android.database.SQLException; 3278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikovimport android.database.sqlite.SQLiteConstraintException; 33b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkeyimport android.database.sqlite.SQLiteDatabase; 34b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkeyimport android.database.sqlite.SQLiteDoneException; 35b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikovimport android.database.sqlite.SQLiteException; 36b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkeyimport android.database.sqlite.SQLiteOpenHelper; 37bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikovimport android.database.sqlite.SQLiteQueryBuilder; 38b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkeyimport android.database.sqlite.SQLiteStatement; 39892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikovimport android.location.CountryDetector; 40fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikovimport android.net.Uri; 414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikovimport android.os.Binder; 42a3bd0246ca3741877488bca7aadd91c79b2fd8d2Fred Quintanaimport android.os.Bundle; 43c085b3eeebf13ebdfb197444747354a1d6eced2bJeff Hamiltonimport android.os.SystemClock; 44b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkeyimport android.provider.BaseColumns; 45e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikovimport android.provider.CallLog.Calls; 46a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikovimport android.provider.ContactsContract; 47b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikovimport android.provider.ContactsContract.AggregationExceptions; 48a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email; 49a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 502a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im; 51a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Nickname; 52a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization; 53a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone; 54a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.SipAddress; 55a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 56d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikovimport android.provider.ContactsContract.Contacts; 573d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikovimport android.provider.ContactsContract.Contacts.Photo; 58de4c4d84028c6c6999c6d9277b54b661f207b992Evan Millarimport android.provider.ContactsContract.Data; 59d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.provider.ContactsContract.Directory; 605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport android.provider.ContactsContract.DisplayNameSources; 615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport android.provider.ContactsContract.FullNameStyle; 62ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkeyimport android.provider.ContactsContract.Groups; 638ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikovimport android.provider.ContactsContract.PhoneticNameStyle; 64d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikovimport android.provider.ContactsContract.RawContacts; 65eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkeyimport android.provider.ContactsContract.Settings; 6682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikovimport android.provider.ContactsContract.StatusUpdates; 6767dde51ab932dc84d95a203b113989b13437f13dJeff Sharkeyimport android.provider.SocialContract.Activities; 68069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjeeimport android.provider.VoicemailContract; 6959f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjeeimport android.provider.VoicemailContract.Voicemails; 70bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikovimport android.telephony.PhoneNumberUtils; 7136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikovimport android.text.TextUtils; 72b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikovimport android.text.util.Rfc822Token; 73b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikovimport android.text.util.Rfc822Tokenizer; 74b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkeyimport android.util.Log; 75b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 76b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkeyimport java.util.HashMap; 775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.util.Locale; 78b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 79b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey/** 80b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov * Database helper for contacts. Designed as a singleton to make sure that all 81b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov * {@link android.content.ContentProvider} users get the same reference. 82b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov * Provides handy methods for maintaining package and mime-type lookup tables. 83b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 84b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov/* package */ class ContactsDatabaseHelper extends SQLiteOpenHelper { 85b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov private static final String TAG = "ContactsDatabaseHelper"; 86b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 8797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov /** 8894c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov * Contacts DB version ranges: 8997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * <pre> 9097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 0-98 Cupcake/Donut 9197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 100-199 Eclair 9297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 200-299 Eclair-MR1 9397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 300-349 Froyo 9497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 350-399 Gingerbread 9597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 400-499 Honeycomb 9624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * 500-549 Honeycomb-MR1 9724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * 550-599 Honeycomb-MR2 9824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * 600-699 Ice Cream Sandwich 9997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * </pre> 10097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov */ 101069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee static final int DATABASE_VERSION = 604; 102e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 103b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private static final String DATABASE_NAME = "contacts2.db"; 1041f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey private static final String DATABASE_PRESENCE = "presence_db"; 105b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 106b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public interface Tables { 107d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONTACTS = "contacts"; 1085ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String RAW_CONTACTS = "raw_contacts"; 109ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String PACKAGES = "packages"; 110ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String MIMETYPES = "mimetypes"; 111b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String PHONE_LOOKUP = "phone_lookup"; 112a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public static final String NAME_LOOKUP = "name_lookup"; 113b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov public static final String AGGREGATION_EXCEPTIONS = "agg_exceptions"; 114eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey public static final String SETTINGS = "settings"; 115b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String DATA = "data"; 116ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String GROUPS = "groups"; 1171f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey public static final String PRESENCE = "presence"; 118e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov public static final String AGGREGATED_PRESENCE = "agg_presence"; 119b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov public static final String NICKNAME_LOOKUP = "nickname_lookup"; 120e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov public static final String CALLS = "calls"; 121a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov public static final String STATUS_UPDATES = "status_updates"; 122b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov public static final String PROPERTIES = "properties"; 123743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov public static final String ACCOUNTS = "accounts"; 1244394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov public static final String VISIBLE_CONTACTS = "visible_contacts"; 125d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public static final String DIRECTORIES = "directories"; 126385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov public static final String DEFAULT_DIRECTORY = "default_directory"; 127f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov public static final String SEARCH_INDEX = "search_index"; 128069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee public static final String VOICEMAIL_STATUS = "voicemail_status"; 129b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 13046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** 13146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * For {@link ContactsContract.DataUsageFeedback}. The table structure itself 13246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * is not exposed outside. 13346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa */ 13446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String DATA_USAGE_STAT = "data_usage_stat"; 13546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 136ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String DATA_JOIN_MIMETYPES = "data " 1371b03c2d019966fba89dad3678dd9f04e4e5f4802Dmitri Plotnikov + "JOIN mimetypes ON (data.mimetype_id = mimetypes._id)"; 138b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 13911944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov public static final String DATA_JOIN_RAW_CONTACTS = "data " 1408e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov + "JOIN raw_contacts ON (data.raw_contact_id = raw_contacts._id)"; 14111944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov 1425ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String DATA_JOIN_MIMETYPE_RAW_CONTACTS = "data " 143c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + "JOIN mimetypes ON (data.mimetype_id = mimetypes._id) " 144c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + "JOIN raw_contacts ON (data.raw_contact_id = raw_contacts._id)"; 145bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 146e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey // NOTE: This requires late binding of GroupMembership MIME-type 147e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey public static final String RAW_CONTACTS_JOIN_SETTINGS_DATA_GROUPS = "raw_contacts " 148e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN settings ON (" 149e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "raw_contacts.account_name = settings.account_name AND " 150e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "raw_contacts.account_type = settings.account_type) " 151e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN data ON (data.mimetype_id=? AND " 152e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "data.raw_contact_id = raw_contacts._id) " 153e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN groups ON (groups._id = data." + GroupMembership.GROUP_ROW_ID 154e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + ")"; 155e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 156e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey // NOTE: This requires late binding of GroupMembership MIME-type 157e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey public static final String SETTINGS_JOIN_RAW_CONTACTS_DATA_MIMETYPES_CONTACTS = "settings " 158e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN raw_contacts ON (" 159e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "raw_contacts.account_name = settings.account_name AND " 160e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "raw_contacts.account_type = settings.account_type) " 161e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN data ON (data.mimetype_id=? AND " 162e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "data.raw_contact_id = raw_contacts._id) " 163e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN contacts ON (raw_contacts.contact_id = contacts._id)"; 164e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 165d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String DATA_JOIN_MIMETYPES_RAW_CONTACTS_CONTACTS = "data " 1661b03c2d019966fba89dad3678dd9f04e4e5f4802Dmitri Plotnikov + "JOIN mimetypes ON (data.mimetype_id = mimetypes._id) " 1671b03c2d019966fba89dad3678dd9f04e4e5f4802Dmitri Plotnikov + "JOIN raw_contacts ON (data.raw_contact_id = raw_contacts._id) " 168d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + "LEFT OUTER JOIN contacts ON (raw_contacts.contact_id = contacts._id)"; 169ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 1705ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String DATA_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_GROUPS = "data " 1711b03c2d019966fba89dad3678dd9f04e4e5f4802Dmitri Plotnikov + "JOIN mimetypes ON (data.mimetype_id = mimetypes._id) " 1721b03c2d019966fba89dad3678dd9f04e4e5f4802Dmitri Plotnikov + "JOIN raw_contacts ON (data.raw_contact_id = raw_contacts._id) " 17367dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey + "LEFT OUTER JOIN packages ON (data.package_id = packages._id) " 1749261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana + "LEFT OUTER JOIN groups " 1759261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana + " ON (mimetypes.mimetype='" + GroupMembership.CONTENT_ITEM_TYPE + "' " 1769261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana + " AND groups._id = data." + GroupMembership.GROUP_ROW_ID + ") "; 177ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 178ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String GROUPS_JOIN_PACKAGES = "groups " 179ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey + "LEFT OUTER JOIN packages ON (groups.package_id = packages._id)"; 180ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 181b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 182b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String ACTIVITIES = "activities"; 183b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 184ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String ACTIVITIES_JOIN_MIMETYPES = "activities " 185ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey + "LEFT OUTER JOIN mimetypes ON (activities.mimetype_id = mimetypes._id)"; 186b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 187d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String ACTIVITIES_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_CONTACTS = 1885ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov "activities " 18967dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey + "LEFT OUTER JOIN packages ON (activities.package_id = packages._id) " 190ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey + "LEFT OUTER JOIN mimetypes ON (activities.mimetype_id = mimetypes._id) " 1915ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + "LEFT OUTER JOIN raw_contacts ON (activities.author_contact_id = " + 192fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "raw_contacts._id) " 193d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + "LEFT OUTER JOIN contacts ON (raw_contacts.contact_id = contacts._id)"; 1947e4676dfcaa8853b81c2133e0e318ed3436fe787Fred Quintana 1955ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String NAME_LOOKUP_JOIN_RAW_CONTACTS = "name_lookup " 1965ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + "INNER JOIN raw_contacts ON (name_lookup.raw_contact_id = raw_contacts._id)"; 197b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 198b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 1994a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public interface Views { 2004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public static final String DATA_ALL = "view_data"; 2014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public static final String DATA_RESTRICTED = "view_data_restricted"; 2024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public static final String RAW_CONTACTS_ALL = "view_raw_contacts"; 2044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public static final String RAW_CONTACTS_RESTRICTED = "view_raw_contacts_restricted"; 2054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2064a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public static final String CONTACTS_ALL = "view_contacts"; 2074a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public static final String CONTACTS_RESTRICTED = "view_contacts_restricted"; 20889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 209a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public static final String ENTITIES = "view_entities"; 210a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public static final String ENTITIES_RESTRICTED = "view_entities_restricted"; 211a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 212a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public static final String RAW_ENTITIES = "view_raw_entities"; 213a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public static final String RAW_ENTITIES_RESTRICTED = "view_raw_entities_restricted"; 214a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 21589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public static final String GROUPS_ALL = "view_groups"; 2162f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 2172f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa public static final String DATA_USAGE_STAT_ALL = "view_data_usage_stat"; 2182f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa public static final String DATA_USAGE_STAT_RESTRICTED = 2192f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa "view_data_usage_stat_restricted"; 2204a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 2214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2221f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey public interface Clauses { 223e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey final String MIMETYPE_IS_GROUP_MEMBERSHIP = MimetypesColumns.CONCRETE_MIMETYPE + "='" 224e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + GroupMembership.CONTENT_ITEM_TYPE + "'"; 225ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 226e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey final String BELONGS_TO_GROUP = DataColumns.CONCRETE_GROUP_ID + "=" 227ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey + GroupsColumns.CONCRETE_ID; 228ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 22968936cefd4caa779169ea00ffd1adc399e634c9bJeff Sharkey final String HAVING_NO_GROUPS = "COUNT(" + DataColumns.CONCRETE_GROUP_ID + ") == 0"; 2309261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 23168936cefd4caa779169ea00ffd1adc399e634c9bJeff Sharkey final String GROUP_BY_ACCOUNT_CONTACT_ID = SettingsColumns.CONCRETE_ACCOUNT_NAME + "," 23268936cefd4caa779169ea00ffd1adc399e634c9bJeff Sharkey + SettingsColumns.CONCRETE_ACCOUNT_TYPE + "," + RawContacts.CONTACT_ID; 233e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 234e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey final String RAW_CONTACT_IS_LOCAL = RawContactsColumns.CONCRETE_ACCOUNT_NAME 235e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + " IS NULL AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " IS NULL"; 236e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 237e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey final String ZERO_GROUP_MEMBERSHIPS = "COUNT(" + GroupsColumns.CONCRETE_ID + ")=0"; 238e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 2391a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final String OUTER_RAW_CONTACTS = "outer_raw_contacts"; 2401a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final String OUTER_RAW_CONTACTS_ID = OUTER_RAW_CONTACTS + "." + RawContacts._ID; 2411a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 242b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov final String CONTACT_IS_VISIBLE = 243b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov "SELECT " + 2441a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey "MAX((SELECT (CASE WHEN " + 245b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov "(CASE" + 246b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " WHEN " + RAW_CONTACT_IS_LOCAL + 247b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " THEN 1 " + 248b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " WHEN " + ZERO_GROUP_MEMBERSHIPS + 249b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " THEN " + Settings.UNGROUPED_VISIBLE + 250b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " ELSE MAX(" + Groups.GROUP_VISIBLE + ")" + 251b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov "END)=1 THEN 1 ELSE 0 END)" + 252b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS_JOIN_SETTINGS_DATA_GROUPS + 2531a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey " WHERE " + RawContactsColumns.CONCRETE_ID + "=" + OUTER_RAW_CONTACTS_ID + "))" + 2541a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey " FROM " + Tables.RAW_CONTACTS + " AS " + OUTER_RAW_CONTACTS + 255b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID + 256b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " GROUP BY " + RawContacts.CONTACT_ID; 257e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 258e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey final String GROUP_HAS_ACCOUNT_AND_SOURCE_ID = Groups.SOURCE_ID + "=? AND " 259e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + Groups.ACCOUNT_NAME + "=? AND " + Groups.ACCOUNT_TYPE + "=?"; 2604394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 2614394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov public static final String CONTACT_VISIBLE = 2624394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "EXISTS (SELECT _id FROM " + Tables.VISIBLE_CONTACTS 2634394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov + " WHERE " + Tables.CONTACTS +"." + Contacts._ID 2644394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov + "=" + Tables.VISIBLE_CONTACTS +"." + Contacts._ID + ")"; 2651f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey } 2661f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey 267d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public interface ContactsColumns { 2684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov /** 2694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov * This flag is set for a contact if it has only one constituent raw contact and 2704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov * it is restricted. 2714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov */ 27267dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey public static final String SINGLE_IS_RESTRICTED = "single_is_restricted"; 273ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 274a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov public static final String LAST_STATUS_UPDATE_ID = "status_update_id"; 275a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 276d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_ID = Tables.CONTACTS + "." + BaseColumns._ID; 27767dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey 278d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_TIMES_CONTACTED = Tables.CONTACTS + "." 279d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + Contacts.TIMES_CONTACTED; 280d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_LAST_TIME_CONTACTED = Tables.CONTACTS + "." 281d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + Contacts.LAST_TIME_CONTACTED; 282d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_STARRED = Tables.CONTACTS + "." + Contacts.STARRED; 283d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_CUSTOM_RINGTONE = Tables.CONTACTS + "." 284d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + Contacts.CUSTOM_RINGTONE; 285d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_SEND_TO_VOICEMAIL = Tables.CONTACTS + "." 286d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + Contacts.SEND_TO_VOICEMAIL; 2872d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill public static final String CONCRETE_LOOKUP_KEY = Tables.CONTACTS + "." 2882d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill + Contacts.LOOKUP_KEY; 289619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } 290619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey 2916cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov public interface RawContactsColumns { 29233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov public static final String CONCRETE_ID = 2935ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + BaseColumns._ID; 2949261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana public static final String CONCRETE_ACCOUNT_NAME = 2955ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_NAME; 2969261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana public static final String CONCRETE_ACCOUNT_TYPE = 2975ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_TYPE; 29833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov public static final String CONCRETE_SOURCE_ID = 2995ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.SOURCE_ID; 30033b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov public static final String CONCRETE_VERSION = 3015ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.VERSION; 30233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov public static final String CONCRETE_DIRTY = 3035ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.DIRTY; 30433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov public static final String CONCRETE_DELETED = 3055ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.DELETED; 3067a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana public static final String CONCRETE_SYNC1 = 3077a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana Tables.RAW_CONTACTS + "." + RawContacts.SYNC1; 3087a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana public static final String CONCRETE_SYNC2 = 3097a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana Tables.RAW_CONTACTS + "." + RawContacts.SYNC2; 3107a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana public static final String CONCRETE_SYNC3 = 3117a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana Tables.RAW_CONTACTS + "." + RawContacts.SYNC3; 3127a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana public static final String CONCRETE_SYNC4 = 3137a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana Tables.RAW_CONTACTS + "." + RawContacts.SYNC4; 31424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public static final String CONCRETE_CUSTOM_RINGTONE = 31524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE; 31624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public static final String CONCRETE_SEND_TO_VOICEMAIL = 31724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL; 31824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public static final String CONCRETE_LAST_TIME_CONTACTED = 31924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED; 32024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public static final String CONCRETE_TIMES_CONTACTED = 32124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED; 322c76d0a78fe2d3471195cfa555bab016eec154f07Jeff Sharkey public static final String CONCRETE_STARRED = 323c76d0a78fe2d3471195cfa555bab016eec154f07Jeff Sharkey Tables.RAW_CONTACTS + "." + RawContacts.STARRED; 324bf6a7e4dece49ba4e7cda17f7ed9250aeb82f731Jeff Sharkey public static final String CONCRETE_IS_RESTRICTED = 325bf6a7e4dece49ba4e7cda17f7ed9250aeb82f731Jeff Sharkey Tables.RAW_CONTACTS + "." + RawContacts.IS_RESTRICTED; 3268e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 3275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public static final String DISPLAY_NAME = RawContacts.DISPLAY_NAME_PRIMARY; 3285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public static final String DISPLAY_NAME_SOURCE = RawContacts.DISPLAY_NAME_SOURCE; 3298e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov public static final String AGGREGATION_NEEDED = "aggregation_needed"; 330fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 331fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov public static final String CONCRETE_DISPLAY_NAME = 332fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Tables.RAW_CONTACTS + "." + DISPLAY_NAME; 333fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov public static final String CONCRETE_CONTACT_ID = 334fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.CONTACT_ID; 335f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov public static final String CONCRETE_NAME_VERIFIED = 336f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.NAME_VERIFIED; 337619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } 338619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey 339619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey public interface DataColumns { 34067dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey public static final String PACKAGE_ID = "package_id"; 341b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String MIMETYPE_ID = "mimetype_id"; 342ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 343ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String CONCRETE_ID = Tables.DATA + "." + BaseColumns._ID; 344226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana public static final String CONCRETE_MIMETYPE_ID = Tables.DATA + "." + MIMETYPE_ID; 345d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_RAW_CONTACT_ID = Tables.DATA + "." 346d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + Data.RAW_CONTACT_ID; 347ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String CONCRETE_GROUP_ID = Tables.DATA + "." 348ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey + GroupMembership.GROUP_ROW_ID; 349e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 350e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA1 = Tables.DATA + "." + Data.DATA1; 351e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA2 = Tables.DATA + "." + Data.DATA2; 352e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA3 = Tables.DATA + "." + Data.DATA3; 353e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA4 = Tables.DATA + "." + Data.DATA4; 354e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA5 = Tables.DATA + "." + Data.DATA5; 355e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA6 = Tables.DATA + "." + Data.DATA6; 356e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA7 = Tables.DATA + "." + Data.DATA7; 357e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA8 = Tables.DATA + "." + Data.DATA8; 358e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA9 = Tables.DATA + "." + Data.DATA9; 359e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA10 = Tables.DATA + "." + Data.DATA10; 3600f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String CONCRETE_DATA11 = Tables.DATA + "." + Data.DATA11; 3610f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String CONCRETE_DATA12 = Tables.DATA + "." + Data.DATA12; 3620f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String CONCRETE_DATA13 = Tables.DATA + "." + Data.DATA13; 3630f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String CONCRETE_DATA14 = Tables.DATA + "." + Data.DATA14; 3640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String CONCRETE_DATA15 = Tables.DATA + "." + Data.DATA15; 365e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_IS_PRIMARY = Tables.DATA + "." + Data.IS_PRIMARY; 366226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana public static final String CONCRETE_PACKAGE_ID = Tables.DATA + "." + PACKAGE_ID; 367e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 368e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 3690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov // Used only for legacy API support 3700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public interface ExtensionsColumns { 3710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String NAME = Data.DATA1; 3720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String VALUE = Data.DATA2; 3730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 3740f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 3750f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public interface GroupMembershipColumns { 3765ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String RAW_CONTACT_ID = Data.RAW_CONTACT_ID; 3770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String GROUP_ROW_ID = GroupMembership.GROUP_ROW_ID; 3780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 3790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 380e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public interface PhoneColumns { 381e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String NORMALIZED_NUMBER = Data.DATA4; 382e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_NORMALIZED_NUMBER = DataColumns.CONCRETE_DATA4; 383ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } 384ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 385ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public interface GroupsColumns { 38667dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey public static final String PACKAGE_ID = "package_id"; 38767dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey 388ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String CONCRETE_ID = Tables.GROUPS + "." + BaseColumns._ID; 38967dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey public static final String CONCRETE_SOURCE_ID = Tables.GROUPS + "." + Groups.SOURCE_ID; 390341e4621f2ee7614c66bc25dd3da70eaaa866b46Jeff Sharkey public static final String CONCRETE_ACCOUNT_NAME = Tables.GROUPS + "." + Groups.ACCOUNT_NAME; 391341e4621f2ee7614c66bc25dd3da70eaaa866b46Jeff Sharkey public static final String CONCRETE_ACCOUNT_TYPE = Tables.GROUPS + "." + Groups.ACCOUNT_TYPE; 392341e4621f2ee7614c66bc25dd3da70eaaa866b46Jeff Sharkey } 393b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 394b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public interface ActivitiesColumns { 395b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String PACKAGE_ID = "package_id"; 396b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String MIMETYPE_ID = "mimetype_id"; 397b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 398b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 399b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public interface PhoneLookupColumns { 400b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String _ID = BaseColumns._ID; 401b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String DATA_ID = "data_id"; 4025ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String RAW_CONTACT_ID = "raw_contact_id"; 403b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String NORMALIZED_NUMBER = "normalized_number"; 40436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov public static final String MIN_MATCH = "min_match"; 405b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 406b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 407a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public interface NameLookupColumns { 4085ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String RAW_CONTACT_ID = "raw_contact_id"; 40914bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov public static final String DATA_ID = "data_id"; 410a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public static final String NORMALIZED_NAME = "normalized_name"; 411a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public static final String NAME_TYPE = "name_type"; 412a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov } 413a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 414a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public final static class NameLookupType { 4152a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov public static final int NAME_EXACT = 0; 4162a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov public static final int NAME_VARIANT = 1; 4172a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov public static final int NAME_COLLATION_KEY = 2; 4182a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov public static final int NICKNAME = 3; 4192a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov public static final int EMAIL_BASED_NICKNAME = 4; 420a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 421a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov // This is the highest name lookup type code plus one 42292ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov public static final int TYPE_COUNT = 5; 423a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 424a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public static boolean isBasedOnStructuredName(int nameLookupType) { 4252a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov return nameLookupType == NameLookupType.NAME_EXACT 4262a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov || nameLookupType == NameLookupType.NAME_VARIANT 4272a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov || nameLookupType == NameLookupType.NAME_COLLATION_KEY; 428a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov } 429a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov } 430a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 431ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public interface PackagesColumns { 432b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String _ID = BaseColumns._ID; 433b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String PACKAGE = "package"; 434226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana 435226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana public static final String CONCRETE_ID = Tables.PACKAGES + "." + _ID; 436b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 437b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 438ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public interface MimetypesColumns { 439b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String _ID = BaseColumns._ID; 440b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String MIMETYPE = "mimetype"; 441ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 442ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String CONCRETE_ID = Tables.MIMETYPES + "." + BaseColumns._ID; 443ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String CONCRETE_MIMETYPE = Tables.MIMETYPES + "." + MIMETYPE; 444b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 445b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 446b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov public interface AggregationExceptionColumns { 447b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov public static final String _ID = BaseColumns._ID; 448b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov } 449b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 450b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov public interface NicknameLookupColumns { 451b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov public static final String NAME = "name"; 452b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov public static final String CLUSTER = "cluster"; 453b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 454b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 455e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey public interface SettingsColumns { 456e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey public static final String CONCRETE_ACCOUNT_NAME = Tables.SETTINGS + "." 457e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + Settings.ACCOUNT_NAME; 458e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey public static final String CONCRETE_ACCOUNT_TYPE = Tables.SETTINGS + "." 459e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + Settings.ACCOUNT_TYPE; 460e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey } 461e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 4624dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov public interface PresenceColumns { 4634dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov String RAW_CONTACT_ID = "presence_raw_contact_id"; 464bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov String CONTACT_ID = "presence_contact_id"; 4654dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov } 4664dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 467e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov public interface AggregatedPresenceColumns { 468e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov String CONTACT_ID = "presence_contact_id"; 4693296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 4703296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_CONTACT_ID = Tables.AGGREGATED_PRESENCE + "." + CONTACT_ID; 471e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov } 472e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov 473a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov public interface StatusUpdatesColumns { 474a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov String DATA_ID = "status_update_data_id"; 4753296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 4763296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_DATA_ID = Tables.STATUS_UPDATES + "." + DATA_ID; 4773296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 4783296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_PRESENCE = Tables.STATUS_UPDATES + "." + StatusUpdates.PRESENCE; 4793296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS = Tables.STATUS_UPDATES + "." + StatusUpdates.STATUS; 4803296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_TIMESTAMP = Tables.STATUS_UPDATES + "." 4813296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey + StatusUpdates.STATUS_TIMESTAMP; 4823296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_RES_PACKAGE = Tables.STATUS_UPDATES + "." 4833296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey + StatusUpdates.STATUS_RES_PACKAGE; 4843296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_LABEL = Tables.STATUS_UPDATES + "." + StatusUpdates.STATUS_LABEL; 4853296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_ICON = Tables.STATUS_UPDATES + "." + StatusUpdates.STATUS_ICON; 4863296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey } 4873296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 4883296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey public interface ContactsStatusUpdatesColumns { 4893296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String ALIAS = "contacts_" + Tables.STATUS_UPDATES; 4903296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 4913296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_DATA_ID = ALIAS + "." + StatusUpdatesColumns.DATA_ID; 4923296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 4933296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_PRESENCE = ALIAS + "." + StatusUpdates.PRESENCE; 4943296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS = ALIAS + "." + StatusUpdates.STATUS; 4953296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_TIMESTAMP = ALIAS + "." + StatusUpdates.STATUS_TIMESTAMP; 4963296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_RES_PACKAGE = ALIAS + "." + StatusUpdates.STATUS_RES_PACKAGE; 4973296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_LABEL = ALIAS + "." + StatusUpdates.STATUS_LABEL; 4983296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_ICON = ALIAS + "." + StatusUpdates.STATUS_ICON; 499a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov } 500a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 501b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov public interface PropertiesColumns { 502b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov String PROPERTY_KEY = "property_key"; 503b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov String PROPERTY_VALUE = "property_value"; 504b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 505b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 50624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public interface AccountsColumns { 50724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String ACCOUNT_NAME = RawContacts.ACCOUNT_NAME; 50824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String ACCOUNT_TYPE = RawContacts.ACCOUNT_TYPE; 50924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String PROFILE_RAW_CONTACT_ID = "profile_raw_contact_id"; 51024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 51124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 512e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov public static final class DirectoryColumns { 513e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov public static final String TYPE_RESOURCE_NAME = "typeResourceName"; 514e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov } 515e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov 516f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov public static final class SearchIndexColumns { 517f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov public static final String CONTACT_ID = "contact_id"; 518f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov public static final String CONTENT = "content"; 519155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov public static final String NAME = "name"; 520f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov public static final String TOKENS = "tokens"; 521f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 522f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 52346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** 52446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * Private table for calculating per-contact-method ranking. 52546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa */ 52646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final class DataUsageStatColumns { 52746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** type: INTEGER (long) */ 52846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String _ID = "stat_id"; 52946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String CONCRETE_ID = Tables.DATA_USAGE_STAT + "." + _ID; 53046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 53146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** type: INTEGER (long) */ 53246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String DATA_ID = "data_id"; 53346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String CONCRETE_DATA_ID = Tables.DATA_USAGE_STAT + "." + DATA_ID; 53446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 53546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** type: INTEGER (long) */ 53646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String LAST_TIME_USED = "last_time_used"; 53746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String CONCRETE_LAST_TIME_USED = 53846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Tables.DATA_USAGE_STAT + "." + LAST_TIME_USED; 53946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 54046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** type: INTEGER */ 54146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String TIMES_USED = "times_used"; 54246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String CONCRETE_TIMES_USED = 54346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Tables.DATA_USAGE_STAT + "." + TIMES_USED; 54446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 54546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** type: INTEGER */ 54646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String USAGE_TYPE_INT = "usage_type"; 54746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String CONCRETE_USAGE_TYPE = 54846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Tables.DATA_USAGE_STAT + "." + USAGE_TYPE_INT; 54946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 55046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** 55146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * Integer values for USAGE_TYPE. 55246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * 55346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * @see ContactsContract.DataUsageFeedback#USAGE_TYPE 55446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa */ 55546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final int USAGE_TYPE_INT_CALL = 0; 55646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final int USAGE_TYPE_INT_LONG_TEXT = 1; 55746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final int USAGE_TYPE_INT_SHORT_TEXT = 2; 55846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa } 55946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 5603296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey /** In-memory cache of previously found MIME-type mappings */ 561bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov private final HashMap<String, Long> mMimetypeCache = new HashMap<String, Long>(); 562b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** In-memory cache of previously found package name mappings */ 563bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov private final HashMap<String, Long> mPackageCache = new HashMap<String, Long>(); 564b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 5652a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdEmail; 5662a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdIm; 567a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov private long mMimeTypeIdSip; 5682a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdStructuredName; 5692a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdOrganization; 5702a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdNickname; 5712a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdPhone; 572b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 573b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** Compiled statements for querying and inserting mappings */ 574b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mMimetypeQuery; 575b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mPackageQuery; 576d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov private SQLiteStatement mContactIdQuery; 577f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private SQLiteStatement mAggregationModeQuery; 578b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mMimetypeInsert; 579b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mPackageInsert; 580b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mDataMimetypeQuery; 581b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mActivitiesMimetypeQuery; 582b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 58378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** Precompiled sql statement for setting a data record to the primary. */ 58478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mSetPrimaryStatement; 58578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** Precompiled sql statement for setting a data record to the super primary. */ 58678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mSetSuperPrimaryStatement; 58778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** Precompiled sql statement for clearing super primary of a single record. */ 58878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mClearSuperPrimaryStatement; 58978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** Precompiled sql statement for updating a contact display name */ 59078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mRawContactDisplayNameUpdate; 59178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 59278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mNameLookupInsert; 59378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mNameLookupDelete; 59478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mStatusUpdateAutoTimestamp; 59578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mStatusUpdateInsert; 59678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mStatusUpdateReplace; 59778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mStatusAttributionUpdate; 59878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mStatusUpdateDelete; 59978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mResetNameVerifiedForOtherRawContacts; 600f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov private SQLiteStatement mContactInDefaultDirectoryQuery; 60178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 602b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov private final Context mContext; 6032a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private final boolean mDatabaseOptimizationEnabled; 60435ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana private final SyncStateContentProviderHelper mSyncState; 605e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov private final CountryMonitor mCountryMonitor; 6065df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov private StringBuilder mSb = new StringBuilder(); 607f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov 608f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov private boolean mReopenDatabase = false; 609f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 610b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov private static ContactsDatabaseHelper sSingleton = null; 611b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 61236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov private boolean mUseStrictPhoneNumberComparison; 6133a6a49cfb06272e3e25f3c390a9cf4002da6e34dDaisuke Miyakawa 614d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton /** 615d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton * List of package names with access to {@link RawContacts#IS_RESTRICTED} data. 616d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton */ 617d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton private String[] mUnrestrictedPackages; 618d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton 6198ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov private String[] mSelectionArgs1 = new String[1]; 6208ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov private NameSplitter.Name mName = new NameSplitter.Name(); 6218ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov private CharArrayBuffer mCharArrayBuffer = new CharArrayBuffer(128); 6228ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov private NameSplitter mNameSplitter; 623f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 624b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov public static synchronized ContactsDatabaseHelper getInstance(Context context) { 625b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey if (sSingleton == null) { 6262a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov sSingleton = new ContactsDatabaseHelper(context, DATABASE_NAME, true); 627b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 628b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return sSingleton; 629b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 630b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 6311f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey /** 63231b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov * Private constructor, callers except unit tests should obtain an instance through 63335ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana * {@link #getInstance(android.content.Context)} instead. 6341f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey */ 635b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper(Context context) { 6362a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov this(context, null, false); 6372a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 6382a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 6392a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private ContactsDatabaseHelper( 6402a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov Context context, String databaseName, boolean optimizationEnabled) { 6412a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov super(context, databaseName, null, DATABASE_VERSION); 6422a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mDatabaseOptimizationEnabled = optimizationEnabled; 643d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton Resources resources = context.getResources(); 644619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey 645b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov mContext = context; 64628b3769e3fcecae56c3fc70cbcb0f95282b9640eFred Quintana mSyncState = new SyncStateContentProviderHelper(); 647e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov mCountryMonitor = new CountryMonitor(context); 64836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov mUseStrictPhoneNumberComparison = 649d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton resources.getBoolean( 650d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton com.android.internal.R.bool.config_use_strict_phone_number_comparation); 6510f5116227592cb8e724542c598daffa383964679Dmitri Plotnikov int resourceId = resources.getIdentifier("unrestricted_packages", "array", 6520f5116227592cb8e724542c598daffa383964679Dmitri Plotnikov context.getPackageName()); 6530f5116227592cb8e724542c598daffa383964679Dmitri Plotnikov if (resourceId != 0) { 6540f5116227592cb8e724542c598daffa383964679Dmitri Plotnikov mUnrestrictedPackages = resources.getStringArray(resourceId); 6550f5116227592cb8e724542c598daffa383964679Dmitri Plotnikov } else { 6560f5116227592cb8e724542c598daffa383964679Dmitri Plotnikov mUnrestrictedPackages = new String[0]; 6570f5116227592cb8e724542c598daffa383964679Dmitri Plotnikov } 658b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 659b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 6602a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private void refreshDatabaseCaches(SQLiteDatabase db) { 66178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateDelete = null; 66278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateReplace = null; 66378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateInsert = null; 66478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateAutoTimestamp = null; 66578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusAttributionUpdate = null; 66678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mResetNameVerifiedForOtherRawContacts = null; 66778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mRawContactDisplayNameUpdate = null; 66878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement = null; 66978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mClearSuperPrimaryStatement = null; 67078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement = null; 67178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert = null; 67278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupDelete = null; 67378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mPackageQuery = null; 67478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mPackageInsert = null; 67578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mDataMimetypeQuery = null; 67678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mActivitiesMimetypeQuery = null; 67778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mContactIdQuery = null; 67878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mAggregationModeQuery = null; 679f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov mContactInDefaultDirectoryQuery = null; 6802a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 68155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov populateMimeTypeCache(db); 68255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 68355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 68455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov private void populateMimeTypeCache(SQLiteDatabase db) { 6852a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimetypeCache.clear(); 6862a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mPackageCache.clear(); 6872a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 6882a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimetypeQuery = db.compileStatement( 6892a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov "SELECT " + MimetypesColumns._ID + 6902a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov " FROM " + Tables.MIMETYPES + 6912a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov " WHERE " + MimetypesColumns.MIMETYPE + "=?"); 6922a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 6932a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimetypeInsert = db.compileStatement( 6942a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov "INSERT INTO " + Tables.MIMETYPES + "(" 6952a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov + MimetypesColumns.MIMETYPE + 6962a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov ") VALUES (?)"); 6972a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 6982a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdEmail = getMimeTypeId(Email.CONTENT_ITEM_TYPE); 6992a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdIm = getMimeTypeId(Im.CONTENT_ITEM_TYPE); 700a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov mMimeTypeIdSip = getMimeTypeId(SipAddress.CONTENT_ITEM_TYPE); 7012a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdStructuredName = getMimeTypeId(StructuredName.CONTENT_ITEM_TYPE); 7022a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdOrganization = getMimeTypeId(Organization.CONTENT_ITEM_TYPE); 7032a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdNickname = getMimeTypeId(Nickname.CONTENT_ITEM_TYPE); 7042a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdPhone = getMimeTypeId(Phone.CONTENT_ITEM_TYPE); 70578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 70678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 707b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey @Override 708b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public void onOpen(SQLiteDatabase db) { 7092a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov refreshDatabaseCaches(db); 71035ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana 71178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSyncState.onDatabaseOpened(db); 7121f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey 7131f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey db.execSQL("ATTACH DATABASE ':memory:' AS " + DATABASE_PRESENCE + ";"); 714e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov db.execSQL("CREATE TABLE IF NOT EXISTS " + DATABASE_PRESENCE + "." + Tables.PRESENCE + " ("+ 71582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.DATA_ID + " INTEGER PRIMARY KEY REFERENCES data(_id)," + 71682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.PROTOCOL + " INTEGER NOT NULL," + 71782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.CUSTOM_PROTOCOL + " TEXT," + 71882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.IM_HANDLE + " TEXT," + 71982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.IM_ACCOUNT + " TEXT," + 720a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov PresenceColumns.CONTACT_ID + " INTEGER REFERENCES contacts(_id)," + 721a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov PresenceColumns.RAW_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)," + 72282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.PRESENCE + " INTEGER," + 723aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CHAT_CAPABILITY + " INTEGER NOT NULL DEFAULT 0," + 72482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov "UNIQUE(" + StatusUpdates.PROTOCOL + ", " + StatusUpdates.CUSTOM_PROTOCOL 72582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov + ", " + StatusUpdates.IM_HANDLE + ", " + StatusUpdates.IM_ACCOUNT + ")" + 7261f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey ");"); 7271f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey 728e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov db.execSQL("CREATE INDEX IF NOT EXISTS " + DATABASE_PRESENCE + ".presenceIndex" + " ON " 7294dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov + Tables.PRESENCE + " (" + PresenceColumns.RAW_CONTACT_ID + ");"); 73009562b6c3a420ded0d02b9bd2290de2dbab9e304Vasu Nori db.execSQL("CREATE INDEX IF NOT EXISTS " + DATABASE_PRESENCE + ".presenceIndex2" + " ON " 73109562b6c3a420ded0d02b9bd2290de2dbab9e304Vasu Nori + Tables.PRESENCE + " (" + PresenceColumns.CONTACT_ID + ");"); 732e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov 733e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov db.execSQL("CREATE TABLE IF NOT EXISTS " 734aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori + DATABASE_PRESENCE + "." + Tables.AGGREGATED_PRESENCE + " ("+ 735e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov AggregatedPresenceColumns.CONTACT_ID 736e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov + " INTEGER PRIMARY KEY REFERENCES contacts(_id)," + 737632248ae0053fa99b1f5b4cfaab3e55b7453fcb1Vasu Nori StatusUpdates.PRESENCE + " INTEGER," + 738aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CHAT_CAPABILITY + " INTEGER NOT NULL DEFAULT 0" + 739e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov ");"); 740bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 741bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 742bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov db.execSQL("CREATE TRIGGER " + DATABASE_PRESENCE + "." + Tables.PRESENCE + "_deleted" 743bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " BEFORE DELETE ON " + DATABASE_PRESENCE + "." + Tables.PRESENCE 744bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " BEGIN " 745bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " DELETE FROM " + Tables.AGGREGATED_PRESENCE 746bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " WHERE " + AggregatedPresenceColumns.CONTACT_ID + " = " + 747bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov "(SELECT " + PresenceColumns.CONTACT_ID + 748bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " FROM " + Tables.PRESENCE + 749bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " WHERE " + PresenceColumns.RAW_CONTACT_ID 750bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + "=OLD." + PresenceColumns.RAW_CONTACT_ID + 751bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " AND NOT EXISTS" + 752bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov "(SELECT " + PresenceColumns.RAW_CONTACT_ID + 753bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " FROM " + Tables.PRESENCE + 754bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " WHERE " + PresenceColumns.CONTACT_ID 755bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + "=OLD." + PresenceColumns.CONTACT_ID + 756bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " AND " + PresenceColumns.RAW_CONTACT_ID 757bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + "!=OLD." + PresenceColumns.RAW_CONTACT_ID + "));" 758bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " END"); 759bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 760aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori final String replaceAggregatePresenceSql = 761aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "INSERT OR REPLACE INTO " + Tables.AGGREGATED_PRESENCE + "(" 762093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + AggregatedPresenceColumns.CONTACT_ID + ", " 763093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + StatusUpdates.PRESENCE + ", " 764093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + StatusUpdates.CHAT_CAPABILITY + ")" 765093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " SELECT " 766093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + PresenceColumns.CONTACT_ID + "," 767093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + StatusUpdates.PRESENCE + "," 768093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + StatusUpdates.CHAT_CAPABILITY 769aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori + " FROM " + Tables.PRESENCE 770aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori + " WHERE " 771093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " (ifnull(" + StatusUpdates.PRESENCE + ",0) * 10 " 772093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + "+ ifnull(" + StatusUpdates.CHAT_CAPABILITY + ", 0))" 773093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " = (SELECT " 774093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + "MAX (ifnull(" + StatusUpdates.PRESENCE + ",0) * 10 " 775093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + "+ ifnull(" + StatusUpdates.CHAT_CAPABILITY + ", 0))" 776093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " FROM " + Tables.PRESENCE 777093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " WHERE " + PresenceColumns.CONTACT_ID 778093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + "=NEW." + PresenceColumns.CONTACT_ID 779093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + ")" 780093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " AND " + PresenceColumns.CONTACT_ID + "=NEW." + PresenceColumns.CONTACT_ID + ";"; 781bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 782bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov db.execSQL("CREATE TRIGGER " + DATABASE_PRESENCE + "." + Tables.PRESENCE + "_inserted" 783bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " AFTER INSERT ON " + DATABASE_PRESENCE + "." + Tables.PRESENCE 784bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " BEGIN " 785bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + replaceAggregatePresenceSql 786bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " END"); 787bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 788bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov db.execSQL("CREATE TRIGGER " + DATABASE_PRESENCE + "." + Tables.PRESENCE + "_updated" 789bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " AFTER UPDATE ON " + DATABASE_PRESENCE + "." + Tables.PRESENCE 790bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " BEGIN " 791bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + replaceAggregatePresenceSql 792bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " END"); 793b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 794b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 795b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey @Override 796b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public void onCreate(SQLiteDatabase db) { 797069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee Log.i(TAG, "Bootstrapping database version: " + DATABASE_VERSION); 798b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 79935ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana mSyncState.createDatabase(db); 80035ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana 801b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // One row per group of contacts corresponding to the same person 802d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.CONTACTS + " (" + 803b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 804fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)," + 805d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.PHOTO_ID + " INTEGER REFERENCES data(_id)," + 806d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.CUSTOM_RINGTONE + " TEXT," + 807d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.SEND_TO_VOICEMAIL + " INTEGER NOT NULL DEFAULT 0," + 808d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.TIMES_CONTACTED + " INTEGER NOT NULL DEFAULT 0," + 809d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.LAST_TIME_CONTACTED + " INTEGER," + 810d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.STARRED + " INTEGER NOT NULL DEFAULT 0," + 811f992bfab334b760d36a053fc0b439382dcfb51adDmitri Plotnikov Contacts.HAS_PHONE_NUMBER + " INTEGER NOT NULL DEFAULT 0," + 8125870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov Contacts.LOOKUP_KEY + " TEXT," + 813a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov ContactsColumns.LAST_STATUS_UPDATE_ID + " INTEGER REFERENCES data(_id)," + 8144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContactsColumns.SINGLE_IS_RESTRICTED + " INTEGER NOT NULL DEFAULT 0" + 815b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 816b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 81754d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov db.execSQL("CREATE INDEX contacts_has_phone_index ON " + Tables.CONTACTS + " (" + 81854d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER + 81954d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov ");"); 82054d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov 82154d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov db.execSQL("CREATE INDEX contacts_restricted_index ON " + Tables.CONTACTS + " (" + 82254d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov ContactsColumns.SINGLE_IS_RESTRICTED + 82354d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov ");"); 82454d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov 825fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL("CREATE INDEX contacts_name_raw_contact_id_index ON " + Tables.CONTACTS + " (" + 826fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID + 827fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ");"); 828fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 829b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Contacts table 8305ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.RAW_CONTACTS + " (" + 8316cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 8326cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.IS_RESTRICTED + " INTEGER DEFAULT 0," + 8336cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.ACCOUNT_NAME + " STRING DEFAULT NULL, " + 8346cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.ACCOUNT_TYPE + " STRING DEFAULT NULL, " + 8356cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.SOURCE_ID + " TEXT," + 83697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov RawContacts.RAW_CONTACT_IS_READ_ONLY + " INTEGER NOT NULL DEFAULT 0," + 8376cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.VERSION + " INTEGER NOT NULL DEFAULT 1," + 83873776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov RawContacts.DIRTY + " INTEGER NOT NULL DEFAULT 0," + 83933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov RawContacts.DELETED + " INTEGER NOT NULL DEFAULT 0," + 84054d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov RawContacts.CONTACT_ID + " INTEGER REFERENCES contacts(_id)," + 8416cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.AGGREGATION_MODE + " INTEGER NOT NULL DEFAULT " + 8426cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.AGGREGATION_MODE_DEFAULT + "," + 8438e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov RawContactsColumns.AGGREGATION_NEEDED + " INTEGER NOT NULL DEFAULT 1," + 8446cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.CUSTOM_RINGTONE + " TEXT," + 8456cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.SEND_TO_VOICEMAIL + " INTEGER NOT NULL DEFAULT 0," + 8466cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.TIMES_CONTACTED + " INTEGER NOT NULL DEFAULT 0," + 8476cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.LAST_TIME_CONTACTED + " INTEGER," + 84833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov RawContacts.STARRED + " INTEGER NOT NULL DEFAULT 0," + 8495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_PRIMARY + " TEXT," + 8505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_ALTERNATIVE + " TEXT," + 8515dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_SOURCE + " INTEGER NOT NULL DEFAULT " + 85225abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov DisplayNameSources.UNDEFINED + "," + 8535dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.PHONETIC_NAME + " TEXT," + 8545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.PHONETIC_NAME_STYLE + " TEXT," + 855de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa RawContacts.SORT_KEY_PRIMARY + " TEXT COLLATE " + 856de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa ContactsProvider2.PHONEBOOK_COLLATOR_NAME + "," + 857de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa RawContacts.SORT_KEY_ALTERNATIVE + " TEXT COLLATE " + 858de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa ContactsProvider2.PHONEBOOK_COLLATOR_NAME + "," + 859f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov RawContacts.NAME_VERIFIED + " INTEGER NOT NULL DEFAULT 0," + 8603cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov RawContacts.SYNC1 + " TEXT, " + 8613cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov RawContacts.SYNC2 + " TEXT, " + 8623cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov RawContacts.SYNC3 + " TEXT, " + 8633cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov RawContacts.SYNC4 + " TEXT " + 864b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 865b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 86654d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contacts_contact_id_index ON " + Tables.RAW_CONTACTS + " (" + 86754d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov RawContacts.CONTACT_ID + 86854d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov ");"); 86954d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov 8705f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contacts_source_id_index ON " + Tables.RAW_CONTACTS + " (" + 8715f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov RawContacts.SOURCE_ID + ", " + 8725f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 8735f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov RawContacts.ACCOUNT_NAME + 8745f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov ");"); 8755f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov 876f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov // TODO readd the index and investigate a controlled use of it 877f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov// db.execSQL("CREATE INDEX raw_contacts_agg_index ON " + Tables.RAW_CONTACTS + " (" + 878f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov// RawContactsColumns.AGGREGATION_NEEDED + 879f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov// ");"); 8808e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 881b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Package name mapping table 882ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey db.execSQL("CREATE TABLE " + Tables.PACKAGES + " (" + 883ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey PackagesColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 884ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey PackagesColumns.PACKAGE + " TEXT NOT NULL" + 885b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 886b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 887ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Mimetype mapping table 888ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey db.execSQL("CREATE TABLE " + Tables.MIMETYPES + " (" + 889ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey MimetypesColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 890ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey MimetypesColumns.MIMETYPE + " TEXT NOT NULL" + 891b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 892b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 89308768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov // Mimetype table requires an index on mime type 89408768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov db.execSQL("CREATE UNIQUE INDEX mime_type ON " + Tables.MIMETYPES + " (" + 89508768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov MimetypesColumns.MIMETYPE + 89608768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov ");"); 89708768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov 898b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Public generic data table 899b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey db.execSQL("CREATE TABLE " + Tables.DATA + " (" + 900b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Data._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 90167dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey DataColumns.PACKAGE_ID + " INTEGER REFERENCES package(_id)," + 902b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey DataColumns.MIMETYPE_ID + " INTEGER REFERENCES mimetype(_id) NOT NULL," + 90311944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov Data.RAW_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id) NOT NULL," + 90497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Data.IS_READ_ONLY + " INTEGER NOT NULL DEFAULT 0," + 905f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.IS_PRIMARY + " INTEGER NOT NULL DEFAULT 0," + 906f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.IS_SUPER_PRIMARY + " INTEGER NOT NULL DEFAULT 0," + 907f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA_VERSION + " INTEGER NOT NULL DEFAULT 0," + 908f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA1 + " TEXT," + 909f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA2 + " TEXT," + 910f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA3 + " TEXT," + 911f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA4 + " TEXT," + 912f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA5 + " TEXT," + 913f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA6 + " TEXT," + 914f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA7 + " TEXT," + 915f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA8 + " TEXT," + 916f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA9 + " TEXT," + 91767dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Data.DATA10 + " TEXT," + 91867dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Data.DATA11 + " TEXT," + 91967dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Data.DATA12 + " TEXT," + 92067dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Data.DATA13 + " TEXT," + 92167dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Data.DATA14 + " TEXT," + 9223cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Data.DATA15 + " TEXT," + 9233cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Data.SYNC1 + " TEXT, " + 9243cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Data.SYNC2 + " TEXT, " + 9253cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Data.SYNC3 + " TEXT, " + 9263cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Data.SYNC4 + " TEXT " + 927b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 928b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 92911944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov db.execSQL("CREATE INDEX data_raw_contact_id ON " + Tables.DATA + " (" + 93011944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov Data.RAW_CONTACT_ID + 93111944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov ");"); 93211944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov 93311944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov /** 93411944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov * For email lookup and similar queries. 93511944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov */ 936f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov db.execSQL("CREATE INDEX data_mimetype_data1_index ON " + Tables.DATA + " (" + 93711944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov DataColumns.MIMETYPE_ID + "," + 938f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov Data.DATA1 + 93911944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov ");"); 94011944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov 941b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Private phone numbers table used for lookup 942b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey db.execSQL("CREATE TABLE " + Tables.PHONE_LOOKUP + " (" + 943f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov PhoneLookupColumns.DATA_ID 944892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + " INTEGER REFERENCES data(_id) NOT NULL," + 9455ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID 9465ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " INTEGER REFERENCES raw_contacts(_id) NOT NULL," + 94736045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.NORMALIZED_NUMBER + " TEXT NOT NULL," + 94836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.MIN_MATCH + " TEXT NOT NULL" + 949b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 950b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 951b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey db.execSQL("CREATE INDEX phone_lookup_index ON " + Tables.PHONE_LOOKUP + " (" + 952f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov PhoneLookupColumns.NORMALIZED_NUMBER + "," + 953f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID + "," + 954b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey PhoneLookupColumns.DATA_ID + 955b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 956b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 95736045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_min_match_index ON " + Tables.PHONE_LOOKUP + " (" + 95836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.MIN_MATCH + "," + 95936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID + "," + 96036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.DATA_ID + 96136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov ");"); 96236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 963d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_data_id_min_match_index ON " + Tables.PHONE_LOOKUP + 964d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov " (" + PhoneLookupColumns.DATA_ID + ", " + PhoneLookupColumns.MIN_MATCH + ");"); 965d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov 966a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov // Private name/nickname table used for lookup 967a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.NAME_LOOKUP + " (" + 96814bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov NameLookupColumns.DATA_ID 96914bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov + " INTEGER REFERENCES data(_id) NOT NULL," + 9705ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov NameLookupColumns.RAW_CONTACT_ID 9715ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " INTEGER REFERENCES raw_contacts(_id) NOT NULL," + 97211944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov NameLookupColumns.NORMALIZED_NAME + " TEXT NOT NULL," + 97311944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov NameLookupColumns.NAME_TYPE + " INTEGER NOT NULL," + 97414bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov "PRIMARY KEY (" 97514bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov + NameLookupColumns.DATA_ID + ", " 97611944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov + NameLookupColumns.NORMALIZED_NAME + ", " 97711944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov + NameLookupColumns.NAME_TYPE + ")" + 978a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov ");"); 979a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 98014bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov db.execSQL("CREATE INDEX name_lookup_raw_contact_id_index ON " + Tables.NAME_LOOKUP + " (" + 98114bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov NameLookupColumns.RAW_CONTACT_ID + 98214bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov ");"); 98314bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov 984b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.NICKNAME_LOOKUP + " (" + 985b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov NicknameLookupColumns.NAME + " TEXT," + 986b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov NicknameLookupColumns.CLUSTER + " TEXT" + 987b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov ");"); 988b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 989b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov db.execSQL("CREATE UNIQUE INDEX nickname_lookup_index ON " + Tables.NICKNAME_LOOKUP + " (" + 990b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov NicknameLookupColumns.NAME + ", " + 991b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov NicknameLookupColumns.CLUSTER + 992b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov ");"); 993b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 994ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Groups table 995ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey db.execSQL("CREATE TABLE " + Tables.GROUPS + " (" + 996ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey Groups._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 99767dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey GroupsColumns.PACKAGE_ID + " INTEGER REFERENCES package(_id)," + 998035b4cc204be2641079a0b04e9ee9791a8f8248bFred Quintana Groups.ACCOUNT_NAME + " STRING DEFAULT NULL, " + 999035b4cc204be2641079a0b04e9ee9791a8f8248bFred Quintana Groups.ACCOUNT_TYPE + " STRING DEFAULT NULL, " + 1000ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey Groups.SOURCE_ID + " TEXT," + 10019261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Groups.VERSION + " INTEGER NOT NULL DEFAULT 1," + 100273776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov Groups.DIRTY + " INTEGER NOT NULL DEFAULT 0," + 1003ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey Groups.TITLE + " TEXT," + 100467dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Groups.TITLE_RES + " INTEGER," + 10050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov Groups.NOTES + " TEXT," + 10060f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov Groups.SYSTEM_ID + " TEXT," + 100794021b213e4db367f60b30fcbfe9019e28571784Fred Quintana Groups.DELETED + " INTEGER NOT NULL DEFAULT 0," + 1008eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey Groups.GROUP_VISIBLE + " INTEGER NOT NULL DEFAULT 0," + 1009ea547d55f864133861b2db44221ae0c2ac6c1a68Fred Quintana Groups.SHOULD_SYNC + " INTEGER NOT NULL DEFAULT 1," + 1010dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Groups.AUTO_ADD + " INTEGER NOT NULL DEFAULT 0," + 1011dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Groups.FAVORITES + " INTEGER NOT NULL DEFAULT 0," + 1012c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov Groups.GROUP_IS_READ_ONLY + " INTEGER NOT NULL DEFAULT 0," + 10133cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Groups.SYNC1 + " TEXT, " + 10143cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Groups.SYNC2 + " TEXT, " + 10153cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Groups.SYNC3 + " TEXT, " + 10163cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Groups.SYNC4 + " TEXT " + 1017ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey ");"); 1018ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 10195f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov db.execSQL("CREATE INDEX groups_source_id_index ON " + Tables.GROUPS + " (" + 10205f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov Groups.SOURCE_ID + ", " + 10215f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov Groups.ACCOUNT_TYPE + ", " + 10225f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov Groups.ACCOUNT_NAME + 10235f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov ");"); 10245f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov 1025b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov db.execSQL("CREATE TABLE IF NOT EXISTS " + Tables.AGGREGATION_EXCEPTIONS + " (" + 1026b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov AggregationExceptionColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 1027b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov AggregationExceptions.TYPE + " INTEGER NOT NULL, " + 10280c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID1 10295ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " INTEGER REFERENCES raw_contacts(_id), " + 10300c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID2 10315ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " INTEGER REFERENCES raw_contacts(_id)" + 1032b0160a0bcf6d59eaa43fd501e124b95f873e0157Marc Blank ");"); 1033b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 1034b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov db.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS aggregation_exception_index1 ON " + 1035b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov Tables.AGGREGATION_EXCEPTIONS + " (" + 10360c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID1 + ", " + 10370c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID2 + 1038b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov ");"); 1039b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 1040b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov db.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS aggregation_exception_index2 ON " + 1041b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov Tables.AGGREGATION_EXCEPTIONS + " (" + 10420c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID2 + ", " + 10430c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID1 + 1044b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov ");"); 1045b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 1046eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey db.execSQL("CREATE TABLE IF NOT EXISTS " + Tables.SETTINGS + " (" + 1047eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey Settings.ACCOUNT_NAME + " STRING NOT NULL," + 1048eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey Settings.ACCOUNT_TYPE + " STRING NOT NULL," + 1049eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey Settings.UNGROUPED_VISIBLE + " INTEGER NOT NULL DEFAULT 0," + 1050eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey Settings.SHOULD_SYNC + " INTEGER NOT NULL DEFAULT 1, " + 1051eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey "PRIMARY KEY (" + Settings.ACCOUNT_NAME + ", " + 1052e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey Settings.ACCOUNT_TYPE + ") ON CONFLICT REPLACE" + 1053eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey ");"); 1054eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey 10554394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.VISIBLE_CONTACTS + " (" + 10564394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov Contacts._ID + " INTEGER PRIMARY KEY" + 10574394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov ");"); 10584394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 1059385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.DEFAULT_DIRECTORY + " (" + 1060385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov Contacts._ID + " INTEGER PRIMARY KEY" + 1061385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ");"); 1062385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 1063e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov // The table for recent calls is here so we can do table joins 1064e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov // on people, phones, and calls all in one place. 1065e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.CALLS + " (" + 1066e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 1067e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.NUMBER + " TEXT," + 1068e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.DATE + " INTEGER," + 1069e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.DURATION + " INTEGER," + 1070e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.TYPE + " INTEGER," + 1071e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.NEW + " INTEGER," + 1072e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.CACHED_NAME + " TEXT," + 1073e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.CACHED_NUMBER_TYPE + " INTEGER," + 10742530512f639c4979fd7371c7dd25dd67e8118124Bai Tao Calls.CACHED_NUMBER_LABEL + " TEXT," + 107559f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Calls.COUNTRY_ISO + " TEXT," + 107659f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Calls.VOICEMAIL_URI + " TEXT," + 107759f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails._DATA + " TEXT," + 107859f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails.HAS_CONTENT + " INTEGER," + 107959f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails.MIME_TYPE + " TEXT," + 108059f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails.SOURCE_DATA + " TEXT," + 108159f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails.SOURCE_PACKAGE + " TEXT," + 108259f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails.STATE + " INTEGER" + 108359f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee ");"); 1084e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov 1085069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee // Voicemail source status table. 1086069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee db.execSQL("CREATE TABLE " + Tables.VOICEMAIL_STATUS + " (" + 1087069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 1088069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.SOURCE_PACKAGE + " TEXT UNIQUE NOT NULL," + 1089069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.SETTINGS_URI + " TEXT," + 1090069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.VOICEMAIL_ACCESS_URI + " TEXT," + 1091069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.CONFIGURATION_STATE + " INTEGER," + 1092069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.DATA_CHANNEL_STATE + " INTEGER," + 1093069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE + " INTEGER" + 1094069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee ");"); 1095069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee 1096b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Activities table 1097b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey db.execSQL("CREATE TABLE " + Tables.ACTIVITIES + " (" + 1098b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 109967dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey ActivitiesColumns.PACKAGE_ID + " INTEGER REFERENCES package(_id)," + 1100b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ActivitiesColumns.MIMETYPE_ID + " INTEGER REFERENCES mimetype(_id) NOT NULL," + 1101b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities.RAW_ID + " TEXT," + 1102499791a4f9ab29fa94ff48dd7acff55b2ac089a7Dmitri Plotnikov Activities.IN_REPLY_TO + " TEXT," + 11035ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Activities.AUTHOR_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)," + 11045ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Activities.TARGET_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)," + 1105b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities.PUBLISHED + " INTEGER NOT NULL," + 1106499791a4f9ab29fa94ff48dd7acff55b2ac089a7Dmitri Plotnikov Activities.THREAD_PUBLISHED + " INTEGER NOT NULL," + 1107b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities.TITLE + " TEXT NOT NULL," + 1108b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities.SUMMARY + " TEXT," + 1109adb55c2d8295d300961d86a3605c8ddc469cd4a2Dmitri Plotnikov Activities.LINK + " TEXT, " + 1110b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities.THUMBNAIL + " BLOB" + 1111b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 1112b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 1113a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.STATUS_UPDATES + " (" + 1114a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov StatusUpdatesColumns.DATA_ID + " INTEGER PRIMARY KEY REFERENCES data(_id)," + 11150a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.STATUS + " TEXT," + 11160a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.STATUS_TIMESTAMP + " INTEGER," + 11170a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.STATUS_RES_PACKAGE + " TEXT, " + 11180a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.STATUS_LABEL + " INTEGER, " + 11190a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.STATUS_ICON + " INTEGER" + 1120a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov ");"); 1121a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 1122b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.PROPERTIES + " (" + 1123b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov PropertiesColumns.PROPERTY_KEY + " TEXT PRIMARY KEY, " + 1124b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov PropertiesColumns.PROPERTY_VALUE + " TEXT " + 1125b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov ");"); 1126b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 1127743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.ACCOUNTS + " (" + 112824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.ACCOUNT_NAME + " TEXT, " + 112924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.ACCOUNT_TYPE + " TEXT, " + 113024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.PROFILE_RAW_CONTACT_ID + " INTEGER" + 113124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ");"); 113224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 113324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro db.execSQL("CREATE INDEX accounts_profile_raw_contact_id_index ON " + 113424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Tables.ACCOUNTS + " (" + 113524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.PROFILE_RAW_CONTACT_ID + 1136743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov ");"); 1137743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 1138743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov // Allow contacts without any account to be created for now. Achieve that 1139743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov // by inserting a fake account with both type and name as NULL. 1140743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov // This "account" should be eliminated as soon as the first real writable account 1141743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov // is added to the phone. 114224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro db.execSQL("INSERT INTO " + Tables.ACCOUNTS + " VALUES(NULL, NULL, NULL)"); 1143743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 1144d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov createDirectoriesTable(db); 1145f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov createSearchIndexTable(db); 1146d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 114746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa db.execSQL("CREATE TABLE " + Tables.DATA_USAGE_STAT + "(" + 114846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 114946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.DATA_ID + " INTEGER NOT NULL, " + 115046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.USAGE_TYPE_INT + " INTEGER NOT NULL DEFAULT 0, " + 115146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.TIMES_USED + " INTEGER NOT NULL DEFAULT 0, " + 115246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.LAST_TIME_USED + " INTERGER NOT NULL DEFAULT 0, " + 115346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "FOREIGN KEY(" + DataUsageStatColumns.DATA_ID + ") REFERENCES " 115446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa + Tables.DATA + "(" + Data._ID + ")" + 115546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ");"); 115646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa db.execSQL("CREATE UNIQUE INDEX data_usage_stat_index ON " + 115746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Tables.DATA_USAGE_STAT + " (" + 115846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.DATA_ID + ", " + 115946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.USAGE_TYPE_INT + 116046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ");"); 116146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 1162a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov createContactsViews(db); 1163a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov createGroupsView(db); 1164fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov createContactsTriggers(db); 1165916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov createContactsIndexes(db); 11664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1167a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov loadNicknameLookupTable(db); 1168a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 1169a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov // Add the legacy API support views, etc 1170a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov LegacyApiSupport.createDatabase(db); 1171a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 11722a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov if (mDatabaseOptimizationEnabled) { 11732a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov // This will create a sqlite_stat1 table that is used for query optimization 11742a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov db.execSQL("ANALYZE;"); 1175a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 11762a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov updateSqliteStats(db); 1177a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 11782a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov // We need to close and reopen the database connection so that the stats are 11792a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov // taken into account. Make a note of it and do the actual reopening in the 11802a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov // getWritableDatabase method. 11812a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mReopenDatabase = true; 11822a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 1183a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 1184a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov ContentResolver.requestSync(null /* all accounts */, 1185a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov ContactsContract.AUTHORITY, new Bundle()); 1186a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov } 1187a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 1188d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov private void createDirectoriesTable(SQLiteDatabase db) { 1189d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.DIRECTORIES + "(" + 1190d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 1191d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.PACKAGE_NAME + " TEXT NOT NULL," + 1192d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.DIRECTORY_AUTHORITY + " TEXT NOT NULL," + 1193d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.TYPE_RESOURCE_ID + " INTEGER," + 1194e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov DirectoryColumns.TYPE_RESOURCE_NAME + " TEXT," + 1195d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.ACCOUNT_TYPE + " TEXT," + 1196d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.ACCOUNT_NAME + " TEXT," + 1197d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.DISPLAY_NAME + " TEXT, " + 1198d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.EXPORT_SUPPORT + " INTEGER NOT NULL" + 119997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov " DEFAULT " + Directory.EXPORT_SUPPORT_NONE + "," + 120097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Directory.SHORTCUT_SUPPORT + " INTEGER NOT NULL" + 12013d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov " DEFAULT " + Directory.SHORTCUT_SUPPORT_NONE + "," + 12023d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Directory.PHOTO_SUPPORT + " INTEGER NOT NULL" + 12033d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov " DEFAULT " + Directory.PHOTO_SUPPORT_NONE + 1204d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ");"); 1205d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 12063d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov // Trigger a full scan of directories in the system 12073d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov setProperty(db, ContactDirectoryManager.PROPERTY_DIRECTORY_SCAN_COMPLETE, "0"); 1208d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 1209d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 121005e50fbf9809bf04eceec3d2a2753630dc4f9315Dmitri Plotnikov public void createSearchIndexTable(SQLiteDatabase db) { 1211f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS " + Tables.SEARCH_INDEX); 1212f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov db.execSQL("CREATE VIRTUAL TABLE " + Tables.SEARCH_INDEX 1213f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov + " USING FTS4 (" 1214f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov + SearchIndexColumns.CONTACT_ID + " INTEGER REFERENCES contacts(_id) NOT NULL," 1215f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov + SearchIndexColumns.CONTENT + " TEXT, " 1216155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov + SearchIndexColumns.NAME + " TEXT, " 1217f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov + SearchIndexColumns.TOKENS + " TEXT" 1218f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov + ")"); 1219f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 1220f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 1221916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov private static void createContactsTriggers(SQLiteDatabase db) { 1222fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1223fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov /* 1224fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov * Automatically delete Data rows when a raw contact is deleted. 1225fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov */ 1226fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS " + Tables.RAW_CONTACTS + "_deleted;"); 1227fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("CREATE TRIGGER " + Tables.RAW_CONTACTS + "_deleted " 1228fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEFORE DELETE ON " + Tables.RAW_CONTACTS 1229fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEGIN " 1230fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.DATA 1231fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + Data.RAW_CONTACT_ID 1232fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + "=OLD." + RawContacts._ID + ";" 1233fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.AGGREGATION_EXCEPTIONS 1234fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + AggregationExceptions.RAW_CONTACT_ID1 1235fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + "=OLD." + RawContacts._ID 1236fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " OR " + AggregationExceptions.RAW_CONTACT_ID2 1237fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + "=OLD." + RawContacts._ID + ";" 123835da06eb902047d8f3eb1698450d7bfdc41f22d4Dmitri Plotnikov + " DELETE FROM " + Tables.VISIBLE_CONTACTS 123935da06eb902047d8f3eb1698450d7bfdc41f22d4Dmitri Plotnikov + " WHERE " + Contacts._ID + "=OLD." + RawContacts.CONTACT_ID 124035da06eb902047d8f3eb1698450d7bfdc41f22d4Dmitri Plotnikov + " AND (SELECT COUNT(*) FROM " + Tables.RAW_CONTACTS 124135da06eb902047d8f3eb1698450d7bfdc41f22d4Dmitri Plotnikov + " WHERE " + RawContacts.CONTACT_ID + "=OLD." + RawContacts.CONTACT_ID 124235da06eb902047d8f3eb1698450d7bfdc41f22d4Dmitri Plotnikov + " )=1;" 1243385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + " DELETE FROM " + Tables.DEFAULT_DIRECTORY 1244385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + " WHERE " + Contacts._ID + "=OLD." + RawContacts.CONTACT_ID 1245385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + " AND (SELECT COUNT(*) FROM " + Tables.RAW_CONTACTS 1246385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + " WHERE " + RawContacts.CONTACT_ID + "=OLD." + RawContacts.CONTACT_ID 1247385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + " )=1;" 1248fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.CONTACTS 1249fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + Contacts._ID + "=OLD." + RawContacts.CONTACT_ID 1250fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " AND (SELECT COUNT(*) FROM " + Tables.RAW_CONTACTS 1251fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + RawContacts.CONTACT_ID + "=OLD." + RawContacts.CONTACT_ID 1252fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " )=1;" 1253fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " END"); 1254fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1255fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1256fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS contacts_times_contacted;"); 12576c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook db.execSQL("DROP TRIGGER IF EXISTS raw_contacts_times_contacted;"); 1258fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1259fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov /* 1260fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov * Triggers that update {@link RawContacts#VERSION} when the contact is 1261fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov * marked for deletion or any time a data row is inserted, updated or 1262fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov * deleted. 1263fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov */ 1264fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS " + Tables.RAW_CONTACTS + "_marked_deleted;"); 1265fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("CREATE TRIGGER " + Tables.RAW_CONTACTS + "_marked_deleted " 12667f61664c2b587e27f52edcb9a8b91986154ec637Vasu Nori + " AFTER UPDATE ON " + Tables.RAW_CONTACTS 1267fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEGIN " 1268fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " UPDATE " + Tables.RAW_CONTACTS 1269fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " SET " 1270fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + RawContacts.VERSION + "=OLD." + RawContacts.VERSION + "+1 " 1271fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + RawContacts._ID + "=OLD." + RawContacts._ID 1272fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " AND NEW." + RawContacts.DELETED + "!= OLD." + RawContacts.DELETED + ";" 1273fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " END"); 1274fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1275fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS " + Tables.DATA + "_updated;"); 12767f61664c2b587e27f52edcb9a8b91986154ec637Vasu Nori db.execSQL("CREATE TRIGGER " + Tables.DATA + "_updated AFTER UPDATE ON " + Tables.DATA 1277fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEGIN " 1278fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " UPDATE " + Tables.DATA 1279fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " SET " + Data.DATA_VERSION + "=OLD." + Data.DATA_VERSION + "+1 " 1280fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + Data._ID + "=OLD." + Data._ID + ";" 1281fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " UPDATE " + Tables.RAW_CONTACTS 1282fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " SET " + RawContacts.VERSION + "=" + RawContacts.VERSION + "+1 " 1283fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + RawContacts._ID + "=OLD." + Data.RAW_CONTACT_ID + ";" 1284fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " END"); 1285fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1286fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS " + Tables.DATA + "_deleted;"); 1287fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("CREATE TRIGGER " + Tables.DATA + "_deleted BEFORE DELETE ON " + Tables.DATA 1288fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEGIN " 1289fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " UPDATE " + Tables.RAW_CONTACTS 1290fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " SET " + RawContacts.VERSION + "=" + RawContacts.VERSION + "+1 " 1291fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + RawContacts._ID + "=OLD." + Data.RAW_CONTACT_ID + ";" 1292fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.PHONE_LOOKUP 1293fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + PhoneLookupColumns.DATA_ID + "=OLD." + Data._ID + ";" 1294fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.STATUS_UPDATES 1295fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + StatusUpdatesColumns.DATA_ID + "=OLD." + Data._ID + ";" 1296fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.NAME_LOOKUP 1297fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + NameLookupColumns.DATA_ID + "=OLD." + Data._ID + ";" 1298fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " END"); 1299fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1300fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1301fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS " + Tables.GROUPS + "_updated1;"); 1302fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("CREATE TRIGGER " + Tables.GROUPS + "_updated1 " 13037f61664c2b587e27f52edcb9a8b91986154ec637Vasu Nori + " AFTER UPDATE ON " + Tables.GROUPS 1304fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEGIN " 1305fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " UPDATE " + Tables.GROUPS 1306fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " SET " 1307fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + Groups.VERSION + "=OLD." + Groups.VERSION + "+1" 1308fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + Groups._ID + "=OLD." + Groups._ID + ";" 1309fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " END"); 1310fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov } 1311fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1312916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov private static void createContactsIndexes(SQLiteDatabase db) { 1313916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov db.execSQL("DROP INDEX IF EXISTS name_lookup_index"); 1314916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov db.execSQL("CREATE INDEX name_lookup_index ON " + Tables.NAME_LOOKUP + " (" + 1315916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov NameLookupColumns.NORMALIZED_NAME + "," + 1316916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov NameLookupColumns.NAME_TYPE + ", " + 1317916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov NameLookupColumns.RAW_CONTACT_ID + ", " + 1318916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov NameLookupColumns.DATA_ID + 1319916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ");"); 132004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 132104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov db.execSQL("DROP INDEX IF EXISTS raw_contact_sort_key1_index"); 132204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contact_sort_key1_index ON " + Tables.RAW_CONTACTS + " (" + 132304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov RawContacts.SORT_KEY_PRIMARY + 132404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov ");"); 132504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 132604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov db.execSQL("DROP INDEX IF EXISTS raw_contact_sort_key2_index"); 132704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contact_sort_key2_index ON " + Tables.RAW_CONTACTS + " (" + 132804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov RawContacts.SORT_KEY_ALTERNATIVE + 132904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov ");"); 1330916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 1331916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 1332a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov private static void createContactsViews(SQLiteDatabase db) { 1333a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.CONTACTS_ALL + ";"); 1334a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.CONTACTS_RESTRICTED + ";"); 1335a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_ALL + ";"); 1336a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_RESTRICTED + ";"); 1337a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_CONTACTS_ALL + ";"); 1338a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_CONTACTS_RESTRICTED + ";"); 1339a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_ENTITIES + ";"); 1340a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_ENTITIES_RESTRICTED + ";"); 1341a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.ENTITIES + ";"); 1342a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.ENTITIES_RESTRICTED + ";"); 13432f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_USAGE_STAT_ALL + ";"); 13442f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_USAGE_STAT_RESTRICTED + ";"); 1345a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 13464a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String dataColumns = 13474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Data.IS_PRIMARY + ", " 13484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.IS_SUPER_PRIMARY + ", " 13494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA_VERSION + ", " 13504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + PackagesColumns.PACKAGE + " AS " + Data.RES_PACKAGE + "," 13514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + MimetypesColumns.MIMETYPE + " AS " + Data.MIMETYPE + ", " 135297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov + Data.IS_READ_ONLY + ", " 13534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA1 + ", " 13544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA2 + ", " 13554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA3 + ", " 13564a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA4 + ", " 13574a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA5 + ", " 13584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA6 + ", " 13594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA7 + ", " 13604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA8 + ", " 13614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA9 + ", " 13624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA10 + ", " 13634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA11 + ", " 13644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA12 + ", " 13654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA13 + ", " 13664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA14 + ", " 13674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA15 + ", " 13684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.SYNC1 + ", " 13694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.SYNC2 + ", " 13704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.SYNC3 + ", " 13714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.SYNC4; 13724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 13734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String syncColumns = 13744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov RawContactsColumns.CONCRETE_ACCOUNT_NAME + " AS " + RawContacts.ACCOUNT_NAME + "," 13754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " AS " + RawContacts.ACCOUNT_TYPE + "," 13764a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_SOURCE_ID + " AS " + RawContacts.SOURCE_ID + "," 1377f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov + RawContactsColumns.CONCRETE_NAME_VERIFIED + " AS " + RawContacts.NAME_VERIFIED + "," 13784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_VERSION + " AS " + RawContacts.VERSION + "," 13794a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_DIRTY + " AS " + RawContacts.DIRTY + "," 13804a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_SYNC1 + " AS " + RawContacts.SYNC1 + "," 13814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_SYNC2 + " AS " + RawContacts.SYNC2 + "," 13824a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_SYNC3 + " AS " + RawContacts.SYNC3 + "," 13834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_SYNC4 + " AS " + RawContacts.SYNC4; 13844a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 13853d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov String baseContactColumns = 13863d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.HAS_PHONE_NUMBER + ", " 13873d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + Contacts.NAME_RAW_CONTACT_ID + ", " 13883d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + Contacts.LOOKUP_KEY + ", " 13893d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + Contacts.PHOTO_ID + ", " 13903d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + Clauses.CONTACT_VISIBLE + " AS " + Contacts.IN_VISIBLE_GROUP + ", " 13913d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + ContactsColumns.LAST_STATUS_UPDATE_ID; 13923d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov 13934a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String contactOptionColumns = 13944a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContactsColumns.CONCRETE_CUSTOM_RINGTONE 13954a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + RawContacts.CUSTOM_RINGTONE + "," 13964a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_SEND_TO_VOICEMAIL 13974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + RawContacts.SEND_TO_VOICEMAIL + "," 13984a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_LAST_TIME_CONTACTED 13994a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + RawContacts.LAST_TIME_CONTACTED + "," 14004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_TIMES_CONTACTED 14014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + RawContacts.TIMES_CONTACTED + "," 14024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_STARRED 14034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + RawContacts.STARRED; 14044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 14055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String contactNameColumns = 14065dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov "name_raw_contact." + RawContacts.DISPLAY_NAME_SOURCE 14075dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.DISPLAY_NAME_SOURCE + ", " 14085dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.DISPLAY_NAME_PRIMARY 14095dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.DISPLAY_NAME_PRIMARY + ", " 14105dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.DISPLAY_NAME_ALTERNATIVE 14115dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.DISPLAY_NAME_ALTERNATIVE + ", " 14125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.PHONETIC_NAME 14135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.PHONETIC_NAME + ", " 14145dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.PHONETIC_NAME_STYLE 14155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.PHONETIC_NAME_STYLE + ", " 14165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.SORT_KEY_PRIMARY 14175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.SORT_KEY_PRIMARY + ", " 14185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.SORT_KEY_ALTERNATIVE 14194394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov + " AS " + Contacts.SORT_KEY_ALTERNATIVE; 14205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 14214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String dataSelect = "SELECT " 14224a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + DataColumns.CONCRETE_ID + " AS " + Data._ID + "," 14234a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.RAW_CONTACT_ID + ", " 1424fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + RawContactsColumns.CONCRETE_CONTACT_ID + " AS " + RawContacts.CONTACT_ID + ", " 14254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + syncColumns + ", " 14264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + dataColumns + ", " 14274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + contactOptionColumns + ", " 14285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + contactNameColumns + ", " 14293d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + baseContactColumns + ", " 14303d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + buildPhotoUriAlias(RawContactsColumns.CONCRETE_CONTACT_ID, 14313d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI) + ", " 14323d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + buildPhotoUriAlias(RawContactsColumns.CONCRETE_CONTACT_ID, 14333d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI) + ", " 143424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro + "EXISTS (SELECT 1 FROM " + Tables.ACCOUNTS + 143524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " WHERE " + DataColumns.CONCRETE_RAW_CONTACT_ID + 143624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "=" + AccountsColumns.PROFILE_RAW_CONTACT_ID + ") AS " + 143724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE + ", " 14384a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Tables.GROUPS + "." + Groups.SOURCE_ID + " AS " + GroupMembership.GROUP_SOURCE_ID 14394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " FROM " + Tables.DATA 1440a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + " JOIN " + Tables.MIMETYPES + " ON (" 14414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + DataColumns.CONCRETE_MIMETYPE_ID + "=" + MimetypesColumns.CONCRETE_ID + ")" 1442a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + " JOIN " + Tables.RAW_CONTACTS + " ON (" 14434a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + DataColumns.CONCRETE_RAW_CONTACT_ID + "=" + RawContactsColumns.CONCRETE_ID + ")" 1444a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + " JOIN " + Tables.CONTACTS + " ON (" 1445fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + RawContactsColumns.CONCRETE_CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID + ")" 1446fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + " JOIN " + Tables.RAW_CONTACTS + " AS name_raw_contact ON(" 1447fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + Contacts.NAME_RAW_CONTACT_ID + "=name_raw_contact." + RawContacts._ID + ")" 1448a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + " LEFT OUTER JOIN " + Tables.PACKAGES + " ON (" 1449a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + DataColumns.CONCRETE_PACKAGE_ID + "=" + PackagesColumns.CONCRETE_ID + ")" 14504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.GROUPS + " ON (" 14514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + MimetypesColumns.CONCRETE_MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE 1452f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov + "' AND " + GroupsColumns.CONCRETE_ID + "=" 1453a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + Tables.DATA + "." + GroupMembership.GROUP_ROW_ID + ")"; 14544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 14554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.DATA_ALL + " AS " + dataSelect); 14564a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.DATA_RESTRICTED + " AS " + dataSelect + " WHERE " 1457fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + RawContactsColumns.CONCRETE_IS_RESTRICTED + "=0"); 14584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 14594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String rawContactOptionColumns = 14604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov RawContacts.CUSTOM_RINGTONE + "," 14614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.SEND_TO_VOICEMAIL + "," 14624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.LAST_TIME_CONTACTED + "," 14634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.TIMES_CONTACTED + "," 14644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.STARRED; 14654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 14664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String rawContactsSelect = "SELECT " 14674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_ID + " AS " + RawContacts._ID + "," 14684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.CONTACT_ID + ", " 14694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.AGGREGATION_MODE + ", " 147097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov + RawContacts.RAW_CONTACT_IS_READ_ONLY + ", " 14714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.DELETED + ", " 14725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.DISPLAY_NAME_SOURCE + ", " 14735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.DISPLAY_NAME_PRIMARY + ", " 14745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.DISPLAY_NAME_ALTERNATIVE + ", " 14755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.PHONETIC_NAME + ", " 14765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.PHONETIC_NAME_STYLE + ", " 14775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.SORT_KEY_PRIMARY + ", " 14785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.SORT_KEY_ALTERNATIVE + ", " 147924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro + "EXISTS (SELECT 1 FROM " + Tables.ACCOUNTS + 148024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " WHERE " + AccountsColumns.PROFILE_RAW_CONTACT_ID + 148124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "=" + RawContactsColumns.CONCRETE_ID + ") AS " + 148224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE + ", " 14834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + rawContactOptionColumns + ", " 14844a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + syncColumns 14854a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " FROM " + Tables.RAW_CONTACTS; 14864a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 14874a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.RAW_CONTACTS_ALL + " AS " + rawContactsSelect); 14884a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.RAW_CONTACTS_RESTRICTED + " AS " + rawContactsSelect 14894a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " WHERE " + RawContacts.IS_RESTRICTED + "=0"); 14904a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 14914a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String contactsColumns = 14924a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContactsColumns.CONCRETE_CUSTOM_RINGTONE 14934a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + Contacts.CUSTOM_RINGTONE + ", " 14945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + contactNameColumns + ", " 14953d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + baseContactColumns + ", " 14964a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_LAST_TIME_CONTACTED 14974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + Contacts.LAST_TIME_CONTACTED + ", " 14984a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_SEND_TO_VOICEMAIL 14994a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + Contacts.SEND_TO_VOICEMAIL + ", " 15004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_STARRED 15014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + Contacts.STARRED + ", " 15024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_TIMES_CONTACTED 15033d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + " AS " + Contacts.TIMES_CONTACTED; 15044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String contactsSelect = "SELECT " 15064a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_ID + " AS " + Contacts._ID + "," 15073d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + contactsColumns + ", " 15083d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + buildPhotoUriAlias(ContactsColumns.CONCRETE_ID, Contacts.PHOTO_URI) + ", " 150924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro + buildPhotoUriAlias(ContactsColumns.CONCRETE_ID, 151024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.PHOTO_THUMBNAIL_URI) + ", " 151124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro + "EXISTS (SELECT 1 FROM " + Tables.ACCOUNTS + 151224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " JOIN " + Tables.RAW_CONTACTS + " ON " + RawContactsColumns.CONCRETE_ID + "=" + 151324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.PROFILE_RAW_CONTACT_ID + 151424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " WHERE " + RawContactsColumns.CONCRETE_CONTACT_ID + 151524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "=" + ContactsColumns.CONCRETE_ID + ") AS " + 151624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE 15174a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " FROM " + Tables.CONTACTS 1518fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + " JOIN " + Tables.RAW_CONTACTS + " AS name_raw_contact ON(" 1519fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + Contacts.NAME_RAW_CONTACT_ID + "=name_raw_contact." + RawContacts._ID + ")"; 15204a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.CONTACTS_ALL + " AS " + contactsSelect); 1522fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL("CREATE VIEW " + Views.CONTACTS_RESTRICTED + " AS " + contactsSelect 1523fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + " WHERE " + ContactsColumns.SINGLE_IS_RESTRICTED + "=0"); 1524a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 1525a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov String rawEntitiesSelect = "SELECT " 1526a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContacts.CONTACT_ID + ", " 1527a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_DELETED + " AS " + RawContacts.DELETED + "," 1528a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + dataColumns + ", " 1529a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + syncColumns + ", " 1530a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC1 + ", " 1531a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC2 + ", " 1532a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC3 + ", " 1533a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC4 + ", " 1534a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_ID + " AS " + RawContacts._ID + ", " 1535a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_ID + " AS " + RawContacts.Entity.DATA_ID + "," 1536a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_STARRED + " AS " + RawContacts.STARRED + "," 1537a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_IS_RESTRICTED + " AS " 1538a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContacts.IS_RESTRICTED + "," 153924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro + "EXISTS (SELECT 1 FROM " + Tables.ACCOUNTS + 154024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " WHERE " + RawContactsColumns.CONCRETE_ID + 154124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "=" + AccountsColumns.PROFILE_RAW_CONTACT_ID + ") AS " + 154224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE + "," 1543a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Tables.GROUPS + "." + Groups.SOURCE_ID + " AS " + GroupMembership.GROUP_SOURCE_ID 1544a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " FROM " + Tables.RAW_CONTACTS 1545a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.DATA + " ON (" 1546a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_RAW_CONTACT_ID + "=" + RawContactsColumns.CONCRETE_ID + ")" 1547a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.PACKAGES + " ON (" 1548a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_PACKAGE_ID + "=" + PackagesColumns.CONCRETE_ID + ")" 1549a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.MIMETYPES + " ON (" 1550a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_MIMETYPE_ID + "=" + MimetypesColumns.CONCRETE_ID + ")" 1551a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.GROUPS + " ON (" 1552a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + MimetypesColumns.CONCRETE_MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE 1553a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + "' AND " + GroupsColumns.CONCRETE_ID + "=" 1554a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Tables.DATA + "." + GroupMembership.GROUP_ROW_ID + ")"; 1555a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 1556a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.RAW_ENTITIES + " AS " 1557a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + rawEntitiesSelect); 1558a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.RAW_ENTITIES_RESTRICTED + " AS " 1559a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + rawEntitiesSelect + " WHERE " + RawContacts.IS_RESTRICTED + "=0"); 1560a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 1561a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov String entitiesSelect = "SELECT " 1562a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_CONTACT_ID + " AS " + Contacts._ID + ", " 1563a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_CONTACT_ID + " AS " + RawContacts.CONTACT_ID + ", " 1564a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_DELETED + " AS " + RawContacts.DELETED + "," 1565a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_IS_RESTRICTED 1566a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " AS " + RawContacts.IS_RESTRICTED + "," 1567a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + dataColumns + ", " 1568a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + syncColumns + ", " 1569a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + contactsColumns + ", " 15703d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + buildPhotoUriAlias(RawContactsColumns.CONCRETE_CONTACT_ID, 15713d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI) + ", " 15723d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + buildPhotoUriAlias(RawContactsColumns.CONCRETE_CONTACT_ID, 15733d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI) + ", " 157424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro + "EXISTS (SELECT 1 FROM " + Tables.ACCOUNTS + 157524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " JOIN " + Tables.RAW_CONTACTS + " ON " + RawContactsColumns.CONCRETE_ID + "=" + 157624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.PROFILE_RAW_CONTACT_ID + 157724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " WHERE " + RawContactsColumns.CONCRETE_CONTACT_ID + 157824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "=" + ContactsColumns.CONCRETE_ID + ") AS " + 157924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE + ", " 1580a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC1 + ", " 1581a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC2 + ", " 1582a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC3 + ", " 1583a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC4 + ", " 1584a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_ID + " AS " + Contacts.Entity.RAW_CONTACT_ID + ", " 1585a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_ID + " AS " + Contacts.Entity.DATA_ID + "," 1586a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Tables.GROUPS + "." + Groups.SOURCE_ID + " AS " + GroupMembership.GROUP_SOURCE_ID 1587a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " FROM " + Tables.RAW_CONTACTS 1588a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " JOIN " + Tables.CONTACTS + " ON (" 1589a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID + ")" 1590a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " JOIN " + Tables.RAW_CONTACTS + " AS name_raw_contact ON(" 1591a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Contacts.NAME_RAW_CONTACT_ID + "=name_raw_contact." + RawContacts._ID + ")" 1592a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.DATA + " ON (" 1593a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_RAW_CONTACT_ID + "=" + RawContactsColumns.CONCRETE_ID + ")" 1594a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.PACKAGES + " ON (" 1595a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_PACKAGE_ID + "=" + PackagesColumns.CONCRETE_ID + ")" 1596a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.MIMETYPES + " ON (" 1597a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_MIMETYPE_ID + "=" + MimetypesColumns.CONCRETE_ID + ")" 1598a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.GROUPS + " ON (" 1599a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + MimetypesColumns.CONCRETE_MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE 1600a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + "' AND " + GroupsColumns.CONCRETE_ID + "=" 1601a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Tables.DATA + "." + GroupMembership.GROUP_ROW_ID + ")"; 1602a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 1603a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.ENTITIES + " AS " 1604a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + entitiesSelect); 1605a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.ENTITIES_RESTRICTED + " AS " 1606a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + entitiesSelect + " WHERE " + RawContactsColumns.CONCRETE_IS_RESTRICTED + "=0"); 16072f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 16082f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa String dataUsageStatSelect = "SELECT " 16092f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataUsageStatColumns.CONCRETE_ID + " AS " + DataUsageStatColumns._ID + ", " 16102f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataUsageStatColumns.DATA_ID + ", " 16112f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + RawContactsColumns.CONCRETE_CONTACT_ID + " AS " + RawContacts.CONTACT_ID + ", " 16122f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + MimetypesColumns.CONCRETE_MIMETYPE + " AS " + Data.MIMETYPE + ", " 16132f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataUsageStatColumns.USAGE_TYPE_INT + ", " 16142f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataUsageStatColumns.TIMES_USED + ", " 16152f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataUsageStatColumns.LAST_TIME_USED 16162f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + " FROM " + Tables.DATA_USAGE_STAT 16172f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + " JOIN " + Tables.DATA + " ON (" 16182f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataColumns.CONCRETE_ID + "=" + DataUsageStatColumns.CONCRETE_DATA_ID + ")" 16192f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + " JOIN " + Tables.RAW_CONTACTS + " ON (" 16202f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + RawContactsColumns.CONCRETE_ID + "=" + DataColumns.CONCRETE_RAW_CONTACT_ID 16212f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + " )" 16222f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + " JOIN " + Tables.MIMETYPES + " ON (" 16232f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + MimetypesColumns.CONCRETE_ID + "=" + DataColumns.CONCRETE_MIMETYPE_ID + ")"; 16242f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 16252f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa db.execSQL("CREATE VIEW " + Views.DATA_USAGE_STAT_ALL + " AS " + dataUsageStatSelect); 16262f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa db.execSQL("CREATE VIEW " + Views.DATA_USAGE_STAT_RESTRICTED + " AS " 16272f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + dataUsageStatSelect + " WHERE " 16282f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + RawContactsColumns.CONCRETE_IS_RESTRICTED + "=0"); 1629a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov } 16304a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16313d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov private static String buildPhotoUriAlias(String contactIdColumn, String alias) { 16322b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov return "(CASE WHEN " + Contacts.PHOTO_ID + " IS NULL" 16332b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov + " OR " + Contacts.PHOTO_ID + "=0" 16342b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov + " THEN NULL" 16352b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov + " ELSE " + "'" + Contacts.CONTENT_URI + "/'||" 16362b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov + contactIdColumn + "|| '/" + Photo.CONTENT_DIRECTORY + "'" 16372b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov + " END)" 16382b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov + " AS " + alias; 16393d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov } 16403d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov 1641a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov private static void createGroupsView(SQLiteDatabase db) { 1642a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.GROUPS_ALL + ";"); 164389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov String groupsColumns = 164489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Groups.ACCOUNT_NAME + "," 164589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.ACCOUNT_TYPE + "," 164689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SOURCE_ID + "," 164789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.VERSION + "," 164889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.DIRTY + "," 164989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.TITLE + "," 165089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.TITLE_RES + "," 165189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.NOTES + "," 165289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SYSTEM_ID + "," 165389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.DELETED + "," 165489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.GROUP_VISIBLE + "," 165589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SHOULD_SYNC + "," 1656dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana + Groups.AUTO_ADD + "," 1657dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana + Groups.FAVORITES + "," 1658c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov + Groups.GROUP_IS_READ_ONLY + "," 165989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SYNC1 + "," 166089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SYNC2 + "," 166189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SYNC3 + "," 166289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SYNC4 + "," 166389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + PackagesColumns.PACKAGE + " AS " + Groups.RES_PACKAGE; 166489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 166589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov String groupsSelect = "SELECT " 166689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + GroupsColumns.CONCRETE_ID + " AS " + Groups._ID + "," 166789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + groupsColumns 166889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + " FROM " + Tables.GROUPS_JOIN_PACKAGES; 166989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 167089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.GROUPS_ALL + " AS " + groupsSelect); 1671b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 1672b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 1673b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey @Override 1674b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 167546b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana if (oldVersion < 99) { 167646b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana Log.i(TAG, "Upgrading from version " + oldVersion + " to " + newVersion 167746b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana + ", data will be lost!"); 167846b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana 167946b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.CONTACTS + ";"); 168046b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.RAW_CONTACTS + ";"); 168146b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.PACKAGES + ";"); 168246b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.MIMETYPES + ";"); 168346b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.DATA + ";"); 168446b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.PHONE_LOOKUP + ";"); 168546b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.NAME_LOOKUP + ";"); 168646b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.NICKNAME_LOOKUP + ";"); 168746b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.GROUPS + ";"); 168846b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.ACTIVITIES + ";"); 168946b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.CALLS + ";"); 169046b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.SETTINGS + ";"); 169146b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.STATUS_UPDATES + ";"); 169246b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana 169346b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana // TODO: we should not be dropping agg_exceptions and contact_options. In case that 169446b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana // table's schema changes, we should try to preserve the data, because it was entered 169546b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana // by the user and has never been synched to the server. 169646b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.AGGREGATION_EXCEPTIONS + ";"); 169746b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana 169846b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana onCreate(db); 169946b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana return; 170046b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana } 1701f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 170246b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana Log.i(TAG, "Upgrading from version " + oldVersion + " to " + newVersion); 1703a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 170408e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov boolean upgradeViewsAndTriggers = false; 170504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov boolean upgradeNameLookup = false; 17068d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov boolean upgradeLegacyApiSupport = false; 1707155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov boolean upgradeSearchIndex = false; 170808e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov 170946b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana if (oldVersion == 99) { 171008e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 171146b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana oldVersion++; 171246b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana } 171346b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana 1714a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov if (oldVersion == 100) { 1715a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov db.execSQL("CREATE INDEX IF NOT EXISTS mimetypes_mimetype_index ON " 1716a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + Tables.MIMETYPES + " (" 1717a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + MimetypesColumns.MIMETYPE + "," 1718a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + MimetypesColumns._ID + ");"); 1719a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov updateIndexStats(db, Tables.MIMETYPES, 1720a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov "mimetypes_mimetype_index", "50 1 1"); 1721a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 172208e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 1723a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov oldVersion++; 1724a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov } 1725a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 1726fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov if (oldVersion == 101) { 172708e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 1728fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov oldVersion++; 1729fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov } 1730fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 173147ab23770b9f010a5e5277cda68267fe0613a1ccDmitri Plotnikov if (oldVersion == 102) { 173208e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 173347ab23770b9f010a5e5277cda68267fe0613a1ccDmitri Plotnikov oldVersion++; 173447ab23770b9f010a5e5277cda68267fe0613a1ccDmitri Plotnikov } 173547ab23770b9f010a5e5277cda68267fe0613a1ccDmitri Plotnikov 173636045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov if (oldVersion == 103) { 173708e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 1738bf6a7e4dece49ba4e7cda17f7ed9250aeb82f731Jeff Sharkey oldVersion++; 1739bf6a7e4dece49ba4e7cda17f7ed9250aeb82f731Jeff Sharkey } 1740bf6a7e4dece49ba4e7cda17f7ed9250aeb82f731Jeff Sharkey 174171037c010a0b7c882284fc1ed8584a378d926b83Dmitri Plotnikov if (oldVersion == 104 || oldVersion == 201) { 174271037c010a0b7c882284fc1ed8584a378d926b83Dmitri Plotnikov LegacyApiSupport.createSettingsTable(db); 174308e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 17443410a80f4aafe5685da61c217808d2bf21d55dfcDmitri Plotnikov oldVersion++; 17453410a80f4aafe5685da61c217808d2bf21d55dfcDmitri Plotnikov } 17463410a80f4aafe5685da61c217808d2bf21d55dfcDmitri Plotnikov 174771037c010a0b7c882284fc1ed8584a378d926b83Dmitri Plotnikov if (oldVersion == 105) { 17485dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeToVersion202(db); 174904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov upgradeNameLookup = true; 17503410a80f4aafe5685da61c217808d2bf21d55dfcDmitri Plotnikov oldVersion = 202; 175136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 175236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 1753fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov if (oldVersion == 202) { 17545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeToVersion203(db); 175508e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 1756fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov oldVersion++; 1757fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov } 1758fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 17599b1bd62417ef1764829398a61c3d5df93a924106Vasu Nori if (oldVersion == 203) { 176008e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 17619b1bd62417ef1764829398a61c3d5df93a924106Vasu Nori oldVersion++; 17629b1bd62417ef1764829398a61c3d5df93a924106Vasu Nori } 17639b1bd62417ef1764829398a61c3d5df93a924106Vasu Nori 17645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (oldVersion == 204) { 17655dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeToVersion205(db); 176608e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 17675dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov oldVersion++; 17685dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 17695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 1770f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov if (oldVersion == 205) { 1771f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov upgrateToVersion206(db); 1772f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov upgradeViewsAndTriggers = true; 1773f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov oldVersion++; 1774f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov } 1775f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 177631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov if (oldVersion == 206) { 1777b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov upgradeToVersion300(db); 177834469970fb04b9b188b5430f592b0c956a6ea2aaDmitri Plotnikov oldVersion = 300; 177931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov } 178031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 17816c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook if (oldVersion == 300) { 17826c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook upgradeViewsAndTriggers = true; 17836c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook oldVersion = 301; 17846c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook } 17856c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook 1786916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov if (oldVersion == 301) { 1787916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov upgradeViewsAndTriggers = true; 1788916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov oldVersion = 302; 1789916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 1790916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 1791b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (oldVersion == 302) { 1792b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov upgradeEmailToVersion303(db); 1793b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov upgradeNicknameToVersion303(db); 1794b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov oldVersion = 303; 1795b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 1796b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 179708768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov if (oldVersion == 303) { 179808768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov upgradeToVersion304(db); 179908768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov oldVersion = 304; 180008768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov } 180108768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov 1802f84478382761d74b9fb98c4189de66002c04cef8Sang-il, Lee if (oldVersion == 304) { 1803f84478382761d74b9fb98c4189de66002c04cef8Sang-il, Lee upgradeNameLookup = true; 1804f84478382761d74b9fb98c4189de66002c04cef8Sang-il, Lee oldVersion = 305; 1805f84478382761d74b9fb98c4189de66002c04cef8Sang-il, Lee } 1806f84478382761d74b9fb98c4189de66002c04cef8Sang-il, Lee 180760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann if (oldVersion == 305) { 180860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann upgradeToVersion306(db); 180960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann oldVersion = 306; 181060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 181160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 1812b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov if (oldVersion == 306) { 1813b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov upgradeToVersion307(db); 1814b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov oldVersion = 307; 1815b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 1816b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 1817743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov if (oldVersion == 307) { 1818743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov upgradeToVersion308(db); 1819743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov oldVersion = 308; 1820743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov } 1821743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 182294c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov // Gingerbread upgrades 182394c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov if (oldVersion < 350) { 1824afbf2a3343d0f8e7ae7cbfbbec60004ed37caf3fDaniel Lehmann upgradeViewsAndTriggers = true; 182594c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov oldVersion = 351; 1826afbf2a3343d0f8e7ae7cbfbbec60004ed37caf3fDaniel Lehmann } 1827afbf2a3343d0f8e7ae7cbfbbec60004ed37caf3fDaniel Lehmann 182894c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov if (oldVersion == 351) { 182994c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov upgradeNameLookup = true; 183094c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov oldVersion = 352; 183180d7871ca31d604cbfd857661d5300bb090076dbDaniel Lehmann } 183280d7871ca31d604cbfd857661d5300bb090076dbDaniel Lehmann 18337da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov if (oldVersion == 352) { 18347da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov upgradeToVersion353(db); 18357da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov oldVersion = 353; 18367da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov } 18377da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov 1838f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov // Honeycomb upgrades 1839f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov if (oldVersion < 400) { 1840dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana upgradeViewsAndTriggers = true; 1841f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov upgradeToVersion400(db); 1842f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov oldVersion = 400; 1843dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 1844dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 1845f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov if (oldVersion == 400) { 18464394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov upgradeViewsAndTriggers = true; 18474394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov upgradeToVersion401(db); 18484394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov oldVersion = 401; 18494394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov } 18504394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 1851d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov if (oldVersion == 401) { 1852d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov upgradeToVersion402(db); 1853d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov oldVersion = 402; 1854d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 1855d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 185697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov if (oldVersion == 402) { 185797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov upgradeViewsAndTriggers = true; 185897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov upgradeToVersion403(db); 185997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov oldVersion = 403; 186097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 186197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 1862a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov if (oldVersion == 403) { 1863a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov upgradeViewsAndTriggers = true; 1864a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov oldVersion = 404; 1865a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 1866a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 1867892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (oldVersion == 404) { 1868892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov upgradeViewsAndTriggers = true; 1869892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov upgradeToVersion405(db); 1870892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov oldVersion = 405; 1871892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 1872892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 18732530512f639c4979fd7371c7dd25dd67e8118124Bai Tao if (oldVersion == 405) { 18742530512f639c4979fd7371c7dd25dd67e8118124Bai Tao upgradeViewsAndTriggers = true; 18752530512f639c4979fd7371c7dd25dd67e8118124Bai Tao upgradeToVersion406(db); 18762530512f639c4979fd7371c7dd25dd67e8118124Bai Tao oldVersion = 406; 18772530512f639c4979fd7371c7dd25dd67e8118124Bai Tao } 18782530512f639c4979fd7371c7dd25dd67e8118124Bai Tao 1879cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov if (oldVersion == 406) { 1880cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov upgradeViewsAndTriggers = true; 1881cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov oldVersion = 407; 1882cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov } 1883cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov 1884385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov if (oldVersion == 407) { 1885d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov // Obsolete 1886385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov oldVersion = 408; 1887385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov } 1888385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 18893d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov if (oldVersion == 408) { 18903d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov upgradeViewsAndTriggers = true; 18913d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov upgradeToVersion409(db); 18923d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov oldVersion = 409; 18933d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov } 18943d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov 18952b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov if (oldVersion == 409) { 18962b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov upgradeViewsAndTriggers = true; 18972b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov oldVersion = 410; 18982b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov } 18992b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov 1900d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov if (oldVersion == 410) { 1901d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov upgradeToVersion411(db); 1902d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov oldVersion = 411; 1903d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov } 1904d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov 19057da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov if (oldVersion == 411) { 19067da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov // Same upgrade as 353, only on Honeycomb devices 19077da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov upgradeToVersion353(db); 19087da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov oldVersion = 412; 19097da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov } 19107da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov 1911e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov if (oldVersion == 412) { 1912e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov upgradeToVersion413(db); 1913e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov oldVersion = 413; 1914e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov } 1915e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov 191656f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee if (oldVersion == 413) { 191756f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee upgradeNameLookup = true; 191856f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee oldVersion = 414; 191956f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee } 192056f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee 1921c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov if (oldVersion == 414) { 1922c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov upgradeToVersion415(db); 1923c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov upgradeViewsAndTriggers = true; 1924c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov oldVersion = 415; 1925c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov } 1926c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov 1927d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov if (oldVersion == 415) { 1928d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov upgradeToVersion416(db); 1929d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov oldVersion = 416; 1930d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov } 1931d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov 19328d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov if (oldVersion == 416) { 19338d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov upgradeLegacyApiSupport = true; 19348d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov oldVersion = 417; 19358d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov } 19368d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov 1937f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov // Honeycomb-MR1 upgrades 1938f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov if (oldVersion < 500) { 1939155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov upgradeSearchIndex = true; 1940f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 1941f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 1942197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov if (oldVersion < 501) { 1943155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov upgradeSearchIndex = true; 1944197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov upgradeToVersion501(db); 1945197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov oldVersion = 501; 1946197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov } 1947197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov 194892ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov if (oldVersion < 502) { 1949155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov upgradeSearchIndex = true; 195092ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov upgradeToVersion502(db); 195192ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov oldVersion = 502; 195292ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov } 195392ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov 1954155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov if (oldVersion < 503) { 1955155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov upgradeSearchIndex = true; 1956155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov oldVersion = 503; 1957155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov } 1958155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov 195955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov if (oldVersion < 504) { 196055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov upgradeToVersion504(db); 196155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov oldVersion = 504; 196255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 196355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 196424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro if (oldVersion < 600) { 196524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro upgradeToVersion600(db); 196624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro upgradeViewsAndTriggers = true; 196724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro oldVersion = 600; 196824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 196924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 197046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa if (oldVersion < 601) { 197146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa upgradeToVersion601(db); 197246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa oldVersion = 601; 197346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa } 197446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 197559f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee if (oldVersion < 602) { 197659f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee upgradeToVersion602(db); 197759f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee oldVersion = 602; 197859f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee } 197959f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee 19802f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa if (oldVersion < 603) { 19812f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa upgradeViewsAndTriggers = true; 19822f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa oldVersion = 603; 19832f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa } 19842f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 1985069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee if (oldVersion < 604) { 1986069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee upgradeToVersion604(db); 1987069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee oldVersion = 604; 1988069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee } 1989069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee 199008e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov if (upgradeViewsAndTriggers) { 199108e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov createContactsViews(db); 199208e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov createGroupsView(db); 199308e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov createContactsTriggers(db); 1994916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov createContactsIndexes(db); 1995916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov updateSqliteStats(db); 19968d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov upgradeLegacyApiSupport = true; 1997916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov mReopenDatabase = true; 199808e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov } 199908e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov 20008d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov if (upgradeLegacyApiSupport) { 20018d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov LegacyApiSupport.createViews(db); 20028d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov } 20038d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov 200404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov if (upgradeNameLookup) { 200504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov rebuildNameLookup(db); 200604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 200704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 2008155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov if (upgradeSearchIndex) { 2009155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov setProperty(db, SearchIndexManager.PROPERTY_SEARCH_INDEX_VERSION, "0"); 2010155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov } 2011155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov 201246b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana if (oldVersion != newVersion) { 201346b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana throw new IllegalStateException( 201446b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana "error upgrading the database to version " + newVersion); 201546b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana } 2016b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 2017b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 20185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeToVersion202(SQLiteDatabase db) { 201936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov db.execSQL( 202036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov "ALTER TABLE " + Tables.PHONE_LOOKUP + 202136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov " ADD " + PhoneLookupColumns.MIN_MATCH + " TEXT;"); 202236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 202336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_min_match_index ON " + Tables.PHONE_LOOKUP + " (" + 202436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.MIN_MATCH + "," + 202536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID + "," + 202636045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.DATA_ID + 202736045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov ");"); 202836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 202936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov updateIndexStats(db, Tables.PHONE_LOOKUP, 203036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov "phone_lookup_min_match_index", "10000 2 2 1"); 203136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 203236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov SQLiteStatement update = db.compileStatement( 203336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov "UPDATE " + Tables.PHONE_LOOKUP + 203436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov " SET " + PhoneLookupColumns.MIN_MATCH + "=?" + 203536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov " WHERE " + PhoneLookupColumns.DATA_ID + "=?"); 203636045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 203736045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov // Populate the new column 203836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov Cursor c = db.query(Tables.PHONE_LOOKUP + " JOIN " + Tables.DATA + 203936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov " ON (" + PhoneLookupColumns.DATA_ID + "=" + DataColumns.CONCRETE_ID + ")", 204036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov new String[]{Data._ID, Phone.NUMBER}, null, null, null, null, null); 204136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov try { 204236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov while (c.moveToNext()) { 204336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov long dataId = c.getLong(0); 204436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov String number = c.getString(1); 204536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov if (!TextUtils.isEmpty(number)) { 204636045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov update.bindString(1, PhoneNumberUtils.toCallerIDMinMatch(number)); 204736045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov update.bindLong(2, dataId); 204836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov update.execute(); 204936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 205036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 205136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } finally { 205236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov c.close(); 205336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 205436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 205536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 20565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeToVersion203(SQLiteDatabase db) { 2057758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov // Garbage-collect first. A bug in Eclair was sometimes leaving 2058758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov // raw_contacts in the database that no longer had contacts associated 2059758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov // with them. To avoid failures during this database upgrade, drop 2060758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov // the orphaned raw_contacts. 2061758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov db.execSQL( 2062758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov "DELETE FROM raw_contacts" + 2063758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov " WHERE contact_id NOT NULL" + 2064758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov " AND contact_id NOT IN (SELECT _id FROM contacts)"); 2065758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov 2066fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2067fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "ALTER TABLE " + Tables.CONTACTS + 2068fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " ADD " + Contacts.NAME_RAW_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)"); 2069fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2070fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "ALTER TABLE " + Tables.RAW_CONTACTS + 20714394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " ADD contact_in_visible_group INTEGER NOT NULL DEFAULT 0"); 2072fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2073fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // For each Contact, find the RawContact that contributed the display name 2074fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2075fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "UPDATE " + Tables.CONTACTS + 2076fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " SET " + Contacts.NAME_RAW_CONTACT_ID + "=(" + 2077fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " SELECT " + RawContacts._ID + 2078fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 2079fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID + 2080fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_DISPLAY_NAME + "=" + 2081fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Tables.CONTACTS + "." + Contacts.DISPLAY_NAME + 2082fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " ORDER BY " + RawContacts._ID + 2083fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " LIMIT 1)" 2084fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ); 2085fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2086fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL("CREATE INDEX contacts_name_raw_contact_id_index ON " + Tables.CONTACTS + " (" + 2087fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID + 2088fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ");"); 2089fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2090fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // If for some unknown reason we missed some names, let's make sure there are 2091fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // no contacts without a name, picking a raw contact "at random". 2092fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2093fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "UPDATE " + Tables.CONTACTS + 2094fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " SET " + Contacts.NAME_RAW_CONTACT_ID + "=(" + 2095fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " SELECT " + RawContacts._ID + 2096fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 2097fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID + 2098fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " ORDER BY " + RawContacts._ID + 2099fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " LIMIT 1)" + 2100fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " WHERE " + Contacts.NAME_RAW_CONTACT_ID + " IS NULL" 2101fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ); 2102fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2103fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // Wipe out DISPLAY_NAME on the Contacts table as it is no longer in use. 2104fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2105fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "UPDATE " + Tables.CONTACTS + 2106fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " SET " + Contacts.DISPLAY_NAME + "=NULL" 2107fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ); 2108fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2109fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // Copy the IN_VISIBLE_GROUP flag down to all raw contacts to allow 2110fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // indexing on (display_name, in_visible_group) 2111fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2112fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "UPDATE " + Tables.RAW_CONTACTS + 21134394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " SET contact_in_visible_group=(" + 2114fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "SELECT " + Contacts.IN_VISIBLE_GROUP + 2115fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " FROM " + Tables.CONTACTS + 2116bcbd6a5cdd2d1aa6531c592428dc20e0282486c3Dmitri Plotnikov " WHERE " + Contacts._ID + "=" + RawContacts.CONTACT_ID + ")" + 2117bcbd6a5cdd2d1aa6531c592428dc20e0282486c3Dmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + " NOT NULL" 2118fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ); 2119fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2120fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL("CREATE INDEX raw_contact_sort_key1_index ON " + Tables.RAW_CONTACTS + " (" + 21214394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "contact_in_visible_group" + "," + 2122fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov RawContactsColumns.DISPLAY_NAME + " COLLATE LOCALIZED ASC" + 2123fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ");"); 2124fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2125fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL("DROP INDEX contacts_visible_index"); 2126fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL("CREATE INDEX contacts_visible_index ON " + Tables.CONTACTS + " (" + 2127fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Contacts.IN_VISIBLE_GROUP + 2128fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ");"); 2129fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov } 2130fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 21315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeToVersion205(SQLiteDatabase db) { 21325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 21335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " ADD " + RawContacts.DISPLAY_NAME_ALTERNATIVE + " TEXT;"); 21345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 21355dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " ADD " + RawContacts.PHONETIC_NAME + " TEXT;"); 21365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 21375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " ADD " + RawContacts.PHONETIC_NAME_STYLE + " INTEGER;"); 21385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 2139de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa + " ADD " + RawContacts.SORT_KEY_PRIMARY 2140de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa + " TEXT COLLATE " + ContactsProvider2.PHONEBOOK_COLLATOR_NAME + ";"); 21415dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 2142de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa + " ADD " + RawContacts.SORT_KEY_ALTERNATIVE 2143de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa + " TEXT COLLATE " + ContactsProvider2.PHONEBOOK_COLLATOR_NAME + ";"); 21445dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 21455dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov final Locale locale = Locale.getDefault(); 21465dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 214751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov NameSplitter splitter = createNameSplitter(); 21485dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 21495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement rawContactUpdate = db.compileStatement( 21505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov "UPDATE " + Tables.RAW_CONTACTS + 21515dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " SET " + 21525dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_PRIMARY + "=?," + 21535dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_ALTERNATIVE + "=?," + 21545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.PHONETIC_NAME + "=?," + 21555dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.PHONETIC_NAME_STYLE + "=?," + 21565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.SORT_KEY_PRIMARY + "=?," + 21575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.SORT_KEY_ALTERNATIVE + "=?" + 21585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?"); 21595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 21605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeStructuredNamesToVersion205(db, rawContactUpdate, splitter); 21615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeOrganizationsToVersion205(db, rawContactUpdate, splitter); 21625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 21635dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("DROP INDEX raw_contact_sort_key1_index"); 21645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contact_sort_key1_index ON " + Tables.RAW_CONTACTS + " (" + 21654394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "contact_in_visible_group" + "," + 21665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.SORT_KEY_PRIMARY + 21675dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ");"); 21685dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 21695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contact_sort_key2_index ON " + Tables.RAW_CONTACTS + " (" + 21704394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "contact_in_visible_group" + "," + 21715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.SORT_KEY_ALTERNATIVE + 21725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ");"); 21735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 21745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 21755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private interface StructName205Query { 21765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String TABLE = Tables.DATA_JOIN_RAW_CONTACTS; 21775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 21785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String COLUMNS[] = { 21795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov DataColumns.CONCRETE_ID, 21805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Data.RAW_CONTACT_ID, 21815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_SOURCE, 21825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_PRIMARY, 21835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.PREFIX, 21845dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.GIVEN_NAME, 21855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.MIDDLE_NAME, 21865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.FAMILY_NAME, 21875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.SUFFIX, 21885dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.PHONETIC_FAMILY_NAME, 21895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.PHONETIC_MIDDLE_NAME, 21905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.PHONETIC_GIVEN_NAME, 21915dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov }; 21925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 21935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int ID = 0; 21945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int RAW_CONTACT_ID = 1; 21955dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int DISPLAY_NAME_SOURCE = 2; 21965dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int DISPLAY_NAME = 3; 21975dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int PREFIX = 4; 21985dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int GIVEN_NAME = 5; 21995dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int MIDDLE_NAME = 6; 22005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int FAMILY_NAME = 7; 22015dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int SUFFIX = 8; 22025dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int PHONETIC_FAMILY_NAME = 9; 22035dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int PHONETIC_MIDDLE_NAME = 10; 22045dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int PHONETIC_GIVEN_NAME = 11; 22055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 22065dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22075dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeStructuredNamesToVersion205(SQLiteDatabase db, 22085dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement rawContactUpdate, NameSplitter splitter) { 22095dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22105dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // Process structured names to detect the style of the full name and phonetic name 22115dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long mMimeType; 22135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov try { 22145dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov mMimeType = DatabaseUtils.longForQuery(db, 22155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov "SELECT " + MimetypesColumns._ID + 22165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " FROM " + Tables.MIMETYPES + 22175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " WHERE " + MimetypesColumns.MIMETYPE 22185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "='" + StructuredName.CONTENT_ITEM_TYPE + "'", null); 22195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } catch (SQLiteDoneException e) { 22205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // No structured names in the database 22215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov return; 22225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 22235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement structuredNameUpdate = db.compileStatement( 22255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov "UPDATE " + Tables.DATA + 22265dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " SET " + 22275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.FULL_NAME_STYLE + "=?," + 22285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.DISPLAY_NAME + "=?," + 22295dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.PHONETIC_NAME_STYLE + "=?" + 22305dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " WHERE " + Data._ID + "=?"); 22315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov NameSplitter.Name name = new NameSplitter.Name(); 22335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StringBuilder sb = new StringBuilder(); 22345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Cursor cursor = db.query(StructName205Query.TABLE, 22355dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructName205Query.COLUMNS, 22365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=" + mMimeType, null, null, null, null); 22375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov try { 22385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov while (cursor.moveToNext()) { 22395dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long dataId = cursor.getLong(StructName205Query.ID); 22405dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = cursor.getLong(StructName205Query.RAW_CONTACT_ID); 22415dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int displayNameSource = cursor.getInt(StructName205Query.DISPLAY_NAME_SOURCE); 22425dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String displayName = cursor.getString(StructName205Query.DISPLAY_NAME); 22435dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22445dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.clear(); 22455dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.prefix = cursor.getString(StructName205Query.PREFIX); 22465dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.givenNames = cursor.getString(StructName205Query.GIVEN_NAME); 22475dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.middleName = cursor.getString(StructName205Query.MIDDLE_NAME); 22485dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.familyName = cursor.getString(StructName205Query.FAMILY_NAME); 22495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.suffix = cursor.getString(StructName205Query.SUFFIX); 22505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.phoneticFamilyName = cursor.getString(StructName205Query.PHONETIC_FAMILY_NAME); 22515dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.phoneticMiddleName = cursor.getString(StructName205Query.PHONETIC_MIDDLE_NAME); 22525dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.phoneticGivenName = cursor.getString(StructName205Query.PHONETIC_GIVEN_NAME); 22535dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeNameToVersion205(dataId, rawContactId, displayNameSource, displayName, name, 22555dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov structuredNameUpdate, rawContactUpdate, splitter, sb); 22565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 22575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } finally { 22585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov cursor.close(); 22595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 22605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 22615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeNameToVersion205(long dataId, long rawContactId, int displayNameSource, 22635dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String currentDisplayName, NameSplitter.Name name, 22645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement structuredNameUpdate, SQLiteStatement rawContactUpdate, 22655dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov NameSplitter splitter, StringBuilder sb) { 22665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22675dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov splitter.guessNameStyle(name); 2268ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao int unadjustedFullNameStyle = name.fullNameStyle; 22695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.fullNameStyle = splitter.getAdjustedFullNameStyle(name.fullNameStyle); 227055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov String displayName = splitter.join(name, true, true); 22715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 2272ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao // Don't update database with the adjusted fullNameStyle as it is locale 2273ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao // related 2274ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao structuredNameUpdate.bindLong(1, unadjustedFullNameStyle); 22755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(structuredNameUpdate, 2, displayName); 22765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov structuredNameUpdate.bindLong(3, name.phoneticNameStyle); 22775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov structuredNameUpdate.bindLong(4, dataId); 22785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov structuredNameUpdate.execute(); 22795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (displayNameSource == DisplayNameSources.STRUCTURED_NAME) { 228155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov String displayNameAlternative = splitter.join(name, false, false); 22825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String phoneticName = splitter.joinPhoneticName(name); 22835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String sortKey = null; 22845dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String sortKeyAlternative = null; 22855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (phoneticName != null) { 22875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov sortKey = sortKeyAlternative = phoneticName; 2288ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao } else if (name.fullNameStyle == FullNameStyle.CHINESE || 2289ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao name.fullNameStyle == FullNameStyle.CJK) { 2290ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao sortKey = sortKeyAlternative = ContactLocaleUtils.getIntance() 2291ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao .getSortKey(displayName, name.fullNameStyle); 22925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 22935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (sortKey == null) { 22955dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov sortKey = displayName; 22965dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov sortKeyAlternative = displayNameAlternative; 22975dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 22985dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22995dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov updateRawContact205(rawContactUpdate, rawContactId, displayName, 23005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov displayNameAlternative, name.phoneticNameStyle, phoneticName, sortKey, 23015dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov sortKeyAlternative); 23025dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23035dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23045dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private interface Organization205Query { 23065dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String TABLE = Tables.DATA_JOIN_RAW_CONTACTS; 23075dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23085dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String COLUMNS[] = { 23095dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov DataColumns.CONCRETE_ID, 23105dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Data.RAW_CONTACT_ID, 23115dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Organization.COMPANY, 23125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Organization.PHONETIC_NAME, 23135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov }; 23145dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int ID = 0; 23165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int RAW_CONTACT_ID = 1; 23175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int COMPANY = 2; 23185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int PHONETIC_NAME = 3; 23195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeOrganizationsToVersion205(SQLiteDatabase db, 23225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement rawContactUpdate, NameSplitter splitter) { 2323b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov final long mimeType = lookupMimeTypeId(db, Organization.CONTENT_ITEM_TYPE); 23245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement organizationUpdate = db.compileStatement( 23265dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov "UPDATE " + Tables.DATA + 23275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " SET " + 23285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Organization.PHONETIC_NAME_STYLE + "=?" + 23295dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " WHERE " + Data._ID + "=?"); 23305dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Cursor cursor = db.query(Organization205Query.TABLE, Organization205Query.COLUMNS, 2332b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=" + mimeType + " AND " 23335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.DISPLAY_NAME_SOURCE + "=" + DisplayNameSources.ORGANIZATION, 23345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov null, null, null, null); 23355dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov try { 23365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov while (cursor.moveToNext()) { 23375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long dataId = cursor.getLong(Organization205Query.ID); 23385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = cursor.getLong(Organization205Query.RAW_CONTACT_ID); 23395dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String company = cursor.getString(Organization205Query.COMPANY); 23405dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String phoneticName = cursor.getString(Organization205Query.PHONETIC_NAME); 23415dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23425dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int phoneticNameStyle = splitter.guessPhoneticNameStyle(phoneticName); 23435dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23445dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov organizationUpdate.bindLong(1, phoneticNameStyle); 23455dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov organizationUpdate.bindLong(2, dataId); 23465dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov organizationUpdate.execute(); 23475dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23485dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String sortKey = null; 23495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (phoneticName == null && company != null) { 23505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int nameStyle = splitter.guessFullNameStyle(company); 23515dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov nameStyle = splitter.getAdjustedFullNameStyle(nameStyle); 2352ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao if (nameStyle == FullNameStyle.CHINESE || 2353ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao nameStyle == FullNameStyle.CJK ) { 2354ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao sortKey = ContactLocaleUtils.getIntance() 2355ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao .getSortKey(company, nameStyle); 23565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (sortKey == null) { 23605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov sortKey = company; 23615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23635dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov updateRawContact205(rawContactUpdate, rawContactId, company, 23645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov company, phoneticNameStyle, phoneticName, sortKey, sortKey); 23655dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } finally { 23675dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov cursor.close(); 23685dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23705dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void updateRawContact205(SQLiteStatement rawContactUpdate, long rawContactId, 23725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String displayName, String displayNameAlternative, int phoneticNameStyle, 23735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String phoneticName, String sortKeyPrimary, String sortKeyAlternative) { 23745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov bindString(rawContactUpdate, 1, displayName); 23755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov bindString(rawContactUpdate, 2, displayNameAlternative); 23765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov bindString(rawContactUpdate, 3, phoneticName); 23775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov rawContactUpdate.bindLong(4, phoneticNameStyle); 23785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov bindString(rawContactUpdate, 5, sortKeyPrimary); 23795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov bindString(rawContactUpdate, 6, sortKeyAlternative); 23805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov rawContactUpdate.bindLong(7, rawContactId); 23815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov rawContactUpdate.execute(); 23825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 2384f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov private void upgrateToVersion206(SQLiteDatabase db) { 2385f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 2386f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov + " ADD " + RawContacts.NAME_VERIFIED + " INTEGER NOT NULL DEFAULT 0;"); 2387f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov } 2388f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 238931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov /** 239031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov * Fix for the bug where name lookup records for organizations would get removed by 239131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov * unrelated updates of the data rows. 239231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov */ 2393b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov private void upgradeToVersion300(SQLiteDatabase db) { 2394197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov // No longer needed 239531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov } 239631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 2397b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov private static final class Upgrade303Query { 2398b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final String TABLE = Tables.DATA; 2399b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2400b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final String SELECTION = 2401b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=?" + 2402b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov " AND " + Data._ID + " NOT IN " + 2403b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov "(SELECT " + NameLookupColumns.DATA_ID + " FROM " + Tables.NAME_LOOKUP + ")" + 2404b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov " AND " + Data.DATA1 + " NOT NULL"; 2405b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2406b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final String COLUMNS[] = { 2407b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Data._ID, 2408b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Data.RAW_CONTACT_ID, 2409b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Data.DATA1, 2410b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov }; 2411b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2412b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final int ID = 0; 2413b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final int RAW_CONTACT_ID = 1; 2414b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final int DATA1 = 2; 2415b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2416b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2417b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov /** 2418b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov * The {@link ContactsProvider2#update} method was deleting name lookup for new 2419b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov * emails during the sync. We need to restore the lost name lookup rows. 2420b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov */ 2421b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov private void upgradeEmailToVersion303(SQLiteDatabase db) { 2422b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, Email.CONTENT_ITEM_TYPE); 2423b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (mimeTypeId == -1) { 2424b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return; 2425b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2426b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2427b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov ContentValues values = new ContentValues(); 2428b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2429b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov // Find all data rows with the mime type "email" that are missing name lookup 2430b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Cursor cursor = db.query(Upgrade303Query.TABLE, Upgrade303Query.COLUMNS, 2431b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Upgrade303Query.SELECTION, new String[] {String.valueOf(mimeTypeId)}, 2432b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov null, null, null); 2433b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov try { 2434b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov while (cursor.moveToNext()) { 2435b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov long dataId = cursor.getLong(Upgrade303Query.ID); 2436b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov long rawContactId = cursor.getLong(Upgrade303Query.RAW_CONTACT_ID); 2437b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov String value = cursor.getString(Upgrade303Query.DATA1); 2438b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov value = extractHandleFromEmailAddress(value); 2439b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2440b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (value != null) { 2441b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.DATA_ID, dataId); 2442b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.RAW_CONTACT_ID, rawContactId); 2443b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.NAME_TYPE, NameLookupType.EMAIL_BASED_NICKNAME); 2444b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.NORMALIZED_NAME, NameNormalizer.normalize(value)); 2445b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov db.insert(Tables.NAME_LOOKUP, null, values); 2446b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2447b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2448b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } finally { 2449b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov cursor.close(); 2450b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2451b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2452b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2453b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov /** 2454b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov * The {@link ContactsProvider2#update} method was deleting name lookup for new 2455b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov * nicknames during the sync. We need to restore the lost name lookup rows. 2456b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov */ 2457b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov private void upgradeNicknameToVersion303(SQLiteDatabase db) { 2458b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, Nickname.CONTENT_ITEM_TYPE); 2459b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (mimeTypeId == -1) { 2460b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return; 2461b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2462b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2463b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov ContentValues values = new ContentValues(); 2464b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2465b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov // Find all data rows with the mime type "nickname" that are missing name lookup 2466b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Cursor cursor = db.query(Upgrade303Query.TABLE, Upgrade303Query.COLUMNS, 2467b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Upgrade303Query.SELECTION, new String[] {String.valueOf(mimeTypeId)}, 2468b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov null, null, null); 2469b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov try { 2470b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov while (cursor.moveToNext()) { 2471b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov long dataId = cursor.getLong(Upgrade303Query.ID); 2472b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov long rawContactId = cursor.getLong(Upgrade303Query.RAW_CONTACT_ID); 2473b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov String value = cursor.getString(Upgrade303Query.DATA1); 2474b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2475b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.DATA_ID, dataId); 2476b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.RAW_CONTACT_ID, rawContactId); 2477b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.NAME_TYPE, NameLookupType.NICKNAME); 2478b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.NORMALIZED_NAME, NameNormalizer.normalize(value)); 2479b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov db.insert(Tables.NAME_LOOKUP, null, values); 2480b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2481b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } finally { 2482b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov cursor.close(); 2483b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2484b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2485b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 248651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov private void upgradeToVersion304(SQLiteDatabase db) { 248751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov // Mimetype table requires an index on mime type 248851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS mime_type ON " + Tables.MIMETYPES + " (" + 248951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov MimetypesColumns.MIMETYPE + 249051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov ");"); 249151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 249251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 249360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann private void upgradeToVersion306(SQLiteDatabase db) { 249460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann // Fix invalid lookup that was used for Exchange contacts (it was not escaped) 249560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann // It happened when a new contact was created AND synchronized 249660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann final StringBuilder lookupKeyBuilder = new StringBuilder(); 249760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann final SQLiteStatement updateStatement = db.compileStatement( 249860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "UPDATE contacts " + 249960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "SET lookup=? " + 250060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "WHERE _id=?"); 250160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann final Cursor contactIdCursor = db.rawQuery( 250260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "SELECT DISTINCT contact_id " + 250360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "FROM raw_contacts " + 250460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "WHERE deleted=0 AND account_type='com.android.exchange'", 250560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann null); 250660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann try { 250760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann while (contactIdCursor.moveToNext()) { 250860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann final long contactId = contactIdCursor.getLong(0); 250960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann lookupKeyBuilder.setLength(0); 251060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann final Cursor c = db.rawQuery( 251160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "SELECT account_type, account_name, _id, sourceid, display_name " + 251260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "FROM raw_contacts " + 251360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "WHERE contact_id=? " + 251460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "ORDER BY _id", 251560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann new String[] { String.valueOf(contactId) }); 251660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann try { 251760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann while (c.moveToNext()) { 251860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann ContactLookupKey.appendToLookupKey(lookupKeyBuilder, 251960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.getString(0), 252060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.getString(1), 252160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.getLong(2), 252260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.getString(3), 252360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.getString(4)); 252460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 252560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } finally { 252660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.close(); 252760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 252860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 252960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann if (lookupKeyBuilder.length() == 0) { 253060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann updateStatement.bindNull(1); 253160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } else { 253260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann updateStatement.bindString(1, Uri.encode(lookupKeyBuilder.toString())); 253360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 253460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann updateStatement.bindLong(2, contactId); 253560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 253660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann updateStatement.execute(); 253760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 253860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } finally { 253960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann updateStatement.close(); 254060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann contactIdCursor.close(); 254160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 254260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 254360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 2544b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov private void upgradeToVersion307(SQLiteDatabase db) { 2545b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov db.execSQL("CREATE TABLE properties (" + 2546b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov "property_key TEXT PRIMARY_KEY, " + 2547b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov "property_value TEXT" + 2548b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov ");"); 2549b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 2550b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 2551743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov private void upgradeToVersion308(SQLiteDatabase db) { 25524394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("CREATE TABLE accounts (" + 25534394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "account_name TEXT, " + 25544394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "account_type TEXT " + 25554394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov ");"); 2556743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 25574394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("INSERT INTO accounts " + 25584394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "SELECT DISTINCT account_name, account_type FROM raw_contacts"); 2559743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov } 2560743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 2561f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov private void upgradeToVersion400(SQLiteDatabase db) { 2562dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana db.execSQL("ALTER TABLE " + Tables.GROUPS 2563dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana + " ADD " + Groups.FAVORITES + " INTEGER NOT NULL DEFAULT 0;"); 2564dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana db.execSQL("ALTER TABLE " + Tables.GROUPS 2565dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana + " ADD " + Groups.AUTO_ADD + " INTEGER NOT NULL DEFAULT 0;"); 2566dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 2567dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 25687da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov private void upgradeToVersion353(SQLiteDatabase db) { 25697da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov db.execSQL("DELETE FROM contacts " + 25707da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov "WHERE NOT EXISTS (SELECT 1 FROM raw_contacts WHERE contact_id=contacts._id)"); 25717da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov } 25727da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov 257351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov private void rebuildNameLookup(SQLiteDatabase db) { 257451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("DROP INDEX IF EXISTS name_lookup_index"); 257551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov insertNameLookup(db); 257651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov createContactsIndexes(db); 257751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 257851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 257904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov /** 258051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov * Regenerates all locale-sensitive data: nickname_lookup, name_lookup and sort keys. 258104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov */ 258251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov public void setLocale(ContactsProvider2 provider, Locale locale) { 258351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov Log.i(TAG, "Switching to locale " + locale); 258404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 2585c085b3eeebf13ebdfb197444747354a1d6eced2bJeff Hamilton long start = SystemClock.uptimeMillis(); 258651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov SQLiteDatabase db = getWritableDatabase(); 258751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.setLocale(locale); 258851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.beginTransaction(); 258951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov try { 259051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("DROP INDEX raw_contact_sort_key1_index"); 259151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("DROP INDEX raw_contact_sort_key2_index"); 259251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("DROP INDEX IF EXISTS name_lookup_index"); 259351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 259451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov loadNicknameLookupTable(db); 259551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov insertNameLookup(db); 259651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov rebuildSortKeys(db, provider); 259751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov createContactsIndexes(db); 259851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.setTransactionSuccessful(); 259951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } finally { 260051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.endTransaction(); 260151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 260251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 2603c085b3eeebf13ebdfb197444747354a1d6eced2bJeff Hamilton Log.i(TAG, "Locale change completed in " + (SystemClock.uptimeMillis() - start) + "ms"); 260451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 260551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 260651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov /** 260751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov * Regenerates sort keys for all contacts. 260851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov */ 260951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov private void rebuildSortKeys(SQLiteDatabase db, ContactsProvider2 provider) { 261051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov Cursor cursor = db.query(Tables.RAW_CONTACTS, new String[]{RawContacts._ID}, 261151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov null, null, null, null, null); 261251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov try { 261351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov while (cursor.moveToNext()) { 261451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov long rawContactId = cursor.getLong(0); 26158ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov updateRawContactDisplayName(db, rawContactId); 261651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 261751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } finally { 261851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov cursor.close(); 261951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 262051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 262151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 262251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov private void insertNameLookup(SQLiteDatabase db) { 262304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.NAME_LOOKUP); 262404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 262504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov SQLiteStatement nameLookupInsert = db.compileStatement( 262604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov "INSERT OR IGNORE INTO " + Tables.NAME_LOOKUP + "(" 262704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov + NameLookupColumns.RAW_CONTACT_ID + "," 262804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov + NameLookupColumns.DATA_ID + "," 262904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov + NameLookupColumns.NAME_TYPE + "," 263004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov + NameLookupColumns.NORMALIZED_NAME + 263104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov ") VALUES (?,?,?,?)"); 263204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 263351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov try { 263451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov insertStructuredNameLookup(db, nameLookupInsert); 263551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov insertEmailLookup(db, nameLookupInsert); 263651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov insertNicknameLookup(db, nameLookupInsert); 263751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } finally { 263851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov nameLookupInsert.close(); 263951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 264004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 264104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 264204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private static final class StructuredNameQuery { 264304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String TABLE = Tables.DATA; 264404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 264504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String SELECTION = 264604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=? AND " + Data.DATA1 + " NOT NULL"; 264704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 264804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String COLUMNS[] = { 264904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov StructuredName._ID, 265004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov StructuredName.RAW_CONTACT_ID, 265104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov StructuredName.DISPLAY_NAME, 265204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov }; 265304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 265404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int ID = 0; 265504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int RAW_CONTACT_ID = 1; 265604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int DISPLAY_NAME = 2; 265704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 265804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 265904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private class StructuredNameLookupBuilder extends NameLookupBuilder { 266004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 266104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private final SQLiteStatement mNameLookupInsert; 266204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private final CommonNicknameCache mCommonNicknameCache; 266304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 266404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public StructuredNameLookupBuilder(NameSplitter splitter, 266504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov CommonNicknameCache commonNicknameCache, SQLiteStatement nameLookupInsert) { 266604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov super(splitter); 266704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov this.mCommonNicknameCache = commonNicknameCache; 266804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov this.mNameLookupInsert = nameLookupInsert; 266904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 267004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 267104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov @Override 267204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov protected void insertNameLookup(long rawContactId, long dataId, int lookupType, 267304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov String name) { 267404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov if (!TextUtils.isEmpty(name)) { 267504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov ContactsDatabaseHelper.this.insertNormalizedNameLookup(mNameLookupInsert, 267604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov rawContactId, dataId, lookupType, name); 267704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 267804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 267904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 268004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov @Override 268104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov protected String[] getCommonNicknameClusters(String normalizedName) { 268204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov return mCommonNicknameCache.getCommonNicknameClusters(normalizedName); 268304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 268404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 268504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 268604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov /** 268704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov * Inserts name lookup rows for all structured names in the database. 268804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov */ 268904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private void insertStructuredNameLookup(SQLiteDatabase db, SQLiteStatement nameLookupInsert) { 2690d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov NameSplitter nameSplitter = createNameSplitter(); 2691d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov NameLookupBuilder nameLookupBuilder = new StructuredNameLookupBuilder(nameSplitter, 269204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov new CommonNicknameCache(db), nameLookupInsert); 269304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, StructuredName.CONTENT_ITEM_TYPE); 269404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Cursor cursor = db.query(StructuredNameQuery.TABLE, StructuredNameQuery.COLUMNS, 269504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov StructuredNameQuery.SELECTION, new String[] {String.valueOf(mimeTypeId)}, 269604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov null, null, null); 269704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov try { 269804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov while (cursor.moveToNext()) { 269904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long dataId = cursor.getLong(StructuredNameQuery.ID); 270004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long rawContactId = cursor.getLong(StructuredNameQuery.RAW_CONTACT_ID); 270104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov String name = cursor.getString(StructuredNameQuery.DISPLAY_NAME); 2702d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov int fullNameStyle = nameSplitter.guessFullNameStyle(name); 270351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov fullNameStyle = nameSplitter.getAdjustedFullNameStyle(fullNameStyle); 2704d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov nameLookupBuilder.insertNameLookup(rawContactId, dataId, name, fullNameStyle); 270504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 270604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } finally { 270704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov cursor.close(); 270804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 270904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 271004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 271104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private static final class OrganizationQuery { 271204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String TABLE = Tables.DATA; 271304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 271404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String SELECTION = 271504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=? AND " + Data.DATA1 + " NOT NULL"; 271604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 271704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String COLUMNS[] = { 271804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Organization._ID, 271904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Organization.RAW_CONTACT_ID, 272004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Organization.COMPANY, 272104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Organization.TITLE, 272204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov }; 272304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 272404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int ID = 0; 272504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int RAW_CONTACT_ID = 1; 272604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int COMPANY = 2; 272704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int TITLE = 3; 272804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 272904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 273004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private static final class EmailQuery { 273104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String TABLE = Tables.DATA; 273204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 273304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String SELECTION = 273404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=? AND " + Data.DATA1 + " NOT NULL"; 273504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 273604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String COLUMNS[] = { 273704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Email._ID, 273804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Email.RAW_CONTACT_ID, 273904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Email.ADDRESS, 274004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov }; 274104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 274204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int ID = 0; 274304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int RAW_CONTACT_ID = 1; 274404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int ADDRESS = 2; 274504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 274604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 274704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov /** 274804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov * Inserts name lookup rows for all email addresses in the database. 274904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov */ 275004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private void insertEmailLookup(SQLiteDatabase db, SQLiteStatement nameLookupInsert) { 275104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, Email.CONTENT_ITEM_TYPE); 275204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Cursor cursor = db.query(EmailQuery.TABLE, EmailQuery.COLUMNS, 275304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov EmailQuery.SELECTION, new String[] {String.valueOf(mimeTypeId)}, 275404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov null, null, null); 275504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov try { 275604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov while (cursor.moveToNext()) { 275704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long dataId = cursor.getLong(EmailQuery.ID); 275804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long rawContactId = cursor.getLong(EmailQuery.RAW_CONTACT_ID); 275904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov String address = cursor.getString(EmailQuery.ADDRESS); 276004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov address = extractHandleFromEmailAddress(address); 276104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov insertNameLookup(nameLookupInsert, rawContactId, dataId, 276204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov NameLookupType.EMAIL_BASED_NICKNAME, address); 276304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 276404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } finally { 276504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov cursor.close(); 276604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 276704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 276804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 276904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private static final class NicknameQuery { 277004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String TABLE = Tables.DATA; 277104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 277204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String SELECTION = 277304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=? AND " + Data.DATA1 + " NOT NULL"; 277404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 277504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String COLUMNS[] = { 277604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Nickname._ID, 277704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Nickname.RAW_CONTACT_ID, 277804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Nickname.NAME, 277904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov }; 278004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 278104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int ID = 0; 278204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int RAW_CONTACT_ID = 1; 278304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int NAME = 2; 278404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 278504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 278604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov /** 278704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov * Inserts name lookup rows for all nicknames in the database. 278804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov */ 278904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private void insertNicknameLookup(SQLiteDatabase db, SQLiteStatement nameLookupInsert) { 279004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, Nickname.CONTENT_ITEM_TYPE); 279104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Cursor cursor = db.query(NicknameQuery.TABLE, NicknameQuery.COLUMNS, 279204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov NicknameQuery.SELECTION, new String[] {String.valueOf(mimeTypeId)}, 279304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov null, null, null); 279404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov try { 279504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov while (cursor.moveToNext()) { 279604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long dataId = cursor.getLong(NicknameQuery.ID); 279704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long rawContactId = cursor.getLong(NicknameQuery.RAW_CONTACT_ID); 279804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov String nickname = cursor.getString(NicknameQuery.NAME); 279904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov insertNameLookup(nameLookupInsert, rawContactId, dataId, 280004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov NameLookupType.NICKNAME, nickname); 280104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 280204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } finally { 280304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov cursor.close(); 280404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 280504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 280604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 280704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov /** 280804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov * Inserts a record in the {@link Tables#NAME_LOOKUP} table. 280904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov */ 281004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public void insertNameLookup(SQLiteStatement stmt, long rawContactId, long dataId, 281104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov int lookupType, String name) { 281204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov if (TextUtils.isEmpty(name)) { 281304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov return; 281404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 281504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 281604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov String normalized = NameNormalizer.normalize(name); 281704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov if (TextUtils.isEmpty(normalized)) { 281804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov return; 281904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 282004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 282104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov insertNormalizedNameLookup(stmt, rawContactId, dataId, lookupType, normalized); 282204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 282304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 282404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private void insertNormalizedNameLookup(SQLiteStatement stmt, long rawContactId, long dataId, 282504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov int lookupType, String normalizedName) { 282604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov stmt.bindLong(1, rawContactId); 282704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov stmt.bindLong(2, dataId); 282804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov stmt.bindLong(3, lookupType); 282904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov stmt.bindString(4, normalizedName); 283004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov stmt.executeInsert(); 283104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 283204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 28334394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov /** 28344394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov * Changing the VISIBLE bit from a field on both RawContacts and Contacts to a separate table. 28354394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov */ 28364394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov private void upgradeToVersion401(SQLiteDatabase db) { 28374394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.VISIBLE_CONTACTS + " (" + 28384394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov Contacts._ID + " INTEGER PRIMARY KEY" + 28394394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov ");"); 28404394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("INSERT INTO " + Tables.VISIBLE_CONTACTS + 28414394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " SELECT " + Contacts._ID + 28424394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " FROM " + Tables.CONTACTS + 28434394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " WHERE " + Contacts.IN_VISIBLE_GROUP + "!=0"); 28444394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("DROP INDEX contacts_visible_index"); 28454394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov } 28464394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 2847d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov /** 2848d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Introducing a new table: directories. 2849d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov */ 2850d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov private void upgradeToVersion402(SQLiteDatabase db) { 2851d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov createDirectoriesTable(db); 2852d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 2853d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 285497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov private void upgradeToVersion403(SQLiteDatabase db) { 285597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS directories;"); 285697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov createDirectoriesTable(db); 285797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 285897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov db.execSQL("ALTER TABLE raw_contacts" 285997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov + " ADD raw_contact_is_read_only INTEGER NOT NULL DEFAULT 0;"); 286097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 286197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov db.execSQL("ALTER TABLE data" 286297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov + " ADD is_read_only INTEGER NOT NULL DEFAULT 0;"); 286397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 286497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 2865892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov private void upgradeToVersion405(SQLiteDatabase db) { 2866892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS phone_lookup;"); 2867892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // Private phone numbers table used for lookup 2868892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.PHONE_LOOKUP + " (" + 2869892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.DATA_ID 2870892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + " INTEGER REFERENCES data(_id) NOT NULL," + 2871892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID 2872892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + " INTEGER REFERENCES raw_contacts(_id) NOT NULL," + 2873892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.NORMALIZED_NUMBER + " TEXT NOT NULL," + 2874892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.MIN_MATCH + " TEXT NOT NULL" + 2875892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov ");"); 2876892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 2877892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_index ON " + Tables.PHONE_LOOKUP + " (" + 2878892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.NORMALIZED_NUMBER + "," + 2879892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID + "," + 2880892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.DATA_ID + 2881892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov ");"); 2882892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 2883892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_min_match_index ON " + Tables.PHONE_LOOKUP + " (" + 2884892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.MIN_MATCH + "," + 2885892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID + "," + 2886892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.DATA_ID + 2887892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov ");"); 2888892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 2889892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, Phone.CONTENT_ITEM_TYPE); 2890892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (mimeTypeId == -1) { 2891892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov return; 2892892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 2893892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 2894892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov Cursor cursor = db.rawQuery( 2895892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov "SELECT _id, " + Phone.RAW_CONTACT_ID + ", " + Phone.NUMBER + 2896892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov " FROM " + Tables.DATA + 2897892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov " WHERE " + DataColumns.MIMETYPE_ID + "=" + mimeTypeId 2898892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + " AND " + Phone.NUMBER + " NOT NULL", null); 2899892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 2900892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov ContentValues phoneValues = new ContentValues(); 2901892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov try { 2902892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov while (cursor.moveToNext()) { 2903892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov long dataID = cursor.getLong(0); 2904892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov long rawContactID = cursor.getLong(1); 2905892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov String number = cursor.getString(2); 2906892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov String normalizedNumber = PhoneNumberUtils.normalizeNumber(number); 2907892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (!TextUtils.isEmpty(normalizedNumber)) { 2908892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov phoneValues.clear(); 2909892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov phoneValues.put(PhoneLookupColumns.RAW_CONTACT_ID, rawContactID); 2910892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov phoneValues.put(PhoneLookupColumns.DATA_ID, dataID); 2911892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov phoneValues.put(PhoneLookupColumns.NORMALIZED_NUMBER, normalizedNumber); 2912892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov phoneValues.put(PhoneLookupColumns.MIN_MATCH, 2913892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneNumberUtils.toCallerIDMinMatch(normalizedNumber)); 2914892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov db.insert(Tables.PHONE_LOOKUP, null, phoneValues); 2915892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 2916892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 2917892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } finally { 2918892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov cursor.close(); 2919892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 2920892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 2921892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 29222530512f639c4979fd7371c7dd25dd67e8118124Bai Tao private void upgradeToVersion406(SQLiteDatabase db) { 29232530512f639c4979fd7371c7dd25dd67e8118124Bai Tao db.execSQL("ALTER TABLE calls ADD countryiso TEXT;"); 29242530512f639c4979fd7371c7dd25dd67e8118124Bai Tao } 29252530512f639c4979fd7371c7dd25dd67e8118124Bai Tao 2926d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov private void upgradeToVersion409(SQLiteDatabase db) { 2927d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS directories;"); 2928d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov createDirectoriesTable(db); 2929d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov } 2930d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov 2931385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov /** 2932d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov * Adding DEFAULT_DIRECTORY table. 2933385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov */ 2934d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov private void upgradeToVersion411(SQLiteDatabase db) { 2935d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS " + Tables.DEFAULT_DIRECTORY); 2936385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.DEFAULT_DIRECTORY + " (" + 2937385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov Contacts._ID + " INTEGER PRIMARY KEY" + 2938385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ");"); 2939385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 2940385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov // Process contacts without an account 2941385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov db.execSQL("INSERT OR IGNORE INTO " + Tables.DEFAULT_DIRECTORY + 2942385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " SELECT " + RawContacts.CONTACT_ID + 2943385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 2944385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + RawContactsColumns.CONCRETE_ACCOUNT_NAME + " IS NULL " + 2945385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " IS NULL "); 2946385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 2947385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov // Process accounts that don't have a default group (e.g. Exchange) 2948385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov db.execSQL("INSERT OR IGNORE INTO " + Tables.DEFAULT_DIRECTORY + 2949385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " SELECT " + RawContacts.CONTACT_ID + 2950385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 2951385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE NOT EXISTS" + 2952385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " (SELECT " + Groups._ID + 2953385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.GROUPS + 2954385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + RawContactsColumns.CONCRETE_ACCOUNT_NAME + " = " 2955385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + GroupsColumns.CONCRETE_ACCOUNT_NAME + 2956385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " = " 2957385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + GroupsColumns.CONCRETE_ACCOUNT_TYPE + 2958385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + Groups.AUTO_ADD + " != 0" + 2959385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ")"); 2960385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 2961385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov long mimetype = lookupMimeTypeId(db, GroupMembership.CONTENT_ITEM_TYPE); 2962385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 2963d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov // Process accounts that do have a default group (e.g. Google) 2964385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov db.execSQL("INSERT OR IGNORE INTO " + Tables.DEFAULT_DIRECTORY + 2965385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " SELECT " + RawContacts.CONTACT_ID + 2966385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 2967385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " JOIN " + Tables.DATA + 2968385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " ON (" + RawContactsColumns.CONCRETE_ID + "=" + Data.RAW_CONTACT_ID + ")" + 2969385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + DataColumns.MIMETYPE_ID + "=" + mimetype + 2970d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov " AND EXISTS" + 2971d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov " (SELECT " + Groups._ID + 2972d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov " FROM " + Tables.GROUPS + 2973d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov " WHERE " + RawContactsColumns.CONCRETE_ACCOUNT_NAME + " = " 2974d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov + GroupsColumns.CONCRETE_ACCOUNT_NAME + 2975d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " = " 2976d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov + GroupsColumns.CONCRETE_ACCOUNT_TYPE + 2977d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov " AND " + Groups.AUTO_ADD + " != 0" + 2978d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov ")"); 29793d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov } 2980385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 2981e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov private void upgradeToVersion413(SQLiteDatabase db) { 29823ea7932a47027c8629d3a301e1a16e7d2c8a298dDmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS directories;"); 29833ea7932a47027c8629d3a301e1a16e7d2c8a298dDmitri Plotnikov createDirectoriesTable(db); 2984e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov } 2985e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov 2986c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov private void upgradeToVersion415(SQLiteDatabase db) { 2987c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov db.execSQL( 2988c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov "ALTER TABLE " + Tables.GROUPS + 2989c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov " ADD " + Groups.GROUP_IS_READ_ONLY + " INTEGER NOT NULL DEFAULT 0"); 2990c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov db.execSQL( 2991c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov "UPDATE " + Tables.GROUPS + 2992c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov " SET " + Groups.GROUP_IS_READ_ONLY + "=1" + 2993c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov " WHERE " + Groups.SYSTEM_ID + " NOT NULL"); 2994c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov } 2995c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov 2996d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov private void upgradeToVersion416(SQLiteDatabase db) { 2997d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_data_id_min_match_index ON " + Tables.PHONE_LOOKUP + 2998d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov " (" + PhoneLookupColumns.DATA_ID + ", " + PhoneLookupColumns.MIN_MATCH + ");"); 2999d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov } 3000d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov 3001197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov private void upgradeToVersion501(SQLiteDatabase db) { 3002197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov // Remove organization rows from the name lookup, we now use search index for that 3003197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov db.execSQL("DELETE FROM name_lookup WHERE name_type=5"); 3004f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 3005f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 300692ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov private void upgradeToVersion502(SQLiteDatabase db) { 300792ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov // Remove Chinese and Korean name lookup - this data is now in the search index 300892ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov db.execSQL("DELETE FROM name_lookup WHERE name_type IN (6, 7)"); 300992ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov } 301092ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov 301155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov private void upgradeToVersion504(SQLiteDatabase db) { 301255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov populateMimeTypeCache(db); 301355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 301455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov // Find all names with prefixes and recreate display name 301555e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov Cursor cursor = db.rawQuery( 301655e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov "SELECT " + StructuredName.RAW_CONTACT_ID + 301755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov " FROM " + Tables.DATA + 301855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov " WHERE " + DataColumns.MIMETYPE_ID + "=?" 301955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov + " AND " + StructuredName.PREFIX + " NOT NULL", 302055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov new String[]{ String.valueOf(mMimeTypeIdStructuredName) }); 302155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 302255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov try { 302355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov while(cursor.moveToNext()) { 302455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov long rawContactId = cursor.getLong(0); 302555e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov updateRawContactDisplayName(db, rawContactId); 302655e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 302755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 302855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } finally { 302955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov cursor.close(); 303055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 303155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 303255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 303324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private void upgradeToVersion600(SQLiteDatabase db) { 303424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Add a column to the Accounts table to track which raw contact ID (if any) represents that 303524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // account's contribution to the user's profile Contact. 303624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro db.execSQL("ALTER TABLE accounts" + 303724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " ADD profile_raw_contact_id INTEGER"); 303824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro db.execSQL("CREATE INDEX accounts_profile_raw_contact_id_index ON accounts" + 303924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " (profile_raw_contact_id);"); 304024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 304124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 304246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa private void upgradeToVersion601(SQLiteDatabase db) { 304346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa db.execSQL("CREATE TABLE data_usage_stat(" + 304446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "stat_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 304546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "data_id INTEGER NOT NULL, " + 304646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "usage_type INTEGER NOT NULL DEFAULT 0, " + 304746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "times_used INTEGER NOT NULL DEFAULT 0, " + 304846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "last_time_used INTERGER NOT NULL DEFAULT 0, " + 304946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "FOREIGN KEY(data_id) REFERENCES data(_id));"); 305046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa db.execSQL("CREATE UNIQUE INDEX data_usage_stat_index ON " + 305146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "data_usage_stat (data_id, usage_type)"); 305246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa } 305346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 305459f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee private void upgradeToVersion602(SQLiteDatabase db) { 305559f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD voicemail_uri TEXT;"); 305659f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD _data TEXT;"); 305759f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD has_content INTEGER;"); 305859f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD mime_type TEXT;"); 305959f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD source_data TEXT;"); 306059f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD source_package TEXT;"); 306159f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD state INTEGER;"); 306259f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee } 306359f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee 3064069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee private void upgradeToVersion604(SQLiteDatabase db) { 3065069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee db.execSQL("CREATE TABLE voicemail_status (" + 3066069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "_id INTEGER PRIMARY KEY AUTOINCREMENT," + 3067069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "source_package TEXT UNIQUE NOT NULL," + 3068069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "settings_uri TEXT," + 3069069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "voicemail_access_uri TEXT," + 3070069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "configuration_state INTEGER," + 3071069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "data_channel_state INTEGER," + 3072069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "notification_channel_state INTEGER" + 3073069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee ");"); 3074069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee } 3075069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee 3076b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public String extractHandleFromEmailAddress(String email) { 3077b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(email); 3078b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (tokens.length == 0) { 3079b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return null; 3080b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 3081b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 3082b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov String address = tokens[0].getAddress(); 3083b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov int at = address.indexOf('@'); 3084b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (at != -1) { 3085b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return address.substring(0, at); 3086b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 3087b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return null; 3088b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 3089b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 309008768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov public String extractAddressFromEmailAddress(String email) { 309108768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(email); 309208768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov if (tokens.length == 0) { 309308768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov return null; 309408768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov } 309508768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov 309650a7c86b4b49870bd19d5270722be3f1fccaf226Dmitri Plotnikov return tokens[0].getAddress().trim(); 309708768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov } 309808768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov 3099b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov private long lookupMimeTypeId(SQLiteDatabase db, String mimeType) { 3100b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov try { 3101b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return DatabaseUtils.longForQuery(db, 3102b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov "SELECT " + MimetypesColumns._ID + 3103b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov " FROM " + Tables.MIMETYPES + 3104b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov " WHERE " + MimetypesColumns.MIMETYPE 3105b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov + "='" + mimeType + "'", null); 3106b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } catch (SQLiteDoneException e) { 3107b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov // No rows of this type in the database 3108b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return -1; 3109b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 3110b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 3111b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 31125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void bindString(SQLiteStatement stmt, int index, String value) { 31135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (value == null) { 31145dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov stmt.bindNull(index); 31155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } else { 31165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov stmt.bindString(index, value); 31175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 31185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 31195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 312078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private void bindLong(SQLiteStatement stmt, int index, Number value) { 312178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (value == null) { 312278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov stmt.bindNull(index); 312378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } else { 312478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov stmt.bindLong(index, value.longValue()); 312578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 312678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 312778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 3128a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov /** 3129f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * Adds index stats into the SQLite database to force it to always use the lookup indexes. 3130f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov */ 3131f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov private void updateSqliteStats(SQLiteDatabase db) { 3132f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 3133f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov // Specific stats strings are based on an actual large database after running ANALYZE 3134f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov try { 31358fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.CONTACTS, 31368fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "contacts_restricted_index", "10000 9000"); 31378fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.CONTACTS, 31388fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "contacts_has_phone_index", "10000 500"); 31398fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 31408fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.RAW_CONTACTS, 31418fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "raw_contacts_source_id_index", "10000 1 1 1"); 31428fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.RAW_CONTACTS, 31438fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "raw_contacts_contact_id_index", "10000 2"); 31448fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 31458fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.NAME_LOOKUP, 31468fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "name_lookup_raw_contact_id_index", "10000 3"); 31478fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.NAME_LOOKUP, 3148916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov "name_lookup_index", "10000 3 2 2 1"); 31498fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.NAME_LOOKUP, 31508fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "sqlite_autoindex_name_lookup_1", "10000 3 2 1"); 31518fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 31528fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.PHONE_LOOKUP, 31538fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "phone_lookup_index", "10000 2 2 1"); 315436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov updateIndexStats(db, Tables.PHONE_LOOKUP, 315536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov "phone_lookup_min_match_index", "10000 2 2 1"); 31568fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 31578fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.DATA, 31588fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "data_mimetype_data1_index", "60000 5000 2"); 31598fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.DATA, 31608fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "data_raw_contact_id", "60000 10"); 31618fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 31628fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.GROUPS, 31638fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "groups_source_id_index", "50 1 1 1"); 31648fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 31658fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.NICKNAME_LOOKUP, 31668fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "sqlite_autoindex_name_lookup_1", "500 2 1"); 31678fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 3168f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } catch (SQLException e) { 3169f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov Log.e(TAG, "Could not update index stats", e); 3170f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } 3171f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } 3172f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 3173f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov /** 3174f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * Stores statistics for a given index. 3175f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * 3176f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * @param stats has the following structure: the first index is the expected size of 3177f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * the table. The following integer(s) are the expected number of records selected with the 3178f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * index. There should be one integer per indexed column. 3179f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov */ 31805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void updateIndexStats(SQLiteDatabase db, String table, String index, 31815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String stats) { 3182f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov db.execSQL("DELETE FROM sqlite_stat1 WHERE tbl='" + table + "' AND idx='" + index + "';"); 3183f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov db.execSQL("INSERT INTO sqlite_stat1 (tbl,idx,stat)" 3184f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov + " VALUES ('" + table + "','" + index + "','" + stats + "');"); 3185f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } 3186f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 3187f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov @Override 3188f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov public synchronized SQLiteDatabase getWritableDatabase() { 3189f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov SQLiteDatabase db = super.getWritableDatabase(); 3190f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov if (mReopenDatabase) { 3191f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov mReopenDatabase = false; 3192f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov close(); 3193f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov db = super.getWritableDatabase(); 3194f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } 3195f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov return db; 3196f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } 3197f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 3198f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov /** 3199a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov * Wipes all data except mime type and package lookup tables. 3200a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov */ 3201a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public void wipeData() { 3202a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov SQLiteDatabase db = getWritableDatabase(); 32033d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov 320433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.ACCOUNTS + ";"); 320524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro db.execSQL("INSERT INTO " + Tables.ACCOUNTS + " VALUES(NULL, NULL, NULL)"); 320633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 3207d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.CONTACTS + ";"); 32085ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.RAW_CONTACTS + ";"); 3209a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.DATA + ";"); 3210a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.PHONE_LOOKUP + ";"); 3211a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.NAME_LOOKUP + ";"); 3212ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey db.execSQL("DELETE FROM " + Tables.GROUPS + ";"); 3213b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.AGGREGATION_EXCEPTIONS + ";"); 3214eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey db.execSQL("DELETE FROM " + Tables.SETTINGS + ";"); 3215a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.ACTIVITIES + ";"); 32163d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.CALLS + ";"); 321772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov db.execSQL("DELETE FROM " + Tables.DIRECTORIES + ";"); 3218f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.SEARCH_INDEX + ";"); 321972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov 3220b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov // Note: we are not removing reference data from Tables.NICKNAME_LOOKUP 3221a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov } 3222b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 322304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public NameSplitter createNameSplitter() { 32248ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mNameSplitter = new NameSplitter( 322504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov mContext.getString(com.android.internal.R.string.common_name_prefixes), 322604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov mContext.getString(com.android.internal.R.string.common_last_name_prefixes), 322704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov mContext.getString(com.android.internal.R.string.common_name_suffixes), 322804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov mContext.getString(com.android.internal.R.string.common_name_conjunctions), 322904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Locale.getDefault()); 32308ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov return mNameSplitter; 323104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 323204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 3233b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** 3234619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * Return the {@link ApplicationInfo#uid} for the given package name. 3235619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey */ 3236619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey public static int getUidForPackageName(PackageManager pm, String packageName) { 3237619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey try { 3238619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey ApplicationInfo clientInfo = pm.getApplicationInfo(packageName, 0 /* no flags */); 3239619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey return clientInfo.uid; 3240619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } catch (NameNotFoundException e) { 3241619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey throw new RuntimeException(e); 3242619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } 3243619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } 3244619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey 3245619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey /** 3246b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * Perform an internal string-to-integer lookup using the compiled 3247b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * {@link SQLiteStatement} provided, using the in-memory cache to speed up 3248b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * lookups. If a mapping isn't found in cache or database, it will be 3249b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * created. All new, uncached answers are added to the cache automatically. 3250b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * 3251b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * @param query Compiled statement used to query for the mapping. 3252b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * @param insert Compiled statement used to insert a new mapping when no 3253b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * existing one is found in cache or from query. 3254b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * @param value Value to find mapping for. 3255b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * @param cache In-memory cache of previous answers. 3256b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * @return An unique integer mapping for the given value. 3257b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 3258f4a3b7e523e36679b68edd2af632e26648758ff2Dmitri Plotnikov private long getCachedId(SQLiteStatement query, SQLiteStatement insert, 3259b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey String value, HashMap<String, Long> cache) { 3260b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Try an in-memory cache lookup 3261b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey if (cache.containsKey(value)) { 3262b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return cache.get(value); 3263b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3264b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 3265ec73c9927a67e4afdd35c1b030254ed7f528655fDmitri Plotnikov synchronized (query) { 326636d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov long id = -1; 326736d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov try { 326836d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov // Try searching database for mapping 326936d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(query, 1, value); 327036d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov id = query.simpleQueryForLong(); 327136d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov } catch (SQLiteDoneException e) { 327236d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov // Nothing found, so try inserting new mapping 327336d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(insert, 1, value); 327436d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov id = insert.executeInsert(); 327536d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov } 327636d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov if (id != -1) { 327736d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov // Cache and return the new answer 327836d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov cache.put(value, id); 327936d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov return id; 328036d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov } else { 328136d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov // Otherwise throw if no mapping found or created 328236d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov throw new IllegalStateException("Couldn't find or create internal " 328336d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov + "lookup table entry for value " + value); 328436d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov } 3285b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3286b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3287b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 3288b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** 3289ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Convert a package name into an integer, using {@link Tables#PACKAGES} for 3290b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * lookups and possible allocation of new IDs as needed. 3291b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 3292b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public long getPackageId(String packageName) { 329378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mPackageQuery == null) { 329478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mPackageQuery = getWritableDatabase().compileStatement( 329578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + PackagesColumns._ID + 329678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.PACKAGES + 329778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + PackagesColumns.PACKAGE + "=?"); 329878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 329978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 330078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mPackageInsert == null) { 330178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mPackageInsert = getWritableDatabase().compileStatement( 330278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "INSERT INTO " + Tables.PACKAGES + "(" 330378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + PackagesColumns.PACKAGE + 330478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov ") VALUES (?)"); 330578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 3306b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return getCachedId(mPackageQuery, mPackageInsert, packageName, mPackageCache); 3307b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3308b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 3309b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** 3310ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Convert a mimetype into an integer, using {@link Tables#MIMETYPES} for 3311b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * lookups and possible allocation of new IDs as needed. 3312b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 3313b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public long getMimeTypeId(String mimetype) { 3314b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return getCachedId(mMimetypeQuery, mMimetypeInsert, mimetype, mMimetypeCache); 3315b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3316b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 33172a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov public long getMimeTypeIdForStructuredName() { 33182a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return mMimeTypeIdStructuredName; 33192a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 33202a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 33212a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov public long getMimeTypeIdForOrganization() { 33222a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return mMimeTypeIdOrganization; 33232a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 33242a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 33252a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov public long getMimeTypeIdForIm() { 33262a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return mMimeTypeIdIm; 33272a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 33282a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 33292a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov public long getMimeTypeIdForEmail() { 33302a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return mMimeTypeIdEmail; 33312a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 33322a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 3333a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public long getMimeTypeIdForSip() { 3334a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov return mMimeTypeIdSip; 3335a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 3336a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 33372a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov public int getDisplayNameSourceForMimeTypeId(int mimeTypeId) { 33382a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov if (mimeTypeId == mMimeTypeIdStructuredName) { 33392a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.STRUCTURED_NAME; 33402a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } else if (mimeTypeId == mMimeTypeIdEmail) { 33412a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.EMAIL; 33422a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } else if (mimeTypeId == mMimeTypeIdPhone) { 33432a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.PHONE; 33442a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } else if (mimeTypeId == mMimeTypeIdOrganization) { 33452a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.ORGANIZATION; 33462a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } else if (mimeTypeId == mMimeTypeIdNickname) { 33472a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.NICKNAME; 33482a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } else { 33492a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.UNDEFINED; 33502a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 33512a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 33522a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 3353b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** 3354ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Find the mimetype for the given {@link Data#_ID}. 3355b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 3356b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public String getDataMimeType(long dataId) { 335778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mDataMimetypeQuery == null) { 335878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mDataMimetypeQuery = getWritableDatabase().compileStatement( 335978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + MimetypesColumns.MIMETYPE + 336078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.DATA_JOIN_MIMETYPES + 336178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + Tables.DATA + "." + Data._ID + "=?"); 336278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 3363b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey try { 3364b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Try database query to find mimetype 3365b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey DatabaseUtils.bindObjectToProgram(mDataMimetypeQuery, 1, dataId); 3366b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey String mimetype = mDataMimetypeQuery.simpleQueryForString(); 3367b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return mimetype; 3368b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } catch (SQLiteDoneException e) { 3369b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // No valid mapping found, so return null 3370b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return null; 3371b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3372b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3373b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 3374b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** 3375b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * Find the mime-type for the given {@link Activities#_ID}. 3376b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 3377b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public String getActivityMimeType(long activityId) { 337878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mActivitiesMimetypeQuery == null) { 337978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mActivitiesMimetypeQuery = getWritableDatabase().compileStatement( 338078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + MimetypesColumns.MIMETYPE + 338178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.ACTIVITIES_JOIN_MIMETYPES + 338278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + Tables.ACTIVITIES + "." + Activities._ID + "=?"); 338378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 3384b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey try { 3385b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Try database query to find mimetype 3386b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey DatabaseUtils.bindObjectToProgram(mActivitiesMimetypeQuery, 1, activityId); 3387b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey String mimetype = mActivitiesMimetypeQuery.simpleQueryForString(); 3388b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return mimetype; 3389b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } catch (SQLiteDoneException e) { 3390b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // No valid mapping found, so return null 3391b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return null; 3392b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3393b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 33946bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov 33956bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov /** 3396d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov * Update {@link Contacts#IN_VISIBLE_GROUP} for all contacts. 3397ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey */ 3398ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public void updateAllVisible() { 3399385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov updateCustomContactVisibility(getWritableDatabase(), ""); 3400ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } 3401ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 3402ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey /** 3403f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov * Updates contact visibility and return true iff the visibility was actually changed. 3404f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov */ 3405bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov public boolean updateContactVisibleOnlyIfChanged(TransactionContext txContext, long contactId) { 3406bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov return updateContactVisible(txContext, contactId, true); 3407f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3408f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 3409f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov /** 3410385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov * Update {@link Contacts#IN_VISIBLE_GROUP} and 3411385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov * {@link Tables#DEFAULT_DIRECTORY} for a specific contact. 3412ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey */ 3413bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov public void updateContactVisible(TransactionContext txContext, long contactId) { 3414bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov updateContactVisible(txContext, contactId, false); 3415f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3416f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 3417bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov public boolean updateContactVisible( 3418bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov TransactionContext txContext, long contactId, boolean onlyIfChanged) { 34194394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov SQLiteDatabase db = getWritableDatabase(); 3420f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov updateCustomContactVisibility(db, " AND " + Contacts._ID + "=" + contactId); 3421385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 3422385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov String contactIdAsString = String.valueOf(contactId); 3423385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov long mimetype = getMimeTypeId(GroupMembership.CONTENT_ITEM_TYPE); 3424385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 3425385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov // The contact will be included in the default directory if contains 3426d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov // a raw contact that is in any group or in an account that 3427385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov // does not have any AUTO_ADD groups. 3428f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov boolean newVisibility = DatabaseUtils.longForQuery(db, 3429385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov "SELECT EXISTS (" + 3430385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov "SELECT " + RawContacts.CONTACT_ID + 3431385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 3432385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " JOIN " + Tables.DATA + 3433385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " ON (" + RawContactsColumns.CONCRETE_ID + "=" 3434385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + Data.RAW_CONTACT_ID + ")" + 3435385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=?" + 3436385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + DataColumns.MIMETYPE_ID + "=?" + 3437385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ") OR EXISTS (" + 3438385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov "SELECT " + RawContacts._ID + 3439385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 3440385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=?" + 3441385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND NOT EXISTS" + 3442385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " (SELECT " + Groups._ID + 3443385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.GROUPS + 3444385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + RawContactsColumns.CONCRETE_ACCOUNT_NAME + " = " 3445385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + GroupsColumns.CONCRETE_ACCOUNT_NAME + 3446385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " = " 3447385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + GroupsColumns.CONCRETE_ACCOUNT_TYPE + 3448385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + Groups.AUTO_ADD + " != 0" + 3449385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ")" + 3450385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ") OR EXISTS (" + 3451385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov "SELECT " + RawContacts._ID + 3452385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 3453385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=?" + 3454385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_ACCOUNT_NAME + " IS NULL " + 3455385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " IS NULL" + 3456385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ")", 3457385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov new String[] { 3458385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov contactIdAsString, 34596c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov String.valueOf(mimetype), 3460385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov contactIdAsString, 34616c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov contactIdAsString 3462f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov }) != 0; 3463385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 3464f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov if (onlyIfChanged) { 3465f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov boolean oldVisibility = isContactInDefaultDirectory(db, contactId); 3466f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov if (oldVisibility == newVisibility) { 3467f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov return false; 3468f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3469f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3470f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 3471f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov if (newVisibility) { 3472385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov db.execSQL("INSERT OR IGNORE INTO " + Tables.DEFAULT_DIRECTORY + " VALUES(?)", 3473385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov new String[] { contactIdAsString }); 3474bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov txContext.invalidateSearchIndexForContact(contactId); 3475385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov } else { 3476bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov db.execSQL("DELETE FROM " + Tables.DEFAULT_DIRECTORY + 3477bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov " WHERE " + Contacts._ID + "=?", 3478bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov new String[] { contactIdAsString }); 3479bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov db.execSQL("DELETE FROM " + Tables.SEARCH_INDEX + 3480bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov " WHERE " + SearchIndexColumns.CONTACT_ID + "=CAST(? AS int)", 3481385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov new String[] { contactIdAsString }); 3482385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov } 3483f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov return true; 3484f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3485f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 3486f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov public boolean isContactInDefaultDirectory(SQLiteDatabase db, long contactId) { 3487f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov if (mContactInDefaultDirectoryQuery == null) { 3488f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov mContactInDefaultDirectoryQuery = db.compileStatement( 3489f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov "SELECT EXISTS (" + 3490f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov "SELECT 1 FROM " + Tables.DEFAULT_DIRECTORY + 3491f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov " WHERE " + Contacts._ID + "=?)"); 3492f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3493f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov mContactInDefaultDirectoryQuery.bindLong(1, contactId); 3494f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov return mContactInDefaultDirectoryQuery.simpleQueryForLong() != 0; 3495385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov } 34964394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 3497385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov private void updateCustomContactVisibility(SQLiteDatabase db, String selection) { 3498ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey final long groupMembershipMimetypeId = getMimeTypeId(GroupMembership.CONTENT_ITEM_TYPE); 34994394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov String[] selectionArgs = new String[]{String.valueOf(groupMembershipMimetypeId)}; 35004394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 35014394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov // First delete what needs to be deleted, then insert what needs to be added. 35024394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov // Since flash writes are very expensive, this approach is much better than 35034394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov // delete-all-insert-all. 35044394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.VISIBLE_CONTACTS + 35054394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " WHERE " + "_id NOT IN" + 35064394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "(SELECT " + Contacts._ID + 35074394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " FROM " + Tables.CONTACTS + 35084394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " WHERE (" + Clauses.CONTACT_IS_VISIBLE + ")=1) " + selection, 35094394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov selectionArgs); 3510fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 35114394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("INSERT INTO " + Tables.VISIBLE_CONTACTS + 35124394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " SELECT " + Contacts._ID + 35134394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " FROM " + Tables.CONTACTS + 35144394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " WHERE " + Contacts._ID + 35154394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " NOT IN " + Tables.VISIBLE_CONTACTS + 35164394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " AND (" + Clauses.CONTACT_IS_VISIBLE + ")=1 " + selection, 35174394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov selectionArgs); 3518ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } 3519ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 3520ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey /** 3521d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov * Returns contact ID for the given contact or zero if it is NULL. 35226bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov */ 3523d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public long getContactId(long rawContactId) { 352478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mContactIdQuery == null) { 352578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mContactIdQuery = getWritableDatabase().compileStatement( 352678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + RawContacts.CONTACT_ID + 352778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 352878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?"); 352978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 35306bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov try { 3531d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(mContactIdQuery, 1, rawContactId); 3532d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov return mContactIdQuery.simpleQueryForLong(); 35336bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov } catch (SQLiteDoneException e) { 3534a3bd0246ca3741877488bca7aadd91c79b2fd8d2Fred Quintana // No valid mapping found, so return 0 35356bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov return 0; 35366bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov } 35376bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov } 353861bbb2287e8102b7e03922c03809c34b7b317d1cDmitri Plotnikov 35395ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public int getAggregationMode(long rawContactId) { 354078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mAggregationModeQuery == null) { 354178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mAggregationModeQuery = getWritableDatabase().compileStatement( 354278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + RawContacts.AGGREGATION_MODE + 354378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 354478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?"); 354578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 3546f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov try { 35475ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(mAggregationModeQuery, 1, rawContactId); 3548f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return (int)mAggregationModeQuery.simpleQueryForLong(); 3549f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } catch (SQLiteDoneException e) { 35506cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov // No valid row found, so return "disabled" 35516cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov return RawContacts.AGGREGATION_MODE_DISABLED; 3552f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 3553f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 3554f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 3555892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov public void buildPhoneLookupAndContactQuery( 3556892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov SQLiteQueryBuilder qb, String normalizedNumber, String numberE164) { 3557892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov String minMatch = PhoneNumberUtils.toCallerIDMinMatch(normalizedNumber); 3558e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov StringBuilder sb = new StringBuilder(); 355936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov appendPhoneLookupTables(sb, minMatch, true); 3560e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov qb.setTables(sb.toString()); 3561e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 3562e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov sb = new StringBuilder(); 3563892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov appendPhoneLookupSelection(sb, normalizedNumber, numberE164); 3564e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov qb.appendWhere(sb.toString()); 3565bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov } 3566bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 3567e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov public String buildPhoneLookupAsNestedQuery(String number) { 3568e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov StringBuilder sb = new StringBuilder(); 356936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov final String minMatch = PhoneNumberUtils.toCallerIDMinMatch(number); 3570e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov sb.append("(SELECT DISTINCT raw_contact_id" + " FROM "); 357136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov appendPhoneLookupTables(sb, minMatch, false); 3572e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov sb.append(" WHERE "); 3573892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov appendPhoneLookupSelection(sb, number, null); 3574e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov sb.append(")"); 3575e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov return sb.toString(); 3576e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov } 3577e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 357836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov private void appendPhoneLookupTables(StringBuilder sb, final String minMatch, 3579e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov boolean joinContacts) { 3580e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov sb.append(Tables.RAW_CONTACTS); 3581e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov if (joinContacts) { 3582fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov sb.append(" JOIN " + getContactView() + " contacts_view" 3583fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + " ON (contacts_view._id = raw_contacts.contact_id)"); 3584e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov } 3585892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(", (SELECT data_id, normalized_number, length(normalized_number) as len " 3586892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + " FROM phone_lookup " + " WHERE (" + Tables.PHONE_LOOKUP + "." 3587892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + PhoneLookupColumns.MIN_MATCH + " = '"); 358836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov sb.append(minMatch); 358936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov sb.append("')) AS lookup, " + Tables.DATA); 3590e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov } 3591e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 3592892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov private void appendPhoneLookupSelection(StringBuilder sb, String number, String numberE164) { 3593892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append("lookup.data_id=data._id AND data.raw_contact_id=raw_contacts._id"); 3594892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov boolean hasNumberE164 = !TextUtils.isEmpty(numberE164); 3595892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov boolean hasNumber = !TextUtils.isEmpty(number); 3596892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (hasNumberE164 || hasNumber) { 3597892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" AND ( "); 3598892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (hasNumberE164) { 3599892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" lookup.normalized_number = "); 3600892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov DatabaseUtils.appendEscapedSQLString(sb, numberE164); 3601892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 3602892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (hasNumberE164 && hasNumber) { 3603892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" OR "); 3604892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 3605892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (hasNumber) { 3606892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov int numberLen = number.length(); 3607892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" lookup.len <= "); 3608892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(numberLen); 3609892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" AND substr("); 3610892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov DatabaseUtils.appendEscapedSQLString(sb, number); 3611892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(','); 3612892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(numberLen); 3613892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" - lookup.len + 1) = lookup.normalized_number"); 3614892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 3615892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(')'); 3616892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 361736045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 361836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 361936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov public String getUseStrictPhoneNumberComparisonParameter() { 362036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov return mUseStrictPhoneNumberComparison ? "1" : "0"; 3621fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov } 3622bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 3623619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey /** 3624b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov * Loads common nickname mappings into the database. 3625b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov */ 3626b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov private void loadNicknameLookupTable(SQLiteDatabase db) { 362751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.NICKNAME_LOOKUP); 362851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 362928f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millar String[] strings = mContext.getResources().getStringArray( 363028f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millar com.android.internal.R.array.common_nicknames); 3631b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov if (strings == null || strings.length == 0) { 3632b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov return; 3633b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 3634b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 3635b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov SQLiteStatement nicknameLookupInsert = db.compileStatement("INSERT INTO " 3636b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov + Tables.NICKNAME_LOOKUP + "(" + NicknameLookupColumns.NAME + "," 3637b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov + NicknameLookupColumns.CLUSTER + ") VALUES (?,?)"); 3638b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 363951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov try { 364051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov for (int clusterId = 0; clusterId < strings.length; clusterId++) { 364151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov String[] names = strings[clusterId].split(","); 364251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov for (int j = 0; j < names.length; j++) { 364351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov String name = NameNormalizer.normalize(names[j]); 364451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov try { 364551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(nicknameLookupInsert, 1, name); 364651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(nicknameLookupInsert, 2, 364751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov String.valueOf(clusterId)); 364851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov nicknameLookupInsert.executeInsert(); 364951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } catch (SQLiteException e) { 365051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 365151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov // Print the exception and keep going - this is not a fatal error 365251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov Log.e(TAG, "Cannot insert nickname: " + names[j], e); 365351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 3654b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 3655b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 365651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } finally { 365751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov nicknameLookupInsert.close(); 3658b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 3659b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 3660b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 3661f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public static void copyStringValue(ContentValues toValues, String toKey, 3662f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov ContentValues fromValues, String fromKey) { 3663f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (fromValues.containsKey(fromKey)) { 3664f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov toValues.put(toKey, fromValues.getAsString(fromKey)); 3665f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 3666f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 3667f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 3668f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public static void copyLongValue(ContentValues toValues, String toKey, 3669f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov ContentValues fromValues, String fromKey) { 3670f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (fromValues.containsKey(fromKey)) { 3671f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long longValue; 3672f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov Object value = fromValues.get(fromKey); 3673f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (value instanceof Boolean) { 3674f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if ((Boolean)value) { 3675f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov longValue = 1; 3676f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } else { 3677f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov longValue = 0; 3678f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 36791b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov } else if (value instanceof String) { 36801b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov longValue = Long.parseLong((String)value); 3681f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } else { 36821b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov longValue = ((Number)value).longValue(); 3683f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 3684f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov toValues.put(toKey, longValue); 3685f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 3686f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 3687f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 368835ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana public SyncStateContentProviderHelper getSyncState() { 368935ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana return mSyncState; 369035ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana } 3691c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 3692c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov /** 3693c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov * Delete the aggregate contact if it has no constituent raw contacts other 3694c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov * than the supplied one. 3695c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov */ 3696c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov public void removeContactIfSingleton(long rawContactId) { 3697c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov SQLiteDatabase db = getWritableDatabase(); 3698c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 3699c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov // Obtain contact ID from the supplied raw contact ID 3700c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov String contactIdFromRawContactId = "(SELECT " + RawContacts.CONTACT_ID + " FROM " 3701c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + Tables.RAW_CONTACTS + " WHERE " + RawContacts._ID + "=" + rawContactId + ")"; 3702c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 3703c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov // Find other raw contacts in the same aggregate contact 3704c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov String otherRawContacts = "(SELECT contacts1." + RawContacts._ID + " FROM " 3705c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + Tables.RAW_CONTACTS + " contacts1 JOIN " + Tables.RAW_CONTACTS + " contacts2 ON (" 3706c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + "contacts1." + RawContacts.CONTACT_ID + "=contacts2." + RawContacts.CONTACT_ID 3707c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + ") WHERE contacts1." + RawContacts._ID + "!=" + rawContactId + "" 3708c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + " AND contacts2." + RawContacts._ID + "=" + rawContactId + ")"; 3709c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 3710c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov db.execSQL("DELETE FROM " + Tables.CONTACTS 3711c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + " WHERE " + Contacts._ID + "=" + contactIdFromRawContactId 3712c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + " AND NOT EXISTS " + otherRawContacts + ";"); 3713c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov } 37144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 37154a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov /** 3716b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov * Returns the value from the {@link Tables#PROPERTIES} table. 3717b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov */ 3718b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov public String getProperty(String key, String defaultValue) { 3719b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov Cursor cursor = getReadableDatabase().query(Tables.PROPERTIES, 3720b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov new String[]{PropertiesColumns.PROPERTY_VALUE}, 3721b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov PropertiesColumns.PROPERTY_KEY + "=?", 3722b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov new String[]{key}, null, null, null); 3723b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov String value = null; 3724b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov try { 3725b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov if (cursor.moveToFirst()) { 3726b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov value = cursor.getString(0); 3727b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 3728b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } finally { 3729b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov cursor.close(); 3730b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 3731b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 3732b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov return value != null ? value : defaultValue; 3733b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 3734b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 3735b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov /** 3736b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov * Stores a key-value pair in the {@link Tables#PROPERTIES} table. 3737b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov */ 3738b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov public void setProperty(String key, String value) { 37393d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov setProperty(getWritableDatabase(), key, value); 37403d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov } 37413d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov 37423d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov private void setProperty(SQLiteDatabase db, String key, String value) { 3743b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov ContentValues values = new ContentValues(); 3744b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov values.put(PropertiesColumns.PROPERTY_KEY, key); 3745b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov values.put(PropertiesColumns.PROPERTY_VALUE, value); 37463d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov db.replace(Tables.PROPERTIES, null, values); 3747b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 3748b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 3749b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov /** 37504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov * Check if {@link Binder#getCallingUid()} should be allowed access to 37514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov * {@link RawContacts#IS_RESTRICTED} data. 37524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov */ 3753d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton boolean hasAccessToRestrictedData() { 37544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov final PackageManager pm = mContext.getPackageManager(); 37556ff43a7545880f0b1c0f0a82b3551fb1d0dfa956Marco Nelissen int caller = Binder.getCallingUid(); 37566ff43a7545880f0b1c0f0a82b3551fb1d0dfa956Marco Nelissen if (caller == 0) return true; // root can do anything 37576ff43a7545880f0b1c0f0a82b3551fb1d0dfa956Marco Nelissen final String[] callerPackages = pm.getPackagesForUid(caller); 37584a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 37594a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov // Has restricted access if caller matches any packages 37604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov for (String callerPackage : callerPackages) { 3761d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton if (hasAccessToRestrictedData(callerPackage)) { 3762763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar return true; 3763763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar } 3764763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar } 3765763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar return false; 3766763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar } 3767763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar 3768763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar /** 3769763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar * Check if requestingPackage should be allowed access to 3770763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar * {@link RawContacts#IS_RESTRICTED} data. 3771763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar */ 3772d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton boolean hasAccessToRestrictedData(String requestingPackage) { 3773d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton if (mUnrestrictedPackages != null) { 3774d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton for (String allowedPackage : mUnrestrictedPackages) { 3775d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton if (allowedPackage.equals(requestingPackage)) { 3776d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton return true; 3777d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton } 37784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 37794a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 37804a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov return false; 37814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 37824a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 37834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public String getDataView() { 3784d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa return getDataView(false); 3785d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa } 3786d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa 3787d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa public String getDataView(boolean requireRestrictedView) { 3788d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton return (hasAccessToRestrictedData() && !requireRestrictedView) ? 3789d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa Views.DATA_ALL : Views.DATA_RESTRICTED; 37904a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 37914a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 37924a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public String getRawContactView() { 3793763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar return getRawContactView(false); 3794763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar } 3795763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar 3796763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar public String getRawContactView(boolean requireRestrictedView) { 3797d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton return (hasAccessToRestrictedData() && !requireRestrictedView) ? 3798763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar Views.RAW_CONTACTS_ALL : Views.RAW_CONTACTS_RESTRICTED; 37994a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 38004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 38014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public String getContactView() { 3802763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar return getContactView(false); 38034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 38044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 3805763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar public String getContactView(boolean requireRestrictedView) { 3806d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton return (hasAccessToRestrictedData() && !requireRestrictedView) ? 3807763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar Views.CONTACTS_ALL : Views.CONTACTS_RESTRICTED; 3808f9aeb84d61c01a473819e9173f8311ca5d678a8dJeff Sharkey } 3809f9aeb84d61c01a473819e9173f8311ca5d678a8dJeff Sharkey 381089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public String getGroupView() { 381189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov return Views.GROUPS_ALL; 381289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 381389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 3814a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public String getRawEntitiesView() { 3815a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov return getRawEntitiesView(false); 3816a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 3817a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 3818a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public String getRawEntitiesView(boolean requireRestrictedView) { 3819a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov return (hasAccessToRestrictedData() && !requireRestrictedView) ? 3820a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Views.RAW_ENTITIES : Views.RAW_ENTITIES_RESTRICTED; 3821a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 3822a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 3823a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public String getEntitiesView() { 3824a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov return getEntitiesView(false); 3825d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa } 3826d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa 3827a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public String getEntitiesView(boolean requireRestrictedView) { 3828d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton return (hasAccessToRestrictedData() && !requireRestrictedView) ? 3829a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Views.ENTITIES : Views.ENTITIES_RESTRICTED; 3830d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa } 3831d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa 38322f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa public String getDataUsageStatView() { 38332f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa return getDataUsageStatView(false); 38342f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa } 38352f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 38362f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa public String getDataUsageStatView(boolean requireRestrictedView) { 38372f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa return (hasAccessToRestrictedData() && !requireRestrictedView) ? 38382f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa Views.DATA_USAGE_STAT_ALL : Views.DATA_USAGE_STAT_RESTRICTED; 38392f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa } 38402f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 3841ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov /** 3842ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov * Test if any of the columns appear in the given projection. 3843ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov */ 3844ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov public boolean isInProjection(String[] projection, String... columns) { 384582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov if (projection == null) { 384682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov return true; 384782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov } 3848ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov 384982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov // Optimized for a single-column test 385082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov if (columns.length == 1) { 385182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov String column = columns[0]; 385282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov for (String test : projection) { 385382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov if (column.equals(test)) { 385482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov return true; 385582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov } 385682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov } 385782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov } else { 385882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov for (String test : projection) { 385982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov for (String column : columns) { 3860ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov if (column.equals(test)) { 3861ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov return true; 3862ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 3863ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 3864ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 3865ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 3866ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov return false; 38674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 3868fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov 3869fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov /** 3870fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov * Returns a detailed exception message for the supplied URI. It includes the calling 3871fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov * user and calling package(s). 3872fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov */ 3873fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov public String exceptionMessage(Uri uri) { 3874fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov return exceptionMessage(null, uri); 3875fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 3876fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov 3877fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov /** 3878fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov * Returns a detailed exception message for the supplied URI. It includes the calling 3879fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov * user and calling package(s). 3880fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov */ 3881fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov public String exceptionMessage(String message, Uri uri) { 3882fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov StringBuilder sb = new StringBuilder(); 3883fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov if (message != null) { 3884fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(message).append("; "); 3885fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 3886fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append("URI: ").append(uri); 3887fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov final PackageManager pm = mContext.getPackageManager(); 3888fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov int callingUid = Binder.getCallingUid(); 3889fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(", calling user: "); 3890fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov String userName = pm.getNameForUid(callingUid); 3891fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov if (userName != null) { 3892fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(userName); 3893fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } else { 3894fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(callingUid); 3895fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 3896fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov 3897fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov final String[] callerPackages = pm.getPackagesForUid(callingUid); 3898fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov if (callerPackages != null && callerPackages.length > 0) { 3899fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov if (callerPackages.length == 1) { 3900fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(", calling package:"); 3901fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(callerPackages[0]); 3902fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } else { 3903fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(", calling package is one of: ["); 3904fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov for (int i = 0; i < callerPackages.length; i++) { 3905fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov if (i != 0) { 3906fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(", "); 3907fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 3908fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(callerPackages[i]); 3909fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 3910fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append("]"); 3911fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 3912fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 3913fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov 3914fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov return sb.toString(); 3915fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 3916892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 3917892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov protected String getCountryIso() { 3918892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov CountryDetector detector = 3919892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov (CountryDetector) mContext.getSystemService(Context.COUNTRY_DETECTOR); 3920892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov return detector.detectCountry().getCountryIso(); 3921892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 392278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 392378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void deleteStatusUpdate(long dataId) { 392478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mStatusUpdateDelete == null) { 392578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateDelete = getWritableDatabase().compileStatement( 392678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "DELETE FROM " + Tables.STATUS_UPDATES + 392778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + StatusUpdatesColumns.DATA_ID + "=?"); 392878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 392978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateDelete.bindLong(1, dataId); 393078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateDelete.execute(); 393178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 393278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 393378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void replaceStatusUpdate(Long dataId, long timestamp, String status, String resPackage, 393478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov Long iconResource, Integer labelResource) { 393578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mStatusUpdateReplace == null) { 393678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateReplace = getWritableDatabase().compileStatement( 393778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "INSERT OR REPLACE INTO " + Tables.STATUS_UPDATES + "(" 393878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdatesColumns.DATA_ID + ", " 393978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_TIMESTAMP + "," 394078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS + "," 394178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_RES_PACKAGE + "," 394278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_ICON + "," 394378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_LABEL + ")" + 394478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " VALUES (?,?,?,?,?,?)"); 394578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 394678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateReplace.bindLong(1, dataId); 394778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateReplace.bindLong(2, timestamp); 394878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateReplace, 3, status); 394978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateReplace, 4, resPackage); 395078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusUpdateReplace, 5, iconResource); 395178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusUpdateReplace, 6, labelResource); 395278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateReplace.execute(); 395378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 395478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 395578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void insertStatusUpdate(Long dataId, String status, String resPackage, Long iconResource, 395678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov Integer labelResource) { 395778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mStatusUpdateInsert == null) { 395878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateInsert = getWritableDatabase().compileStatement( 395978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "INSERT INTO " + Tables.STATUS_UPDATES + "(" 396078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdatesColumns.DATA_ID + ", " 396178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS + "," 396278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_RES_PACKAGE + "," 396378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_ICON + "," 396478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_LABEL + ")" + 396578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " VALUES (?,?,?,?,?)"); 396678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 396778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov try { 396878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateInsert.bindLong(1, dataId); 396978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateInsert, 2, status); 397078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateInsert, 3, resPackage); 397178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusUpdateInsert, 4, iconResource); 397278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusUpdateInsert, 5, labelResource); 397378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateInsert.executeInsert(); 397478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } catch (SQLiteConstraintException e) { 397578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov // The row already exists - update it 397678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mStatusUpdateAutoTimestamp == null) { 397778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateAutoTimestamp = getWritableDatabase().compileStatement( 397878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.STATUS_UPDATES + 397978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + StatusUpdates.STATUS_TIMESTAMP + "=?," 398078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS + "=?" + 398178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + StatusUpdatesColumns.DATA_ID + "=?" 398278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + " AND " + StatusUpdates.STATUS + "!=?"); 398378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 398478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 398578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov long timestamp = System.currentTimeMillis(); 398678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateAutoTimestamp.bindLong(1, timestamp); 398778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateAutoTimestamp, 2, status); 398878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateAutoTimestamp.bindLong(3, dataId); 398978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateAutoTimestamp, 4, status); 399078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateAutoTimestamp.execute(); 399178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 399278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mStatusAttributionUpdate == null) { 399378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusAttributionUpdate = getWritableDatabase().compileStatement( 399478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.STATUS_UPDATES + 399578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + StatusUpdates.STATUS_RES_PACKAGE + "=?," 399678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_ICON + "=?," 399778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_LABEL + "=?" + 399878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + StatusUpdatesColumns.DATA_ID + "=?"); 399978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 400078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusAttributionUpdate, 1, resPackage); 400178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusAttributionUpdate, 2, iconResource); 400278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusAttributionUpdate, 3, labelResource); 400378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusAttributionUpdate.bindLong(4, dataId); 400478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusAttributionUpdate.execute(); 400578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 400678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 400778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 400878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** 400978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Resets the {@link RawContacts#NAME_VERIFIED} flag to 0 on all other raw 401078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * contacts in the same aggregate 401178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 401278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void resetNameVerifiedForOtherRawContacts(long rawContactId) { 401378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mResetNameVerifiedForOtherRawContacts == null) { 401478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mResetNameVerifiedForOtherRawContacts = getWritableDatabase().compileStatement( 401578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.RAW_CONTACTS + 401678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + RawContacts.NAME_VERIFIED + "=0" + 401778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=(" + 401878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + RawContacts.CONTACT_ID + 401978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 402078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?)" + 402178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " AND " + RawContacts._ID + "!=?"); 402278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 402378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mResetNameVerifiedForOtherRawContacts.bindLong(1, rawContactId); 402478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mResetNameVerifiedForOtherRawContacts.bindLong(2, rawContactId); 402578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mResetNameVerifiedForOtherRawContacts.execute(); 402678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 402778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 40288ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov private interface RawContactNameQuery { 40298ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final String RAW_SQL = 40308ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov "SELECT " 40318ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + DataColumns.MIMETYPE_ID + "," 40328ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.IS_PRIMARY + "," 40338ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA1 + "," 40348ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA2 + "," 40358ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA3 + "," 40368ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA4 + "," 40378ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA5 + "," 40388ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA6 + "," 40398ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA7 + "," 40408ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA8 + "," 40418ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA9 + "," 40428ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA10 + "," 40438ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA11 + 40448ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov " FROM " + Tables.DATA + 40458ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov " WHERE " + Data.RAW_CONTACT_ID + "=?" + 40468ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov " AND (" + Data.DATA1 + " NOT NULL OR " + 40478ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov Organization.TITLE + " NOT NULL)"; 40488ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 40498ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int MIMETYPE = 0; 40508ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int IS_PRIMARY = 1; 40518ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int DATA1 = 2; 40528ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int GIVEN_NAME = 3; // data2 40538ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int FAMILY_NAME = 4; // data3 40548ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int PREFIX = 5; // data4 40558ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int TITLE = 5; // data4 40568ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int MIDDLE_NAME = 6; // data5 40578ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int SUFFIX = 7; // data6 40588ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int PHONETIC_GIVEN_NAME = 8; // data7 40598ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int PHONETIC_MIDDLE_NAME = 9; // data8 40608ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int ORGANIZATION_PHONETIC_NAME = 9; // data8 40618ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int PHONETIC_FAMILY_NAME = 10; // data9 40628ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int FULL_NAME_STYLE = 11; // data10 40638ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int ORGANIZATION_PHONETIC_NAME_STYLE = 11; // data10 40648ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int PHONETIC_NAME_STYLE = 12; // data11 40658ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 40668ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 40678ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov /** 40688ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov * Updates a raw contact display name based on data rows, e.g. structured name, 40698ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov * organization, email etc. 40708ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov */ 40718ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public void updateRawContactDisplayName(SQLiteDatabase db, long rawContactId) { 40728ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (mNameSplitter == null) { 40738ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov createNameSplitter(); 40748ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 40758ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 40768ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov int bestDisplayNameSource = DisplayNameSources.UNDEFINED; 40778ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov NameSplitter.Name bestName = null; 40788ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String bestDisplayName = null; 40798ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String bestPhoneticName = null; 40808ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov int bestPhoneticNameStyle = PhoneticNameStyle.UNDEFINED; 40818ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 40828ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mSelectionArgs1[0] = String.valueOf(rawContactId); 40838ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov Cursor c = db.rawQuery(RawContactNameQuery.RAW_SQL, mSelectionArgs1); 40848ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov try { 40858ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov while (c.moveToNext()) { 40868ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov int mimeType = c.getInt(RawContactNameQuery.MIMETYPE); 40878ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov int source = getDisplayNameSourceForMimeTypeId(mimeType); 40888ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (source < bestDisplayNameSource || source == DisplayNameSources.UNDEFINED) { 40898ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov continue; 40908ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 40918ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 40928ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (source == bestDisplayNameSource 40938ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov && c.getInt(RawContactNameQuery.IS_PRIMARY) == 0) { 40948ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov continue; 40958ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 40968ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 40978ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (mimeType == getMimeTypeIdForStructuredName()) { 40988ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov NameSplitter.Name name; 40998ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (bestName != null) { 41008ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name = new NameSplitter.Name(); 41018ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else { 41028ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name = mName; 41038ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.clear(); 41048ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 41058ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.prefix = c.getString(RawContactNameQuery.PREFIX); 41068ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.givenNames = c.getString(RawContactNameQuery.GIVEN_NAME); 41078ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.middleName = c.getString(RawContactNameQuery.MIDDLE_NAME); 41088ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.familyName = c.getString(RawContactNameQuery.FAMILY_NAME); 41098ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.suffix = c.getString(RawContactNameQuery.SUFFIX); 41108ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.fullNameStyle = c.isNull(RawContactNameQuery.FULL_NAME_STYLE) 41118ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov ? FullNameStyle.UNDEFINED 41128ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov : c.getInt(RawContactNameQuery.FULL_NAME_STYLE); 41138ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.phoneticFamilyName = c.getString(RawContactNameQuery.PHONETIC_FAMILY_NAME); 41148ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.phoneticMiddleName = c.getString(RawContactNameQuery.PHONETIC_MIDDLE_NAME); 41158ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.phoneticGivenName = c.getString(RawContactNameQuery.PHONETIC_GIVEN_NAME); 41168ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.phoneticNameStyle = c.isNull(RawContactNameQuery.PHONETIC_NAME_STYLE) 41178ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov ? PhoneticNameStyle.UNDEFINED 41188ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov : c.getInt(RawContactNameQuery.PHONETIC_NAME_STYLE); 41198ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (!name.isEmpty()) { 41208ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayNameSource = source; 41218ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestName = name; 41228ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 41238ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else if (mimeType == getMimeTypeIdForOrganization()) { 41248ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mCharArrayBuffer.sizeCopied = 0; 41258ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov c.copyStringToBuffer(RawContactNameQuery.DATA1, mCharArrayBuffer); 41268ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (mCharArrayBuffer.sizeCopied != 0) { 41278ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayNameSource = source; 41288ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayName = new String(mCharArrayBuffer.data, 0, 41298ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mCharArrayBuffer.sizeCopied); 41308ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticName = c.getString( 41318ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov RawContactNameQuery.ORGANIZATION_PHONETIC_NAME); 41328ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticNameStyle = 41338ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov c.isNull(RawContactNameQuery.ORGANIZATION_PHONETIC_NAME_STYLE) 41348ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov ? PhoneticNameStyle.UNDEFINED 41358ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov : c.getInt(RawContactNameQuery.ORGANIZATION_PHONETIC_NAME_STYLE); 41368ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else { 41378ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov c.copyStringToBuffer(RawContactNameQuery.TITLE, mCharArrayBuffer); 41388ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (mCharArrayBuffer.sizeCopied != 0) { 41398ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayNameSource = source; 41408ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayName = new String(mCharArrayBuffer.data, 0, 41418ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mCharArrayBuffer.sizeCopied); 41428ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticName = null; 41438ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticNameStyle = PhoneticNameStyle.UNDEFINED; 41448ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 41458ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 41468ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else { 41478ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov // Display name is at DATA1 in all other types. 41488ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov // This is ensured in the constructor. 41498ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 41508ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mCharArrayBuffer.sizeCopied = 0; 41518ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov c.copyStringToBuffer(RawContactNameQuery.DATA1, mCharArrayBuffer); 41528ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (mCharArrayBuffer.sizeCopied != 0) { 41538ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayNameSource = source; 41548ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayName = new String(mCharArrayBuffer.data, 0, 41558ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mCharArrayBuffer.sizeCopied); 41568ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticName = null; 41578ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticNameStyle = PhoneticNameStyle.UNDEFINED; 41588ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 41598ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 41608ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 41618ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 41628ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } finally { 41638ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov c.close(); 41648ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 41658ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 41668ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String displayNamePrimary; 41678ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String displayNameAlternative; 416855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov String sortNamePrimary; 416955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov String sortNameAlternative; 41708ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String sortKeyPrimary = null; 41718ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String sortKeyAlternative = null; 41728ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov int displayNameStyle = FullNameStyle.UNDEFINED; 41738ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 41748ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (bestDisplayNameSource == DisplayNameSources.STRUCTURED_NAME) { 41758ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle = bestName.fullNameStyle; 41768ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (displayNameStyle == FullNameStyle.CJK 41778ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov || displayNameStyle == FullNameStyle.UNDEFINED) { 41788ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle = mNameSplitter.getAdjustedFullNameStyle(displayNameStyle); 41798ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestName.fullNameStyle = displayNameStyle; 41808ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 41818ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 418255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov displayNamePrimary = mNameSplitter.join(bestName, true, true); 418355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov displayNameAlternative = mNameSplitter.join(bestName, false, true); 418455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 418555e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov if (TextUtils.isEmpty(bestName.prefix)) { 418655e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNamePrimary = displayNamePrimary; 418755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNameAlternative = displayNameAlternative; 418855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } else { 418955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNamePrimary = mNameSplitter.join(bestName, true, false); 419055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNameAlternative = mNameSplitter.join(bestName, false, false); 419155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 41928ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 41938ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticName = mNameSplitter.joinPhoneticName(bestName); 41948ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticNameStyle = bestName.phoneticNameStyle; 41958ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else { 41968ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNamePrimary = displayNameAlternative = bestDisplayName; 419755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNamePrimary = sortNameAlternative = bestDisplayName; 41988ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 41998ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 42008ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (bestPhoneticName != null) { 42018ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov sortKeyPrimary = sortKeyAlternative = bestPhoneticName; 42028ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (bestPhoneticNameStyle == PhoneticNameStyle.UNDEFINED) { 42038ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticNameStyle = mNameSplitter.guessPhoneticNameStyle(bestPhoneticName); 42048ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42058ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else { 42068ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (displayNameStyle == FullNameStyle.UNDEFINED) { 42078ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle = mNameSplitter.guessFullNameStyle(bestDisplayName); 42088ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (displayNameStyle == FullNameStyle.UNDEFINED 42098ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov || displayNameStyle == FullNameStyle.CJK) { 42108ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle = mNameSplitter.getAdjustedNameStyleBasedOnPhoneticNameStyle( 42118ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle, bestPhoneticNameStyle); 42128ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42138ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle = mNameSplitter.getAdjustedFullNameStyle(displayNameStyle); 42148ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42158ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (displayNameStyle == FullNameStyle.CHINESE || 42168ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle == FullNameStyle.CJK) { 42178ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov sortKeyPrimary = sortKeyAlternative = 42188ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov ContactLocaleUtils.getIntance().getSortKey( 421955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNamePrimary, displayNameStyle); 42208ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42218ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42228ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 42238ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (sortKeyPrimary == null) { 422455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortKeyPrimary = sortNamePrimary; 422555e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortKeyAlternative = sortNameAlternative; 42268ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42278ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 422878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mRawContactDisplayNameUpdate == null) { 422955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov mRawContactDisplayNameUpdate = db.compileStatement( 423078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.RAW_CONTACTS + 423178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + 423278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.DISPLAY_NAME_SOURCE + "=?," + 423378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.DISPLAY_NAME_PRIMARY + "=?," + 423478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.DISPLAY_NAME_ALTERNATIVE + "=?," + 423578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.PHONETIC_NAME + "=?," + 423678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.PHONETIC_NAME_STYLE + "=?," + 423778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.SORT_KEY_PRIMARY + "=?," + 423878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.SORT_KEY_ALTERNATIVE + "=?" + 423978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?"); 424078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 424155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 424255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov mRawContactDisplayNameUpdate.bindLong(1, bestDisplayNameSource); 424378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mRawContactDisplayNameUpdate, 2, displayNamePrimary); 424478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mRawContactDisplayNameUpdate, 3, displayNameAlternative); 424555e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov bindString(mRawContactDisplayNameUpdate, 4, bestPhoneticName); 424655e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov mRawContactDisplayNameUpdate.bindLong(5, bestPhoneticNameStyle); 424778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mRawContactDisplayNameUpdate, 6, sortKeyPrimary); 424878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mRawContactDisplayNameUpdate, 7, sortKeyAlternative); 424978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mRawContactDisplayNameUpdate.bindLong(8, rawContactId); 425078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mRawContactDisplayNameUpdate.execute(); 425178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 425278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 425378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /* 425478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Sets the given dataId record in the "data" table to primary, and resets all data records of 425578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * the same mimetype and under the same contact to not be primary. 425678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * 425778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * @param dataId the id of the data record to be set to primary. Pass -1 to clear the primary 425878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * flag of all data items of this raw contacts 425978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 426078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void setIsPrimary(long rawContactId, long dataId, long mimeTypeId) { 426178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mSetPrimaryStatement == null) { 426278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement = getWritableDatabase().compileStatement( 426378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.DATA + 426478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + Data.IS_PRIMARY + "=(_id=?)" + 426578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + DataColumns.MIMETYPE_ID + "=?" + 426678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " AND " + Data.RAW_CONTACT_ID + "=?"); 426778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 426878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement.bindLong(1, dataId); 426978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement.bindLong(2, mimeTypeId); 427078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement.bindLong(3, rawContactId); 427178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement.execute(); 427278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 427378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 427478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /* 427578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Clears the super primary of all data items of the given raw contact. does not touch 427678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * other raw contacts of the same joined aggregate 427778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 427878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void clearSuperPrimary(long rawContactId, long mimeTypeId) { 427978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mClearSuperPrimaryStatement == null) { 428078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mClearSuperPrimaryStatement = getWritableDatabase().compileStatement( 428178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.DATA + 428278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + Data.IS_SUPER_PRIMARY + "=0" + 428378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + DataColumns.MIMETYPE_ID + "=?" + 428478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " AND " + Data.RAW_CONTACT_ID + "=?"); 428578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 428678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mClearSuperPrimaryStatement.bindLong(1, mimeTypeId); 428778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mClearSuperPrimaryStatement.bindLong(2, rawContactId); 428878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mClearSuperPrimaryStatement.execute(); 428978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 429078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 429178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /* 429278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Sets the given dataId record in the "data" table to "super primary", and resets all data 429378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * records of the same mimetype and under the same aggregate to not be "super primary". 429478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * 429578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * @param dataId the id of the data record to be set to primary. 429678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 429778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void setIsSuperPrimary(long rawContactId, long dataId, long mimeTypeId) { 429878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mSetSuperPrimaryStatement == null) { 429978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement = getWritableDatabase().compileStatement( 430078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.DATA + 430178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + Data.IS_SUPER_PRIMARY + "=(" + Data._ID + "=?)" + 430278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + DataColumns.MIMETYPE_ID + "=?" + 430378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " AND " + Data.RAW_CONTACT_ID + " IN (" + 430478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + RawContacts._ID + 430578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 430678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + " =(" + 430778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + RawContacts.CONTACT_ID + 430878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 430978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?))"); 431078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 431178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement.bindLong(1, dataId); 431278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement.bindLong(2, mimeTypeId); 431378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement.bindLong(3, rawContactId); 431478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement.execute(); 431578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 431678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 431778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** 431878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Inserts a record in the {@link Tables#NAME_LOOKUP} table. 431978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 432078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void insertNameLookup(long rawContactId, long dataId, int lookupType, String name) { 432178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (TextUtils.isEmpty(name)) { 432278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov return; 432378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 432478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 432578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mNameLookupInsert == null) { 432678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert = getWritableDatabase().compileStatement( 432778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "INSERT OR IGNORE INTO " + Tables.NAME_LOOKUP + "(" 432878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + NameLookupColumns.RAW_CONTACT_ID + "," 432978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + NameLookupColumns.DATA_ID + "," 433078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + NameLookupColumns.NAME_TYPE + "," 433178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + NameLookupColumns.NORMALIZED_NAME 433278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + ") VALUES (?,?,?,?)"); 433378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 433478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert.bindLong(1, rawContactId); 433578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert.bindLong(2, dataId); 433678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert.bindLong(3, lookupType); 433778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mNameLookupInsert, 4, name); 433878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert.executeInsert(); 433978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 434078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 434178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** 434278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Deletes all {@link Tables#NAME_LOOKUP} table rows associated with the specified data element. 434378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 434478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void deleteNameLookup(long dataId) { 434578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mNameLookupDelete == null) { 434678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupDelete = getWritableDatabase().compileStatement( 434778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "DELETE FROM " + Tables.NAME_LOOKUP + 434878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + NameLookupColumns.DATA_ID + "=?"); 434978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 435078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupDelete.bindLong(1, dataId); 435178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupDelete.execute(); 435278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 4353189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov 4354e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov public String insertNameLookupForEmail(long rawContactId, long dataId, String email) { 4355e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov if (TextUtils.isEmpty(email)) { 4356e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov return null; 4357e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4358e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 4359e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov String address = extractHandleFromEmailAddress(email); 4360e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov if (address == null) { 4361e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov return null; 4362e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4363e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 4364e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov insertNameLookup(rawContactId, dataId, 4365e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov NameLookupType.EMAIL_BASED_NICKNAME, NameNormalizer.normalize(address)); 4366e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov return address; 4367e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4368e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 4369e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov /** 4370e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov * Normalizes the nickname and inserts it in the name lookup table. 4371e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov */ 4372e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov public void insertNameLookupForNickname(long rawContactId, long dataId, String nickname) { 4373e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov if (TextUtils.isEmpty(nickname)) { 4374e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov return; 4375e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4376e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 4377e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov insertNameLookup(rawContactId, dataId, 4378e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov NameLookupType.NICKNAME, NameNormalizer.normalize(nickname)); 4379e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4380e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 43815df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov public void insertNameLookupForPhoneticName(long rawContactId, long dataId, String familyName, 43825df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov String middleName, String givenName) { 43835df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov mSb.setLength(0); 43845df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov if (familyName != null) { 43855df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov mSb.append(familyName.trim()); 43865df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov } 43875df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov if (middleName != null) { 43885df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov mSb.append(middleName.trim()); 43895df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov } 43905df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov if (givenName != null) { 43915df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov mSb.append(givenName.trim()); 43925df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov } 43935df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov 43945df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov if (mSb.length() > 0) { 43955df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov insertNameLookup(rawContactId, dataId, NameLookupType.NAME_COLLATION_KEY, 43965df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov NameNormalizer.normalize(mSb.toString())); 43975df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov } 43985df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov } 43995df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov 4400189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov /** 4401189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov * Performs a query and returns true if any Data item of the raw contact with the given 4402189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov * id and mimetype is marked as super-primary 4403189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov */ 4404189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov public boolean rawContactHasSuperPrimary(long rawContactId, long mimeTypeId) { 4405189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov final Cursor existsCursor = getReadableDatabase().rawQuery( 4406189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov "SELECT EXISTS(SELECT 1 FROM " + Tables.DATA + 4407189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov " WHERE " + Data.RAW_CONTACT_ID + "=?" + 4408189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov " AND " + DataColumns.MIMETYPE_ID + "=?" + 4409189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov " AND " + Data.IS_SUPER_PRIMARY + "<>0)", 4410189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov new String[] { String.valueOf(rawContactId), String.valueOf(mimeTypeId) }); 4411189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov try { 4412189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov if (!existsCursor.moveToFirst()) throw new IllegalStateException(); 4413189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov return existsCursor.getInt(0) != 0; 4414189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov } finally { 4415189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov existsCursor.close(); 4416189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov } 4417189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov } 4418e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 4419e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov public String getCurrentCountryIso() { 4420e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov return mCountryMonitor.getCountryIso(); 4421e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4422f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 4423383d8aa53aa2f74a4b71642de7df2e4b9f2242c8Dmitri Plotnikov /* package */ String querySearchIndexContentForTest(long contactId) { 4424f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov return DatabaseUtils.stringForQuery(getReadableDatabase(), 4425f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov "SELECT " + SearchIndexColumns.CONTENT + 4426f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov " FROM " + Tables.SEARCH_INDEX + 4427f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov " WHERE " + SearchIndexColumns.CONTACT_ID + "=CAST(? AS int)", 4428f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov new String[] { String.valueOf(contactId) }); 4429f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 4430f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 4431383d8aa53aa2f74a4b71642de7df2e4b9f2242c8Dmitri Plotnikov /* package */ String querySearchIndexTokensForTest(long contactId) { 4432f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov return DatabaseUtils.stringForQuery(getReadableDatabase(), 4433f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov "SELECT " + SearchIndexColumns.TOKENS + 4434f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov " FROM " + Tables.SEARCH_INDEX + 4435f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov " WHERE " + SearchIndexColumns.CONTACT_ID + "=CAST(? AS int)", 4436f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov new String[] { String.valueOf(contactId) }); 4437f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 4438b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey} 4439