diff options
6 files changed, 44 insertions, 90 deletions
diff --git a/src/com/android/contacts/ContactsApplication.java b/src/com/android/contacts/ContactsApplication.java index d6c5702e5..4e43b46f4 100644 --- a/src/com/android/contacts/ContactsApplication.java +++ b/src/com/android/contacts/ContactsApplication.java @@ -41,7 +41,6 @@ public final class ContactsApplication extends Application { private static final boolean ENABLE_FRAGMENT_LOG = false; // Don't submit with true private static InjectedServices sInjectedServices; - private AccountTypeManager mAccountTypeManager; private ContactPhotoManager mContactPhotoManager; private ContactListFilterController mContactListFilterController; @@ -89,13 +88,6 @@ public final class ContactsApplication extends Application { } } - if (AccountTypeManager.ACCOUNT_TYPE_SERVICE.equals(name)) { - if (mAccountTypeManager == null) { - mAccountTypeManager = AccountTypeManager.createAccountTypeManager(this); - } - return mAccountTypeManager; - } - if (ContactPhotoManager.CONTACT_PHOTO_SERVICE.equals(name)) { if (mContactPhotoManager == null) { mContactPhotoManager = ContactPhotoManager.createContactPhotoManager(this); diff --git a/src/com/android/contacts/model/AccountTypeManager.java b/src/com/android/contacts/model/AccountTypeManager.java index 6850e4f16..5205ee076 100644 --- a/src/com/android/contacts/model/AccountTypeManager.java +++ b/src/com/android/contacts/model/AccountTypeManager.java @@ -53,6 +53,7 @@ import com.android.contacts.model.account.ExternalAccountType; import com.android.contacts.model.account.FallbackAccountType; import com.android.contacts.model.account.GoogleAccountType; import com.android.contacts.model.dataitem.DataKind; +import com.android.contacts.test.NeededForTesting; import com.android.contacts.util.Constants; import com.android.internal.util.Objects; import com.google.common.annotations.VisibleForTesting; @@ -77,25 +78,35 @@ import java.util.concurrent.atomic.AtomicBoolean; public abstract class AccountTypeManager { static final String TAG = "AccountTypeManager"; - public static final String ACCOUNT_TYPE_SERVICE = "contactAccountTypes"; + private static final Object mInitializationLock = new Object(); + private static AccountTypeManager mAccountTypeManager; /** * Requests the singleton instance of {@link AccountTypeManager} with data bound from * the available authenticators. This method can safely be called from the UI thread. */ public static AccountTypeManager getInstance(Context context) { - context = context.getApplicationContext(); - AccountTypeManager service = - (AccountTypeManager) context.getSystemService(ACCOUNT_TYPE_SERVICE); - if (service == null) { - service = createAccountTypeManager(context); - Log.e(TAG, "No account type service in context: " + context); + synchronized (mInitializationLock) { + if (mAccountTypeManager == null) { + context = context.getApplicationContext(); + mAccountTypeManager = new AccountTypeManagerImpl(context); + } } - return service; + return mAccountTypeManager; } - public static synchronized AccountTypeManager createAccountTypeManager(Context context) { - return new AccountTypeManagerImpl(context); + /** + * Set the instance of account type manager. This is only for and should only be used by unit + * tests. While having this method is not ideal, it's simpler than the alternative of + * holding this as a service in the ContactsApplication context class. + * + * @param mockManager The mock AccountTypeManager. + */ + @NeededForTesting + public static void setInstanceForTest(AccountTypeManager mockManager) { + synchronized (mInitializationLock) { + mAccountTypeManager = mockManager; + } } /** diff --git a/tests/src/com/android/contacts/activities/PeopleActivityTest.java b/tests/src/com/android/contacts/activities/PeopleActivityTest.java index cda7a574e..644c0a586 100644 --- a/tests/src/com/android/contacts/activities/PeopleActivityTest.java +++ b/tests/src/com/android/contacts/activities/PeopleActivityTest.java @@ -35,6 +35,9 @@ import android.widget.TextView; import com.android.contacts.ContactsApplication; import com.android.contacts.R; import com.android.contacts.common.ContactPhotoManager; +import com.android.contacts.common.test.mocks.ContactsMockContext; +import com.android.contacts.common.test.mocks.MockContentProvider; +import com.android.contacts.common.test.mocks.MockContentProvider.Query; import com.android.contacts.detail.ContactDetailFragment; import com.android.contacts.interactions.TestLoaderManager; import com.android.contacts.list.ContactBrowseListFragment; @@ -43,12 +46,8 @@ import com.android.contacts.model.account.AccountType; import com.android.contacts.model.account.AccountWithDataSet; import com.android.contacts.model.account.BaseAccountType; import com.android.contacts.test.InjectedServices; -import com.android.contacts.tests.mocks.ContactsAccountManagerMockContext; -import com.android.contacts.common.test.mocks.ContactsMockContext; import com.android.contacts.tests.mocks.MockAccountTypeManager; import com.android.contacts.tests.mocks.MockContactPhotoManager; -import com.android.contacts.common.test.mocks.MockContentProvider; -import com.android.contacts.common.test.mocks.MockContentProvider.Query; import com.android.contacts.tests.mocks.MockSharedPreferences; import com.android.contacts.util.PhoneCapabilityTester; @@ -87,7 +86,7 @@ public class PeopleActivityTest @Override public void setUp() { - mContext = new ContactsAccountManagerMockContext(getInstrumentation().getTargetContext()); + mContext = new ContactsMockContext(getInstrumentation().getTargetContext()); mContactsProvider = mContext.getContactsProvider(); mSettingsProvider = mContext.getSettingsProvider(); InjectedServices services = new InjectedServices(); @@ -104,11 +103,11 @@ public class PeopleActivityTest accountType.accountType = TEST_ACCOUNT_TYPE; AccountWithDataSet account = new AccountWithDataSet(TEST_ACCOUNT, TEST_ACCOUNT_TYPE, null); - - services.setSystemService(AccountTypeManager.ACCOUNT_TYPE_SERVICE, - new MockAccountTypeManager( - new AccountType[]{accountType}, new AccountWithDataSet[]{account})); ContactsApplication.injectServices(services); + + final MockAccountTypeManager mockManager = new MockAccountTypeManager( + new AccountType[] { accountType }, new AccountWithDataSet[] { account }); + AccountTypeManager.setInstanceForTest(mockManager); } @Override diff --git a/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java b/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java index c8346881b..bf4e24b20 100644 --- a/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java +++ b/tests/src/com/android/contacts/interactions/ContactDeletionInteractionTest.java @@ -26,17 +26,16 @@ import android.test.suitebuilder.annotation.SmallTest; import com.android.contacts.ContactsApplication; import com.android.contacts.R; +import com.android.contacts.common.test.FragmentTestActivity; +import com.android.contacts.common.test.IntegrationTestUtils; +import com.android.contacts.common.test.mocks.ContactsMockContext; +import com.android.contacts.common.test.mocks.MockContentProvider; +import com.android.contacts.common.test.mocks.MockContentProvider.Query; import com.android.contacts.model.AccountTypeManager; import com.android.contacts.model.account.AccountType; import com.android.contacts.model.account.BaseAccountType; -import com.android.contacts.common.test.FragmentTestActivity; import com.android.contacts.test.InjectedServices; -import com.android.contacts.tests.mocks.ContactsAccountManagerMockContext; -import com.android.contacts.common.test.mocks.ContactsMockContext; import com.android.contacts.tests.mocks.MockAccountTypeManager; -import com.android.contacts.common.test.mocks.MockContentProvider; -import com.android.contacts.common.test.mocks.MockContentProvider.Query; -import com.android.contacts.common.test.IntegrationTestUtils; /** * Tests for {@link ContactDeletionInteraction}. @@ -80,7 +79,7 @@ public class ContactDeletionInteractionTest mUtils = new IntegrationTestUtils(getInstrumentation()); mUtils.acquireScreenWakeLock(getInstrumentation().getTargetContext()); - mContext = new ContactsAccountManagerMockContext(getInstrumentation().getTargetContext()); + mContext = new ContactsMockContext(getInstrumentation().getTargetContext()); InjectedServices services = new InjectedServices(); services.setContentResolver(mContext.getContentResolver()); @@ -99,11 +98,11 @@ public class ContactDeletionInteractionTest } }; writableAccountType.accountType = WRITABLE_ACCOUNT_TYPE; - - services.setSystemService(AccountTypeManager.ACCOUNT_TYPE_SERVICE, - new MockAccountTypeManager( - new AccountType[]{writableAccountType, readOnlyAccountType}, null)); ContactsApplication.injectServices(services); + + final MockAccountTypeManager mockManager = new MockAccountTypeManager( + new AccountType[] { writableAccountType, readOnlyAccountType }, null); + AccountTypeManager.setInstanceForTest(mockManager); mContactsProvider = mContext.getContactsProvider(); } diff --git a/tests/src/com/android/contacts/model/ContactLoaderTest.java b/tests/src/com/android/contacts/model/ContactLoaderTest.java index f1fb7aef9..2876e2a2b 100644 --- a/tests/src/com/android/contacts/model/ContactLoaderTest.java +++ b/tests/src/com/android/contacts/model/ContactLoaderTest.java @@ -28,26 +28,26 @@ import android.provider.ContactsContract.StatusUpdates; import android.test.LoaderTestCase; import android.test.suitebuilder.annotation.LargeTest; +import com.android.contacts.common.test.mocks.ContactsMockContext; +import com.android.contacts.common.test.mocks.MockContentProvider; import com.android.contacts.model.account.AccountType; import com.android.contacts.model.account.AccountWithDataSet; import com.android.contacts.model.account.BaseAccountType; import com.android.contacts.test.InjectedServices; -import com.android.contacts.tests.mocks.ContactsAccountManagerMockContext; import com.android.contacts.tests.mocks.MockAccountTypeManager; -import com.android.contacts.common.test.mocks.MockContentProvider; /** * Runs ContactLoader tests for the the contact-detail and editor view. */ @LargeTest public class ContactLoaderTest extends LoaderTestCase { - private ContactsAccountManagerMockContext mMockContext; + private ContactsMockContext mMockContext; private MockContentProvider mContactsProvider; @Override protected void setUp() throws Exception { super.setUp(); - mMockContext = new ContactsAccountManagerMockContext(getContext()); + mMockContext = new ContactsMockContext(getContext()); mContactsProvider = mMockContext.getContactsProvider(); InjectedServices services = new InjectedServices(); @@ -62,7 +62,7 @@ public class ContactLoaderTest extends LoaderTestCase { AccountWithDataSet account = new AccountWithDataSet("mockAccountName", "mockAccountType", null); - mMockContext.setMockAccountTypeManager( + AccountTypeManager.setInstanceForTest( new MockAccountTypeManager( new AccountType[]{accountType}, new AccountWithDataSet[]{account})); } diff --git a/tests/src/com/android/contacts/tests/mocks/ContactsAccountManagerMockContext.java b/tests/src/com/android/contacts/tests/mocks/ContactsAccountManagerMockContext.java deleted file mode 100644 index c0ba9d395..000000000 --- a/tests/src/com/android/contacts/tests/mocks/ContactsAccountManagerMockContext.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.contacts.tests.mocks; - -import android.content.Context; - -import com.android.contacts.common.test.mocks.ContactsMockContext; -import com.android.contacts.model.AccountTypeManager; - -/** - * A ContactsMockContext with an additional mock AccountTypeManager. - */ -public class ContactsAccountManagerMockContext extends ContactsMockContext { - - private MockAccountTypeManager mMockAccountTypeManager; - - - public ContactsAccountManagerMockContext(Context base) { - super(base); - } - - public void setMockAccountTypeManager(MockAccountTypeManager mockAccountTypeManager) { - mMockAccountTypeManager = mockAccountTypeManager; - } - - @Override - public Object getSystemService(String name) { - if (AccountTypeManager.ACCOUNT_TYPE_SERVICE.equals(name)) { - return mMockAccountTypeManager; - } - return super.getSystemService(name); - } -} |