1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.sync.notifier; 6 7 import android.accounts.Account; 8 import android.content.ComponentName; 9 import android.content.Intent; 10 import android.os.Bundle; 11 12 import com.google.ipc.invalidation.external.client.types.ObjectId; 13 14 import org.chromium.base.CollectionUtil; 15 16 import java.util.ArrayList; 17 import java.util.HashSet; 18 import java.util.List; 19 import java.util.Set; 20 21 /** 22 * Subclass of {@link InvalidationService} that captures events and allows controlling 23 * whether or not Chrome is in the foreground and sync is enabled. 24 * 25 * @author dsmyers (at) google.com (Daniel Myers) 26 */ 27 public class TestableInvalidationService extends InvalidationService { 28 /** Object ids given to {@link #register}, one list element per call. */ 29 final List<List<ObjectId>> mRegistrations = new ArrayList<List<ObjectId>>(); 30 31 /** Object ids given to {@link #unregister}, one list element per call. */ 32 final List<List<ObjectId>> mUnregistrations = new ArrayList<List<ObjectId>>(); 33 34 /** 35 * Current registered based on the cumulative calls to {@link #register} and 36 * {@link #unregister}. 37 */ 38 final Set<ObjectId> mCurrentRegistrations = new HashSet<ObjectId>(); 39 40 /** Intents given to {@link #startService}. */ 41 final List<Intent> mStartedServices = new ArrayList<Intent>(); 42 43 /** Bundles given to {@link #requestSyncFromContentResolver}. */ 44 final List<Bundle> mRequestedSyncs = new ArrayList<Bundle>(); 45 46 final List<byte[]> mAcknowledgements = new ArrayList<byte[]>(); 47 48 /** Whether Chrome is in the foreground. */ 49 private boolean mIsChromeInForeground = false; 50 51 /** Whether sync is enabled. */ 52 private boolean mIsSyncEnabled = false; 53 54 public TestableInvalidationService() { 55 } 56 57 @Override 58 public void acknowledge(byte[] ackHandle) { 59 mAcknowledgements.add(ackHandle); 60 } 61 62 @Override 63 public void register(byte[] clientId, Iterable<ObjectId> objectIds) { 64 List<ObjectId> objectIdList = CollectionUtil.newArrayList(objectIds); 65 mRegistrations.add(objectIdList); 66 mCurrentRegistrations.addAll(objectIdList); 67 super.register(clientId, objectIds); 68 } 69 70 @Override 71 public void unregister(byte[] clientId, Iterable<ObjectId> objectIds) { 72 List<ObjectId> objectIdList = CollectionUtil.newArrayList(objectIds); 73 mUnregistrations.add(objectIdList); 74 mCurrentRegistrations.removeAll(objectIdList); 75 super.unregister(clientId, objectIds); 76 } 77 78 @Override 79 public ComponentName startService(Intent intent) { 80 mStartedServices.add(intent); 81 return super.startService(intent); 82 } 83 84 @Override 85 public void requestSyncFromContentResolver(Bundle bundle, Account account, 86 String contractAuthority) { 87 mRequestedSyncs.add(bundle); 88 super.requestSyncFromContentResolver(bundle, account, contractAuthority); 89 } 90 91 @Override 92 boolean isChromeInForeground() { 93 return mIsChromeInForeground; 94 } 95 96 @Override 97 boolean isSyncEnabled() { 98 return mIsSyncEnabled; 99 } 100 101 /** 102 * Sets the variables used to control whether or not a notification client should be running. 103 * @param isChromeInForeground whether Chrome is in the foreground 104 * @param isSyncEnabled whether sync is enabled 105 */ 106 void setShouldRunStates(boolean isChromeInForeground, boolean isSyncEnabled) { 107 this.mIsChromeInForeground = isChromeInForeground; 108 this.mIsSyncEnabled = isSyncEnabled; 109 } 110 } 111