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