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;
22ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onukiimport android.util.Log;
23d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov
24ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onukiimport junit.framework.Assert;
25ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki
2638210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport java.util.Locale;
2738210445730ee04c351c7cc1b3800cfe23e34325Makoto Onuki
28619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey/**
29619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * A version of {@link ContactsProvider2} class that performs aggregation
30619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey * synchronously and wipes all data at construction time.
31619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey */
32619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkeypublic class SynchronousContactsProvider2 extends ContactsProvider2 {
3373f1f396c155b247b903d8f4111db17d3e13dc4dDmitri Plotnikov    public static final String READ_ONLY_ACCOUNT_TYPE = "ro";
3473f1f396c155b247b903d8f4111db17d3e13dc4dDmitri Plotnikov
35619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey    private static Boolean sDataWiped = false;
36583b1364980fd46a5012825886af3160752ff19cMakoto Onuki    private static ContactsDatabaseHelper sDbHelper;
372482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov    private boolean mDataWipeEnabled = true;
38caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    private Account mAccount;
3981d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov    private boolean mNetworkNotified;
409a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov    private boolean mIsPhone = true;
41fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood    private boolean mIsVoiceCapable = true;
42619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey
43619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey    @Override
44b38ed2c5ffeb20efc677b4a9229db4a00603aa8dDmitri Plotnikov    protected ContactsDatabaseHelper getDatabaseHelper(final Context context) {
45583b1364980fd46a5012825886af3160752ff19cMakoto Onuki        if (sDbHelper == null) {
46583b1364980fd46a5012825886af3160752ff19cMakoto Onuki            sDbHelper = ContactsDatabaseHelper.getNewInstanceForTest(context);
47d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov        }
48583b1364980fd46a5012825886af3160752ff19cMakoto Onuki        return sDbHelper;
49d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov    }
50d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov
515d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro    @Override
52ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    public ProfileProvider newProfileProvider() {
535d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro        return new SynchronousProfileProvider(this);
545d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro    }
555d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro
562482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov    public void setDataWipeEnabled(boolean flag) {
572482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov        mDataWipeEnabled = flag;
582482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov    }
592482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov
60d35d9c748af4c3182679c4c546137acfc11eb7a8Dmitri Plotnikov    @Override
61078f588cef389358adabc579de00747878f3c108Dave Santoro    public void onBegin() {
62078f588cef389358adabc579de00747878f3c108Dave Santoro        super.onBegin();
6381d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov        mNetworkNotified = false;
6481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov    }
6581d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov
6681d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov    @Override
6781d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov    protected void notifyChange(boolean syncToNetwork) {
6881d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov        mNetworkNotified |= syncToNetwork;
6981d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov    }
7081d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov
7181d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov    public boolean isNetworkNotified() {
7281d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov        return mNetworkNotified;
7381d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov    }
7481d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov
759a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov    public void setIsPhone(boolean flag) {
769a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov        mIsPhone = flag;
779a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov    }
789a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov
799a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov    @Override
809a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov    public boolean isPhone() {
819a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov        return mIsPhone;
829a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov    }
839a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov
84fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood    public void setIsVoiceCapable(boolean flag) {
85fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood        mIsVoiceCapable = flag;
86fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood    }
87fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood
88fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood    @Override
89fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood    public boolean isVoiceCapable() {
90fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood        return mIsVoiceCapable;
91fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood    }
92fa5cdd337d4d696d326db03c68bfae8645c83b14Mathew Inwood
9381d6a78dffd57f24f9aaecb6cd54e4084c3c9846Dmitri Plotnikov    @Override
94619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey    public boolean onCreate() {
95619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey        boolean created = super.onCreate();
962482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov        if (mDataWipeEnabled) {
972482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov            synchronized (sDataWiped) {
982482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov                if (!sDataWiped) {
992482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov                    sDataWiped = true;
1002482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov                    wipeData();
1012482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov                }
102619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey            }
103619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey        }
104619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey        return created;
105619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey    }
10653056d49d8adf5d1fe2d18cb60c3c26f281e7a6cDmitri Plotnikov
1073d8b043c3341a5b6c2e781b7eba9767d5cd13267Dmitri Plotnikov    @Override
108887a804b03fcb37be1fde000945dcfd799b3c012Makoto Onuki    protected boolean shouldThrowExceptionForInitializationError() {
109887a804b03fcb37be1fde000945dcfd799b3c012Makoto Onuki        return true;
110887a804b03fcb37be1fde000945dcfd799b3c012Makoto Onuki    }
111887a804b03fcb37be1fde000945dcfd799b3c012Makoto Onuki
112c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki    /** We'll use a static size for unit tests */
113c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki    @Override
114c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki    public int getMaxThumbnailDim() {
115c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki        return 96;
116c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki    }
117c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki
118c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki    /** We'll use a static size for unit tests */
119c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki    @Override
120c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki    public int getMaxDisplayPhotoDim() {
121c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki        return 256;
122c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki    }
123c23a30e0510cf56d1dafddc79d1ab99ae9297a3fMakoto Onuki
124887a804b03fcb37be1fde000945dcfd799b3c012Makoto Onuki    @Override
125bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov    protected void scheduleBackgroundTask(int task) {
126bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov        performBackgroundTask(task, null);
127c1778ef6fa53b6bf08fd715b3ad70c052c5f1ce9Dmitri Plotnikov    }
128c1778ef6fa53b6bf08fd715b3ad70c052c5f1ce9Dmitri Plotnikov
129c1778ef6fa53b6bf08fd715b3ad70c052c5f1ce9Dmitri Plotnikov    @Override
130bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov    protected void scheduleBackgroundTask(int task, Object arg) {
131bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov        performBackgroundTask(task, arg);
13289f1f71495aedc58252b3f58a46a036986c319d2Dmitri Plotnikov    }
13389f1f71495aedc58252b3f58a46a036986c319d2Dmitri Plotnikov
13489f1f71495aedc58252b3f58a46a036986c319d2Dmitri Plotnikov    @Override
135bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov    protected void updateLocaleInBackground() {
136bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov    }
137bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov
138bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov    @Override
139bf732767b4d4d7104e4723bda7d3b0eb0f909997Dmitri Plotnikov    protected void updateDirectoriesInBackground(boolean rescan) {
14072e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    }
14172e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov
14272e3003a810fb4793a1513d17a40f8ab83d7d0afDmitri Plotnikov    @Override
143caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    protected Account getDefaultAccount() {
144caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        if (mAccount == null) {
145c76cdd0723b99f478c9ba5329d14a971cd8dfb3dCostin Manolache            mAccount = new Account("androidtest@gmail.com", "com.google");
146caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        }
147caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov        return mAccount;
148caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    }
149caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov
1503826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov    @Override
1513826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov    protected boolean isContactsAccount(Account account) {
1523826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov        return true;
1533826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov    }
1543826a44d8de41e9c148dd6a967392ea5af478085Dmitri Plotnikov
155767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov    /**
156767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov     * Creates a mock PhotoPriorityResolver
157767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov     */
158767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov    @Override
159767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov    PhotoPriorityResolver createPhotoPriorityResolver(Context context) {
160767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov        return new PhotoPriorityResolver(context) {
161767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov            @Override
162767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov            public synchronized int getPhotoPriority(String accountType) {
163767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov                if ("cupcake".equals(accountType)) {
164767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov                    return 3;
165767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov                }
166767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov                if ("donut".equals(accountType)) {
167767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov                    return 2;
168767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov                }
169767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov                if ("froyo".equals(accountType)) {
170767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov                    return 1;
171767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov                }
172767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov                return 0;
173767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov            }
174767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov        };
175767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov    }
176767e109d6f08749b9ed202c0b71f3459eaae2115Dmitri Plotnikov
177627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov    @Override
1785dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov    protected Locale getLocale() {
1795dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov        return Locale.US;
1805dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov    }
1815dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov
1825dd6d5d4acb93adc05f1fde904080787f2397f51Dmitri Plotnikov    @Override
18349ed71913609193a00059df944f6259e9397b0bdMakoto Onuki    public boolean isWritableAccountWithDataSet(String accountType) {
18473f1f396c155b247b903d8f4111db17d3e13dc4dDmitri Plotnikov        return !READ_ONLY_ACCOUNT_TYPE.equals(accountType);
185627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov    }
186627152453c692915ac79191acd1d2d2a4dd6fb0dDmitri Plotnikov
1872482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov    public void prepareForFullAggregation(int maxContact) {
188078f588cef389358adabc579de00747878f3c108Dave Santoro        SQLiteDatabase db = getDatabaseHelper(getContext()).getWritableDatabase();
189c1778ef6fa53b6bf08fd715b3ad70c052c5f1ce9Dmitri Plotnikov        db.execSQL("UPDATE raw_contacts SET aggregation_mode=0,aggregation_needed=1;");
1902482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov        long rowId =
1912482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov            db.compileStatement("SELECT _id FROM raw_contacts LIMIT 1 OFFSET " + maxContact)
1922482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov                .simpleQueryForLong();
1932482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov        db.execSQL("DELETE FROM raw_contacts WHERE _id > " + rowId + ";");
1942482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov    }
1952482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov
1962482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov    public long getRawContactCount() {
197078f588cef389358adabc579de00747878f3c108Dave Santoro        SQLiteDatabase db = getDatabaseHelper(getContext()).getReadableDatabase();
1982482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov        return db.compileStatement("SELECT COUNT(*) FROM raw_contacts").simpleQueryForLong();
1992482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov    }
2002482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov
2012482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov    public long getContactCount() {
202078f588cef389358adabc579de00747878f3c108Dave Santoro        SQLiteDatabase db = getDatabaseHelper(getContext()).getReadableDatabase();
2032482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov        return db.compileStatement("SELECT COUNT(*) FROM contacts").simpleQueryForLong();
2042482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov    }
2052482dd0309794d57233d0af37a7c12fc647e7bf9Dmitri Plotnikov
206caa1cf4ef062f163ac5e370cebc0e47b5ae7460eDmitri Plotnikov    @Override
2074e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov    public void wipeData() {
208ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        Log.i(TAG, "wipeData");
2094e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov        super.wipeData();
210078f588cef389358adabc579de00747878f3c108Dave Santoro        SQLiteDatabase db = getDatabaseHelper(getContext()).getWritableDatabase();
2114e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov        db.execSQL("replace into SQLITE_SEQUENCE (name,seq) values('raw_contacts', 42)");
2124e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov        db.execSQL("replace into SQLITE_SEQUENCE (name,seq) values('contacts', 2009)");
2134e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov        db.execSQL("replace into SQLITE_SEQUENCE (name,seq) values('data', 777)");
21489ea0fad8212b989e0f64e8b07da2bf642b45d83Dmitri Plotnikov
215ed78fd6df5e9f3a2d572162e5d374d1f4a625bddDmitri Plotnikov        getContactDirectoryManagerForTest().scanAllPackages();
2164e8ced99f8bbb01abd610a6ca60afcabb6ffe737Dmitri Plotnikov    }
217ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki
218ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    // Flags to remember which transaction callback has been called for which mode.
219ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    private boolean mOnBeginTransactionInternalCalledInProfileMode;
220ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    private boolean mOnCommitTransactionInternalCalledInProfileMode;
221ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    private boolean mOnRollbackTransactionInternalCalledInProfileMode;
222ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki
223ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    private boolean mOnBeginTransactionInternalCalledInContactMode;
224ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    private boolean mOnCommitTransactionInternalCalledInContactMode;
225ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    private boolean mOnRollbackTransactionInternalCalledInContactMode;
226ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki
227ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    public void resetTrasactionCallbackCalledFlags() {
228ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        mOnBeginTransactionInternalCalledInProfileMode = false;
229ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        mOnCommitTransactionInternalCalledInProfileMode = false;
230ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        mOnRollbackTransactionInternalCalledInProfileMode = false;
231ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki
232ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        mOnBeginTransactionInternalCalledInContactMode = false;
233ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        mOnCommitTransactionInternalCalledInContactMode = false;
234ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        mOnRollbackTransactionInternalCalledInContactMode = false;
235ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    }
236ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki
237ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    @Override
238ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    protected void onBeginTransactionInternal(boolean forProfile) {
239ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        super.onBeginTransactionInternal(forProfile);
240ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        if (forProfile) {
241ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki            mOnBeginTransactionInternalCalledInProfileMode = true;
242ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        } else {
243ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki            mOnBeginTransactionInternalCalledInContactMode = true;
244ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        }
245ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    }
246ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki
247ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    @Override
248ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    protected void onCommitTransactionInternal(boolean forProfile) {
249ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        super.onCommitTransactionInternal(forProfile);
250ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        if (forProfile) {
251ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki            mOnCommitTransactionInternalCalledInProfileMode = true;
252ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        } else {
253ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki            mOnCommitTransactionInternalCalledInContactMode = true;
254ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        }
255ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    }
256ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki
257ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    @Override
258ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    protected void onRollbackTransactionInternal(boolean forProfile) {
259ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        super.onRollbackTransactionInternal(forProfile);
260ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        if (forProfile) {
261ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki            mOnRollbackTransactionInternalCalledInProfileMode = true;
262ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        } else {
263ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki            mOnRollbackTransactionInternalCalledInContactMode = true;
264ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        }
265ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    }
266ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki
267ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    public void assertCommitTransactionCalledForProfileMode() {
268ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        Assert.assertTrue("begin", mOnBeginTransactionInternalCalledInProfileMode);
269ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        Assert.assertTrue("commit", mOnCommitTransactionInternalCalledInProfileMode);
270ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        Assert.assertFalse("rollback", mOnRollbackTransactionInternalCalledInProfileMode);
271ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    }
272ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki
273ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    public void assertRollbackTransactionCalledForProfileMode() {
274ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        Assert.assertTrue("begin", mOnBeginTransactionInternalCalledInProfileMode);
275ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        Assert.assertFalse("commit", mOnCommitTransactionInternalCalledInProfileMode);
276ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        Assert.assertTrue("rollback", mOnRollbackTransactionInternalCalledInProfileMode);
277ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    }
278ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki
279ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    public void assertNoTransactionsForProfileMode() {
280ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        Assert.assertFalse("begin", mOnBeginTransactionInternalCalledInProfileMode);
281ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        Assert.assertFalse("commit", mOnCommitTransactionInternalCalledInProfileMode);
282ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        Assert.assertFalse("rollback", mOnRollbackTransactionInternalCalledInProfileMode);
283ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    }
284ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki
285ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki
286ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    public void assertCommitTransactionCalledForContactMode() {
287ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        Assert.assertTrue("begin", mOnBeginTransactionInternalCalledInContactMode);
288ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        Assert.assertTrue("commit", mOnCommitTransactionInternalCalledInContactMode);
289ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        Assert.assertFalse("rollback", mOnRollbackTransactionInternalCalledInContactMode);
290ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    }
291ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki
292ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    public void assertRollbackTransactionCalledForContactMode() {
293ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        Assert.assertTrue("begin", mOnBeginTransactionInternalCalledInContactMode);
294ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        Assert.assertFalse("commit", mOnCommitTransactionInternalCalledInContactMode);
295ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki        Assert.assertTrue("rollback", mOnRollbackTransactionInternalCalledInContactMode);
296ae32283e7fc5b749df96523d8bb343b9068b65baMakoto Onuki    }
297619871b0fb0175d75ff9336bfe5aec0b27b9bdadJeff Sharkey}
298