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