ContactsDatabaseHelper.java revision af10329f85c5d8c4196c495a9f0f9a6c6ecbc231
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; 61b2197b235e3d96e7f70c24d548b7dac52dab88d8Flavio Lerdaimport android.provider.ContactsContract.DisplayPhoto; 625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport android.provider.ContactsContract.FullNameStyle; 63ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkeyimport android.provider.ContactsContract.Groups; 648ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikovimport android.provider.ContactsContract.PhoneticNameStyle; 65f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport android.provider.ContactsContract.PhotoFiles; 66d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikovimport android.provider.ContactsContract.RawContacts; 67eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkeyimport android.provider.ContactsContract.Settings; 6882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikovimport android.provider.ContactsContract.StatusUpdates; 693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmannimport android.provider.ContactsContract.StreamItemPhotos; 70ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmannimport android.provider.ContactsContract.StreamItems; 7167dde51ab932dc84d95a203b113989b13437f13dJeff Sharkeyimport android.provider.SocialContract.Activities; 72069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjeeimport android.provider.VoicemailContract; 7359f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjeeimport android.provider.VoicemailContract.Voicemails; 74bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikovimport android.telephony.PhoneNumberUtils; 7536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikovimport android.text.TextUtils; 76b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikovimport android.text.util.Rfc822Token; 77b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikovimport android.text.util.Rfc822Tokenizer; 78b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkeyimport android.util.Log; 79b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 80b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkeyimport java.util.HashMap; 815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikovimport java.util.Locale; 82b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 83b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey/** 84b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov * Database helper for contacts. Designed as a singleton to make sure that all 85b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov * {@link android.content.ContentProvider} users get the same reference. 86b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov * Provides handy methods for maintaining package and mime-type lookup tables. 87b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 88b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov/* package */ class ContactsDatabaseHelper extends SQLiteOpenHelper { 89b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov private static final String TAG = "ContactsDatabaseHelper"; 90b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 9197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov /** 9294c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov * Contacts DB version ranges: 9397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * <pre> 9497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 0-98 Cupcake/Donut 9597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 100-199 Eclair 9697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 200-299 Eclair-MR1 9797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 300-349 Froyo 9897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 350-399 Gingerbread 9997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * 400-499 Honeycomb 10024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * 500-549 Honeycomb-MR1 10124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * 550-599 Honeycomb-MR2 10224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * 600-699 Ice Cream Sandwich 10397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov * </pre> 10497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov */ 105af10329f85c5d8c4196c495a9f0f9a6c6ecbc231Daniel Lehmann static final int DATABASE_VERSION = 616; 106e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 107b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private static final String DATABASE_NAME = "contacts2.db"; 1081f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey private static final String DATABASE_PRESENCE = "presence_db"; 109b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 110b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public interface Tables { 111d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONTACTS = "contacts"; 1125ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String RAW_CONTACTS = "raw_contacts"; 1133b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public static final String STREAM_ITEMS = "stream_items"; 1143b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public static final String STREAM_ITEM_PHOTOS = "stream_item_photos"; 115f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public static final String PHOTO_FILES = "photo_files"; 116ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String PACKAGES = "packages"; 117ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String MIMETYPES = "mimetypes"; 118b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String PHONE_LOOKUP = "phone_lookup"; 119a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public static final String NAME_LOOKUP = "name_lookup"; 120b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov public static final String AGGREGATION_EXCEPTIONS = "agg_exceptions"; 121eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey public static final String SETTINGS = "settings"; 122b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String DATA = "data"; 123ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String GROUPS = "groups"; 1241f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey public static final String PRESENCE = "presence"; 125e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov public static final String AGGREGATED_PRESENCE = "agg_presence"; 126b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov public static final String NICKNAME_LOOKUP = "nickname_lookup"; 127e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov public static final String CALLS = "calls"; 128a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov public static final String STATUS_UPDATES = "status_updates"; 129b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov public static final String PROPERTIES = "properties"; 130743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov public static final String ACCOUNTS = "accounts"; 1314394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov public static final String VISIBLE_CONTACTS = "visible_contacts"; 132d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov public static final String DIRECTORIES = "directories"; 133385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov public static final String DEFAULT_DIRECTORY = "default_directory"; 134f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov public static final String SEARCH_INDEX = "search_index"; 135069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee public static final String VOICEMAIL_STATUS = "voicemail_status"; 136b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 13746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** 13846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * For {@link ContactsContract.DataUsageFeedback}. The table structure itself 13946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * is not exposed outside. 14046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa */ 14146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String DATA_USAGE_STAT = "data_usage_stat"; 14246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 143ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String DATA_JOIN_MIMETYPES = "data " 1441b03c2d019966fba89dad3678dd9f04e4e5f4802Dmitri Plotnikov + "JOIN mimetypes ON (data.mimetype_id = mimetypes._id)"; 145b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 14611944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov public static final String DATA_JOIN_RAW_CONTACTS = "data " 1478e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov + "JOIN raw_contacts ON (data.raw_contact_id = raw_contacts._id)"; 14811944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov 1495ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String DATA_JOIN_MIMETYPE_RAW_CONTACTS = "data " 150c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + "JOIN mimetypes ON (data.mimetype_id = mimetypes._id) " 151c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + "JOIN raw_contacts ON (data.raw_contact_id = raw_contacts._id)"; 152bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 153e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey // NOTE: This requires late binding of GroupMembership MIME-type 154e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey public static final String RAW_CONTACTS_JOIN_SETTINGS_DATA_GROUPS = "raw_contacts " 155e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN settings ON (" 156e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "raw_contacts.account_name = settings.account_name AND " 157e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "raw_contacts.account_type = settings.account_type) " 158e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN data ON (data.mimetype_id=? AND " 159e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "data.raw_contact_id = raw_contacts._id) " 160e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN groups ON (groups._id = data." + GroupMembership.GROUP_ROW_ID 161e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + ")"; 162e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 163e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey // NOTE: This requires late binding of GroupMembership MIME-type 164e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey public static final String SETTINGS_JOIN_RAW_CONTACTS_DATA_MIMETYPES_CONTACTS = "settings " 165e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN raw_contacts ON (" 166e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "raw_contacts.account_name = settings.account_name AND " 167e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "raw_contacts.account_type = settings.account_type) " 168e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN data ON (data.mimetype_id=? AND " 169e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "data.raw_contact_id = raw_contacts._id) " 170e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + "LEFT OUTER JOIN contacts ON (raw_contacts.contact_id = contacts._id)"; 171e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 172f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa public static final String CONTACTS_JOIN_RAW_CONTACTS_DATA_FILTERED_BY_GROUPMEMBERSHIP = 173f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa Tables.CONTACTS 174f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa + " INNER JOIN " + Tables.RAW_CONTACTS 175f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa + " ON (" + RawContactsColumns.CONCRETE_CONTACT_ID + "=" 176f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa + ContactsColumns.CONCRETE_ID 177f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa + ")" 178f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa + " INNER JOIN " + Tables.DATA 179f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa + " ON (" + DataColumns.CONCRETE_DATA1 + "=" + GroupsColumns.CONCRETE_ID 180f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa + " AND " 181f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa + DataColumns.CONCRETE_RAW_CONTACT_ID + "=" + RawContactsColumns.CONCRETE_ID 182f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa + " AND " 183f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa + DataColumns.CONCRETE_MIMETYPE_ID + "=" 184f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa + "(SELECT " + MimetypesColumns._ID 185f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa + " FROM " + Tables.MIMETYPES 186f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa + " WHERE " 187f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa + MimetypesColumns.CONCRETE_MIMETYPE + "=" 188f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa + "'" + GroupMembership.CONTENT_ITEM_TYPE + "'" 189f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa + ")" 190f1efadb1255fd75305b59802f736905b9d66e449Daisuke Miyakawa + ")"; 191ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 1925ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String DATA_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_GROUPS = "data " 1931b03c2d019966fba89dad3678dd9f04e4e5f4802Dmitri Plotnikov + "JOIN mimetypes ON (data.mimetype_id = mimetypes._id) " 1941b03c2d019966fba89dad3678dd9f04e4e5f4802Dmitri Plotnikov + "JOIN raw_contacts ON (data.raw_contact_id = raw_contacts._id) " 19567dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey + "LEFT OUTER JOIN packages ON (data.package_id = packages._id) " 1969261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana + "LEFT OUTER JOIN groups " 1979261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana + " ON (mimetypes.mimetype='" + GroupMembership.CONTENT_ITEM_TYPE + "' " 1989261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana + " AND groups._id = data." + GroupMembership.GROUP_ROW_ID + ") "; 199ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 200ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String GROUPS_JOIN_PACKAGES = "groups " 201ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey + "LEFT OUTER JOIN packages ON (groups.package_id = packages._id)"; 202ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 203b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 204b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String ACTIVITIES = "activities"; 205b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 206ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String ACTIVITIES_JOIN_MIMETYPES = "activities " 207ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey + "LEFT OUTER JOIN mimetypes ON (activities.mimetype_id = mimetypes._id)"; 208b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 209d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String ACTIVITIES_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_CONTACTS = 2105ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov "activities " 21167dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey + "LEFT OUTER JOIN packages ON (activities.package_id = packages._id) " 212ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey + "LEFT OUTER JOIN mimetypes ON (activities.mimetype_id = mimetypes._id) " 2135ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + "LEFT OUTER JOIN raw_contacts ON (activities.author_contact_id = " + 214fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "raw_contacts._id) " 215d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + "LEFT OUTER JOIN contacts ON (raw_contacts.contact_id = contacts._id)"; 2167e4676dfcaa8853b81c2133e0e318ed3436fe787Fred Quintana 2175ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String NAME_LOOKUP_JOIN_RAW_CONTACTS = "name_lookup " 21803975f7ca8bb2f95ce95b6c694612c2524e91d13Dave Santoro + "INNER JOIN view_raw_contacts ON (name_lookup.raw_contact_id = " 21903975f7ca8bb2f95ce95b6c694612c2524e91d13Dave Santoro + "view_raw_contacts._id)"; 220b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 221b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 2224a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov public interface Views { 223ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann public static final String DATA = "view_data"; 224ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann public static final String RAW_CONTACTS = "view_raw_contacts"; 225ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann public static final String CONTACTS = "view_contacts"; 226a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public static final String ENTITIES = "view_entities"; 227a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov public static final String RAW_ENTITIES = "view_raw_entities"; 228ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann public static final String GROUPS = "view_groups"; 229ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann public static final String DATA_USAGE_STAT = "view_data_usage_stat"; 2309b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann public static final String STREAM_ITEMS = "view_stream_items"; 2314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 2324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 2331f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey public interface Clauses { 23468936cefd4caa779169ea00ffd1adc399e634c9bJeff Sharkey final String HAVING_NO_GROUPS = "COUNT(" + DataColumns.CONCRETE_GROUP_ID + ") == 0"; 2359261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 23668936cefd4caa779169ea00ffd1adc399e634c9bJeff Sharkey final String GROUP_BY_ACCOUNT_CONTACT_ID = SettingsColumns.CONCRETE_ACCOUNT_NAME + "," 23768936cefd4caa779169ea00ffd1adc399e634c9bJeff Sharkey + SettingsColumns.CONCRETE_ACCOUNT_TYPE + "," + RawContacts.CONTACT_ID; 238e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 239e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey final String RAW_CONTACT_IS_LOCAL = RawContactsColumns.CONCRETE_ACCOUNT_NAME 24043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + " IS NULL AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " IS NULL AND " 24143368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + RawContactsColumns.CONCRETE_DATA_SET + " IS NULL"; 242e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 243e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey final String ZERO_GROUP_MEMBERSHIPS = "COUNT(" + GroupsColumns.CONCRETE_ID + ")=0"; 244e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 2451a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final String OUTER_RAW_CONTACTS = "outer_raw_contacts"; 2461a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final String OUTER_RAW_CONTACTS_ID = OUTER_RAW_CONTACTS + "." + RawContacts._ID; 2471a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 248b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov final String CONTACT_IS_VISIBLE = 249b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov "SELECT " + 2501a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey "MAX((SELECT (CASE WHEN " + 251b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov "(CASE" + 252b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " WHEN " + RAW_CONTACT_IS_LOCAL + 253b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " THEN 1 " + 254b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " WHEN " + ZERO_GROUP_MEMBERSHIPS + 255b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " THEN " + Settings.UNGROUPED_VISIBLE + 256b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " ELSE MAX(" + Groups.GROUP_VISIBLE + ")" + 257b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov "END)=1 THEN 1 ELSE 0 END)" + 258b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS_JOIN_SETTINGS_DATA_GROUPS + 2591a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey " WHERE " + RawContactsColumns.CONCRETE_ID + "=" + OUTER_RAW_CONTACTS_ID + "))" + 2601a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey " FROM " + Tables.RAW_CONTACTS + " AS " + OUTER_RAW_CONTACTS + 261b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID + 262b3ce7aaa2390698c9424d17df4d2979dcd902cfdDmitri Plotnikov " GROUP BY " + RawContacts.CONTACT_ID; 263e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 264e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey final String GROUP_HAS_ACCOUNT_AND_SOURCE_ID = Groups.SOURCE_ID + "=? AND " 26543368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + Groups.ACCOUNT_NAME + "=? AND " + Groups.ACCOUNT_TYPE + "=? AND " 26643368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + Groups.DATA_SET + " IS NULL"; 26743368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro 26843368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro final String GROUP_HAS_ACCOUNT_AND_DATA_SET_AND_SOURCE_ID = Groups.SOURCE_ID + "=? AND " 26943368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + Groups.ACCOUNT_NAME + "=? AND " + Groups.ACCOUNT_TYPE + "=? AND " 27043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + Groups.DATA_SET + "=?"; 2714394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 2724394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov public static final String CONTACT_VISIBLE = 2734394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "EXISTS (SELECT _id FROM " + Tables.VISIBLE_CONTACTS 2744394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov + " WHERE " + Tables.CONTACTS +"." + Contacts._ID 2754394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov + "=" + Tables.VISIBLE_CONTACTS +"." + Contacts._ID + ")"; 2761f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey } 2771f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey 278d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public interface ContactsColumns { 279a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov public static final String LAST_STATUS_UPDATE_ID = "status_update_id"; 280a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 281d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_ID = Tables.CONTACTS + "." + BaseColumns._ID; 28267dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey 283f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public static final String CONCRETE_PHOTO_FILE_ID = Tables.CONTACTS + "." 284f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + Contacts.PHOTO_FILE_ID; 285d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_TIMES_CONTACTED = Tables.CONTACTS + "." 286d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + Contacts.TIMES_CONTACTED; 287d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_LAST_TIME_CONTACTED = Tables.CONTACTS + "." 288d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + Contacts.LAST_TIME_CONTACTED; 289d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_STARRED = Tables.CONTACTS + "." + Contacts.STARRED; 290d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_CUSTOM_RINGTONE = Tables.CONTACTS + "." 291d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + Contacts.CUSTOM_RINGTONE; 292d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_SEND_TO_VOICEMAIL = Tables.CONTACTS + "." 293d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + Contacts.SEND_TO_VOICEMAIL; 2942d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill public static final String CONCRETE_LOOKUP_KEY = Tables.CONTACTS + "." 2952d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill + Contacts.LOOKUP_KEY; 296619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } 297619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey 2986cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov public interface RawContactsColumns { 29933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov public static final String CONCRETE_ID = 3005ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + BaseColumns._ID; 3019261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana public static final String CONCRETE_ACCOUNT_NAME = 3025ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_NAME; 3039261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana public static final String CONCRETE_ACCOUNT_TYPE = 3045ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_TYPE; 30543368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro public static final String CONCRETE_DATA_SET = 30643368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Tables.RAW_CONTACTS + "." + RawContacts.DATA_SET; 30743368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro public static final String CONCRETE_ACCOUNT_TYPE_AND_DATA_SET = 30843368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Tables.RAW_CONTACTS + "." + RawContacts.ACCOUNT_TYPE_AND_DATA_SET; 30933b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov public static final String CONCRETE_SOURCE_ID = 3105ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.SOURCE_ID; 31133b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov public static final String CONCRETE_VERSION = 3125ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.VERSION; 31333b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov public static final String CONCRETE_DIRTY = 3145ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.DIRTY; 31533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov public static final String CONCRETE_DELETED = 3165ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.DELETED; 3177a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana public static final String CONCRETE_SYNC1 = 3187a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana Tables.RAW_CONTACTS + "." + RawContacts.SYNC1; 3197a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana public static final String CONCRETE_SYNC2 = 3207a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana Tables.RAW_CONTACTS + "." + RawContacts.SYNC2; 3217a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana public static final String CONCRETE_SYNC3 = 3227a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana Tables.RAW_CONTACTS + "." + RawContacts.SYNC3; 3237a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana public static final String CONCRETE_SYNC4 = 3247a4550f2afb24b2112b6c937f416c6f46ece35f4Fred Quintana Tables.RAW_CONTACTS + "." + RawContacts.SYNC4; 32524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public static final String CONCRETE_CUSTOM_RINGTONE = 32624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Tables.RAW_CONTACTS + "." + RawContacts.CUSTOM_RINGTONE; 32724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public static final String CONCRETE_SEND_TO_VOICEMAIL = 32824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Tables.RAW_CONTACTS + "." + RawContacts.SEND_TO_VOICEMAIL; 32924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public static final String CONCRETE_LAST_TIME_CONTACTED = 33024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Tables.RAW_CONTACTS + "." + RawContacts.LAST_TIME_CONTACTED; 33124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public static final String CONCRETE_TIMES_CONTACTED = 33224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Tables.RAW_CONTACTS + "." + RawContacts.TIMES_CONTACTED; 333c76d0a78fe2d3471195cfa555bab016eec154f07Jeff Sharkey public static final String CONCRETE_STARRED = 334c76d0a78fe2d3471195cfa555bab016eec154f07Jeff Sharkey Tables.RAW_CONTACTS + "." + RawContacts.STARRED; 3358e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 3365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public static final String DISPLAY_NAME = RawContacts.DISPLAY_NAME_PRIMARY; 3375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov public static final String DISPLAY_NAME_SOURCE = RawContacts.DISPLAY_NAME_SOURCE; 3388e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov public static final String AGGREGATION_NEEDED = "aggregation_needed"; 339fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 340fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov public static final String CONCRETE_DISPLAY_NAME = 341fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Tables.RAW_CONTACTS + "." + DISPLAY_NAME; 342fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov public static final String CONCRETE_CONTACT_ID = 343fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.CONTACT_ID; 344f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov public static final String CONCRETE_NAME_VERIFIED = 345f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov Tables.RAW_CONTACTS + "." + RawContacts.NAME_VERIFIED; 346619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } 347619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey 348619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey public interface DataColumns { 34967dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey public static final String PACKAGE_ID = "package_id"; 350b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String MIMETYPE_ID = "mimetype_id"; 351ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 352ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String CONCRETE_ID = Tables.DATA + "." + BaseColumns._ID; 353226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana public static final String CONCRETE_MIMETYPE_ID = Tables.DATA + "." + MIMETYPE_ID; 354d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public static final String CONCRETE_RAW_CONTACT_ID = Tables.DATA + "." 355d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov + Data.RAW_CONTACT_ID; 356ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String CONCRETE_GROUP_ID = Tables.DATA + "." 357ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey + GroupMembership.GROUP_ROW_ID; 358e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 359e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA1 = Tables.DATA + "." + Data.DATA1; 360e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA2 = Tables.DATA + "." + Data.DATA2; 361e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA3 = Tables.DATA + "." + Data.DATA3; 362e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA4 = Tables.DATA + "." + Data.DATA4; 363e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA5 = Tables.DATA + "." + Data.DATA5; 364e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA6 = Tables.DATA + "." + Data.DATA6; 365e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA7 = Tables.DATA + "." + Data.DATA7; 366e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA8 = Tables.DATA + "." + Data.DATA8; 367e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA9 = Tables.DATA + "." + Data.DATA9; 368e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_DATA10 = Tables.DATA + "." + Data.DATA10; 3690f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String CONCRETE_DATA11 = Tables.DATA + "." + Data.DATA11; 3700f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String CONCRETE_DATA12 = Tables.DATA + "." + Data.DATA12; 3710f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String CONCRETE_DATA13 = Tables.DATA + "." + Data.DATA13; 3720f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String CONCRETE_DATA14 = Tables.DATA + "." + Data.DATA14; 3730f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String CONCRETE_DATA15 = Tables.DATA + "." + Data.DATA15; 374e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_IS_PRIMARY = Tables.DATA + "." + Data.IS_PRIMARY; 375226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana public static final String CONCRETE_PACKAGE_ID = Tables.DATA + "." + PACKAGE_ID; 376e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov } 377e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov 3780f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov // Used only for legacy API support 3790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public interface ExtensionsColumns { 3800f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String NAME = Data.DATA1; 3810f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String VALUE = Data.DATA2; 3820f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 3830f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 3840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public interface GroupMembershipColumns { 3855ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String RAW_CONTACT_ID = Data.RAW_CONTACT_ID; 3860f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov public static final String GROUP_ROW_ID = GroupMembership.GROUP_ROW_ID; 3870f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov } 3880f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov 389e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public interface PhoneColumns { 390e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String NORMALIZED_NUMBER = Data.DATA4; 391e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov public static final String CONCRETE_NORMALIZED_NUMBER = DataColumns.CONCRETE_DATA4; 392ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } 393ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 394ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public interface GroupsColumns { 39567dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey public static final String PACKAGE_ID = "package_id"; 39667dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey 397ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String CONCRETE_ID = Tables.GROUPS + "." + BaseColumns._ID; 39867dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey public static final String CONCRETE_SOURCE_ID = Tables.GROUPS + "." + Groups.SOURCE_ID; 3991cdfc9dacc136e99d3c0bc5b4212bc3c973be337Daniel Lehmann public static final String CONCRETE_ACCOUNT_NAME = 4001cdfc9dacc136e99d3c0bc5b4212bc3c973be337Daniel Lehmann Tables.GROUPS + "." + Groups.ACCOUNT_NAME; 4011cdfc9dacc136e99d3c0bc5b4212bc3c973be337Daniel Lehmann public static final String CONCRETE_ACCOUNT_TYPE = 4021cdfc9dacc136e99d3c0bc5b4212bc3c973be337Daniel Lehmann Tables.GROUPS + "." + Groups.ACCOUNT_TYPE; 40343368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro public static final String CONCRETE_DATA_SET = Tables.GROUPS + "." + Groups.DATA_SET; 40443368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro public static final String CONCRETE_ACCOUNT_TYPE_AND_DATA_SET = Tables.GROUPS + "." + 40543368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.ACCOUNT_TYPE_AND_DATA_SET; 406341e4621f2ee7614c66bc25dd3da70eaaa866b46Jeff Sharkey } 407b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 408b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public interface ActivitiesColumns { 409b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String PACKAGE_ID = "package_id"; 410b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String MIMETYPE_ID = "mimetype_id"; 411b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 412b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 413b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public interface PhoneLookupColumns { 414b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String _ID = BaseColumns._ID; 415b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String DATA_ID = "data_id"; 4165ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String RAW_CONTACT_ID = "raw_contact_id"; 417b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String NORMALIZED_NUMBER = "normalized_number"; 41836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov public static final String MIN_MATCH = "min_match"; 419b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 420b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 421a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public interface NameLookupColumns { 4225ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public static final String RAW_CONTACT_ID = "raw_contact_id"; 42314bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov public static final String DATA_ID = "data_id"; 424a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public static final String NORMALIZED_NAME = "normalized_name"; 425a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public static final String NAME_TYPE = "name_type"; 426a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov } 427a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 428a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public final static class NameLookupType { 4292a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov public static final int NAME_EXACT = 0; 4302a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov public static final int NAME_VARIANT = 1; 4312a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov public static final int NAME_COLLATION_KEY = 2; 4322a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov public static final int NICKNAME = 3; 4332a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov public static final int EMAIL_BASED_NICKNAME = 4; 434a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 435a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov // This is the highest name lookup type code plus one 43692ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov public static final int TYPE_COUNT = 5; 437a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov 438a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov public static boolean isBasedOnStructuredName(int nameLookupType) { 4392a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov return nameLookupType == NameLookupType.NAME_EXACT 4402a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov || nameLookupType == NameLookupType.NAME_VARIANT 4412a03d9c2bf627795963561a0f9406b23dc93fec5Dmitri Plotnikov || nameLookupType == NameLookupType.NAME_COLLATION_KEY; 442a5ad551e1753086825499f1aeb6415bb986f3588Dmitri Plotnikov } 443a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov } 444a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 445ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public interface PackagesColumns { 446b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String _ID = BaseColumns._ID; 447b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String PACKAGE = "package"; 448226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana 449226c3dc6e93ca76a84c99100caa31045cba06cf6Fred Quintana public static final String CONCRETE_ID = Tables.PACKAGES + "." + _ID; 450b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 451b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 452ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public interface MimetypesColumns { 453b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String _ID = BaseColumns._ID; 454b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public static final String MIMETYPE = "mimetype"; 455ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 456ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String CONCRETE_ID = Tables.MIMETYPES + "." + BaseColumns._ID; 457ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String CONCRETE_MIMETYPE = Tables.MIMETYPES + "." + MIMETYPE; 458b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 459b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 460b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov public interface AggregationExceptionColumns { 461b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov public static final String _ID = BaseColumns._ID; 462b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov } 463b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 464b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov public interface NicknameLookupColumns { 465b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov public static final String NAME = "name"; 466b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov public static final String CLUSTER = "cluster"; 467b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 468b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 469e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey public interface SettingsColumns { 470e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey public static final String CONCRETE_ACCOUNT_NAME = Tables.SETTINGS + "." 471e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + Settings.ACCOUNT_NAME; 472e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey public static final String CONCRETE_ACCOUNT_TYPE = Tables.SETTINGS + "." 473e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey + Settings.ACCOUNT_TYPE; 474e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey } 475e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey 4764dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov public interface PresenceColumns { 4774dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov String RAW_CONTACT_ID = "presence_raw_contact_id"; 478bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov String CONTACT_ID = "presence_contact_id"; 4794dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov } 4804dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov 481e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov public interface AggregatedPresenceColumns { 482e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov String CONTACT_ID = "presence_contact_id"; 4833296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 4843296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_CONTACT_ID = Tables.AGGREGATED_PRESENCE + "." + CONTACT_ID; 485e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov } 486e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov 487a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov public interface StatusUpdatesColumns { 488a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov String DATA_ID = "status_update_data_id"; 4893296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 4903296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_DATA_ID = Tables.STATUS_UPDATES + "." + DATA_ID; 4913296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 4923296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_PRESENCE = Tables.STATUS_UPDATES + "." + StatusUpdates.PRESENCE; 4933296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS = Tables.STATUS_UPDATES + "." + StatusUpdates.STATUS; 4943296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_TIMESTAMP = Tables.STATUS_UPDATES + "." 4953296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey + StatusUpdates.STATUS_TIMESTAMP; 4963296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_RES_PACKAGE = Tables.STATUS_UPDATES + "." 4973296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey + StatusUpdates.STATUS_RES_PACKAGE; 4983296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_LABEL = Tables.STATUS_UPDATES + "." + StatusUpdates.STATUS_LABEL; 4993296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_ICON = Tables.STATUS_UPDATES + "." + StatusUpdates.STATUS_ICON; 5003296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey } 5013296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 5023296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey public interface ContactsStatusUpdatesColumns { 5033296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String ALIAS = "contacts_" + Tables.STATUS_UPDATES; 5043296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 5053296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_DATA_ID = ALIAS + "." + StatusUpdatesColumns.DATA_ID; 5063296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey 5073296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_PRESENCE = ALIAS + "." + StatusUpdates.PRESENCE; 5083296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS = ALIAS + "." + StatusUpdates.STATUS; 5093296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_TIMESTAMP = ALIAS + "." + StatusUpdates.STATUS_TIMESTAMP; 5103296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_RES_PACKAGE = ALIAS + "." + StatusUpdates.STATUS_RES_PACKAGE; 5113296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_LABEL = ALIAS + "." + StatusUpdates.STATUS_LABEL; 5123296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey String CONCRETE_STATUS_ICON = ALIAS + "." + StatusUpdates.STATUS_ICON; 513a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov } 514a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 5153b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public interface StreamItemsColumns { 5160bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_ID = Tables.STREAM_ITEMS + "." + BaseColumns._ID; 5170bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_RAW_CONTACT_ID = 5180bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann Tables.STREAM_ITEMS + "." + StreamItems.RAW_CONTACT_ID; 5190bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_PACKAGE = Tables.STREAM_ITEMS + "." + StreamItems.RES_PACKAGE; 5200bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_ICON = Tables.STREAM_ITEMS + "." + StreamItems.RES_ICON; 5210bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_LABEL = Tables.STREAM_ITEMS + "." + StreamItems.RES_LABEL; 5220bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_TEXT = Tables.STREAM_ITEMS + "." + StreamItems.TEXT; 5230bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_TIMESTAMP = Tables.STREAM_ITEMS + "." + StreamItems.TIMESTAMP; 5240bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_COMMENTS = Tables.STREAM_ITEMS + "." + StreamItems.COMMENTS; 5250bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_SYNC1 = Tables.STREAM_ITEMS + "." + StreamItems.SYNC1; 5260bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_SYNC2 = Tables.STREAM_ITEMS + "." + StreamItems.SYNC2; 5270bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_SYNC3 = Tables.STREAM_ITEMS + "." + StreamItems.SYNC3; 5280bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_SYNC4 = Tables.STREAM_ITEMS + "." + StreamItems.SYNC4; 5293b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 5303b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 5313b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann public interface StreamItemPhotosColumns { 5320bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_ID = Tables.STREAM_ITEM_PHOTOS + "." + BaseColumns._ID; 5330bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_STREAM_ITEM_ID = Tables.STREAM_ITEM_PHOTOS + "." 5343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann + StreamItemPhotos.STREAM_ITEM_ID; 5350bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_SORT_INDEX = 5360bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann Tables.STREAM_ITEM_PHOTOS + "." + StreamItemPhotos.SORT_INDEX; 5370bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_PHOTO_FILE_ID = Tables.STREAM_ITEM_PHOTOS + "." 5386802030a777c0c3ba1dc029c534cca4784260632Dave Santoro + StreamItemPhotos.PHOTO_FILE_ID; 5390bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_SYNC1 = Tables.STREAM_ITEM_PHOTOS + "." + StreamItemPhotos.SYNC1; 5400bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_SYNC2 = Tables.STREAM_ITEM_PHOTOS + "." + StreamItemPhotos.SYNC2; 5410bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_SYNC3 = Tables.STREAM_ITEM_PHOTOS + "." + StreamItemPhotos.SYNC3; 5420bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann final String CONCRETE_SYNC4 = Tables.STREAM_ITEM_PHOTOS + "." + StreamItemPhotos.SYNC4; 5433b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 5443b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 545f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro public interface PhotoFilesColumns { 546f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String CONCRETE_ID = Tables.PHOTO_FILES + "." + BaseColumns._ID; 547f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String CONCRETE_HEIGHT = Tables.PHOTO_FILES + "." + PhotoFiles.HEIGHT; 548f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String CONCRETE_WIDTH = Tables.PHOTO_FILES + "." + PhotoFiles.WIDTH; 549f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro String CONCRETE_FILESIZE = Tables.PHOTO_FILES + "." + PhotoFiles.FILESIZE; 550f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 551f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 552b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov public interface PropertiesColumns { 553b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov String PROPERTY_KEY = "property_key"; 554b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov String PROPERTY_VALUE = "property_value"; 555b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 556b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 55724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro public interface AccountsColumns { 55824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String ACCOUNT_NAME = RawContacts.ACCOUNT_NAME; 55924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String ACCOUNT_TYPE = RawContacts.ACCOUNT_TYPE; 56043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro String DATA_SET = RawContacts.DATA_SET; 56124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro String PROFILE_RAW_CONTACT_ID = "profile_raw_contact_id"; 56224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 56324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 564e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov public static final class DirectoryColumns { 565e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov public static final String TYPE_RESOURCE_NAME = "typeResourceName"; 566e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov } 567e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov 568f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov public static final class SearchIndexColumns { 569f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov public static final String CONTACT_ID = "contact_id"; 570f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov public static final String CONTENT = "content"; 571155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov public static final String NAME = "name"; 572f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov public static final String TOKENS = "tokens"; 573f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 574f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 57546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** 57646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * Private table for calculating per-contact-method ranking. 57746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa */ 57846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final class DataUsageStatColumns { 57946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** type: INTEGER (long) */ 58046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String _ID = "stat_id"; 58146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String CONCRETE_ID = Tables.DATA_USAGE_STAT + "." + _ID; 58246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 58346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** type: INTEGER (long) */ 58446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String DATA_ID = "data_id"; 58546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String CONCRETE_DATA_ID = Tables.DATA_USAGE_STAT + "." + DATA_ID; 58646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 58746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** type: INTEGER (long) */ 58846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String LAST_TIME_USED = "last_time_used"; 58946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String CONCRETE_LAST_TIME_USED = 59046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Tables.DATA_USAGE_STAT + "." + LAST_TIME_USED; 59146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 59246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** type: INTEGER */ 59346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String TIMES_USED = "times_used"; 59446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String CONCRETE_TIMES_USED = 59546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Tables.DATA_USAGE_STAT + "." + TIMES_USED; 59646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 59746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** type: INTEGER */ 59846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String USAGE_TYPE_INT = "usage_type"; 59946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final String CONCRETE_USAGE_TYPE = 60046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Tables.DATA_USAGE_STAT + "." + USAGE_TYPE_INT; 60146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 60246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa /** 60346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * Integer values for USAGE_TYPE. 60446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * 60546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa * @see ContactsContract.DataUsageFeedback#USAGE_TYPE 60646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa */ 60746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final int USAGE_TYPE_INT_CALL = 0; 60846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final int USAGE_TYPE_INT_LONG_TEXT = 1; 60946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa public static final int USAGE_TYPE_INT_SHORT_TEXT = 2; 61046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa } 61146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 6123296d3469bce0041a6cefc44d0486a2a7d0c9f82Jeff Sharkey /** In-memory cache of previously found MIME-type mappings */ 613bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov private final HashMap<String, Long> mMimetypeCache = new HashMap<String, Long>(); 614b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** In-memory cache of previously found package name mappings */ 615bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov private final HashMap<String, Long> mPackageCache = new HashMap<String, Long>(); 616b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 6172a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdEmail; 6182a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdIm; 619a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov private long mMimeTypeIdSip; 6202a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdStructuredName; 6212a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdOrganization; 6222a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdNickname; 6232a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private long mMimeTypeIdPhone; 624b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 625b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** Compiled statements for querying and inserting mappings */ 626b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mMimetypeQuery; 627b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mPackageQuery; 628d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov private SQLiteStatement mContactIdQuery; 629f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov private SQLiteStatement mAggregationModeQuery; 630b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mMimetypeInsert; 631b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mPackageInsert; 632b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mDataMimetypeQuery; 633b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey private SQLiteStatement mActivitiesMimetypeQuery; 634b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 63578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** Precompiled sql statement for setting a data record to the primary. */ 63678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mSetPrimaryStatement; 63778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** Precompiled sql statement for setting a data record to the super primary. */ 63878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mSetSuperPrimaryStatement; 63978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** Precompiled sql statement for clearing super primary of a single record. */ 64078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mClearSuperPrimaryStatement; 64178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** Precompiled sql statement for updating a contact display name */ 64278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mRawContactDisplayNameUpdate; 64378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 64478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mNameLookupInsert; 64578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mNameLookupDelete; 64678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mStatusUpdateAutoTimestamp; 64778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mStatusUpdateInsert; 64878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mStatusUpdateReplace; 64978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mStatusAttributionUpdate; 65078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mStatusUpdateDelete; 65178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private SQLiteStatement mResetNameVerifiedForOtherRawContacts; 652f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov private SQLiteStatement mContactInDefaultDirectoryQuery; 65378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 654b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov private final Context mContext; 6552a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private final boolean mDatabaseOptimizationEnabled; 65635ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana private final SyncStateContentProviderHelper mSyncState; 657e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov private final CountryMonitor mCountryMonitor; 6585df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov private StringBuilder mSb = new StringBuilder(); 659f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov 660f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov private boolean mReopenDatabase = false; 661f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 662b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov private static ContactsDatabaseHelper sSingleton = null; 663b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 66436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov private boolean mUseStrictPhoneNumberComparison; 6653a6a49cfb06272e3e25f3c390a9cf4002da6e34dDaisuke Miyakawa 6668ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov private String[] mSelectionArgs1 = new String[1]; 6678ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov private NameSplitter.Name mName = new NameSplitter.Name(); 6688ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov private CharArrayBuffer mCharArrayBuffer = new CharArrayBuffer(128); 6698ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov private NameSplitter mNameSplitter; 670f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 671b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov public static synchronized ContactsDatabaseHelper getInstance(Context context) { 672b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey if (sSingleton == null) { 6732a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov sSingleton = new ContactsDatabaseHelper(context, DATABASE_NAME, true); 674b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 675b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return sSingleton; 676b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 677b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 6781f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey /** 67931b86315536573a72dc7fff1baac3b314e5a04c3Dmitri Plotnikov * Private constructor, callers except unit tests should obtain an instance through 68035ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana * {@link #getInstance(android.content.Context)} instead. 6811f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey */ 682b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov ContactsDatabaseHelper(Context context) { 6832a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov this(context, null, false); 6842a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 6852a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 6862a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private ContactsDatabaseHelper( 6872a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov Context context, String databaseName, boolean optimizationEnabled) { 6882a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov super(context, databaseName, null, DATABASE_VERSION); 6892a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mDatabaseOptimizationEnabled = optimizationEnabled; 690d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton Resources resources = context.getResources(); 691619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey 692b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov mContext = context; 69328b3769e3fcecae56c3fc70cbcb0f95282b9640eFred Quintana mSyncState = new SyncStateContentProviderHelper(); 694e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov mCountryMonitor = new CountryMonitor(context); 69536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov mUseStrictPhoneNumberComparison = 696d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton resources.getBoolean( 697d91272b48f97243533c6580981e12a4847b5783fJeff Hamilton com.android.internal.R.bool.config_use_strict_phone_number_comparation); 698b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 699b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 7002a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov private void refreshDatabaseCaches(SQLiteDatabase db) { 70178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateDelete = null; 70278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateReplace = null; 70378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateInsert = null; 70478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateAutoTimestamp = null; 70578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusAttributionUpdate = null; 70678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mResetNameVerifiedForOtherRawContacts = null; 70778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mRawContactDisplayNameUpdate = null; 70878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement = null; 70978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mClearSuperPrimaryStatement = null; 71078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement = null; 71178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert = null; 71278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupDelete = null; 71378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mPackageQuery = null; 71478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mPackageInsert = null; 71578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mDataMimetypeQuery = null; 71678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mActivitiesMimetypeQuery = null; 71778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mContactIdQuery = null; 71878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mAggregationModeQuery = null; 719f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov mContactInDefaultDirectoryQuery = null; 7202a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 72155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov populateMimeTypeCache(db); 72255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 72355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 72455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov private void populateMimeTypeCache(SQLiteDatabase db) { 7252a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimetypeCache.clear(); 7262a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mPackageCache.clear(); 7272a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 7282a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimetypeQuery = db.compileStatement( 7292a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov "SELECT " + MimetypesColumns._ID + 7302a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov " FROM " + Tables.MIMETYPES + 7312a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov " WHERE " + MimetypesColumns.MIMETYPE + "=?"); 7322a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 7332a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimetypeInsert = db.compileStatement( 7342a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov "INSERT INTO " + Tables.MIMETYPES + "(" 7352a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov + MimetypesColumns.MIMETYPE + 7362a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov ") VALUES (?)"); 7372a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 7382a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdEmail = getMimeTypeId(Email.CONTENT_ITEM_TYPE); 7392a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdIm = getMimeTypeId(Im.CONTENT_ITEM_TYPE); 740a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov mMimeTypeIdSip = getMimeTypeId(SipAddress.CONTENT_ITEM_TYPE); 7412a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdStructuredName = getMimeTypeId(StructuredName.CONTENT_ITEM_TYPE); 7422a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdOrganization = getMimeTypeId(Organization.CONTENT_ITEM_TYPE); 7432a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdNickname = getMimeTypeId(Nickname.CONTENT_ITEM_TYPE); 7442a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mMimeTypeIdPhone = getMimeTypeId(Phone.CONTENT_ITEM_TYPE); 74578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 74678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 747b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey @Override 748b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public void onOpen(SQLiteDatabase db) { 7492a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov refreshDatabaseCaches(db); 75035ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana 75178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSyncState.onDatabaseOpened(db); 7521f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey 7531f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey db.execSQL("ATTACH DATABASE ':memory:' AS " + DATABASE_PRESENCE + ";"); 754e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov db.execSQL("CREATE TABLE IF NOT EXISTS " + DATABASE_PRESENCE + "." + Tables.PRESENCE + " ("+ 75582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.DATA_ID + " INTEGER PRIMARY KEY REFERENCES data(_id)," + 75682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.PROTOCOL + " INTEGER NOT NULL," + 75782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.CUSTOM_PROTOCOL + " TEXT," + 75882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.IM_HANDLE + " TEXT," + 75982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.IM_ACCOUNT + " TEXT," + 760a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov PresenceColumns.CONTACT_ID + " INTEGER REFERENCES contacts(_id)," + 761a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov PresenceColumns.RAW_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)," + 76282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov StatusUpdates.PRESENCE + " INTEGER," + 763aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CHAT_CAPABILITY + " INTEGER NOT NULL DEFAULT 0," + 76482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov "UNIQUE(" + StatusUpdates.PROTOCOL + ", " + StatusUpdates.CUSTOM_PROTOCOL 76582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov + ", " + StatusUpdates.IM_HANDLE + ", " + StatusUpdates.IM_ACCOUNT + ")" + 7661f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey ");"); 7671f42f1958113b2dadc6cf26b51192b42f883f3b0Jeff Sharkey 768e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov db.execSQL("CREATE INDEX IF NOT EXISTS " + DATABASE_PRESENCE + ".presenceIndex" + " ON " 7694dcd106ccc27dbbfaae86baf0cd57beb42c27cccDmitri Plotnikov + Tables.PRESENCE + " (" + PresenceColumns.RAW_CONTACT_ID + ");"); 77009562b6c3a420ded0d02b9bd2290de2dbab9e304Vasu Nori db.execSQL("CREATE INDEX IF NOT EXISTS " + DATABASE_PRESENCE + ".presenceIndex2" + " ON " 77109562b6c3a420ded0d02b9bd2290de2dbab9e304Vasu Nori + Tables.PRESENCE + " (" + PresenceColumns.CONTACT_ID + ");"); 772e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov 773e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov db.execSQL("CREATE TABLE IF NOT EXISTS " 774aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori + DATABASE_PRESENCE + "." + Tables.AGGREGATED_PRESENCE + " ("+ 775e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov AggregatedPresenceColumns.CONTACT_ID 776e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov + " INTEGER PRIMARY KEY REFERENCES contacts(_id)," + 777632248ae0053fa99b1f5b4cfaab3e55b7453fcb1Vasu Nori StatusUpdates.PRESENCE + " INTEGER," + 778aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori StatusUpdates.CHAT_CAPABILITY + " INTEGER NOT NULL DEFAULT 0" + 779e46667e641cd1c60998e1ccab4b60531d5b12ef7Dmitri Plotnikov ");"); 780bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 781bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 782bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov db.execSQL("CREATE TRIGGER " + DATABASE_PRESENCE + "." + Tables.PRESENCE + "_deleted" 783bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " BEFORE DELETE ON " + DATABASE_PRESENCE + "." + Tables.PRESENCE 784bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " BEGIN " 785bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " DELETE FROM " + Tables.AGGREGATED_PRESENCE 786bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " WHERE " + AggregatedPresenceColumns.CONTACT_ID + " = " + 787bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov "(SELECT " + PresenceColumns.CONTACT_ID + 788bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " FROM " + Tables.PRESENCE + 789bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " WHERE " + PresenceColumns.RAW_CONTACT_ID 790bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + "=OLD." + PresenceColumns.RAW_CONTACT_ID + 791bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " AND NOT EXISTS" + 792bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov "(SELECT " + PresenceColumns.RAW_CONTACT_ID + 793bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " FROM " + Tables.PRESENCE + 794bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " WHERE " + PresenceColumns.CONTACT_ID 795bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + "=OLD." + PresenceColumns.CONTACT_ID + 796bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov " AND " + PresenceColumns.RAW_CONTACT_ID 797bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + "!=OLD." + PresenceColumns.RAW_CONTACT_ID + "));" 798bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " END"); 799bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 800aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori final String replaceAggregatePresenceSql = 801aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori "INSERT OR REPLACE INTO " + Tables.AGGREGATED_PRESENCE + "(" 802093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + AggregatedPresenceColumns.CONTACT_ID + ", " 803093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + StatusUpdates.PRESENCE + ", " 804093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + StatusUpdates.CHAT_CAPABILITY + ")" 805093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " SELECT " 806093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + PresenceColumns.CONTACT_ID + "," 807093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + StatusUpdates.PRESENCE + "," 808093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + StatusUpdates.CHAT_CAPABILITY 809aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori + " FROM " + Tables.PRESENCE 810aabcd1d34a71ad06ee0a9395331540484f1ceb17Vasu Nori + " WHERE " 811093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " (ifnull(" + StatusUpdates.PRESENCE + ",0) * 10 " 812093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + "+ ifnull(" + StatusUpdates.CHAT_CAPABILITY + ", 0))" 813093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " = (SELECT " 814093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + "MAX (ifnull(" + StatusUpdates.PRESENCE + ",0) * 10 " 815093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + "+ ifnull(" + StatusUpdates.CHAT_CAPABILITY + ", 0))" 816093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " FROM " + Tables.PRESENCE 817093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " WHERE " + PresenceColumns.CONTACT_ID 818093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + "=NEW." + PresenceColumns.CONTACT_ID 819093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + ")" 820093b6446d0c63b8d725324ea41369b76ace153dfDmitri Plotnikov + " AND " + PresenceColumns.CONTACT_ID + "=NEW." + PresenceColumns.CONTACT_ID + ";"; 821bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 822bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov db.execSQL("CREATE TRIGGER " + DATABASE_PRESENCE + "." + Tables.PRESENCE + "_inserted" 823bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " AFTER INSERT ON " + DATABASE_PRESENCE + "." + Tables.PRESENCE 824bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " BEGIN " 825bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + replaceAggregatePresenceSql 826bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " END"); 827bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov 828bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov db.execSQL("CREATE TRIGGER " + DATABASE_PRESENCE + "." + Tables.PRESENCE + "_updated" 829bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " AFTER UPDATE ON " + DATABASE_PRESENCE + "." + Tables.PRESENCE 830bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " BEGIN " 831bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + replaceAggregatePresenceSql 832bffeabdf3dcf58f963ad1bb4d3e6e51f3ac16cfdDmitri Plotnikov + " END"); 833b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 834b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 835b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey @Override 836b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public void onCreate(SQLiteDatabase db) { 837069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee Log.i(TAG, "Bootstrapping database version: " + DATABASE_VERSION); 838b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 83935ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana mSyncState.createDatabase(db); 84035ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana 841b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // One row per group of contacts corresponding to the same person 842d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.CONTACTS + " (" + 843b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 844fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)," + 845d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.PHOTO_ID + " INTEGER REFERENCES data(_id)," + 846f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro Contacts.PHOTO_FILE_ID + " INTEGER REFERENCES photo_files(_id)," + 847d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.CUSTOM_RINGTONE + " TEXT," + 848d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.SEND_TO_VOICEMAIL + " INTEGER NOT NULL DEFAULT 0," + 849d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.TIMES_CONTACTED + " INTEGER NOT NULL DEFAULT 0," + 850d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.LAST_TIME_CONTACTED + " INTEGER," + 851d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov Contacts.STARRED + " INTEGER NOT NULL DEFAULT 0," + 852f992bfab334b760d36a053fc0b439382dcfb51adDmitri Plotnikov Contacts.HAS_PHONE_NUMBER + " INTEGER NOT NULL DEFAULT 0," + 8535870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov Contacts.LOOKUP_KEY + " TEXT," + 854ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann ContactsColumns.LAST_STATUS_UPDATE_ID + " INTEGER REFERENCES data(_id)" + 855b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 856b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 85754d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov db.execSQL("CREATE INDEX contacts_has_phone_index ON " + Tables.CONTACTS + " (" + 85854d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov Contacts.HAS_PHONE_NUMBER + 85954d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov ");"); 86054d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov 861fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL("CREATE INDEX contacts_name_raw_contact_id_index ON " + Tables.CONTACTS + " (" + 862fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID + 863fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ");"); 864fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 865b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Contacts table 8665ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.RAW_CONTACTS + " (" + 8676cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 8686cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.ACCOUNT_NAME + " STRING DEFAULT NULL, " + 8696cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.ACCOUNT_TYPE + " STRING DEFAULT NULL, " + 87043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET + " STRING DEFAULT NULL, " + 8716cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.SOURCE_ID + " TEXT," + 87297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov RawContacts.RAW_CONTACT_IS_READ_ONLY + " INTEGER NOT NULL DEFAULT 0," + 8736cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.VERSION + " INTEGER NOT NULL DEFAULT 1," + 87473776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov RawContacts.DIRTY + " INTEGER NOT NULL DEFAULT 0," + 87533b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov RawContacts.DELETED + " INTEGER NOT NULL DEFAULT 0," + 87654d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov RawContacts.CONTACT_ID + " INTEGER REFERENCES contacts(_id)," + 8776cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.AGGREGATION_MODE + " INTEGER NOT NULL DEFAULT " + 8786cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.AGGREGATION_MODE_DEFAULT + "," + 8798e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov RawContactsColumns.AGGREGATION_NEEDED + " INTEGER NOT NULL DEFAULT 1," + 8806cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.CUSTOM_RINGTONE + " TEXT," + 8816cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.SEND_TO_VOICEMAIL + " INTEGER NOT NULL DEFAULT 0," + 8826cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.TIMES_CONTACTED + " INTEGER NOT NULL DEFAULT 0," + 8836cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov RawContacts.LAST_TIME_CONTACTED + " INTEGER," + 88433b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov RawContacts.STARRED + " INTEGER NOT NULL DEFAULT 0," + 8855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_PRIMARY + " TEXT," + 8865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_ALTERNATIVE + " TEXT," + 8875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_SOURCE + " INTEGER NOT NULL DEFAULT " + 88825abcf949c0dd826a770b437489b83de48975ceaDmitri Plotnikov DisplayNameSources.UNDEFINED + "," + 8895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.PHONETIC_NAME + " TEXT," + 8905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.PHONETIC_NAME_STYLE + " TEXT," + 891de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa RawContacts.SORT_KEY_PRIMARY + " TEXT COLLATE " + 892de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa ContactsProvider2.PHONEBOOK_COLLATOR_NAME + "," + 893de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa RawContacts.SORT_KEY_ALTERNATIVE + " TEXT COLLATE " + 894de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa ContactsProvider2.PHONEBOOK_COLLATOR_NAME + "," + 895f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov RawContacts.NAME_VERIFIED + " INTEGER NOT NULL DEFAULT 0," + 8963cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov RawContacts.SYNC1 + " TEXT, " + 8973cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov RawContacts.SYNC2 + " TEXT, " + 8983cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov RawContacts.SYNC3 + " TEXT, " + 8993cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov RawContacts.SYNC4 + " TEXT " + 900b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 901b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 90254d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contacts_contact_id_index ON " + Tables.RAW_CONTACTS + " (" + 90354d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov RawContacts.CONTACT_ID + 90454d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov ");"); 90554d6316486a810f45abade9d985dbb52b6cb17e2Dmitri Plotnikov 9065f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contacts_source_id_index ON " + Tables.RAW_CONTACTS + " (" + 9075f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov RawContacts.SOURCE_ID + ", " + 9085f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov RawContacts.ACCOUNT_TYPE + ", " + 9095f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov RawContacts.ACCOUNT_NAME + 9105f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov ");"); 9115f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov 91243368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro db.execSQL("CREATE INDEX raw_contacts_source_id_data_set_index ON " + 91343368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Tables.RAW_CONTACTS + " (" + 91443368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.SOURCE_ID + ", " + 91543368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_TYPE + ", " + 91643368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.ACCOUNT_NAME + ", " + 91743368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro RawContacts.DATA_SET + 91843368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro ");"); 91943368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro 9203b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann db.execSQL("CREATE TABLE " + Tables.STREAM_ITEMS + " (" + 9213b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 9223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.RAW_CONTACT_ID + " INTEGER NOT NULL, " + 9236802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StreamItems.RES_PACKAGE + " TEXT, " + 9240bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann StreamItems.RES_ICON + " TEXT, " + 9250bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann StreamItems.RES_LABEL + " TEXT, " + 9260bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann StreamItems.TEXT + " TEXT, " + 9273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItems.TIMESTAMP + " INTEGER NOT NULL, " + 9280bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann StreamItems.COMMENTS + " TEXT, " + 9290bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann StreamItems.SYNC1 + " TEXT, " + 9300bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann StreamItems.SYNC2 + " TEXT, " + 9310bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann StreamItems.SYNC3 + " TEXT, " + 9320bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann StreamItems.SYNC4 + " TEXT, " + 9333b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "FOREIGN KEY(" + StreamItems.RAW_CONTACT_ID + ") REFERENCES " + 9343b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Tables.RAW_CONTACTS + "(" + RawContacts._ID + "));"); 9353b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 9363b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann db.execSQL("CREATE TABLE " + Tables.STREAM_ITEM_PHOTOS + " (" + 9373b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItemPhotos._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 9383b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItemPhotos.STREAM_ITEM_ID + " INTEGER NOT NULL, " + 9393b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann StreamItemPhotos.SORT_INDEX + " INTEGER, " + 9406802030a777c0c3ba1dc029c534cca4784260632Dave Santoro StreamItemPhotos.PHOTO_FILE_ID + " INTEGER NOT NULL, " + 9410bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann StreamItemPhotos.SYNC1 + " TEXT, " + 9420bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann StreamItemPhotos.SYNC2 + " TEXT, " + 9430bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann StreamItemPhotos.SYNC3 + " TEXT, " + 9440bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann StreamItemPhotos.SYNC4 + " TEXT, " + 9453b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann "FOREIGN KEY(" + StreamItemPhotos.STREAM_ITEM_ID + ") REFERENCES " + 9463b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann Tables.STREAM_ITEMS + "(" + StreamItems._ID + "));"); 9473b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 948f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro db.execSQL("CREATE TABLE " + Tables.PHOTO_FILES + " (" + 949f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro PhotoFiles._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 950f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro PhotoFiles.HEIGHT + " INTEGER NOT NULL, " + 951f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro PhotoFiles.WIDTH + " INTEGER NOT NULL, " + 952f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro PhotoFiles.FILESIZE + " INTEGER NOT NULL);"); 953f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 954f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov // TODO readd the index and investigate a controlled use of it 955f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov// db.execSQL("CREATE INDEX raw_contacts_agg_index ON " + Tables.RAW_CONTACTS + " (" + 956f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov// RawContactsColumns.AGGREGATION_NEEDED + 957f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov// ");"); 9588e45e5f2142db78941b095f7418cc05b71668094Dmitri Plotnikov 959b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Package name mapping table 960ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey db.execSQL("CREATE TABLE " + Tables.PACKAGES + " (" + 961ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey PackagesColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 962ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey PackagesColumns.PACKAGE + " TEXT NOT NULL" + 963b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 964b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 965ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Mimetype mapping table 966ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey db.execSQL("CREATE TABLE " + Tables.MIMETYPES + " (" + 967ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey MimetypesColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 968ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey MimetypesColumns.MIMETYPE + " TEXT NOT NULL" + 969b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 970b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 97108768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov // Mimetype table requires an index on mime type 97208768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov db.execSQL("CREATE UNIQUE INDEX mime_type ON " + Tables.MIMETYPES + " (" + 97308768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov MimetypesColumns.MIMETYPE + 97408768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov ");"); 97508768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov 976b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Public generic data table 977b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey db.execSQL("CREATE TABLE " + Tables.DATA + " (" + 978b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Data._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 97967dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey DataColumns.PACKAGE_ID + " INTEGER REFERENCES package(_id)," + 980b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey DataColumns.MIMETYPE_ID + " INTEGER REFERENCES mimetype(_id) NOT NULL," + 98111944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov Data.RAW_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id) NOT NULL," + 98297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Data.IS_READ_ONLY + " INTEGER NOT NULL DEFAULT 0," + 983f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.IS_PRIMARY + " INTEGER NOT NULL DEFAULT 0," + 984f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.IS_SUPER_PRIMARY + " INTEGER NOT NULL DEFAULT 0," + 985f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA_VERSION + " INTEGER NOT NULL DEFAULT 0," + 986f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA1 + " TEXT," + 987f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA2 + " TEXT," + 988f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA3 + " TEXT," + 989f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA4 + " TEXT," + 990f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA5 + " TEXT," + 991f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA6 + " TEXT," + 992f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA7 + " TEXT," + 993f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA8 + " TEXT," + 994f5b20724819e51b339ff6ba5b8eb6b444cc31452Fred Quintana Data.DATA9 + " TEXT," + 99567dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Data.DATA10 + " TEXT," + 99667dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Data.DATA11 + " TEXT," + 99767dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Data.DATA12 + " TEXT," + 99867dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Data.DATA13 + " TEXT," + 99967dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Data.DATA14 + " TEXT," + 10003cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Data.DATA15 + " TEXT," + 10013cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Data.SYNC1 + " TEXT, " + 10023cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Data.SYNC2 + " TEXT, " + 10033cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Data.SYNC3 + " TEXT, " + 10043cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Data.SYNC4 + " TEXT " + 1005b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 1006b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 100711944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov db.execSQL("CREATE INDEX data_raw_contact_id ON " + Tables.DATA + " (" + 100811944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov Data.RAW_CONTACT_ID + 100911944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov ");"); 101011944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov 101111944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov /** 101211944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov * For email lookup and similar queries. 101311944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov */ 1014f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov db.execSQL("CREATE INDEX data_mimetype_data1_index ON " + Tables.DATA + " (" + 101511944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov DataColumns.MIMETYPE_ID + "," + 1016f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov Data.DATA1 + 101711944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov ");"); 101811944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov 1019b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Private phone numbers table used for lookup 1020b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey db.execSQL("CREATE TABLE " + Tables.PHONE_LOOKUP + " (" + 1021f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov PhoneLookupColumns.DATA_ID 1022892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + " INTEGER REFERENCES data(_id) NOT NULL," + 10235ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID 10245ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " INTEGER REFERENCES raw_contacts(_id) NOT NULL," + 102536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.NORMALIZED_NUMBER + " TEXT NOT NULL," + 102636045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.MIN_MATCH + " TEXT NOT NULL" + 1027b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 1028b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 1029b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey db.execSQL("CREATE INDEX phone_lookup_index ON " + Tables.PHONE_LOOKUP + " (" + 1030f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov PhoneLookupColumns.NORMALIZED_NUMBER + "," + 1031f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID + "," + 1032b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey PhoneLookupColumns.DATA_ID + 1033b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 1034b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 103536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_min_match_index ON " + Tables.PHONE_LOOKUP + " (" + 103636045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.MIN_MATCH + "," + 103736045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID + "," + 103836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.DATA_ID + 103936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov ");"); 104036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 1041d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_data_id_min_match_index ON " + Tables.PHONE_LOOKUP + 1042d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov " (" + PhoneLookupColumns.DATA_ID + ", " + PhoneLookupColumns.MIN_MATCH + ");"); 1043d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov 1044a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov // Private name/nickname table used for lookup 1045a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.NAME_LOOKUP + " (" + 104614bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov NameLookupColumns.DATA_ID 104714bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov + " INTEGER REFERENCES data(_id) NOT NULL," + 10485ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov NameLookupColumns.RAW_CONTACT_ID 10495ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " INTEGER REFERENCES raw_contacts(_id) NOT NULL," + 105011944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov NameLookupColumns.NORMALIZED_NAME + " TEXT NOT NULL," + 105111944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov NameLookupColumns.NAME_TYPE + " INTEGER NOT NULL," + 105214bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov "PRIMARY KEY (" 105314bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov + NameLookupColumns.DATA_ID + ", " 105411944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov + NameLookupColumns.NORMALIZED_NAME + ", " 105511944a13b31aa7c98f1079697f24b3a1999ca571Dmitri Plotnikov + NameLookupColumns.NAME_TYPE + ")" + 1056a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov ");"); 1057a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov 105814bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov db.execSQL("CREATE INDEX name_lookup_raw_contact_id_index ON " + Tables.NAME_LOOKUP + " (" + 105914bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov NameLookupColumns.RAW_CONTACT_ID + 106014bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov ");"); 106114bba94bbe0f2e215ad7b3b9417754a1ba0d95bfDmitri Plotnikov 1062b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.NICKNAME_LOOKUP + " (" + 1063b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov NicknameLookupColumns.NAME + " TEXT," + 1064b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov NicknameLookupColumns.CLUSTER + " TEXT" + 1065b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov ");"); 1066b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 1067b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov db.execSQL("CREATE UNIQUE INDEX nickname_lookup_index ON " + Tables.NICKNAME_LOOKUP + " (" + 1068b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov NicknameLookupColumns.NAME + ", " + 1069b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov NicknameLookupColumns.CLUSTER + 1070b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov ");"); 1071b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 1072ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Groups table 1073ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey db.execSQL("CREATE TABLE " + Tables.GROUPS + " (" + 1074ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey Groups._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 107567dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey GroupsColumns.PACKAGE_ID + " INTEGER REFERENCES package(_id)," + 1076035b4cc204be2641079a0b04e9ee9791a8f8248bFred Quintana Groups.ACCOUNT_NAME + " STRING DEFAULT NULL, " + 1077035b4cc204be2641079a0b04e9ee9791a8f8248bFred Quintana Groups.ACCOUNT_TYPE + " STRING DEFAULT NULL, " + 107843368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.DATA_SET + " STRING DEFAULT NULL, " + 1079ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey Groups.SOURCE_ID + " TEXT," + 10809261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Groups.VERSION + " INTEGER NOT NULL DEFAULT 1," + 108173776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov Groups.DIRTY + " INTEGER NOT NULL DEFAULT 0," + 1082ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey Groups.TITLE + " TEXT," + 108367dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey Groups.TITLE_RES + " INTEGER," + 10840f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov Groups.NOTES + " TEXT," + 10850f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov Groups.SYSTEM_ID + " TEXT," + 108694021b213e4db367f60b30fcbfe9019e28571784Fred Quintana Groups.DELETED + " INTEGER NOT NULL DEFAULT 0," + 1087eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey Groups.GROUP_VISIBLE + " INTEGER NOT NULL DEFAULT 0," + 1088ea547d55f864133861b2db44221ae0c2ac6c1a68Fred Quintana Groups.SHOULD_SYNC + " INTEGER NOT NULL DEFAULT 1," + 1089dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Groups.AUTO_ADD + " INTEGER NOT NULL DEFAULT 0," + 1090dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana Groups.FAVORITES + " INTEGER NOT NULL DEFAULT 0," + 1091c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov Groups.GROUP_IS_READ_ONLY + " INTEGER NOT NULL DEFAULT 0," + 10923cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Groups.SYNC1 + " TEXT, " + 10933cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Groups.SYNC2 + " TEXT, " + 10943cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Groups.SYNC3 + " TEXT, " + 10953cfe8d532d509fbbe605454e3a32b2361b7e1501Dmitri Plotnikov Groups.SYNC4 + " TEXT " + 1096ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey ");"); 1097ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 10985f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov db.execSQL("CREATE INDEX groups_source_id_index ON " + Tables.GROUPS + " (" + 10995f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov Groups.SOURCE_ID + ", " + 11005f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov Groups.ACCOUNT_TYPE + ", " + 11015f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov Groups.ACCOUNT_NAME + 11025f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov ");"); 11035f515d93c04729e6cdc9b704d18579162d71d5f2Dmitri Plotnikov 110443368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro db.execSQL("CREATE INDEX groups_source_id_data_set_index ON " + Tables.GROUPS + " (" + 110543368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.SOURCE_ID + ", " + 110643368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.ACCOUNT_TYPE + ", " + 110743368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.ACCOUNT_NAME + ", " + 110843368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro Groups.DATA_SET + 110943368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro ");"); 111043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro 1111b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov db.execSQL("CREATE TABLE IF NOT EXISTS " + Tables.AGGREGATION_EXCEPTIONS + " (" + 1112b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov AggregationExceptionColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 1113b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov AggregationExceptions.TYPE + " INTEGER NOT NULL, " + 11140c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID1 11155ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " INTEGER REFERENCES raw_contacts(_id), " + 11160c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID2 11175ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov + " INTEGER REFERENCES raw_contacts(_id)" + 1118b0160a0bcf6d59eaa43fd501e124b95f873e0157Marc Blank ");"); 1119b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 1120b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov db.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS aggregation_exception_index1 ON " + 1121b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov Tables.AGGREGATION_EXCEPTIONS + " (" + 11220c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID1 + ", " + 11230c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID2 + 1124b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov ");"); 1125b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 1126b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov db.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS aggregation_exception_index2 ON " + 1127b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov Tables.AGGREGATION_EXCEPTIONS + " (" + 11280c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID2 + ", " + 11290c0adda32be5de3acf392ab715cff468b6b340f8Dmitri Plotnikov AggregationExceptions.RAW_CONTACT_ID1 + 1130b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov ");"); 1131b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov 1132eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey db.execSQL("CREATE TABLE IF NOT EXISTS " + Tables.SETTINGS + " (" + 1133eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey Settings.ACCOUNT_NAME + " STRING NOT NULL," + 1134eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey Settings.ACCOUNT_TYPE + " STRING NOT NULL," + 1135eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey Settings.UNGROUPED_VISIBLE + " INTEGER NOT NULL DEFAULT 0," + 1136eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey Settings.SHOULD_SYNC + " INTEGER NOT NULL DEFAULT 1, " + 1137eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey "PRIMARY KEY (" + Settings.ACCOUNT_NAME + ", " + 1138e07913c61c320b0cc2036db3b714e39534d8cd7aJeff Sharkey Settings.ACCOUNT_TYPE + ") ON CONFLICT REPLACE" + 1139eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey ");"); 1140eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey 11414394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.VISIBLE_CONTACTS + " (" + 11424394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov Contacts._ID + " INTEGER PRIMARY KEY" + 11434394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov ");"); 11444394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 1145385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.DEFAULT_DIRECTORY + " (" + 1146385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov Contacts._ID + " INTEGER PRIMARY KEY" + 1147385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ");"); 1148385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 1149e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov // The table for recent calls is here so we can do table joins 1150e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov // on people, phones, and calls all in one place. 1151e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.CALLS + " (" + 1152e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 1153e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.NUMBER + " TEXT," + 1154e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.DATE + " INTEGER," + 1155e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.DURATION + " INTEGER," + 1156e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.TYPE + " INTEGER," + 1157e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.NEW + " INTEGER," + 1158e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.CACHED_NAME + " TEXT," + 1159e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov Calls.CACHED_NUMBER_TYPE + " INTEGER," + 11602530512f639c4979fd7371c7dd25dd67e8118124Bai Tao Calls.CACHED_NUMBER_LABEL + " TEXT," + 116159f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Calls.COUNTRY_ISO + " TEXT," + 116259f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Calls.VOICEMAIL_URI + " TEXT," + 1163b2197b235e3d96e7f70c24d548b7dac52dab88d8Flavio Lerda Calls.IS_READ + " INTEGER," + 1164aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda Calls.GEOCODED_LOCATION + " TEXT," + 11657a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda Calls.CACHED_LOOKUP_URI + " TEXT," + 11667a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda Calls.CACHED_MATCHED_NUMBER + " TEXT," + 11677a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda Calls.CACHED_NORMALIZED_NUMBER + " TEXT," + 11687a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda Calls.CACHED_PHOTO_ID + " INTEGER NOT NULL DEFAULT 0," + 116959f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails._DATA + " TEXT," + 117059f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails.HAS_CONTENT + " INTEGER," + 117159f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails.MIME_TYPE + " TEXT," + 117259f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails.SOURCE_DATA + " TEXT," + 117359f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails.SOURCE_PACKAGE + " TEXT," + 117459f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee Voicemails.STATE + " INTEGER" + 117559f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee ");"); 1176e99988b266dd1263162583e81e2b408e7329b1c8Dmitri Plotnikov 1177069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee // Voicemail source status table. 1178069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee db.execSQL("CREATE TABLE " + Tables.VOICEMAIL_STATUS + " (" + 1179069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 1180069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.SOURCE_PACKAGE + " TEXT UNIQUE NOT NULL," + 1181069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.SETTINGS_URI + " TEXT," + 1182069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.VOICEMAIL_ACCESS_URI + " TEXT," + 1183069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.CONFIGURATION_STATE + " INTEGER," + 1184069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.DATA_CHANNEL_STATE + " INTEGER," + 1185069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE + " INTEGER" + 1186069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee ");"); 1187069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee 1188b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Activities table 1189b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey db.execSQL("CREATE TABLE " + Tables.ACTIVITIES + " (" + 1190b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 119167dde51ab932dc84d95a203b113989b13437f13dJeff Sharkey ActivitiesColumns.PACKAGE_ID + " INTEGER REFERENCES package(_id)," + 1192b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ActivitiesColumns.MIMETYPE_ID + " INTEGER REFERENCES mimetype(_id) NOT NULL," + 1193b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities.RAW_ID + " TEXT," + 1194499791a4f9ab29fa94ff48dd7acff55b2ac089a7Dmitri Plotnikov Activities.IN_REPLY_TO + " TEXT," + 11955ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Activities.AUTHOR_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)," + 11965ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov Activities.TARGET_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)," + 1197b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities.PUBLISHED + " INTEGER NOT NULL," + 1198499791a4f9ab29fa94ff48dd7acff55b2ac089a7Dmitri Plotnikov Activities.THREAD_PUBLISHED + " INTEGER NOT NULL," + 1199b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities.TITLE + " TEXT NOT NULL," + 1200b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities.SUMMARY + " TEXT," + 1201adb55c2d8295d300961d86a3605c8ddc469cd4a2Dmitri Plotnikov Activities.LINK + " TEXT, " + 1202b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey Activities.THUMBNAIL + " BLOB" + 1203b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey ");"); 1204b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 1205a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.STATUS_UPDATES + " (" + 1206a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov StatusUpdatesColumns.DATA_ID + " INTEGER PRIMARY KEY REFERENCES data(_id)," + 12070a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.STATUS + " TEXT," + 12080a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.STATUS_TIMESTAMP + " INTEGER," + 12090a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.STATUS_RES_PACKAGE + " TEXT, " + 12100a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.STATUS_LABEL + " INTEGER, " + 12110a185cdcb65d1beb2a295fffbe2ae11a6a2c097fDmitri Plotnikov StatusUpdates.STATUS_ICON + " INTEGER" + 1212a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov ");"); 1213a23cd5b6f478f6c9dda54173e84bd0098b9f3364Dmitri Plotnikov 1214b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.PROPERTIES + " (" + 1215b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov PropertiesColumns.PROPERTY_KEY + " TEXT PRIMARY KEY, " + 1216b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov PropertiesColumns.PROPERTY_VALUE + " TEXT " + 1217b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov ");"); 1218b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 1219743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.ACCOUNTS + " (" + 122024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.ACCOUNT_NAME + " TEXT, " + 122124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.ACCOUNT_TYPE + " TEXT, " + 122243368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro AccountsColumns.DATA_SET + " TEXT, " + 122324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.PROFILE_RAW_CONTACT_ID + " INTEGER" + 122424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro ");"); 122524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 122624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro db.execSQL("CREATE INDEX accounts_profile_raw_contact_id_index ON " + 122724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Tables.ACCOUNTS + " (" + 122824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.PROFILE_RAW_CONTACT_ID + 1229743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov ");"); 1230743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 1231743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov // Allow contacts without any account to be created for now. Achieve that 1232743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov // by inserting a fake account with both type and name as NULL. 123343368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro db.execSQL("INSERT INTO " + Tables.ACCOUNTS + " VALUES(NULL, NULL, NULL, NULL)"); 1234743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 1235d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov createDirectoriesTable(db); 1236f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov createSearchIndexTable(db); 1237d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 123846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa db.execSQL("CREATE TABLE " + Tables.DATA_USAGE_STAT + "(" + 123946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 124046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.DATA_ID + " INTEGER NOT NULL, " + 124146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.USAGE_TYPE_INT + " INTEGER NOT NULL DEFAULT 0, " + 124246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.TIMES_USED + " INTEGER NOT NULL DEFAULT 0, " + 124346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.LAST_TIME_USED + " INTERGER NOT NULL DEFAULT 0, " + 124446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "FOREIGN KEY(" + DataUsageStatColumns.DATA_ID + ") REFERENCES " 124546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa + Tables.DATA + "(" + Data._ID + ")" + 124646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ");"); 124746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa db.execSQL("CREATE UNIQUE INDEX data_usage_stat_index ON " + 124846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa Tables.DATA_USAGE_STAT + " (" + 124946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.DATA_ID + ", " + 125046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa DataUsageStatColumns.USAGE_TYPE_INT + 125146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa ");"); 125246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 1253a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov createContactsViews(db); 1254a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov createGroupsView(db); 1255fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov createContactsTriggers(db); 1256916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov createContactsIndexes(db); 12574a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1258a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov loadNicknameLookupTable(db); 1259a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 1260a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov // Add the legacy API support views, etc 1261a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov LegacyApiSupport.createDatabase(db); 1262a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 12632a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov if (mDatabaseOptimizationEnabled) { 12642a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov // This will create a sqlite_stat1 table that is used for query optimization 12652a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov db.execSQL("ANALYZE;"); 1266a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 12672a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov updateSqliteStats(db); 1268a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 12692a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov // We need to close and reopen the database connection so that the stats are 12702a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov // taken into account. Make a note of it and do the actual reopening in the 12712a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov // getWritableDatabase method. 12722a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov mReopenDatabase = true; 12732a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 1274a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 1275a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov ContentResolver.requestSync(null /* all accounts */, 1276a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov ContactsContract.AUTHORITY, new Bundle()); 1277a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov } 1278a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 1279d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov private void createDirectoriesTable(SQLiteDatabase db) { 1280d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.DIRECTORIES + "(" + 1281d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 1282d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.PACKAGE_NAME + " TEXT NOT NULL," + 1283d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.DIRECTORY_AUTHORITY + " TEXT NOT NULL," + 1284d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.TYPE_RESOURCE_ID + " INTEGER," + 1285e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov DirectoryColumns.TYPE_RESOURCE_NAME + " TEXT," + 1286d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.ACCOUNT_TYPE + " TEXT," + 1287d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.ACCOUNT_NAME + " TEXT," + 1288d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.DISPLAY_NAME + " TEXT, " + 1289d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov Directory.EXPORT_SUPPORT + " INTEGER NOT NULL" + 129097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov " DEFAULT " + Directory.EXPORT_SUPPORT_NONE + "," + 129197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov Directory.SHORTCUT_SUPPORT + " INTEGER NOT NULL" + 12923d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov " DEFAULT " + Directory.SHORTCUT_SUPPORT_NONE + "," + 12933d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Directory.PHOTO_SUPPORT + " INTEGER NOT NULL" + 12943d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov " DEFAULT " + Directory.PHOTO_SUPPORT_NONE + 1295d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov ");"); 1296d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 12973d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov // Trigger a full scan of directories in the system 12983d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov setProperty(db, ContactDirectoryManager.PROPERTY_DIRECTORY_SCAN_COMPLETE, "0"); 1299d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 1300d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 130105e50fbf9809bf04eceec3d2a2753630dc4f9315Dmitri Plotnikov public void createSearchIndexTable(SQLiteDatabase db) { 1302f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS " + Tables.SEARCH_INDEX); 1303f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov db.execSQL("CREATE VIRTUAL TABLE " + Tables.SEARCH_INDEX 1304f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov + " USING FTS4 (" 1305f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov + SearchIndexColumns.CONTACT_ID + " INTEGER REFERENCES contacts(_id) NOT NULL," 1306f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov + SearchIndexColumns.CONTENT + " TEXT, " 1307155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov + SearchIndexColumns.NAME + " TEXT, " 1308f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov + SearchIndexColumns.TOKENS + " TEXT" 1309f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov + ")"); 1310f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 1311f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 1312916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov private static void createContactsTriggers(SQLiteDatabase db) { 1313fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1314fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov /* 1315fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov * Automatically delete Data rows when a raw contact is deleted. 1316fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov */ 1317fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS " + Tables.RAW_CONTACTS + "_deleted;"); 1318fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("CREATE TRIGGER " + Tables.RAW_CONTACTS + "_deleted " 1319fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEFORE DELETE ON " + Tables.RAW_CONTACTS 1320fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEGIN " 1321fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.DATA 1322fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + Data.RAW_CONTACT_ID 1323fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + "=OLD." + RawContacts._ID + ";" 1324fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.AGGREGATION_EXCEPTIONS 1325fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + AggregationExceptions.RAW_CONTACT_ID1 1326fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + "=OLD." + RawContacts._ID 1327fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " OR " + AggregationExceptions.RAW_CONTACT_ID2 1328fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + "=OLD." + RawContacts._ID + ";" 132935da06eb902047d8f3eb1698450d7bfdc41f22d4Dmitri Plotnikov + " DELETE FROM " + Tables.VISIBLE_CONTACTS 133035da06eb902047d8f3eb1698450d7bfdc41f22d4Dmitri Plotnikov + " WHERE " + Contacts._ID + "=OLD." + RawContacts.CONTACT_ID 133135da06eb902047d8f3eb1698450d7bfdc41f22d4Dmitri Plotnikov + " AND (SELECT COUNT(*) FROM " + Tables.RAW_CONTACTS 133235da06eb902047d8f3eb1698450d7bfdc41f22d4Dmitri Plotnikov + " WHERE " + RawContacts.CONTACT_ID + "=OLD." + RawContacts.CONTACT_ID 133335da06eb902047d8f3eb1698450d7bfdc41f22d4Dmitri Plotnikov + " )=1;" 1334385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + " DELETE FROM " + Tables.DEFAULT_DIRECTORY 1335385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + " WHERE " + Contacts._ID + "=OLD." + RawContacts.CONTACT_ID 1336385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + " AND (SELECT COUNT(*) FROM " + Tables.RAW_CONTACTS 1337385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + " WHERE " + RawContacts.CONTACT_ID + "=OLD." + RawContacts.CONTACT_ID 1338385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + " )=1;" 1339fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.CONTACTS 1340fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + Contacts._ID + "=OLD." + RawContacts.CONTACT_ID 1341fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " AND (SELECT COUNT(*) FROM " + Tables.RAW_CONTACTS 1342fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + RawContacts.CONTACT_ID + "=OLD." + RawContacts.CONTACT_ID 1343fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " )=1;" 1344fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " END"); 1345fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1346fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1347fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS contacts_times_contacted;"); 13486c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook db.execSQL("DROP TRIGGER IF EXISTS raw_contacts_times_contacted;"); 1349fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1350fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov /* 1351fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov * Triggers that update {@link RawContacts#VERSION} when the contact is 1352fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov * marked for deletion or any time a data row is inserted, updated or 1353fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov * deleted. 1354fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov */ 1355fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS " + Tables.RAW_CONTACTS + "_marked_deleted;"); 1356fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("CREATE TRIGGER " + Tables.RAW_CONTACTS + "_marked_deleted " 13577f61664c2b587e27f52edcb9a8b91986154ec637Vasu Nori + " AFTER UPDATE ON " + Tables.RAW_CONTACTS 1358fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEGIN " 1359fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " UPDATE " + Tables.RAW_CONTACTS 1360fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " SET " 1361fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + RawContacts.VERSION + "=OLD." + RawContacts.VERSION + "+1 " 1362fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + RawContacts._ID + "=OLD." + RawContacts._ID 1363fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " AND NEW." + RawContacts.DELETED + "!= OLD." + RawContacts.DELETED + ";" 1364fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " END"); 1365fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1366fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS " + Tables.DATA + "_updated;"); 13677f61664c2b587e27f52edcb9a8b91986154ec637Vasu Nori db.execSQL("CREATE TRIGGER " + Tables.DATA + "_updated AFTER UPDATE ON " + Tables.DATA 1368fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEGIN " 1369fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " UPDATE " + Tables.DATA 1370fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " SET " + Data.DATA_VERSION + "=OLD." + Data.DATA_VERSION + "+1 " 1371fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + Data._ID + "=OLD." + Data._ID + ";" 1372fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " UPDATE " + Tables.RAW_CONTACTS 1373fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " SET " + RawContacts.VERSION + "=" + RawContacts.VERSION + "+1 " 1374fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + RawContacts._ID + "=OLD." + Data.RAW_CONTACT_ID + ";" 1375fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " END"); 1376fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1377fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS " + Tables.DATA + "_deleted;"); 1378fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("CREATE TRIGGER " + Tables.DATA + "_deleted BEFORE DELETE ON " + Tables.DATA 1379fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEGIN " 1380fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " UPDATE " + Tables.RAW_CONTACTS 1381fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " SET " + RawContacts.VERSION + "=" + RawContacts.VERSION + "+1 " 1382fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + RawContacts._ID + "=OLD." + Data.RAW_CONTACT_ID + ";" 1383fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.PHONE_LOOKUP 1384fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + PhoneLookupColumns.DATA_ID + "=OLD." + Data._ID + ";" 1385fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.STATUS_UPDATES 1386fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + StatusUpdatesColumns.DATA_ID + "=OLD." + Data._ID + ";" 1387fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " DELETE FROM " + Tables.NAME_LOOKUP 1388fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + NameLookupColumns.DATA_ID + "=OLD." + Data._ID + ";" 1389fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " END"); 1390fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1391fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1392fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("DROP TRIGGER IF EXISTS " + Tables.GROUPS + "_updated1;"); 1393fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov db.execSQL("CREATE TRIGGER " + Tables.GROUPS + "_updated1 " 13947f61664c2b587e27f52edcb9a8b91986154ec637Vasu Nori + " AFTER UPDATE ON " + Tables.GROUPS 1395fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " BEGIN " 1396fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " UPDATE " + Tables.GROUPS 1397fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " SET " 1398fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + Groups.VERSION + "=OLD." + Groups.VERSION + "+1" 1399fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " WHERE " + Groups._ID + "=OLD." + Groups._ID + ";" 1400fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov + " END"); 14013e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa 14023e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa // Update DEFAULT_FILTER table per AUTO_ADD column update. 14033e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa // See also upgradeToVersion411(). 14043e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa final String insertContactsWithoutAccount = ( 14053e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " INSERT OR IGNORE INTO " + Tables.DEFAULT_DIRECTORY + 14063e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " SELECT " + RawContacts.CONTACT_ID + 14073e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " FROM " + Tables.RAW_CONTACTS + 14083e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " WHERE " + RawContactsColumns.CONCRETE_ACCOUNT_NAME + " IS NULL " + 14093e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " IS NULL; "); 14103e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa final String insertContactsWithAccountNoDefaultGroup = ( 14113e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " INSERT OR IGNORE INTO " + Tables.DEFAULT_DIRECTORY + 14123e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " SELECT " + RawContacts.CONTACT_ID + 14133e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " FROM " + Tables.RAW_CONTACTS + 14143e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " WHERE NOT EXISTS" + 14153e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " (SELECT " + Groups._ID + 14163e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " FROM " + Tables.GROUPS + 14173e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " WHERE " + RawContactsColumns.CONCRETE_ACCOUNT_NAME + " = " + 14183e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa GroupsColumns.CONCRETE_ACCOUNT_NAME + 14193e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " = " + 14203e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa GroupsColumns.CONCRETE_ACCOUNT_TYPE + 14213e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " AND " + Groups.AUTO_ADD + " != 0" + ");"); 14223e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa final String insertContactsWithAccountDefaultGroup = ( 14233e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " INSERT OR IGNORE INTO " + Tables.DEFAULT_DIRECTORY + 14243e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " SELECT " + RawContacts.CONTACT_ID + 14253e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " FROM " + Tables.RAW_CONTACTS + 14263e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " JOIN " + Tables.DATA + 14273e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " ON (" + RawContactsColumns.CONCRETE_ID + "=" + 14283e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa Data.RAW_CONTACT_ID + ")" + 142906c4a28bcdd9ca7c396de41b3bae5f6f43978fb5Daisuke Miyakawa " WHERE " + DataColumns.MIMETYPE_ID + "=" + 143006c4a28bcdd9ca7c396de41b3bae5f6f43978fb5Daisuke Miyakawa "(SELECT " + MimetypesColumns._ID + " FROM " + Tables.MIMETYPES + 143106c4a28bcdd9ca7c396de41b3bae5f6f43978fb5Daisuke Miyakawa " WHERE " + MimetypesColumns.MIMETYPE + 143206c4a28bcdd9ca7c396de41b3bae5f6f43978fb5Daisuke Miyakawa "='" + GroupMembership.CONTENT_ITEM_TYPE + "')" + 14333e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " AND EXISTS" + 14343e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " (SELECT " + Groups._ID + 14353e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " FROM " + Tables.GROUPS + 14363e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " WHERE " + RawContactsColumns.CONCRETE_ACCOUNT_NAME + " = " + 14373e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa GroupsColumns.CONCRETE_ACCOUNT_NAME + 14383e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " = " + 14393e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa GroupsColumns.CONCRETE_ACCOUNT_TYPE + 14403e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " AND " + Groups.AUTO_ADD + " != 0" + ");"); 14413e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa 14423e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa db.execSQL("DROP TRIGGER IF EXISTS " + Tables.GROUPS + "_auto_add_updated1;"); 14433e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa db.execSQL("CREATE TRIGGER " + Tables.GROUPS + "_auto_add_updated1 " 14443e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa + " AFTER UPDATE OF " + Groups.AUTO_ADD + " ON " + Tables.GROUPS 14453e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa + " BEGIN " 14463e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa + " DELETE FROM " + Tables.DEFAULT_DIRECTORY + ";" 14473e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa + insertContactsWithoutAccount 14483e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa + insertContactsWithAccountNoDefaultGroup 14493e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa + insertContactsWithAccountDefaultGroup 14503e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa + " END"); 1451fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov } 1452fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 1453916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov private static void createContactsIndexes(SQLiteDatabase db) { 1454916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov db.execSQL("DROP INDEX IF EXISTS name_lookup_index"); 1455916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov db.execSQL("CREATE INDEX name_lookup_index ON " + Tables.NAME_LOOKUP + " (" + 1456916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov NameLookupColumns.NORMALIZED_NAME + "," + 1457916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov NameLookupColumns.NAME_TYPE + ", " + 1458916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov NameLookupColumns.RAW_CONTACT_ID + ", " + 1459916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov NameLookupColumns.DATA_ID + 1460916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov ");"); 146104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 146204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov db.execSQL("DROP INDEX IF EXISTS raw_contact_sort_key1_index"); 146304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contact_sort_key1_index ON " + Tables.RAW_CONTACTS + " (" + 146404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov RawContacts.SORT_KEY_PRIMARY + 146504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov ");"); 146604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 146704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov db.execSQL("DROP INDEX IF EXISTS raw_contact_sort_key2_index"); 146804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contact_sort_key2_index ON " + Tables.RAW_CONTACTS + " (" + 146904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov RawContacts.SORT_KEY_ALTERNATIVE + 147004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov ");"); 1471916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 1472916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 1473a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov private static void createContactsViews(SQLiteDatabase db) { 1474ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann db.execSQL("DROP VIEW IF EXISTS " + Views.CONTACTS + ";"); 1475ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann db.execSQL("DROP VIEW IF EXISTS " + Views.DATA + ";"); 1476ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_CONTACTS + ";"); 1477a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_ENTITIES + ";"); 1478a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("DROP VIEW IF EXISTS " + Views.ENTITIES + ";"); 1479ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_USAGE_STAT + ";"); 14809b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann db.execSQL("DROP VIEW IF EXISTS " + Views.STREAM_ITEMS + ";"); 1481a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 14824a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String dataColumns = 14834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov Data.IS_PRIMARY + ", " 14844a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.IS_SUPER_PRIMARY + ", " 14854a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA_VERSION + ", " 14864a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + PackagesColumns.PACKAGE + " AS " + Data.RES_PACKAGE + "," 14874a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + MimetypesColumns.MIMETYPE + " AS " + Data.MIMETYPE + ", " 148897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov + Data.IS_READ_ONLY + ", " 14894a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA1 + ", " 14904a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA2 + ", " 14914a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA3 + ", " 14924a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA4 + ", " 14934a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA5 + ", " 14944a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA6 + ", " 14954a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA7 + ", " 14964a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA8 + ", " 14974a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA9 + ", " 14984a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA10 + ", " 14994a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA11 + ", " 15004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA12 + ", " 15014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA13 + ", " 15024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA14 + ", " 15034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.DATA15 + ", " 15044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.SYNC1 + ", " 15054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.SYNC2 + ", " 15064a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.SYNC3 + ", " 15074a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.SYNC4; 15084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15094a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String syncColumns = 15104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov RawContactsColumns.CONCRETE_ACCOUNT_NAME + " AS " + RawContacts.ACCOUNT_NAME + "," 15114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " AS " + RawContacts.ACCOUNT_TYPE + "," 151243368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + RawContactsColumns.CONCRETE_DATA_SET + " AS " + RawContacts.DATA_SET + "," 151343368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + "(CASE WHEN " + RawContactsColumns.CONCRETE_DATA_SET + " IS NULL THEN " 151443368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + RawContactsColumns.CONCRETE_ACCOUNT_TYPE 151543368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + " ELSE " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + "||'/'||" 151643368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + RawContactsColumns.CONCRETE_DATA_SET + " END) AS " 151743368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + RawContacts.ACCOUNT_TYPE_AND_DATA_SET + "," 15184a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_SOURCE_ID + " AS " + RawContacts.SOURCE_ID + "," 151943368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + RawContactsColumns.CONCRETE_NAME_VERIFIED + " AS " 152043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + RawContacts.NAME_VERIFIED + "," 15214a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_VERSION + " AS " + RawContacts.VERSION + "," 15224a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_DIRTY + " AS " + RawContacts.DIRTY + "," 15234a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_SYNC1 + " AS " + RawContacts.SYNC1 + "," 15244a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_SYNC2 + " AS " + RawContacts.SYNC2 + "," 15254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_SYNC3 + " AS " + RawContacts.SYNC3 + "," 15264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_SYNC4 + " AS " + RawContacts.SYNC4; 15274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15283d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov String baseContactColumns = 15293d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.HAS_PHONE_NUMBER + ", " 15303d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + Contacts.NAME_RAW_CONTACT_ID + ", " 15313d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + Contacts.LOOKUP_KEY + ", " 15323d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + Contacts.PHOTO_ID + ", " 1533f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + Contacts.PHOTO_FILE_ID + ", " 15343d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + Clauses.CONTACT_VISIBLE + " AS " + Contacts.IN_VISIBLE_GROUP + ", " 15353d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + ContactsColumns.LAST_STATUS_UPDATE_ID; 15363d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov 15374a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String contactOptionColumns = 15384a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContactsColumns.CONCRETE_CUSTOM_RINGTONE 15394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + RawContacts.CUSTOM_RINGTONE + "," 15404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_SEND_TO_VOICEMAIL 15414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + RawContacts.SEND_TO_VOICEMAIL + "," 15424a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_LAST_TIME_CONTACTED 15434a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + RawContacts.LAST_TIME_CONTACTED + "," 15444a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_TIMES_CONTACTED 15454a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + RawContacts.TIMES_CONTACTED + "," 15464a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_STARRED 15474a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + RawContacts.STARRED; 15484a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 15495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String contactNameColumns = 15505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov "name_raw_contact." + RawContacts.DISPLAY_NAME_SOURCE 15515dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.DISPLAY_NAME_SOURCE + ", " 15525dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.DISPLAY_NAME_PRIMARY 15535dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.DISPLAY_NAME_PRIMARY + ", " 15545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.DISPLAY_NAME_ALTERNATIVE 15555dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.DISPLAY_NAME_ALTERNATIVE + ", " 15565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.PHONETIC_NAME 15575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.PHONETIC_NAME + ", " 15585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.PHONETIC_NAME_STYLE 15595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.PHONETIC_NAME_STYLE + ", " 15605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.SORT_KEY_PRIMARY 15615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " AS " + Contacts.SORT_KEY_PRIMARY + ", " 15625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "name_raw_contact." + RawContacts.SORT_KEY_ALTERNATIVE 15634394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov + " AS " + Contacts.SORT_KEY_ALTERNATIVE; 15645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 15654a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String dataSelect = "SELECT " 15664a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + DataColumns.CONCRETE_ID + " AS " + Data._ID + "," 15674a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Data.RAW_CONTACT_ID + ", " 1568fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + RawContactsColumns.CONCRETE_CONTACT_ID + " AS " + RawContacts.CONTACT_ID + ", " 15694a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + syncColumns + ", " 15704a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + dataColumns + ", " 15714a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + contactOptionColumns + ", " 15725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + contactNameColumns + ", " 15733d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + baseContactColumns + ", " 1574f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + buildDisplayPhotoUriAlias(RawContactsColumns.CONCRETE_CONTACT_ID, 15753d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI) + ", " 1576f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + buildThumbnailPhotoUriAlias(RawContactsColumns.CONCRETE_CONTACT_ID, 15773d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI) + ", " 157824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro + "EXISTS (SELECT 1 FROM " + Tables.ACCOUNTS + 157924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " WHERE " + DataColumns.CONCRETE_RAW_CONTACT_ID + 158024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "=" + AccountsColumns.PROFILE_RAW_CONTACT_ID + ") AS " + 158124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE + ", " 15824a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + Tables.GROUPS + "." + Groups.SOURCE_ID + " AS " + GroupMembership.GROUP_SOURCE_ID 15834a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " FROM " + Tables.DATA 1584a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + " JOIN " + Tables.MIMETYPES + " ON (" 15854a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + DataColumns.CONCRETE_MIMETYPE_ID + "=" + MimetypesColumns.CONCRETE_ID + ")" 1586a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + " JOIN " + Tables.RAW_CONTACTS + " ON (" 15874a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + DataColumns.CONCRETE_RAW_CONTACT_ID + "=" + RawContactsColumns.CONCRETE_ID + ")" 1588a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + " JOIN " + Tables.CONTACTS + " ON (" 1589fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + RawContactsColumns.CONCRETE_CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID + ")" 1590fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + " JOIN " + Tables.RAW_CONTACTS + " AS name_raw_contact ON(" 1591fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + Contacts.NAME_RAW_CONTACT_ID + "=name_raw_contact." + RawContacts._ID + ")" 1592a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + " LEFT OUTER JOIN " + Tables.PACKAGES + " ON (" 1593a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + DataColumns.CONCRETE_PACKAGE_ID + "=" + PackagesColumns.CONCRETE_ID + ")" 15944a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.GROUPS + " ON (" 15954a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + MimetypesColumns.CONCRETE_MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE 1596f23764675b35b5262a39c79aad8e9842460274b2Dmitri Plotnikov + "' AND " + GroupsColumns.CONCRETE_ID + "=" 1597a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + Tables.DATA + "." + GroupMembership.GROUP_ROW_ID + ")"; 15984a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1599ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann db.execSQL("CREATE VIEW " + Views.DATA + " AS " + dataSelect); 16004a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16014a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String rawContactOptionColumns = 16024a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov RawContacts.CUSTOM_RINGTONE + "," 16034a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.SEND_TO_VOICEMAIL + "," 16044a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.LAST_TIME_CONTACTED + "," 16054a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.TIMES_CONTACTED + "," 16064a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.STARRED; 16074a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16084a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String rawContactsSelect = "SELECT " 16094a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContactsColumns.CONCRETE_ID + " AS " + RawContacts._ID + "," 16104a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.CONTACT_ID + ", " 16114a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.AGGREGATION_MODE + ", " 161297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov + RawContacts.RAW_CONTACT_IS_READ_ONLY + ", " 16134a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + RawContacts.DELETED + ", " 16145dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.DISPLAY_NAME_SOURCE + ", " 16155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.DISPLAY_NAME_PRIMARY + ", " 16165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.DISPLAY_NAME_ALTERNATIVE + ", " 16175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.PHONETIC_NAME + ", " 16185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.PHONETIC_NAME_STYLE + ", " 16195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.SORT_KEY_PRIMARY + ", " 16205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.SORT_KEY_ALTERNATIVE + ", " 162124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro + "EXISTS (SELECT 1 FROM " + Tables.ACCOUNTS + 162224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " WHERE " + AccountsColumns.PROFILE_RAW_CONTACT_ID + 162324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "=" + RawContactsColumns.CONCRETE_ID + ") AS " + 162424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE + ", " 16254a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + rawContactOptionColumns + ", " 16264a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + syncColumns 16274a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " FROM " + Tables.RAW_CONTACTS; 16284a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1629ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann db.execSQL("CREATE VIEW " + Views.RAW_CONTACTS + " AS " + rawContactsSelect); 16304a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16314a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String contactsColumns = 16324a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov ContactsColumns.CONCRETE_CUSTOM_RINGTONE 16334a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + Contacts.CUSTOM_RINGTONE + ", " 16345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + contactNameColumns + ", " 16353d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + baseContactColumns + ", " 16364a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_LAST_TIME_CONTACTED 16374a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + Contacts.LAST_TIME_CONTACTED + ", " 16384a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_SEND_TO_VOICEMAIL 16394a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + Contacts.SEND_TO_VOICEMAIL + ", " 16404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_STARRED 16414a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " AS " + Contacts.STARRED + ", " 16424a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_TIMES_CONTACTED 16433d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + " AS " + Contacts.TIMES_CONTACTED; 16444a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 16454a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov String contactsSelect = "SELECT " 16464a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + ContactsColumns.CONCRETE_ID + " AS " + Contacts._ID + "," 16473d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov + contactsColumns + ", " 1648f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + buildDisplayPhotoUriAlias(ContactsColumns.CONCRETE_ID, Contacts.PHOTO_URI) + ", " 1649f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + buildThumbnailPhotoUriAlias(ContactsColumns.CONCRETE_ID, 165024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.PHOTO_THUMBNAIL_URI) + ", " 165124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro + "EXISTS (SELECT 1 FROM " + Tables.ACCOUNTS + 165224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " JOIN " + Tables.RAW_CONTACTS + " ON " + RawContactsColumns.CONCRETE_ID + "=" + 165324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.PROFILE_RAW_CONTACT_ID + 165424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " WHERE " + RawContactsColumns.CONCRETE_CONTACT_ID + 165524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "=" + ContactsColumns.CONCRETE_ID + ") AS " + 165624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE 16574a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov + " FROM " + Tables.CONTACTS 1658fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + " JOIN " + Tables.RAW_CONTACTS + " AS name_raw_contact ON(" 1659fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + Contacts.NAME_RAW_CONTACT_ID + "=name_raw_contact." + RawContacts._ID + ")"; 16604a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1661ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann db.execSQL("CREATE VIEW " + Views.CONTACTS + " AS " + contactsSelect); 1662a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 1663a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov String rawEntitiesSelect = "SELECT " 1664a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContacts.CONTACT_ID + ", " 1665a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_DELETED + " AS " + RawContacts.DELETED + "," 1666a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + dataColumns + ", " 1667a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + syncColumns + ", " 1668a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC1 + ", " 1669a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC2 + ", " 1670a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC3 + ", " 1671a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC4 + ", " 1672a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_ID + " AS " + RawContacts._ID + ", " 1673a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_ID + " AS " + RawContacts.Entity.DATA_ID + "," 1674a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_STARRED + " AS " + RawContacts.STARRED + "," 167524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro + "EXISTS (SELECT 1 FROM " + Tables.ACCOUNTS + 167624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " WHERE " + RawContactsColumns.CONCRETE_ID + 167724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "=" + AccountsColumns.PROFILE_RAW_CONTACT_ID + ") AS " + 167824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro RawContacts.RAW_CONTACT_IS_USER_PROFILE + "," 1679a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Tables.GROUPS + "." + Groups.SOURCE_ID + " AS " + GroupMembership.GROUP_SOURCE_ID 1680a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " FROM " + Tables.RAW_CONTACTS 1681a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.DATA + " ON (" 1682a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_RAW_CONTACT_ID + "=" + RawContactsColumns.CONCRETE_ID + ")" 1683a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.PACKAGES + " ON (" 1684a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_PACKAGE_ID + "=" + PackagesColumns.CONCRETE_ID + ")" 1685a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.MIMETYPES + " ON (" 1686a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_MIMETYPE_ID + "=" + MimetypesColumns.CONCRETE_ID + ")" 1687a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.GROUPS + " ON (" 1688a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + MimetypesColumns.CONCRETE_MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE 1689a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + "' AND " + GroupsColumns.CONCRETE_ID + "=" 1690a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Tables.DATA + "." + GroupMembership.GROUP_ROW_ID + ")"; 1691a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 1692a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.RAW_ENTITIES + " AS " 1693a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + rawEntitiesSelect); 1694a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 1695a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov String entitiesSelect = "SELECT " 1696a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_CONTACT_ID + " AS " + Contacts._ID + ", " 1697a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_CONTACT_ID + " AS " + RawContacts.CONTACT_ID + ", " 1698a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_DELETED + " AS " + RawContacts.DELETED + "," 1699a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + dataColumns + ", " 1700a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + syncColumns + ", " 1701a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + contactsColumns + ", " 1702f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + buildDisplayPhotoUriAlias(RawContactsColumns.CONCRETE_CONTACT_ID, 17033d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_URI) + ", " 1704f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + buildThumbnailPhotoUriAlias(RawContactsColumns.CONCRETE_CONTACT_ID, 17053d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov Contacts.PHOTO_THUMBNAIL_URI) + ", " 170624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro + "EXISTS (SELECT 1 FROM " + Tables.ACCOUNTS + 170724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " JOIN " + Tables.RAW_CONTACTS + " ON " + RawContactsColumns.CONCRETE_ID + "=" + 170824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro AccountsColumns.PROFILE_RAW_CONTACT_ID + 170924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " WHERE " + RawContactsColumns.CONCRETE_CONTACT_ID + 171024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro "=" + ContactsColumns.CONCRETE_ID + ") AS " + 171124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro Contacts.IS_USER_PROFILE + ", " 1712a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC1 + ", " 1713a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC2 + ", " 1714a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC3 + ", " 1715a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Data.SYNC4 + ", " 1716a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_ID + " AS " + Contacts.Entity.RAW_CONTACT_ID + ", " 1717a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_ID + " AS " + Contacts.Entity.DATA_ID + "," 1718a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Tables.GROUPS + "." + Groups.SOURCE_ID + " AS " + GroupMembership.GROUP_SOURCE_ID 1719a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " FROM " + Tables.RAW_CONTACTS 1720a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " JOIN " + Tables.CONTACTS + " ON (" 1721a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + RawContactsColumns.CONCRETE_CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID + ")" 1722a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " JOIN " + Tables.RAW_CONTACTS + " AS name_raw_contact ON(" 1723a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Contacts.NAME_RAW_CONTACT_ID + "=name_raw_contact." + RawContacts._ID + ")" 1724a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.DATA + " ON (" 1725a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_RAW_CONTACT_ID + "=" + RawContactsColumns.CONCRETE_ID + ")" 1726a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.PACKAGES + " ON (" 1727a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_PACKAGE_ID + "=" + PackagesColumns.CONCRETE_ID + ")" 1728a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.MIMETYPES + " ON (" 1729a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + DataColumns.CONCRETE_MIMETYPE_ID + "=" + MimetypesColumns.CONCRETE_ID + ")" 1730a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + " LEFT OUTER JOIN " + Tables.GROUPS + " ON (" 1731a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + MimetypesColumns.CONCRETE_MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE 1732a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + "' AND " + GroupsColumns.CONCRETE_ID + "=" 1733a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + Tables.DATA + "." + GroupMembership.GROUP_ROW_ID + ")"; 1734a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 1735a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov db.execSQL("CREATE VIEW " + Views.ENTITIES + " AS " 1736a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov + entitiesSelect); 17372f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 17382f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa String dataUsageStatSelect = "SELECT " 17392f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataUsageStatColumns.CONCRETE_ID + " AS " + DataUsageStatColumns._ID + ", " 17402f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataUsageStatColumns.DATA_ID + ", " 17412f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + RawContactsColumns.CONCRETE_CONTACT_ID + " AS " + RawContacts.CONTACT_ID + ", " 17422f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + MimetypesColumns.CONCRETE_MIMETYPE + " AS " + Data.MIMETYPE + ", " 17432f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataUsageStatColumns.USAGE_TYPE_INT + ", " 17442f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataUsageStatColumns.TIMES_USED + ", " 17452f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataUsageStatColumns.LAST_TIME_USED 17462f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + " FROM " + Tables.DATA_USAGE_STAT 17472f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + " JOIN " + Tables.DATA + " ON (" 17482f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + DataColumns.CONCRETE_ID + "=" + DataUsageStatColumns.CONCRETE_DATA_ID + ")" 17492f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + " JOIN " + Tables.RAW_CONTACTS + " ON (" 17502f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + RawContactsColumns.CONCRETE_ID + "=" + DataColumns.CONCRETE_RAW_CONTACT_ID 17512f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + " )" 17522f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + " JOIN " + Tables.MIMETYPES + " ON (" 17532f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa + MimetypesColumns.CONCRETE_ID + "=" + DataColumns.CONCRETE_MIMETYPE_ID + ")"; 17542f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 1755ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann db.execSQL("CREATE VIEW " + Views.DATA_USAGE_STAT + " AS " + dataUsageStatSelect); 17569b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann 17579b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann String streamItemSelect = "SELECT " + 17589b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann StreamItemsColumns.CONCRETE_ID + ", " + 17599b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann ContactsColumns.CONCRETE_ID + " AS " + StreamItems.CONTACT_ID + ", " + 1760af10329f85c5d8c4196c495a9f0f9a6c6ecbc231Daniel Lehmann ContactsColumns.CONCRETE_LOOKUP_KEY + 1761af10329f85c5d8c4196c495a9f0f9a6c6ecbc231Daniel Lehmann " AS " + StreamItems.CONTACT_LOOKUP_KEY + ", " + 17629b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann RawContactsColumns.CONCRETE_ACCOUNT_NAME + ", " + 17639b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann RawContactsColumns.CONCRETE_ACCOUNT_TYPE + ", " + 17649b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann RawContactsColumns.CONCRETE_DATA_SET + ", " + 17659b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann StreamItemsColumns.CONCRETE_RAW_CONTACT_ID + 17669b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann " as " + StreamItems.RAW_CONTACT_ID + ", " + 17679b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann RawContactsColumns.CONCRETE_SOURCE_ID + 17689b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann " as " + StreamItems.RAW_CONTACT_SOURCE_ID + ", " + 17699b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann StreamItemsColumns.CONCRETE_PACKAGE + ", " + 17709b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann StreamItemsColumns.CONCRETE_ICON + ", " + 17719b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann StreamItemsColumns.CONCRETE_LABEL + ", " + 17729b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann StreamItemsColumns.CONCRETE_TEXT + ", " + 17739b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann StreamItemsColumns.CONCRETE_TIMESTAMP + ", " + 17749b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann StreamItemsColumns.CONCRETE_COMMENTS + ", " + 17759b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann StreamItemsColumns.CONCRETE_SYNC1 + ", " + 17769b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann StreamItemsColumns.CONCRETE_SYNC2 + ", " + 17779b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann StreamItemsColumns.CONCRETE_SYNC3 + ", " + 17789b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann StreamItemsColumns.CONCRETE_SYNC4 + 17799b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann " FROM " + Tables.STREAM_ITEMS 17809b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann + " JOIN " + Tables.RAW_CONTACTS + " ON (" 17819b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann + StreamItemsColumns.CONCRETE_RAW_CONTACT_ID + "=" + RawContactsColumns.CONCRETE_ID 17829b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann + ") JOIN " + Tables.CONTACTS + " ON (" 17839b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann + RawContactsColumns.CONCRETE_CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID + ")"; 17849b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann 17859b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann db.execSQL("CREATE VIEW " + Views.STREAM_ITEMS + " AS " + streamItemSelect); 1786a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov } 17874a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 1788f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro private static String buildDisplayPhotoUriAlias(String contactIdColumn, String alias) { 1789f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro return "(CASE WHEN " + Contacts.PHOTO_FILE_ID + " IS NULL THEN (CASE WHEN " 1790f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + Contacts.PHOTO_ID + " IS NULL" 1791f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + " OR " + Contacts.PHOTO_ID + "=0" 1792f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + " THEN NULL" 1793f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + " ELSE '" + Contacts.CONTENT_URI + "/'||" 1794f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + contactIdColumn + "|| '/" + Photo.CONTENT_DIRECTORY + "'" 1795f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + " END) ELSE '" + DisplayPhoto.CONTENT_URI + "/'||" 1796f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + Contacts.PHOTO_FILE_ID + " END)" 1797f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + " AS " + alias; 1798f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 1799f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 1800f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro private static String buildThumbnailPhotoUriAlias(String contactIdColumn, String alias) { 1801f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro return "(CASE WHEN " 1802f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + Contacts.PHOTO_ID + " IS NULL" 18032b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov + " OR " + Contacts.PHOTO_ID + "=0" 18042b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov + " THEN NULL" 1805f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro + " ELSE '" + Contacts.CONTENT_URI + "/'||" 18062b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov + contactIdColumn + "|| '/" + Photo.CONTENT_DIRECTORY + "'" 18072b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov + " END)" 18082b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov + " AS " + alias; 18093d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov } 18103d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov 1811a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov private static void createGroupsView(SQLiteDatabase db) { 1812ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann db.execSQL("DROP VIEW IF EXISTS " + Views.GROUPS + ";"); 181389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov String groupsColumns = 181489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov Groups.ACCOUNT_NAME + "," 181589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.ACCOUNT_TYPE + "," 181643368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + Groups.DATA_SET + "," 181743368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + "(CASE WHEN " + Groups.DATA_SET + " IS NULL THEN " + Groups.ACCOUNT_TYPE 181843368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + " ELSE " + Groups.ACCOUNT_TYPE + "||" + Groups.DATA_SET + " END) AS " 181943368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + Groups.ACCOUNT_TYPE_AND_DATA_SET + "," 182089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SOURCE_ID + "," 182189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.VERSION + "," 182289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.DIRTY + "," 182389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.TITLE + "," 182489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.TITLE_RES + "," 182589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.NOTES + "," 182689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SYSTEM_ID + "," 182789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.DELETED + "," 182889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.GROUP_VISIBLE + "," 182989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SHOULD_SYNC + "," 1830dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana + Groups.AUTO_ADD + "," 1831dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana + Groups.FAVORITES + "," 1832c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov + Groups.GROUP_IS_READ_ONLY + "," 183389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SYNC1 + "," 183489c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SYNC2 + "," 183589c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SYNC3 + "," 183689c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + Groups.SYNC4 + "," 183789c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + PackagesColumns.PACKAGE + " AS " + Groups.RES_PACKAGE; 183889c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 183989c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov String groupsSelect = "SELECT " 184089c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + GroupsColumns.CONCRETE_ID + " AS " + Groups._ID + "," 184189c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + groupsColumns 184289c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov + " FROM " + Tables.GROUPS_JOIN_PACKAGES; 184389c626eb655440c86a2e5df076e83708c1b32c17Dmitri Plotnikov 1844ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann db.execSQL("CREATE VIEW " + Views.GROUPS + " AS " + groupsSelect); 1845b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 1846b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 1847b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey @Override 1848b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 184946b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana if (oldVersion < 99) { 185046b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana Log.i(TAG, "Upgrading from version " + oldVersion + " to " + newVersion 185146b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana + ", data will be lost!"); 185246b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana 185346b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.CONTACTS + ";"); 185446b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.RAW_CONTACTS + ";"); 185546b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.PACKAGES + ";"); 185646b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.MIMETYPES + ";"); 185746b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.DATA + ";"); 185846b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.PHONE_LOOKUP + ";"); 185946b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.NAME_LOOKUP + ";"); 186046b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.NICKNAME_LOOKUP + ";"); 186146b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.GROUPS + ";"); 186246b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.ACTIVITIES + ";"); 186346b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.CALLS + ";"); 186446b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.SETTINGS + ";"); 186546b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.STATUS_UPDATES + ";"); 186646b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana 186746b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana // TODO: we should not be dropping agg_exceptions and contact_options. In case that 186846b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana // table's schema changes, we should try to preserve the data, because it was entered 186946b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana // by the user and has never been synched to the server. 187046b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana db.execSQL("DROP TABLE IF EXISTS " + Tables.AGGREGATION_EXCEPTIONS + ";"); 187146b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana 187246b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana onCreate(db); 187346b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana return; 187446b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana } 1875f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 187646b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana Log.i(TAG, "Upgrading from version " + oldVersion + " to " + newVersion); 1877a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 187808e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov boolean upgradeViewsAndTriggers = false; 187904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov boolean upgradeNameLookup = false; 18808d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov boolean upgradeLegacyApiSupport = false; 1881155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov boolean upgradeSearchIndex = false; 188208e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov 188346b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana if (oldVersion == 99) { 188408e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 188546b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana oldVersion++; 188646b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana } 188746b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana 1888a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov if (oldVersion == 100) { 1889a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov db.execSQL("CREATE INDEX IF NOT EXISTS mimetypes_mimetype_index ON " 1890a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + Tables.MIMETYPES + " (" 1891a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + MimetypesColumns.MIMETYPE + "," 1892a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov + MimetypesColumns._ID + ");"); 1893a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov updateIndexStats(db, Tables.MIMETYPES, 1894a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov "mimetypes_mimetype_index", "50 1 1"); 1895a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 189608e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 1897a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov oldVersion++; 1898a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov } 1899a0e72d9b20207ec244f92ace2917932990f2bc8bDmitri Plotnikov 1900fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov if (oldVersion == 101) { 190108e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 1902fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov oldVersion++; 1903fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov } 1904fda634f3eeff6aed8e8dddca92fc07aa44befeddDmitri Plotnikov 190547ab23770b9f010a5e5277cda68267fe0613a1ccDmitri Plotnikov if (oldVersion == 102) { 190608e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 190747ab23770b9f010a5e5277cda68267fe0613a1ccDmitri Plotnikov oldVersion++; 190847ab23770b9f010a5e5277cda68267fe0613a1ccDmitri Plotnikov } 190947ab23770b9f010a5e5277cda68267fe0613a1ccDmitri Plotnikov 191036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov if (oldVersion == 103) { 191108e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 1912bf6a7e4dece49ba4e7cda17f7ed9250aeb82f731Jeff Sharkey oldVersion++; 1913bf6a7e4dece49ba4e7cda17f7ed9250aeb82f731Jeff Sharkey } 1914bf6a7e4dece49ba4e7cda17f7ed9250aeb82f731Jeff Sharkey 191571037c010a0b7c882284fc1ed8584a378d926b83Dmitri Plotnikov if (oldVersion == 104 || oldVersion == 201) { 191671037c010a0b7c882284fc1ed8584a378d926b83Dmitri Plotnikov LegacyApiSupport.createSettingsTable(db); 191708e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 19183410a80f4aafe5685da61c217808d2bf21d55dfcDmitri Plotnikov oldVersion++; 19193410a80f4aafe5685da61c217808d2bf21d55dfcDmitri Plotnikov } 19203410a80f4aafe5685da61c217808d2bf21d55dfcDmitri Plotnikov 192171037c010a0b7c882284fc1ed8584a378d926b83Dmitri Plotnikov if (oldVersion == 105) { 19225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeToVersion202(db); 192304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov upgradeNameLookup = true; 19243410a80f4aafe5685da61c217808d2bf21d55dfcDmitri Plotnikov oldVersion = 202; 192536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 192636045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 1927fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov if (oldVersion == 202) { 19285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeToVersion203(db); 192908e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 1930fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov oldVersion++; 1931fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov } 1932fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 19339b1bd62417ef1764829398a61c3d5df93a924106Vasu Nori if (oldVersion == 203) { 193408e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 19359b1bd62417ef1764829398a61c3d5df93a924106Vasu Nori oldVersion++; 19369b1bd62417ef1764829398a61c3d5df93a924106Vasu Nori } 19379b1bd62417ef1764829398a61c3d5df93a924106Vasu Nori 19385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (oldVersion == 204) { 19395dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeToVersion205(db); 194008e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov upgradeViewsAndTriggers = true; 19415dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov oldVersion++; 19425dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 19435dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 1944f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov if (oldVersion == 205) { 1945f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov upgrateToVersion206(db); 1946f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov upgradeViewsAndTriggers = true; 1947f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov oldVersion++; 1948f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov } 1949f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 195031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov if (oldVersion == 206) { 1951b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov upgradeToVersion300(db); 195234469970fb04b9b188b5430f592b0c956a6ea2aaDmitri Plotnikov oldVersion = 300; 195331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov } 195431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 19556c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook if (oldVersion == 300) { 19566c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook upgradeViewsAndTriggers = true; 19576c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook oldVersion = 301; 19586c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook } 19596c0d1eb7a960d7f8c4a42a9e0ae10487654f5f7ePaul Westbrook 1960916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov if (oldVersion == 301) { 1961916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov upgradeViewsAndTriggers = true; 1962916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov oldVersion = 302; 1963916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov } 1964916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov 1965b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (oldVersion == 302) { 1966b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov upgradeEmailToVersion303(db); 1967b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov upgradeNicknameToVersion303(db); 1968b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov oldVersion = 303; 1969b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 1970b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 197108768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov if (oldVersion == 303) { 197208768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov upgradeToVersion304(db); 197308768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov oldVersion = 304; 197408768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov } 197508768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov 1976f84478382761d74b9fb98c4189de66002c04cef8Sang-il, Lee if (oldVersion == 304) { 1977f84478382761d74b9fb98c4189de66002c04cef8Sang-il, Lee upgradeNameLookup = true; 1978f84478382761d74b9fb98c4189de66002c04cef8Sang-il, Lee oldVersion = 305; 1979f84478382761d74b9fb98c4189de66002c04cef8Sang-il, Lee } 1980f84478382761d74b9fb98c4189de66002c04cef8Sang-il, Lee 198160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann if (oldVersion == 305) { 198260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann upgradeToVersion306(db); 198360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann oldVersion = 306; 198460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 198560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 1986b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov if (oldVersion == 306) { 1987b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov upgradeToVersion307(db); 1988b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov oldVersion = 307; 1989b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 1990b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 1991743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov if (oldVersion == 307) { 1992743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov upgradeToVersion308(db); 1993743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov oldVersion = 308; 1994743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov } 1995743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 199694c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov // Gingerbread upgrades 199794c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov if (oldVersion < 350) { 1998afbf2a3343d0f8e7ae7cbfbbec60004ed37caf3fDaniel Lehmann upgradeViewsAndTriggers = true; 199994c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov oldVersion = 351; 2000afbf2a3343d0f8e7ae7cbfbbec60004ed37caf3fDaniel Lehmann } 2001afbf2a3343d0f8e7ae7cbfbbec60004ed37caf3fDaniel Lehmann 200294c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov if (oldVersion == 351) { 200394c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov upgradeNameLookup = true; 200494c6c5a4a2666efc9236237b5650c73d576e8a61Dmitri Plotnikov oldVersion = 352; 200580d7871ca31d604cbfd857661d5300bb090076dbDaniel Lehmann } 200680d7871ca31d604cbfd857661d5300bb090076dbDaniel Lehmann 20077da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov if (oldVersion == 352) { 20087da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov upgradeToVersion353(db); 20097da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov oldVersion = 353; 20107da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov } 20117da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov 2012f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov // Honeycomb upgrades 2013f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov if (oldVersion < 400) { 2014dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana upgradeViewsAndTriggers = true; 2015f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov upgradeToVersion400(db); 2016f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov oldVersion = 400; 2017dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 2018dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 2019f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov if (oldVersion == 400) { 20204394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov upgradeViewsAndTriggers = true; 20214394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov upgradeToVersion401(db); 20224394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov oldVersion = 401; 20234394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov } 20244394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 2025d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov if (oldVersion == 401) { 2026d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov upgradeToVersion402(db); 2027d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov oldVersion = 402; 2028d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 2029d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 203097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov if (oldVersion == 402) { 203197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov upgradeViewsAndTriggers = true; 203297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov upgradeToVersion403(db); 203397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov oldVersion = 403; 203497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 203597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 2036a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov if (oldVersion == 403) { 2037a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov upgradeViewsAndTriggers = true; 2038a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov oldVersion = 404; 2039a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov } 2040a549eb3c9627862a3e45d910d5c981191086a949Dmitri Plotnikov 2041892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (oldVersion == 404) { 2042892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov upgradeViewsAndTriggers = true; 2043892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov upgradeToVersion405(db); 2044892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov oldVersion = 405; 2045892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 2046892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 20472530512f639c4979fd7371c7dd25dd67e8118124Bai Tao if (oldVersion == 405) { 20482530512f639c4979fd7371c7dd25dd67e8118124Bai Tao upgradeViewsAndTriggers = true; 20492530512f639c4979fd7371c7dd25dd67e8118124Bai Tao upgradeToVersion406(db); 20502530512f639c4979fd7371c7dd25dd67e8118124Bai Tao oldVersion = 406; 20512530512f639c4979fd7371c7dd25dd67e8118124Bai Tao } 20522530512f639c4979fd7371c7dd25dd67e8118124Bai Tao 2053cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov if (oldVersion == 406) { 2054cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov upgradeViewsAndTriggers = true; 2055cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov oldVersion = 407; 2056cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov } 2057cf832869bcf91b8037d8b7f510a3a213b30764a3Dmitri Plotnikov 2058385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov if (oldVersion == 407) { 2059d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov // Obsolete 2060385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov oldVersion = 408; 2061385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov } 2062385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 20633d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov if (oldVersion == 408) { 20643d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov upgradeViewsAndTriggers = true; 20653d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov upgradeToVersion409(db); 20663d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov oldVersion = 409; 20673d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov } 20683d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov 20692b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov if (oldVersion == 409) { 20702b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov upgradeViewsAndTriggers = true; 20712b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov oldVersion = 410; 20722b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov } 20732b07b826e208e464bbd85d4679aab956bef0bafcDmitri Plotnikov 2074d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov if (oldVersion == 410) { 2075d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov upgradeToVersion411(db); 2076d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov oldVersion = 411; 2077d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov } 2078d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov 20797da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov if (oldVersion == 411) { 20807da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov // Same upgrade as 353, only on Honeycomb devices 20817da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov upgradeToVersion353(db); 20827da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov oldVersion = 412; 20837da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov } 20847da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov 2085e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov if (oldVersion == 412) { 2086e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov upgradeToVersion413(db); 2087e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov oldVersion = 413; 2088e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov } 2089e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov 209056f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee if (oldVersion == 413) { 209156f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee upgradeNameLookup = true; 209256f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee oldVersion = 414; 209356f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee } 209456f2638b49e6bca97f6aa7b0768a8f1fe6e7b72eSang-il, Lee 2095c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov if (oldVersion == 414) { 2096c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov upgradeToVersion415(db); 2097c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov upgradeViewsAndTriggers = true; 2098c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov oldVersion = 415; 2099c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov } 2100c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov 2101d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov if (oldVersion == 415) { 2102d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov upgradeToVersion416(db); 2103d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov oldVersion = 416; 2104d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov } 2105d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov 21068d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov if (oldVersion == 416) { 21078d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov upgradeLegacyApiSupport = true; 21088d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov oldVersion = 417; 21098d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov } 21108d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov 2111f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov // Honeycomb-MR1 upgrades 2112f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov if (oldVersion < 500) { 2113155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov upgradeSearchIndex = true; 2114f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 2115f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 2116197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov if (oldVersion < 501) { 2117155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov upgradeSearchIndex = true; 2118197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov upgradeToVersion501(db); 2119197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov oldVersion = 501; 2120197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov } 2121197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov 212292ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov if (oldVersion < 502) { 2123155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov upgradeSearchIndex = true; 212492ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov upgradeToVersion502(db); 212592ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov oldVersion = 502; 212692ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov } 212792ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov 2128155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov if (oldVersion < 503) { 2129155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov upgradeSearchIndex = true; 2130155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov oldVersion = 503; 2131155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov } 2132155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov 213355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov if (oldVersion < 504) { 213455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov upgradeToVersion504(db); 213555e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov oldVersion = 504; 213655e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 213755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 213824c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro if (oldVersion < 600) { 213924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro upgradeToVersion600(db); 214024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro upgradeViewsAndTriggers = true; 214124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro oldVersion = 600; 214224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 214324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 214446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa if (oldVersion < 601) { 214546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa upgradeToVersion601(db); 214646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa oldVersion = 601; 214746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa } 214846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 214959f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee if (oldVersion < 602) { 215059f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee upgradeToVersion602(db); 215159f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee oldVersion = 602; 215259f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee } 215359f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee 21542f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa if (oldVersion < 603) { 21552f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa upgradeViewsAndTriggers = true; 21562f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa oldVersion = 603; 21572f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa } 21582f830d3bb66f780937203e9738e046841a070e73Daisuke Miyakawa 2159069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee if (oldVersion < 604) { 2160069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee upgradeToVersion604(db); 2161069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee oldVersion = 604; 2162069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee } 2163069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee 21643b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann if (oldVersion < 605) { 2165f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro upgradeViewsAndTriggers = true; 21663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann upgradeToVersion605(db); 21673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann oldVersion = 605; 21683b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 21693b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 2170ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann if (oldVersion < 606) { 2171ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann upgradeViewsAndTriggers = true; 2172ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann upgradeLegacyApiSupport = true; 2173ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann upgradeToVersion606(db); 2174ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann oldVersion = 606; 2175ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann } 2176ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann 21771cdfc9dacc136e99d3c0bc5b4212bc3c973be337Daniel Lehmann if (oldVersion < 607) { 21781cdfc9dacc136e99d3c0bc5b4212bc3c973be337Daniel Lehmann upgradeViewsAndTriggers = true; 21791cdfc9dacc136e99d3c0bc5b4212bc3c973be337Daniel Lehmann upgradeToVersion607(db); 21801cdfc9dacc136e99d3c0bc5b4212bc3c973be337Daniel Lehmann oldVersion = 607; 21811cdfc9dacc136e99d3c0bc5b4212bc3c973be337Daniel Lehmann } 21821cdfc9dacc136e99d3c0bc5b4212bc3c973be337Daniel Lehmann 2183f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro if (oldVersion < 608) { 2184f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro upgradeViewsAndTriggers = true; 2185f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro upgradeToVersion608(db); 2186f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro oldVersion = 608; 2187f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 2188f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 21896802030a777c0c3ba1dc029c534cca4784260632Dave Santoro if (oldVersion < 609) { 21906802030a777c0c3ba1dc029c534cca4784260632Dave Santoro upgradeToVersion609(db); 21916802030a777c0c3ba1dc029c534cca4784260632Dave Santoro oldVersion = 609; 21926802030a777c0c3ba1dc029c534cca4784260632Dave Santoro } 21936802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 2194b2197b235e3d96e7f70c24d548b7dac52dab88d8Flavio Lerda if (oldVersion < 610) { 2195b2197b235e3d96e7f70c24d548b7dac52dab88d8Flavio Lerda upgradeToVersion610(db); 2196b2197b235e3d96e7f70c24d548b7dac52dab88d8Flavio Lerda oldVersion = 610; 2197b2197b235e3d96e7f70c24d548b7dac52dab88d8Flavio Lerda } 2198b2197b235e3d96e7f70c24d548b7dac52dab88d8Flavio Lerda 219943368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro if (oldVersion < 611) { 220043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro upgradeViewsAndTriggers = true; 220143368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro upgradeToVersion611(db); 220243368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro oldVersion = 611; 220343368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro } 2204f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 2205aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda if (oldVersion < 612) { 2206aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda upgradeViewsAndTriggers = true; 2207aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda upgradeToVersion612(db); 2208aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda oldVersion = 612; 2209aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda } 2210aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda 22110bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann if (oldVersion < 613) { 22120bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann upgradeToVersion613(db); 22130bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann oldVersion = 613; 22140bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann } 22150bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann 22169b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann if (oldVersion < 614) { 22179b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann // this creates the view "view_stream_items" 22189b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann upgradeViewsAndTriggers = true; 22199b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann oldVersion = 614; 22209b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann } 22219b002837367674b7403769f52dc50ab4dbecef71Daniel Lehmann 22227a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda if (oldVersion < 615) { 22237a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda upgradeToVersion615(db); 22247a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda oldVersion = 615; 22257a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda } 22267a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda 2227af10329f85c5d8c4196c495a9f0f9a6c6ecbc231Daniel Lehmann if (oldVersion < 616) { 2228af10329f85c5d8c4196c495a9f0f9a6c6ecbc231Daniel Lehmann // this updates the "view_stream_items" view 2229af10329f85c5d8c4196c495a9f0f9a6c6ecbc231Daniel Lehmann upgradeViewsAndTriggers = true; 2230af10329f85c5d8c4196c495a9f0f9a6c6ecbc231Daniel Lehmann oldVersion = 616; 2231af10329f85c5d8c4196c495a9f0f9a6c6ecbc231Daniel Lehmann } 2232af10329f85c5d8c4196c495a9f0f9a6c6ecbc231Daniel Lehmann 223308e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov if (upgradeViewsAndTriggers) { 223408e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov createContactsViews(db); 223508e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov createGroupsView(db); 223608e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov createContactsTriggers(db); 2237916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov createContactsIndexes(db); 2238916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov updateSqliteStats(db); 22398d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov upgradeLegacyApiSupport = true; 2240916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov mReopenDatabase = true; 224108e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov } 224208e50780099971e8927b258ef2ae93d44f98668cDmitri Plotnikov 22438d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov if (upgradeLegacyApiSupport) { 22448d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov LegacyApiSupport.createViews(db); 22458d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov } 22468d2a74522d7b6f792edc74742b594fcb5251fbe2Dmitri Plotnikov 224704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov if (upgradeNameLookup) { 224804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov rebuildNameLookup(db); 224904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 225004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 2251155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov if (upgradeSearchIndex) { 22522c4caaa35be9f8909e8eee26142c4747bbf65aacDaniel Lehmann createSearchIndexTable(db); 2253155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov setProperty(db, SearchIndexManager.PROPERTY_SEARCH_INDEX_VERSION, "0"); 2254155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov } 2255155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov 225646b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana if (oldVersion != newVersion) { 225746b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana throw new IllegalStateException( 225846b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana "error upgrading the database to version " + newVersion); 225946b7bfa3728bf878d1a9dac9fea35fa629975e1bFred Quintana } 2260b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 2261b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 22625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeToVersion202(SQLiteDatabase db) { 226336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov db.execSQL( 226436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov "ALTER TABLE " + Tables.PHONE_LOOKUP + 226536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov " ADD " + PhoneLookupColumns.MIN_MATCH + " TEXT;"); 226636045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 226736045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_min_match_index ON " + Tables.PHONE_LOOKUP + " (" + 226836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.MIN_MATCH + "," + 226936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID + "," + 227036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov PhoneLookupColumns.DATA_ID + 227136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov ");"); 227236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 227336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov updateIndexStats(db, Tables.PHONE_LOOKUP, 227436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov "phone_lookup_min_match_index", "10000 2 2 1"); 227536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 227636045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov SQLiteStatement update = db.compileStatement( 227736045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov "UPDATE " + Tables.PHONE_LOOKUP + 227836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov " SET " + PhoneLookupColumns.MIN_MATCH + "=?" + 227936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov " WHERE " + PhoneLookupColumns.DATA_ID + "=?"); 228036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 228136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov // Populate the new column 228236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov Cursor c = db.query(Tables.PHONE_LOOKUP + " JOIN " + Tables.DATA + 228336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov " ON (" + PhoneLookupColumns.DATA_ID + "=" + DataColumns.CONCRETE_ID + ")", 228436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov new String[]{Data._ID, Phone.NUMBER}, null, null, null, null, null); 228536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov try { 228636045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov while (c.moveToNext()) { 228736045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov long dataId = c.getLong(0); 228836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov String number = c.getString(1); 228936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov if (!TextUtils.isEmpty(number)) { 229036045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov update.bindString(1, PhoneNumberUtils.toCallerIDMinMatch(number)); 229136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov update.bindLong(2, dataId); 229236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov update.execute(); 229336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 229436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 229536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } finally { 229636045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov c.close(); 229736045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 229836045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 229936045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 23005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeToVersion203(SQLiteDatabase db) { 2301758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov // Garbage-collect first. A bug in Eclair was sometimes leaving 2302758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov // raw_contacts in the database that no longer had contacts associated 2303758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov // with them. To avoid failures during this database upgrade, drop 2304758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov // the orphaned raw_contacts. 2305758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov db.execSQL( 2306758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov "DELETE FROM raw_contacts" + 2307758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov " WHERE contact_id NOT NULL" + 2308758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov " AND contact_id NOT IN (SELECT _id FROM contacts)"); 2309758a7562d72b0a6ed336beac508eedf7b369fa20Dmitri Plotnikov 2310fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2311fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "ALTER TABLE " + Tables.CONTACTS + 2312fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " ADD " + Contacts.NAME_RAW_CONTACT_ID + " INTEGER REFERENCES raw_contacts(_id)"); 2313fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2314fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "ALTER TABLE " + Tables.RAW_CONTACTS + 23154394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " ADD contact_in_visible_group INTEGER NOT NULL DEFAULT 0"); 2316fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2317fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // For each Contact, find the RawContact that contributed the display name 2318fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2319fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "UPDATE " + Tables.CONTACTS + 2320fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " SET " + Contacts.NAME_RAW_CONTACT_ID + "=(" + 2321fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " SELECT " + RawContacts._ID + 2322fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 2323fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID + 2324fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_DISPLAY_NAME + "=" + 2325fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Tables.CONTACTS + "." + Contacts.DISPLAY_NAME + 2326fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " ORDER BY " + RawContacts._ID + 2327fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " LIMIT 1)" 2328fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ); 2329fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2330fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL("CREATE INDEX contacts_name_raw_contact_id_index ON " + Tables.CONTACTS + " (" + 2331fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Contacts.NAME_RAW_CONTACT_ID + 2332fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ");"); 2333fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2334fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // If for some unknown reason we missed some names, let's make sure there are 2335fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // no contacts without a name, picking a raw contact "at random". 2336fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2337fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "UPDATE " + Tables.CONTACTS + 2338fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " SET " + Contacts.NAME_RAW_CONTACT_ID + "=(" + 2339fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " SELECT " + RawContacts._ID + 2340fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 2341fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID + 2342fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " ORDER BY " + RawContacts._ID + 2343fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " LIMIT 1)" + 2344fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " WHERE " + Contacts.NAME_RAW_CONTACT_ID + " IS NULL" 2345fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ); 2346fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2347fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // Wipe out DISPLAY_NAME on the Contacts table as it is no longer in use. 2348fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2349fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "UPDATE " + Tables.CONTACTS + 2350fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " SET " + Contacts.DISPLAY_NAME + "=NULL" 2351fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ); 2352fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2353fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // Copy the IN_VISIBLE_GROUP flag down to all raw contacts to allow 2354fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov // indexing on (display_name, in_visible_group) 2355fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL( 2356fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "UPDATE " + Tables.RAW_CONTACTS + 23574394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " SET contact_in_visible_group=(" + 2358fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov "SELECT " + Contacts.IN_VISIBLE_GROUP + 2359fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov " FROM " + Tables.CONTACTS + 2360bcbd6a5cdd2d1aa6531c592428dc20e0282486c3Dmitri Plotnikov " WHERE " + Contacts._ID + "=" + RawContacts.CONTACT_ID + ")" + 2361bcbd6a5cdd2d1aa6531c592428dc20e0282486c3Dmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + " NOT NULL" 2362fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ); 2363fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2364fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL("CREATE INDEX raw_contact_sort_key1_index ON " + Tables.RAW_CONTACTS + " (" + 23654394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "contact_in_visible_group" + "," + 2366fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov RawContactsColumns.DISPLAY_NAME + " COLLATE LOCALIZED ASC" + 2367fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ");"); 2368fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 2369fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL("DROP INDEX contacts_visible_index"); 2370fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov db.execSQL("CREATE INDEX contacts_visible_index ON " + Tables.CONTACTS + " (" + 2371fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov Contacts.IN_VISIBLE_GROUP + 2372fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov ");"); 2373fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov } 2374fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 23755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeToVersion205(SQLiteDatabase db) { 23765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 23775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " ADD " + RawContacts.DISPLAY_NAME_ALTERNATIVE + " TEXT;"); 23785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 23795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " ADD " + RawContacts.PHONETIC_NAME + " TEXT;"); 23805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 23815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + " ADD " + RawContacts.PHONETIC_NAME_STYLE + " INTEGER;"); 23825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 2383de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa + " ADD " + RawContacts.SORT_KEY_PRIMARY 2384de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa + " TEXT COLLATE " + ContactsProvider2.PHONEBOOK_COLLATOR_NAME + ";"); 23855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 2386de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa + " ADD " + RawContacts.SORT_KEY_ALTERNATIVE 2387de8f19d5cc1ef7d5bd76ede6be888dad37112966Daisuke Miyakawa + " TEXT COLLATE " + ContactsProvider2.PHONEBOOK_COLLATOR_NAME + ";"); 23885dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov final Locale locale = Locale.getDefault(); 23905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 239151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov NameSplitter splitter = createNameSplitter(); 23925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 23935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement rawContactUpdate = db.compileStatement( 23945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov "UPDATE " + Tables.RAW_CONTACTS + 23955dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " SET " + 23965dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_PRIMARY + "=?," + 23975dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_ALTERNATIVE + "=?," + 23985dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.PHONETIC_NAME + "=?," + 23995dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.PHONETIC_NAME_STYLE + "=?," + 24005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.SORT_KEY_PRIMARY + "=?," + 24015dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.SORT_KEY_ALTERNATIVE + "=?" + 24025dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?"); 24035dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24045dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeStructuredNamesToVersion205(db, rawContactUpdate, splitter); 24055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeOrganizationsToVersion205(db, rawContactUpdate, splitter); 24065dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24075dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("DROP INDEX raw_contact_sort_key1_index"); 24085dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contact_sort_key1_index ON " + Tables.RAW_CONTACTS + " (" + 24094394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "contact_in_visible_group" + "," + 24105dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.SORT_KEY_PRIMARY + 24115dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ");"); 24125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov db.execSQL("CREATE INDEX raw_contact_sort_key2_index ON " + Tables.RAW_CONTACTS + " (" + 24144394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "contact_in_visible_group" + "," + 24155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.SORT_KEY_ALTERNATIVE + 24165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov ");"); 24175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 24185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private interface StructName205Query { 24205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String TABLE = Tables.DATA_JOIN_RAW_CONTACTS; 24215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String COLUMNS[] = { 24235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov DataColumns.CONCRETE_ID, 24245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Data.RAW_CONTACT_ID, 24255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_SOURCE, 24265dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov RawContacts.DISPLAY_NAME_PRIMARY, 24275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.PREFIX, 24285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.GIVEN_NAME, 24295dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.MIDDLE_NAME, 24305dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.FAMILY_NAME, 24315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.SUFFIX, 24325dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.PHONETIC_FAMILY_NAME, 24335dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.PHONETIC_MIDDLE_NAME, 24345dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.PHONETIC_GIVEN_NAME, 24355dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov }; 24365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int ID = 0; 24385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int RAW_CONTACT_ID = 1; 24395dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int DISPLAY_NAME_SOURCE = 2; 24405dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int DISPLAY_NAME = 3; 24415dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int PREFIX = 4; 24425dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int GIVEN_NAME = 5; 24435dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int MIDDLE_NAME = 6; 24445dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int FAMILY_NAME = 7; 24455dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int SUFFIX = 8; 24465dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int PHONETIC_FAMILY_NAME = 9; 24475dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int PHONETIC_MIDDLE_NAME = 10; 24485dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int PHONETIC_GIVEN_NAME = 11; 24495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 24505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24515dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeStructuredNamesToVersion205(SQLiteDatabase db, 24525dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement rawContactUpdate, NameSplitter splitter) { 24535dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // Process structured names to detect the style of the full name and phonetic name 24555dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long mMimeType; 24575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov try { 24585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov mMimeType = DatabaseUtils.longForQuery(db, 24595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov "SELECT " + MimetypesColumns._ID + 24605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " FROM " + Tables.MIMETYPES + 24615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " WHERE " + MimetypesColumns.MIMETYPE 24625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + "='" + StructuredName.CONTENT_ITEM_TYPE + "'", null); 24635dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } catch (SQLiteDoneException e) { 24645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov // No structured names in the database 24655dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov return; 24665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 24675dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24685dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement structuredNameUpdate = db.compileStatement( 24695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov "UPDATE " + Tables.DATA + 24705dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " SET " + 24715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.FULL_NAME_STYLE + "=?," + 24725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.DISPLAY_NAME + "=?," + 24735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructuredName.PHONETIC_NAME_STYLE + "=?" + 24745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " WHERE " + Data._ID + "=?"); 24755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov NameSplitter.Name name = new NameSplitter.Name(); 24775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StringBuilder sb = new StringBuilder(); 24785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Cursor cursor = db.query(StructName205Query.TABLE, 24795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov StructName205Query.COLUMNS, 24805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=" + mMimeType, null, null, null, null); 24815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov try { 24825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov while (cursor.moveToNext()) { 24835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long dataId = cursor.getLong(StructName205Query.ID); 24845dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = cursor.getLong(StructName205Query.RAW_CONTACT_ID); 24855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int displayNameSource = cursor.getInt(StructName205Query.DISPLAY_NAME_SOURCE); 24865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String displayName = cursor.getString(StructName205Query.DISPLAY_NAME); 24875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24885dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.clear(); 24895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.prefix = cursor.getString(StructName205Query.PREFIX); 24905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.givenNames = cursor.getString(StructName205Query.GIVEN_NAME); 24915dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.middleName = cursor.getString(StructName205Query.MIDDLE_NAME); 24925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.familyName = cursor.getString(StructName205Query.FAMILY_NAME); 24935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.suffix = cursor.getString(StructName205Query.SUFFIX); 24945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.phoneticFamilyName = cursor.getString(StructName205Query.PHONETIC_FAMILY_NAME); 24955dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.phoneticMiddleName = cursor.getString(StructName205Query.PHONETIC_MIDDLE_NAME); 24965dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.phoneticGivenName = cursor.getString(StructName205Query.PHONETIC_GIVEN_NAME); 24975dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 24985dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov upgradeNameToVersion205(dataId, rawContactId, displayNameSource, displayName, name, 24995dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov structuredNameUpdate, rawContactUpdate, splitter, sb); 25005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 25015dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } finally { 25025dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov cursor.close(); 25035dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 25045dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 25055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25065dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeNameToVersion205(long dataId, long rawContactId, int displayNameSource, 25075dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String currentDisplayName, NameSplitter.Name name, 25085dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement structuredNameUpdate, SQLiteStatement rawContactUpdate, 25095dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov NameSplitter splitter, StringBuilder sb) { 25105dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25115dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov splitter.guessNameStyle(name); 2512ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao int unadjustedFullNameStyle = name.fullNameStyle; 25135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov name.fullNameStyle = splitter.getAdjustedFullNameStyle(name.fullNameStyle); 251455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov String displayName = splitter.join(name, true, true); 25155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 2516ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao // Don't update database with the adjusted fullNameStyle as it is locale 2517ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao // related 2518ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao structuredNameUpdate.bindLong(1, unadjustedFullNameStyle); 25195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(structuredNameUpdate, 2, displayName); 25205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov structuredNameUpdate.bindLong(3, name.phoneticNameStyle); 25215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov structuredNameUpdate.bindLong(4, dataId); 25225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov structuredNameUpdate.execute(); 25235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (displayNameSource == DisplayNameSources.STRUCTURED_NAME) { 252555e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov String displayNameAlternative = splitter.join(name, false, false); 25265dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String phoneticName = splitter.joinPhoneticName(name); 25275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String sortKey = null; 25285dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String sortKeyAlternative = null; 25295dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25305dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (phoneticName != null) { 25315dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov sortKey = sortKeyAlternative = phoneticName; 2532ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao } else if (name.fullNameStyle == FullNameStyle.CHINESE || 2533ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao name.fullNameStyle == FullNameStyle.CJK) { 2534ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao sortKey = sortKeyAlternative = ContactLocaleUtils.getIntance() 2535ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao .getSortKey(displayName, name.fullNameStyle); 25365dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 25375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (sortKey == null) { 25395dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov sortKey = displayName; 25405dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov sortKeyAlternative = displayNameAlternative; 25415dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 25425dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25435dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov updateRawContact205(rawContactUpdate, rawContactId, displayName, 25445dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov displayNameAlternative, name.phoneticNameStyle, phoneticName, sortKey, 25455dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov sortKeyAlternative); 25465dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 25475dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 25485dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25495dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private interface Organization205Query { 25505dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String TABLE = Tables.DATA_JOIN_RAW_CONTACTS; 25515dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25525dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String COLUMNS[] = { 25535dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov DataColumns.CONCRETE_ID, 25545dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Data.RAW_CONTACT_ID, 25555dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Organization.COMPANY, 25565dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Organization.PHONETIC_NAME, 25575dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov }; 25585dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25595dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int ID = 0; 25605dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int RAW_CONTACT_ID = 1; 25615dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int COMPANY = 2; 25625dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int PHONETIC_NAME = 3; 25635dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 25645dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25655dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void upgradeOrganizationsToVersion205(SQLiteDatabase db, 25665dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement rawContactUpdate, NameSplitter splitter) { 2567b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov final long mimeType = lookupMimeTypeId(db, Organization.CONTENT_ITEM_TYPE); 25685dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25695dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov SQLiteStatement organizationUpdate = db.compileStatement( 25705dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov "UPDATE " + Tables.DATA + 25715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " SET " + 25725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Organization.PHONETIC_NAME_STYLE + "=?" + 25735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov " WHERE " + Data._ID + "=?"); 25745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov Cursor cursor = db.query(Organization205Query.TABLE, Organization205Query.COLUMNS, 2576b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=" + mimeType + " AND " 25775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov + RawContacts.DISPLAY_NAME_SOURCE + "=" + DisplayNameSources.ORGANIZATION, 25785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov null, null, null, null); 25795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov try { 25805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov while (cursor.moveToNext()) { 25815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long dataId = cursor.getLong(Organization205Query.ID); 25825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov long rawContactId = cursor.getLong(Organization205Query.RAW_CONTACT_ID); 25835dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String company = cursor.getString(Organization205Query.COMPANY); 25845dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String phoneticName = cursor.getString(Organization205Query.PHONETIC_NAME); 25855dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25865dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int phoneticNameStyle = splitter.guessPhoneticNameStyle(phoneticName); 25875dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25885dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov organizationUpdate.bindLong(1, phoneticNameStyle); 25895dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov organizationUpdate.bindLong(2, dataId); 25905dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov organizationUpdate.execute(); 25915dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 25925dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String sortKey = null; 25935dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (phoneticName == null && company != null) { 25945dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov int nameStyle = splitter.guessFullNameStyle(company); 25955dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov nameStyle = splitter.getAdjustedFullNameStyle(nameStyle); 2596ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao if (nameStyle == FullNameStyle.CHINESE || 2597ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao nameStyle == FullNameStyle.CJK ) { 2598ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao sortKey = ContactLocaleUtils.getIntance() 2599ee0e6b105832366143e4ddb30beb5bb0e5c81ec5Bai Tao .getSortKey(company, nameStyle); 26005dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 26015dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 26025dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26035dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (sortKey == null) { 26045dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov sortKey = company; 26055dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 26065dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26075dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov updateRawContact205(rawContactUpdate, rawContactId, company, 26085dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov company, phoneticNameStyle, phoneticName, sortKey, sortKey); 26095dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 26105dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } finally { 26115dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov cursor.close(); 26125dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 26135dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 26145dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 26155dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void updateRawContact205(SQLiteStatement rawContactUpdate, long rawContactId, 26165dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String displayName, String displayNameAlternative, int phoneticNameStyle, 26175dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String phoneticName, String sortKeyPrimary, String sortKeyAlternative) { 26185dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov bindString(rawContactUpdate, 1, displayName); 26195dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov bindString(rawContactUpdate, 2, displayNameAlternative); 26205dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov bindString(rawContactUpdate, 3, phoneticName); 26215dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov rawContactUpdate.bindLong(4, phoneticNameStyle); 26225dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov bindString(rawContactUpdate, 5, sortKeyPrimary); 26235dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov bindString(rawContactUpdate, 6, sortKeyAlternative); 26245dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov rawContactUpdate.bindLong(7, rawContactId); 26255dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov rawContactUpdate.execute(); 26265dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 26275dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 2628f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov private void upgrateToVersion206(SQLiteDatabase db) { 2629f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov db.execSQL("ALTER TABLE " + Tables.RAW_CONTACTS 2630f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov + " ADD " + RawContacts.NAME_VERIFIED + " INTEGER NOT NULL DEFAULT 0;"); 2631f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov } 2632f01c876a92b9c950a0450ed8b706ac5eb2c9b660Dmitri Plotnikov 263331168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov /** 263431168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov * Fix for the bug where name lookup records for organizations would get removed by 263531168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov * unrelated updates of the data rows. 263631168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov */ 2637b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov private void upgradeToVersion300(SQLiteDatabase db) { 2638197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov // No longer needed 263931168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov } 264031168f49a3da9b9a9d5346f3d6a8098b76179c9cDmitri Plotnikov 2641b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov private static final class Upgrade303Query { 2642b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final String TABLE = Tables.DATA; 2643b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2644b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final String SELECTION = 2645b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=?" + 2646b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov " AND " + Data._ID + " NOT IN " + 2647b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov "(SELECT " + NameLookupColumns.DATA_ID + " FROM " + Tables.NAME_LOOKUP + ")" + 2648b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov " AND " + Data.DATA1 + " NOT NULL"; 2649b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2650b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final String COLUMNS[] = { 2651b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Data._ID, 2652b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Data.RAW_CONTACT_ID, 2653b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Data.DATA1, 2654b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov }; 2655b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2656b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final int ID = 0; 2657b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final int RAW_CONTACT_ID = 1; 2658b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public static final int DATA1 = 2; 2659b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2660b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2661b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov /** 2662b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov * The {@link ContactsProvider2#update} method was deleting name lookup for new 2663b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov * emails during the sync. We need to restore the lost name lookup rows. 2664b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov */ 2665b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov private void upgradeEmailToVersion303(SQLiteDatabase db) { 2666b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, Email.CONTENT_ITEM_TYPE); 2667b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (mimeTypeId == -1) { 2668b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return; 2669b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2670b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2671b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov ContentValues values = new ContentValues(); 2672b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2673b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov // Find all data rows with the mime type "email" that are missing name lookup 2674b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Cursor cursor = db.query(Upgrade303Query.TABLE, Upgrade303Query.COLUMNS, 2675b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Upgrade303Query.SELECTION, new String[] {String.valueOf(mimeTypeId)}, 2676b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov null, null, null); 2677b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov try { 2678b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov while (cursor.moveToNext()) { 2679b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov long dataId = cursor.getLong(Upgrade303Query.ID); 2680b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov long rawContactId = cursor.getLong(Upgrade303Query.RAW_CONTACT_ID); 2681b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov String value = cursor.getString(Upgrade303Query.DATA1); 2682b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov value = extractHandleFromEmailAddress(value); 2683b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2684b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (value != null) { 2685b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.DATA_ID, dataId); 2686b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.RAW_CONTACT_ID, rawContactId); 2687b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.NAME_TYPE, NameLookupType.EMAIL_BASED_NICKNAME); 2688b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.NORMALIZED_NAME, NameNormalizer.normalize(value)); 2689b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov db.insert(Tables.NAME_LOOKUP, null, values); 2690b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2691b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2692b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } finally { 2693b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov cursor.close(); 2694b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2695b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2696b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2697b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov /** 2698b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov * The {@link ContactsProvider2#update} method was deleting name lookup for new 2699b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov * nicknames during the sync. We need to restore the lost name lookup rows. 2700b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov */ 2701b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov private void upgradeNicknameToVersion303(SQLiteDatabase db) { 2702b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, Nickname.CONTENT_ITEM_TYPE); 2703b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (mimeTypeId == -1) { 2704b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return; 2705b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2706b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2707b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov ContentValues values = new ContentValues(); 2708b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2709b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov // Find all data rows with the mime type "nickname" that are missing name lookup 2710b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Cursor cursor = db.query(Upgrade303Query.TABLE, Upgrade303Query.COLUMNS, 2711b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Upgrade303Query.SELECTION, new String[] {String.valueOf(mimeTypeId)}, 2712b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov null, null, null); 2713b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov try { 2714b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov while (cursor.moveToNext()) { 2715b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov long dataId = cursor.getLong(Upgrade303Query.ID); 2716b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov long rawContactId = cursor.getLong(Upgrade303Query.RAW_CONTACT_ID); 2717b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov String value = cursor.getString(Upgrade303Query.DATA1); 2718b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 2719b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.DATA_ID, dataId); 2720b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.RAW_CONTACT_ID, rawContactId); 2721b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.NAME_TYPE, NameLookupType.NICKNAME); 2722b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov values.put(NameLookupColumns.NORMALIZED_NAME, NameNormalizer.normalize(value)); 2723b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov db.insert(Tables.NAME_LOOKUP, null, values); 2724b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2725b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } finally { 2726b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov cursor.close(); 2727b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2728b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 2729b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 273051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov private void upgradeToVersion304(SQLiteDatabase db) { 273151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov // Mimetype table requires an index on mime type 273251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS mime_type ON " + Tables.MIMETYPES + " (" + 273351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov MimetypesColumns.MIMETYPE + 273451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov ");"); 273551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 273651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 273760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann private void upgradeToVersion306(SQLiteDatabase db) { 273860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann // Fix invalid lookup that was used for Exchange contacts (it was not escaped) 273960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann // It happened when a new contact was created AND synchronized 274060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann final StringBuilder lookupKeyBuilder = new StringBuilder(); 274160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann final SQLiteStatement updateStatement = db.compileStatement( 274260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "UPDATE contacts " + 274360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "SET lookup=? " + 274460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "WHERE _id=?"); 274560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann final Cursor contactIdCursor = db.rawQuery( 274660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "SELECT DISTINCT contact_id " + 274760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "FROM raw_contacts " + 274860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "WHERE deleted=0 AND account_type='com.android.exchange'", 274960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann null); 275060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann try { 275160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann while (contactIdCursor.moveToNext()) { 275260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann final long contactId = contactIdCursor.getLong(0); 275360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann lookupKeyBuilder.setLength(0); 275460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann final Cursor c = db.rawQuery( 275560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "SELECT account_type, account_name, _id, sourceid, display_name " + 275660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "FROM raw_contacts " + 275760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "WHERE contact_id=? " + 275860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann "ORDER BY _id", 275960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann new String[] { String.valueOf(contactId) }); 276060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann try { 276160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann while (c.moveToNext()) { 276260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann ContactLookupKey.appendToLookupKey(lookupKeyBuilder, 276360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.getString(0), 276460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.getString(1), 276560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.getLong(2), 276660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.getString(3), 276760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.getString(4)); 276860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 276960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } finally { 277060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann c.close(); 277160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 277260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 277360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann if (lookupKeyBuilder.length() == 0) { 277460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann updateStatement.bindNull(1); 277560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } else { 277660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann updateStatement.bindString(1, Uri.encode(lookupKeyBuilder.toString())); 277760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 277860de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann updateStatement.bindLong(2, contactId); 277960de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 278060de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann updateStatement.execute(); 278160de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 278260de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } finally { 278360de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann updateStatement.close(); 278460de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann contactIdCursor.close(); 278560de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 278660de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann } 278760de6f6c3c70e53b603a47b0efc80993353a8368Daniel Lehmann 2788b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov private void upgradeToVersion307(SQLiteDatabase db) { 2789b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov db.execSQL("CREATE TABLE properties (" + 2790b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov "property_key TEXT PRIMARY_KEY, " + 2791b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov "property_value TEXT" + 2792b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov ");"); 2793b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 2794b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 2795743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov private void upgradeToVersion308(SQLiteDatabase db) { 27964394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("CREATE TABLE accounts (" + 27974394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "account_name TEXT, " + 27984394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "account_type TEXT " + 27994394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov ");"); 2800743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 28014394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("INSERT INTO accounts " + 28024394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "SELECT DISTINCT account_name, account_type FROM raw_contacts"); 2803743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov } 2804743eac356404195f236ad44379fe9d180beb5bf2Dmitri Plotnikov 2805f3082210d83492b4a8591c82e56291514547f5a5Dmitri Plotnikov private void upgradeToVersion400(SQLiteDatabase db) { 2806dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana db.execSQL("ALTER TABLE " + Tables.GROUPS 2807dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana + " ADD " + Groups.FAVORITES + " INTEGER NOT NULL DEFAULT 0;"); 2808dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana db.execSQL("ALTER TABLE " + Tables.GROUPS 2809dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana + " ADD " + Groups.AUTO_ADD + " INTEGER NOT NULL DEFAULT 0;"); 2810dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana } 2811dd5c25c65f09ada246c826fb6d04f0b6d4cf4388Fred Quintana 28127da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov private void upgradeToVersion353(SQLiteDatabase db) { 28137da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov db.execSQL("DELETE FROM contacts " + 28147da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov "WHERE NOT EXISTS (SELECT 1 FROM raw_contacts WHERE contact_id=contacts._id)"); 28157da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov } 28167da074dc59f256a63201439cc9ae24bd2e347a06Dmitri Plotnikov 281751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov private void rebuildNameLookup(SQLiteDatabase db) { 281851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("DROP INDEX IF EXISTS name_lookup_index"); 281951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov insertNameLookup(db); 282051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov createContactsIndexes(db); 282151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 282251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 282304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov /** 282451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov * Regenerates all locale-sensitive data: nickname_lookup, name_lookup and sort keys. 282504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov */ 282651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov public void setLocale(ContactsProvider2 provider, Locale locale) { 282751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov Log.i(TAG, "Switching to locale " + locale); 282804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 2829c085b3eeebf13ebdfb197444747354a1d6eced2bJeff Hamilton long start = SystemClock.uptimeMillis(); 283051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov SQLiteDatabase db = getWritableDatabase(); 283151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.setLocale(locale); 283251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.beginTransaction(); 283351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov try { 283451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("DROP INDEX raw_contact_sort_key1_index"); 283551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("DROP INDEX raw_contact_sort_key2_index"); 283651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("DROP INDEX IF EXISTS name_lookup_index"); 283751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 283851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov loadNicknameLookupTable(db); 283951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov insertNameLookup(db); 284051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov rebuildSortKeys(db, provider); 284151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov createContactsIndexes(db); 284251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.setTransactionSuccessful(); 284351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } finally { 284451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.endTransaction(); 284551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 284651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 2847c085b3eeebf13ebdfb197444747354a1d6eced2bJeff Hamilton Log.i(TAG, "Locale change completed in " + (SystemClock.uptimeMillis() - start) + "ms"); 284851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 284951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 285051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov /** 285151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov * Regenerates sort keys for all contacts. 285251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov */ 285351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov private void rebuildSortKeys(SQLiteDatabase db, ContactsProvider2 provider) { 285451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov Cursor cursor = db.query(Tables.RAW_CONTACTS, new String[]{RawContacts._ID}, 285551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov null, null, null, null, null); 285651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov try { 285751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov while (cursor.moveToNext()) { 285851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov long rawContactId = cursor.getLong(0); 28598ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov updateRawContactDisplayName(db, rawContactId); 286051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 286151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } finally { 286251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov cursor.close(); 286351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 286451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 286551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 286651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov private void insertNameLookup(SQLiteDatabase db) { 286704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.NAME_LOOKUP); 286804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 286904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov SQLiteStatement nameLookupInsert = db.compileStatement( 287004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov "INSERT OR IGNORE INTO " + Tables.NAME_LOOKUP + "(" 287104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov + NameLookupColumns.RAW_CONTACT_ID + "," 287204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov + NameLookupColumns.DATA_ID + "," 287304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov + NameLookupColumns.NAME_TYPE + "," 287404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov + NameLookupColumns.NORMALIZED_NAME + 287504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov ") VALUES (?,?,?,?)"); 287604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 287751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov try { 287851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov insertStructuredNameLookup(db, nameLookupInsert); 287951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov insertEmailLookup(db, nameLookupInsert); 288051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov insertNicknameLookup(db, nameLookupInsert); 288151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } finally { 288251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov nameLookupInsert.close(); 288351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 288404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 288504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 288604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private static final class StructuredNameQuery { 288704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String TABLE = Tables.DATA; 288804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 288904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String SELECTION = 289004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=? AND " + Data.DATA1 + " NOT NULL"; 289104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 289204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String COLUMNS[] = { 289304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov StructuredName._ID, 289404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov StructuredName.RAW_CONTACT_ID, 289504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov StructuredName.DISPLAY_NAME, 289604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov }; 289704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 289804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int ID = 0; 289904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int RAW_CONTACT_ID = 1; 290004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int DISPLAY_NAME = 2; 290104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 290204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 290304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private class StructuredNameLookupBuilder extends NameLookupBuilder { 290404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 290504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private final SQLiteStatement mNameLookupInsert; 290604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private final CommonNicknameCache mCommonNicknameCache; 290704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 290804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public StructuredNameLookupBuilder(NameSplitter splitter, 290904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov CommonNicknameCache commonNicknameCache, SQLiteStatement nameLookupInsert) { 291004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov super(splitter); 291104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov this.mCommonNicknameCache = commonNicknameCache; 291204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov this.mNameLookupInsert = nameLookupInsert; 291304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 291404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 291504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov @Override 291604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov protected void insertNameLookup(long rawContactId, long dataId, int lookupType, 291704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov String name) { 291804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov if (!TextUtils.isEmpty(name)) { 291904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov ContactsDatabaseHelper.this.insertNormalizedNameLookup(mNameLookupInsert, 292004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov rawContactId, dataId, lookupType, name); 292104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 292204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 292304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 292404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov @Override 292504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov protected String[] getCommonNicknameClusters(String normalizedName) { 292604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov return mCommonNicknameCache.getCommonNicknameClusters(normalizedName); 292704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 292804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 292904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 293004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov /** 293104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov * Inserts name lookup rows for all structured names in the database. 293204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov */ 293304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private void insertStructuredNameLookup(SQLiteDatabase db, SQLiteStatement nameLookupInsert) { 2934d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov NameSplitter nameSplitter = createNameSplitter(); 2935d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov NameLookupBuilder nameLookupBuilder = new StructuredNameLookupBuilder(nameSplitter, 293604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov new CommonNicknameCache(db), nameLookupInsert); 293704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, StructuredName.CONTENT_ITEM_TYPE); 293804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Cursor cursor = db.query(StructuredNameQuery.TABLE, StructuredNameQuery.COLUMNS, 293904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov StructuredNameQuery.SELECTION, new String[] {String.valueOf(mimeTypeId)}, 294004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov null, null, null); 294104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov try { 294204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov while (cursor.moveToNext()) { 294304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long dataId = cursor.getLong(StructuredNameQuery.ID); 294404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long rawContactId = cursor.getLong(StructuredNameQuery.RAW_CONTACT_ID); 294504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov String name = cursor.getString(StructuredNameQuery.DISPLAY_NAME); 2946d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov int fullNameStyle = nameSplitter.guessFullNameStyle(name); 294751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov fullNameStyle = nameSplitter.getAdjustedFullNameStyle(fullNameStyle); 2948d806946b6561dca3f34ded156c6ee89a5113996eDmitri Plotnikov nameLookupBuilder.insertNameLookup(rawContactId, dataId, name, fullNameStyle); 294904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 295004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } finally { 295104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov cursor.close(); 295204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 295304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 295404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 295504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private static final class OrganizationQuery { 295604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String TABLE = Tables.DATA; 295704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 295804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String SELECTION = 295904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=? AND " + Data.DATA1 + " NOT NULL"; 296004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 296104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String COLUMNS[] = { 296204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Organization._ID, 296304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Organization.RAW_CONTACT_ID, 296404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Organization.COMPANY, 296504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Organization.TITLE, 296604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov }; 296704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 296804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int ID = 0; 296904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int RAW_CONTACT_ID = 1; 297004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int COMPANY = 2; 297104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int TITLE = 3; 297204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 297304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 297404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private static final class EmailQuery { 297504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String TABLE = Tables.DATA; 297604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 297704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String SELECTION = 297804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=? AND " + Data.DATA1 + " NOT NULL"; 297904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 298004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String COLUMNS[] = { 298104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Email._ID, 298204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Email.RAW_CONTACT_ID, 298304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Email.ADDRESS, 298404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov }; 298504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 298604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int ID = 0; 298704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int RAW_CONTACT_ID = 1; 298804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int ADDRESS = 2; 298904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 299004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 299104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov /** 299204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov * Inserts name lookup rows for all email addresses in the database. 299304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov */ 299404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private void insertEmailLookup(SQLiteDatabase db, SQLiteStatement nameLookupInsert) { 299504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, Email.CONTENT_ITEM_TYPE); 299604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Cursor cursor = db.query(EmailQuery.TABLE, EmailQuery.COLUMNS, 299704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov EmailQuery.SELECTION, new String[] {String.valueOf(mimeTypeId)}, 299804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov null, null, null); 299904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov try { 300004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov while (cursor.moveToNext()) { 300104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long dataId = cursor.getLong(EmailQuery.ID); 300204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long rawContactId = cursor.getLong(EmailQuery.RAW_CONTACT_ID); 300304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov String address = cursor.getString(EmailQuery.ADDRESS); 300404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov address = extractHandleFromEmailAddress(address); 300504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov insertNameLookup(nameLookupInsert, rawContactId, dataId, 300604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov NameLookupType.EMAIL_BASED_NICKNAME, address); 300704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 300804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } finally { 300904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov cursor.close(); 301004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 301104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 301204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 301304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private static final class NicknameQuery { 301404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String TABLE = Tables.DATA; 301504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 301604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String SELECTION = 301704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov DataColumns.MIMETYPE_ID + "=? AND " + Data.DATA1 + " NOT NULL"; 301804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 301904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final String COLUMNS[] = { 302004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Nickname._ID, 302104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Nickname.RAW_CONTACT_ID, 302204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Nickname.NAME, 302304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov }; 302404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 302504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int ID = 0; 302604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int RAW_CONTACT_ID = 1; 302704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public static final int NAME = 2; 302804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 302904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 303004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov /** 303104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov * Inserts name lookup rows for all nicknames in the database. 303204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov */ 303304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private void insertNicknameLookup(SQLiteDatabase db, SQLiteStatement nameLookupInsert) { 303404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, Nickname.CONTENT_ITEM_TYPE); 303504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Cursor cursor = db.query(NicknameQuery.TABLE, NicknameQuery.COLUMNS, 303604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov NicknameQuery.SELECTION, new String[] {String.valueOf(mimeTypeId)}, 303704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov null, null, null); 303804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov try { 303904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov while (cursor.moveToNext()) { 304004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long dataId = cursor.getLong(NicknameQuery.ID); 304104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov long rawContactId = cursor.getLong(NicknameQuery.RAW_CONTACT_ID); 304204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov String nickname = cursor.getString(NicknameQuery.NAME); 304304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov insertNameLookup(nameLookupInsert, rawContactId, dataId, 304404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov NameLookupType.NICKNAME, nickname); 304504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 304604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } finally { 304704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov cursor.close(); 304804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 304904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 305004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 305104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov /** 305204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov * Inserts a record in the {@link Tables#NAME_LOOKUP} table. 305304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov */ 305404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public void insertNameLookup(SQLiteStatement stmt, long rawContactId, long dataId, 305504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov int lookupType, String name) { 305604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov if (TextUtils.isEmpty(name)) { 305704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov return; 305804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 305904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 306004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov String normalized = NameNormalizer.normalize(name); 306104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov if (TextUtils.isEmpty(normalized)) { 306204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov return; 306304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 306404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 306504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov insertNormalizedNameLookup(stmt, rawContactId, dataId, lookupType, normalized); 306604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 306704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 306804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov private void insertNormalizedNameLookup(SQLiteStatement stmt, long rawContactId, long dataId, 306904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov int lookupType, String normalizedName) { 307004b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov stmt.bindLong(1, rawContactId); 307104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov stmt.bindLong(2, dataId); 307204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov stmt.bindLong(3, lookupType); 307304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov stmt.bindString(4, normalizedName); 307404b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov stmt.executeInsert(); 307504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 307604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 30774394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov /** 30784394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov * Changing the VISIBLE bit from a field on both RawContacts and Contacts to a separate table. 30794394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov */ 30804394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov private void upgradeToVersion401(SQLiteDatabase db) { 30814394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.VISIBLE_CONTACTS + " (" + 30824394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov Contacts._ID + " INTEGER PRIMARY KEY" + 30834394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov ");"); 30844394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("INSERT INTO " + Tables.VISIBLE_CONTACTS + 30854394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " SELECT " + Contacts._ID + 30864394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " FROM " + Tables.CONTACTS + 30874394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " WHERE " + Contacts.IN_VISIBLE_GROUP + "!=0"); 30884394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("DROP INDEX contacts_visible_index"); 30894394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov } 30904394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 3091d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov /** 3092d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Introducing a new table: directories. 3093d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov */ 3094d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov private void upgradeToVersion402(SQLiteDatabase db) { 3095d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov createDirectoriesTable(db); 3096d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov } 3097d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov 309897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov private void upgradeToVersion403(SQLiteDatabase db) { 309997fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS directories;"); 310097fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov createDirectoriesTable(db); 310197fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 310297fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov db.execSQL("ALTER TABLE raw_contacts" 310397fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov + " ADD raw_contact_is_read_only INTEGER NOT NULL DEFAULT 0;"); 310497fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 310597fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov db.execSQL("ALTER TABLE data" 310697fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov + " ADD is_read_only INTEGER NOT NULL DEFAULT 0;"); 310797fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov } 310897fd30388bd6530f86679510cd7b43b9c518bcefDmitri Plotnikov 3109892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov private void upgradeToVersion405(SQLiteDatabase db) { 3110892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS phone_lookup;"); 3111892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov // Private phone numbers table used for lookup 3112892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov db.execSQL("CREATE TABLE " + Tables.PHONE_LOOKUP + " (" + 3113892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.DATA_ID 3114892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + " INTEGER REFERENCES data(_id) NOT NULL," + 3115892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID 3116892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + " INTEGER REFERENCES raw_contacts(_id) NOT NULL," + 3117892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.NORMALIZED_NUMBER + " TEXT NOT NULL," + 3118892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.MIN_MATCH + " TEXT NOT NULL" + 3119892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov ");"); 3120892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 3121892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_index ON " + Tables.PHONE_LOOKUP + " (" + 3122892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.NORMALIZED_NUMBER + "," + 3123892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID + "," + 3124892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.DATA_ID + 3125892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov ");"); 3126892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 3127892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_min_match_index ON " + Tables.PHONE_LOOKUP + " (" + 3128892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.MIN_MATCH + "," + 3129892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.RAW_CONTACT_ID + "," + 3130892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneLookupColumns.DATA_ID + 3131892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov ");"); 3132892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 3133892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov final long mimeTypeId = lookupMimeTypeId(db, Phone.CONTENT_ITEM_TYPE); 3134892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (mimeTypeId == -1) { 3135892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov return; 3136892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 3137892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 3138892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov Cursor cursor = db.rawQuery( 3139892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov "SELECT _id, " + Phone.RAW_CONTACT_ID + ", " + Phone.NUMBER + 3140892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov " FROM " + Tables.DATA + 3141892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov " WHERE " + DataColumns.MIMETYPE_ID + "=" + mimeTypeId 3142892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + " AND " + Phone.NUMBER + " NOT NULL", null); 3143892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 3144892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov ContentValues phoneValues = new ContentValues(); 3145892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov try { 3146892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov while (cursor.moveToNext()) { 3147892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov long dataID = cursor.getLong(0); 3148892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov long rawContactID = cursor.getLong(1); 3149892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov String number = cursor.getString(2); 3150892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov String normalizedNumber = PhoneNumberUtils.normalizeNumber(number); 3151892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (!TextUtils.isEmpty(normalizedNumber)) { 3152892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov phoneValues.clear(); 3153892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov phoneValues.put(PhoneLookupColumns.RAW_CONTACT_ID, rawContactID); 3154892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov phoneValues.put(PhoneLookupColumns.DATA_ID, dataID); 3155892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov phoneValues.put(PhoneLookupColumns.NORMALIZED_NUMBER, normalizedNumber); 3156892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov phoneValues.put(PhoneLookupColumns.MIN_MATCH, 3157892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov PhoneNumberUtils.toCallerIDMinMatch(normalizedNumber)); 3158892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov db.insert(Tables.PHONE_LOOKUP, null, phoneValues); 3159892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 3160892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 3161892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } finally { 3162892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov cursor.close(); 3163892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 3164892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 3165892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 31662530512f639c4979fd7371c7dd25dd67e8118124Bai Tao private void upgradeToVersion406(SQLiteDatabase db) { 31672530512f639c4979fd7371c7dd25dd67e8118124Bai Tao db.execSQL("ALTER TABLE calls ADD countryiso TEXT;"); 31682530512f639c4979fd7371c7dd25dd67e8118124Bai Tao } 31692530512f639c4979fd7371c7dd25dd67e8118124Bai Tao 3170d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov private void upgradeToVersion409(SQLiteDatabase db) { 3171d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS directories;"); 3172d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov createDirectoriesTable(db); 3173d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov } 3174d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov 3175385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov /** 3176d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov * Adding DEFAULT_DIRECTORY table. 31773e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa * DEFAULT_DIRECTORY should contain every contact which should be shown to users in default. 31783e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa * - if a contact doesn't belong to any account (local contact), it should be in 31793e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa * default_directory 31803e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa * - if a contact belongs to an account that doesn't have a "default" group, it should be in 31813e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa * default_directory 31823e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa * - if a contact belongs to an account that has a "default" group (like Google directory, 31833e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa * which has "My contacts" group as default), it should be in default_directory. 31843e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa * 31853e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa * This logic assumes that accounts with the "default" group should have at least one 31863e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa * group with AUTO_ADD (implying it is the default group) flag in the groups table. 3187385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov */ 3188d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov private void upgradeToVersion411(SQLiteDatabase db) { 3189d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS " + Tables.DEFAULT_DIRECTORY); 31903e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa db.execSQL("CREATE TABLE default_directory (_id INTEGER PRIMARY KEY);"); 3191385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 3192385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov // Process contacts without an account 31933e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa db.execSQL("INSERT OR IGNORE INTO default_directory " + 31943e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " SELECT contact_id " + 31953e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " FROM raw_contacts " + 31963e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " WHERE raw_contacts.account_name IS NULL " + 31973e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " AND raw_contacts.account_type IS NULL "); 31983e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa 31993e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa // Process accounts that don't have a default group (e.g. Exchange). 32003e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa db.execSQL("INSERT OR IGNORE INTO default_directory " + 32013e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " SELECT contact_id " + 32023e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " FROM raw_contacts " + 3203385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE NOT EXISTS" + 32043e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " (SELECT _id " + 32053e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " FROM groups " + 32063e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " WHERE raw_contacts.account_name = groups.account_name" + 32073e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " AND raw_contacts.account_type = groups.account_type" + 32083e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " AND groups.auto_add != 0)"); 3209385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 32103e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa final long mimetype = lookupMimeTypeId(db, GroupMembership.CONTENT_ITEM_TYPE); 3211385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 3212d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov // Process accounts that do have a default group (e.g. Google) 32133e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa db.execSQL("INSERT OR IGNORE INTO default_directory " + 32143e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " SELECT contact_id " + 32153e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " FROM raw_contacts " + 32163e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " JOIN data " + 32173e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " ON (raw_contacts._id=raw_contact_id)" + 32183e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " WHERE mimetype_id=" + mimetype + 3219d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov " AND EXISTS" + 32203e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " (SELECT _id" + 32213e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " FROM groups" + 32223e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " WHERE raw_contacts.account_name = groups.account_name" + 32233e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " AND raw_contacts.account_type = groups.account_type" + 32243e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa " AND groups.auto_add != 0)"); 32253d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov } 3226385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 3227e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov private void upgradeToVersion413(SQLiteDatabase db) { 32283ea7932a47027c8629d3a301e1a16e7d2c8a298dDmitri Plotnikov db.execSQL("DROP TABLE IF EXISTS directories;"); 32293ea7932a47027c8629d3a301e1a16e7d2c8a298dDmitri Plotnikov createDirectoriesTable(db); 3230e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov } 3231e0e24418cba10a5184e2966aaa32d5458fa6a387Dmitri Plotnikov 3232c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov private void upgradeToVersion415(SQLiteDatabase db) { 3233c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov db.execSQL( 3234c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov "ALTER TABLE " + Tables.GROUPS + 3235c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov " ADD " + Groups.GROUP_IS_READ_ONLY + " INTEGER NOT NULL DEFAULT 0"); 3236c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov db.execSQL( 3237c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov "UPDATE " + Tables.GROUPS + 3238c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov " SET " + Groups.GROUP_IS_READ_ONLY + "=1" + 3239c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov " WHERE " + Groups.SYSTEM_ID + " NOT NULL"); 3240c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov } 3241c039cfb78c40730483fd71178df63ada5826a315Dmitri Plotnikov 3242d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov private void upgradeToVersion416(SQLiteDatabase db) { 3243d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov db.execSQL("CREATE INDEX phone_lookup_data_id_min_match_index ON " + Tables.PHONE_LOOKUP + 3244d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov " (" + PhoneLookupColumns.DATA_ID + ", " + PhoneLookupColumns.MIN_MATCH + ");"); 3245d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov } 3246d97464c056e8f247e1b33dce0ea2f77eb7f6c009Dmitri Plotnikov 3247197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov private void upgradeToVersion501(SQLiteDatabase db) { 3248197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov // Remove organization rows from the name lookup, we now use search index for that 3249197411a6cc3f81b94a34ca207f267d43d8548f04Dmitri Plotnikov db.execSQL("DELETE FROM name_lookup WHERE name_type=5"); 3250f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 3251f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 325292ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov private void upgradeToVersion502(SQLiteDatabase db) { 325392ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov // Remove Chinese and Korean name lookup - this data is now in the search index 325492ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov db.execSQL("DELETE FROM name_lookup WHERE name_type IN (6, 7)"); 325592ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov } 325692ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov 325755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov private void upgradeToVersion504(SQLiteDatabase db) { 325855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov populateMimeTypeCache(db); 325955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 326055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov // Find all names with prefixes and recreate display name 326155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov Cursor cursor = db.rawQuery( 326255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov "SELECT " + StructuredName.RAW_CONTACT_ID + 326355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov " FROM " + Tables.DATA + 326455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov " WHERE " + DataColumns.MIMETYPE_ID + "=?" 326555e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov + " AND " + StructuredName.PREFIX + " NOT NULL", 326655e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov new String[]{ String.valueOf(mMimeTypeIdStructuredName) }); 326755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 326855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov try { 326955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov while(cursor.moveToNext()) { 327055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov long rawContactId = cursor.getLong(0); 327155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov updateRawContactDisplayName(db, rawContactId); 327255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 327355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 327455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } finally { 327555e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov cursor.close(); 327655e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 327755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 327855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 327924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro private void upgradeToVersion600(SQLiteDatabase db) { 328024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // Add a column to the Accounts table to track which raw contact ID (if any) represents that 328124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro // account's contribution to the user's profile Contact. 328224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro db.execSQL("ALTER TABLE accounts" + 328324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " ADD profile_raw_contact_id INTEGER"); 328424c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro db.execSQL("CREATE INDEX accounts_profile_raw_contact_id_index ON accounts" + 328524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro " (profile_raw_contact_id);"); 328624c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro } 328724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro 328846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa private void upgradeToVersion601(SQLiteDatabase db) { 328946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa db.execSQL("CREATE TABLE data_usage_stat(" + 329046abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "stat_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 329146abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "data_id INTEGER NOT NULL, " + 329246abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "usage_type INTEGER NOT NULL DEFAULT 0, " + 329346abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "times_used INTEGER NOT NULL DEFAULT 0, " + 329446abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "last_time_used INTERGER NOT NULL DEFAULT 0, " + 329546abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "FOREIGN KEY(data_id) REFERENCES data(_id));"); 329646abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa db.execSQL("CREATE UNIQUE INDEX data_usage_stat_index ON " + 329746abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa "data_usage_stat (data_id, usage_type)"); 329846abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa } 329946abbb56764add30cb6e6506f55d8dededc88113Daisuke Miyakawa 330059f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee private void upgradeToVersion602(SQLiteDatabase db) { 330159f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD voicemail_uri TEXT;"); 330259f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD _data TEXT;"); 330359f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD has_content INTEGER;"); 330459f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD mime_type TEXT;"); 330559f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD source_data TEXT;"); 330659f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD source_package TEXT;"); 330759f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee db.execSQL("ALTER TABLE calls ADD state INTEGER;"); 330859f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee } 330959f6477e10203617f504857f7e9aee2fda393f4fDebashish Chatterjee 3310069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee private void upgradeToVersion604(SQLiteDatabase db) { 3311069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee db.execSQL("CREATE TABLE voicemail_status (" + 3312069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "_id INTEGER PRIMARY KEY AUTOINCREMENT," + 3313069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "source_package TEXT UNIQUE NOT NULL," + 3314069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "settings_uri TEXT," + 3315069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "voicemail_access_uri TEXT," + 3316069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "configuration_state INTEGER," + 3317069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "data_channel_state INTEGER," + 3318069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee "notification_channel_state INTEGER" + 3319069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee ");"); 3320069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee } 3321069fdf5902415ebd6c92e5d889740e0d50cfec8dDebashish Chatterjee 33223b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann private void upgradeToVersion605(SQLiteDatabase db) { 33236802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // This version used to create the stream item and stream item photos tables, but a newer 33246802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // version of those tables is created in version 609 below. So omitting the creation in 33256802030a777c0c3ba1dc029c534cca4784260632Dave Santoro // this upgrade step to avoid a create->drop->create. 33263b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann } 33273b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann 3328ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann private void upgradeToVersion606(SQLiteDatabase db) { 3329ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann db.execSQL("DROP VIEW IF EXISTS view_contacts_restricted;"); 3330ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann db.execSQL("DROP VIEW IF EXISTS view_data_restricted;"); 3331ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann db.execSQL("DROP VIEW IF EXISTS view_raw_contacts_restricted;"); 3332ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann db.execSQL("DROP VIEW IF EXISTS view_raw_entities_restricted;"); 3333ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann db.execSQL("DROP VIEW IF EXISTS view_entities_restricted;"); 3334ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann db.execSQL("DROP VIEW IF EXISTS view_data_usage_stat_restricted;"); 3335ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann db.execSQL("DROP INDEX IF EXISTS contacts_restricted_index"); 3336ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann 3337ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann // We should remove the restricted columns here as well, but unfortunately SQLite doesn't 3338ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann // provide ALTER TABLE DROP COLUMN. As they have DEFAULT 0, we can keep but ignore them 3339ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann } 3340ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann 33411cdfc9dacc136e99d3c0bc5b4212bc3c973be337Daniel Lehmann private void upgradeToVersion607(SQLiteDatabase db) { 33420bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann // We added "action" and "action_uri" to groups here, but realized this was not a smart 33430bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann // move. This upgrade step has been removed (all dogfood phones that executed this step 33440bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann // will have those columns, but that shouldn't hurt. Unfortunately, SQLite makes it hard 33450bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann // to remove columns) 33461cdfc9dacc136e99d3c0bc5b4212bc3c973be337Daniel Lehmann } 33471cdfc9dacc136e99d3c0bc5b4212bc3c973be337Daniel Lehmann 3348f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro private void upgradeToVersion608(SQLiteDatabase db) { 3349f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro db.execSQL("ALTER TABLE contacts ADD photo_file_id INTEGER REFERENCES photo_files(_id);"); 3350f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 3351f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro db.execSQL("CREATE TABLE photo_files(" + 3352f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 3353f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro "height INTEGER NOT NULL, " + 3354f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro "width INTEGER NOT NULL, " + 3355f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro "filesize INTEGER NOT NULL);"); 3356f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro } 3357f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro 33586802030a777c0c3ba1dc029c534cca4784260632Dave Santoro private void upgradeToVersion609(SQLiteDatabase db) { 33590bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann // This version used to create the stream item and stream item photos tables, but a newer 33600bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann // version of those tables is created in version 613 below. So omitting the creation in 33610bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann // this upgrade step to avoid a create->drop->create. 33626802030a777c0c3ba1dc029c534cca4784260632Dave Santoro } 33636802030a777c0c3ba1dc029c534cca4784260632Dave Santoro 3364b2197b235e3d96e7f70c24d548b7dac52dab88d8Flavio Lerda private void upgradeToVersion610(SQLiteDatabase db) { 3365b2197b235e3d96e7f70c24d548b7dac52dab88d8Flavio Lerda db.execSQL("ALTER TABLE calls ADD is_read INTEGER;"); 3366b2197b235e3d96e7f70c24d548b7dac52dab88d8Flavio Lerda } 3367b2197b235e3d96e7f70c24d548b7dac52dab88d8Flavio Lerda 336843368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro private void upgradeToVersion611(SQLiteDatabase db) { 336943368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro db.execSQL("ALTER TABLE raw_contacts ADD data_set TEXT DEFAULT NULL;"); 337043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro db.execSQL("ALTER TABLE groups ADD data_set TEXT DEFAULT NULL;"); 337143368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro db.execSQL("ALTER TABLE accounts ADD data_set TEXT DEFAULT NULL;"); 337243368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro 337343368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro db.execSQL("CREATE INDEX raw_contacts_source_id_data_set_index ON raw_contacts " + 337443368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro "(sourceid, account_type, account_name, data_set);"); 337543368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro 337643368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro db.execSQL("CREATE INDEX groups_source_id_data_set_index ON groups " + 337743368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro "(sourceid, account_type, account_name, data_set);"); 337843368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro } 337943368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro 3380aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda private void upgradeToVersion612(SQLiteDatabase db) { 3381aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda db.execSQL("ALTER TABLE calls ADD geocoded_location TEXT DEFAULT NULL;"); 3382aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda // Old calls will not have a geocoded location; new calls will get it when inserted. 3383aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda } 3384aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda 33850bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann private void upgradeToVersion613(SQLiteDatabase db) { 33860bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann // The stream item and stream item photos APIs were not in-use by anyone in the time 33870bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann // between their initial creation (in v609) and this update. So we're just dropping 33880bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann // and re-creating them to get appropriate columns. The delta is as follows: 33890bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann // - In stream_items, package_id was replaced by res_package. 33900bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann // - In stream_item_photos, picture was replaced by photo_file_id. 33910bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann // - Instead of resource ids for icon and label, we use resource name strings now 33920bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann // - Added sync columns 33930bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann // - Removed action and action_uri 33940bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann // - Text and comments are now nullable 33950bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann 33960bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann db.execSQL("DROP TABLE IF EXISTS stream_items"); 33970bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann db.execSQL("DROP TABLE IF EXISTS stream_item_photos"); 33980bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann 33990bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann db.execSQL("CREATE TABLE stream_items(" + 34000bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 34010bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "raw_contact_id INTEGER NOT NULL, " + 34020bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "res_package TEXT, " + 34030bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "icon TEXT, " + 34040bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "label TEXT, " + 34050bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "text TEXT, " + 34060bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "timestamp INTEGER NOT NULL, " + 34070bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "comments TEXT, " + 34080bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "stream_item_sync1 TEXT, " + 34090bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "stream_item_sync2 TEXT, " + 34100bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "stream_item_sync3 TEXT, " + 34110bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "stream_item_sync4 TEXT, " + 34120bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "FOREIGN KEY(raw_contact_id) REFERENCES raw_contacts(_id));"); 34130bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann 34140bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann db.execSQL("CREATE TABLE stream_item_photos(" + 34150bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 34160bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "stream_item_id INTEGER NOT NULL, " + 34170bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "sort_index INTEGER, " + 34180bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "photo_file_id INTEGER NOT NULL, " + 34190bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "stream_item_photo_sync1 TEXT, " + 34200bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "stream_item_photo_sync2 TEXT, " + 34210bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "stream_item_photo_sync3 TEXT, " + 34220bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "stream_item_photo_sync4 TEXT, " + 34230bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann "FOREIGN KEY(stream_item_id) REFERENCES stream_items(_id));"); 34240bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann } 34250bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann 34267a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda private void upgradeToVersion615(SQLiteDatabase db) { 34277a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda // Old calls will not have up to date values for these columns, they will be filled in 34287a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda // as needed. 34297a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda db.execSQL("ALTER TABLE calls ADD lookup_uri TEXT DEFAULT NULL;"); 34307a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda db.execSQL("ALTER TABLE calls ADD matched_number TEXT DEFAULT NULL;"); 34317a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda db.execSQL("ALTER TABLE calls ADD normalized_number TEXT DEFAULT NULL;"); 34327a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda db.execSQL("ALTER TABLE calls ADD photo_id INTEGER NOT NULL DEFAULT 0;"); 34337a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda } 34347a24e1c1476b57a6268de8d57e5ef4a2d5f46794Flavio Lerda 3435b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov public String extractHandleFromEmailAddress(String email) { 3436b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(email); 3437b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (tokens.length == 0) { 3438b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return null; 3439b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 3440b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 3441b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov String address = tokens[0].getAddress(); 3442b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov int at = address.indexOf('@'); 3443b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov if (at != -1) { 3444b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return address.substring(0, at); 3445b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 3446b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return null; 3447b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 3448b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 344908768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov public String extractAddressFromEmailAddress(String email) { 345008768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(email); 345108768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov if (tokens.length == 0) { 345208768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov return null; 345308768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov } 345408768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov 345550a7c86b4b49870bd19d5270722be3f1fccaf226Dmitri Plotnikov return tokens[0].getAddress().trim(); 345608768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov } 345708768a0f3434130fa46379c1bbfec93a19094939Dmitri Plotnikov 34583e2aeb5c57d968d1dc98ba3f92f658eb7dd0cb7dDaisuke Miyakawa private static long lookupMimeTypeId(SQLiteDatabase db, String mimeType) { 3459b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov try { 3460b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return DatabaseUtils.longForQuery(db, 3461b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov "SELECT " + MimetypesColumns._ID + 3462b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov " FROM " + Tables.MIMETYPES + 3463b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov " WHERE " + MimetypesColumns.MIMETYPE 3464b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov + "='" + mimeType + "'", null); 3465b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } catch (SQLiteDoneException e) { 3466b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov // No rows of this type in the database 3467b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov return -1; 3468b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 3469b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov } 3470b06484032125877d1a89785a1a912ca58c12d448Dmitri Plotnikov 34715dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void bindString(SQLiteStatement stmt, int index, String value) { 34725dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov if (value == null) { 34735dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov stmt.bindNull(index); 34745dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } else { 34755dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov stmt.bindString(index, value); 34765dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 34775dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov } 34785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov 347978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov private void bindLong(SQLiteStatement stmt, int index, Number value) { 348078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (value == null) { 348178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov stmt.bindNull(index); 348278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } else { 348378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov stmt.bindLong(index, value.longValue()); 348478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 348578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 348678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 3487a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov /** 3488f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * Adds index stats into the SQLite database to force it to always use the lookup indexes. 3489f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov */ 3490f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov private void updateSqliteStats(SQLiteDatabase db) { 3491f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 3492f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov // Specific stats strings are based on an actual large database after running ANALYZE 3493f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov try { 34948fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.CONTACTS, 34958fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "contacts_has_phone_index", "10000 500"); 34968fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 34978fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.RAW_CONTACTS, 34988fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "raw_contacts_source_id_index", "10000 1 1 1"); 34998fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.RAW_CONTACTS, 35008fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "raw_contacts_contact_id_index", "10000 2"); 35018fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 35028fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.NAME_LOOKUP, 35038fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "name_lookup_raw_contact_id_index", "10000 3"); 35048fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.NAME_LOOKUP, 3505916f2d7104bfba857412a66b40ed60fea6546222Dmitri Plotnikov "name_lookup_index", "10000 3 2 2 1"); 35068fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.NAME_LOOKUP, 35078fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "sqlite_autoindex_name_lookup_1", "10000 3 2 1"); 35088fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 35098fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.PHONE_LOOKUP, 35108fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "phone_lookup_index", "10000 2 2 1"); 351136045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov updateIndexStats(db, Tables.PHONE_LOOKUP, 351236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov "phone_lookup_min_match_index", "10000 2 2 1"); 35138fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 35148fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.DATA, 35158fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "data_mimetype_data1_index", "60000 5000 2"); 35168fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.DATA, 35178fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "data_raw_contact_id", "60000 10"); 35188fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 35198fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.GROUPS, 35208fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "groups_source_id_index", "50 1 1 1"); 35218fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 35228fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov updateIndexStats(db, Tables.NICKNAME_LOOKUP, 35238fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov "sqlite_autoindex_name_lookup_1", "500 2 1"); 35248fddc066662d58e8d6a436decb8dafbf28ce652eDmitri Plotnikov 3525f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } catch (SQLException e) { 3526f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov Log.e(TAG, "Could not update index stats", e); 3527f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } 3528f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } 3529f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 3530f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov /** 3531f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * Stores statistics for a given index. 3532f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * 3533f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * @param stats has the following structure: the first index is the expected size of 3534f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * the table. The following integer(s) are the expected number of records selected with the 3535f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov * index. There should be one integer per indexed column. 3536f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov */ 35375dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov private void updateIndexStats(SQLiteDatabase db, String table, String index, 35385dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov String stats) { 3539f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov db.execSQL("DELETE FROM sqlite_stat1 WHERE tbl='" + table + "' AND idx='" + index + "';"); 3540f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov db.execSQL("INSERT INTO sqlite_stat1 (tbl,idx,stat)" 3541f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov + " VALUES ('" + table + "','" + index + "','" + stats + "');"); 3542f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } 3543f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 3544f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov @Override 3545f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov public synchronized SQLiteDatabase getWritableDatabase() { 3546f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov SQLiteDatabase db = super.getWritableDatabase(); 3547f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov if (mReopenDatabase) { 3548f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov mReopenDatabase = false; 3549f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov close(); 3550f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov db = super.getWritableDatabase(); 3551f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } 3552f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov return db; 3553f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov } 3554f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov 3555f79538095a1af16dcd6e641448b627f60f197802Dmitri Plotnikov /** 3556a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov * Wipes all data except mime type and package lookup tables. 3557a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov */ 3558a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov public void wipeData() { 3559a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov SQLiteDatabase db = getWritableDatabase(); 35603d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov 356133fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.ACCOUNTS + ";"); 356243368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro db.execSQL("INSERT INTO " + Tables.ACCOUNTS + " VALUES(NULL, NULL, NULL, NULL)"); 356333fd566fb6eebdd40a900c0c8a2f6dca894d7829Dmitri Plotnikov 3564d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.CONTACTS + ";"); 35655ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.RAW_CONTACTS + ";"); 35663b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann db.execSQL("DELETE FROM " + Tables.STREAM_ITEMS + ";"); 35673b505de6c622d20d40b85b361c1437a89aef82deDaniel Lehmann db.execSQL("DELETE FROM " + Tables.STREAM_ITEM_PHOTOS + ";"); 3568f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro db.execSQL("DELETE FROM " + Tables.PHOTO_FILES + ";"); 3569a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.DATA + ";"); 3570a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.PHONE_LOOKUP + ";"); 3571a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.NAME_LOOKUP + ";"); 3572ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey db.execSQL("DELETE FROM " + Tables.GROUPS + ";"); 3573b174c7ccd337a7bea6269139c9b09acc69ae40c1Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.AGGREGATION_EXCEPTIONS + ";"); 3574eb9ffdccfa19f5b2f22e688f733fd77e39605f9eJeff Sharkey db.execSQL("DELETE FROM " + Tables.SETTINGS + ";"); 3575a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.ACTIVITIES + ";"); 35763d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.CALLS + ";"); 357772e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov db.execSQL("DELETE FROM " + Tables.DIRECTORIES + ";"); 3578f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.SEARCH_INDEX + ";"); 357972e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov 3580b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov // Note: we are not removing reference data from Tables.NICKNAME_LOOKUP 3581a8dc456684a104c7e5547ba17d44f952022cd8c5Dmitri Plotnikov } 3582b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 358304b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov public NameSplitter createNameSplitter() { 35848ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mNameSplitter = new NameSplitter( 358504b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov mContext.getString(com.android.internal.R.string.common_name_prefixes), 358604b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov mContext.getString(com.android.internal.R.string.common_last_name_prefixes), 358704b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov mContext.getString(com.android.internal.R.string.common_name_suffixes), 358804b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov mContext.getString(com.android.internal.R.string.common_name_conjunctions), 358904b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov Locale.getDefault()); 35908ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov return mNameSplitter; 359104b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov } 359204b7ce026c73077d9d982742bc662ea4b3ac74e7Dmitri Plotnikov 3593b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** 3594619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * Return the {@link ApplicationInfo#uid} for the given package name. 3595619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey */ 3596619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey public static int getUidForPackageName(PackageManager pm, String packageName) { 3597619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey try { 3598619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey ApplicationInfo clientInfo = pm.getApplicationInfo(packageName, 0 /* no flags */); 3599619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey return clientInfo.uid; 3600619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } catch (NameNotFoundException e) { 3601619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey throw new RuntimeException(e); 3602619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } 3603619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } 3604619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey 3605619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey /** 3606b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * Perform an internal string-to-integer lookup using the compiled 3607b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * {@link SQLiteStatement} provided, using the in-memory cache to speed up 3608b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * lookups. If a mapping isn't found in cache or database, it will be 3609b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * created. All new, uncached answers are added to the cache automatically. 3610b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * 3611b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * @param query Compiled statement used to query for the mapping. 3612b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * @param insert Compiled statement used to insert a new mapping when no 3613b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * existing one is found in cache or from query. 3614b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * @param value Value to find mapping for. 3615b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * @param cache In-memory cache of previous answers. 3616b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * @return An unique integer mapping for the given value. 3617b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 3618f4a3b7e523e36679b68edd2af632e26648758ff2Dmitri Plotnikov private long getCachedId(SQLiteStatement query, SQLiteStatement insert, 3619b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey String value, HashMap<String, Long> cache) { 3620b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Try an in-memory cache lookup 3621b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey if (cache.containsKey(value)) { 3622b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return cache.get(value); 3623b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3624b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 3625ec73c9927a67e4afdd35c1b030254ed7f528655fDmitri Plotnikov synchronized (query) { 362636d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov long id = -1; 362736d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov try { 362836d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov // Try searching database for mapping 362936d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(query, 1, value); 363036d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov id = query.simpleQueryForLong(); 363136d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov } catch (SQLiteDoneException e) { 363236d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov // Nothing found, so try inserting new mapping 363336d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(insert, 1, value); 363436d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov id = insert.executeInsert(); 363536d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov } 363636d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov if (id != -1) { 363736d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov // Cache and return the new answer 363836d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov cache.put(value, id); 363936d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov return id; 364036d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov } else { 364136d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov // Otherwise throw if no mapping found or created 364236d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov throw new IllegalStateException("Couldn't find or create internal " 364336d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov + "lookup table entry for value " + value); 364436d7a981711dc856da815fbc8739ee88c0236a15Dmitri Plotnikov } 3645b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3646b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3647b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 3648b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** 3649ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Convert a package name into an integer, using {@link Tables#PACKAGES} for 3650b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * lookups and possible allocation of new IDs as needed. 3651b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 3652b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public long getPackageId(String packageName) { 365378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mPackageQuery == null) { 365478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mPackageQuery = getWritableDatabase().compileStatement( 365578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + PackagesColumns._ID + 365678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.PACKAGES + 365778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + PackagesColumns.PACKAGE + "=?"); 365878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 365978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 366078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mPackageInsert == null) { 366178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mPackageInsert = getWritableDatabase().compileStatement( 366278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "INSERT INTO " + Tables.PACKAGES + "(" 366378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + PackagesColumns.PACKAGE + 366478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov ") VALUES (?)"); 366578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 3666b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return getCachedId(mPackageQuery, mPackageInsert, packageName, mPackageCache); 3667b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3668b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 3669b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** 3670ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Convert a mimetype into an integer, using {@link Tables#MIMETYPES} for 3671b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * lookups and possible allocation of new IDs as needed. 3672b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 3673b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public long getMimeTypeId(String mimetype) { 3674b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return getCachedId(mMimetypeQuery, mMimetypeInsert, mimetype, mMimetypeCache); 3675b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3676b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 36772a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov public long getMimeTypeIdForStructuredName() { 36782a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return mMimeTypeIdStructuredName; 36792a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 36802a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 36812a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov public long getMimeTypeIdForOrganization() { 36822a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return mMimeTypeIdOrganization; 36832a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 36842a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 36852a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov public long getMimeTypeIdForIm() { 36862a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return mMimeTypeIdIm; 36872a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 36882a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 36892a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov public long getMimeTypeIdForEmail() { 36902a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return mMimeTypeIdEmail; 36912a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 36922a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 3693a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov public long getMimeTypeIdForSip() { 3694a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov return mMimeTypeIdSip; 3695a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov } 3696a1e177389debb74a51587720464a527a193bffc1Dmitri Plotnikov 36972a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov public int getDisplayNameSourceForMimeTypeId(int mimeTypeId) { 36982a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov if (mimeTypeId == mMimeTypeIdStructuredName) { 36992a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.STRUCTURED_NAME; 37002a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } else if (mimeTypeId == mMimeTypeIdEmail) { 37012a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.EMAIL; 37022a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } else if (mimeTypeId == mMimeTypeIdPhone) { 37032a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.PHONE; 37042a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } else if (mimeTypeId == mMimeTypeIdOrganization) { 37052a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.ORGANIZATION; 37062a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } else if (mimeTypeId == mMimeTypeIdNickname) { 37072a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.NICKNAME; 37082a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } else { 37092a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov return DisplayNameSources.UNDEFINED; 37102a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 37112a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov } 37122a8fefb86282c06a7669f80e1b2b86d87619dfc2Dmitri Plotnikov 3713b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** 3714ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Find the mimetype for the given {@link Data#_ID}. 3715b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 3716b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public String getDataMimeType(long dataId) { 371778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mDataMimetypeQuery == null) { 371878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mDataMimetypeQuery = getWritableDatabase().compileStatement( 371978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + MimetypesColumns.MIMETYPE + 372078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.DATA_JOIN_MIMETYPES + 372178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + Tables.DATA + "." + Data._ID + "=?"); 372278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 3723b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey try { 3724b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Try database query to find mimetype 3725b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey DatabaseUtils.bindObjectToProgram(mDataMimetypeQuery, 1, dataId); 3726b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey String mimetype = mDataMimetypeQuery.simpleQueryForString(); 3727b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return mimetype; 3728b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } catch (SQLiteDoneException e) { 3729b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // No valid mapping found, so return null 3730b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return null; 3731b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3732b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3733b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey 3734b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey /** 3735b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey * Find the mime-type for the given {@link Activities#_ID}. 3736b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey */ 3737b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey public String getActivityMimeType(long activityId) { 373878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mActivitiesMimetypeQuery == null) { 373978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mActivitiesMimetypeQuery = getWritableDatabase().compileStatement( 374078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + MimetypesColumns.MIMETYPE + 374178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.ACTIVITIES_JOIN_MIMETYPES + 374278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + Tables.ACTIVITIES + "." + Activities._ID + "=?"); 374378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 3744b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey try { 3745b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // Try database query to find mimetype 3746b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey DatabaseUtils.bindObjectToProgram(mActivitiesMimetypeQuery, 1, activityId); 3747b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey String mimetype = mActivitiesMimetypeQuery.simpleQueryForString(); 3748b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return mimetype; 3749b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } catch (SQLiteDoneException e) { 3750b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey // No valid mapping found, so return null 3751b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey return null; 3752b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 3753b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey } 37546bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov 37556bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov /** 3756d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov * Update {@link Contacts#IN_VISIBLE_GROUP} for all contacts. 3757ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey */ 3758ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public void updateAllVisible() { 3759385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov updateCustomContactVisibility(getWritableDatabase(), ""); 3760ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } 3761ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 3762ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey /** 3763f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov * Updates contact visibility and return true iff the visibility was actually changed. 3764f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov */ 3765bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov public boolean updateContactVisibleOnlyIfChanged(TransactionContext txContext, long contactId) { 3766bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov return updateContactVisible(txContext, contactId, true); 3767f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3768f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 3769f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov /** 3770385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov * Update {@link Contacts#IN_VISIBLE_GROUP} and 3771385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov * {@link Tables#DEFAULT_DIRECTORY} for a specific contact. 3772ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey */ 3773bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov public void updateContactVisible(TransactionContext txContext, long contactId) { 3774bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov updateContactVisible(txContext, contactId, false); 3775f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3776f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 3777bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov public boolean updateContactVisible( 3778bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov TransactionContext txContext, long contactId, boolean onlyIfChanged) { 37794394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov SQLiteDatabase db = getWritableDatabase(); 3780f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov updateCustomContactVisibility(db, " AND " + Contacts._ID + "=" + contactId); 3781385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 3782385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov String contactIdAsString = String.valueOf(contactId); 3783385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov long mimetype = getMimeTypeId(GroupMembership.CONTENT_ITEM_TYPE); 3784385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 3785385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov // The contact will be included in the default directory if contains 3786d6ef718d85724dc482dc88f8c8a87b356e63c0f6Dmitri Plotnikov // a raw contact that is in any group or in an account that 3787385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov // does not have any AUTO_ADD groups. 3788f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov boolean newVisibility = DatabaseUtils.longForQuery(db, 3789385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov "SELECT EXISTS (" + 3790385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov "SELECT " + RawContacts.CONTACT_ID + 3791385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 3792385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " JOIN " + Tables.DATA + 3793385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " ON (" + RawContactsColumns.CONCRETE_ID + "=" 3794385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + Data.RAW_CONTACT_ID + ")" + 3795385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=?" + 3796385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + DataColumns.MIMETYPE_ID + "=?" + 3797385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ") OR EXISTS (" + 3798385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov "SELECT " + RawContacts._ID + 3799385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 3800385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=?" + 3801385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND NOT EXISTS" + 3802385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " (SELECT " + Groups._ID + 3803385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.GROUPS + 3804385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + RawContactsColumns.CONCRETE_ACCOUNT_NAME + " = " 3805385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + GroupsColumns.CONCRETE_ACCOUNT_NAME + 3806385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " = " 3807385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov + GroupsColumns.CONCRETE_ACCOUNT_TYPE + 380843368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro " AND (" + RawContactsColumns.CONCRETE_DATA_SET + " = " 380943368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + GroupsColumns.CONCRETE_DATA_SET 381043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + " OR " + RawContactsColumns.CONCRETE_DATA_SET + " IS NULL AND " 381143368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro + GroupsColumns.CONCRETE_DATA_SET + " IS NULL)" + 3812385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + Groups.AUTO_ADD + " != 0" + 3813385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ")" + 3814385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ") OR EXISTS (" + 3815385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov "SELECT " + RawContacts._ID + 3816385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 3817385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=?" + 3818385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_ACCOUNT_NAME + " IS NULL " + 3819385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov " AND " + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " IS NULL" + 382043368a3f9e05a979e454e278d6a0e8475f08923dDave Santoro " AND " + RawContactsColumns.CONCRETE_DATA_SET + " IS NULL" + 3821385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov ")", 3822385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov new String[] { 3823385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov contactIdAsString, 38246c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov String.valueOf(mimetype), 3825385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov contactIdAsString, 38266c47e208236a62c55f396116e087331e05e148f3Dmitri Plotnikov contactIdAsString 3827f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov }) != 0; 3828385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov 3829f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov if (onlyIfChanged) { 3830f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov boolean oldVisibility = isContactInDefaultDirectory(db, contactId); 3831f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov if (oldVisibility == newVisibility) { 3832f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov return false; 3833f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3834f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3835f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 3836f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov if (newVisibility) { 3837385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov db.execSQL("INSERT OR IGNORE INTO " + Tables.DEFAULT_DIRECTORY + " VALUES(?)", 3838385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov new String[] { contactIdAsString }); 3839bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov txContext.invalidateSearchIndexForContact(contactId); 3840385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov } else { 3841bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov db.execSQL("DELETE FROM " + Tables.DEFAULT_DIRECTORY + 3842bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov " WHERE " + Contacts._ID + "=?", 3843bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov new String[] { contactIdAsString }); 3844bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov db.execSQL("DELETE FROM " + Tables.SEARCH_INDEX + 3845bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov " WHERE " + SearchIndexColumns.CONTACT_ID + "=CAST(? AS int)", 3846385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov new String[] { contactIdAsString }); 3847385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov } 3848f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov return true; 3849f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3850f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov 3851f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov public boolean isContactInDefaultDirectory(SQLiteDatabase db, long contactId) { 3852f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov if (mContactInDefaultDirectoryQuery == null) { 3853f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov mContactInDefaultDirectoryQuery = db.compileStatement( 3854f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov "SELECT EXISTS (" + 3855f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov "SELECT 1 FROM " + Tables.DEFAULT_DIRECTORY + 3856f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov " WHERE " + Contacts._ID + "=?)"); 3857f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov } 3858f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov mContactInDefaultDirectoryQuery.bindLong(1, contactId); 3859f266e8c568905337960b1fec5379841585af92a7Dmitri Plotnikov return mContactInDefaultDirectoryQuery.simpleQueryForLong() != 0; 3860385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov } 38614394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 3862385182830ff0ed84edce9aba2424d2afe99453ceDmitri Plotnikov private void updateCustomContactVisibility(SQLiteDatabase db, String selection) { 3863ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey final long groupMembershipMimetypeId = getMimeTypeId(GroupMembership.CONTENT_ITEM_TYPE); 38644394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov String[] selectionArgs = new String[]{String.valueOf(groupMembershipMimetypeId)}; 38654394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov 38664394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov // First delete what needs to be deleted, then insert what needs to be added. 38674394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov // Since flash writes are very expensive, this approach is much better than 38684394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov // delete-all-insert-all. 38694394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.VISIBLE_CONTACTS + 38704394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " WHERE " + "_id NOT IN" + 38714394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov "(SELECT " + Contacts._ID + 38724394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " FROM " + Tables.CONTACTS + 38734394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " WHERE (" + Clauses.CONTACT_IS_VISIBLE + ")=1) " + selection, 38744394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov selectionArgs); 3875fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov 38764394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov db.execSQL("INSERT INTO " + Tables.VISIBLE_CONTACTS + 38774394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " SELECT " + Contacts._ID + 38784394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " FROM " + Tables.CONTACTS + 38794394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " WHERE " + Contacts._ID + 38804394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " NOT IN " + Tables.VISIBLE_CONTACTS + 38814394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov " AND (" + Clauses.CONTACT_IS_VISIBLE + ")=1 " + selection, 38824394086494fe7909aaca70f56fb4bb08beebf303Dmitri Plotnikov selectionArgs); 3883ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } 3884ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 3885ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey /** 3886d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov * Returns contact ID for the given contact or zero if it is NULL. 38876bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov */ 3888d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov public long getContactId(long rawContactId) { 388978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mContactIdQuery == null) { 389078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mContactIdQuery = getWritableDatabase().compileStatement( 389178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + RawContacts.CONTACT_ID + 389278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 389378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?"); 389478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 38956bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov try { 3896d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(mContactIdQuery, 1, rawContactId); 3897d3fde755e73cd3912a488e7cb7d412d3c5f6ca94Dmitri Plotnikov return mContactIdQuery.simpleQueryForLong(); 38986bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov } catch (SQLiteDoneException e) { 3899a3bd0246ca3741877488bca7aadd91c79b2fd8d2Fred Quintana // No valid mapping found, so return 0 39006bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov return 0; 39016bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov } 39026bccc079d8fea5c51f9fa6fd06044bd8f5109c6fDmitri Plotnikov } 390361bbb2287e8102b7e03922c03809c34b7b317d1cDmitri Plotnikov 39045ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov public int getAggregationMode(long rawContactId) { 390578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mAggregationModeQuery == null) { 390678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mAggregationModeQuery = getWritableDatabase().compileStatement( 390778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + RawContacts.AGGREGATION_MODE + 390878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 390978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?"); 391078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 3911f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov try { 39125ef0401c311c62e53bde415b99cbb0ff83b0a9a2Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(mAggregationModeQuery, 1, rawContactId); 3913f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov return (int)mAggregationModeQuery.simpleQueryForLong(); 3914f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } catch (SQLiteDoneException e) { 39156cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov // No valid row found, so return "disabled" 39166cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov return RawContacts.AGGREGATION_MODE_DISABLED; 3917f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 3918f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 3919f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 3920892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov public void buildPhoneLookupAndContactQuery( 3921892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov SQLiteQueryBuilder qb, String normalizedNumber, String numberE164) { 3922892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov String minMatch = PhoneNumberUtils.toCallerIDMinMatch(normalizedNumber); 3923e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov StringBuilder sb = new StringBuilder(); 392436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov appendPhoneLookupTables(sb, minMatch, true); 3925e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov qb.setTables(sb.toString()); 3926e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 3927e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov sb = new StringBuilder(); 3928892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov appendPhoneLookupSelection(sb, normalizedNumber, numberE164); 3929e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov qb.appendWhere(sb.toString()); 3930bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov } 3931bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 3932e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov public String buildPhoneLookupAsNestedQuery(String number) { 3933e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov StringBuilder sb = new StringBuilder(); 393436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov final String minMatch = PhoneNumberUtils.toCallerIDMinMatch(number); 3935e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov sb.append("(SELECT DISTINCT raw_contact_id" + " FROM "); 393636045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov appendPhoneLookupTables(sb, minMatch, false); 3937e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov sb.append(" WHERE "); 3938892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov appendPhoneLookupSelection(sb, number, null); 3939e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov sb.append(")"); 3940e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov return sb.toString(); 3941e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov } 3942e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 394336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov private void appendPhoneLookupTables(StringBuilder sb, final String minMatch, 3944e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov boolean joinContacts) { 3945e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov sb.append(Tables.RAW_CONTACTS); 3946e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov if (joinContacts) { 3947ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann sb.append(" JOIN " + Views.CONTACTS + " contacts_view" 3948fada1f08e7ffc8012bf2175f61f3ef3270eba9ecDmitri Plotnikov + " ON (contacts_view._id = raw_contacts.contact_id)"); 3949e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov } 3950892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(", (SELECT data_id, normalized_number, length(normalized_number) as len " 3951892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + " FROM phone_lookup " + " WHERE (" + Tables.PHONE_LOOKUP + "." 3952892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov + PhoneLookupColumns.MIN_MATCH + " = '"); 395336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov sb.append(minMatch); 395436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov sb.append("')) AS lookup, " + Tables.DATA); 3955e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov } 3956e3eb7ef438010c893c429f3031dcc7298171865dDmitri Plotnikov 3957892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov private void appendPhoneLookupSelection(StringBuilder sb, String number, String numberE164) { 3958892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append("lookup.data_id=data._id AND data.raw_contact_id=raw_contacts._id"); 3959892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov boolean hasNumberE164 = !TextUtils.isEmpty(numberE164); 3960892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov boolean hasNumber = !TextUtils.isEmpty(number); 3961892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (hasNumberE164 || hasNumber) { 3962892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" AND ( "); 3963892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (hasNumberE164) { 3964892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" lookup.normalized_number = "); 3965892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov DatabaseUtils.appendEscapedSQLString(sb, numberE164); 3966892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 3967892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (hasNumberE164 && hasNumber) { 3968892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" OR "); 3969892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 3970892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov if (hasNumber) { 3971892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov int numberLen = number.length(); 3972892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" lookup.len <= "); 3973892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(numberLen); 3974892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" AND substr("); 3975892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov DatabaseUtils.appendEscapedSQLString(sb, number); 3976892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(','); 3977892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(numberLen); 3978892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(" - lookup.len + 1) = lookup.normalized_number"); 3979892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 3980892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov sb.append(')'); 3981892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 398236045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov } 398336045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov 398436045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov public String getUseStrictPhoneNumberComparisonParameter() { 398536045476d2cc7c9c2f985307e87cb6bbc4cfe434Dmitri Plotnikov return mUseStrictPhoneNumberComparison ? "1" : "0"; 3986fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov } 3987bf659107617a6291ba8bfeebc3f2e50138075ab5Dmitri Plotnikov 3988619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey /** 3989b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov * Loads common nickname mappings into the database. 3990b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov */ 3991b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov private void loadNicknameLookupTable(SQLiteDatabase db) { 399251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov db.execSQL("DELETE FROM " + Tables.NICKNAME_LOOKUP); 399351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 399428f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millar String[] strings = mContext.getResources().getStringArray( 399528f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millar com.android.internal.R.array.common_nicknames); 3996b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov if (strings == null || strings.length == 0) { 3997b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov return; 3998b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 3999b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 4000b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov SQLiteStatement nicknameLookupInsert = db.compileStatement("INSERT INTO " 4001b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov + Tables.NICKNAME_LOOKUP + "(" + NicknameLookupColumns.NAME + "," 4002b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov + NicknameLookupColumns.CLUSTER + ") VALUES (?,?)"); 4003b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 400451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov try { 400551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov for (int clusterId = 0; clusterId < strings.length; clusterId++) { 400651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov String[] names = strings[clusterId].split(","); 400751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov for (int j = 0; j < names.length; j++) { 400851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov String name = NameNormalizer.normalize(names[j]); 400951f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov try { 401051f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(nicknameLookupInsert, 1, name); 401151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov DatabaseUtils.bindObjectToProgram(nicknameLookupInsert, 2, 401251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov String.valueOf(clusterId)); 401351f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov nicknameLookupInsert.executeInsert(); 401451f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } catch (SQLiteException e) { 401551f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov 401651f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov // Print the exception and keep going - this is not a fatal error 401751f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov Log.e(TAG, "Cannot insert nickname: " + names[j], e); 401851f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } 4019b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 4020b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 402151f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov } finally { 402251f41be3b905c63ccffcdc82ec58cf5f7ded2c34Dmitri Plotnikov nicknameLookupInsert.close(); 4023b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 4024b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov } 4025b597adb79f1f57a24be2be09e3f45fa0f04f6f8fDmitri Plotnikov 4026f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public static void copyStringValue(ContentValues toValues, String toKey, 4027f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov ContentValues fromValues, String fromKey) { 4028f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (fromValues.containsKey(fromKey)) { 4029f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov toValues.put(toKey, fromValues.getAsString(fromKey)); 4030f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 4031f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 4032f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 4033f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov public static void copyLongValue(ContentValues toValues, String toKey, 4034f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov ContentValues fromValues, String fromKey) { 4035f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (fromValues.containsKey(fromKey)) { 4036f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov long longValue; 4037f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov Object value = fromValues.get(fromKey); 4038f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if (value instanceof Boolean) { 4039f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov if ((Boolean)value) { 4040f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov longValue = 1; 4041f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } else { 4042f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov longValue = 0; 4043f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 40441b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov } else if (value instanceof String) { 40451b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov longValue = Long.parseLong((String)value); 4046f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } else { 40471b7a7947242bb3b8caaed871775e62d486144c9fDmitri Plotnikov longValue = ((Number)value).longValue(); 4048f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 4049f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov toValues.put(toKey, longValue); 4050f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 4051f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov } 4052f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov 405335ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana public SyncStateContentProviderHelper getSyncState() { 405435ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana return mSyncState; 405535ed95769096bb5dd406ad7d1fcaa49a0e35a307Fred Quintana } 4056c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 4057c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov /** 4058c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov * Delete the aggregate contact if it has no constituent raw contacts other 4059c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov * than the supplied one. 4060c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov */ 4061c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov public void removeContactIfSingleton(long rawContactId) { 4062c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov SQLiteDatabase db = getWritableDatabase(); 4063c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 4064c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov // Obtain contact ID from the supplied raw contact ID 4065c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov String contactIdFromRawContactId = "(SELECT " + RawContacts.CONTACT_ID + " FROM " 4066c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + Tables.RAW_CONTACTS + " WHERE " + RawContacts._ID + "=" + rawContactId + ")"; 4067c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 4068c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov // Find other raw contacts in the same aggregate contact 4069c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov String otherRawContacts = "(SELECT contacts1." + RawContacts._ID + " FROM " 4070c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + Tables.RAW_CONTACTS + " contacts1 JOIN " + Tables.RAW_CONTACTS + " contacts2 ON (" 4071c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + "contacts1." + RawContacts.CONTACT_ID + "=contacts2." + RawContacts.CONTACT_ID 4072c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + ") WHERE contacts1." + RawContacts._ID + "!=" + rawContactId + "" 4073c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + " AND contacts2." + RawContacts._ID + "=" + rawContactId + ")"; 4074c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov 4075c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov db.execSQL("DELETE FROM " + Tables.CONTACTS 4076c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + " WHERE " + Contacts._ID + "=" + contactIdFromRawContactId 4077c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov + " AND NOT EXISTS " + otherRawContacts + ";"); 4078c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov } 40794a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov 40804a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov /** 4081b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov * Returns the value from the {@link Tables#PROPERTIES} table. 4082b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov */ 4083b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov public String getProperty(String key, String defaultValue) { 4084b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov Cursor cursor = getReadableDatabase().query(Tables.PROPERTIES, 4085b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov new String[]{PropertiesColumns.PROPERTY_VALUE}, 4086b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov PropertiesColumns.PROPERTY_KEY + "=?", 4087b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov new String[]{key}, null, null, null); 4088b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov String value = null; 4089b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov try { 4090b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov if (cursor.moveToFirst()) { 4091b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov value = cursor.getString(0); 4092b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 4093b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } finally { 4094b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov cursor.close(); 4095b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 4096b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 4097b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov return value != null ? value : defaultValue; 4098b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 4099b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 4100b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov /** 4101b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov * Stores a key-value pair in the {@link Tables#PROPERTIES} table. 4102b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov */ 4103b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov public void setProperty(String key, String value) { 41043d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov setProperty(getWritableDatabase(), key, value); 41053d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov } 41063d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov 41073d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov private void setProperty(SQLiteDatabase db, String key, String value) { 4108b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov ContentValues values = new ContentValues(); 4109b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov values.put(PropertiesColumns.PROPERTY_KEY, key); 4110b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov values.put(PropertiesColumns.PROPERTY_VALUE, value); 41113d67ff829e8acb0f650f155c3c0d377c0f46507aDmitri Plotnikov db.replace(Tables.PROPERTIES, null, values); 4112b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov } 4113b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov 4114b2e27298ae54ec2215eadf98ecc100aedba98d1aDmitri Plotnikov /** 4115ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov * Test if any of the columns appear in the given projection. 4116ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov */ 4117ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov public boolean isInProjection(String[] projection, String... columns) { 411882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov if (projection == null) { 411982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov return true; 412082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov } 4121ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov 412282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov // Optimized for a single-column test 412382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov if (columns.length == 1) { 412482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov String column = columns[0]; 412582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov for (String test : projection) { 412682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov if (column.equals(test)) { 412782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov return true; 412882bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov } 412982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov } 413082bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov } else { 413182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov for (String test : projection) { 413282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov for (String column : columns) { 4133ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov if (column.equals(test)) { 4134ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov return true; 4135ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 4136ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 4137ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 4138ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov } 4139ff2de103f7e3eeeff4665ef63f07460fef053d6dDmitri Plotnikov return false; 41404a023070dab9a069be4cac5f5ba5554b66238484Dmitri Plotnikov } 4141fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov 4142fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov /** 4143fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov * Returns a detailed exception message for the supplied URI. It includes the calling 4144fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov * user and calling package(s). 4145fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov */ 4146fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov public String exceptionMessage(Uri uri) { 4147fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov return exceptionMessage(null, uri); 4148fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 4149fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov 4150fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov /** 4151fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov * Returns a detailed exception message for the supplied URI. It includes the calling 4152fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov * user and calling package(s). 4153fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov */ 4154fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov public String exceptionMessage(String message, Uri uri) { 4155fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov StringBuilder sb = new StringBuilder(); 4156fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov if (message != null) { 4157fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(message).append("; "); 4158fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 4159fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append("URI: ").append(uri); 4160fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov final PackageManager pm = mContext.getPackageManager(); 4161fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov int callingUid = Binder.getCallingUid(); 4162fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(", calling user: "); 4163fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov String userName = pm.getNameForUid(callingUid); 4164fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov if (userName != null) { 4165fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(userName); 4166fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } else { 4167fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(callingUid); 4168fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 4169fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov 4170fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov final String[] callerPackages = pm.getPackagesForUid(callingUid); 4171fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov if (callerPackages != null && callerPackages.length > 0) { 4172fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov if (callerPackages.length == 1) { 4173fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(", calling package:"); 4174fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(callerPackages[0]); 4175fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } else { 4176fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(", calling package is one of: ["); 4177fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov for (int i = 0; i < callerPackages.length; i++) { 4178fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov if (i != 0) { 4179fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(", "); 4180fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 4181fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append(callerPackages[i]); 4182fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 4183fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov sb.append("]"); 4184fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 4185fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 4186fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov 4187fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov return sb.toString(); 4188fa4a38c9d54f3e3aad4674867bb1250f450c0b95Dmitri Plotnikov } 4189892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov 4190892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov protected String getCountryIso() { 4191892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov CountryDetector detector = 4192892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov (CountryDetector) mContext.getSystemService(Context.COUNTRY_DETECTOR); 4193892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov return detector.detectCountry().getCountryIso(); 4194892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov } 419578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 419678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void deleteStatusUpdate(long dataId) { 419778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mStatusUpdateDelete == null) { 419878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateDelete = getWritableDatabase().compileStatement( 419978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "DELETE FROM " + Tables.STATUS_UPDATES + 420078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + StatusUpdatesColumns.DATA_ID + "=?"); 420178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 420278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateDelete.bindLong(1, dataId); 420378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateDelete.execute(); 420478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 420578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 420678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void replaceStatusUpdate(Long dataId, long timestamp, String status, String resPackage, 42070bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann Integer iconResource, Integer labelResource) { 420878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mStatusUpdateReplace == null) { 420978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateReplace = getWritableDatabase().compileStatement( 421078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "INSERT OR REPLACE INTO " + Tables.STATUS_UPDATES + "(" 421178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdatesColumns.DATA_ID + ", " 421278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_TIMESTAMP + "," 421378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS + "," 421478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_RES_PACKAGE + "," 421578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_ICON + "," 421678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_LABEL + ")" + 421778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " VALUES (?,?,?,?,?,?)"); 421878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 421978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateReplace.bindLong(1, dataId); 422078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateReplace.bindLong(2, timestamp); 422178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateReplace, 3, status); 422278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateReplace, 4, resPackage); 422378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusUpdateReplace, 5, iconResource); 422478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusUpdateReplace, 6, labelResource); 422578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateReplace.execute(); 422678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 422778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 42280bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann public void insertStatusUpdate(Long dataId, String status, String resPackage, 42290bf6b318e3c994294d4a885f57906debd4a0e64eDaniel Lehmann Integer iconResource, Integer labelResource) { 423078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mStatusUpdateInsert == null) { 423178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateInsert = getWritableDatabase().compileStatement( 423278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "INSERT INTO " + Tables.STATUS_UPDATES + "(" 423378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdatesColumns.DATA_ID + ", " 423478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS + "," 423578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_RES_PACKAGE + "," 423678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_ICON + "," 423778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_LABEL + ")" + 423878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " VALUES (?,?,?,?,?)"); 423978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 424078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov try { 424178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateInsert.bindLong(1, dataId); 424278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateInsert, 2, status); 424378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateInsert, 3, resPackage); 424478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusUpdateInsert, 4, iconResource); 424578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusUpdateInsert, 5, labelResource); 424678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateInsert.executeInsert(); 424778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } catch (SQLiteConstraintException e) { 424878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov // The row already exists - update it 424978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mStatusUpdateAutoTimestamp == null) { 425078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateAutoTimestamp = getWritableDatabase().compileStatement( 425178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.STATUS_UPDATES + 425278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + StatusUpdates.STATUS_TIMESTAMP + "=?," 425378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS + "=?" + 425478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + StatusUpdatesColumns.DATA_ID + "=?" 425578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + " AND " + StatusUpdates.STATUS + "!=?"); 425678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 425778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 425878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov long timestamp = System.currentTimeMillis(); 425978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateAutoTimestamp.bindLong(1, timestamp); 426078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateAutoTimestamp, 2, status); 426178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateAutoTimestamp.bindLong(3, dataId); 426278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusUpdateAutoTimestamp, 4, status); 426378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusUpdateAutoTimestamp.execute(); 426478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 426578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mStatusAttributionUpdate == null) { 426678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusAttributionUpdate = getWritableDatabase().compileStatement( 426778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.STATUS_UPDATES + 426878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + StatusUpdates.STATUS_RES_PACKAGE + "=?," 426978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_ICON + "=?," 427078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + StatusUpdates.STATUS_LABEL + "=?" + 427178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + StatusUpdatesColumns.DATA_ID + "=?"); 427278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 427378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mStatusAttributionUpdate, 1, resPackage); 427478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusAttributionUpdate, 2, iconResource); 427578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindLong(mStatusAttributionUpdate, 3, labelResource); 427678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusAttributionUpdate.bindLong(4, dataId); 427778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mStatusAttributionUpdate.execute(); 427878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 427978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 428078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 428178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** 428278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Resets the {@link RawContacts#NAME_VERIFIED} flag to 0 on all other raw 428378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * contacts in the same aggregate 428478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 428578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void resetNameVerifiedForOtherRawContacts(long rawContactId) { 428678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mResetNameVerifiedForOtherRawContacts == null) { 428778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mResetNameVerifiedForOtherRawContacts = getWritableDatabase().compileStatement( 428878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.RAW_CONTACTS + 428978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + RawContacts.NAME_VERIFIED + "=0" + 429078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + "=(" + 429178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + RawContacts.CONTACT_ID + 429278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 429378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?)" + 429478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " AND " + RawContacts._ID + "!=?"); 429578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 429678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mResetNameVerifiedForOtherRawContacts.bindLong(1, rawContactId); 429778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mResetNameVerifiedForOtherRawContacts.bindLong(2, rawContactId); 429878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mResetNameVerifiedForOtherRawContacts.execute(); 429978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 430078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 43018ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov private interface RawContactNameQuery { 43028ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final String RAW_SQL = 43038ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov "SELECT " 43048ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + DataColumns.MIMETYPE_ID + "," 43058ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.IS_PRIMARY + "," 43068ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA1 + "," 43078ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA2 + "," 43088ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA3 + "," 43098ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA4 + "," 43108ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA5 + "," 43118ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA6 + "," 43128ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA7 + "," 43138ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA8 + "," 43148ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA9 + "," 43158ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA10 + "," 43168ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov + Data.DATA11 + 43178ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov " FROM " + Tables.DATA + 43188ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov " WHERE " + Data.RAW_CONTACT_ID + "=?" + 43198ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov " AND (" + Data.DATA1 + " NOT NULL OR " + 43208ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov Organization.TITLE + " NOT NULL)"; 43218ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 43228ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int MIMETYPE = 0; 43238ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int IS_PRIMARY = 1; 43248ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int DATA1 = 2; 43258ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int GIVEN_NAME = 3; // data2 43268ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int FAMILY_NAME = 4; // data3 43278ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int PREFIX = 5; // data4 43288ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int TITLE = 5; // data4 43298ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int MIDDLE_NAME = 6; // data5 43308ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int SUFFIX = 7; // data6 43318ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int PHONETIC_GIVEN_NAME = 8; // data7 43328ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int PHONETIC_MIDDLE_NAME = 9; // data8 43338ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int ORGANIZATION_PHONETIC_NAME = 9; // data8 43348ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int PHONETIC_FAMILY_NAME = 10; // data9 43358ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int FULL_NAME_STYLE = 11; // data10 43368ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int ORGANIZATION_PHONETIC_NAME_STYLE = 11; // data10 43378ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public static final int PHONETIC_NAME_STYLE = 12; // data11 43388ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 43398ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 43408ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov /** 43418ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov * Updates a raw contact display name based on data rows, e.g. structured name, 43428ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov * organization, email etc. 43438ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov */ 43448ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov public void updateRawContactDisplayName(SQLiteDatabase db, long rawContactId) { 43458ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (mNameSplitter == null) { 43468ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov createNameSplitter(); 43478ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 43488ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 43498ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov int bestDisplayNameSource = DisplayNameSources.UNDEFINED; 43508ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov NameSplitter.Name bestName = null; 43518ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String bestDisplayName = null; 43528ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String bestPhoneticName = null; 43538ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov int bestPhoneticNameStyle = PhoneticNameStyle.UNDEFINED; 43548ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 43558ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mSelectionArgs1[0] = String.valueOf(rawContactId); 43568ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov Cursor c = db.rawQuery(RawContactNameQuery.RAW_SQL, mSelectionArgs1); 43578ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov try { 43588ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov while (c.moveToNext()) { 43598ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov int mimeType = c.getInt(RawContactNameQuery.MIMETYPE); 43608ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov int source = getDisplayNameSourceForMimeTypeId(mimeType); 43618ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (source < bestDisplayNameSource || source == DisplayNameSources.UNDEFINED) { 43628ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov continue; 43638ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 43648ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 43658ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (source == bestDisplayNameSource 43668ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov && c.getInt(RawContactNameQuery.IS_PRIMARY) == 0) { 43678ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov continue; 43688ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 43698ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 43708ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (mimeType == getMimeTypeIdForStructuredName()) { 43718ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov NameSplitter.Name name; 43728ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (bestName != null) { 43738ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name = new NameSplitter.Name(); 43748ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else { 43758ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name = mName; 43768ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.clear(); 43778ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 43788ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.prefix = c.getString(RawContactNameQuery.PREFIX); 43798ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.givenNames = c.getString(RawContactNameQuery.GIVEN_NAME); 43808ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.middleName = c.getString(RawContactNameQuery.MIDDLE_NAME); 43818ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.familyName = c.getString(RawContactNameQuery.FAMILY_NAME); 43828ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.suffix = c.getString(RawContactNameQuery.SUFFIX); 43838ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.fullNameStyle = c.isNull(RawContactNameQuery.FULL_NAME_STYLE) 43848ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov ? FullNameStyle.UNDEFINED 43858ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov : c.getInt(RawContactNameQuery.FULL_NAME_STYLE); 43868ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.phoneticFamilyName = c.getString(RawContactNameQuery.PHONETIC_FAMILY_NAME); 43878ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.phoneticMiddleName = c.getString(RawContactNameQuery.PHONETIC_MIDDLE_NAME); 43888ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.phoneticGivenName = c.getString(RawContactNameQuery.PHONETIC_GIVEN_NAME); 43898ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov name.phoneticNameStyle = c.isNull(RawContactNameQuery.PHONETIC_NAME_STYLE) 43908ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov ? PhoneticNameStyle.UNDEFINED 43918ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov : c.getInt(RawContactNameQuery.PHONETIC_NAME_STYLE); 43928ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (!name.isEmpty()) { 43938ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayNameSource = source; 43948ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestName = name; 43958ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 43968ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else if (mimeType == getMimeTypeIdForOrganization()) { 43978ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mCharArrayBuffer.sizeCopied = 0; 43988ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov c.copyStringToBuffer(RawContactNameQuery.DATA1, mCharArrayBuffer); 43998ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (mCharArrayBuffer.sizeCopied != 0) { 44008ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayNameSource = source; 44018ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayName = new String(mCharArrayBuffer.data, 0, 44028ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mCharArrayBuffer.sizeCopied); 44038ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticName = c.getString( 44048ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov RawContactNameQuery.ORGANIZATION_PHONETIC_NAME); 44058ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticNameStyle = 44068ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov c.isNull(RawContactNameQuery.ORGANIZATION_PHONETIC_NAME_STYLE) 44078ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov ? PhoneticNameStyle.UNDEFINED 44088ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov : c.getInt(RawContactNameQuery.ORGANIZATION_PHONETIC_NAME_STYLE); 44098ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else { 44108ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov c.copyStringToBuffer(RawContactNameQuery.TITLE, mCharArrayBuffer); 44118ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (mCharArrayBuffer.sizeCopied != 0) { 44128ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayNameSource = source; 44138ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayName = new String(mCharArrayBuffer.data, 0, 44148ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mCharArrayBuffer.sizeCopied); 44158ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticName = null; 44168ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticNameStyle = PhoneticNameStyle.UNDEFINED; 44178ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 44188ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 44198ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else { 44208ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov // Display name is at DATA1 in all other types. 44218ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov // This is ensured in the constructor. 44228ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 44238ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mCharArrayBuffer.sizeCopied = 0; 44248ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov c.copyStringToBuffer(RawContactNameQuery.DATA1, mCharArrayBuffer); 44258ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (mCharArrayBuffer.sizeCopied != 0) { 44268ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayNameSource = source; 44278ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestDisplayName = new String(mCharArrayBuffer.data, 0, 44288ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov mCharArrayBuffer.sizeCopied); 44298ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticName = null; 44308ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticNameStyle = PhoneticNameStyle.UNDEFINED; 44318ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 44328ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 44338ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 44348ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 44358ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } finally { 44368ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov c.close(); 44378ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 44388ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 44398ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String displayNamePrimary; 44408ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String displayNameAlternative; 444155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov String sortNamePrimary; 444255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov String sortNameAlternative; 44438ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String sortKeyPrimary = null; 44448ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov String sortKeyAlternative = null; 44458ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov int displayNameStyle = FullNameStyle.UNDEFINED; 44468ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 44478ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (bestDisplayNameSource == DisplayNameSources.STRUCTURED_NAME) { 44488ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle = bestName.fullNameStyle; 44498ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (displayNameStyle == FullNameStyle.CJK 44508ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov || displayNameStyle == FullNameStyle.UNDEFINED) { 44518ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle = mNameSplitter.getAdjustedFullNameStyle(displayNameStyle); 44528ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestName.fullNameStyle = displayNameStyle; 44538ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 44548ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 445555e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov displayNamePrimary = mNameSplitter.join(bestName, true, true); 445655e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov displayNameAlternative = mNameSplitter.join(bestName, false, true); 445755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 445855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov if (TextUtils.isEmpty(bestName.prefix)) { 445955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNamePrimary = displayNamePrimary; 446055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNameAlternative = displayNameAlternative; 446155e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } else { 446255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNamePrimary = mNameSplitter.join(bestName, true, false); 446355e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNameAlternative = mNameSplitter.join(bestName, false, false); 446455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov } 44658ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 44668ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticName = mNameSplitter.joinPhoneticName(bestName); 44678ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticNameStyle = bestName.phoneticNameStyle; 44688ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else { 44698ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNamePrimary = displayNameAlternative = bestDisplayName; 447055e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNamePrimary = sortNameAlternative = bestDisplayName; 44718ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 44728ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 44738ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (bestPhoneticName != null) { 44748ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov sortKeyPrimary = sortKeyAlternative = bestPhoneticName; 44758ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (bestPhoneticNameStyle == PhoneticNameStyle.UNDEFINED) { 44768ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov bestPhoneticNameStyle = mNameSplitter.guessPhoneticNameStyle(bestPhoneticName); 44778ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 44788ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } else { 44798ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (displayNameStyle == FullNameStyle.UNDEFINED) { 44808ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle = mNameSplitter.guessFullNameStyle(bestDisplayName); 44818ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (displayNameStyle == FullNameStyle.UNDEFINED 44828ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov || displayNameStyle == FullNameStyle.CJK) { 44838ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle = mNameSplitter.getAdjustedNameStyleBasedOnPhoneticNameStyle( 44848ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle, bestPhoneticNameStyle); 44858ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 44868ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle = mNameSplitter.getAdjustedFullNameStyle(displayNameStyle); 44878ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 44888ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (displayNameStyle == FullNameStyle.CHINESE || 44898ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov displayNameStyle == FullNameStyle.CJK) { 44908ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov sortKeyPrimary = sortKeyAlternative = 44918ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov ContactLocaleUtils.getIntance().getSortKey( 449255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortNamePrimary, displayNameStyle); 44938ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 44948ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 44958ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 44968ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov if (sortKeyPrimary == null) { 449755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortKeyPrimary = sortNamePrimary; 449855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov sortKeyAlternative = sortNameAlternative; 44998ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov } 45008ab0b7a48efe540226253567bcf6fdbc487186a2Dmitri Plotnikov 450178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mRawContactDisplayNameUpdate == null) { 450255e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov mRawContactDisplayNameUpdate = db.compileStatement( 450378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.RAW_CONTACTS + 450478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + 450578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.DISPLAY_NAME_SOURCE + "=?," + 450678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.DISPLAY_NAME_PRIMARY + "=?," + 450778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.DISPLAY_NAME_ALTERNATIVE + "=?," + 450878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.PHONETIC_NAME + "=?," + 450978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.PHONETIC_NAME_STYLE + "=?," + 451078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.SORT_KEY_PRIMARY + "=?," + 451178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov RawContacts.SORT_KEY_ALTERNATIVE + "=?" + 451278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?"); 451378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 451455e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov 451555e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov mRawContactDisplayNameUpdate.bindLong(1, bestDisplayNameSource); 451678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mRawContactDisplayNameUpdate, 2, displayNamePrimary); 451778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mRawContactDisplayNameUpdate, 3, displayNameAlternative); 451855e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov bindString(mRawContactDisplayNameUpdate, 4, bestPhoneticName); 451955e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov mRawContactDisplayNameUpdate.bindLong(5, bestPhoneticNameStyle); 452078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mRawContactDisplayNameUpdate, 6, sortKeyPrimary); 452178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mRawContactDisplayNameUpdate, 7, sortKeyAlternative); 452278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mRawContactDisplayNameUpdate.bindLong(8, rawContactId); 452378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mRawContactDisplayNameUpdate.execute(); 452478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 452578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 452678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /* 452778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Sets the given dataId record in the "data" table to primary, and resets all data records of 452878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * the same mimetype and under the same contact to not be primary. 452978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * 453078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * @param dataId the id of the data record to be set to primary. Pass -1 to clear the primary 453178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * flag of all data items of this raw contacts 453278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 453378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void setIsPrimary(long rawContactId, long dataId, long mimeTypeId) { 453478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mSetPrimaryStatement == null) { 453578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement = getWritableDatabase().compileStatement( 453678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.DATA + 453778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + Data.IS_PRIMARY + "=(_id=?)" + 453878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + DataColumns.MIMETYPE_ID + "=?" + 453978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " AND " + Data.RAW_CONTACT_ID + "=?"); 454078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 454178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement.bindLong(1, dataId); 454278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement.bindLong(2, mimeTypeId); 454378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement.bindLong(3, rawContactId); 454478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetPrimaryStatement.execute(); 454578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 454678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 454778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /* 454878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Clears the super primary of all data items of the given raw contact. does not touch 454978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * other raw contacts of the same joined aggregate 455078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 455178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void clearSuperPrimary(long rawContactId, long mimeTypeId) { 455278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mClearSuperPrimaryStatement == null) { 455378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mClearSuperPrimaryStatement = getWritableDatabase().compileStatement( 455478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.DATA + 455578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + Data.IS_SUPER_PRIMARY + "=0" + 455678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + DataColumns.MIMETYPE_ID + "=?" + 455778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " AND " + Data.RAW_CONTACT_ID + "=?"); 455878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 455978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mClearSuperPrimaryStatement.bindLong(1, mimeTypeId); 456078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mClearSuperPrimaryStatement.bindLong(2, rawContactId); 456178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mClearSuperPrimaryStatement.execute(); 456278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 456378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 456478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /* 456578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Sets the given dataId record in the "data" table to "super primary", and resets all data 456678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * records of the same mimetype and under the same aggregate to not be "super primary". 456778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * 456878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * @param dataId the id of the data record to be set to primary. 456978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 457078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void setIsSuperPrimary(long rawContactId, long dataId, long mimeTypeId) { 457178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mSetSuperPrimaryStatement == null) { 457278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement = getWritableDatabase().compileStatement( 457378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "UPDATE " + Tables.DATA + 457478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " SET " + Data.IS_SUPER_PRIMARY + "=(" + Data._ID + "=?)" + 457578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + DataColumns.MIMETYPE_ID + "=?" + 457678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " AND " + Data.RAW_CONTACT_ID + " IN (" + 457778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + RawContacts._ID + 457878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 457978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts.CONTACT_ID + " =(" + 458078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "SELECT " + RawContacts.CONTACT_ID + 458178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " FROM " + Tables.RAW_CONTACTS + 458278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + RawContacts._ID + "=?))"); 458378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 458478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement.bindLong(1, dataId); 458578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement.bindLong(2, mimeTypeId); 458678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement.bindLong(3, rawContactId); 458778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mSetSuperPrimaryStatement.execute(); 458878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 458978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 459078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** 459178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Inserts a record in the {@link Tables#NAME_LOOKUP} table. 459278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 459378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void insertNameLookup(long rawContactId, long dataId, int lookupType, String name) { 459478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (TextUtils.isEmpty(name)) { 459578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov return; 459678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 459778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 459878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mNameLookupInsert == null) { 459978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert = getWritableDatabase().compileStatement( 460078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "INSERT OR IGNORE INTO " + Tables.NAME_LOOKUP + "(" 460178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + NameLookupColumns.RAW_CONTACT_ID + "," 460278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + NameLookupColumns.DATA_ID + "," 460378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + NameLookupColumns.NAME_TYPE + "," 460478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + NameLookupColumns.NORMALIZED_NAME 460578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov + ") VALUES (?,?,?,?)"); 460678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 460778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert.bindLong(1, rawContactId); 460878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert.bindLong(2, dataId); 460978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert.bindLong(3, lookupType); 461078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov bindString(mNameLookupInsert, 4, name); 461178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupInsert.executeInsert(); 461278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 461378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov 461478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov /** 461578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov * Deletes all {@link Tables#NAME_LOOKUP} table rows associated with the specified data element. 461678fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov */ 461778fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov public void deleteNameLookup(long dataId) { 461878fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov if (mNameLookupDelete == null) { 461978fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupDelete = getWritableDatabase().compileStatement( 462078fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov "DELETE FROM " + Tables.NAME_LOOKUP + 462178fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov " WHERE " + NameLookupColumns.DATA_ID + "=?"); 462278fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 462378fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupDelete.bindLong(1, dataId); 462478fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov mNameLookupDelete.execute(); 462578fb53bfd973760996fe3a5fe260b1d367574de6Dmitri Plotnikov } 4626189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov 4627e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov public String insertNameLookupForEmail(long rawContactId, long dataId, String email) { 4628e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov if (TextUtils.isEmpty(email)) { 4629e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov return null; 4630e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4631e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 4632e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov String address = extractHandleFromEmailAddress(email); 4633e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov if (address == null) { 4634e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov return null; 4635e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4636e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 4637e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov insertNameLookup(rawContactId, dataId, 4638e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov NameLookupType.EMAIL_BASED_NICKNAME, NameNormalizer.normalize(address)); 4639e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov return address; 4640e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4641e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 4642e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov /** 4643e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov * Normalizes the nickname and inserts it in the name lookup table. 4644e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov */ 4645e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov public void insertNameLookupForNickname(long rawContactId, long dataId, String nickname) { 4646e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov if (TextUtils.isEmpty(nickname)) { 4647e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov return; 4648e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4649e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 4650e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov insertNameLookup(rawContactId, dataId, 4651e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov NameLookupType.NICKNAME, NameNormalizer.normalize(nickname)); 4652e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4653e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 46545df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov public void insertNameLookupForPhoneticName(long rawContactId, long dataId, String familyName, 46555df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov String middleName, String givenName) { 46565df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov mSb.setLength(0); 46575df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov if (familyName != null) { 46585df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov mSb.append(familyName.trim()); 46595df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov } 46605df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov if (middleName != null) { 46615df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov mSb.append(middleName.trim()); 46625df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov } 46635df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov if (givenName != null) { 46645df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov mSb.append(givenName.trim()); 46655df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov } 46665df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov 46675df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov if (mSb.length() > 0) { 46685df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov insertNameLookup(rawContactId, dataId, NameLookupType.NAME_COLLATION_KEY, 46695df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov NameNormalizer.normalize(mSb.toString())); 46705df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov } 46715df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov } 46725df7e46835c4f103b05407660b4769edd515760fDmitri Plotnikov 4673189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov /** 4674189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov * Performs a query and returns true if any Data item of the raw contact with the given 4675189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov * id and mimetype is marked as super-primary 4676189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov */ 4677189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov public boolean rawContactHasSuperPrimary(long rawContactId, long mimeTypeId) { 4678189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov final Cursor existsCursor = getReadableDatabase().rawQuery( 4679189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov "SELECT EXISTS(SELECT 1 FROM " + Tables.DATA + 4680189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov " WHERE " + Data.RAW_CONTACT_ID + "=?" + 4681189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov " AND " + DataColumns.MIMETYPE_ID + "=?" + 4682189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov " AND " + Data.IS_SUPER_PRIMARY + "<>0)", 4683189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov new String[] { String.valueOf(rawContactId), String.valueOf(mimeTypeId) }); 4684189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov try { 4685189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov if (!existsCursor.moveToFirst()) throw new IllegalStateException(); 4686189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov return existsCursor.getInt(0) != 0; 4687189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov } finally { 4688189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov existsCursor.close(); 4689189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov } 4690189273b8a9ae75d88690febfbed2d635138799ecDmitri Plotnikov } 4691e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov 4692e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov public String getCurrentCountryIso() { 4693e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov return mCountryMonitor.getCountryIso(); 4694e8b3427e88d28a00cdcad7d296544f2459dfc629Dmitri Plotnikov } 4695f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 4696383d8aa53aa2f74a4b71642de7df2e4b9f2242c8Dmitri Plotnikov /* package */ String querySearchIndexContentForTest(long contactId) { 4697f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov return DatabaseUtils.stringForQuery(getReadableDatabase(), 4698f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov "SELECT " + SearchIndexColumns.CONTENT + 4699f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov " FROM " + Tables.SEARCH_INDEX + 4700f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov " WHERE " + SearchIndexColumns.CONTACT_ID + "=CAST(? AS int)", 4701f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov new String[] { String.valueOf(contactId) }); 4702f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 4703f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov 4704383d8aa53aa2f74a4b71642de7df2e4b9f2242c8Dmitri Plotnikov /* package */ String querySearchIndexTokensForTest(long contactId) { 4705f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov return DatabaseUtils.stringForQuery(getReadableDatabase(), 4706f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov "SELECT " + SearchIndexColumns.TOKENS + 4707f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov " FROM " + Tables.SEARCH_INDEX + 4708f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov " WHERE " + SearchIndexColumns.CONTACT_ID + "=CAST(? AS int)", 4709f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov new String[] { String.valueOf(contactId) }); 4710f262d56495ac4ea30d31bd050efb116bd4bb4235Dmitri Plotnikov } 4711b650982af7aeb2800efdcea587b8ce153259cf1cJeff Sharkey} 4712