ContactsDatabaseHelper.java revision 3b505de6c622d20d40b85b361c1437a89aef82de
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; 673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport android.provider.ContactsContract.StreamItems; 683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport android.provider.ContactsContract.StreamItemPhotos; 6967dde51ab932dc84d95a203b113989b13437f13dJeff Sharkeyimport android.provider.SocialContract.Activities; 70069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjeeimport android.provider.VoicemailContract; 7159f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjeeimport android.provider.VoicemailContract.Voicemails; 72bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikovimport android.telephony.PhoneNumberUtils; 7336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikovimport android.text.TextUtils; 74b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikovimport android.text.util.Rfc822Token; 75b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikovimport android.text.util.Rfc822Tokenizer; 76b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkeyimport android.util.Log; 77b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 78b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkeyimport java.util.HashMap; 795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.util.Locale; 80b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 81b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey/** 82b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov * Database helper for contacts. Designed as a singleton to make sure that all 83b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov * {@link android.content.ContentProvider} users get the same reference. 84b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov * Provides handy methods for maintaining package and mime-type lookup tables. 85b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 86b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov/* package */ class ContactsDatabaseHelper extends SQLiteOpenHelper { 87b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov private static final String TAG = "ContactsDatabaseHelper"; 88b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 8997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov /** 9094c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov * Contacts DB version ranges: 9197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * <pre> 9297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 0-98 Cupcake/Donut 9397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 100-199 Eclair 9497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 200-299 Eclair-MR1 9597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 300-349 Froyo 9697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 350-399 Gingerbread 9797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 400-499 Honeycomb 9824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * 500-549 Honeycomb-MR1 9924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * 550-599 Honeycomb-MR2 10024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * 600-699 Ice Cream Sandwich 10197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * </pre> 10297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov */ 1033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann static final int DATABASE_VERSION = 605; 104e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 105b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private static final String DATABASE_NAME = "contacts2.db"; 1061f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey private static final String DATABASE_PRESENCE = "presence_db"; 107b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 108b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public interface Tables { 109d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONTACTS = "contacts"; 1105ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String RAW_CONTACTS = "raw_contacts"; 1113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public static final String STREAM_ITEMS = "stream_items"; 1123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public static final String STREAM_ITEM_PHOTOS = "stream_item_photos"; 113ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String PACKAGES = "packages"; 114ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String MIMETYPES = "mimetypes"; 115b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String PHONE_LOOKUP = "phone_lookup"; 116a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public static final String NAME_LOOKUP = "name_lookup"; 117b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov public static final String AGGREGATION_EXCEPTIONS = "agg_exceptions"; 118eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey public static final String SETTINGS = "settings"; 119b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String DATA = "data"; 120ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String GROUPS = "groups"; 1211f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey public static final String PRESENCE = "presence"; 122e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov public static final String AGGREGATED_PRESENCE = "agg_presence"; 123b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov public static final String NICKNAME_LOOKUP = "nickname_lookup"; 124e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov public static final String CALLS = "calls"; 125a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov public static final String STATUS_UPDATES = "status_updates"; 126b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov public static final String PROPERTIES = "properties"; 127743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov public static final String ACCOUNTS = "accounts"; 1284394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov public static final String VISIBLE_CONTACTS = "visible_contacts"; 129d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public static final String DIRECTORIES = "directories"; 130385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov public static final String DEFAULT_DIRECTORY = "default_directory"; 131f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov public static final String SEARCH_INDEX = "search_index"; 132069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee public static final String VOICEMAIL_STATUS = "voicemail_status"; 133b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 13446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** 13546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * For {@link ContactsContract.DataUsageFeedback}. The table structure itself 13646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * is not exposed outside. 13746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa */ 13846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String DATA_USAGE_STAT = "data_usage_stat"; 13946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 140ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String DATA_JOIN_MIMETYPES = "data " 1411b03c2d019966fba89dad3678dd9f04e4e5f4802Dmitri Plotnikov + "JOIN mimetypes ON (data.mimetype_id = mimetypes._id)"; 142b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 14311944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov public static final String DATA_JOIN_RAW_CONTACTS = "data " 1448e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov + "JOIN raw_contacts ON (data.raw_contact_id = raw_contacts._id)"; 14511944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov 1465ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String DATA_JOIN_MIMETYPE_RAW_CONTACTS = "data " 147c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + "JOIN mimetypes ON (data.mimetype_id = mimetypes._id) " 148c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + "JOIN raw_contacts ON (data.raw_contact_id = raw_contacts._id)"; 149bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 150e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey // NOTE: This requires late binding of GroupMembership MIME-type 151e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey public static final String RAW_CONTACTS_JOIN_SETTINGS_DATA_GROUPS = "raw_contacts " 152e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN settings ON (" 153e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "raw_contacts.account_name = settings.account_name AND " 154e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "raw_contacts.account_type = settings.account_type) " 155e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN data ON (data.mimetype_id=? AND " 156e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "data.raw_contact_id = raw_contacts._id) " 157e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN groups ON (groups._id = data." + GroupMembership.GROUP_ROW_ID 158e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + ")"; 159e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 160e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey // NOTE: This requires late binding of GroupMembership MIME-type 161e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey public static final String SETTINGS_JOIN_RAW_CONTACTS_DATA_MIMETYPES_CONTACTS = "settings " 162e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN raw_contacts ON (" 163e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "raw_contacts.account_name = settings.account_name AND " 164e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "raw_contacts.account_type = settings.account_type) " 165e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN data ON (data.mimetype_id=? AND " 166e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "data.raw_contact_id = raw_contacts._id) " 167e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN contacts ON (raw_contacts.contact_id = contacts._id)"; 168e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 169d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String DATA_JOIN_MIMETYPES_RAW_CONTACTS_CONTACTS = "data " 1701b03c2d019966fba89dad3678dd9f04e4e5f4802Dmitri Plotnikov + "JOIN mimetypes ON (data.mimetype_id = mimetypes._id) " 1711b03c2d019966fba89dad3678dd9f04e4e5f4802Dmitri Plotnikov + "JOIN raw_contacts ON (data.raw_contact_id = raw_contacts._id) " 172d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + "LEFT OUTER JOIN contacts ON (raw_contacts.contact_id = contacts._id)"; 173ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 1745ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String DATA_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_GROUPS = "data " 1751b03c2d019966fba89dad3678dd9f04e4e5f4802Dmitri Plotnikov + "JOIN mimetypes ON (data.mimetype_id = mimetypes._id) " 1761b03c2d019966fba89dad3678dd9f04e4e5f4802Dmitri Plotnikov + "JOIN raw_contacts ON (data.raw_contact_id = raw_contacts._id) " 17767dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey + "LEFT OUTER JOIN packages ON (data.package_id = packages._id) " 1789261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana + "LEFT OUTER JOIN groups " 1799261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana + " ON (mimetypes.mimetype='" + GroupMembership.CONTENT_ITEM_TYPE + "' " 1809261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana + " AND groups._id = data." + GroupMembership.GROUP_ROW_ID + ") "; 181ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 182ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String GROUPS_JOIN_PACKAGES = "groups " 183ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey + "LEFT OUTER JOIN packages ON (groups.package_id = packages._id)"; 184ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 185b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 186b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String ACTIVITIES = "activities"; 187b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 188ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String ACTIVITIES_JOIN_MIMETYPES = "activities " 189ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey + "LEFT OUTER JOIN mimetypes ON (activities.mimetype_id = mimetypes._id)"; 190b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 191d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String ACTIVITIES_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_CONTACTS = 1925ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov "activities " 19367dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey + "LEFT OUTER JOIN packages ON (activities.package_id = packages._id) " 194ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey + "LEFT OUTER JOIN mimetypes ON (activities.mimetype_id = mimetypes._id) " 1955ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + "LEFT OUTER JOIN raw_contacts ON (activities.author_contact_id = " + 196fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "raw_contacts._id) " 197d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + "LEFT OUTER JOIN contacts ON (raw_contacts.contact_id = contacts._id)"; 1987e4676dfcaa8853b81c2133e0e318ed3436fe787Fred Quintana 1995ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String NAME_LOOKUP_JOIN_RAW_CONTACTS = "name_lookup " 2005ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + "INNER JOIN raw_contacts ON (name_lookup.raw_contact_id = raw_contacts._id)"; 201b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 202b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 2034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public interface Views { 2044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public static final String DATA_ALL = "view_data"; 2054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public static final String DATA_RESTRICTED = "view_data_restricted"; 2064a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2074a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public static final String RAW_CONTACTS_ALL = "view_raw_contacts"; 2084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public static final String RAW_CONTACTS_RESTRICTED = "view_raw_contacts_restricted"; 2094a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public static final String CONTACTS_ALL = "view_contacts"; 2114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public static final String CONTACTS_RESTRICTED = "view_contacts_restricted"; 21289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 213a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public static final String ENTITIES = "view_entities"; 214a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public static final String ENTITIES_RESTRICTED = "view_entities_restricted"; 215a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 216a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public static final String RAW_ENTITIES = "view_raw_entities"; 217a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public static final String RAW_ENTITIES_RESTRICTED = "view_raw_entities_restricted"; 218a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 21989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public static final String GROUPS_ALL = "view_groups"; 2202f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 2212f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa public static final String DATA_USAGE_STAT_ALL = "view_data_usage_stat"; 2222f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa public static final String DATA_USAGE_STAT_RESTRICTED = 2232f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa "view_data_usage_stat_restricted"; 2244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 2254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2261f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey public interface Clauses { 227e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey final String MIMETYPE_IS_GROUP_MEMBERSHIP = MimetypesColumns.CONCRETE_MIMETYPE + "='" 228e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + GroupMembership.CONTENT_ITEM_TYPE + "'"; 229ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 230e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey final String BELONGS_TO_GROUP = DataColumns.CONCRETE_GROUP_ID + "=" 231ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey + GroupsColumns.CONCRETE_ID; 232ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 23368936cefd4caa779169ea00ffd1adc399e634c9bJeff Sharkey final String HAVING_NO_GROUPS = "COUNT(" + DataColumns.CONCRETE_GROUP_ID + ") == 0"; 2349261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 23568936cefd4caa779169ea00ffd1adc399e634c9bJeff Sharkey final String GROUP_BY_ACCOUNT_CONTACT_ID = SettingsColumns.CONCRETE_ACCOUNT_NAME + "," 23668936cefd4caa779169ea00ffd1adc399e634c9bJeff Sharkey + SettingsColumns.CONCRETE_ACCOUNT_TYPE + "," + RawContacts.CONTACT_ID; 237e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 238e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey final String RAW_CONTACT_IS_LOCAL = RawContactsColumns.CONCRETE_ACCOUNT_NAME 239e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + " IS NULL AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " IS NULL"; 240e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 241e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey final String ZERO_GROUP_MEMBERSHIPS = "COUNT(" + GroupsColumns.CONCRETE_ID + ")=0"; 242e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 2431a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final String OUTER_RAW_CONTACTS = "outer_raw_contacts"; 2441a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final String OUTER_RAW_CONTACTS_ID = OUTER_RAW_CONTACTS + "." + RawContacts._ID; 2451a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 246b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov final String CONTACT_IS_VISIBLE = 247b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov "SELECT " + 2481a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey "MAX((SELECT (CASE WHEN " + 249b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov "(CASE" + 250b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " WHEN " + RAW_CONTACT_IS_LOCAL + 251b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " THEN 1 " + 252b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " WHEN " + ZERO_GROUP_MEMBERSHIPS + 253b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " THEN " + Settings.UNGROUPED_VISIBLE + 254b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " ELSE MAX(" + Groups.GROUP_VISIBLE + ")" + 255b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov "END)=1 THEN 1 ELSE 0 END)" + 256b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS_JOIN_SETTINGS_DATA_GROUPS + 2571a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey " WHERE " + RawContactsColumns.CONCRETE_ID + "=" + OUTER_RAW_CONTACTS_ID + "))" + 2581a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey " FROM " + Tables.RAW_CONTACTS + " AS " + OUTER_RAW_CONTACTS + 259b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID + 260b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " GROUP BY " + RawContacts.CONTACT_ID; 261e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 262e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey final String GROUP_HAS_ACCOUNT_AND_SOURCE_ID = Groups.SOURCE_ID + "=? AND " 263e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + Groups.ACCOUNT_NAME + "=? AND " + Groups.ACCOUNT_TYPE + "=?"; 2644394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 2654394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov public static final String CONTACT_VISIBLE = 2664394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "EXISTS (SELECT _id FROM " + Tables.VISIBLE_CONTACTS 2674394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov + " WHERE " + Tables.CONTACTS +"." + Contacts._ID 2684394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov + "=" + Tables.VISIBLE_CONTACTS +"." + Contacts._ID + ")"; 2691f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey } 2701f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey 271d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public interface ContactsColumns { 2724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov /** 2734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov * This flag is set for a contact if it has only one constituent raw contact and 2744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov * it is restricted. 2754a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov */ 27667dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey public static final String SINGLE_IS_RESTRICTED = "single_is_restricted"; 277ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 278a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov public static final String LAST_STATUS_UPDATE_ID = "status_update_id"; 279a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 280d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_ID = Tables.CONTACTS + "." + BaseColumns._ID; 28167dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey 282d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_TIMES_CONTACTED = Tables.CONTACTS + "." 283d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + Contacts.TIMES_CONTACTED; 284d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_LAST_TIME_CONTACTED = Tables.CONTACTS + "." 285d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + Contacts.LAST_TIME_CONTACTED; 286d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_STARRED = Tables.CONTACTS + "." + Contacts.STARRED; 287d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_CUSTOM_RINGTONE = Tables.CONTACTS + "." 288d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + Contacts.CUSTOM_RINGTONE; 289d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_SEND_TO_VOICEMAIL = Tables.CONTACTS + "." 290d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + Contacts.SEND_TO_VOICEMAIL; 2912d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill public static final String CONCRETE_LOOKUP_KEY = Tables.CONTACTS + "." 2922d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill + Contacts.LOOKUP_KEY; 293619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } 294619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey 2956cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov public interface RawContactsColumns { 29633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov public static final String CONCRETE_ID = 2975ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + BaseColumns._ID; 2989261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana public static final String CONCRETE_ACCOUNT_NAME = 2995ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_NAME; 3009261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana public static final String CONCRETE_ACCOUNT_TYPE = 3015ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_TYPE; 30233b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov public static final String CONCRETE_SOURCE_ID = 3035ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.SOURCE_ID; 30433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov public static final String CONCRETE_VERSION = 3055ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.VERSION; 30633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov public static final String CONCRETE_DIRTY = 3075ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.DIRTY; 30833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov public static final String CONCRETE_DELETED = 3095ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.DELETED; 3107a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana public static final String CONCRETE_SYNC1 = 3117a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana Tables.RAW_CONTACTS + "." + RawContacts.SYNC1; 3127a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana public static final String CONCRETE_SYNC2 = 3137a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana Tables.RAW_CONTACTS + "." + RawContacts.SYNC2; 3147a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana public static final String CONCRETE_SYNC3 = 3157a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana Tables.RAW_CONTACTS + "." + RawContacts.SYNC3; 3167a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana public static final String CONCRETE_SYNC4 = 3177a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana Tables.RAW_CONTACTS + "." + RawContacts.SYNC4; 31824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public static final String CONCRETE_CUSTOM_RINGTONE = 31924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE; 32024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public static final String CONCRETE_SEND_TO_VOICEMAIL = 32124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL; 32224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public static final String CONCRETE_LAST_TIME_CONTACTED = 32324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED; 32424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public static final String CONCRETE_TIMES_CONTACTED = 32524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED; 326c76d0a78fe2d3471195cfa555bab016eec154f07Jeff Sharkey public static final String CONCRETE_STARRED = 327c76d0a78fe2d3471195cfa555bab016eec154f07Jeff Sharkey Tables.RAW_CONTACTS + "." + RawContacts.STARRED; 328bf6a7e4dece49ba4e7cda17f7ed9250aeb82f731Jeff Sharkey public static final String CONCRETE_IS_RESTRICTED = 329bf6a7e4dece49ba4e7cda17f7ed9250aeb82f731Jeff Sharkey Tables.RAW_CONTACTS + "." + RawContacts.IS_RESTRICTED; 3308e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 3315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public static final String DISPLAY_NAME = RawContacts.DISPLAY_NAME_PRIMARY; 3325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public static final String DISPLAY_NAME_SOURCE = RawContacts.DISPLAY_NAME_SOURCE; 3338e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov public static final String AGGREGATION_NEEDED = "aggregation_needed"; 334fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 335fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov public static final String CONCRETE_DISPLAY_NAME = 336fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Tables.RAW_CONTACTS + "." + DISPLAY_NAME; 337fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov public static final String CONCRETE_CONTACT_ID = 338fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.CONTACT_ID; 339f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov public static final String CONCRETE_NAME_VERIFIED = 340f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.NAME_VERIFIED; 341619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } 342619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey 343619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey public interface DataColumns { 34467dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey public static final String PACKAGE_ID = "package_id"; 345b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String MIMETYPE_ID = "mimetype_id"; 346ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 347ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String CONCRETE_ID = Tables.DATA + "." + BaseColumns._ID; 348226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana public static final String CONCRETE_MIMETYPE_ID = Tables.DATA + "." + MIMETYPE_ID; 349d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_RAW_CONTACT_ID = Tables.DATA + "." 350d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + Data.RAW_CONTACT_ID; 351ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String CONCRETE_GROUP_ID = Tables.DATA + "." 352ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey + GroupMembership.GROUP_ROW_ID; 353e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 354e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA1 = Tables.DATA + "." + Data.DATA1; 355e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA2 = Tables.DATA + "." + Data.DATA2; 356e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA3 = Tables.DATA + "." + Data.DATA3; 357e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA4 = Tables.DATA + "." + Data.DATA4; 358e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA5 = Tables.DATA + "." + Data.DATA5; 359e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA6 = Tables.DATA + "." + Data.DATA6; 360e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA7 = Tables.DATA + "." + Data.DATA7; 361e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA8 = Tables.DATA + "." + Data.DATA8; 362e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA9 = Tables.DATA + "." + Data.DATA9; 363e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA10 = Tables.DATA + "." + Data.DATA10; 3640f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String CONCRETE_DATA11 = Tables.DATA + "." + Data.DATA11; 3650f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String CONCRETE_DATA12 = Tables.DATA + "." + Data.DATA12; 3660f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String CONCRETE_DATA13 = Tables.DATA + "." + Data.DATA13; 3670f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String CONCRETE_DATA14 = Tables.DATA + "." + Data.DATA14; 3680f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String CONCRETE_DATA15 = Tables.DATA + "." + Data.DATA15; 369e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_IS_PRIMARY = Tables.DATA + "." + Data.IS_PRIMARY; 370226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana public static final String CONCRETE_PACKAGE_ID = Tables.DATA + "." + PACKAGE_ID; 371e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 372e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 3730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov // Used only for legacy API support 3740f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public interface ExtensionsColumns { 3750f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String NAME = Data.DATA1; 3760f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String VALUE = Data.DATA2; 3770f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 3780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 3790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public interface GroupMembershipColumns { 3805ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String RAW_CONTACT_ID = Data.RAW_CONTACT_ID; 3810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String GROUP_ROW_ID = GroupMembership.GROUP_ROW_ID; 3820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 3830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 384e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public interface PhoneColumns { 385e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String NORMALIZED_NUMBER = Data.DATA4; 386e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_NORMALIZED_NUMBER = DataColumns.CONCRETE_DATA4; 387ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } 388ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 389ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public interface GroupsColumns { 39067dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey public static final String PACKAGE_ID = "package_id"; 39167dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey 392ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String CONCRETE_ID = Tables.GROUPS + "." + BaseColumns._ID; 39367dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey public static final String CONCRETE_SOURCE_ID = Tables.GROUPS + "." + Groups.SOURCE_ID; 394341e4621f2ee7614c66bc25dd3da70eaaa866b46Jeff Sharkey public static final String CONCRETE_ACCOUNT_NAME = Tables.GROUPS + "." + Groups.ACCOUNT_NAME; 395341e4621f2ee7614c66bc25dd3da70eaaa866b46Jeff Sharkey public static final String CONCRETE_ACCOUNT_TYPE = Tables.GROUPS + "." + Groups.ACCOUNT_TYPE; 396341e4621f2ee7614c66bc25dd3da70eaaa866b46Jeff Sharkey } 397b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 398b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public interface ActivitiesColumns { 399b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String PACKAGE_ID = "package_id"; 400b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String MIMETYPE_ID = "mimetype_id"; 401b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 402b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 403b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public interface PhoneLookupColumns { 404b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String _ID = BaseColumns._ID; 405b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String DATA_ID = "data_id"; 4065ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String RAW_CONTACT_ID = "raw_contact_id"; 407b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String NORMALIZED_NUMBER = "normalized_number"; 40836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov public static final String MIN_MATCH = "min_match"; 409b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 410b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 411a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public interface NameLookupColumns { 4125ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String RAW_CONTACT_ID = "raw_contact_id"; 41314bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov public static final String DATA_ID = "data_id"; 414a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public static final String NORMALIZED_NAME = "normalized_name"; 415a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public static final String NAME_TYPE = "name_type"; 416a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov } 417a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 418a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public final static class NameLookupType { 4192a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov public static final int NAME_EXACT = 0; 4202a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov public static final int NAME_VARIANT = 1; 4212a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov public static final int NAME_COLLATION_KEY = 2; 4222a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov public static final int NICKNAME = 3; 4232a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov public static final int EMAIL_BASED_NICKNAME = 4; 424a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 425a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov // This is the highest name lookup type code plus one 42692ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov public static final int TYPE_COUNT = 5; 427a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 428a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public static boolean isBasedOnStructuredName(int nameLookupType) { 4292a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov return nameLookupType == NameLookupType.NAME_EXACT 4302a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov || nameLookupType == NameLookupType.NAME_VARIANT 4312a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov || nameLookupType == NameLookupType.NAME_COLLATION_KEY; 432a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov } 433a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov } 434a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 435ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public interface PackagesColumns { 436b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String _ID = BaseColumns._ID; 437b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String PACKAGE = "package"; 438226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana 439226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana public static final String CONCRETE_ID = Tables.PACKAGES + "." + _ID; 440b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 441b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 442ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public interface MimetypesColumns { 443b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String _ID = BaseColumns._ID; 444b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String MIMETYPE = "mimetype"; 445ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 446ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String CONCRETE_ID = Tables.MIMETYPES + "." + BaseColumns._ID; 447ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String CONCRETE_MIMETYPE = Tables.MIMETYPES + "." + MIMETYPE; 448b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 449b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 450b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov public interface AggregationExceptionColumns { 451b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov public static final String _ID = BaseColumns._ID; 452b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov } 453b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 454b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov public interface NicknameLookupColumns { 455b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov public static final String NAME = "name"; 456b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov public static final String CLUSTER = "cluster"; 457b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 458b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 459e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey public interface SettingsColumns { 460e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey public static final String CONCRETE_ACCOUNT_NAME = Tables.SETTINGS + "." 461e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + Settings.ACCOUNT_NAME; 462e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey public static final String CONCRETE_ACCOUNT_TYPE = Tables.SETTINGS + "." 463e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + Settings.ACCOUNT_TYPE; 464e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey } 465e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 4664dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov public interface PresenceColumns { 4674dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov String RAW_CONTACT_ID = "presence_raw_contact_id"; 468bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov String CONTACT_ID = "presence_contact_id"; 4694dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov } 4704dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 471e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov public interface AggregatedPresenceColumns { 472e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov String CONTACT_ID = "presence_contact_id"; 4733296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 4743296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_CONTACT_ID = Tables.AGGREGATED_PRESENCE + "." + CONTACT_ID; 475e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov } 476e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov 477a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov public interface StatusUpdatesColumns { 478a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov String DATA_ID = "status_update_data_id"; 4793296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 4803296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_DATA_ID = Tables.STATUS_UPDATES + "." + DATA_ID; 4813296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 4823296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_PRESENCE = Tables.STATUS_UPDATES + "." + StatusUpdates.PRESENCE; 4833296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS = Tables.STATUS_UPDATES + "." + StatusUpdates.STATUS; 4843296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_TIMESTAMP = Tables.STATUS_UPDATES + "." 4853296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey + StatusUpdates.STATUS_TIMESTAMP; 4863296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_RES_PACKAGE = Tables.STATUS_UPDATES + "." 4873296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey + StatusUpdates.STATUS_RES_PACKAGE; 4883296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_LABEL = Tables.STATUS_UPDATES + "." + StatusUpdates.STATUS_LABEL; 4893296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_ICON = Tables.STATUS_UPDATES + "." + StatusUpdates.STATUS_ICON; 4903296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey } 4913296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 4923296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey public interface ContactsStatusUpdatesColumns { 4933296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String ALIAS = "contacts_" + Tables.STATUS_UPDATES; 4943296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 4953296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_DATA_ID = ALIAS + "." + StatusUpdatesColumns.DATA_ID; 4963296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 4973296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_PRESENCE = ALIAS + "." + StatusUpdates.PRESENCE; 4983296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS = ALIAS + "." + StatusUpdates.STATUS; 4993296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_TIMESTAMP = ALIAS + "." + StatusUpdates.STATUS_TIMESTAMP; 5003296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_RES_PACKAGE = ALIAS + "." + StatusUpdates.STATUS_RES_PACKAGE; 5013296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_LABEL = ALIAS + "." + StatusUpdates.STATUS_LABEL; 5023296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_ICON = ALIAS + "." + StatusUpdates.STATUS_ICON; 503a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov } 504a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 5053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public interface StreamItemsColumns { 5063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String CONCRETE_ID = Tables.STREAM_ITEMS + "." + BaseColumns._ID; 5073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String CONCRETE_RAW_CONTACT_ID = Tables.STREAM_ITEMS + "." + StreamItems.RAW_CONTACT_ID; 5083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String CONCRETE_PACKAGE = Tables.STREAM_ITEMS + "." + StreamItems.RES_PACKAGE; 5093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String CONCRETE_ICON = Tables.STREAM_ITEMS + "." + StreamItems.RES_ICON; 5103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String CONCRETE_LABEL = Tables.STREAM_ITEMS + "." + StreamItems.RES_LABEL; 5113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String CONCRETE_TEXT = Tables.STREAM_ITEMS + "." + StreamItems.TEXT; 5123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String CONCRETE_TIMESTAMP = Tables.STREAM_ITEMS + "." + StreamItems.TIMESTAMP; 5133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String CONCRETE_COMMENTS = Tables.STREAM_ITEMS + "." + StreamItems.COMMENTS; 5143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String CONCRETE_ACTION = Tables.STREAM_ITEMS + "." + StreamItems.ACTION; 5153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String CONCRETE_ACTION_URI = Tables.STREAM_ITEMS + "." + StreamItems.ACTION_URI; 5163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 5173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 5183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public interface StreamItemPhotosColumns { 5193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String CONCRETE_ID = Tables.STREAM_ITEM_PHOTOS + "." + BaseColumns._ID; 5203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String CONCRETE_STREAM_ITEM_ID = Tables.STREAM_ITEM_PHOTOS + "." 5213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann + StreamItemPhotos.STREAM_ITEM_ID; 5223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String CONCRETE_SORT_INDEX = Tables.STREAM_ITEM_PHOTOS + "." + StreamItemPhotos.SORT_INDEX; 5233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String CONCRETE_PICTURE = Tables.STREAM_ITEM_PHOTOS + "." + StreamItemPhotos.PICTURE; 5243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String CONCRETE_ACTION = Tables.STREAM_ITEM_PHOTOS + "." + StreamItemPhotos.ACTION; 5253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann String CONCRETE_ACTION_URI = Tables.STREAM_ITEM_PHOTOS + "." + StreamItemPhotos.ACTION_URI; 5263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 5273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 528b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov public interface PropertiesColumns { 529b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov String PROPERTY_KEY = "property_key"; 530b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov String PROPERTY_VALUE = "property_value"; 531b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 532b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 53324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public interface AccountsColumns { 53424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String ACCOUNT_NAME = RawContacts.ACCOUNT_NAME; 53524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String ACCOUNT_TYPE = RawContacts.ACCOUNT_TYPE; 53624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String PROFILE_RAW_CONTACT_ID = "profile_raw_contact_id"; 53724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 53824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 539e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov public static final class DirectoryColumns { 540e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov public static final String TYPE_RESOURCE_NAME = "typeResourceName"; 541e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov } 542e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov 543f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov public static final class SearchIndexColumns { 544f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov public static final String CONTACT_ID = "contact_id"; 545f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov public static final String CONTENT = "content"; 546155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov public static final String NAME = "name"; 547f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov public static final String TOKENS = "tokens"; 548f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 549f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 55046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** 55146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * Private table for calculating per-contact-method ranking. 55246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa */ 55346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final class DataUsageStatColumns { 55446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** type: INTEGER (long) */ 55546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String _ID = "stat_id"; 55646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String CONCRETE_ID = Tables.DATA_USAGE_STAT + "." + _ID; 55746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 55846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** type: INTEGER (long) */ 55946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String DATA_ID = "data_id"; 56046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String CONCRETE_DATA_ID = Tables.DATA_USAGE_STAT + "." + DATA_ID; 56146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 56246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** type: INTEGER (long) */ 56346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String LAST_TIME_USED = "last_time_used"; 56446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String CONCRETE_LAST_TIME_USED = 56546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Tables.DATA_USAGE_STAT + "." + LAST_TIME_USED; 56646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 56746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** type: INTEGER */ 56846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String TIMES_USED = "times_used"; 56946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String CONCRETE_TIMES_USED = 57046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Tables.DATA_USAGE_STAT + "." + TIMES_USED; 57146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 57246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** type: INTEGER */ 57346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String USAGE_TYPE_INT = "usage_type"; 57446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String CONCRETE_USAGE_TYPE = 57546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Tables.DATA_USAGE_STAT + "." + USAGE_TYPE_INT; 57646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 57746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** 57846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * Integer values for USAGE_TYPE. 57946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * 58046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * @see ContactsContract.DataUsageFeedback#USAGE_TYPE 58146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa */ 58246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final int USAGE_TYPE_INT_CALL = 0; 58346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final int USAGE_TYPE_INT_LONG_TEXT = 1; 58446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final int USAGE_TYPE_INT_SHORT_TEXT = 2; 58546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa } 58646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 5873296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey /** In-memory cache of previously found MIME-type mappings */ 588bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov private final HashMap<String, Long> mMimetypeCache = new HashMap<String, Long>(); 589b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** In-memory cache of previously found package name mappings */ 590bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov private final HashMap<String, Long> mPackageCache = new HashMap<String, Long>(); 591b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 5922a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdEmail; 5932a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdIm; 594a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov private long mMimeTypeIdSip; 5952a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdStructuredName; 5962a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdOrganization; 5972a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdNickname; 5982a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdPhone; 599b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 600b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** Compiled statements for querying and inserting mappings */ 601b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mMimetypeQuery; 602b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mPackageQuery; 603d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov private SQLiteStatement mContactIdQuery; 604f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private SQLiteStatement mAggregationModeQuery; 605b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mMimetypeInsert; 606b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mPackageInsert; 607b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mDataMimetypeQuery; 608b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mActivitiesMimetypeQuery; 609b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 61078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** Precompiled sql statement for setting a data record to the primary. */ 61178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mSetPrimaryStatement; 61278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** Precompiled sql statement for setting a data record to the super primary. */ 61378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mSetSuperPrimaryStatement; 61478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** Precompiled sql statement for clearing super primary of a single record. */ 61578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mClearSuperPrimaryStatement; 61678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** Precompiled sql statement for updating a contact display name */ 61778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mRawContactDisplayNameUpdate; 61878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 61978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mNameLookupInsert; 62078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mNameLookupDelete; 62178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mStatusUpdateAutoTimestamp; 62278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mStatusUpdateInsert; 62378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mStatusUpdateReplace; 62478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mStatusAttributionUpdate; 62578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mStatusUpdateDelete; 62678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mResetNameVerifiedForOtherRawContacts; 627f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov private SQLiteStatement mContactInDefaultDirectoryQuery; 62878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 629b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov private final Context mContext; 6302a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private final boolean mDatabaseOptimizationEnabled; 63135ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana private final SyncStateContentProviderHelper mSyncState; 632e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov private final CountryMonitor mCountryMonitor; 6335df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov private StringBuilder mSb = new StringBuilder(); 634f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov 635f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov private boolean mReopenDatabase = false; 636f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 637b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov private static ContactsDatabaseHelper sSingleton = null; 638b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 63936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov private boolean mUseStrictPhoneNumberComparison; 6403a6a49cfb06272e3e25f3c390a9cf4002da6e34dDaisuke Miyakawa 641d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton /** 642d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton * List of package names with access to {@link RawContacts#IS_RESTRICTED} data. 643d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton */ 644d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton private String[] mUnrestrictedPackages; 645d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton 6468ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov private String[] mSelectionArgs1 = new String[1]; 6478ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov private NameSplitter.Name mName = new NameSplitter.Name(); 6488ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov private CharArrayBuffer mCharArrayBuffer = new CharArrayBuffer(128); 6498ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov private NameSplitter mNameSplitter; 650f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 651b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov public static synchronized ContactsDatabaseHelper getInstance(Context context) { 652b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey if (sSingleton == null) { 6532a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov sSingleton = new ContactsDatabaseHelper(context, DATABASE_NAME, true); 654b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 655b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return sSingleton; 656b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 657b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 6581f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey /** 65931b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov * Private constructor, callers except unit tests should obtain an instance through 66035ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana * {@link #getInstance(android.content.Context)} instead. 6611f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey */ 662b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper(Context context) { 6632a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov this(context, null, false); 6642a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 6652a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 6662a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private ContactsDatabaseHelper( 6672a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov Context context, String databaseName, boolean optimizationEnabled) { 6682a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov super(context, databaseName, null, DATABASE_VERSION); 6692a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mDatabaseOptimizationEnabled = optimizationEnabled; 670d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton Resources resources = context.getResources(); 671619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey 672b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov mContext = context; 67328b3769e3fcecae56c3fc70cbcb0f95282b9640eFred Quintana mSyncState = new SyncStateContentProviderHelper(); 674e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov mCountryMonitor = new CountryMonitor(context); 67536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov mUseStrictPhoneNumberComparison = 676d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton resources.getBoolean( 677d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton com.android.internal.R.bool.config_use_strict_phone_number_comparation); 6780f5116227592cb8e724542c598daffa383964679Dmitri Plotnikov int resourceId = resources.getIdentifier("unrestricted_packages", "array", 6790f5116227592cb8e724542c598daffa383964679Dmitri Plotnikov context.getPackageName()); 6800f5116227592cb8e724542c598daffa383964679Dmitri Plotnikov if (resourceId != 0) { 6810f5116227592cb8e724542c598daffa383964679Dmitri Plotnikov mUnrestrictedPackages = resources.getStringArray(resourceId); 6820f5116227592cb8e724542c598daffa383964679Dmitri Plotnikov } else { 6830f5116227592cb8e724542c598daffa383964679Dmitri Plotnikov mUnrestrictedPackages = new String[0]; 6840f5116227592cb8e724542c598daffa383964679Dmitri Plotnikov } 685b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 686b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 6872a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private void refreshDatabaseCaches(SQLiteDatabase db) { 68878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateDelete = null; 68978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateReplace = null; 69078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateInsert = null; 69178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateAutoTimestamp = null; 69278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusAttributionUpdate = null; 69378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mResetNameVerifiedForOtherRawContacts = null; 69478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mRawContactDisplayNameUpdate = null; 69578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement = null; 69678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mClearSuperPrimaryStatement = null; 69778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement = null; 69878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert = null; 69978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupDelete = null; 70078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mPackageQuery = null; 70178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mPackageInsert = null; 70278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mDataMimetypeQuery = null; 70378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mActivitiesMimetypeQuery = null; 70478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mContactIdQuery = null; 70578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mAggregationModeQuery = null; 706f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov mContactInDefaultDirectoryQuery = null; 7072a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 70855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov populateMimeTypeCache(db); 70955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 71055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 71155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov private void populateMimeTypeCache(SQLiteDatabase db) { 7122a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimetypeCache.clear(); 7132a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mPackageCache.clear(); 7142a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 7152a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimetypeQuery = db.compileStatement( 7162a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov "SELECT " + MimetypesColumns._ID + 7172a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov " FROM " + Tables.MIMETYPES + 7182a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov " WHERE " + MimetypesColumns.MIMETYPE + "=?"); 7192a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 7202a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimetypeInsert = db.compileStatement( 7212a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov "INSERT INTO " + Tables.MIMETYPES + "(" 7222a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov + MimetypesColumns.MIMETYPE + 7232a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov ") VALUES (?)"); 7242a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 7252a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdEmail = getMimeTypeId(Email.CONTENT_ITEM_TYPE); 7262a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdIm = getMimeTypeId(Im.CONTENT_ITEM_TYPE); 727a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov mMimeTypeIdSip = getMimeTypeId(SipAddress.CONTENT_ITEM_TYPE); 7282a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdStructuredName = getMimeTypeId(StructuredName.CONTENT_ITEM_TYPE); 7292a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdOrganization = getMimeTypeId(Organization.CONTENT_ITEM_TYPE); 7302a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdNickname = getMimeTypeId(Nickname.CONTENT_ITEM_TYPE); 7312a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdPhone = getMimeTypeId(Phone.CONTENT_ITEM_TYPE); 73278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 73378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 734b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey @Override 735b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public void onOpen(SQLiteDatabase db) { 7362a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov refreshDatabaseCaches(db); 73735ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana 73878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSyncState.onDatabaseOpened(db); 7391f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey 7401f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey db.execSQL("ATTACH DATABASE ':memory:' AS " + DATABASE_PRESENCE + ";"); 741e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov db.execSQL("CREATE TABLE IF NOT EXISTS " + DATABASE_PRESENCE + "." + Tables.PRESENCE + " ("+ 74282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.DATA_ID + " INTEGER PRIMARY KEY REFERENCES data(_id)," + 74382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.PROTOCOL + " INTEGER NOT NULL," + 74482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.CUSTOM_PROTOCOL + " TEXT," + 74582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.IM_HANDLE + " TEXT," + 74682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.IM_ACCOUNT + " TEXT," + 747a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov PresenceColumns.CONTACT_ID + " INTEGER REFERENCES contacts(_id)," + 748a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov PresenceColumns.RAW_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)," + 74982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.PRESENCE + " INTEGER," + 750aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CHAT_CAPABILITY + " INTEGER NOT NULL DEFAULT 0," + 75182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov "UNIQUE(" + StatusUpdates.PROTOCOL + ", " + StatusUpdates.CUSTOM_PROTOCOL 75282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov + ", " + StatusUpdates.IM_HANDLE + ", " + StatusUpdates.IM_ACCOUNT + ")" + 7531f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey ");"); 7541f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey 755e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov db.execSQL("CREATE INDEX IF NOT EXISTS " + DATABASE_PRESENCE + ".presenceIndex" + " ON " 7564dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov + Tables.PRESENCE + " (" + PresenceColumns.RAW_CONTACT_ID + ");"); 75709562b6c3a420ded0d02b9bd2290de2dbab9e304Vasu Nori db.execSQL("CREATE INDEX IF NOT EXISTS " + DATABASE_PRESENCE + ".presenceIndex2" + " ON " 75809562b6c3a420ded0d02b9bd2290de2dbab9e304Vasu Nori + Tables.PRESENCE + " (" + PresenceColumns.CONTACT_ID + ");"); 759e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov 760e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov db.execSQL("CREATE TABLE IF NOT EXISTS " 761aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori + DATABASE_PRESENCE + "." + Tables.AGGREGATED_PRESENCE + " ("+ 762e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov AggregatedPresenceColumns.CONTACT_ID 763e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov + " INTEGER PRIMARY KEY REFERENCES contacts(_id)," + 764632248ae0053fa99b1f5b4cfaab3e55b7453fcb1Vasu Nori StatusUpdates.PRESENCE + " INTEGER," + 765aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CHAT_CAPABILITY + " INTEGER NOT NULL DEFAULT 0" + 766e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov ");"); 767bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 768bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 769bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov db.execSQL("CREATE TRIGGER " + DATABASE_PRESENCE + "." + Tables.PRESENCE + "_deleted" 770bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " BEFORE DELETE ON " + DATABASE_PRESENCE + "." + Tables.PRESENCE 771bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " BEGIN " 772bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " DELETE FROM " + Tables.AGGREGATED_PRESENCE 773bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " WHERE " + AggregatedPresenceColumns.CONTACT_ID + " = " + 774bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov "(SELECT " + PresenceColumns.CONTACT_ID + 775bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " FROM " + Tables.PRESENCE + 776bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " WHERE " + PresenceColumns.RAW_CONTACT_ID 777bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + "=OLD." + PresenceColumns.RAW_CONTACT_ID + 778bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " AND NOT EXISTS" + 779bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov "(SELECT " + PresenceColumns.RAW_CONTACT_ID + 780bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " FROM " + Tables.PRESENCE + 781bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " WHERE " + PresenceColumns.CONTACT_ID 782bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + "=OLD." + PresenceColumns.CONTACT_ID + 783bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " AND " + PresenceColumns.RAW_CONTACT_ID 784bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + "!=OLD." + PresenceColumns.RAW_CONTACT_ID + "));" 785bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " END"); 786bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 787aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori final String replaceAggregatePresenceSql = 788aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "INSERT OR REPLACE INTO " + Tables.AGGREGATED_PRESENCE + "(" 789093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + AggregatedPresenceColumns.CONTACT_ID + ", " 790093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + StatusUpdates.PRESENCE + ", " 791093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + StatusUpdates.CHAT_CAPABILITY + ")" 792093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " SELECT " 793093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + PresenceColumns.CONTACT_ID + "," 794093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + StatusUpdates.PRESENCE + "," 795093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + StatusUpdates.CHAT_CAPABILITY 796aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori + " FROM " + Tables.PRESENCE 797aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori + " WHERE " 798093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " (ifnull(" + StatusUpdates.PRESENCE + ",0) * 10 " 799093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + "+ ifnull(" + StatusUpdates.CHAT_CAPABILITY + ", 0))" 800093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " = (SELECT " 801093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + "MAX (ifnull(" + StatusUpdates.PRESENCE + ",0) * 10 " 802093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + "+ ifnull(" + StatusUpdates.CHAT_CAPABILITY + ", 0))" 803093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " FROM " + Tables.PRESENCE 804093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " WHERE " + PresenceColumns.CONTACT_ID 805093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + "=NEW." + PresenceColumns.CONTACT_ID 806093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + ")" 807093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " AND " + PresenceColumns.CONTACT_ID + "=NEW." + PresenceColumns.CONTACT_ID + ";"; 808bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 809bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov db.execSQL("CREATE TRIGGER " + DATABASE_PRESENCE + "." + Tables.PRESENCE + "_inserted" 810bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " AFTER INSERT ON " + DATABASE_PRESENCE + "." + Tables.PRESENCE 811bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " BEGIN " 812bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + replaceAggregatePresenceSql 813bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " END"); 814bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 815bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov db.execSQL("CREATE TRIGGER " + DATABASE_PRESENCE + "." + Tables.PRESENCE + "_updated" 816bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " AFTER UPDATE ON " + DATABASE_PRESENCE + "." + Tables.PRESENCE 817bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " BEGIN " 818bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + replaceAggregatePresenceSql 819bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " END"); 820b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 821b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 822b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey @Override 823b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public void onCreate(SQLiteDatabase db) { 824069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee Log.i(TAG, "Bootstrapping database version: " + DATABASE_VERSION); 825b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 82635ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana mSyncState.createDatabase(db); 82735ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana 828b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // One row per group of contacts corresponding to the same person 829d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.CONTACTS + " (" + 830b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 831fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)," + 832d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.PHOTO_ID + " INTEGER REFERENCES data(_id)," + 833d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.CUSTOM_RINGTONE + " TEXT," + 834d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.SEND_TO_VOICEMAIL + " INTEGER NOT NULL DEFAULT 0," + 835d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.TIMES_CONTACTED + " INTEGER NOT NULL DEFAULT 0," + 836d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.LAST_TIME_CONTACTED + " INTEGER," + 837d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.STARRED + " INTEGER NOT NULL DEFAULT 0," + 838f992bfab334b760d36a053fc0b439382dcfb51adDmitri Plotnikov Contacts.HAS_PHONE_NUMBER + " INTEGER NOT NULL DEFAULT 0," + 8395870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov Contacts.LOOKUP_KEY + " TEXT," + 840a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov ContactsColumns.LAST_STATUS_UPDATE_ID + " INTEGER REFERENCES data(_id)," + 8414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContactsColumns.SINGLE_IS_RESTRICTED + " INTEGER NOT NULL DEFAULT 0" + 842b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 843b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 84454d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov db.execSQL("CREATE INDEX contacts_has_phone_index ON " + Tables.CONTACTS + " (" + 84554d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER + 84654d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov ");"); 84754d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov 84854d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov db.execSQL("CREATE INDEX contacts_restricted_index ON " + Tables.CONTACTS + " (" + 84954d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov ContactsColumns.SINGLE_IS_RESTRICTED + 85054d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov ");"); 85154d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov 852fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL("CREATE INDEX contacts_name_raw_contact_id_index ON " + Tables.CONTACTS + " (" + 853fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID + 854fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ");"); 855fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 856b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Contacts table 8575ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.RAW_CONTACTS + " (" + 8586cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 8596cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.IS_RESTRICTED + " INTEGER DEFAULT 0," + 8606cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.ACCOUNT_NAME + " STRING DEFAULT NULL, " + 8616cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.ACCOUNT_TYPE + " STRING DEFAULT NULL, " + 8626cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.SOURCE_ID + " TEXT," + 86397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov RawContacts.RAW_CONTACT_IS_READ_ONLY + " INTEGER NOT NULL DEFAULT 0," + 8646cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.VERSION + " INTEGER NOT NULL DEFAULT 1," + 86573776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov RawContacts.DIRTY + " INTEGER NOT NULL DEFAULT 0," + 86633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov RawContacts.DELETED + " INTEGER NOT NULL DEFAULT 0," + 86754d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov RawContacts.CONTACT_ID + " INTEGER REFERENCES contacts(_id)," + 8686cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.AGGREGATION_MODE + " INTEGER NOT NULL DEFAULT " + 8696cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.AGGREGATION_MODE_DEFAULT + "," + 8708e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov RawContactsColumns.AGGREGATION_NEEDED + " INTEGER NOT NULL DEFAULT 1," + 8716cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.CUSTOM_RINGTONE + " TEXT," + 8726cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.SEND_TO_VOICEMAIL + " INTEGER NOT NULL DEFAULT 0," + 8736cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.TIMES_CONTACTED + " INTEGER NOT NULL DEFAULT 0," + 8746cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.LAST_TIME_CONTACTED + " INTEGER," + 87533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov RawContacts.STARRED + " INTEGER NOT NULL DEFAULT 0," + 8765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_PRIMARY + " TEXT," + 8775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_ALTERNATIVE + " TEXT," + 8785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_SOURCE + " INTEGER NOT NULL DEFAULT " + 87925abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov DisplayNameSources.UNDEFINED + "," + 8805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.PHONETIC_NAME + " TEXT," + 8815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.PHONETIC_NAME_STYLE + " TEXT," + 882de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa RawContacts.SORT_KEY_PRIMARY + " TEXT COLLATE " + 883de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa ContactsProvider2.PHONEBOOK_COLLATOR_NAME + "," + 884de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa RawContacts.SORT_KEY_ALTERNATIVE + " TEXT COLLATE " + 885de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa ContactsProvider2.PHONEBOOK_COLLATOR_NAME + "," + 886f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov RawContacts.NAME_VERIFIED + " INTEGER NOT NULL DEFAULT 0," + 8873cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov RawContacts.SYNC1 + " TEXT, " + 8883cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov RawContacts.SYNC2 + " TEXT, " + 8893cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov RawContacts.SYNC3 + " TEXT, " + 8903cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov RawContacts.SYNC4 + " TEXT " + 891b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 892b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 89354d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contacts_contact_id_index ON " + Tables.RAW_CONTACTS + " (" + 89454d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov RawContacts.CONTACT_ID + 89554d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov ");"); 89654d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov 8975f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contacts_source_id_index ON " + Tables.RAW_CONTACTS + " (" + 8985f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov RawContacts.SOURCE_ID + ", " + 8995f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 9005f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov RawContacts.ACCOUNT_NAME + 9015f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov ");"); 9025f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov 9033b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann db.execSQL("CREATE TABLE " + Tables.STREAM_ITEMS + " (" + 9043b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 9053b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.RAW_CONTACT_ID + " INTEGER NOT NULL, " + 9063b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.RES_PACKAGE + " INTEGER NOT NULL, " + 9073b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.RES_ICON + " INTEGER, " + 9083b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.RES_LABEL + " INTEGER, " + 9093b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.TEXT + " TEXT NOT NULL, " + 9103b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.TIMESTAMP + " INTEGER NOT NULL, " + 9113b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.COMMENTS + " TEXT NOT NULL, " + 9123b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.ACTION + " TEXT, " + 9133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.ACTION_URI + " TEXT, " + 9143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "FOREIGN KEY(" + StreamItems.RAW_CONTACT_ID + ") REFERENCES " + 9153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Tables.RAW_CONTACTS + "(" + RawContacts._ID + "));"); 9163b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 9173b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann db.execSQL("CREATE TABLE " + Tables.STREAM_ITEM_PHOTOS + " (" + 9183b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItemPhotos._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 9193b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItemPhotos.STREAM_ITEM_ID + " INTEGER NOT NULL, " + 9203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItemPhotos.SORT_INDEX + " INTEGER, " + 9213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItemPhotos.PICTURE + " BLOB, " + 9223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItemPhotos.ACTION + " TEXT, " + 9233b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItemPhotos.ACTION_URI + " TEXT, " + 9243b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "FOREIGN KEY(" + StreamItemPhotos.STREAM_ITEM_ID + ") REFERENCES " + 9253b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Tables.STREAM_ITEMS + "(" + StreamItems._ID + "));"); 9263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 927f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov // TODO readd the index and investigate a controlled use of it 928f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov// db.execSQL("CREATE INDEX raw_contacts_agg_index ON " + Tables.RAW_CONTACTS + " (" + 929f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov// RawContactsColumns.AGGREGATION_NEEDED + 930f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov// ");"); 9318e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 932b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Package name mapping table 933ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey db.execSQL("CREATE TABLE " + Tables.PACKAGES + " (" + 934ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey PackagesColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 935ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey PackagesColumns.PACKAGE + " TEXT NOT NULL" + 936b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 937b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 938ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Mimetype mapping table 939ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey db.execSQL("CREATE TABLE " + Tables.MIMETYPES + " (" + 940ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey MimetypesColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 941ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey MimetypesColumns.MIMETYPE + " TEXT NOT NULL" + 942b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 943b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 94408768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov // Mimetype table requires an index on mime type 94508768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov db.execSQL("CREATE UNIQUE INDEX mime_type ON " + Tables.MIMETYPES + " (" + 94608768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov MimetypesColumns.MIMETYPE + 94708768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov ");"); 94808768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov 949b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Public generic data table 950b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey db.execSQL("CREATE TABLE " + Tables.DATA + " (" + 951b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Data._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 95267dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey DataColumns.PACKAGE_ID + " INTEGER REFERENCES package(_id)," + 953b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey DataColumns.MIMETYPE_ID + " INTEGER REFERENCES mimetype(_id) NOT NULL," + 95411944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov Data.RAW_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id) NOT NULL," + 95597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Data.IS_READ_ONLY + " INTEGER NOT NULL DEFAULT 0," + 956f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.IS_PRIMARY + " INTEGER NOT NULL DEFAULT 0," + 957f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.IS_SUPER_PRIMARY + " INTEGER NOT NULL DEFAULT 0," + 958f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA_VERSION + " INTEGER NOT NULL DEFAULT 0," + 959f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA1 + " TEXT," + 960f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA2 + " TEXT," + 961f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA3 + " TEXT," + 962f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA4 + " TEXT," + 963f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA5 + " TEXT," + 964f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA6 + " TEXT," + 965f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA7 + " TEXT," + 966f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA8 + " TEXT," + 967f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA9 + " TEXT," + 96867dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Data.DATA10 + " TEXT," + 96967dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Data.DATA11 + " TEXT," + 97067dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Data.DATA12 + " TEXT," + 97167dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Data.DATA13 + " TEXT," + 97267dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Data.DATA14 + " TEXT," + 9733cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Data.DATA15 + " TEXT," + 9743cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Data.SYNC1 + " TEXT, " + 9753cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Data.SYNC2 + " TEXT, " + 9763cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Data.SYNC3 + " TEXT, " + 9773cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Data.SYNC4 + " TEXT " + 978b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 979b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 98011944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov db.execSQL("CREATE INDEX data_raw_contact_id ON " + Tables.DATA + " (" + 98111944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov Data.RAW_CONTACT_ID + 98211944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov ");"); 98311944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov 98411944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov /** 98511944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov * For email lookup and similar queries. 98611944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov */ 987f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov db.execSQL("CREATE INDEX data_mimetype_data1_index ON " + Tables.DATA + " (" + 98811944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov DataColumns.MIMETYPE_ID + "," + 989f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov Data.DATA1 + 99011944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov ");"); 99111944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov 992b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Private phone numbers table used for lookup 993b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey db.execSQL("CREATE TABLE " + Tables.PHONE_LOOKUP + " (" + 994f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov PhoneLookupColumns.DATA_ID 995892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + " INTEGER REFERENCES data(_id) NOT NULL," + 9965ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID 9975ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " INTEGER REFERENCES raw_contacts(_id) NOT NULL," + 99836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.NORMALIZED_NUMBER + " TEXT NOT NULL," + 99936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.MIN_MATCH + " TEXT NOT NULL" + 1000b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 1001b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 1002b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey db.execSQL("CREATE INDEX phone_lookup_index ON " + Tables.PHONE_LOOKUP + " (" + 1003f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov PhoneLookupColumns.NORMALIZED_NUMBER + "," + 1004f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID + "," + 1005b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey PhoneLookupColumns.DATA_ID + 1006b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 1007b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 100836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_min_match_index ON " + Tables.PHONE_LOOKUP + " (" + 100936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.MIN_MATCH + "," + 101036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID + "," + 101136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.DATA_ID + 101236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov ");"); 101336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 1014d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_data_id_min_match_index ON " + Tables.PHONE_LOOKUP + 1015d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov " (" + PhoneLookupColumns.DATA_ID + ", " + PhoneLookupColumns.MIN_MATCH + ");"); 1016d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov 1017a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov // Private name/nickname table used for lookup 1018a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.NAME_LOOKUP + " (" + 101914bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov NameLookupColumns.DATA_ID 102014bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov + " INTEGER REFERENCES data(_id) NOT NULL," + 10215ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov NameLookupColumns.RAW_CONTACT_ID 10225ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " INTEGER REFERENCES raw_contacts(_id) NOT NULL," + 102311944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov NameLookupColumns.NORMALIZED_NAME + " TEXT NOT NULL," + 102411944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov NameLookupColumns.NAME_TYPE + " INTEGER NOT NULL," + 102514bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov "PRIMARY KEY (" 102614bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov + NameLookupColumns.DATA_ID + ", " 102711944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov + NameLookupColumns.NORMALIZED_NAME + ", " 102811944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov + NameLookupColumns.NAME_TYPE + ")" + 1029a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov ");"); 1030a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 103114bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov db.execSQL("CREATE INDEX name_lookup_raw_contact_id_index ON " + Tables.NAME_LOOKUP + " (" + 103214bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov NameLookupColumns.RAW_CONTACT_ID + 103314bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov ");"); 103414bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov 1035b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.NICKNAME_LOOKUP + " (" + 1036b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov NicknameLookupColumns.NAME + " TEXT," + 1037b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov NicknameLookupColumns.CLUSTER + " TEXT" + 1038b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov ");"); 1039b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 1040b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov db.execSQL("CREATE UNIQUE INDEX nickname_lookup_index ON " + Tables.NICKNAME_LOOKUP + " (" + 1041b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov NicknameLookupColumns.NAME + ", " + 1042b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov NicknameLookupColumns.CLUSTER + 1043b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov ");"); 1044b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 1045ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Groups table 1046ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey db.execSQL("CREATE TABLE " + Tables.GROUPS + " (" + 1047ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey Groups._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 104867dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey GroupsColumns.PACKAGE_ID + " INTEGER REFERENCES package(_id)," + 1049035b4cc204be2641079a0b04e9ee9791a8f8248bFred Quintana Groups.ACCOUNT_NAME + " STRING DEFAULT NULL, " + 1050035b4cc204be2641079a0b04e9ee9791a8f8248bFred Quintana Groups.ACCOUNT_TYPE + " STRING DEFAULT NULL, " + 1051ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey Groups.SOURCE_ID + " TEXT," + 10529261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Groups.VERSION + " INTEGER NOT NULL DEFAULT 1," + 105373776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov Groups.DIRTY + " INTEGER NOT NULL DEFAULT 0," + 1054ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey Groups.TITLE + " TEXT," + 105567dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Groups.TITLE_RES + " INTEGER," + 10560f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov Groups.NOTES + " TEXT," + 10570f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov Groups.SYSTEM_ID + " TEXT," + 105894021b213e4db367f60b30fcbfe9019e28571784Fred Quintana Groups.DELETED + " INTEGER NOT NULL DEFAULT 0," + 1059eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey Groups.GROUP_VISIBLE + " INTEGER NOT NULL DEFAULT 0," + 1060ea547d55f864133861b2db44221ae0c2ac6c1a68Fred Quintana Groups.SHOULD_SYNC + " INTEGER NOT NULL DEFAULT 1," + 1061dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Groups.AUTO_ADD + " INTEGER NOT NULL DEFAULT 0," + 1062dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Groups.FAVORITES + " INTEGER NOT NULL DEFAULT 0," + 1063c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov Groups.GROUP_IS_READ_ONLY + " INTEGER NOT NULL DEFAULT 0," + 10643cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Groups.SYNC1 + " TEXT, " + 10653cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Groups.SYNC2 + " TEXT, " + 10663cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Groups.SYNC3 + " TEXT, " + 10673cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Groups.SYNC4 + " TEXT " + 1068ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey ");"); 1069ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 10705f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov db.execSQL("CREATE INDEX groups_source_id_index ON " + Tables.GROUPS + " (" + 10715f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov Groups.SOURCE_ID + ", " + 10725f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov Groups.ACCOUNT_TYPE + ", " + 10735f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov Groups.ACCOUNT_NAME + 10745f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov ");"); 10755f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov 1076b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov db.execSQL("CREATE TABLE IF NOT EXISTS " + Tables.AGGREGATION_EXCEPTIONS + " (" + 1077b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov AggregationExceptionColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 1078b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov AggregationExceptions.TYPE + " INTEGER NOT NULL, " + 10790c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID1 10805ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " INTEGER REFERENCES raw_contacts(_id), " + 10810c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID2 10825ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " INTEGER REFERENCES raw_contacts(_id)" + 1083b0160a0bcf6d59eaa43fd501e124b95f873e0157Marc Blank ");"); 1084b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 1085b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov db.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS aggregation_exception_index1 ON " + 1086b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov Tables.AGGREGATION_EXCEPTIONS + " (" + 10870c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID1 + ", " + 10880c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID2 + 1089b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov ");"); 1090b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 1091b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov db.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS aggregation_exception_index2 ON " + 1092b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov Tables.AGGREGATION_EXCEPTIONS + " (" + 10930c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID2 + ", " + 10940c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID1 + 1095b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov ");"); 1096b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 1097eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey db.execSQL("CREATE TABLE IF NOT EXISTS " + Tables.SETTINGS + " (" + 1098eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey Settings.ACCOUNT_NAME + " STRING NOT NULL," + 1099eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey Settings.ACCOUNT_TYPE + " STRING NOT NULL," + 1100eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey Settings.UNGROUPED_VISIBLE + " INTEGER NOT NULL DEFAULT 0," + 1101eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey Settings.SHOULD_SYNC + " INTEGER NOT NULL DEFAULT 1, " + 1102eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey "PRIMARY KEY (" + Settings.ACCOUNT_NAME + ", " + 1103e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey Settings.ACCOUNT_TYPE + ") ON CONFLICT REPLACE" + 1104eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey ");"); 1105eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey 11064394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.VISIBLE_CONTACTS + " (" + 11074394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov Contacts._ID + " INTEGER PRIMARY KEY" + 11084394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov ");"); 11094394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 1110385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.DEFAULT_DIRECTORY + " (" + 1111385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov Contacts._ID + " INTEGER PRIMARY KEY" + 1112385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ");"); 1113385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 1114e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov // The table for recent calls is here so we can do table joins 1115e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov // on people, phones, and calls all in one place. 1116e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.CALLS + " (" + 1117e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 1118e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.NUMBER + " TEXT," + 1119e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.DATE + " INTEGER," + 1120e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.DURATION + " INTEGER," + 1121e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.TYPE + " INTEGER," + 1122e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.NEW + " INTEGER," + 1123e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.CACHED_NAME + " TEXT," + 1124e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.CACHED_NUMBER_TYPE + " INTEGER," + 11252530512f639c4979fd7371c7dd25dd67e8118124Bai Tao Calls.CACHED_NUMBER_LABEL + " TEXT," + 112659f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Calls.COUNTRY_ISO + " TEXT," + 112759f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Calls.VOICEMAIL_URI + " TEXT," + 112859f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails._DATA + " TEXT," + 112959f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails.HAS_CONTENT + " INTEGER," + 113059f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails.MIME_TYPE + " TEXT," + 113159f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails.SOURCE_DATA + " TEXT," + 113259f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails.SOURCE_PACKAGE + " TEXT," + 113359f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails.STATE + " INTEGER" + 113459f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee ");"); 1135e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov 1136069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee // Voicemail source status table. 1137069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee db.execSQL("CREATE TABLE " + Tables.VOICEMAIL_STATUS + " (" + 1138069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 1139069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.SOURCE_PACKAGE + " TEXT UNIQUE NOT NULL," + 1140069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.SETTINGS_URI + " TEXT," + 1141069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.VOICEMAIL_ACCESS_URI + " TEXT," + 1142069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.CONFIGURATION_STATE + " INTEGER," + 1143069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.DATA_CHANNEL_STATE + " INTEGER," + 1144069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE + " INTEGER" + 1145069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee ");"); 1146069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee 1147b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Activities table 1148b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey db.execSQL("CREATE TABLE " + Tables.ACTIVITIES + " (" + 1149b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 115067dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey ActivitiesColumns.PACKAGE_ID + " INTEGER REFERENCES package(_id)," + 1151b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ActivitiesColumns.MIMETYPE_ID + " INTEGER REFERENCES mimetype(_id) NOT NULL," + 1152b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities.RAW_ID + " TEXT," + 1153499791a4f9ab29fa94ff48dd7acff55b2ac089a7Dmitri Plotnikov Activities.IN_REPLY_TO + " TEXT," + 11545ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Activities.AUTHOR_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)," + 11555ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Activities.TARGET_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)," + 1156b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities.PUBLISHED + " INTEGER NOT NULL," + 1157499791a4f9ab29fa94ff48dd7acff55b2ac089a7Dmitri Plotnikov Activities.THREAD_PUBLISHED + " INTEGER NOT NULL," + 1158b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities.TITLE + " TEXT NOT NULL," + 1159b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities.SUMMARY + " TEXT," + 1160adb55c2d8295d300961d86a3605c8ddc469cd4a2Dmitri Plotnikov Activities.LINK + " TEXT, " + 1161b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities.THUMBNAIL + " BLOB" + 1162b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 1163b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 1164a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.STATUS_UPDATES + " (" + 1165a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov StatusUpdatesColumns.DATA_ID + " INTEGER PRIMARY KEY REFERENCES data(_id)," + 11660a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.STATUS + " TEXT," + 11670a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.STATUS_TIMESTAMP + " INTEGER," + 11680a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.STATUS_RES_PACKAGE + " TEXT, " + 11690a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.STATUS_LABEL + " INTEGER, " + 11700a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.STATUS_ICON + " INTEGER" + 1171a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov ");"); 1172a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 1173b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.PROPERTIES + " (" + 1174b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov PropertiesColumns.PROPERTY_KEY + " TEXT PRIMARY KEY, " + 1175b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov PropertiesColumns.PROPERTY_VALUE + " TEXT " + 1176b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov ");"); 1177b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 1178743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.ACCOUNTS + " (" + 117924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.ACCOUNT_NAME + " TEXT, " + 118024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.ACCOUNT_TYPE + " TEXT, " + 118124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.PROFILE_RAW_CONTACT_ID + " INTEGER" + 118224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ");"); 118324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 118424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro db.execSQL("CREATE INDEX accounts_profile_raw_contact_id_index ON " + 118524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Tables.ACCOUNTS + " (" + 118624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.PROFILE_RAW_CONTACT_ID + 1187743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov ");"); 1188743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 1189743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov // Allow contacts without any account to be created for now. Achieve that 1190743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov // by inserting a fake account with both type and name as NULL. 1191743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov // This "account" should be eliminated as soon as the first real writable account 1192743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov // is added to the phone. 119324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro db.execSQL("INSERT INTO " + Tables.ACCOUNTS + " VALUES(NULL, NULL, NULL)"); 1194743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 1195d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov createDirectoriesTable(db); 1196f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov createSearchIndexTable(db); 1197d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 119846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa db.execSQL("CREATE TABLE " + Tables.DATA_USAGE_STAT + "(" + 119946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 120046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.DATA_ID + " INTEGER NOT NULL, " + 120146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.USAGE_TYPE_INT + " INTEGER NOT NULL DEFAULT 0, " + 120246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.TIMES_USED + " INTEGER NOT NULL DEFAULT 0, " + 120346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.LAST_TIME_USED + " INTERGER NOT NULL DEFAULT 0, " + 120446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "FOREIGN KEY(" + DataUsageStatColumns.DATA_ID + ") REFERENCES " 120546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa + Tables.DATA + "(" + Data._ID + ")" + 120646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ");"); 120746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa db.execSQL("CREATE UNIQUE INDEX data_usage_stat_index ON " + 120846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Tables.DATA_USAGE_STAT + " (" + 120946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.DATA_ID + ", " + 121046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.USAGE_TYPE_INT + 121146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ");"); 121246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 1213a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov createContactsViews(db); 1214a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov createGroupsView(db); 1215fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov createContactsTriggers(db); 1216916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov createContactsIndexes(db); 12174a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1218a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov loadNicknameLookupTable(db); 1219a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 1220a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov // Add the legacy API support views, etc 1221a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov LegacyApiSupport.createDatabase(db); 1222a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 12232a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov if (mDatabaseOptimizationEnabled) { 12242a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov // This will create a sqlite_stat1 table that is used for query optimization 12252a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov db.execSQL("ANALYZE;"); 1226a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 12272a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov updateSqliteStats(db); 1228a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 12292a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov // We need to close and reopen the database connection so that the stats are 12302a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov // taken into account. Make a note of it and do the actual reopening in the 12312a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov // getWritableDatabase method. 12322a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mReopenDatabase = true; 12332a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 1234a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 1235a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov ContentResolver.requestSync(null /* all accounts */, 1236a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov ContactsContract.AUTHORITY, new Bundle()); 1237a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov } 1238a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 1239d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov private void createDirectoriesTable(SQLiteDatabase db) { 1240d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.DIRECTORIES + "(" + 1241d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 1242d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.PACKAGE_NAME + " TEXT NOT NULL," + 1243d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.DIRECTORY_AUTHORITY + " TEXT NOT NULL," + 1244d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.TYPE_RESOURCE_ID + " INTEGER," + 1245e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov DirectoryColumns.TYPE_RESOURCE_NAME + " TEXT," + 1246d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.ACCOUNT_TYPE + " TEXT," + 1247d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.ACCOUNT_NAME + " TEXT," + 1248d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.DISPLAY_NAME + " TEXT, " + 1249d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.EXPORT_SUPPORT + " INTEGER NOT NULL" + 125097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov " DEFAULT " + Directory.EXPORT_SUPPORT_NONE + "," + 125197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Directory.SHORTCUT_SUPPORT + " INTEGER NOT NULL" + 12523d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov " DEFAULT " + Directory.SHORTCUT_SUPPORT_NONE + "," + 12533d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Directory.PHOTO_SUPPORT + " INTEGER NOT NULL" + 12543d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov " DEFAULT " + Directory.PHOTO_SUPPORT_NONE + 1255d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ");"); 1256d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 12573d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov // Trigger a full scan of directories in the system 12583d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov setProperty(db, ContactDirectoryManager.PROPERTY_DIRECTORY_SCAN_COMPLETE, "0"); 1259d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 1260d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 126105e50fbf9809bf04eceec3d2a2753630dc4f9315Dmitri Plotnikov public void createSearchIndexTable(SQLiteDatabase db) { 1262f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS " + Tables.SEARCH_INDEX); 1263f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov db.execSQL("CREATE VIRTUAL TABLE " + Tables.SEARCH_INDEX 1264f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov + " USING FTS4 (" 1265f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov + SearchIndexColumns.CONTACT_ID + " INTEGER REFERENCES contacts(_id) NOT NULL," 1266f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov + SearchIndexColumns.CONTENT + " TEXT, " 1267155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov + SearchIndexColumns.NAME + " TEXT, " 1268f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov + SearchIndexColumns.TOKENS + " TEXT" 1269f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov + ")"); 1270f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 1271f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 1272916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov private static void createContactsTriggers(SQLiteDatabase db) { 1273fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1274fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov /* 1275fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov * Automatically delete Data rows when a raw contact is deleted. 1276fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov */ 1277fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS " + Tables.RAW_CONTACTS + "_deleted;"); 1278fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("CREATE TRIGGER " + Tables.RAW_CONTACTS + "_deleted " 1279fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEFORE DELETE ON " + Tables.RAW_CONTACTS 1280fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEGIN " 1281fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.DATA 1282fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + Data.RAW_CONTACT_ID 1283fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + "=OLD." + RawContacts._ID + ";" 1284fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.AGGREGATION_EXCEPTIONS 1285fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + AggregationExceptions.RAW_CONTACT_ID1 1286fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + "=OLD." + RawContacts._ID 1287fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " OR " + AggregationExceptions.RAW_CONTACT_ID2 1288fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + "=OLD." + RawContacts._ID + ";" 128935da06eb902047d8f3eb1698450d7bfdc41f22d4Dmitri Plotnikov + " DELETE FROM " + Tables.VISIBLE_CONTACTS 129035da06eb902047d8f3eb1698450d7bfdc41f22d4Dmitri Plotnikov + " WHERE " + Contacts._ID + "=OLD." + RawContacts.CONTACT_ID 129135da06eb902047d8f3eb1698450d7bfdc41f22d4Dmitri Plotnikov + " AND (SELECT COUNT(*) FROM " + Tables.RAW_CONTACTS 129235da06eb902047d8f3eb1698450d7bfdc41f22d4Dmitri Plotnikov + " WHERE " + RawContacts.CONTACT_ID + "=OLD." + RawContacts.CONTACT_ID 129335da06eb902047d8f3eb1698450d7bfdc41f22d4Dmitri Plotnikov + " )=1;" 1294385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + " DELETE FROM " + Tables.DEFAULT_DIRECTORY 1295385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + " WHERE " + Contacts._ID + "=OLD." + RawContacts.CONTACT_ID 1296385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + " AND (SELECT COUNT(*) FROM " + Tables.RAW_CONTACTS 1297385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + " WHERE " + RawContacts.CONTACT_ID + "=OLD." + RawContacts.CONTACT_ID 1298385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + " )=1;" 1299fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.CONTACTS 1300fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + Contacts._ID + "=OLD." + RawContacts.CONTACT_ID 1301fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " AND (SELECT COUNT(*) FROM " + Tables.RAW_CONTACTS 1302fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + RawContacts.CONTACT_ID + "=OLD." + RawContacts.CONTACT_ID 1303fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " )=1;" 1304fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " END"); 1305fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1306fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1307fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS contacts_times_contacted;"); 13086c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook db.execSQL("DROP TRIGGER IF EXISTS raw_contacts_times_contacted;"); 1309fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1310fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov /* 1311fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov * Triggers that update {@link RawContacts#VERSION} when the contact is 1312fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov * marked for deletion or any time a data row is inserted, updated or 1313fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov * deleted. 1314fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov */ 1315fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS " + Tables.RAW_CONTACTS + "_marked_deleted;"); 1316fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("CREATE TRIGGER " + Tables.RAW_CONTACTS + "_marked_deleted " 13177f61664c2b587e27f52edcb9a8b91986154ec637Vasu Nori + " AFTER UPDATE ON " + Tables.RAW_CONTACTS 1318fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEGIN " 1319fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " UPDATE " + Tables.RAW_CONTACTS 1320fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " SET " 1321fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + RawContacts.VERSION + "=OLD." + RawContacts.VERSION + "+1 " 1322fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + RawContacts._ID + "=OLD." + RawContacts._ID 1323fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " AND NEW." + RawContacts.DELETED + "!= OLD." + RawContacts.DELETED + ";" 1324fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " END"); 1325fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1326fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS " + Tables.DATA + "_updated;"); 13277f61664c2b587e27f52edcb9a8b91986154ec637Vasu Nori db.execSQL("CREATE TRIGGER " + Tables.DATA + "_updated AFTER UPDATE ON " + Tables.DATA 1328fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEGIN " 1329fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " UPDATE " + Tables.DATA 1330fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " SET " + Data.DATA_VERSION + "=OLD." + Data.DATA_VERSION + "+1 " 1331fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + Data._ID + "=OLD." + Data._ID + ";" 1332fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " UPDATE " + Tables.RAW_CONTACTS 1333fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " SET " + RawContacts.VERSION + "=" + RawContacts.VERSION + "+1 " 1334fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + RawContacts._ID + "=OLD." + Data.RAW_CONTACT_ID + ";" 1335fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " END"); 1336fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1337fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS " + Tables.DATA + "_deleted;"); 1338fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("CREATE TRIGGER " + Tables.DATA + "_deleted BEFORE DELETE ON " + Tables.DATA 1339fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEGIN " 1340fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " UPDATE " + Tables.RAW_CONTACTS 1341fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " SET " + RawContacts.VERSION + "=" + RawContacts.VERSION + "+1 " 1342fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + RawContacts._ID + "=OLD." + Data.RAW_CONTACT_ID + ";" 1343fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.PHONE_LOOKUP 1344fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + PhoneLookupColumns.DATA_ID + "=OLD." + Data._ID + ";" 1345fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.STATUS_UPDATES 1346fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + StatusUpdatesColumns.DATA_ID + "=OLD." + Data._ID + ";" 1347fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.NAME_LOOKUP 1348fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + NameLookupColumns.DATA_ID + "=OLD." + Data._ID + ";" 1349fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " END"); 1350fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1351fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1352fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS " + Tables.GROUPS + "_updated1;"); 1353fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("CREATE TRIGGER " + Tables.GROUPS + "_updated1 " 13547f61664c2b587e27f52edcb9a8b91986154ec637Vasu Nori + " AFTER UPDATE ON " + Tables.GROUPS 1355fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEGIN " 1356fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " UPDATE " + Tables.GROUPS 1357fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " SET " 1358fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + Groups.VERSION + "=OLD." + Groups.VERSION + "+1" 1359fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + Groups._ID + "=OLD." + Groups._ID + ";" 1360fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " END"); 1361fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov } 1362fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1363916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov private static void createContactsIndexes(SQLiteDatabase db) { 1364916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov db.execSQL("DROP INDEX IF EXISTS name_lookup_index"); 1365916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov db.execSQL("CREATE INDEX name_lookup_index ON " + Tables.NAME_LOOKUP + " (" + 1366916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov NameLookupColumns.NORMALIZED_NAME + "," + 1367916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov NameLookupColumns.NAME_TYPE + ", " + 1368916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov NameLookupColumns.RAW_CONTACT_ID + ", " + 1369916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov NameLookupColumns.DATA_ID + 1370916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ");"); 137104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 137204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov db.execSQL("DROP INDEX IF EXISTS raw_contact_sort_key1_index"); 137304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contact_sort_key1_index ON " + Tables.RAW_CONTACTS + " (" + 137404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov RawContacts.SORT_KEY_PRIMARY + 137504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov ");"); 137604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 137704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov db.execSQL("DROP INDEX IF EXISTS raw_contact_sort_key2_index"); 137804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contact_sort_key2_index ON " + Tables.RAW_CONTACTS + " (" + 137904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov RawContacts.SORT_KEY_ALTERNATIVE + 138004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov ");"); 1381916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 1382916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 1383a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov private static void createContactsViews(SQLiteDatabase db) { 1384a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.CONTACTS_ALL + ";"); 1385a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.CONTACTS_RESTRICTED + ";"); 1386a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_ALL + ";"); 1387a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_RESTRICTED + ";"); 1388a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_CONTACTS_ALL + ";"); 1389a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_CONTACTS_RESTRICTED + ";"); 1390a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_ENTITIES + ";"); 1391a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_ENTITIES_RESTRICTED + ";"); 1392a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.ENTITIES + ";"); 1393a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.ENTITIES_RESTRICTED + ";"); 13942f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_USAGE_STAT_ALL + ";"); 13952f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_USAGE_STAT_RESTRICTED + ";"); 1396a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 13974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String dataColumns = 13984a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Data.IS_PRIMARY + ", " 13994a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.IS_SUPER_PRIMARY + ", " 14004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA_VERSION + ", " 14014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + PackagesColumns.PACKAGE + " AS " + Data.RES_PACKAGE + "," 14024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + MimetypesColumns.MIMETYPE + " AS " + Data.MIMETYPE + ", " 140397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov + Data.IS_READ_ONLY + ", " 14044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA1 + ", " 14054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA2 + ", " 14064a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA3 + ", " 14074a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA4 + ", " 14084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA5 + ", " 14094a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA6 + ", " 14104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA7 + ", " 14114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA8 + ", " 14124a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA9 + ", " 14134a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA10 + ", " 14144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA11 + ", " 14154a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA12 + ", " 14164a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA13 + ", " 14174a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA14 + ", " 14184a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA15 + ", " 14194a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.SYNC1 + ", " 14204a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.SYNC2 + ", " 14214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.SYNC3 + ", " 14224a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.SYNC4; 14234a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 14244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String syncColumns = 14254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov RawContactsColumns.CONCRETE_ACCOUNT_NAME + " AS " + RawContacts.ACCOUNT_NAME + "," 14264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " AS " + RawContacts.ACCOUNT_TYPE + "," 14274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_SOURCE_ID + " AS " + RawContacts.SOURCE_ID + "," 1428f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov + RawContactsColumns.CONCRETE_NAME_VERIFIED + " AS " + RawContacts.NAME_VERIFIED + "," 14294a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_VERSION + " AS " + RawContacts.VERSION + "," 14304a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_DIRTY + " AS " + RawContacts.DIRTY + "," 14314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_SYNC1 + " AS " + RawContacts.SYNC1 + "," 14324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_SYNC2 + " AS " + RawContacts.SYNC2 + "," 14334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_SYNC3 + " AS " + RawContacts.SYNC3 + "," 14344a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_SYNC4 + " AS " + RawContacts.SYNC4; 14354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 14363d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov String baseContactColumns = 14373d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.HAS_PHONE_NUMBER + ", " 14383d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + Contacts.NAME_RAW_CONTACT_ID + ", " 14393d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + Contacts.LOOKUP_KEY + ", " 14403d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + Contacts.PHOTO_ID + ", " 14413d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + Clauses.CONTACT_VISIBLE + " AS " + Contacts.IN_VISIBLE_GROUP + ", " 14423d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + ContactsColumns.LAST_STATUS_UPDATE_ID; 14433d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov 14444a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String contactOptionColumns = 14454a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContactsColumns.CONCRETE_CUSTOM_RINGTONE 14464a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + RawContacts.CUSTOM_RINGTONE + "," 14474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_SEND_TO_VOICEMAIL 14484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + RawContacts.SEND_TO_VOICEMAIL + "," 14494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_LAST_TIME_CONTACTED 14504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + RawContacts.LAST_TIME_CONTACTED + "," 14514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_TIMES_CONTACTED 14524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + RawContacts.TIMES_CONTACTED + "," 14534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_STARRED 14544a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + RawContacts.STARRED; 14554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 14565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String contactNameColumns = 14575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov "name_raw_contact." + RawContacts.DISPLAY_NAME_SOURCE 14585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.DISPLAY_NAME_SOURCE + ", " 14595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.DISPLAY_NAME_PRIMARY 14605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.DISPLAY_NAME_PRIMARY + ", " 14615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.DISPLAY_NAME_ALTERNATIVE 14625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.DISPLAY_NAME_ALTERNATIVE + ", " 14635dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.PHONETIC_NAME 14645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.PHONETIC_NAME + ", " 14655dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.PHONETIC_NAME_STYLE 14665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.PHONETIC_NAME_STYLE + ", " 14675dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.SORT_KEY_PRIMARY 14685dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.SORT_KEY_PRIMARY + ", " 14695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.SORT_KEY_ALTERNATIVE 14704394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov + " AS " + Contacts.SORT_KEY_ALTERNATIVE; 14715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 14724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String dataSelect = "SELECT " 14734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + DataColumns.CONCRETE_ID + " AS " + Data._ID + "," 14744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.RAW_CONTACT_ID + ", " 1475fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + RawContactsColumns.CONCRETE_CONTACT_ID + " AS " + RawContacts.CONTACT_ID + ", " 14764a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + syncColumns + ", " 14774a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + dataColumns + ", " 14784a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + contactOptionColumns + ", " 14795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + contactNameColumns + ", " 14803d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + baseContactColumns + ", " 14813d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + buildPhotoUriAlias(RawContactsColumns.CONCRETE_CONTACT_ID, 14823d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI) + ", " 14833d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + buildPhotoUriAlias(RawContactsColumns.CONCRETE_CONTACT_ID, 14843d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI) + ", " 148524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro + "EXISTS (SELECT 1 FROM " + Tables.ACCOUNTS + 148624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " WHERE " + DataColumns.CONCRETE_RAW_CONTACT_ID + 148724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "=" + AccountsColumns.PROFILE_RAW_CONTACT_ID + ") AS " + 148824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE + ", " 14894a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Tables.GROUPS + "." + Groups.SOURCE_ID + " AS " + GroupMembership.GROUP_SOURCE_ID 14904a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " FROM " + Tables.DATA 1491a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + " JOIN " + Tables.MIMETYPES + " ON (" 14924a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + DataColumns.CONCRETE_MIMETYPE_ID + "=" + MimetypesColumns.CONCRETE_ID + ")" 1493a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + " JOIN " + Tables.RAW_CONTACTS + " ON (" 14944a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + DataColumns.CONCRETE_RAW_CONTACT_ID + "=" + RawContactsColumns.CONCRETE_ID + ")" 1495a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + " JOIN " + Tables.CONTACTS + " ON (" 1496fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + RawContactsColumns.CONCRETE_CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID + ")" 1497fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + " JOIN " + Tables.RAW_CONTACTS + " AS name_raw_contact ON(" 1498fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + Contacts.NAME_RAW_CONTACT_ID + "=name_raw_contact." + RawContacts._ID + ")" 1499a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + " LEFT OUTER JOIN " + Tables.PACKAGES + " ON (" 1500a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + DataColumns.CONCRETE_PACKAGE_ID + "=" + PackagesColumns.CONCRETE_ID + ")" 15014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.GROUPS + " ON (" 15024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + MimetypesColumns.CONCRETE_MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE 1503f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov + "' AND " + GroupsColumns.CONCRETE_ID + "=" 1504a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + Tables.DATA + "." + GroupMembership.GROUP_ROW_ID + ")"; 15054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15064a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.DATA_ALL + " AS " + dataSelect); 15074a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.DATA_RESTRICTED + " AS " + dataSelect + " WHERE " 1508fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + RawContactsColumns.CONCRETE_IS_RESTRICTED + "=0"); 15094a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String rawContactOptionColumns = 15114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov RawContacts.CUSTOM_RINGTONE + "," 15124a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.SEND_TO_VOICEMAIL + "," 15134a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.LAST_TIME_CONTACTED + "," 15144a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.TIMES_CONTACTED + "," 15154a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.STARRED; 15164a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15174a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String rawContactsSelect = "SELECT " 15184a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_ID + " AS " + RawContacts._ID + "," 15194a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.CONTACT_ID + ", " 15204a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.AGGREGATION_MODE + ", " 152197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov + RawContacts.RAW_CONTACT_IS_READ_ONLY + ", " 15224a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.DELETED + ", " 15235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.DISPLAY_NAME_SOURCE + ", " 15245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.DISPLAY_NAME_PRIMARY + ", " 15255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.DISPLAY_NAME_ALTERNATIVE + ", " 15265dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.PHONETIC_NAME + ", " 15275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.PHONETIC_NAME_STYLE + ", " 15285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.SORT_KEY_PRIMARY + ", " 15295dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.SORT_KEY_ALTERNATIVE + ", " 153024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro + "EXISTS (SELECT 1 FROM " + Tables.ACCOUNTS + 153124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " WHERE " + AccountsColumns.PROFILE_RAW_CONTACT_ID + 153224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "=" + RawContactsColumns.CONCRETE_ID + ") AS " + 153324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE + ", " 15344a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + rawContactOptionColumns + ", " 15354a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + syncColumns 15364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " FROM " + Tables.RAW_CONTACTS; 15374a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15384a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.RAW_CONTACTS_ALL + " AS " + rawContactsSelect); 15394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.RAW_CONTACTS_RESTRICTED + " AS " + rawContactsSelect 15404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " WHERE " + RawContacts.IS_RESTRICTED + "=0"); 15414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15424a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String contactsColumns = 15434a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContactsColumns.CONCRETE_CUSTOM_RINGTONE 15444a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + Contacts.CUSTOM_RINGTONE + ", " 15455dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + contactNameColumns + ", " 15463d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + baseContactColumns + ", " 15474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_LAST_TIME_CONTACTED 15484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + Contacts.LAST_TIME_CONTACTED + ", " 15494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_SEND_TO_VOICEMAIL 15504a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + Contacts.SEND_TO_VOICEMAIL + ", " 15514a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_STARRED 15524a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + Contacts.STARRED + ", " 15534a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_TIMES_CONTACTED 15543d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + " AS " + Contacts.TIMES_CONTACTED; 15554a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15564a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String contactsSelect = "SELECT " 15574a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_ID + " AS " + Contacts._ID + "," 15583d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + contactsColumns + ", " 15593d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + buildPhotoUriAlias(ContactsColumns.CONCRETE_ID, Contacts.PHOTO_URI) + ", " 156024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro + buildPhotoUriAlias(ContactsColumns.CONCRETE_ID, 156124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.PHOTO_THUMBNAIL_URI) + ", " 156224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro + "EXISTS (SELECT 1 FROM " + Tables.ACCOUNTS + 156324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " JOIN " + Tables.RAW_CONTACTS + " ON " + RawContactsColumns.CONCRETE_ID + "=" + 156424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.PROFILE_RAW_CONTACT_ID + 156524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " WHERE " + RawContactsColumns.CONCRETE_CONTACT_ID + 156624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "=" + ContactsColumns.CONCRETE_ID + ") AS " + 156724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE 15684a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " FROM " + Tables.CONTACTS 1569fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + " JOIN " + Tables.RAW_CONTACTS + " AS name_raw_contact ON(" 1570fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + Contacts.NAME_RAW_CONTACT_ID + "=name_raw_contact." + RawContacts._ID + ")"; 15714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.CONTACTS_ALL + " AS " + contactsSelect); 1573fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL("CREATE VIEW " + Views.CONTACTS_RESTRICTED + " AS " + contactsSelect 1574fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + " WHERE " + ContactsColumns.SINGLE_IS_RESTRICTED + "=0"); 1575a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 1576a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov String rawEntitiesSelect = "SELECT " 1577a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContacts.CONTACT_ID + ", " 1578a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_DELETED + " AS " + RawContacts.DELETED + "," 1579a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + dataColumns + ", " 1580a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + syncColumns + ", " 1581a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC1 + ", " 1582a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC2 + ", " 1583a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC3 + ", " 1584a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC4 + ", " 1585a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_ID + " AS " + RawContacts._ID + ", " 1586a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_ID + " AS " + RawContacts.Entity.DATA_ID + "," 1587a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_STARRED + " AS " + RawContacts.STARRED + "," 1588a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_IS_RESTRICTED + " AS " 1589a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContacts.IS_RESTRICTED + "," 159024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro + "EXISTS (SELECT 1 FROM " + Tables.ACCOUNTS + 159124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " WHERE " + RawContactsColumns.CONCRETE_ID + 159224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "=" + AccountsColumns.PROFILE_RAW_CONTACT_ID + ") AS " + 159324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE + "," 1594a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Tables.GROUPS + "." + Groups.SOURCE_ID + " AS " + GroupMembership.GROUP_SOURCE_ID 1595a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " FROM " + Tables.RAW_CONTACTS 1596a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.DATA + " ON (" 1597a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_RAW_CONTACT_ID + "=" + RawContactsColumns.CONCRETE_ID + ")" 1598a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.PACKAGES + " ON (" 1599a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_PACKAGE_ID + "=" + PackagesColumns.CONCRETE_ID + ")" 1600a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.MIMETYPES + " ON (" 1601a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_MIMETYPE_ID + "=" + MimetypesColumns.CONCRETE_ID + ")" 1602a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.GROUPS + " ON (" 1603a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + MimetypesColumns.CONCRETE_MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE 1604a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + "' AND " + GroupsColumns.CONCRETE_ID + "=" 1605a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Tables.DATA + "." + GroupMembership.GROUP_ROW_ID + ")"; 1606a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 1607a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.RAW_ENTITIES + " AS " 1608a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + rawEntitiesSelect); 1609a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.RAW_ENTITIES_RESTRICTED + " AS " 1610a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + rawEntitiesSelect + " WHERE " + RawContacts.IS_RESTRICTED + "=0"); 1611a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 1612a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov String entitiesSelect = "SELECT " 1613a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_CONTACT_ID + " AS " + Contacts._ID + ", " 1614a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_CONTACT_ID + " AS " + RawContacts.CONTACT_ID + ", " 1615a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_DELETED + " AS " + RawContacts.DELETED + "," 1616a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_IS_RESTRICTED 1617a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " AS " + RawContacts.IS_RESTRICTED + "," 1618a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + dataColumns + ", " 1619a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + syncColumns + ", " 1620a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + contactsColumns + ", " 16213d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + buildPhotoUriAlias(RawContactsColumns.CONCRETE_CONTACT_ID, 16223d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI) + ", " 16233d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + buildPhotoUriAlias(RawContactsColumns.CONCRETE_CONTACT_ID, 16243d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI) + ", " 162524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro + "EXISTS (SELECT 1 FROM " + Tables.ACCOUNTS + 162624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " JOIN " + Tables.RAW_CONTACTS + " ON " + RawContactsColumns.CONCRETE_ID + "=" + 162724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.PROFILE_RAW_CONTACT_ID + 162824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " WHERE " + RawContactsColumns.CONCRETE_CONTACT_ID + 162924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "=" + ContactsColumns.CONCRETE_ID + ") AS " + 163024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE + ", " 1631a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC1 + ", " 1632a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC2 + ", " 1633a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC3 + ", " 1634a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC4 + ", " 1635a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_ID + " AS " + Contacts.Entity.RAW_CONTACT_ID + ", " 1636a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_ID + " AS " + Contacts.Entity.DATA_ID + "," 1637a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Tables.GROUPS + "." + Groups.SOURCE_ID + " AS " + GroupMembership.GROUP_SOURCE_ID 1638a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " FROM " + Tables.RAW_CONTACTS 1639a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " JOIN " + Tables.CONTACTS + " ON (" 1640a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID + ")" 1641a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " JOIN " + Tables.RAW_CONTACTS + " AS name_raw_contact ON(" 1642a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Contacts.NAME_RAW_CONTACT_ID + "=name_raw_contact." + RawContacts._ID + ")" 1643a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.DATA + " ON (" 1644a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_RAW_CONTACT_ID + "=" + RawContactsColumns.CONCRETE_ID + ")" 1645a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.PACKAGES + " ON (" 1646a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_PACKAGE_ID + "=" + PackagesColumns.CONCRETE_ID + ")" 1647a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.MIMETYPES + " ON (" 1648a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_MIMETYPE_ID + "=" + MimetypesColumns.CONCRETE_ID + ")" 1649a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.GROUPS + " ON (" 1650a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + MimetypesColumns.CONCRETE_MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE 1651a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + "' AND " + GroupsColumns.CONCRETE_ID + "=" 1652a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Tables.DATA + "." + GroupMembership.GROUP_ROW_ID + ")"; 1653a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 1654a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.ENTITIES + " AS " 1655a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + entitiesSelect); 1656a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.ENTITIES_RESTRICTED + " AS " 1657a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + entitiesSelect + " WHERE " + RawContactsColumns.CONCRETE_IS_RESTRICTED + "=0"); 16582f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 16592f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa String dataUsageStatSelect = "SELECT " 16602f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataUsageStatColumns.CONCRETE_ID + " AS " + DataUsageStatColumns._ID + ", " 16612f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataUsageStatColumns.DATA_ID + ", " 16622f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + RawContactsColumns.CONCRETE_CONTACT_ID + " AS " + RawContacts.CONTACT_ID + ", " 16632f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + MimetypesColumns.CONCRETE_MIMETYPE + " AS " + Data.MIMETYPE + ", " 16642f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataUsageStatColumns.USAGE_TYPE_INT + ", " 16652f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataUsageStatColumns.TIMES_USED + ", " 16662f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataUsageStatColumns.LAST_TIME_USED 16672f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + " FROM " + Tables.DATA_USAGE_STAT 16682f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + " JOIN " + Tables.DATA + " ON (" 16692f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataColumns.CONCRETE_ID + "=" + DataUsageStatColumns.CONCRETE_DATA_ID + ")" 16702f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + " JOIN " + Tables.RAW_CONTACTS + " ON (" 16712f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + RawContactsColumns.CONCRETE_ID + "=" + DataColumns.CONCRETE_RAW_CONTACT_ID 16722f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + " )" 16732f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + " JOIN " + Tables.MIMETYPES + " ON (" 16742f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + MimetypesColumns.CONCRETE_ID + "=" + DataColumns.CONCRETE_MIMETYPE_ID + ")"; 16752f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 16762f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa db.execSQL("CREATE VIEW " + Views.DATA_USAGE_STAT_ALL + " AS " + dataUsageStatSelect); 16772f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa db.execSQL("CREATE VIEW " + Views.DATA_USAGE_STAT_RESTRICTED + " AS " 16782f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + dataUsageStatSelect + " WHERE " 16792f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + RawContactsColumns.CONCRETE_IS_RESTRICTED + "=0"); 1680a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov } 16814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16823d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov private static String buildPhotoUriAlias(String contactIdColumn, String alias) { 16832b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov return "(CASE WHEN " + Contacts.PHOTO_ID + " IS NULL" 16842b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov + " OR " + Contacts.PHOTO_ID + "=0" 16852b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov + " THEN NULL" 16862b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov + " ELSE " + "'" + Contacts.CONTENT_URI + "/'||" 16872b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov + contactIdColumn + "|| '/" + Photo.CONTENT_DIRECTORY + "'" 16882b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov + " END)" 16892b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov + " AS " + alias; 16903d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov } 16913d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov 1692a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov private static void createGroupsView(SQLiteDatabase db) { 1693a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.GROUPS_ALL + ";"); 169489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov String groupsColumns = 169589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Groups.ACCOUNT_NAME + "," 169689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.ACCOUNT_TYPE + "," 169789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SOURCE_ID + "," 169889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.VERSION + "," 169989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.DIRTY + "," 170089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.TITLE + "," 170189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.TITLE_RES + "," 170289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.NOTES + "," 170389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SYSTEM_ID + "," 170489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.DELETED + "," 170589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.GROUP_VISIBLE + "," 170689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SHOULD_SYNC + "," 1707dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana + Groups.AUTO_ADD + "," 1708dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana + Groups.FAVORITES + "," 1709c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov + Groups.GROUP_IS_READ_ONLY + "," 171089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SYNC1 + "," 171189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SYNC2 + "," 171289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SYNC3 + "," 171389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SYNC4 + "," 171489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + PackagesColumns.PACKAGE + " AS " + Groups.RES_PACKAGE; 171589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 171689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov String groupsSelect = "SELECT " 171789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + GroupsColumns.CONCRETE_ID + " AS " + Groups._ID + "," 171889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + groupsColumns 171989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + " FROM " + Tables.GROUPS_JOIN_PACKAGES; 172089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 172189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.GROUPS_ALL + " AS " + groupsSelect); 1722b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 1723b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 1724b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey @Override 1725b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 172646b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana if (oldVersion < 99) { 172746b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana Log.i(TAG, "Upgrading from version " + oldVersion + " to " + newVersion 172846b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana + ", data will be lost!"); 172946b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana 173046b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.CONTACTS + ";"); 173146b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.RAW_CONTACTS + ";"); 173246b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.PACKAGES + ";"); 173346b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.MIMETYPES + ";"); 173446b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.DATA + ";"); 173546b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.PHONE_LOOKUP + ";"); 173646b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.NAME_LOOKUP + ";"); 173746b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.NICKNAME_LOOKUP + ";"); 173846b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.GROUPS + ";"); 173946b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.ACTIVITIES + ";"); 174046b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.CALLS + ";"); 174146b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.SETTINGS + ";"); 174246b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.STATUS_UPDATES + ";"); 174346b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana 174446b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana // TODO: we should not be dropping agg_exceptions and contact_options. In case that 174546b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana // table's schema changes, we should try to preserve the data, because it was entered 174646b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana // by the user and has never been synched to the server. 174746b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.AGGREGATION_EXCEPTIONS + ";"); 174846b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana 174946b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana onCreate(db); 175046b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana return; 175146b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana } 1752f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 175346b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana Log.i(TAG, "Upgrading from version " + oldVersion + " to " + newVersion); 1754a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 175508e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov boolean upgradeViewsAndTriggers = false; 175604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov boolean upgradeNameLookup = false; 17578d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov boolean upgradeLegacyApiSupport = false; 1758155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov boolean upgradeSearchIndex = false; 175908e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov 176046b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana if (oldVersion == 99) { 176108e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 176246b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana oldVersion++; 176346b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana } 176446b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana 1765a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov if (oldVersion == 100) { 1766a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov db.execSQL("CREATE INDEX IF NOT EXISTS mimetypes_mimetype_index ON " 1767a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + Tables.MIMETYPES + " (" 1768a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + MimetypesColumns.MIMETYPE + "," 1769a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + MimetypesColumns._ID + ");"); 1770a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov updateIndexStats(db, Tables.MIMETYPES, 1771a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov "mimetypes_mimetype_index", "50 1 1"); 1772a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 177308e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 1774a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov oldVersion++; 1775a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov } 1776a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 1777fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov if (oldVersion == 101) { 177808e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 1779fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov oldVersion++; 1780fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov } 1781fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 178247ab23770b9f010a5e5277cda68267fe0613a1ccDmitri Plotnikov if (oldVersion == 102) { 178308e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 178447ab23770b9f010a5e5277cda68267fe0613a1ccDmitri Plotnikov oldVersion++; 178547ab23770b9f010a5e5277cda68267fe0613a1ccDmitri Plotnikov } 178647ab23770b9f010a5e5277cda68267fe0613a1ccDmitri Plotnikov 178736045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov if (oldVersion == 103) { 178808e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 1789bf6a7e4dece49ba4e7cda17f7ed9250aeb82f731Jeff Sharkey oldVersion++; 1790bf6a7e4dece49ba4e7cda17f7ed9250aeb82f731Jeff Sharkey } 1791bf6a7e4dece49ba4e7cda17f7ed9250aeb82f731Jeff Sharkey 179271037c010a0b7c882284fc1ed8584a378d926b83Dmitri Plotnikov if (oldVersion == 104 || oldVersion == 201) { 179371037c010a0b7c882284fc1ed8584a378d926b83Dmitri Plotnikov LegacyApiSupport.createSettingsTable(db); 179408e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 17953410a80f4aafe5685da61c217808d2bf21d55dfcDmitri Plotnikov oldVersion++; 17963410a80f4aafe5685da61c217808d2bf21d55dfcDmitri Plotnikov } 17973410a80f4aafe5685da61c217808d2bf21d55dfcDmitri Plotnikov 179871037c010a0b7c882284fc1ed8584a378d926b83Dmitri Plotnikov if (oldVersion == 105) { 17995dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeToVersion202(db); 180004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov upgradeNameLookup = true; 18013410a80f4aafe5685da61c217808d2bf21d55dfcDmitri Plotnikov oldVersion = 202; 180236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 180336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 1804fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov if (oldVersion == 202) { 18055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeToVersion203(db); 180608e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 1807fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov oldVersion++; 1808fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov } 1809fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 18109b1bd62417ef1764829398a61c3d5df93a924106Vasu Nori if (oldVersion == 203) { 181108e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 18129b1bd62417ef1764829398a61c3d5df93a924106Vasu Nori oldVersion++; 18139b1bd62417ef1764829398a61c3d5df93a924106Vasu Nori } 18149b1bd62417ef1764829398a61c3d5df93a924106Vasu Nori 18155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (oldVersion == 204) { 18165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeToVersion205(db); 181708e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 18185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov oldVersion++; 18195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 18205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 1821f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov if (oldVersion == 205) { 1822f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov upgrateToVersion206(db); 1823f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov upgradeViewsAndTriggers = true; 1824f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov oldVersion++; 1825f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov } 1826f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 182731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov if (oldVersion == 206) { 1828b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov upgradeToVersion300(db); 182934469970fb04b9b188b5430f592b0c956a6ea2aaDmitri Plotnikov oldVersion = 300; 183031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov } 183131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 18326c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook if (oldVersion == 300) { 18336c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook upgradeViewsAndTriggers = true; 18346c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook oldVersion = 301; 18356c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook } 18366c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook 1837916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov if (oldVersion == 301) { 1838916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov upgradeViewsAndTriggers = true; 1839916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov oldVersion = 302; 1840916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 1841916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 1842b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (oldVersion == 302) { 1843b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov upgradeEmailToVersion303(db); 1844b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov upgradeNicknameToVersion303(db); 1845b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov oldVersion = 303; 1846b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 1847b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 184808768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov if (oldVersion == 303) { 184908768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov upgradeToVersion304(db); 185008768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov oldVersion = 304; 185108768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov } 185208768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov 1853f84478382761d74b9fb98c4189de66002c04cef8Sang-il, Lee if (oldVersion == 304) { 1854f84478382761d74b9fb98c4189de66002c04cef8Sang-il, Lee upgradeNameLookup = true; 1855f84478382761d74b9fb98c4189de66002c04cef8Sang-il, Lee oldVersion = 305; 1856f84478382761d74b9fb98c4189de66002c04cef8Sang-il, Lee } 1857f84478382761d74b9fb98c4189de66002c04cef8Sang-il, Lee 185860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann if (oldVersion == 305) { 185960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann upgradeToVersion306(db); 186060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann oldVersion = 306; 186160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 186260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 1863b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov if (oldVersion == 306) { 1864b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov upgradeToVersion307(db); 1865b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov oldVersion = 307; 1866b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 1867b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 1868743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov if (oldVersion == 307) { 1869743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov upgradeToVersion308(db); 1870743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov oldVersion = 308; 1871743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov } 1872743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 187394c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov // Gingerbread upgrades 187494c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov if (oldVersion < 350) { 1875afbf2a3343d0f8e7ae7cbfbbec60004ed37caf3fDaniel Lehmann upgradeViewsAndTriggers = true; 187694c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov oldVersion = 351; 1877afbf2a3343d0f8e7ae7cbfbbec60004ed37caf3fDaniel Lehmann } 1878afbf2a3343d0f8e7ae7cbfbbec60004ed37caf3fDaniel Lehmann 187994c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov if (oldVersion == 351) { 188094c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov upgradeNameLookup = true; 188194c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov oldVersion = 352; 188280d7871ca31d604cbfd857661d5300bb090076dbDaniel Lehmann } 188380d7871ca31d604cbfd857661d5300bb090076dbDaniel Lehmann 18847da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov if (oldVersion == 352) { 18857da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov upgradeToVersion353(db); 18867da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov oldVersion = 353; 18877da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov } 18887da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov 1889f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov // Honeycomb upgrades 1890f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov if (oldVersion < 400) { 1891dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana upgradeViewsAndTriggers = true; 1892f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov upgradeToVersion400(db); 1893f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov oldVersion = 400; 1894dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 1895dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 1896f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov if (oldVersion == 400) { 18974394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov upgradeViewsAndTriggers = true; 18984394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov upgradeToVersion401(db); 18994394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov oldVersion = 401; 19004394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov } 19014394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 1902d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov if (oldVersion == 401) { 1903d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov upgradeToVersion402(db); 1904d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov oldVersion = 402; 1905d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 1906d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 190797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov if (oldVersion == 402) { 190897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov upgradeViewsAndTriggers = true; 190997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov upgradeToVersion403(db); 191097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov oldVersion = 403; 191197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 191297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 1913a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov if (oldVersion == 403) { 1914a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov upgradeViewsAndTriggers = true; 1915a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov oldVersion = 404; 1916a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 1917a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 1918892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (oldVersion == 404) { 1919892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov upgradeViewsAndTriggers = true; 1920892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov upgradeToVersion405(db); 1921892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov oldVersion = 405; 1922892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 1923892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 19242530512f639c4979fd7371c7dd25dd67e8118124Bai Tao if (oldVersion == 405) { 19252530512f639c4979fd7371c7dd25dd67e8118124Bai Tao upgradeViewsAndTriggers = true; 19262530512f639c4979fd7371c7dd25dd67e8118124Bai Tao upgradeToVersion406(db); 19272530512f639c4979fd7371c7dd25dd67e8118124Bai Tao oldVersion = 406; 19282530512f639c4979fd7371c7dd25dd67e8118124Bai Tao } 19292530512f639c4979fd7371c7dd25dd67e8118124Bai Tao 1930cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov if (oldVersion == 406) { 1931cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov upgradeViewsAndTriggers = true; 1932cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov oldVersion = 407; 1933cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov } 1934cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov 1935385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov if (oldVersion == 407) { 1936d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov // Obsolete 1937385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov oldVersion = 408; 1938385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov } 1939385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 19403d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov if (oldVersion == 408) { 19413d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov upgradeViewsAndTriggers = true; 19423d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov upgradeToVersion409(db); 19433d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov oldVersion = 409; 19443d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov } 19453d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov 19462b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov if (oldVersion == 409) { 19472b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov upgradeViewsAndTriggers = true; 19482b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov oldVersion = 410; 19492b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov } 19502b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov 1951d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov if (oldVersion == 410) { 1952d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov upgradeToVersion411(db); 1953d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov oldVersion = 411; 1954d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov } 1955d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov 19567da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov if (oldVersion == 411) { 19577da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov // Same upgrade as 353, only on Honeycomb devices 19587da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov upgradeToVersion353(db); 19597da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov oldVersion = 412; 19607da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov } 19617da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov 1962e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov if (oldVersion == 412) { 1963e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov upgradeToVersion413(db); 1964e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov oldVersion = 413; 1965e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov } 1966e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov 196756f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee if (oldVersion == 413) { 196856f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee upgradeNameLookup = true; 196956f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee oldVersion = 414; 197056f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee } 197156f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee 1972c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov if (oldVersion == 414) { 1973c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov upgradeToVersion415(db); 1974c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov upgradeViewsAndTriggers = true; 1975c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov oldVersion = 415; 1976c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov } 1977c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov 1978d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov if (oldVersion == 415) { 1979d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov upgradeToVersion416(db); 1980d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov oldVersion = 416; 1981d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov } 1982d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov 19838d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov if (oldVersion == 416) { 19848d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov upgradeLegacyApiSupport = true; 19858d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov oldVersion = 417; 19868d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov } 19878d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov 1988f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov // Honeycomb-MR1 upgrades 1989f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov if (oldVersion < 500) { 1990155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov upgradeSearchIndex = true; 1991f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 1992f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 1993197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov if (oldVersion < 501) { 1994155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov upgradeSearchIndex = true; 1995197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov upgradeToVersion501(db); 1996197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov oldVersion = 501; 1997197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov } 1998197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov 199992ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov if (oldVersion < 502) { 2000155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov upgradeSearchIndex = true; 200192ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov upgradeToVersion502(db); 200292ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov oldVersion = 502; 200392ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov } 200492ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov 2005155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov if (oldVersion < 503) { 2006155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov upgradeSearchIndex = true; 2007155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov oldVersion = 503; 2008155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov } 2009155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov 201055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov if (oldVersion < 504) { 201155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov upgradeToVersion504(db); 201255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov oldVersion = 504; 201355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 201455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 201524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro if (oldVersion < 600) { 201624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro upgradeToVersion600(db); 201724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro upgradeViewsAndTriggers = true; 201824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro oldVersion = 600; 201924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 202024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 202146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa if (oldVersion < 601) { 202246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa upgradeToVersion601(db); 202346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa oldVersion = 601; 202446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa } 202546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 202659f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee if (oldVersion < 602) { 202759f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee upgradeToVersion602(db); 202859f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee oldVersion = 602; 202959f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee } 203059f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee 20312f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa if (oldVersion < 603) { 20322f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa upgradeViewsAndTriggers = true; 20332f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa oldVersion = 603; 20342f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa } 20352f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 2036069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee if (oldVersion < 604) { 2037069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee upgradeToVersion604(db); 2038069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee oldVersion = 604; 2039069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee } 2040069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee 20413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann if (oldVersion < 605) { 20423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann upgradeToVersion605(db); 20433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann oldVersion = 605; 20443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 20453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 204608e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov if (upgradeViewsAndTriggers) { 204708e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov createContactsViews(db); 204808e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov createGroupsView(db); 204908e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov createContactsTriggers(db); 2050916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov createContactsIndexes(db); 2051916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov updateSqliteStats(db); 20528d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov upgradeLegacyApiSupport = true; 2053916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov mReopenDatabase = true; 205408e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov } 205508e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov 20568d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov if (upgradeLegacyApiSupport) { 20578d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov LegacyApiSupport.createViews(db); 20588d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov } 20598d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov 206004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov if (upgradeNameLookup) { 206104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov rebuildNameLookup(db); 206204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 206304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 2064155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov if (upgradeSearchIndex) { 2065155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov setProperty(db, SearchIndexManager.PROPERTY_SEARCH_INDEX_VERSION, "0"); 2066155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov } 2067155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov 206846b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana if (oldVersion != newVersion) { 206946b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana throw new IllegalStateException( 207046b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana "error upgrading the database to version " + newVersion); 207146b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana } 2072b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 2073b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 20745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeToVersion202(SQLiteDatabase db) { 207536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov db.execSQL( 207636045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov "ALTER TABLE " + Tables.PHONE_LOOKUP + 207736045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov " ADD " + PhoneLookupColumns.MIN_MATCH + " TEXT;"); 207836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 207936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_min_match_index ON " + Tables.PHONE_LOOKUP + " (" + 208036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.MIN_MATCH + "," + 208136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID + "," + 208236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.DATA_ID + 208336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov ");"); 208436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 208536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov updateIndexStats(db, Tables.PHONE_LOOKUP, 208636045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov "phone_lookup_min_match_index", "10000 2 2 1"); 208736045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 208836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov SQLiteStatement update = db.compileStatement( 208936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov "UPDATE " + Tables.PHONE_LOOKUP + 209036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov " SET " + PhoneLookupColumns.MIN_MATCH + "=?" + 209136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov " WHERE " + PhoneLookupColumns.DATA_ID + "=?"); 209236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 209336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov // Populate the new column 209436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov Cursor c = db.query(Tables.PHONE_LOOKUP + " JOIN " + Tables.DATA + 209536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov " ON (" + PhoneLookupColumns.DATA_ID + "=" + DataColumns.CONCRETE_ID + ")", 209636045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov new String[]{Data._ID, Phone.NUMBER}, null, null, null, null, null); 209736045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov try { 209836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov while (c.moveToNext()) { 209936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov long dataId = c.getLong(0); 210036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov String number = c.getString(1); 210136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov if (!TextUtils.isEmpty(number)) { 210236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov update.bindString(1, PhoneNumberUtils.toCallerIDMinMatch(number)); 210336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov update.bindLong(2, dataId); 210436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov update.execute(); 210536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 210636045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 210736045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } finally { 210836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov c.close(); 210936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 211036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 211136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 21125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeToVersion203(SQLiteDatabase db) { 2113758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov // Garbage-collect first. A bug in Eclair was sometimes leaving 2114758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov // raw_contacts in the database that no longer had contacts associated 2115758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov // with them. To avoid failures during this database upgrade, drop 2116758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov // the orphaned raw_contacts. 2117758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov db.execSQL( 2118758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov "DELETE FROM raw_contacts" + 2119758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov " WHERE contact_id NOT NULL" + 2120758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov " AND contact_id NOT IN (SELECT _id FROM contacts)"); 2121758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov 2122fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2123fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "ALTER TABLE " + Tables.CONTACTS + 2124fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " ADD " + Contacts.NAME_RAW_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)"); 2125fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2126fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "ALTER TABLE " + Tables.RAW_CONTACTS + 21274394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " ADD contact_in_visible_group INTEGER NOT NULL DEFAULT 0"); 2128fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2129fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // For each Contact, find the RawContact that contributed the display name 2130fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2131fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "UPDATE " + Tables.CONTACTS + 2132fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " SET " + Contacts.NAME_RAW_CONTACT_ID + "=(" + 2133fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " SELECT " + RawContacts._ID + 2134fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 2135fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID + 2136fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_DISPLAY_NAME + "=" + 2137fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Tables.CONTACTS + "." + Contacts.DISPLAY_NAME + 2138fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " ORDER BY " + RawContacts._ID + 2139fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " LIMIT 1)" 2140fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ); 2141fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2142fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL("CREATE INDEX contacts_name_raw_contact_id_index ON " + Tables.CONTACTS + " (" + 2143fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID + 2144fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ");"); 2145fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2146fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // If for some unknown reason we missed some names, let's make sure there are 2147fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // no contacts without a name, picking a raw contact "at random". 2148fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2149fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "UPDATE " + Tables.CONTACTS + 2150fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " SET " + Contacts.NAME_RAW_CONTACT_ID + "=(" + 2151fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " SELECT " + RawContacts._ID + 2152fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 2153fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID + 2154fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " ORDER BY " + RawContacts._ID + 2155fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " LIMIT 1)" + 2156fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " WHERE " + Contacts.NAME_RAW_CONTACT_ID + " IS NULL" 2157fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ); 2158fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2159fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // Wipe out DISPLAY_NAME on the Contacts table as it is no longer in use. 2160fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2161fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "UPDATE " + Tables.CONTACTS + 2162fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " SET " + Contacts.DISPLAY_NAME + "=NULL" 2163fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ); 2164fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2165fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // Copy the IN_VISIBLE_GROUP flag down to all raw contacts to allow 2166fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // indexing on (display_name, in_visible_group) 2167fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2168fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "UPDATE " + Tables.RAW_CONTACTS + 21694394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " SET contact_in_visible_group=(" + 2170fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "SELECT " + Contacts.IN_VISIBLE_GROUP + 2171fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " FROM " + Tables.CONTACTS + 2172bcbd6a5cdd2d1aa6531c592428dc20e0282486c3Dmitri Plotnikov " WHERE " + Contacts._ID + "=" + RawContacts.CONTACT_ID + ")" + 2173bcbd6a5cdd2d1aa6531c592428dc20e0282486c3Dmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + " NOT NULL" 2174fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ); 2175fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2176fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL("CREATE INDEX raw_contact_sort_key1_index ON " + Tables.RAW_CONTACTS + " (" + 21774394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "contact_in_visible_group" + "," + 2178fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov RawContactsColumns.DISPLAY_NAME + " COLLATE LOCALIZED ASC" + 2179fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ");"); 2180fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2181fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL("DROP INDEX contacts_visible_index"); 2182fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL("CREATE INDEX contacts_visible_index ON " + Tables.CONTACTS + " (" + 2183fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Contacts.IN_VISIBLE_GROUP + 2184fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ");"); 2185fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov } 2186fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 21875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeToVersion205(SQLiteDatabase db) { 21885dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 21895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " ADD " + RawContacts.DISPLAY_NAME_ALTERNATIVE + " TEXT;"); 21905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 21915dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " ADD " + RawContacts.PHONETIC_NAME + " TEXT;"); 21925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 21935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " ADD " + RawContacts.PHONETIC_NAME_STYLE + " INTEGER;"); 21945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 2195de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa + " ADD " + RawContacts.SORT_KEY_PRIMARY 2196de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa + " TEXT COLLATE " + ContactsProvider2.PHONEBOOK_COLLATOR_NAME + ";"); 21975dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 2198de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa + " ADD " + RawContacts.SORT_KEY_ALTERNATIVE 2199de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa + " TEXT COLLATE " + ContactsProvider2.PHONEBOOK_COLLATOR_NAME + ";"); 22005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22015dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov final Locale locale = Locale.getDefault(); 22025dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 220351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov NameSplitter splitter = createNameSplitter(); 22045dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement rawContactUpdate = db.compileStatement( 22065dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov "UPDATE " + Tables.RAW_CONTACTS + 22075dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " SET " + 22085dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_PRIMARY + "=?," + 22095dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_ALTERNATIVE + "=?," + 22105dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.PHONETIC_NAME + "=?," + 22115dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.PHONETIC_NAME_STYLE + "=?," + 22125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.SORT_KEY_PRIMARY + "=?," + 22135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.SORT_KEY_ALTERNATIVE + "=?" + 22145dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?"); 22155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeStructuredNamesToVersion205(db, rawContactUpdate, splitter); 22175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeOrganizationsToVersion205(db, rawContactUpdate, splitter); 22185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("DROP INDEX raw_contact_sort_key1_index"); 22205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contact_sort_key1_index ON " + Tables.RAW_CONTACTS + " (" + 22214394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "contact_in_visible_group" + "," + 22225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.SORT_KEY_PRIMARY + 22235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ");"); 22245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contact_sort_key2_index ON " + Tables.RAW_CONTACTS + " (" + 22264394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "contact_in_visible_group" + "," + 22275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.SORT_KEY_ALTERNATIVE + 22285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ");"); 22295dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 22305dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private interface StructName205Query { 22325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String TABLE = Tables.DATA_JOIN_RAW_CONTACTS; 22335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String COLUMNS[] = { 22355dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov DataColumns.CONCRETE_ID, 22365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Data.RAW_CONTACT_ID, 22375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_SOURCE, 22385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_PRIMARY, 22395dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.PREFIX, 22405dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.GIVEN_NAME, 22415dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.MIDDLE_NAME, 22425dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.FAMILY_NAME, 22435dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.SUFFIX, 22445dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.PHONETIC_FAMILY_NAME, 22455dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.PHONETIC_MIDDLE_NAME, 22465dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.PHONETIC_GIVEN_NAME, 22475dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov }; 22485dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int ID = 0; 22505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int RAW_CONTACT_ID = 1; 22515dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int DISPLAY_NAME_SOURCE = 2; 22525dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int DISPLAY_NAME = 3; 22535dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int PREFIX = 4; 22545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int GIVEN_NAME = 5; 22555dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int MIDDLE_NAME = 6; 22565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int FAMILY_NAME = 7; 22575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int SUFFIX = 8; 22585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int PHONETIC_FAMILY_NAME = 9; 22595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int PHONETIC_MIDDLE_NAME = 10; 22605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int PHONETIC_GIVEN_NAME = 11; 22615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 22625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22635dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeStructuredNamesToVersion205(SQLiteDatabase db, 22645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement rawContactUpdate, NameSplitter splitter) { 22655dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // Process structured names to detect the style of the full name and phonetic name 22675dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22685dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long mMimeType; 22695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov try { 22705dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov mMimeType = DatabaseUtils.longForQuery(db, 22715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov "SELECT " + MimetypesColumns._ID + 22725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " FROM " + Tables.MIMETYPES + 22735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " WHERE " + MimetypesColumns.MIMETYPE 22745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "='" + StructuredName.CONTENT_ITEM_TYPE + "'", null); 22755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } catch (SQLiteDoneException e) { 22765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // No structured names in the database 22775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov return; 22785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 22795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement structuredNameUpdate = db.compileStatement( 22815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov "UPDATE " + Tables.DATA + 22825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " SET " + 22835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.FULL_NAME_STYLE + "=?," + 22845dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.DISPLAY_NAME + "=?," + 22855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.PHONETIC_NAME_STYLE + "=?" + 22865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " WHERE " + Data._ID + "=?"); 22875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 22885dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov NameSplitter.Name name = new NameSplitter.Name(); 22895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StringBuilder sb = new StringBuilder(); 22905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Cursor cursor = db.query(StructName205Query.TABLE, 22915dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructName205Query.COLUMNS, 22925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=" + mMimeType, null, null, null, null); 22935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov try { 22945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov while (cursor.moveToNext()) { 22955dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long dataId = cursor.getLong(StructName205Query.ID); 22965dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = cursor.getLong(StructName205Query.RAW_CONTACT_ID); 22975dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int displayNameSource = cursor.getInt(StructName205Query.DISPLAY_NAME_SOURCE); 22985dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String displayName = cursor.getString(StructName205Query.DISPLAY_NAME); 22995dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.clear(); 23015dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.prefix = cursor.getString(StructName205Query.PREFIX); 23025dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.givenNames = cursor.getString(StructName205Query.GIVEN_NAME); 23035dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.middleName = cursor.getString(StructName205Query.MIDDLE_NAME); 23045dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.familyName = cursor.getString(StructName205Query.FAMILY_NAME); 23055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.suffix = cursor.getString(StructName205Query.SUFFIX); 23065dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.phoneticFamilyName = cursor.getString(StructName205Query.PHONETIC_FAMILY_NAME); 23075dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.phoneticMiddleName = cursor.getString(StructName205Query.PHONETIC_MIDDLE_NAME); 23085dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.phoneticGivenName = cursor.getString(StructName205Query.PHONETIC_GIVEN_NAME); 23095dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23105dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeNameToVersion205(dataId, rawContactId, displayNameSource, displayName, name, 23115dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov structuredNameUpdate, rawContactUpdate, splitter, sb); 23125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } finally { 23145dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov cursor.close(); 23155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeNameToVersion205(long dataId, long rawContactId, int displayNameSource, 23195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String currentDisplayName, NameSplitter.Name name, 23205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement structuredNameUpdate, SQLiteStatement rawContactUpdate, 23215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov NameSplitter splitter, StringBuilder sb) { 23225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov splitter.guessNameStyle(name); 2324ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao int unadjustedFullNameStyle = name.fullNameStyle; 23255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.fullNameStyle = splitter.getAdjustedFullNameStyle(name.fullNameStyle); 232655e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov String displayName = splitter.join(name, true, true); 23275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 2328ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao // Don't update database with the adjusted fullNameStyle as it is locale 2329ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao // related 2330ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao structuredNameUpdate.bindLong(1, unadjustedFullNameStyle); 23315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(structuredNameUpdate, 2, displayName); 23325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov structuredNameUpdate.bindLong(3, name.phoneticNameStyle); 23335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov structuredNameUpdate.bindLong(4, dataId); 23345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov structuredNameUpdate.execute(); 23355dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (displayNameSource == DisplayNameSources.STRUCTURED_NAME) { 233755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov String displayNameAlternative = splitter.join(name, false, false); 23385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String phoneticName = splitter.joinPhoneticName(name); 23395dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String sortKey = null; 23405dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String sortKeyAlternative = null; 23415dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23425dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (phoneticName != null) { 23435dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov sortKey = sortKeyAlternative = phoneticName; 2344ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao } else if (name.fullNameStyle == FullNameStyle.CHINESE || 2345ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao name.fullNameStyle == FullNameStyle.CJK) { 2346ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao sortKey = sortKeyAlternative = ContactLocaleUtils.getIntance() 2347ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao .getSortKey(displayName, name.fullNameStyle); 23485dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (sortKey == null) { 23515dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov sortKey = displayName; 23525dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov sortKeyAlternative = displayNameAlternative; 23535dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23555dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov updateRawContact205(rawContactUpdate, rawContactId, displayName, 23565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov displayNameAlternative, name.phoneticNameStyle, phoneticName, sortKey, 23575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov sortKeyAlternative); 23585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private interface Organization205Query { 23625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String TABLE = Tables.DATA_JOIN_RAW_CONTACTS; 23635dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String COLUMNS[] = { 23655dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov DataColumns.CONCRETE_ID, 23665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Data.RAW_CONTACT_ID, 23675dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Organization.COMPANY, 23685dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Organization.PHONETIC_NAME, 23695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov }; 23705dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int ID = 0; 23725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int RAW_CONTACT_ID = 1; 23735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int COMPANY = 2; 23745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int PHONETIC_NAME = 3; 23755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 23765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeOrganizationsToVersion205(SQLiteDatabase db, 23785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement rawContactUpdate, NameSplitter splitter) { 2379b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov final long mimeType = lookupMimeTypeId(db, Organization.CONTENT_ITEM_TYPE); 23805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement organizationUpdate = db.compileStatement( 23825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov "UPDATE " + Tables.DATA + 23835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " SET " + 23845dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Organization.PHONETIC_NAME_STYLE + "=?" + 23855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " WHERE " + Data._ID + "=?"); 23865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Cursor cursor = db.query(Organization205Query.TABLE, Organization205Query.COLUMNS, 2388b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=" + mimeType + " AND " 23895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.DISPLAY_NAME_SOURCE + "=" + DisplayNameSources.ORGANIZATION, 23905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov null, null, null, null); 23915dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov try { 23925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov while (cursor.moveToNext()) { 23935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long dataId = cursor.getLong(Organization205Query.ID); 23945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = cursor.getLong(Organization205Query.RAW_CONTACT_ID); 23955dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String company = cursor.getString(Organization205Query.COMPANY); 23965dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String phoneticName = cursor.getString(Organization205Query.PHONETIC_NAME); 23975dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23985dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int phoneticNameStyle = splitter.guessPhoneticNameStyle(phoneticName); 23995dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov organizationUpdate.bindLong(1, phoneticNameStyle); 24015dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov organizationUpdate.bindLong(2, dataId); 24025dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov organizationUpdate.execute(); 24035dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24045dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String sortKey = null; 24055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (phoneticName == null && company != null) { 24065dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int nameStyle = splitter.guessFullNameStyle(company); 24075dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov nameStyle = splitter.getAdjustedFullNameStyle(nameStyle); 2408ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao if (nameStyle == FullNameStyle.CHINESE || 2409ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao nameStyle == FullNameStyle.CJK ) { 2410ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao sortKey = ContactLocaleUtils.getIntance() 2411ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao .getSortKey(company, nameStyle); 24125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 24135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 24145dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (sortKey == null) { 24165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov sortKey = company; 24175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 24185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov updateRawContact205(rawContactUpdate, rawContactId, company, 24205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov company, phoneticNameStyle, phoneticName, sortKey, sortKey); 24215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 24225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } finally { 24235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov cursor.close(); 24245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 24255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 24265dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void updateRawContact205(SQLiteStatement rawContactUpdate, long rawContactId, 24285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String displayName, String displayNameAlternative, int phoneticNameStyle, 24295dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String phoneticName, String sortKeyPrimary, String sortKeyAlternative) { 24305dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov bindString(rawContactUpdate, 1, displayName); 24315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov bindString(rawContactUpdate, 2, displayNameAlternative); 24325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov bindString(rawContactUpdate, 3, phoneticName); 24335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov rawContactUpdate.bindLong(4, phoneticNameStyle); 24345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov bindString(rawContactUpdate, 5, sortKeyPrimary); 24355dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov bindString(rawContactUpdate, 6, sortKeyAlternative); 24365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov rawContactUpdate.bindLong(7, rawContactId); 24375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov rawContactUpdate.execute(); 24385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 24395dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 2440f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov private void upgrateToVersion206(SQLiteDatabase db) { 2441f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 2442f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov + " ADD " + RawContacts.NAME_VERIFIED + " INTEGER NOT NULL DEFAULT 0;"); 2443f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov } 2444f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 244531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov /** 244631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov * Fix for the bug where name lookup records for organizations would get removed by 244731168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov * unrelated updates of the data rows. 244831168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov */ 2449b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov private void upgradeToVersion300(SQLiteDatabase db) { 2450197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov // No longer needed 245131168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov } 245231168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 2453b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov private static final class Upgrade303Query { 2454b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final String TABLE = Tables.DATA; 2455b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2456b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final String SELECTION = 2457b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=?" + 2458b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov " AND " + Data._ID + " NOT IN " + 2459b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov "(SELECT " + NameLookupColumns.DATA_ID + " FROM " + Tables.NAME_LOOKUP + ")" + 2460b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov " AND " + Data.DATA1 + " NOT NULL"; 2461b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2462b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final String COLUMNS[] = { 2463b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Data._ID, 2464b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Data.RAW_CONTACT_ID, 2465b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Data.DATA1, 2466b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov }; 2467b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2468b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final int ID = 0; 2469b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final int RAW_CONTACT_ID = 1; 2470b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final int DATA1 = 2; 2471b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2472b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2473b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov /** 2474b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov * The {@link ContactsProvider2#update} method was deleting name lookup for new 2475b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov * emails during the sync. We need to restore the lost name lookup rows. 2476b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov */ 2477b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov private void upgradeEmailToVersion303(SQLiteDatabase db) { 2478b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, Email.CONTENT_ITEM_TYPE); 2479b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (mimeTypeId == -1) { 2480b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return; 2481b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2482b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2483b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov ContentValues values = new ContentValues(); 2484b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2485b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov // Find all data rows with the mime type "email" that are missing name lookup 2486b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Cursor cursor = db.query(Upgrade303Query.TABLE, Upgrade303Query.COLUMNS, 2487b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Upgrade303Query.SELECTION, new String[] {String.valueOf(mimeTypeId)}, 2488b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov null, null, null); 2489b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov try { 2490b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov while (cursor.moveToNext()) { 2491b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov long dataId = cursor.getLong(Upgrade303Query.ID); 2492b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov long rawContactId = cursor.getLong(Upgrade303Query.RAW_CONTACT_ID); 2493b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov String value = cursor.getString(Upgrade303Query.DATA1); 2494b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov value = extractHandleFromEmailAddress(value); 2495b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2496b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (value != null) { 2497b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.DATA_ID, dataId); 2498b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.RAW_CONTACT_ID, rawContactId); 2499b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.NAME_TYPE, NameLookupType.EMAIL_BASED_NICKNAME); 2500b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.NORMALIZED_NAME, NameNormalizer.normalize(value)); 2501b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov db.insert(Tables.NAME_LOOKUP, null, values); 2502b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2503b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2504b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } finally { 2505b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov cursor.close(); 2506b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2507b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2508b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2509b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov /** 2510b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov * The {@link ContactsProvider2#update} method was deleting name lookup for new 2511b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov * nicknames during the sync. We need to restore the lost name lookup rows. 2512b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov */ 2513b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov private void upgradeNicknameToVersion303(SQLiteDatabase db) { 2514b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, Nickname.CONTENT_ITEM_TYPE); 2515b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (mimeTypeId == -1) { 2516b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return; 2517b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2518b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2519b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov ContentValues values = new ContentValues(); 2520b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2521b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov // Find all data rows with the mime type "nickname" that are missing name lookup 2522b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Cursor cursor = db.query(Upgrade303Query.TABLE, Upgrade303Query.COLUMNS, 2523b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Upgrade303Query.SELECTION, new String[] {String.valueOf(mimeTypeId)}, 2524b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov null, null, null); 2525b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov try { 2526b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov while (cursor.moveToNext()) { 2527b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov long dataId = cursor.getLong(Upgrade303Query.ID); 2528b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov long rawContactId = cursor.getLong(Upgrade303Query.RAW_CONTACT_ID); 2529b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov String value = cursor.getString(Upgrade303Query.DATA1); 2530b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2531b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.DATA_ID, dataId); 2532b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.RAW_CONTACT_ID, rawContactId); 2533b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.NAME_TYPE, NameLookupType.NICKNAME); 2534b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.NORMALIZED_NAME, NameNormalizer.normalize(value)); 2535b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov db.insert(Tables.NAME_LOOKUP, null, values); 2536b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2537b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } finally { 2538b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov cursor.close(); 2539b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2540b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2541b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 254251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov private void upgradeToVersion304(SQLiteDatabase db) { 254351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov // Mimetype table requires an index on mime type 254451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS mime_type ON " + Tables.MIMETYPES + " (" + 254551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov MimetypesColumns.MIMETYPE + 254651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov ");"); 254751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 254851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 254960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann private void upgradeToVersion306(SQLiteDatabase db) { 255060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann // Fix invalid lookup that was used for Exchange contacts (it was not escaped) 255160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann // It happened when a new contact was created AND synchronized 255260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann final StringBuilder lookupKeyBuilder = new StringBuilder(); 255360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann final SQLiteStatement updateStatement = db.compileStatement( 255460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "UPDATE contacts " + 255560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "SET lookup=? " + 255660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "WHERE _id=?"); 255760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann final Cursor contactIdCursor = db.rawQuery( 255860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "SELECT DISTINCT contact_id " + 255960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "FROM raw_contacts " + 256060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "WHERE deleted=0 AND account_type='com.android.exchange'", 256160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann null); 256260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann try { 256360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann while (contactIdCursor.moveToNext()) { 256460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann final long contactId = contactIdCursor.getLong(0); 256560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann lookupKeyBuilder.setLength(0); 256660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann final Cursor c = db.rawQuery( 256760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "SELECT account_type, account_name, _id, sourceid, display_name " + 256860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "FROM raw_contacts " + 256960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "WHERE contact_id=? " + 257060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "ORDER BY _id", 257160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann new String[] { String.valueOf(contactId) }); 257260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann try { 257360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann while (c.moveToNext()) { 257460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann ContactLookupKey.appendToLookupKey(lookupKeyBuilder, 257560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.getString(0), 257660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.getString(1), 257760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.getLong(2), 257860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.getString(3), 257960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.getString(4)); 258060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 258160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } finally { 258260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.close(); 258360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 258460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 258560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann if (lookupKeyBuilder.length() == 0) { 258660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann updateStatement.bindNull(1); 258760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } else { 258860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann updateStatement.bindString(1, Uri.encode(lookupKeyBuilder.toString())); 258960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 259060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann updateStatement.bindLong(2, contactId); 259160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 259260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann updateStatement.execute(); 259360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 259460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } finally { 259560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann updateStatement.close(); 259660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann contactIdCursor.close(); 259760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 259860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 259960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 2600b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov private void upgradeToVersion307(SQLiteDatabase db) { 2601b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov db.execSQL("CREATE TABLE properties (" + 2602b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov "property_key TEXT PRIMARY_KEY, " + 2603b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov "property_value TEXT" + 2604b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov ");"); 2605b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 2606b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 2607743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov private void upgradeToVersion308(SQLiteDatabase db) { 26084394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("CREATE TABLE accounts (" + 26094394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "account_name TEXT, " + 26104394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "account_type TEXT " + 26114394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov ");"); 2612743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 26134394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("INSERT INTO accounts " + 26144394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "SELECT DISTINCT account_name, account_type FROM raw_contacts"); 2615743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov } 2616743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 2617f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov private void upgradeToVersion400(SQLiteDatabase db) { 2618dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana db.execSQL("ALTER TABLE " + Tables.GROUPS 2619dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana + " ADD " + Groups.FAVORITES + " INTEGER NOT NULL DEFAULT 0;"); 2620dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana db.execSQL("ALTER TABLE " + Tables.GROUPS 2621dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana + " ADD " + Groups.AUTO_ADD + " INTEGER NOT NULL DEFAULT 0;"); 2622dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 2623dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 26247da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov private void upgradeToVersion353(SQLiteDatabase db) { 26257da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov db.execSQL("DELETE FROM contacts " + 26267da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov "WHERE NOT EXISTS (SELECT 1 FROM raw_contacts WHERE contact_id=contacts._id)"); 26277da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov } 26287da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov 262951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov private void rebuildNameLookup(SQLiteDatabase db) { 263051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("DROP INDEX IF EXISTS name_lookup_index"); 263151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov insertNameLookup(db); 263251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov createContactsIndexes(db); 263351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 263451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 263504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov /** 263651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov * Regenerates all locale-sensitive data: nickname_lookup, name_lookup and sort keys. 263704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov */ 263851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov public void setLocale(ContactsProvider2 provider, Locale locale) { 263951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov Log.i(TAG, "Switching to locale " + locale); 264004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 2641c085b3eeebf13ebdfb197444747354a1d6eced2bJeff Hamilton long start = SystemClock.uptimeMillis(); 264251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov SQLiteDatabase db = getWritableDatabase(); 264351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.setLocale(locale); 264451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.beginTransaction(); 264551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov try { 264651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("DROP INDEX raw_contact_sort_key1_index"); 264751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("DROP INDEX raw_contact_sort_key2_index"); 264851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("DROP INDEX IF EXISTS name_lookup_index"); 264951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 265051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov loadNicknameLookupTable(db); 265151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov insertNameLookup(db); 265251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov rebuildSortKeys(db, provider); 265351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov createContactsIndexes(db); 265451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.setTransactionSuccessful(); 265551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } finally { 265651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.endTransaction(); 265751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 265851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 2659c085b3eeebf13ebdfb197444747354a1d6eced2bJeff Hamilton Log.i(TAG, "Locale change completed in " + (SystemClock.uptimeMillis() - start) + "ms"); 266051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 266151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 266251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov /** 266351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov * Regenerates sort keys for all contacts. 266451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov */ 266551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov private void rebuildSortKeys(SQLiteDatabase db, ContactsProvider2 provider) { 266651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov Cursor cursor = db.query(Tables.RAW_CONTACTS, new String[]{RawContacts._ID}, 266751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov null, null, null, null, null); 266851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov try { 266951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov while (cursor.moveToNext()) { 267051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov long rawContactId = cursor.getLong(0); 26718ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov updateRawContactDisplayName(db, rawContactId); 267251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 267351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } finally { 267451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov cursor.close(); 267551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 267651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 267751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 267851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov private void insertNameLookup(SQLiteDatabase db) { 267904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.NAME_LOOKUP); 268004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 268104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov SQLiteStatement nameLookupInsert = db.compileStatement( 268204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov "INSERT OR IGNORE INTO " + Tables.NAME_LOOKUP + "(" 268304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov + NameLookupColumns.RAW_CONTACT_ID + "," 268404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov + NameLookupColumns.DATA_ID + "," 268504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov + NameLookupColumns.NAME_TYPE + "," 268604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov + NameLookupColumns.NORMALIZED_NAME + 268704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov ") VALUES (?,?,?,?)"); 268804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 268951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov try { 269051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov insertStructuredNameLookup(db, nameLookupInsert); 269151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov insertEmailLookup(db, nameLookupInsert); 269251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov insertNicknameLookup(db, nameLookupInsert); 269351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } finally { 269451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov nameLookupInsert.close(); 269551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 269604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 269704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 269804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private static final class StructuredNameQuery { 269904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String TABLE = Tables.DATA; 270004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 270104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String SELECTION = 270204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=? AND " + Data.DATA1 + " NOT NULL"; 270304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 270404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String COLUMNS[] = { 270504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov StructuredName._ID, 270604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov StructuredName.RAW_CONTACT_ID, 270704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov StructuredName.DISPLAY_NAME, 270804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov }; 270904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 271004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int ID = 0; 271104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int RAW_CONTACT_ID = 1; 271204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int DISPLAY_NAME = 2; 271304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 271404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 271504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private class StructuredNameLookupBuilder extends NameLookupBuilder { 271604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 271704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private final SQLiteStatement mNameLookupInsert; 271804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private final CommonNicknameCache mCommonNicknameCache; 271904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 272004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public StructuredNameLookupBuilder(NameSplitter splitter, 272104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov CommonNicknameCache commonNicknameCache, SQLiteStatement nameLookupInsert) { 272204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov super(splitter); 272304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov this.mCommonNicknameCache = commonNicknameCache; 272404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov this.mNameLookupInsert = nameLookupInsert; 272504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 272604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 272704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov @Override 272804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov protected void insertNameLookup(long rawContactId, long dataId, int lookupType, 272904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov String name) { 273004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov if (!TextUtils.isEmpty(name)) { 273104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov ContactsDatabaseHelper.this.insertNormalizedNameLookup(mNameLookupInsert, 273204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov rawContactId, dataId, lookupType, name); 273304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 273404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 273504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 273604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov @Override 273704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov protected String[] getCommonNicknameClusters(String normalizedName) { 273804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov return mCommonNicknameCache.getCommonNicknameClusters(normalizedName); 273904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 274004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 274104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 274204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov /** 274304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov * Inserts name lookup rows for all structured names in the database. 274404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov */ 274504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private void insertStructuredNameLookup(SQLiteDatabase db, SQLiteStatement nameLookupInsert) { 2746d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov NameSplitter nameSplitter = createNameSplitter(); 2747d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov NameLookupBuilder nameLookupBuilder = new StructuredNameLookupBuilder(nameSplitter, 274804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov new CommonNicknameCache(db), nameLookupInsert); 274904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, StructuredName.CONTENT_ITEM_TYPE); 275004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Cursor cursor = db.query(StructuredNameQuery.TABLE, StructuredNameQuery.COLUMNS, 275104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov StructuredNameQuery.SELECTION, new String[] {String.valueOf(mimeTypeId)}, 275204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov null, null, null); 275304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov try { 275404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov while (cursor.moveToNext()) { 275504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long dataId = cursor.getLong(StructuredNameQuery.ID); 275604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long rawContactId = cursor.getLong(StructuredNameQuery.RAW_CONTACT_ID); 275704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov String name = cursor.getString(StructuredNameQuery.DISPLAY_NAME); 2758d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov int fullNameStyle = nameSplitter.guessFullNameStyle(name); 275951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov fullNameStyle = nameSplitter.getAdjustedFullNameStyle(fullNameStyle); 2760d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov nameLookupBuilder.insertNameLookup(rawContactId, dataId, name, fullNameStyle); 276104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 276204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } finally { 276304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov cursor.close(); 276404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 276504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 276604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 276704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private static final class OrganizationQuery { 276804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String TABLE = Tables.DATA; 276904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 277004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String SELECTION = 277104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=? AND " + Data.DATA1 + " NOT NULL"; 277204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 277304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String COLUMNS[] = { 277404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Organization._ID, 277504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Organization.RAW_CONTACT_ID, 277604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Organization.COMPANY, 277704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Organization.TITLE, 277804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov }; 277904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 278004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int ID = 0; 278104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int RAW_CONTACT_ID = 1; 278204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int COMPANY = 2; 278304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int TITLE = 3; 278404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 278504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 278604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private static final class EmailQuery { 278704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String TABLE = Tables.DATA; 278804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 278904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String SELECTION = 279004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=? AND " + Data.DATA1 + " NOT NULL"; 279104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 279204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String COLUMNS[] = { 279304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Email._ID, 279404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Email.RAW_CONTACT_ID, 279504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Email.ADDRESS, 279604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov }; 279704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 279804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int ID = 0; 279904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int RAW_CONTACT_ID = 1; 280004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int ADDRESS = 2; 280104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 280204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 280304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov /** 280404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov * Inserts name lookup rows for all email addresses in the database. 280504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov */ 280604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private void insertEmailLookup(SQLiteDatabase db, SQLiteStatement nameLookupInsert) { 280704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, Email.CONTENT_ITEM_TYPE); 280804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Cursor cursor = db.query(EmailQuery.TABLE, EmailQuery.COLUMNS, 280904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov EmailQuery.SELECTION, new String[] {String.valueOf(mimeTypeId)}, 281004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov null, null, null); 281104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov try { 281204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov while (cursor.moveToNext()) { 281304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long dataId = cursor.getLong(EmailQuery.ID); 281404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long rawContactId = cursor.getLong(EmailQuery.RAW_CONTACT_ID); 281504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov String address = cursor.getString(EmailQuery.ADDRESS); 281604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov address = extractHandleFromEmailAddress(address); 281704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov insertNameLookup(nameLookupInsert, rawContactId, dataId, 281804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov NameLookupType.EMAIL_BASED_NICKNAME, address); 281904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 282004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } finally { 282104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov cursor.close(); 282204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 282304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 282404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 282504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private static final class NicknameQuery { 282604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String TABLE = Tables.DATA; 282704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 282804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String SELECTION = 282904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=? AND " + Data.DATA1 + " NOT NULL"; 283004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 283104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String COLUMNS[] = { 283204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Nickname._ID, 283304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Nickname.RAW_CONTACT_ID, 283404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Nickname.NAME, 283504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov }; 283604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 283704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int ID = 0; 283804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int RAW_CONTACT_ID = 1; 283904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int NAME = 2; 284004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 284104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 284204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov /** 284304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov * Inserts name lookup rows for all nicknames in the database. 284404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov */ 284504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private void insertNicknameLookup(SQLiteDatabase db, SQLiteStatement nameLookupInsert) { 284604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, Nickname.CONTENT_ITEM_TYPE); 284704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Cursor cursor = db.query(NicknameQuery.TABLE, NicknameQuery.COLUMNS, 284804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov NicknameQuery.SELECTION, new String[] {String.valueOf(mimeTypeId)}, 284904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov null, null, null); 285004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov try { 285104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov while (cursor.moveToNext()) { 285204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long dataId = cursor.getLong(NicknameQuery.ID); 285304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long rawContactId = cursor.getLong(NicknameQuery.RAW_CONTACT_ID); 285404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov String nickname = cursor.getString(NicknameQuery.NAME); 285504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov insertNameLookup(nameLookupInsert, rawContactId, dataId, 285604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov NameLookupType.NICKNAME, nickname); 285704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 285804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } finally { 285904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov cursor.close(); 286004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 286104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 286204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 286304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov /** 286404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov * Inserts a record in the {@link Tables#NAME_LOOKUP} table. 286504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov */ 286604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public void insertNameLookup(SQLiteStatement stmt, long rawContactId, long dataId, 286704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov int lookupType, String name) { 286804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov if (TextUtils.isEmpty(name)) { 286904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov return; 287004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 287104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 287204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov String normalized = NameNormalizer.normalize(name); 287304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov if (TextUtils.isEmpty(normalized)) { 287404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov return; 287504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 287604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 287704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov insertNormalizedNameLookup(stmt, rawContactId, dataId, lookupType, normalized); 287804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 287904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 288004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private void insertNormalizedNameLookup(SQLiteStatement stmt, long rawContactId, long dataId, 288104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov int lookupType, String normalizedName) { 288204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov stmt.bindLong(1, rawContactId); 288304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov stmt.bindLong(2, dataId); 288404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov stmt.bindLong(3, lookupType); 288504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov stmt.bindString(4, normalizedName); 288604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov stmt.executeInsert(); 288704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 288804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 28894394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov /** 28904394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov * Changing the VISIBLE bit from a field on both RawContacts and Contacts to a separate table. 28914394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov */ 28924394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov private void upgradeToVersion401(SQLiteDatabase db) { 28934394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.VISIBLE_CONTACTS + " (" + 28944394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov Contacts._ID + " INTEGER PRIMARY KEY" + 28954394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov ");"); 28964394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("INSERT INTO " + Tables.VISIBLE_CONTACTS + 28974394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " SELECT " + Contacts._ID + 28984394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " FROM " + Tables.CONTACTS + 28994394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " WHERE " + Contacts.IN_VISIBLE_GROUP + "!=0"); 29004394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("DROP INDEX contacts_visible_index"); 29014394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov } 29024394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 2903d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov /** 2904d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Introducing a new table: directories. 2905d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov */ 2906d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov private void upgradeToVersion402(SQLiteDatabase db) { 2907d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov createDirectoriesTable(db); 2908d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 2909d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 291097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov private void upgradeToVersion403(SQLiteDatabase db) { 291197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS directories;"); 291297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov createDirectoriesTable(db); 291397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 291497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov db.execSQL("ALTER TABLE raw_contacts" 291597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov + " ADD raw_contact_is_read_only INTEGER NOT NULL DEFAULT 0;"); 291697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 291797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov db.execSQL("ALTER TABLE data" 291897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov + " ADD is_read_only INTEGER NOT NULL DEFAULT 0;"); 291997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 292097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 2921892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov private void upgradeToVersion405(SQLiteDatabase db) { 2922892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS phone_lookup;"); 2923892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // Private phone numbers table used for lookup 2924892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.PHONE_LOOKUP + " (" + 2925892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.DATA_ID 2926892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + " INTEGER REFERENCES data(_id) NOT NULL," + 2927892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID 2928892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + " INTEGER REFERENCES raw_contacts(_id) NOT NULL," + 2929892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.NORMALIZED_NUMBER + " TEXT NOT NULL," + 2930892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.MIN_MATCH + " TEXT NOT NULL" + 2931892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov ");"); 2932892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 2933892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_index ON " + Tables.PHONE_LOOKUP + " (" + 2934892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.NORMALIZED_NUMBER + "," + 2935892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID + "," + 2936892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.DATA_ID + 2937892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov ");"); 2938892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 2939892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_min_match_index ON " + Tables.PHONE_LOOKUP + " (" + 2940892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.MIN_MATCH + "," + 2941892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID + "," + 2942892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.DATA_ID + 2943892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov ");"); 2944892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 2945892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, Phone.CONTENT_ITEM_TYPE); 2946892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (mimeTypeId == -1) { 2947892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov return; 2948892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 2949892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 2950892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov Cursor cursor = db.rawQuery( 2951892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov "SELECT _id, " + Phone.RAW_CONTACT_ID + ", " + Phone.NUMBER + 2952892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov " FROM " + Tables.DATA + 2953892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov " WHERE " + DataColumns.MIMETYPE_ID + "=" + mimeTypeId 2954892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + " AND " + Phone.NUMBER + " NOT NULL", null); 2955892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 2956892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov ContentValues phoneValues = new ContentValues(); 2957892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov try { 2958892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov while (cursor.moveToNext()) { 2959892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov long dataID = cursor.getLong(0); 2960892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov long rawContactID = cursor.getLong(1); 2961892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov String number = cursor.getString(2); 2962892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov String normalizedNumber = PhoneNumberUtils.normalizeNumber(number); 2963892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (!TextUtils.isEmpty(normalizedNumber)) { 2964892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov phoneValues.clear(); 2965892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov phoneValues.put(PhoneLookupColumns.RAW_CONTACT_ID, rawContactID); 2966892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov phoneValues.put(PhoneLookupColumns.DATA_ID, dataID); 2967892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov phoneValues.put(PhoneLookupColumns.NORMALIZED_NUMBER, normalizedNumber); 2968892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov phoneValues.put(PhoneLookupColumns.MIN_MATCH, 2969892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneNumberUtils.toCallerIDMinMatch(normalizedNumber)); 2970892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov db.insert(Tables.PHONE_LOOKUP, null, phoneValues); 2971892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 2972892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 2973892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } finally { 2974892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov cursor.close(); 2975892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 2976892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 2977892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 29782530512f639c4979fd7371c7dd25dd67e8118124Bai Tao private void upgradeToVersion406(SQLiteDatabase db) { 29792530512f639c4979fd7371c7dd25dd67e8118124Bai Tao db.execSQL("ALTER TABLE calls ADD countryiso TEXT;"); 29802530512f639c4979fd7371c7dd25dd67e8118124Bai Tao } 29812530512f639c4979fd7371c7dd25dd67e8118124Bai Tao 2982d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov private void upgradeToVersion409(SQLiteDatabase db) { 2983d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS directories;"); 2984d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov createDirectoriesTable(db); 2985d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov } 2986d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov 2987385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov /** 2988d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov * Adding DEFAULT_DIRECTORY table. 2989385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov */ 2990d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov private void upgradeToVersion411(SQLiteDatabase db) { 2991d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS " + Tables.DEFAULT_DIRECTORY); 2992385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.DEFAULT_DIRECTORY + " (" + 2993385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov Contacts._ID + " INTEGER PRIMARY KEY" + 2994385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ");"); 2995385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 2996385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov // Process contacts without an account 2997385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov db.execSQL("INSERT OR IGNORE INTO " + Tables.DEFAULT_DIRECTORY + 2998385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " SELECT " + RawContacts.CONTACT_ID + 2999385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 3000385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + RawContactsColumns.CONCRETE_ACCOUNT_NAME + " IS NULL " + 3001385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " IS NULL "); 3002385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 3003385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov // Process accounts that don't have a default group (e.g. Exchange) 3004385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov db.execSQL("INSERT OR IGNORE INTO " + Tables.DEFAULT_DIRECTORY + 3005385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " SELECT " + RawContacts.CONTACT_ID + 3006385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 3007385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE NOT EXISTS" + 3008385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " (SELECT " + Groups._ID + 3009385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.GROUPS + 3010385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + RawContactsColumns.CONCRETE_ACCOUNT_NAME + " = " 3011385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + GroupsColumns.CONCRETE_ACCOUNT_NAME + 3012385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " = " 3013385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + GroupsColumns.CONCRETE_ACCOUNT_TYPE + 3014385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + Groups.AUTO_ADD + " != 0" + 3015385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ")"); 3016385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 3017385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov long mimetype = lookupMimeTypeId(db, GroupMembership.CONTENT_ITEM_TYPE); 3018385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 3019d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov // Process accounts that do have a default group (e.g. Google) 3020385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov db.execSQL("INSERT OR IGNORE INTO " + Tables.DEFAULT_DIRECTORY + 3021385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " SELECT " + RawContacts.CONTACT_ID + 3022385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 3023385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " JOIN " + Tables.DATA + 3024385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " ON (" + RawContactsColumns.CONCRETE_ID + "=" + Data.RAW_CONTACT_ID + ")" + 3025385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + DataColumns.MIMETYPE_ID + "=" + mimetype + 3026d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov " AND EXISTS" + 3027d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov " (SELECT " + Groups._ID + 3028d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov " FROM " + Tables.GROUPS + 3029d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov " WHERE " + RawContactsColumns.CONCRETE_ACCOUNT_NAME + " = " 3030d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov + GroupsColumns.CONCRETE_ACCOUNT_NAME + 3031d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " = " 3032d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov + GroupsColumns.CONCRETE_ACCOUNT_TYPE + 3033d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov " AND " + Groups.AUTO_ADD + " != 0" + 3034d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov ")"); 30353d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov } 3036385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 3037e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov private void upgradeToVersion413(SQLiteDatabase db) { 30383ea7932a47027c8629d3a301e1a16e7d2c8a298dDmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS directories;"); 30393ea7932a47027c8629d3a301e1a16e7d2c8a298dDmitri Plotnikov createDirectoriesTable(db); 3040e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov } 3041e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov 3042c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov private void upgradeToVersion415(SQLiteDatabase db) { 3043c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov db.execSQL( 3044c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov "ALTER TABLE " + Tables.GROUPS + 3045c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov " ADD " + Groups.GROUP_IS_READ_ONLY + " INTEGER NOT NULL DEFAULT 0"); 3046c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov db.execSQL( 3047c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov "UPDATE " + Tables.GROUPS + 3048c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov " SET " + Groups.GROUP_IS_READ_ONLY + "=1" + 3049c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov " WHERE " + Groups.SYSTEM_ID + " NOT NULL"); 3050c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov } 3051c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov 3052d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov private void upgradeToVersion416(SQLiteDatabase db) { 3053d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_data_id_min_match_index ON " + Tables.PHONE_LOOKUP + 3054d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov " (" + PhoneLookupColumns.DATA_ID + ", " + PhoneLookupColumns.MIN_MATCH + ");"); 3055d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov } 3056d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov 3057197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov private void upgradeToVersion501(SQLiteDatabase db) { 3058197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov // Remove organization rows from the name lookup, we now use search index for that 3059197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov db.execSQL("DELETE FROM name_lookup WHERE name_type=5"); 3060f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 3061f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 306292ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov private void upgradeToVersion502(SQLiteDatabase db) { 306392ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov // Remove Chinese and Korean name lookup - this data is now in the search index 306492ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov db.execSQL("DELETE FROM name_lookup WHERE name_type IN (6, 7)"); 306592ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov } 306692ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov 306755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov private void upgradeToVersion504(SQLiteDatabase db) { 306855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov populateMimeTypeCache(db); 306955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 307055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov // Find all names with prefixes and recreate display name 307155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov Cursor cursor = db.rawQuery( 307255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov "SELECT " + StructuredName.RAW_CONTACT_ID + 307355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov " FROM " + Tables.DATA + 307455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov " WHERE " + DataColumns.MIMETYPE_ID + "=?" 307555e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov + " AND " + StructuredName.PREFIX + " NOT NULL", 307655e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov new String[]{ String.valueOf(mMimeTypeIdStructuredName) }); 307755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 307855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov try { 307955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov while(cursor.moveToNext()) { 308055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov long rawContactId = cursor.getLong(0); 308155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov updateRawContactDisplayName(db, rawContactId); 308255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 308355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 308455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } finally { 308555e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov cursor.close(); 308655e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 308755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 308855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 308924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private void upgradeToVersion600(SQLiteDatabase db) { 309024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Add a column to the Accounts table to track which raw contact ID (if any) represents that 309124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // account's contribution to the user's profile Contact. 309224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro db.execSQL("ALTER TABLE accounts" + 309324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " ADD profile_raw_contact_id INTEGER"); 309424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro db.execSQL("CREATE INDEX accounts_profile_raw_contact_id_index ON accounts" + 309524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " (profile_raw_contact_id);"); 309624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 309724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 309846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa private void upgradeToVersion601(SQLiteDatabase db) { 309946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa db.execSQL("CREATE TABLE data_usage_stat(" + 310046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "stat_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 310146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "data_id INTEGER NOT NULL, " + 310246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "usage_type INTEGER NOT NULL DEFAULT 0, " + 310346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "times_used INTEGER NOT NULL DEFAULT 0, " + 310446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "last_time_used INTERGER NOT NULL DEFAULT 0, " + 310546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "FOREIGN KEY(data_id) REFERENCES data(_id));"); 310646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa db.execSQL("CREATE UNIQUE INDEX data_usage_stat_index ON " + 310746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "data_usage_stat (data_id, usage_type)"); 310846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa } 310946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 311059f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee private void upgradeToVersion602(SQLiteDatabase db) { 311159f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD voicemail_uri TEXT;"); 311259f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD _data TEXT;"); 311359f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD has_content INTEGER;"); 311459f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD mime_type TEXT;"); 311559f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD source_data TEXT;"); 311659f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD source_package TEXT;"); 311759f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD state INTEGER;"); 311859f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee } 311959f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee 3120069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee private void upgradeToVersion604(SQLiteDatabase db) { 3121069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee db.execSQL("CREATE TABLE voicemail_status (" + 3122069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "_id INTEGER PRIMARY KEY AUTOINCREMENT," + 3123069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "source_package TEXT UNIQUE NOT NULL," + 3124069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "settings_uri TEXT," + 3125069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "voicemail_access_uri TEXT," + 3126069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "configuration_state INTEGER," + 3127069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "data_channel_state INTEGER," + 3128069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "notification_channel_state INTEGER" + 3129069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee ");"); 3130069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee } 3131069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee 31323b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann private void upgradeToVersion605(SQLiteDatabase db) { 31333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann db.execSQL("CREATE TABLE stream_items(" + 31343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 31353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "raw_contact_id INTEGER NOT NULL, " + 31363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "package_id INTEGER NOT NULL, " + 31373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "icon INTEGER, " + 31383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "label INTEGER, " + 31393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "text TEXT NOT NULL, " + 31403b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "timestamp INTEGER NOT NULL, " + 31413b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "comments TEXT NOT NULL, " + 31423b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "action TEXT, " + 31433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "action_uri TEXT, " + 31443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "FOREIGN KEY(raw_contact_id) REFERENCES raw_contacts(_id));"); 31453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 31463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann db.execSQL("CREATE TABLE stream_item_photos(" + 31473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 31483b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "stream_item_id INTEGER NOT NULL, " + 31493b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "sort_index INTEGER, " + 31503b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "picture BLOB, " + 31513b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "action TEXT, " + 31523b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "action_uri TEXT, " + 31533b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "FOREIGN KEY(stream_item_id) REFERENCES stream_items(_id));"); 31543b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 31553b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 3156b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public String extractHandleFromEmailAddress(String email) { 3157b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(email); 3158b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (tokens.length == 0) { 3159b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return null; 3160b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 3161b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 3162b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov String address = tokens[0].getAddress(); 3163b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov int at = address.indexOf('@'); 3164b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (at != -1) { 3165b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return address.substring(0, at); 3166b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 3167b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return null; 3168b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 3169b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 317008768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov public String extractAddressFromEmailAddress(String email) { 317108768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(email); 317208768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov if (tokens.length == 0) { 317308768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov return null; 317408768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov } 317508768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov 317650a7c86b4b49870bd19d5270722be3f1fccaf226Dmitri Plotnikov return tokens[0].getAddress().trim(); 317708768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov } 317808768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov 3179b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov private long lookupMimeTypeId(SQLiteDatabase db, String mimeType) { 3180b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov try { 3181b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return DatabaseUtils.longForQuery(db, 3182b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov "SELECT " + MimetypesColumns._ID + 3183b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov " FROM " + Tables.MIMETYPES + 3184b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov " WHERE " + MimetypesColumns.MIMETYPE 3185b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov + "='" + mimeType + "'", null); 3186b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } catch (SQLiteDoneException e) { 3187b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov // No rows of this type in the database 3188b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return -1; 3189b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 3190b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 3191b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 31925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void bindString(SQLiteStatement stmt, int index, String value) { 31935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (value == null) { 31945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov stmt.bindNull(index); 31955dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } else { 31965dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov stmt.bindString(index, value); 31975dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 31985dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 31995dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 320078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private void bindLong(SQLiteStatement stmt, int index, Number value) { 320178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (value == null) { 320278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov stmt.bindNull(index); 320378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } else { 320478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov stmt.bindLong(index, value.longValue()); 320578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 320678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 320778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 3208a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov /** 3209f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * Adds index stats into the SQLite database to force it to always use the lookup indexes. 3210f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov */ 3211f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov private void updateSqliteStats(SQLiteDatabase db) { 3212f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 3213f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov // Specific stats strings are based on an actual large database after running ANALYZE 3214f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov try { 32158fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.CONTACTS, 32168fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "contacts_restricted_index", "10000 9000"); 32178fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.CONTACTS, 32188fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "contacts_has_phone_index", "10000 500"); 32198fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 32208fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.RAW_CONTACTS, 32218fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "raw_contacts_source_id_index", "10000 1 1 1"); 32228fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.RAW_CONTACTS, 32238fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "raw_contacts_contact_id_index", "10000 2"); 32248fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 32258fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.NAME_LOOKUP, 32268fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "name_lookup_raw_contact_id_index", "10000 3"); 32278fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.NAME_LOOKUP, 3228916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov "name_lookup_index", "10000 3 2 2 1"); 32298fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.NAME_LOOKUP, 32308fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "sqlite_autoindex_name_lookup_1", "10000 3 2 1"); 32318fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 32328fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.PHONE_LOOKUP, 32338fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "phone_lookup_index", "10000 2 2 1"); 323436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov updateIndexStats(db, Tables.PHONE_LOOKUP, 323536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov "phone_lookup_min_match_index", "10000 2 2 1"); 32368fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 32378fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.DATA, 32388fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "data_mimetype_data1_index", "60000 5000 2"); 32398fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.DATA, 32408fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "data_raw_contact_id", "60000 10"); 32418fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 32428fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.GROUPS, 32438fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "groups_source_id_index", "50 1 1 1"); 32448fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 32458fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.NICKNAME_LOOKUP, 32468fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "sqlite_autoindex_name_lookup_1", "500 2 1"); 32478fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 3248f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } catch (SQLException e) { 3249f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov Log.e(TAG, "Could not update index stats", e); 3250f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } 3251f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } 3252f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 3253f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov /** 3254f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * Stores statistics for a given index. 3255f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * 3256f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * @param stats has the following structure: the first index is the expected size of 3257f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * the table. The following integer(s) are the expected number of records selected with the 3258f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * index. There should be one integer per indexed column. 3259f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov */ 32605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void updateIndexStats(SQLiteDatabase db, String table, String index, 32615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String stats) { 3262f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov db.execSQL("DELETE FROM sqlite_stat1 WHERE tbl='" + table + "' AND idx='" + index + "';"); 3263f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov db.execSQL("INSERT INTO sqlite_stat1 (tbl,idx,stat)" 3264f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov + " VALUES ('" + table + "','" + index + "','" + stats + "');"); 3265f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } 3266f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 3267f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov @Override 3268f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov public synchronized SQLiteDatabase getWritableDatabase() { 3269f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov SQLiteDatabase db = super.getWritableDatabase(); 3270f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov if (mReopenDatabase) { 3271f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov mReopenDatabase = false; 3272f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov close(); 3273f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov db = super.getWritableDatabase(); 3274f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } 3275f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov return db; 3276f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } 3277f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 3278f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov /** 3279a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov * Wipes all data except mime type and package lookup tables. 3280a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov */ 3281a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public void wipeData() { 3282a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov SQLiteDatabase db = getWritableDatabase(); 32833d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov 328433fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.ACCOUNTS + ";"); 328524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro db.execSQL("INSERT INTO " + Tables.ACCOUNTS + " VALUES(NULL, NULL, NULL)"); 328633fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 3287d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.CONTACTS + ";"); 32885ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.RAW_CONTACTS + ";"); 32893b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann db.execSQL("DELETE FROM " + Tables.STREAM_ITEMS + ";"); 32903b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann db.execSQL("DELETE FROM " + Tables.STREAM_ITEM_PHOTOS + ";"); 3291a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.DATA + ";"); 3292a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.PHONE_LOOKUP + ";"); 3293a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.NAME_LOOKUP + ";"); 3294ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey db.execSQL("DELETE FROM " + Tables.GROUPS + ";"); 3295b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.AGGREGATION_EXCEPTIONS + ";"); 3296eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey db.execSQL("DELETE FROM " + Tables.SETTINGS + ";"); 3297a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.ACTIVITIES + ";"); 32983d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.CALLS + ";"); 329972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov db.execSQL("DELETE FROM " + Tables.DIRECTORIES + ";"); 3300f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.SEARCH_INDEX + ";"); 330172e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov 3302b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov // Note: we are not removing reference data from Tables.NICKNAME_LOOKUP 3303a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov } 3304b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 330504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public NameSplitter createNameSplitter() { 33068ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mNameSplitter = new NameSplitter( 330704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov mContext.getString(com.android.internal.R.string.common_name_prefixes), 330804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov mContext.getString(com.android.internal.R.string.common_last_name_prefixes), 330904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov mContext.getString(com.android.internal.R.string.common_name_suffixes), 331004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov mContext.getString(com.android.internal.R.string.common_name_conjunctions), 331104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Locale.getDefault()); 33128ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov return mNameSplitter; 331304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 331404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 3315b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** 3316619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * Return the {@link ApplicationInfo#uid} for the given package name. 3317619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey */ 3318619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey public static int getUidForPackageName(PackageManager pm, String packageName) { 3319619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey try { 3320619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey ApplicationInfo clientInfo = pm.getApplicationInfo(packageName, 0 /* no flags */); 3321619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey return clientInfo.uid; 3322619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } catch (NameNotFoundException e) { 3323619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey throw new RuntimeException(e); 3324619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } 3325619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } 3326619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey 3327619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey /** 3328b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * Perform an internal string-to-integer lookup using the compiled 3329b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * {@link SQLiteStatement} provided, using the in-memory cache to speed up 3330b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * lookups. If a mapping isn't found in cache or database, it will be 3331b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * created. All new, uncached answers are added to the cache automatically. 3332b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * 3333b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * @param query Compiled statement used to query for the mapping. 3334b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * @param insert Compiled statement used to insert a new mapping when no 3335b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * existing one is found in cache or from query. 3336b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * @param value Value to find mapping for. 3337b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * @param cache In-memory cache of previous answers. 3338b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * @return An unique integer mapping for the given value. 3339b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 3340f4a3b7e523e36679b68edd2af632e26648758ff2Dmitri Plotnikov private long getCachedId(SQLiteStatement query, SQLiteStatement insert, 3341b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey String value, HashMap<String, Long> cache) { 3342b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Try an in-memory cache lookup 3343b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey if (cache.containsKey(value)) { 3344b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return cache.get(value); 3345b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3346b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 3347ec73c9927a67e4afdd35c1b030254ed7f528655fDmitri Plotnikov synchronized (query) { 334836d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov long id = -1; 334936d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov try { 335036d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov // Try searching database for mapping 335136d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(query, 1, value); 335236d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov id = query.simpleQueryForLong(); 335336d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov } catch (SQLiteDoneException e) { 335436d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov // Nothing found, so try inserting new mapping 335536d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(insert, 1, value); 335636d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov id = insert.executeInsert(); 335736d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov } 335836d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov if (id != -1) { 335936d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov // Cache and return the new answer 336036d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov cache.put(value, id); 336136d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov return id; 336236d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov } else { 336336d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov // Otherwise throw if no mapping found or created 336436d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov throw new IllegalStateException("Couldn't find or create internal " 336536d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov + "lookup table entry for value " + value); 336636d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov } 3367b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3368b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3369b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 3370b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** 3371ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Convert a package name into an integer, using {@link Tables#PACKAGES} for 3372b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * lookups and possible allocation of new IDs as needed. 3373b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 3374b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public long getPackageId(String packageName) { 337578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mPackageQuery == null) { 337678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mPackageQuery = getWritableDatabase().compileStatement( 337778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + PackagesColumns._ID + 337878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.PACKAGES + 337978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + PackagesColumns.PACKAGE + "=?"); 338078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 338178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 338278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mPackageInsert == null) { 338378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mPackageInsert = getWritableDatabase().compileStatement( 338478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "INSERT INTO " + Tables.PACKAGES + "(" 338578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + PackagesColumns.PACKAGE + 338678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov ") VALUES (?)"); 338778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 3388b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return getCachedId(mPackageQuery, mPackageInsert, packageName, mPackageCache); 3389b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3390b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 3391b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** 3392ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Convert a mimetype into an integer, using {@link Tables#MIMETYPES} for 3393b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * lookups and possible allocation of new IDs as needed. 3394b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 3395b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public long getMimeTypeId(String mimetype) { 3396b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return getCachedId(mMimetypeQuery, mMimetypeInsert, mimetype, mMimetypeCache); 3397b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3398b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 33992a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov public long getMimeTypeIdForStructuredName() { 34002a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return mMimeTypeIdStructuredName; 34012a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 34022a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 34032a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov public long getMimeTypeIdForOrganization() { 34042a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return mMimeTypeIdOrganization; 34052a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 34062a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 34072a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov public long getMimeTypeIdForIm() { 34082a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return mMimeTypeIdIm; 34092a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 34102a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 34112a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov public long getMimeTypeIdForEmail() { 34122a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return mMimeTypeIdEmail; 34132a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 34142a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 3415a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public long getMimeTypeIdForSip() { 3416a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov return mMimeTypeIdSip; 3417a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 3418a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 34192a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov public int getDisplayNameSourceForMimeTypeId(int mimeTypeId) { 34202a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov if (mimeTypeId == mMimeTypeIdStructuredName) { 34212a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.STRUCTURED_NAME; 34222a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } else if (mimeTypeId == mMimeTypeIdEmail) { 34232a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.EMAIL; 34242a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } else if (mimeTypeId == mMimeTypeIdPhone) { 34252a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.PHONE; 34262a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } else if (mimeTypeId == mMimeTypeIdOrganization) { 34272a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.ORGANIZATION; 34282a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } else if (mimeTypeId == mMimeTypeIdNickname) { 34292a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.NICKNAME; 34302a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } else { 34312a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.UNDEFINED; 34322a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 34332a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 34342a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 3435b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** 3436ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Find the mimetype for the given {@link Data#_ID}. 3437b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 3438b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public String getDataMimeType(long dataId) { 343978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mDataMimetypeQuery == null) { 344078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mDataMimetypeQuery = getWritableDatabase().compileStatement( 344178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + MimetypesColumns.MIMETYPE + 344278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.DATA_JOIN_MIMETYPES + 344378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + Tables.DATA + "." + Data._ID + "=?"); 344478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 3445b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey try { 3446b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Try database query to find mimetype 3447b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey DatabaseUtils.bindObjectToProgram(mDataMimetypeQuery, 1, dataId); 3448b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey String mimetype = mDataMimetypeQuery.simpleQueryForString(); 3449b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return mimetype; 3450b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } catch (SQLiteDoneException e) { 3451b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // No valid mapping found, so return null 3452b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return null; 3453b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3454b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3455b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 3456b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** 3457b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * Find the mime-type for the given {@link Activities#_ID}. 3458b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 3459b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public String getActivityMimeType(long activityId) { 346078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mActivitiesMimetypeQuery == null) { 346178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mActivitiesMimetypeQuery = getWritableDatabase().compileStatement( 346278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + MimetypesColumns.MIMETYPE + 346378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.ACTIVITIES_JOIN_MIMETYPES + 346478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + Tables.ACTIVITIES + "." + Activities._ID + "=?"); 346578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 3466b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey try { 3467b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Try database query to find mimetype 3468b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey DatabaseUtils.bindObjectToProgram(mActivitiesMimetypeQuery, 1, activityId); 3469b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey String mimetype = mActivitiesMimetypeQuery.simpleQueryForString(); 3470b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return mimetype; 3471b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } catch (SQLiteDoneException e) { 3472b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // No valid mapping found, so return null 3473b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return null; 3474b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3475b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 34766bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov 34776bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov /** 3478d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov * Update {@link Contacts#IN_VISIBLE_GROUP} for all contacts. 3479ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey */ 3480ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public void updateAllVisible() { 3481385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov updateCustomContactVisibility(getWritableDatabase(), ""); 3482ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } 3483ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 3484ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey /** 3485f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov * Updates contact visibility and return true iff the visibility was actually changed. 3486f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov */ 3487bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov public boolean updateContactVisibleOnlyIfChanged(TransactionContext txContext, long contactId) { 3488bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov return updateContactVisible(txContext, contactId, true); 3489f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3490f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 3491f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov /** 3492385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov * Update {@link Contacts#IN_VISIBLE_GROUP} and 3493385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov * {@link Tables#DEFAULT_DIRECTORY} for a specific contact. 3494ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey */ 3495bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov public void updateContactVisible(TransactionContext txContext, long contactId) { 3496bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov updateContactVisible(txContext, contactId, false); 3497f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3498f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 3499bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov public boolean updateContactVisible( 3500bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov TransactionContext txContext, long contactId, boolean onlyIfChanged) { 35014394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov SQLiteDatabase db = getWritableDatabase(); 3502f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov updateCustomContactVisibility(db, " AND " + Contacts._ID + "=" + contactId); 3503385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 3504385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov String contactIdAsString = String.valueOf(contactId); 3505385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov long mimetype = getMimeTypeId(GroupMembership.CONTENT_ITEM_TYPE); 3506385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 3507385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov // The contact will be included in the default directory if contains 3508d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov // a raw contact that is in any group or in an account that 3509385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov // does not have any AUTO_ADD groups. 3510f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov boolean newVisibility = DatabaseUtils.longForQuery(db, 3511385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov "SELECT EXISTS (" + 3512385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov "SELECT " + RawContacts.CONTACT_ID + 3513385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 3514385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " JOIN " + Tables.DATA + 3515385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " ON (" + RawContactsColumns.CONCRETE_ID + "=" 3516385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + Data.RAW_CONTACT_ID + ")" + 3517385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=?" + 3518385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + DataColumns.MIMETYPE_ID + "=?" + 3519385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ") OR EXISTS (" + 3520385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov "SELECT " + RawContacts._ID + 3521385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 3522385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=?" + 3523385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND NOT EXISTS" + 3524385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " (SELECT " + Groups._ID + 3525385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.GROUPS + 3526385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + RawContactsColumns.CONCRETE_ACCOUNT_NAME + " = " 3527385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + GroupsColumns.CONCRETE_ACCOUNT_NAME + 3528385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " = " 3529385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + GroupsColumns.CONCRETE_ACCOUNT_TYPE + 3530385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + Groups.AUTO_ADD + " != 0" + 3531385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ")" + 3532385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ") OR EXISTS (" + 3533385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov "SELECT " + RawContacts._ID + 3534385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 3535385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=?" + 3536385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_ACCOUNT_NAME + " IS NULL " + 3537385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " IS NULL" + 3538385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ")", 3539385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov new String[] { 3540385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov contactIdAsString, 35416c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov String.valueOf(mimetype), 3542385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov contactIdAsString, 35436c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov contactIdAsString 3544f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov }) != 0; 3545385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 3546f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov if (onlyIfChanged) { 3547f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov boolean oldVisibility = isContactInDefaultDirectory(db, contactId); 3548f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov if (oldVisibility == newVisibility) { 3549f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov return false; 3550f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3551f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3552f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 3553f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov if (newVisibility) { 3554385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov db.execSQL("INSERT OR IGNORE INTO " + Tables.DEFAULT_DIRECTORY + " VALUES(?)", 3555385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov new String[] { contactIdAsString }); 3556bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov txContext.invalidateSearchIndexForContact(contactId); 3557385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov } else { 3558bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov db.execSQL("DELETE FROM " + Tables.DEFAULT_DIRECTORY + 3559bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov " WHERE " + Contacts._ID + "=?", 3560bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov new String[] { contactIdAsString }); 3561bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov db.execSQL("DELETE FROM " + Tables.SEARCH_INDEX + 3562bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov " WHERE " + SearchIndexColumns.CONTACT_ID + "=CAST(? AS int)", 3563385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov new String[] { contactIdAsString }); 3564385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov } 3565f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov return true; 3566f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3567f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 3568f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov public boolean isContactInDefaultDirectory(SQLiteDatabase db, long contactId) { 3569f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov if (mContactInDefaultDirectoryQuery == null) { 3570f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov mContactInDefaultDirectoryQuery = db.compileStatement( 3571f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov "SELECT EXISTS (" + 3572f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov "SELECT 1 FROM " + Tables.DEFAULT_DIRECTORY + 3573f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov " WHERE " + Contacts._ID + "=?)"); 3574f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3575f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov mContactInDefaultDirectoryQuery.bindLong(1, contactId); 3576f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov return mContactInDefaultDirectoryQuery.simpleQueryForLong() != 0; 3577385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov } 35784394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 3579385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov private void updateCustomContactVisibility(SQLiteDatabase db, String selection) { 3580ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey final long groupMembershipMimetypeId = getMimeTypeId(GroupMembership.CONTENT_ITEM_TYPE); 35814394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov String[] selectionArgs = new String[]{String.valueOf(groupMembershipMimetypeId)}; 35824394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 35834394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov // First delete what needs to be deleted, then insert what needs to be added. 35844394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov // Since flash writes are very expensive, this approach is much better than 35854394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov // delete-all-insert-all. 35864394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.VISIBLE_CONTACTS + 35874394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " WHERE " + "_id NOT IN" + 35884394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "(SELECT " + Contacts._ID + 35894394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " FROM " + Tables.CONTACTS + 35904394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " WHERE (" + Clauses.CONTACT_IS_VISIBLE + ")=1) " + selection, 35914394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov selectionArgs); 3592fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 35934394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("INSERT INTO " + Tables.VISIBLE_CONTACTS + 35944394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " SELECT " + Contacts._ID + 35954394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " FROM " + Tables.CONTACTS + 35964394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " WHERE " + Contacts._ID + 35974394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " NOT IN " + Tables.VISIBLE_CONTACTS + 35984394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " AND (" + Clauses.CONTACT_IS_VISIBLE + ")=1 " + selection, 35994394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov selectionArgs); 3600ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } 3601ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 3602ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey /** 3603d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov * Returns contact ID for the given contact or zero if it is NULL. 36046bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov */ 3605d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public long getContactId(long rawContactId) { 360678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mContactIdQuery == null) { 360778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mContactIdQuery = getWritableDatabase().compileStatement( 360878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + RawContacts.CONTACT_ID + 360978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 361078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?"); 361178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 36126bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov try { 3613d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(mContactIdQuery, 1, rawContactId); 3614d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov return mContactIdQuery.simpleQueryForLong(); 36156bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov } catch (SQLiteDoneException e) { 3616a3bd0246ca3741877488bca7aadd91c79b2fd8d2Fred Quintana // No valid mapping found, so return 0 36176bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov return 0; 36186bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov } 36196bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov } 362061bbb2287e8102b7e03922c03809c34b7b317d1cDmitri Plotnikov 36215ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public int getAggregationMode(long rawContactId) { 362278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mAggregationModeQuery == null) { 362378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mAggregationModeQuery = getWritableDatabase().compileStatement( 362478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + RawContacts.AGGREGATION_MODE + 362578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 362678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?"); 362778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 3628f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov try { 36295ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(mAggregationModeQuery, 1, rawContactId); 3630f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return (int)mAggregationModeQuery.simpleQueryForLong(); 3631f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } catch (SQLiteDoneException e) { 36326cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov // No valid row found, so return "disabled" 36336cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov return RawContacts.AGGREGATION_MODE_DISABLED; 3634f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 3635f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 3636f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 3637892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov public void buildPhoneLookupAndContactQuery( 3638892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov SQLiteQueryBuilder qb, String normalizedNumber, String numberE164) { 3639892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov String minMatch = PhoneNumberUtils.toCallerIDMinMatch(normalizedNumber); 3640e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov StringBuilder sb = new StringBuilder(); 364136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov appendPhoneLookupTables(sb, minMatch, true); 3642e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov qb.setTables(sb.toString()); 3643e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 3644e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov sb = new StringBuilder(); 3645892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov appendPhoneLookupSelection(sb, normalizedNumber, numberE164); 3646e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov qb.appendWhere(sb.toString()); 3647bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov } 3648bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 3649e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov public String buildPhoneLookupAsNestedQuery(String number) { 3650e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov StringBuilder sb = new StringBuilder(); 365136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov final String minMatch = PhoneNumberUtils.toCallerIDMinMatch(number); 3652e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov sb.append("(SELECT DISTINCT raw_contact_id" + " FROM "); 365336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov appendPhoneLookupTables(sb, minMatch, false); 3654e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov sb.append(" WHERE "); 3655892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov appendPhoneLookupSelection(sb, number, null); 3656e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov sb.append(")"); 3657e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov return sb.toString(); 3658e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov } 3659e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 366036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov private void appendPhoneLookupTables(StringBuilder sb, final String minMatch, 3661e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov boolean joinContacts) { 3662e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov sb.append(Tables.RAW_CONTACTS); 3663e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov if (joinContacts) { 3664fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov sb.append(" JOIN " + getContactView() + " contacts_view" 3665fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + " ON (contacts_view._id = raw_contacts.contact_id)"); 3666e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov } 3667892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(", (SELECT data_id, normalized_number, length(normalized_number) as len " 3668892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + " FROM phone_lookup " + " WHERE (" + Tables.PHONE_LOOKUP + "." 3669892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + PhoneLookupColumns.MIN_MATCH + " = '"); 367036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov sb.append(minMatch); 367136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov sb.append("')) AS lookup, " + Tables.DATA); 3672e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov } 3673e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 3674892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov private void appendPhoneLookupSelection(StringBuilder sb, String number, String numberE164) { 3675892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append("lookup.data_id=data._id AND data.raw_contact_id=raw_contacts._id"); 3676892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov boolean hasNumberE164 = !TextUtils.isEmpty(numberE164); 3677892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov boolean hasNumber = !TextUtils.isEmpty(number); 3678892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (hasNumberE164 || hasNumber) { 3679892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" AND ( "); 3680892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (hasNumberE164) { 3681892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" lookup.normalized_number = "); 3682892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov DatabaseUtils.appendEscapedSQLString(sb, numberE164); 3683892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 3684892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (hasNumberE164 && hasNumber) { 3685892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" OR "); 3686892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 3687892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (hasNumber) { 3688892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov int numberLen = number.length(); 3689892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" lookup.len <= "); 3690892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(numberLen); 3691892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" AND substr("); 3692892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov DatabaseUtils.appendEscapedSQLString(sb, number); 3693892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(','); 3694892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(numberLen); 3695892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" - lookup.len + 1) = lookup.normalized_number"); 3696892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 3697892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(')'); 3698892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 369936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 370036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 370136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov public String getUseStrictPhoneNumberComparisonParameter() { 370236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov return mUseStrictPhoneNumberComparison ? "1" : "0"; 3703fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov } 3704bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 3705619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey /** 3706b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov * Loads common nickname mappings into the database. 3707b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov */ 3708b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov private void loadNicknameLookupTable(SQLiteDatabase db) { 370951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.NICKNAME_LOOKUP); 371051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 371128f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millar String[] strings = mContext.getResources().getStringArray( 371228f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millar com.android.internal.R.array.common_nicknames); 3713b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov if (strings == null || strings.length == 0) { 3714b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov return; 3715b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 3716b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 3717b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov SQLiteStatement nicknameLookupInsert = db.compileStatement("INSERT INTO " 3718b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov + Tables.NICKNAME_LOOKUP + "(" + NicknameLookupColumns.NAME + "," 3719b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov + NicknameLookupColumns.CLUSTER + ") VALUES (?,?)"); 3720b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 372151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov try { 372251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov for (int clusterId = 0; clusterId < strings.length; clusterId++) { 372351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov String[] names = strings[clusterId].split(","); 372451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov for (int j = 0; j < names.length; j++) { 372551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov String name = NameNormalizer.normalize(names[j]); 372651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov try { 372751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(nicknameLookupInsert, 1, name); 372851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(nicknameLookupInsert, 2, 372951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov String.valueOf(clusterId)); 373051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov nicknameLookupInsert.executeInsert(); 373151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } catch (SQLiteException e) { 373251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 373351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov // Print the exception and keep going - this is not a fatal error 373451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov Log.e(TAG, "Cannot insert nickname: " + names[j], e); 373551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 3736b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 3737b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 373851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } finally { 373951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov nicknameLookupInsert.close(); 3740b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 3741b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 3742b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 3743f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public static void copyStringValue(ContentValues toValues, String toKey, 3744f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov ContentValues fromValues, String fromKey) { 3745f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (fromValues.containsKey(fromKey)) { 3746f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov toValues.put(toKey, fromValues.getAsString(fromKey)); 3747f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 3748f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 3749f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 3750f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public static void copyLongValue(ContentValues toValues, String toKey, 3751f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov ContentValues fromValues, String fromKey) { 3752f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (fromValues.containsKey(fromKey)) { 3753f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long longValue; 3754f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov Object value = fromValues.get(fromKey); 3755f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (value instanceof Boolean) { 3756f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if ((Boolean)value) { 3757f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov longValue = 1; 3758f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } else { 3759f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov longValue = 0; 3760f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 37611b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov } else if (value instanceof String) { 37621b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov longValue = Long.parseLong((String)value); 3763f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } else { 37641b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov longValue = ((Number)value).longValue(); 3765f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 3766f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov toValues.put(toKey, longValue); 3767f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 3768f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 3769f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 377035ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana public SyncStateContentProviderHelper getSyncState() { 377135ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana return mSyncState; 377235ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana } 3773c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 3774c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov /** 3775c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov * Delete the aggregate contact if it has no constituent raw contacts other 3776c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov * than the supplied one. 3777c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov */ 3778c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov public void removeContactIfSingleton(long rawContactId) { 3779c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov SQLiteDatabase db = getWritableDatabase(); 3780c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 3781c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov // Obtain contact ID from the supplied raw contact ID 3782c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov String contactIdFromRawContactId = "(SELECT " + RawContacts.CONTACT_ID + " FROM " 3783c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + Tables.RAW_CONTACTS + " WHERE " + RawContacts._ID + "=" + rawContactId + ")"; 3784c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 3785c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov // Find other raw contacts in the same aggregate contact 3786c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov String otherRawContacts = "(SELECT contacts1." + RawContacts._ID + " FROM " 3787c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + Tables.RAW_CONTACTS + " contacts1 JOIN " + Tables.RAW_CONTACTS + " contacts2 ON (" 3788c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + "contacts1." + RawContacts.CONTACT_ID + "=contacts2." + RawContacts.CONTACT_ID 3789c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + ") WHERE contacts1." + RawContacts._ID + "!=" + rawContactId + "" 3790c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + " AND contacts2." + RawContacts._ID + "=" + rawContactId + ")"; 3791c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 3792c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov db.execSQL("DELETE FROM " + Tables.CONTACTS 3793c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + " WHERE " + Contacts._ID + "=" + contactIdFromRawContactId 3794c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + " AND NOT EXISTS " + otherRawContacts + ";"); 3795c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov } 37964a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 37974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov /** 3798b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov * Returns the value from the {@link Tables#PROPERTIES} table. 3799b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov */ 3800b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov public String getProperty(String key, String defaultValue) { 3801b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov Cursor cursor = getReadableDatabase().query(Tables.PROPERTIES, 3802b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov new String[]{PropertiesColumns.PROPERTY_VALUE}, 3803b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov PropertiesColumns.PROPERTY_KEY + "=?", 3804b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov new String[]{key}, null, null, null); 3805b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov String value = null; 3806b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov try { 3807b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov if (cursor.moveToFirst()) { 3808b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov value = cursor.getString(0); 3809b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 3810b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } finally { 3811b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov cursor.close(); 3812b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 3813b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 3814b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov return value != null ? value : defaultValue; 3815b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 3816b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 3817b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov /** 3818b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov * Stores a key-value pair in the {@link Tables#PROPERTIES} table. 3819b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov */ 3820b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov public void setProperty(String key, String value) { 38213d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov setProperty(getWritableDatabase(), key, value); 38223d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov } 38233d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov 38243d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov private void setProperty(SQLiteDatabase db, String key, String value) { 3825b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov ContentValues values = new ContentValues(); 3826b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov values.put(PropertiesColumns.PROPERTY_KEY, key); 3827b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov values.put(PropertiesColumns.PROPERTY_VALUE, value); 38283d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov db.replace(Tables.PROPERTIES, null, values); 3829b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 3830b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 3831b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov /** 38324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov * Check if {@link Binder#getCallingUid()} should be allowed access to 38334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov * {@link RawContacts#IS_RESTRICTED} data. 38344a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov */ 3835d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton boolean hasAccessToRestrictedData() { 38364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov final PackageManager pm = mContext.getPackageManager(); 38376ff43a7545880f0b1c0f0a82b3551fb1d0dfa956Marco Nelissen int caller = Binder.getCallingUid(); 38386ff43a7545880f0b1c0f0a82b3551fb1d0dfa956Marco Nelissen if (caller == 0) return true; // root can do anything 38396ff43a7545880f0b1c0f0a82b3551fb1d0dfa956Marco Nelissen final String[] callerPackages = pm.getPackagesForUid(caller); 38404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 38414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov // Has restricted access if caller matches any packages 38424a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov for (String callerPackage : callerPackages) { 3843d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton if (hasAccessToRestrictedData(callerPackage)) { 3844763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar return true; 3845763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar } 3846763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar } 3847763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar return false; 3848763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar } 3849763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar 3850763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar /** 3851763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar * Check if requestingPackage should be allowed access to 3852763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar * {@link RawContacts#IS_RESTRICTED} data. 3853763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar */ 3854d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton boolean hasAccessToRestrictedData(String requestingPackage) { 3855d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton if (mUnrestrictedPackages != null) { 3856d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton for (String allowedPackage : mUnrestrictedPackages) { 3857d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton if (allowedPackage.equals(requestingPackage)) { 3858d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton return true; 3859d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton } 38604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 38614a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 38624a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov return false; 38634a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 38644a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 38654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public String getDataView() { 3866d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa return getDataView(false); 3867d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa } 3868d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa 3869d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa public String getDataView(boolean requireRestrictedView) { 3870d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton return (hasAccessToRestrictedData() && !requireRestrictedView) ? 3871d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa Views.DATA_ALL : Views.DATA_RESTRICTED; 38724a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 38734a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 38744a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public String getRawContactView() { 3875763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar return getRawContactView(false); 3876763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar } 3877763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar 3878763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar public String getRawContactView(boolean requireRestrictedView) { 3879d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton return (hasAccessToRestrictedData() && !requireRestrictedView) ? 3880763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar Views.RAW_CONTACTS_ALL : Views.RAW_CONTACTS_RESTRICTED; 38814a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 38824a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 38834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public String getContactView() { 3884763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar return getContactView(false); 38854a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 38864a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 3887763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar public String getContactView(boolean requireRestrictedView) { 3888d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton return (hasAccessToRestrictedData() && !requireRestrictedView) ? 3889763100dcfabb368e72f25d24fe181c352bdb66d6Evan Millar Views.CONTACTS_ALL : Views.CONTACTS_RESTRICTED; 3890f9aeb84d61c01a473819e9173f8311ca5d678a8dJeff Sharkey } 3891f9aeb84d61c01a473819e9173f8311ca5d678a8dJeff Sharkey 389289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov public String getGroupView() { 389389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov return Views.GROUPS_ALL; 389489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov } 389589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 3896a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public String getRawEntitiesView() { 3897a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov return getRawEntitiesView(false); 3898a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 3899a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 3900a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public String getRawEntitiesView(boolean requireRestrictedView) { 3901a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov return (hasAccessToRestrictedData() && !requireRestrictedView) ? 3902a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Views.RAW_ENTITIES : Views.RAW_ENTITIES_RESTRICTED; 3903a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 3904a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 3905a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public String getEntitiesView() { 3906a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov return getEntitiesView(false); 3907d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa } 3908d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa 3909a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public String getEntitiesView(boolean requireRestrictedView) { 3910d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton return (hasAccessToRestrictedData() && !requireRestrictedView) ? 3911a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov Views.ENTITIES : Views.ENTITIES_RESTRICTED; 3912d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa } 3913d237c80845d8e13164d34278d3c20e31f8d80b4dDaisuke Miyakawa 39142f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa public String getDataUsageStatView() { 39152f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa return getDataUsageStatView(false); 39162f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa } 39172f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 39182f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa public String getDataUsageStatView(boolean requireRestrictedView) { 39192f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa return (hasAccessToRestrictedData() && !requireRestrictedView) ? 39202f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa Views.DATA_USAGE_STAT_ALL : Views.DATA_USAGE_STAT_RESTRICTED; 39212f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa } 39222f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 3923ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov /** 3924ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov * Test if any of the columns appear in the given projection. 3925ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov */ 3926ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov public boolean isInProjection(String[] projection, String... columns) { 392782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov if (projection == null) { 392882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov return true; 392982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov } 3930ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov 393182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov // Optimized for a single-column test 393282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov if (columns.length == 1) { 393382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov String column = columns[0]; 393482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov for (String test : projection) { 393582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov if (column.equals(test)) { 393682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov return true; 393782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov } 393882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov } 393982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov } else { 394082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov for (String test : projection) { 394182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov for (String column : columns) { 3942ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov if (column.equals(test)) { 3943ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov return true; 3944ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 3945ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 3946ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 3947ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 3948ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov return false; 39494a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 3950fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov 3951fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov /** 3952fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov * Returns a detailed exception message for the supplied URI. It includes the calling 3953fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov * user and calling package(s). 3954fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov */ 3955fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov public String exceptionMessage(Uri uri) { 3956fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov return exceptionMessage(null, uri); 3957fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 3958fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov 3959fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov /** 3960fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov * Returns a detailed exception message for the supplied URI. It includes the calling 3961fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov * user and calling package(s). 3962fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov */ 3963fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov public String exceptionMessage(String message, Uri uri) { 3964fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov StringBuilder sb = new StringBuilder(); 3965fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov if (message != null) { 3966fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(message).append("; "); 3967fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 3968fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append("URI: ").append(uri); 3969fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov final PackageManager pm = mContext.getPackageManager(); 3970fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov int callingUid = Binder.getCallingUid(); 3971fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(", calling user: "); 3972fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov String userName = pm.getNameForUid(callingUid); 3973fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov if (userName != null) { 3974fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(userName); 3975fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } else { 3976fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(callingUid); 3977fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 3978fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov 3979fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov final String[] callerPackages = pm.getPackagesForUid(callingUid); 3980fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov if (callerPackages != null && callerPackages.length > 0) { 3981fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov if (callerPackages.length == 1) { 3982fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(", calling package:"); 3983fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(callerPackages[0]); 3984fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } else { 3985fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(", calling package is one of: ["); 3986fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov for (int i = 0; i < callerPackages.length; i++) { 3987fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov if (i != 0) { 3988fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(", "); 3989fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 3990fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(callerPackages[i]); 3991fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 3992fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append("]"); 3993fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 3994fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 3995fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov 3996fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov return sb.toString(); 3997fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 3998892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 3999892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov protected String getCountryIso() { 4000892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov CountryDetector detector = 4001892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov (CountryDetector) mContext.getSystemService(Context.COUNTRY_DETECTOR); 4002892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov return detector.detectCountry().getCountryIso(); 4003892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 400478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 400578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void deleteStatusUpdate(long dataId) { 400678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mStatusUpdateDelete == null) { 400778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateDelete = getWritableDatabase().compileStatement( 400878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "DELETE FROM " + Tables.STATUS_UPDATES + 400978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + StatusUpdatesColumns.DATA_ID + "=?"); 401078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 401178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateDelete.bindLong(1, dataId); 401278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateDelete.execute(); 401378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 401478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 401578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void replaceStatusUpdate(Long dataId, long timestamp, String status, String resPackage, 401678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov Long iconResource, Integer labelResource) { 401778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mStatusUpdateReplace == null) { 401878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateReplace = getWritableDatabase().compileStatement( 401978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "INSERT OR REPLACE INTO " + Tables.STATUS_UPDATES + "(" 402078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdatesColumns.DATA_ID + ", " 402178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_TIMESTAMP + "," 402278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS + "," 402378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_RES_PACKAGE + "," 402478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_ICON + "," 402578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_LABEL + ")" + 402678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " VALUES (?,?,?,?,?,?)"); 402778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 402878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateReplace.bindLong(1, dataId); 402978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateReplace.bindLong(2, timestamp); 403078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateReplace, 3, status); 403178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateReplace, 4, resPackage); 403278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusUpdateReplace, 5, iconResource); 403378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusUpdateReplace, 6, labelResource); 403478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateReplace.execute(); 403578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 403678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 403778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void insertStatusUpdate(Long dataId, String status, String resPackage, Long iconResource, 403878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov Integer labelResource) { 403978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mStatusUpdateInsert == null) { 404078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateInsert = getWritableDatabase().compileStatement( 404178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "INSERT INTO " + Tables.STATUS_UPDATES + "(" 404278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdatesColumns.DATA_ID + ", " 404378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS + "," 404478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_RES_PACKAGE + "," 404578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_ICON + "," 404678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_LABEL + ")" + 404778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " VALUES (?,?,?,?,?)"); 404878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 404978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov try { 405078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateInsert.bindLong(1, dataId); 405178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateInsert, 2, status); 405278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateInsert, 3, resPackage); 405378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusUpdateInsert, 4, iconResource); 405478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusUpdateInsert, 5, labelResource); 405578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateInsert.executeInsert(); 405678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } catch (SQLiteConstraintException e) { 405778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov // The row already exists - update it 405878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mStatusUpdateAutoTimestamp == null) { 405978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateAutoTimestamp = getWritableDatabase().compileStatement( 406078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.STATUS_UPDATES + 406178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + StatusUpdates.STATUS_TIMESTAMP + "=?," 406278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS + "=?" + 406378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + StatusUpdatesColumns.DATA_ID + "=?" 406478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + " AND " + StatusUpdates.STATUS + "!=?"); 406578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 406678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 406778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov long timestamp = System.currentTimeMillis(); 406878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateAutoTimestamp.bindLong(1, timestamp); 406978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateAutoTimestamp, 2, status); 407078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateAutoTimestamp.bindLong(3, dataId); 407178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateAutoTimestamp, 4, status); 407278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateAutoTimestamp.execute(); 407378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 407478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mStatusAttributionUpdate == null) { 407578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusAttributionUpdate = getWritableDatabase().compileStatement( 407678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.STATUS_UPDATES + 407778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + StatusUpdates.STATUS_RES_PACKAGE + "=?," 407878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_ICON + "=?," 407978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_LABEL + "=?" + 408078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + StatusUpdatesColumns.DATA_ID + "=?"); 408178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 408278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusAttributionUpdate, 1, resPackage); 408378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusAttributionUpdate, 2, iconResource); 408478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusAttributionUpdate, 3, labelResource); 408578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusAttributionUpdate.bindLong(4, dataId); 408678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusAttributionUpdate.execute(); 408778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 408878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 408978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 409078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** 409178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Resets the {@link RawContacts#NAME_VERIFIED} flag to 0 on all other raw 409278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * contacts in the same aggregate 409378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 409478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void resetNameVerifiedForOtherRawContacts(long rawContactId) { 409578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mResetNameVerifiedForOtherRawContacts == null) { 409678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mResetNameVerifiedForOtherRawContacts = getWritableDatabase().compileStatement( 409778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.RAW_CONTACTS + 409878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + RawContacts.NAME_VERIFIED + "=0" + 409978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=(" + 410078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + RawContacts.CONTACT_ID + 410178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 410278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?)" + 410378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " AND " + RawContacts._ID + "!=?"); 410478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 410578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mResetNameVerifiedForOtherRawContacts.bindLong(1, rawContactId); 410678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mResetNameVerifiedForOtherRawContacts.bindLong(2, rawContactId); 410778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mResetNameVerifiedForOtherRawContacts.execute(); 410878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 410978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 41108ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov private interface RawContactNameQuery { 41118ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final String RAW_SQL = 41128ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov "SELECT " 41138ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + DataColumns.MIMETYPE_ID + "," 41148ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.IS_PRIMARY + "," 41158ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA1 + "," 41168ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA2 + "," 41178ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA3 + "," 41188ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA4 + "," 41198ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA5 + "," 41208ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA6 + "," 41218ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA7 + "," 41228ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA8 + "," 41238ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA9 + "," 41248ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA10 + "," 41258ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA11 + 41268ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov " FROM " + Tables.DATA + 41278ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov " WHERE " + Data.RAW_CONTACT_ID + "=?" + 41288ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov " AND (" + Data.DATA1 + " NOT NULL OR " + 41298ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov Organization.TITLE + " NOT NULL)"; 41308ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 41318ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int MIMETYPE = 0; 41328ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int IS_PRIMARY = 1; 41338ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int DATA1 = 2; 41348ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int GIVEN_NAME = 3; // data2 41358ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int FAMILY_NAME = 4; // data3 41368ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int PREFIX = 5; // data4 41378ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int TITLE = 5; // data4 41388ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int MIDDLE_NAME = 6; // data5 41398ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int SUFFIX = 7; // data6 41408ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int PHONETIC_GIVEN_NAME = 8; // data7 41418ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int PHONETIC_MIDDLE_NAME = 9; // data8 41428ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int ORGANIZATION_PHONETIC_NAME = 9; // data8 41438ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int PHONETIC_FAMILY_NAME = 10; // data9 41448ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int FULL_NAME_STYLE = 11; // data10 41458ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int ORGANIZATION_PHONETIC_NAME_STYLE = 11; // data10 41468ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int PHONETIC_NAME_STYLE = 12; // data11 41478ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 41488ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 41498ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov /** 41508ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov * Updates a raw contact display name based on data rows, e.g. structured name, 41518ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov * organization, email etc. 41528ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov */ 41538ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public void updateRawContactDisplayName(SQLiteDatabase db, long rawContactId) { 41548ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (mNameSplitter == null) { 41558ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov createNameSplitter(); 41568ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 41578ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 41588ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov int bestDisplayNameSource = DisplayNameSources.UNDEFINED; 41598ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov NameSplitter.Name bestName = null; 41608ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String bestDisplayName = null; 41618ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String bestPhoneticName = null; 41628ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov int bestPhoneticNameStyle = PhoneticNameStyle.UNDEFINED; 41638ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 41648ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mSelectionArgs1[0] = String.valueOf(rawContactId); 41658ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov Cursor c = db.rawQuery(RawContactNameQuery.RAW_SQL, mSelectionArgs1); 41668ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov try { 41678ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov while (c.moveToNext()) { 41688ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov int mimeType = c.getInt(RawContactNameQuery.MIMETYPE); 41698ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov int source = getDisplayNameSourceForMimeTypeId(mimeType); 41708ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (source < bestDisplayNameSource || source == DisplayNameSources.UNDEFINED) { 41718ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov continue; 41728ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 41738ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 41748ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (source == bestDisplayNameSource 41758ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov && c.getInt(RawContactNameQuery.IS_PRIMARY) == 0) { 41768ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov continue; 41778ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 41788ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 41798ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (mimeType == getMimeTypeIdForStructuredName()) { 41808ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov NameSplitter.Name name; 41818ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (bestName != null) { 41828ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name = new NameSplitter.Name(); 41838ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else { 41848ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name = mName; 41858ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.clear(); 41868ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 41878ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.prefix = c.getString(RawContactNameQuery.PREFIX); 41888ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.givenNames = c.getString(RawContactNameQuery.GIVEN_NAME); 41898ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.middleName = c.getString(RawContactNameQuery.MIDDLE_NAME); 41908ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.familyName = c.getString(RawContactNameQuery.FAMILY_NAME); 41918ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.suffix = c.getString(RawContactNameQuery.SUFFIX); 41928ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.fullNameStyle = c.isNull(RawContactNameQuery.FULL_NAME_STYLE) 41938ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov ? FullNameStyle.UNDEFINED 41948ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov : c.getInt(RawContactNameQuery.FULL_NAME_STYLE); 41958ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.phoneticFamilyName = c.getString(RawContactNameQuery.PHONETIC_FAMILY_NAME); 41968ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.phoneticMiddleName = c.getString(RawContactNameQuery.PHONETIC_MIDDLE_NAME); 41978ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.phoneticGivenName = c.getString(RawContactNameQuery.PHONETIC_GIVEN_NAME); 41988ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.phoneticNameStyle = c.isNull(RawContactNameQuery.PHONETIC_NAME_STYLE) 41998ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov ? PhoneticNameStyle.UNDEFINED 42008ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov : c.getInt(RawContactNameQuery.PHONETIC_NAME_STYLE); 42018ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (!name.isEmpty()) { 42028ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayNameSource = source; 42038ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestName = name; 42048ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42058ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else if (mimeType == getMimeTypeIdForOrganization()) { 42068ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mCharArrayBuffer.sizeCopied = 0; 42078ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov c.copyStringToBuffer(RawContactNameQuery.DATA1, mCharArrayBuffer); 42088ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (mCharArrayBuffer.sizeCopied != 0) { 42098ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayNameSource = source; 42108ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayName = new String(mCharArrayBuffer.data, 0, 42118ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mCharArrayBuffer.sizeCopied); 42128ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticName = c.getString( 42138ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov RawContactNameQuery.ORGANIZATION_PHONETIC_NAME); 42148ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticNameStyle = 42158ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov c.isNull(RawContactNameQuery.ORGANIZATION_PHONETIC_NAME_STYLE) 42168ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov ? PhoneticNameStyle.UNDEFINED 42178ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov : c.getInt(RawContactNameQuery.ORGANIZATION_PHONETIC_NAME_STYLE); 42188ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else { 42198ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov c.copyStringToBuffer(RawContactNameQuery.TITLE, mCharArrayBuffer); 42208ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (mCharArrayBuffer.sizeCopied != 0) { 42218ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayNameSource = source; 42228ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayName = new String(mCharArrayBuffer.data, 0, 42238ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mCharArrayBuffer.sizeCopied); 42248ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticName = null; 42258ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticNameStyle = PhoneticNameStyle.UNDEFINED; 42268ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42278ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42288ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else { 42298ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov // Display name is at DATA1 in all other types. 42308ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov // This is ensured in the constructor. 42318ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 42328ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mCharArrayBuffer.sizeCopied = 0; 42338ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov c.copyStringToBuffer(RawContactNameQuery.DATA1, mCharArrayBuffer); 42348ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (mCharArrayBuffer.sizeCopied != 0) { 42358ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayNameSource = source; 42368ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayName = new String(mCharArrayBuffer.data, 0, 42378ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mCharArrayBuffer.sizeCopied); 42388ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticName = null; 42398ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticNameStyle = PhoneticNameStyle.UNDEFINED; 42408ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42418ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42428ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42438ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 42448ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } finally { 42458ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov c.close(); 42468ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42478ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 42488ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String displayNamePrimary; 42498ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String displayNameAlternative; 425055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov String sortNamePrimary; 425155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov String sortNameAlternative; 42528ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String sortKeyPrimary = null; 42538ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String sortKeyAlternative = null; 42548ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov int displayNameStyle = FullNameStyle.UNDEFINED; 42558ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 42568ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (bestDisplayNameSource == DisplayNameSources.STRUCTURED_NAME) { 42578ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle = bestName.fullNameStyle; 42588ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (displayNameStyle == FullNameStyle.CJK 42598ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov || displayNameStyle == FullNameStyle.UNDEFINED) { 42608ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle = mNameSplitter.getAdjustedFullNameStyle(displayNameStyle); 42618ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestName.fullNameStyle = displayNameStyle; 42628ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42638ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 426455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov displayNamePrimary = mNameSplitter.join(bestName, true, true); 426555e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov displayNameAlternative = mNameSplitter.join(bestName, false, true); 426655e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 426755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov if (TextUtils.isEmpty(bestName.prefix)) { 426855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNamePrimary = displayNamePrimary; 426955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNameAlternative = displayNameAlternative; 427055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } else { 427155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNamePrimary = mNameSplitter.join(bestName, true, false); 427255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNameAlternative = mNameSplitter.join(bestName, false, false); 427355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 42748ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 42758ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticName = mNameSplitter.joinPhoneticName(bestName); 42768ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticNameStyle = bestName.phoneticNameStyle; 42778ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else { 42788ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNamePrimary = displayNameAlternative = bestDisplayName; 427955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNamePrimary = sortNameAlternative = bestDisplayName; 42808ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42818ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 42828ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (bestPhoneticName != null) { 42838ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov sortKeyPrimary = sortKeyAlternative = bestPhoneticName; 42848ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (bestPhoneticNameStyle == PhoneticNameStyle.UNDEFINED) { 42858ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticNameStyle = mNameSplitter.guessPhoneticNameStyle(bestPhoneticName); 42868ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42878ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else { 42888ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (displayNameStyle == FullNameStyle.UNDEFINED) { 42898ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle = mNameSplitter.guessFullNameStyle(bestDisplayName); 42908ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (displayNameStyle == FullNameStyle.UNDEFINED 42918ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov || displayNameStyle == FullNameStyle.CJK) { 42928ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle = mNameSplitter.getAdjustedNameStyleBasedOnPhoneticNameStyle( 42938ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle, bestPhoneticNameStyle); 42948ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42958ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle = mNameSplitter.getAdjustedFullNameStyle(displayNameStyle); 42968ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 42978ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (displayNameStyle == FullNameStyle.CHINESE || 42988ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle == FullNameStyle.CJK) { 42998ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov sortKeyPrimary = sortKeyAlternative = 43008ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov ContactLocaleUtils.getIntance().getSortKey( 430155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNamePrimary, displayNameStyle); 43028ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 43038ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 43048ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 43058ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (sortKeyPrimary == null) { 430655e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortKeyPrimary = sortNamePrimary; 430755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortKeyAlternative = sortNameAlternative; 43088ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 43098ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 431078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mRawContactDisplayNameUpdate == null) { 431155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov mRawContactDisplayNameUpdate = db.compileStatement( 431278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.RAW_CONTACTS + 431378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + 431478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.DISPLAY_NAME_SOURCE + "=?," + 431578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.DISPLAY_NAME_PRIMARY + "=?," + 431678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.DISPLAY_NAME_ALTERNATIVE + "=?," + 431778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.PHONETIC_NAME + "=?," + 431878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.PHONETIC_NAME_STYLE + "=?," + 431978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.SORT_KEY_PRIMARY + "=?," + 432078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.SORT_KEY_ALTERNATIVE + "=?" + 432178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?"); 432278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 432355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 432455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov mRawContactDisplayNameUpdate.bindLong(1, bestDisplayNameSource); 432578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mRawContactDisplayNameUpdate, 2, displayNamePrimary); 432678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mRawContactDisplayNameUpdate, 3, displayNameAlternative); 432755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov bindString(mRawContactDisplayNameUpdate, 4, bestPhoneticName); 432855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov mRawContactDisplayNameUpdate.bindLong(5, bestPhoneticNameStyle); 432978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mRawContactDisplayNameUpdate, 6, sortKeyPrimary); 433078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mRawContactDisplayNameUpdate, 7, sortKeyAlternative); 433178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mRawContactDisplayNameUpdate.bindLong(8, rawContactId); 433278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mRawContactDisplayNameUpdate.execute(); 433378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 433478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 433578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /* 433678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Sets the given dataId record in the "data" table to primary, and resets all data records of 433778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * the same mimetype and under the same contact to not be primary. 433878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * 433978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * @param dataId the id of the data record to be set to primary. Pass -1 to clear the primary 434078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * flag of all data items of this raw contacts 434178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 434278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void setIsPrimary(long rawContactId, long dataId, long mimeTypeId) { 434378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mSetPrimaryStatement == null) { 434478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement = getWritableDatabase().compileStatement( 434578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.DATA + 434678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + Data.IS_PRIMARY + "=(_id=?)" + 434778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + DataColumns.MIMETYPE_ID + "=?" + 434878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " AND " + Data.RAW_CONTACT_ID + "=?"); 434978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 435078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement.bindLong(1, dataId); 435178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement.bindLong(2, mimeTypeId); 435278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement.bindLong(3, rawContactId); 435378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement.execute(); 435478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 435578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 435678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /* 435778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Clears the super primary of all data items of the given raw contact. does not touch 435878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * other raw contacts of the same joined aggregate 435978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 436078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void clearSuperPrimary(long rawContactId, long mimeTypeId) { 436178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mClearSuperPrimaryStatement == null) { 436278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mClearSuperPrimaryStatement = getWritableDatabase().compileStatement( 436378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.DATA + 436478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + Data.IS_SUPER_PRIMARY + "=0" + 436578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + DataColumns.MIMETYPE_ID + "=?" + 436678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " AND " + Data.RAW_CONTACT_ID + "=?"); 436778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 436878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mClearSuperPrimaryStatement.bindLong(1, mimeTypeId); 436978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mClearSuperPrimaryStatement.bindLong(2, rawContactId); 437078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mClearSuperPrimaryStatement.execute(); 437178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 437278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 437378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /* 437478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Sets the given dataId record in the "data" table to "super primary", and resets all data 437578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * records of the same mimetype and under the same aggregate to not be "super primary". 437678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * 437778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * @param dataId the id of the data record to be set to primary. 437878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 437978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void setIsSuperPrimary(long rawContactId, long dataId, long mimeTypeId) { 438078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mSetSuperPrimaryStatement == null) { 438178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement = getWritableDatabase().compileStatement( 438278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.DATA + 438378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + Data.IS_SUPER_PRIMARY + "=(" + Data._ID + "=?)" + 438478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + DataColumns.MIMETYPE_ID + "=?" + 438578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " AND " + Data.RAW_CONTACT_ID + " IN (" + 438678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + RawContacts._ID + 438778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 438878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + " =(" + 438978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + RawContacts.CONTACT_ID + 439078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 439178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?))"); 439278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 439378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement.bindLong(1, dataId); 439478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement.bindLong(2, mimeTypeId); 439578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement.bindLong(3, rawContactId); 439678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement.execute(); 439778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 439878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 439978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** 440078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Inserts a record in the {@link Tables#NAME_LOOKUP} table. 440178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 440278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void insertNameLookup(long rawContactId, long dataId, int lookupType, String name) { 440378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (TextUtils.isEmpty(name)) { 440478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov return; 440578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 440678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 440778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mNameLookupInsert == null) { 440878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert = getWritableDatabase().compileStatement( 440978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "INSERT OR IGNORE INTO " + Tables.NAME_LOOKUP + "(" 441078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + NameLookupColumns.RAW_CONTACT_ID + "," 441178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + NameLookupColumns.DATA_ID + "," 441278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + NameLookupColumns.NAME_TYPE + "," 441378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + NameLookupColumns.NORMALIZED_NAME 441478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + ") VALUES (?,?,?,?)"); 441578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 441678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert.bindLong(1, rawContactId); 441778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert.bindLong(2, dataId); 441878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert.bindLong(3, lookupType); 441978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mNameLookupInsert, 4, name); 442078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert.executeInsert(); 442178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 442278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 442378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** 442478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Deletes all {@link Tables#NAME_LOOKUP} table rows associated with the specified data element. 442578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 442678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void deleteNameLookup(long dataId) { 442778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mNameLookupDelete == null) { 442878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupDelete = getWritableDatabase().compileStatement( 442978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "DELETE FROM " + Tables.NAME_LOOKUP + 443078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + NameLookupColumns.DATA_ID + "=?"); 443178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 443278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupDelete.bindLong(1, dataId); 443378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupDelete.execute(); 443478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 4435189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov 4436e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov public String insertNameLookupForEmail(long rawContactId, long dataId, String email) { 4437e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov if (TextUtils.isEmpty(email)) { 4438e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov return null; 4439e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4440e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 4441e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov String address = extractHandleFromEmailAddress(email); 4442e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov if (address == null) { 4443e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov return null; 4444e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4445e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 4446e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov insertNameLookup(rawContactId, dataId, 4447e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov NameLookupType.EMAIL_BASED_NICKNAME, NameNormalizer.normalize(address)); 4448e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov return address; 4449e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4450e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 4451e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov /** 4452e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov * Normalizes the nickname and inserts it in the name lookup table. 4453e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov */ 4454e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov public void insertNameLookupForNickname(long rawContactId, long dataId, String nickname) { 4455e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov if (TextUtils.isEmpty(nickname)) { 4456e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov return; 4457e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4458e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 4459e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov insertNameLookup(rawContactId, dataId, 4460e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov NameLookupType.NICKNAME, NameNormalizer.normalize(nickname)); 4461e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4462e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 44635df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov public void insertNameLookupForPhoneticName(long rawContactId, long dataId, String familyName, 44645df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov String middleName, String givenName) { 44655df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov mSb.setLength(0); 44665df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov if (familyName != null) { 44675df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov mSb.append(familyName.trim()); 44685df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov } 44695df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov if (middleName != null) { 44705df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov mSb.append(middleName.trim()); 44715df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov } 44725df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov if (givenName != null) { 44735df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov mSb.append(givenName.trim()); 44745df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov } 44755df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov 44765df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov if (mSb.length() > 0) { 44775df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov insertNameLookup(rawContactId, dataId, NameLookupType.NAME_COLLATION_KEY, 44785df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov NameNormalizer.normalize(mSb.toString())); 44795df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov } 44805df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov } 44815df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov 4482189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov /** 4483189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov * Performs a query and returns true if any Data item of the raw contact with the given 4484189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov * id and mimetype is marked as super-primary 4485189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov */ 4486189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov public boolean rawContactHasSuperPrimary(long rawContactId, long mimeTypeId) { 4487189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov final Cursor existsCursor = getReadableDatabase().rawQuery( 4488189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov "SELECT EXISTS(SELECT 1 FROM " + Tables.DATA + 4489189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov " WHERE " + Data.RAW_CONTACT_ID + "=?" + 4490189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov " AND " + DataColumns.MIMETYPE_ID + "=?" + 4491189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov " AND " + Data.IS_SUPER_PRIMARY + "<>0)", 4492189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov new String[] { String.valueOf(rawContactId), String.valueOf(mimeTypeId) }); 4493189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov try { 4494189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov if (!existsCursor.moveToFirst()) throw new IllegalStateException(); 4495189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov return existsCursor.getInt(0) != 0; 4496189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov } finally { 4497189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov existsCursor.close(); 4498189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov } 4499189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov } 4500e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 4501e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov public String getCurrentCountryIso() { 4502e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov return mCountryMonitor.getCountryIso(); 4503e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4504f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 4505383d8aa53aa2f74a4b71642de7df2e4b9f2242c8Dmitri Plotnikov /* package */ String querySearchIndexContentForTest(long contactId) { 4506f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov return DatabaseUtils.stringForQuery(getReadableDatabase(), 4507f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov "SELECT " + SearchIndexColumns.CONTENT + 4508f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov " FROM " + Tables.SEARCH_INDEX + 4509f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov " WHERE " + SearchIndexColumns.CONTACT_ID + "=CAST(? AS int)", 4510f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov new String[] { String.valueOf(contactId) }); 4511f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 4512f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 4513383d8aa53aa2f74a4b71642de7df2e4b9f2242c8Dmitri Plotnikov /* package */ String querySearchIndexTokensForTest(long contactId) { 4514f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov return DatabaseUtils.stringForQuery(getReadableDatabase(), 4515f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov "SELECT " + SearchIndexColumns.TOKENS + 4516f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov " FROM " + Tables.SEARCH_INDEX + 4517f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov " WHERE " + SearchIndexColumns.CONTACT_ID + "=CAST(? AS int)", 4518f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov new String[] { String.valueOf(contactId) }); 4519f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 4520b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey} 4521