Index: sync/test/android/javatests/src/org/chromium/sync/test/util/MockSyncContentResolverDelegate.java |
diff --git a/sync/test/android/javatests/src/org/chromium/sync/test/util/MockSyncContentResolverDelegate.java b/sync/test/android/javatests/src/org/chromium/sync/test/util/MockSyncContentResolverDelegate.java |
deleted file mode 100644 |
index 80a97a276ff831b09025f633bbf5794aa18da262..0000000000000000000000000000000000000000 |
--- a/sync/test/android/javatests/src/org/chromium/sync/test/util/MockSyncContentResolverDelegate.java |
+++ /dev/null |
@@ -1,227 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-package org.chromium.sync.test.util; |
- |
- |
-import android.accounts.Account; |
-import android.content.ContentResolver; |
-import android.content.SyncStatusObserver; |
-import android.os.AsyncTask; |
-import android.os.Bundle; |
- |
-import junit.framework.Assert; |
- |
-import org.chromium.base.ThreadUtils; |
-import org.chromium.base.VisibleForTesting; |
-import org.chromium.sync.SyncContentResolverDelegate; |
- |
-import java.util.HashMap; |
-import java.util.HashSet; |
-import java.util.Map; |
-import java.util.Set; |
-import java.util.concurrent.Semaphore; |
-import java.util.concurrent.TimeUnit; |
- |
- |
-/** |
- * Mock implementation of the {@link SyncContentResolverDelegate}. |
- * |
- * This implementation only supports status change listeners for the type |
- * SYNC_OBSERVER_TYPE_SETTINGS. |
- */ |
-public class MockSyncContentResolverDelegate implements SyncContentResolverDelegate { |
- |
- private final Set<String> mSyncAutomaticallySet; |
- private final Map<String, Boolean> mIsSyncableMap; |
- private final Object mSyncableMapLock = new Object(); |
- |
- private final Set<AsyncSyncStatusObserver> mObservers; |
- |
- private boolean mMasterSyncAutomatically; |
- private boolean mDisableObserverNotifications; |
- |
- private Semaphore mPendingObserverCount; |
- |
- public MockSyncContentResolverDelegate() { |
- mSyncAutomaticallySet = new HashSet<String>(); |
- mIsSyncableMap = new HashMap<String, Boolean>(); |
- mObservers = new HashSet<AsyncSyncStatusObserver>(); |
- } |
- |
- @Override |
- public Object addStatusChangeListener(int mask, SyncStatusObserver callback) { |
- if (mask != ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS) { |
- throw new IllegalArgumentException("This implementation only supports " |
- + "ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS as the mask"); |
- } |
- AsyncSyncStatusObserver asyncSyncStatusObserver = new AsyncSyncStatusObserver(callback); |
- synchronized (mObservers) { |
- mObservers.add(asyncSyncStatusObserver); |
- } |
- return asyncSyncStatusObserver; |
- } |
- |
- @Override |
- public void removeStatusChangeListener(Object handle) { |
- synchronized (mObservers) { |
- mObservers.remove(handle); |
- } |
- } |
- |
- @Override |
- @VisibleForTesting |
- public void setMasterSyncAutomatically(boolean sync) { |
- if (mMasterSyncAutomatically == sync) return; |
- |
- mMasterSyncAutomatically = sync; |
- notifyObservers(); |
- } |
- |
- @Override |
- public boolean getMasterSyncAutomatically() { |
- return mMasterSyncAutomatically; |
- } |
- |
- @Override |
- public boolean getSyncAutomatically(Account account, String authority) { |
- String key = createKey(account, authority); |
- synchronized (mSyncableMapLock) { |
- return mSyncAutomaticallySet.contains(key); |
- } |
- } |
- |
- @Override |
- public void setSyncAutomatically(Account account, String authority, boolean sync) { |
- String key = createKey(account, authority); |
- synchronized (mSyncableMapLock) { |
- if (!mIsSyncableMap.containsKey(key) || !mIsSyncableMap.get(key)) { |
- throw new IllegalArgumentException("Account " + account |
- + " is not syncable for authority " + authority |
- + ". Can not set sync state to " + sync); |
- } |
- if (sync) { |
- mSyncAutomaticallySet.add(key); |
- } else if (mSyncAutomaticallySet.contains(key)) { |
- mSyncAutomaticallySet.remove(key); |
- } |
- } |
- notifyObservers(); |
- } |
- |
- @Override |
- public void setIsSyncable(Account account, String authority, int syncable) { |
- String key = createKey(account, authority); |
- |
- synchronized (mSyncableMapLock) { |
- switch (syncable) { |
- case 0: |
- mIsSyncableMap.put(key, false); |
- break; |
- case 1: |
- mIsSyncableMap.put(key, true); |
- break; |
- case -1: |
- if (mIsSyncableMap.containsKey(key)) { |
- mIsSyncableMap.remove(key); |
- } |
- break; |
- default: |
- throw new IllegalArgumentException("Unable to understand syncable argument: " |
- + syncable); |
- } |
- } |
- notifyObservers(); |
- } |
- |
- @Override |
- public int getIsSyncable(Account account, String authority) { |
- String key = createKey(account, authority); |
- synchronized (mSyncableMapLock) { |
- if (mIsSyncableMap.containsKey(key)) { |
- return mIsSyncableMap.get(key) ? 1 : 0; |
- } else { |
- return -1; |
- } |
- } |
- } |
- |
- @Override |
- public void removePeriodicSync(Account account, String authority, Bundle extras) { |
- } |
- |
- private static String createKey(Account account, String authority) { |
- return account.name + "@@@" + account.type + "@@@" + authority; |
- } |
- |
- private void notifyObservers() { |
- if (mDisableObserverNotifications) return; |
- synchronized (mObservers) { |
- mPendingObserverCount = new Semaphore(1 - mObservers.size()); |
- for (AsyncSyncStatusObserver observer : mObservers) { |
- observer.notifyObserverAsync(mPendingObserverCount); |
- } |
- } |
- } |
- |
- /** |
- * Blocks until the last notification has been issued to all registered observers. |
- * Note that if an observer is removed while a notification is being handled this can |
- * fail to return correctly. |
- * |
- * @throws InterruptedException |
- */ |
- @VisibleForTesting |
- public void waitForLastNotificationCompleted() throws InterruptedException { |
- Assert.assertTrue("Timed out waiting for notifications to complete.", |
- mPendingObserverCount.tryAcquire(5, TimeUnit.SECONDS)); |
- } |
- |
- public void disableObserverNotifications() { |
- mDisableObserverNotifications = true; |
- } |
- |
- /** |
- * Simulate an account rename, which copies settings to the new account. |
- */ |
- public void renameAccounts(Account oldAccount, Account newAccount, String authority) { |
- int oldIsSyncable = getIsSyncable(oldAccount, authority); |
- setIsSyncable(newAccount, authority, oldIsSyncable); |
- if (oldIsSyncable == 1) { |
- setSyncAutomatically( |
- newAccount, authority, getSyncAutomatically(oldAccount, authority)); |
- } |
- } |
- |
- private static class AsyncSyncStatusObserver { |
- |
- private final SyncStatusObserver mSyncStatusObserver; |
- |
- private AsyncSyncStatusObserver(SyncStatusObserver syncStatusObserver) { |
- mSyncStatusObserver = syncStatusObserver; |
- } |
- |
- private void notifyObserverAsync(final Semaphore pendingObserverCount) { |
- if (ThreadUtils.runningOnUiThread()) { |
- new AsyncTask<Void, Void, Void>() { |
- @Override |
- protected Void doInBackground(Void... params) { |
- mSyncStatusObserver.onStatusChanged( |
- ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS); |
- return null; |
- } |
- |
- @Override |
- protected void onPostExecute(Void result) { |
- pendingObserverCount.release(); |
- } |
- }.execute(); |
- } else { |
- mSyncStatusObserver.onStatusChanged( |
- ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS); |
- pendingObserverCount.release(); |
- } |
- } |
- } |
-} |