Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: sync/android/java/src/org/chromium/sync/notifier/InvalidationController.java

Issue 23643002: Enable invalidations for arbitrary objects on Android. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.sync.notifier; 5 package org.chromium.sync.notifier;
6 6
7 import android.accounts.Account; 7 import android.accounts.Account;
8 import android.content.Context; 8 import android.content.Context;
9 import android.content.Intent; 9 import android.content.Intent;
10 10
11 import com.google.common.annotations.VisibleForTesting; 11 import com.google.common.annotations.VisibleForTesting;
12 import com.google.common.base.Preconditions; 12 import com.google.common.base.Preconditions;
13 import com.google.ipc.invalidation.external.client.types.ObjectId;
13 14
14 import org.chromium.base.ActivityStatus; 15 import org.chromium.base.ActivityStatus;
16 import org.chromium.base.CalledByNative;
15 import org.chromium.base.CollectionUtil; 17 import org.chromium.base.CollectionUtil;
16 import org.chromium.sync.internal_api.pub.base.ModelType; 18 import org.chromium.sync.internal_api.pub.base.ModelType;
17 19
20 import java.util.HashSet;
18 import java.util.Set; 21 import java.util.Set;
19 22
20 /** 23 /**
21 * Controller used to send start, stop, and registration-change commands to the invalidation 24 * Controller used to send start, stop, and registration-change commands to the invalidation
22 * client library used by Sync. 25 * client library used by Sync.
23 */ 26 */
24 public class InvalidationController implements ActivityStatus.StateListener { 27 public class InvalidationController implements ActivityStatus.StateListener {
25 /** 28 /**
26 * Constants and utility methods to create the intents used to communicate b etween the 29 * Constants and utility methods to create the intents used to communicate b etween the
27 * controller and the invalidation client library. 30 * controller and the invalidation client library.
28 */ 31 */
29 public static class IntentProtocol { 32 public static class IntentProtocol {
30 /** 33 /**
31 * Action set on register intents. 34 * Action set on register intents.
32 */ 35 */
33 public static final String ACTION_REGISTER = 36 public static final String ACTION_REGISTER =
34 "org.chromium.sync.notifier.ACTION_REGISTER_TYPES"; 37 "org.chromium.sync.notifier.ACTION_REGISTER_TYPES";
35 38
36 /** 39 /**
37 * Parcelable-valued intent extra containing the account of the user. 40 * Parcelable-valued intent extra containing the account of the user.
38 */ 41 */
39 public static final String EXTRA_ACCOUNT = "account"; 42 public static final String EXTRA_ACCOUNT = "account";
40 43
41 /** 44 /**
42 * String-list-valued intent extra of the syncable types to sync. 45 * String-list-valued intent extra of the syncable types to sync.
43 */ 46 */
44 public static final String EXTRA_REGISTERED_TYPES = "registered_types"; 47 public static final String EXTRA_REGISTERED_TYPES = "registered_types";
45 48
46 /** 49 /**
50 * Int-array-valued intent extra containing sources of objects to regist er for.
51 * The array is parallel to EXTRA_REGISTERED_OBJECT_NAMES.
52 */
53 public static final String EXTRA_REGISTERED_OBJECT_SOURCES = "registered _object_sources";
54
55 /**
56 * String-array-valued intent extra containing names of objects to regis ter for.
57 * The array is parallel to EXTRA_REGISTERED_OBJECT_SOURCES.
58 */
59 public static final String EXTRA_REGISTERED_OBJECT_NAMES = "registered_o bject_names";
60
61 /**
47 * Boolean-valued intent extra indicating that the service should be sto pped. 62 * Boolean-valued intent extra indicating that the service should be sto pped.
48 */ 63 */
49 public static final String EXTRA_STOP = "stop"; 64 public static final String EXTRA_STOP = "stop";
50 65
51 /** 66 /**
52 * Create an Intent that will start the invalidation listener service an d 67 * Create an Intent that will start the invalidation listener service an d
53 * register for the specified types. 68 * register for the specified types.
54 */ 69 */
55 public static Intent createRegisterIntent(Account account, 70 public static Intent createRegisterIntent(Account account,
56 boolean allTypes, Set<ModelTyp e> types) { 71 boolean allTypes, Set<ModelTyp e> types) {
57 Intent registerIntent = new Intent(ACTION_REGISTER); 72 Intent registerIntent = new Intent(ACTION_REGISTER);
58 String[] selectedTypesArray; 73 String[] selectedTypesArray;
59 if (allTypes) { 74 if (allTypes) {
60 selectedTypesArray = new String[]{ModelType.ALL_TYPES_TYPE}; 75 selectedTypesArray = new String[]{ModelType.ALL_TYPES_TYPE};
61 } else { 76 } else {
62 selectedTypesArray = new String[types.size()]; 77 selectedTypesArray = new String[types.size()];
63 int pos = 0; 78 int pos = 0;
64 for (ModelType type : types) { 79 for (ModelType type : types) {
65 selectedTypesArray[pos++] = type.name(); 80 selectedTypesArray[pos++] = type.name();
66 } 81 }
67 } 82 }
68 registerIntent.putStringArrayListExtra(EXTRA_REGISTERED_TYPES, 83 registerIntent.putStringArrayListExtra(EXTRA_REGISTERED_TYPES,
69 CollectionUtil.newArrayList(selectedTypesArray)); 84 CollectionUtil.newArrayList(selectedTypesArray));
70 registerIntent.putExtra(EXTRA_ACCOUNT, account); 85 registerIntent.putExtra(EXTRA_ACCOUNT, account);
71 return registerIntent; 86 return registerIntent;
72 } 87 }
73 88
89 /**
90 * Create an Intent that will start the invalidation listener service an d
91 * register for the object ids with the specified sources and names.
92 */
93 public static Intent createRegisterIntent(Account account, int[] objectS ources,
94 String[] objectNames) {
95 Intent registerIntent = new Intent(ACTION_REGISTER);
96 registerIntent.putExtra(EXTRA_REGISTERED_OBJECT_SOURCES, objectSourc es);
97 registerIntent.putExtra(EXTRA_REGISTERED_OBJECT_NAMES, objectNames);
98 registerIntent.putExtra(EXTRA_ACCOUNT, account);
99 return registerIntent;
100 }
101
74 /** Returns whether {@code intent} is a stop intent. */ 102 /** Returns whether {@code intent} is a stop intent. */
75 public static boolean isStop(Intent intent) { 103 public static boolean isStop(Intent intent) {
76 return intent.getBooleanExtra(EXTRA_STOP, false); 104 return intent.getBooleanExtra(EXTRA_STOP, false);
77 } 105 }
78 106
79 /** Returns whether {@code intent} is a registered types change intent. */ 107 /** Returns whether {@code intent} is a registered types change intent. */
80 public static boolean isRegisteredTypesChange(Intent intent) { 108 public static boolean isRegisteredTypesChange(Intent intent) {
81 return intent.hasExtra(EXTRA_REGISTERED_TYPES); 109 return intent.hasExtra(EXTRA_REGISTERED_TYPES) ||
110 intent.hasExtra(EXTRA_REGISTERED_OBJECT_SOURCES);
111 }
112
113 /** Returns the object ids for which to register contained in the intent . */
114 public static Set<ObjectId> getRegisteredObjectIds(Intent intent) {
115 int[] objectSources = intent.getIntArrayExtra(EXTRA_REGISTERED_OBJEC T_SOURCES);
116 String[] objectNames = intent.getStringArrayExtra(EXTRA_REGISTERED_O BJECT_NAMES);
117 if (objectSources == null || objectNames == null ||
118 objectSources.length != objectNames.length) {
119 return null;
120 }
121 Set<ObjectId> objectIds = new HashSet<ObjectId>(objectSources.length );
122 for (int i = 0; i < objectSources.length; i++) {
123 objectIds.add(ObjectId.newInstance(objectSources[i], objectNames [i].getBytes()));
124 }
125 return objectIds;
82 } 126 }
83 127
84 private IntentProtocol() { 128 private IntentProtocol() {
85 // Disallow instantiation. 129 // Disallow instantiation.
86 } 130 }
87 } 131 }
88 132
89 private static final Object LOCK = new Object(); 133 private static final Object LOCK = new Object();
90 134
91 private static InvalidationController sInstance; 135 private static InvalidationController sInstance;
(...skipping 23 matching lines...) Expand all
115 public void refreshRegisteredTypes(Set<ModelType> types) { 159 public void refreshRegisteredTypes(Set<ModelType> types) {
116 InvalidationPreferences invalidationPreferences = new InvalidationPrefer ences(mContext); 160 InvalidationPreferences invalidationPreferences = new InvalidationPrefer ences(mContext);
117 Set<String> savedSyncedTypes = invalidationPreferences.getSavedSyncedTyp es(); 161 Set<String> savedSyncedTypes = invalidationPreferences.getSavedSyncedTyp es();
118 Account account = invalidationPreferences.getSavedSyncedAccount(); 162 Account account = invalidationPreferences.getSavedSyncedAccount();
119 boolean allTypes = savedSyncedTypes != null && 163 boolean allTypes = savedSyncedTypes != null &&
120 savedSyncedTypes.contains(ModelType.ALL_TYPES_TYPE); 164 savedSyncedTypes.contains(ModelType.ALL_TYPES_TYPE);
121 setRegisteredTypes(account, allTypes, types); 165 setRegisteredTypes(account, allTypes, types);
122 } 166 }
123 167
124 /** 168 /**
169 * Sets object ids for which the client should register for notification. Th is is intended for
170 * registering non-Sync types; Sync types are registered with {@code setRegi steredTypes}.
171 *
172 * @param objectSources The sources of the objects.
173 * @param objectNames The names of the objects.
174 */
175 @CalledByNative
176 public void setRegisteredObjectIds(int[] objectSources, String[] objectNames ) {
177 InvalidationPreferences invalidationPreferences = new InvalidationPrefer ences(mContext);
178 Account account = invalidationPreferences.getSavedSyncedAccount();
179 Intent registerIntent = IntentProtocol.createRegisterIntent(account, obj ectSources,
180 objectNames);
181 registerIntent.setClass(mContext, InvalidationService.class);
182 mContext.startService(registerIntent);
183 }
184
185 /**
125 * Starts the invalidation client. 186 * Starts the invalidation client.
126 */ 187 */
127 public void start() { 188 public void start() {
128 Intent intent = new Intent(mContext, InvalidationService.class); 189 Intent intent = new Intent(mContext, InvalidationService.class);
129 mContext.startService(intent); 190 mContext.startService(intent);
130 } 191 }
131 192
132 /** 193 /**
133 * Stops the invalidation client. 194 * Stops the invalidation client.
134 */ 195 */
135 public void stop() { 196 public void stop() {
136 Intent intent = new Intent(mContext, InvalidationService.class); 197 Intent intent = new Intent(mContext, InvalidationService.class);
137 intent.putExtra(IntentProtocol.EXTRA_STOP, true); 198 intent.putExtra(IntentProtocol.EXTRA_STOP, true);
138 mContext.startService(intent); 199 mContext.startService(intent);
139 } 200 }
140 201
141 /** 202 /**
142 * Returns the instance that will use {@code context} to issue intents. 203 * Returns the instance that will use {@code context} to issue intents.
143 * 204 *
144 * Calling this method will create the instance if it does not yet exist. 205 * Calling this method will create the instance if it does not yet exist.
145 */ 206 */
207 @CalledByNative
146 public static InvalidationController get(Context context) { 208 public static InvalidationController get(Context context) {
147 synchronized (LOCK) { 209 synchronized (LOCK) {
148 if (sInstance == null) { 210 if (sInstance == null) {
149 sInstance = new InvalidationController(context); 211 sInstance = new InvalidationController(context);
150 } 212 }
151 return sInstance; 213 return sInstance;
152 } 214 }
153 } 215 }
154 216
155 /** 217 /**
156 * Creates an instance using {@code context} to send intents. 218 * Creates an instance using {@code context} to send intents.
157 */ 219 */
158 @VisibleForTesting 220 @VisibleForTesting
159 InvalidationController(Context context) { 221 InvalidationController(Context context) {
160 mContext = Preconditions.checkNotNull(context.getApplicationContext()); 222 mContext = Preconditions.checkNotNull(context.getApplicationContext());
161 ActivityStatus.registerStateListener(this); 223 ActivityStatus.registerStateListener(this);
162 } 224 }
163 225
164 @Override 226 @Override
165 public void onActivityStateChange(int newState) { 227 public void onActivityStateChange(int newState) {
166 if (SyncStatusHelper.get(mContext).isSyncEnabled()) { 228 if (SyncStatusHelper.get(mContext).isSyncEnabled()) {
167 if (newState == ActivityStatus.PAUSED) { 229 if (newState == ActivityStatus.PAUSED) {
168 stop(); 230 stop();
169 } else if (newState == ActivityStatus.RESUMED) { 231 } else if (newState == ActivityStatus.RESUMED) {
170 start(); 232 start();
171 } 233 }
172 } 234 }
173 } 235 }
174 } 236 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698