SynchronousContactsProvider2.java revision 2482dd0309794d57233d0af37a7c12fc647e7bf9
1619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey/* 2619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * Copyright (C) 2009 The Android Open Source Project 3619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * 4619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 5619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * you may not use this file except in compliance with the License. 6619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * You may obtain a copy of the License at 7619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * 8619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 9619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * 10619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * Unless required by applicable law or agreed to in writing, software 11619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 12619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * See the License for the specific language governing permissions and 14619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * limitations under the License. 15619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey */ 16619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey 1728f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millarpackage com.android.providers.contacts; 18619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey 19caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikovimport android.accounts.Account; 20d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikovimport android.content.Context; 212482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikovimport android.database.sqlite.SQLiteDatabase; 22d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 23619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey/** 24619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * A version of {@link ContactsProvider2} class that performs aggregation 25619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * synchronously and wipes all data at construction time. 26619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey */ 27619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkeypublic class SynchronousContactsProvider2 extends ContactsProvider2 { 28619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey private static Boolean sDataWiped = false; 29d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov private static OpenHelper mOpenHelper; 302482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov private boolean mDataWipeEnabled = true; 31caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov private Account mAccount; 32619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey 33619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey public SynchronousContactsProvider2() { 342482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov this(new SynchronousAggregationScheduler()); 352482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov } 362482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov 372482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov public SynchronousContactsProvider2(ContactAggregationScheduler scheduler) { 382482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov super(scheduler); 39619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } 40619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey 41619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey @Override 42d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov protected OpenHelper getOpenHelper(final Context context) { 43d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov if (mOpenHelper == null) { 44d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov mOpenHelper = new OpenHelper(context); 45d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 46d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov return mOpenHelper; 47d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov } 48d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov 493d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov public static void resetOpenHelper() { 503d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov mOpenHelper = null; 513d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov } 523d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov 532482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov public void setDataWipeEnabled(boolean flag) { 542482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov mDataWipeEnabled = flag; 552482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov } 562482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov 57d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov @Override 58619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey public boolean onCreate() { 59619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey boolean created = super.onCreate(); 602482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov if (mDataWipeEnabled) { 612482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov synchronized (sDataWiped) { 622482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov if (!sDataWiped) { 632482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov sDataWiped = true; 642482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov wipeData(); 652482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov } 66619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } 67619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } 68619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey return created; 69619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey } 7053056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov 713d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov @Override 72caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov protected Account getDefaultAccount() { 73caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov if (mAccount == null) { 74caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov mAccount = new Account("androidtest@gmail.com", "com.google.GAIA"); 75caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 76caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov return mAccount; 77caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov } 78caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov 792482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov public void prepareForFullAggregation(int maxContact) { 802482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov SQLiteDatabase db = getOpenHelper().getWritableDatabase(); 812482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov db.execSQL("UPDATE raw_contacts SET contact_id = NULL, aggregation_mode=0;"); 822482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov db.execSQL("DELETE FROM contacts;"); 832482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov long rowId = 842482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov db.compileStatement("SELECT _id FROM raw_contacts LIMIT 1 OFFSET " + maxContact) 852482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov .simpleQueryForLong(); 862482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov db.execSQL("DELETE FROM raw_contacts WHERE _id > " + rowId + ";"); 872482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov } 882482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov 892482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov public long getRawContactCount() { 902482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov SQLiteDatabase db = getOpenHelper().getReadableDatabase(); 912482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov return db.compileStatement("SELECT COUNT(*) FROM raw_contacts").simpleQueryForLong(); 922482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov } 932482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov 942482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov public long getContactCount() { 952482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov SQLiteDatabase db = getOpenHelper().getReadableDatabase(); 962482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov return db.compileStatement("SELECT COUNT(*) FROM contacts").simpleQueryForLong(); 972482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov } 982482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov 99caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov @Override 1003d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov protected boolean isLegacyContactImportNeeded() { 1013d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov 1023d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov // We have an explicit test for data conversion - no need to do it every time 1033d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov return false; 1043d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov } 1053d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov 10653056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov private static class SynchronousAggregationScheduler extends ContactAggregationScheduler { 10753056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov 10853056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov @Override 10953056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov public void start() { 11053056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov } 11153056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov 11253056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov @Override 11353056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov public void stop() { 11453056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov } 11553056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov 11653056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov @Override 11753056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov long currentTime() { 11853056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov return 0; 11953056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov } 12053056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov 12153056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov @Override 12253056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov void runDelayed() { 12353056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov super.run(); 12453056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov } 12553056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov 12653056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov } 127619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey} 128