blob: 541ebbd32f11214b265806a64f1b550307a37c1b [file] [log] [blame]
Matthew Williamsfa774182013-06-18 15:44:11 -07001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.content;
18
19import android.accounts.Account;
20import android.os.Bundle;
21import android.os.Parcel;
22import android.os.Parcelable;
Matthew Williamsfa774182013-06-18 15:44:11 -070023
Matthew Williams23680142014-06-09 20:06:03 -070024/**
25 * Convenience class to construct sync requests. See {@link android.content.SyncRequest.Builder}
26 * for an explanation of the various functions. The resulting object is passed through to the
27 * framework via {@link android.content.ContentResolver#requestSync(SyncRequest)}.
28 */
Matthew Williamsfa774182013-06-18 15:44:11 -070029public class SyncRequest implements Parcelable {
30 private static final String TAG = "SyncRequest";
31 /** Account to pass to the sync adapter. Can be null. */
32 private final Account mAccountToSync;
33 /** Authority string that corresponds to a ContentProvider. */
34 private final String mAuthority;
Matthew Williamsfa774182013-06-18 15:44:11 -070035 /** Bundle containing user info as well as sync settings. */
36 private final Bundle mExtras;
Matthew Williams56dbf8f2013-07-26 12:56:39 -070037 /** Don't allow this sync request on metered networks. */
38 private final boolean mDisallowMetered;
Matthew Williamsfa774182013-06-18 15:44:11 -070039 /**
Matthew Williamsc81891c2013-07-24 19:09:30 -070040 * Amount of time before {@link #mSyncRunTimeSecs} from which the sync may optionally be
Matthew Williamsfa774182013-06-18 15:44:11 -070041 * started.
42 */
43 private final long mSyncFlexTimeSecs;
44 /**
45 * Specifies a point in the future at which the sync must have been scheduled to run.
46 */
47 private final long mSyncRunTimeSecs;
48 /** Periodic versus one-off. */
49 private final boolean mIsPeriodic;
50 /** Service versus provider. */
51 private final boolean mIsAuthority;
52 /** Sync should be run in lieu of other syncs. */
53 private final boolean mIsExpedited;
54
55 /**
56 * {@hide}
57 * @return whether this sync is periodic or one-time. A Sync Request must be
58 * either one of these or an InvalidStateException will be thrown in
59 * Builder.build().
60 */
61 public boolean isPeriodic() {
62 return mIsPeriodic;
63 }
64
Matthew Williams23680142014-06-09 20:06:03 -070065 /**
66 * {@hide}
67 * @return whether this sync is expedited.
68 */
Matthew Williamsfa774182013-06-18 15:44:11 -070069 public boolean isExpedited() {
70 return mIsExpedited;
71 }
72
73 /**
74 * {@hide}
Matthew Williamsfa774182013-06-18 15:44:11 -070075 *
Matthew Williams56dbf8f2013-07-26 12:56:39 -070076 * @return account object for this sync.
77 * @throws IllegalArgumentException if this function is called for a request that targets a
78 * sync service.
Matthew Williamsfa774182013-06-18 15:44:11 -070079 */
Matthew Williams56dbf8f2013-07-26 12:56:39 -070080 public Account getAccount() {
Matthew Williams56dbf8f2013-07-26 12:56:39 -070081 return mAccountToSync;
82 }
83
84 /**
85 * {@hide}
86 *
87 * @return provider for this sync.
88 * @throws IllegalArgumentException if this function is called for a request that targets a
89 * sync service.
90 */
91 public String getProvider() {
Matthew Williams56dbf8f2013-07-26 12:56:39 -070092 return mAuthority;
Matthew Williamsfa774182013-06-18 15:44:11 -070093 }
94
95 /**
96 * {@hide}
Matthew Williamsfa774182013-06-18 15:44:11 -070097 * Retrieve bundle for this SyncRequest. Will not be null.
98 */
99 public Bundle getBundle() {
100 return mExtras;
101 }
102
103 /**
104 * {@hide}
105 * @return the earliest point in time that this sync can be scheduled.
106 */
107 public long getSyncFlexTime() {
108 return mSyncFlexTimeSecs;
109 }
110 /**
111 * {@hide}
112 * @return the last point in time at which this sync must scheduled.
113 */
114 public long getSyncRunTime() {
115 return mSyncRunTimeSecs;
116 }
117
118 public static final Creator<SyncRequest> CREATOR = new Creator<SyncRequest>() {
119
120 @Override
121 public SyncRequest createFromParcel(Parcel in) {
122 return new SyncRequest(in);
123 }
124
125 @Override
126 public SyncRequest[] newArray(int size) {
127 return new SyncRequest[size];
128 }
129 };
130
131 @Override
132 public int describeContents() {
133 return 0;
134 }
135
136 @Override
137 public void writeToParcel(Parcel parcel, int flags) {
138 parcel.writeBundle(mExtras);
139 parcel.writeLong(mSyncFlexTimeSecs);
140 parcel.writeLong(mSyncRunTimeSecs);
141 parcel.writeInt((mIsPeriodic ? 1 : 0));
Matthew Williams56dbf8f2013-07-26 12:56:39 -0700142 parcel.writeInt((mDisallowMetered ? 1 : 0));
Matthew Williamsfa774182013-06-18 15:44:11 -0700143 parcel.writeInt((mIsAuthority ? 1 : 0));
144 parcel.writeInt((mIsExpedited? 1 : 0));
Matthew Williams64939ae2014-06-04 09:25:11 -0700145 parcel.writeParcelable(mAccountToSync, flags);
146 parcel.writeString(mAuthority);
Matthew Williamsfa774182013-06-18 15:44:11 -0700147 }
148
149 private SyncRequest(Parcel in) {
Jeff Sharkeya04c7a72016-03-18 12:20:36 -0600150 mExtras = Bundle.setDefusable(in.readBundle(), true);
Matthew Williamsfa774182013-06-18 15:44:11 -0700151 mSyncFlexTimeSecs = in.readLong();
152 mSyncRunTimeSecs = in.readLong();
153 mIsPeriodic = (in.readInt() != 0);
Matthew Williams56dbf8f2013-07-26 12:56:39 -0700154 mDisallowMetered = (in.readInt() != 0);
Matthew Williamsfa774182013-06-18 15:44:11 -0700155 mIsAuthority = (in.readInt() != 0);
156 mIsExpedited = (in.readInt() != 0);
Matthew Williams64939ae2014-06-04 09:25:11 -0700157 mAccountToSync = in.readParcelable(null);
158 mAuthority = in.readString();
Matthew Williamsfa774182013-06-18 15:44:11 -0700159 }
160
161 /** {@hide} Protected ctor to instantiate anonymous SyncRequest. */
162 protected SyncRequest(SyncRequest.Builder b) {
163 mSyncFlexTimeSecs = b.mSyncFlexTimeSecs;
164 mSyncRunTimeSecs = b.mSyncRunTimeSecs;
165 mAccountToSync = b.mAccount;
166 mAuthority = b.mAuthority;
Matthew Williamsfa774182013-06-18 15:44:11 -0700167 mIsPeriodic = (b.mSyncType == Builder.SYNC_TYPE_PERIODIC);
168 mIsAuthority = (b.mSyncTarget == Builder.SYNC_TARGET_ADAPTER);
169 mIsExpedited = b.mExpedited;
170 mExtras = new Bundle(b.mCustomExtras);
Matthew Williams68e39c32013-07-25 16:40:23 -0700171 // For now we merge the sync config extras & the custom extras into one bundle.
172 // TODO: pass the configuration extras through separately.
173 mExtras.putAll(b.mSyncConfigExtras);
Matthew Williams56dbf8f2013-07-26 12:56:39 -0700174 mDisallowMetered = b.mDisallowMetered;
Matthew Williamsfa774182013-06-18 15:44:11 -0700175 }
176
177 /**
178 * Builder class for a @link SyncRequest. As you build your SyncRequest this class will also
179 * perform validation.
180 */
181 public static class Builder {
182 /** Unknown sync type. */
183 private static final int SYNC_TYPE_UNKNOWN = 0;
184 /** Specify that this is a periodic sync. */
185 private static final int SYNC_TYPE_PERIODIC = 1;
186 /** Specify that this is a one-time sync. */
187 private static final int SYNC_TYPE_ONCE = 2;
188 /** Unknown sync target. */
189 private static final int SYNC_TARGET_UNKNOWN = 0;
Matthew Williamsfa774182013-06-18 15:44:11 -0700190 /** Specify that this is a sync with a provider. */
191 private static final int SYNC_TARGET_ADAPTER = 2;
192 /**
193 * Earliest point of displacement into the future at which this sync can
194 * occur.
195 */
196 private long mSyncFlexTimeSecs;
197 /** Displacement into the future at which this sync must occur. */
198 private long mSyncRunTimeSecs;
199 /**
200 * Sync configuration information - custom user data explicitly provided by the developer.
201 * This data is handed over to the sync operation.
202 */
203 private Bundle mCustomExtras;
204 /**
205 * Sync system configuration - used to store system sync configuration. Corresponds to
206 * ContentResolver.SYNC_EXTRAS_* flags.
207 * TODO: Use this instead of dumping into one bundle. Need to decide if these flags should
208 * discriminate between equivalent syncs.
209 */
210 private Bundle mSyncConfigExtras;
Matthew Williamsfa774182013-06-18 15:44:11 -0700211 /** Whether or not this sync can occur on metered networks. Default false. */
Matthew Williams56dbf8f2013-07-26 12:56:39 -0700212 private boolean mDisallowMetered;
Matthew Williamsfa774182013-06-18 15:44:11 -0700213 /**
214 * Whether this builder is building a periodic sync, or a one-time sync.
215 */
216 private int mSyncType = SYNC_TYPE_UNKNOWN;
Matthew Williams64939ae2014-06-04 09:25:11 -0700217 /** Whether this will go to a sync adapter. */
Matthew Williamsfa774182013-06-18 15:44:11 -0700218 private int mSyncTarget = SYNC_TARGET_UNKNOWN;
219 /** Whether this is a user-activated sync. */
220 private boolean mIsManual;
221 /**
222 * Whether to retry this one-time sync if the sync fails. Not valid for
Matthew Williamsc81891c2013-07-24 19:09:30 -0700223 * periodic syncs. See {@link ContentResolver#SYNC_EXTRAS_DO_NOT_RETRY}.
Matthew Williamsfa774182013-06-18 15:44:11 -0700224 */
225 private boolean mNoRetry;
226 /**
227 * Whether to respect back-off for this one-time sync. Not valid for
228 * periodic syncs. See
Matthew Williamsc81891c2013-07-24 19:09:30 -0700229 * {@link ContentResolver#SYNC_EXTRAS_IGNORE_BACKOFF};
Matthew Williamsfa774182013-06-18 15:44:11 -0700230 */
231 private boolean mIgnoreBackoff;
232
233 /** Ignore sync system settings and perform sync anyway. */
234 private boolean mIgnoreSettings;
235
236 /** This sync will run in preference to other non-expedited syncs. */
237 private boolean mExpedited;
238
239 /**
Matthew Williamsfa774182013-06-18 15:44:11 -0700240 * The Account object that together with an Authority name define the SyncAdapter (if
Matthew Williamsc81891c2013-07-24 19:09:30 -0700241 * this sync is bound to a provider), otherwise null.
Matthew Williamsfa774182013-06-18 15:44:11 -0700242 */
243 private Account mAccount;
244 /**
245 * The Authority name that together with an Account define the SyncAdapter (if
Matthew Williamsc81891c2013-07-24 19:09:30 -0700246 * this sync is bound to a provider), otherwise null.
Matthew Williamsfa774182013-06-18 15:44:11 -0700247 */
248 private String mAuthority;
Shreyas Basarge8c834c02016-01-07 13:53:16 +0000249 /**
250 * Whether the sync requires the phone to be plugged in.
251 */
252 private boolean mRequiresCharging;
Matthew Williamsfa774182013-06-18 15:44:11 -0700253
254 public Builder() {
255 }
256
257 /**
Nick Kralevich47d2b612013-10-19 10:43:55 -0700258 * Request that a sync occur immediately.
Matthew Williamsfa774182013-06-18 15:44:11 -0700259 *
260 * Example
261 * <pre>
Nick Kralevich69002ae2013-10-19 08:43:08 -0700262 * SyncRequest.Builder builder = (new SyncRequest.Builder()).syncOnce();
Matthew Williamsfa774182013-06-18 15:44:11 -0700263 * </pre>
264 */
Nick Kralevich69002ae2013-10-19 08:43:08 -0700265 public Builder syncOnce() {
Matthew Williamsfa774182013-06-18 15:44:11 -0700266 if (mSyncType != SYNC_TYPE_UNKNOWN) {
267 throw new IllegalArgumentException("Sync type has already been defined.");
268 }
269 mSyncType = SYNC_TYPE_ONCE;
Nick Kralevich69002ae2013-10-19 08:43:08 -0700270 setupInterval(0, 0);
Matthew Williamsfa774182013-06-18 15:44:11 -0700271 return this;
272 }
273
274 /**
275 * Build a periodic sync. Either this or syncOnce() <b>must</b> be called for this builder.
Matthew Williams64939ae2014-06-04 09:25:11 -0700276 * Syncs are identified by target {@link android.provider} and by the
Matthew Williamsfa774182013-06-18 15:44:11 -0700277 * contents of the extras bundle.
278 * You cannot reuse the same builder for one-time syncs after having specified a periodic
Matthew Williamsc81891c2013-07-24 19:09:30 -0700279 * sync (by calling this function). If you do, an <code>IllegalArgumentException</code>
280 * will be thrown.
Matthew Williams56dbf8f2013-07-26 12:56:39 -0700281 * <p>The bundle for a periodic sync can be queried by applications with the correct
282 * permissions using
283 * {@link ContentResolver#getPeriodicSyncs(Account account, String provider)}, so no
284 * sensitive data should be transferred here.
Matthew Williamsc81891c2013-07-24 19:09:30 -0700285 *
Matthew Williamsfa774182013-06-18 15:44:11 -0700286 * Example usage.
287 *
288 * <pre>
289 * Request a periodic sync every 5 hours with 20 minutes of flex.
290 * SyncRequest.Builder builder =
291 * (new SyncRequest.Builder()).syncPeriodic(5 * HOUR_IN_SECS, 20 * MIN_IN_SECS);
292 *
293 * Schedule a periodic sync every hour at any point in time during that hour.
294 * SyncRequest.Builder builder =
295 * (new SyncRequest.Builder()).syncPeriodic(1 * HOUR_IN_SECS, 1 * HOUR_IN_SECS);
296 * </pre>
297 *
298 * N.B.: Periodic syncs are not allowed to have any of
Ying Wang8cf4e132013-07-24 20:47:19 -0700299 * {@link ContentResolver#SYNC_EXTRAS_DO_NOT_RETRY},
300 * {@link ContentResolver#SYNC_EXTRAS_IGNORE_BACKOFF},
301 * {@link ContentResolver#SYNC_EXTRAS_IGNORE_SETTINGS},
302 * {@link ContentResolver#SYNC_EXTRAS_INITIALIZE},
303 * {@link ContentResolver#SYNC_EXTRAS_FORCE},
304 * {@link ContentResolver#SYNC_EXTRAS_EXPEDITED},
305 * {@link ContentResolver#SYNC_EXTRAS_MANUAL}
Matthew Williamsc81891c2013-07-24 19:09:30 -0700306 * set to true. If any are supplied then an <code>IllegalArgumentException</code> will
Matthew Williamsfa774182013-06-18 15:44:11 -0700307 * be thrown.
308 *
309 * @param pollFrequency the amount of time in seconds that you wish
Shreyas Basargee96c3b72016-01-29 19:25:51 +0000310 * to elapse between periodic syncs. A minimum period of 1 hour is enforced.
Matthew Williamsfa774182013-06-18 15:44:11 -0700311 * @param beforeSeconds the amount of flex time in seconds before
312 * {@code pollFrequency} that you permit for the sync to take
Shreyas Basargee96c3b72016-01-29 19:25:51 +0000313 * place. Must be less than {@code pollFrequency} and greater than
314 * MAX(5% of {@code pollFrequency}, 5 minutes)
Matthew Williamsfa774182013-06-18 15:44:11 -0700315 */
316 public Builder syncPeriodic(long pollFrequency, long beforeSeconds) {
317 if (mSyncType != SYNC_TYPE_UNKNOWN) {
318 throw new IllegalArgumentException("Sync type has already been defined.");
319 }
320 mSyncType = SYNC_TYPE_PERIODIC;
321 setupInterval(pollFrequency, beforeSeconds);
322 return this;
323 }
324
Matthew Williamsfa774182013-06-18 15:44:11 -0700325 private void setupInterval(long at, long before) {
326 if (before > at) {
327 throw new IllegalArgumentException("Specified run time for the sync must be" +
Matthew Williamsc81891c2013-07-24 19:09:30 -0700328 " after the specified flex time.");
Matthew Williamsfa774182013-06-18 15:44:11 -0700329 }
330 mSyncRunTimeSecs = at;
331 mSyncFlexTimeSecs = before;
332 }
333
334 /**
Matthew Williams56dbf8f2013-07-26 12:56:39 -0700335 * Will throw an <code>IllegalArgumentException</code> if called and
336 * {@link #setIgnoreSettings(boolean ignoreSettings)} has already been called.
337 * @param disallow true to allow this transfer on metered networks. Default false.
Matthew Williams64939ae2014-06-04 09:25:11 -0700338 *
Matthew Williamsfa774182013-06-18 15:44:11 -0700339 */
Matthew Williams56dbf8f2013-07-26 12:56:39 -0700340 public Builder setDisallowMetered(boolean disallow) {
341 if (mIgnoreSettings && disallow) {
342 throw new IllegalArgumentException("setDisallowMetered(true) after having"
Shreyas Basarge8c834c02016-01-07 13:53:16 +0000343 + " specified that settings are ignored.");
Matthew Williams56dbf8f2013-07-26 12:56:39 -0700344 }
345 mDisallowMetered = disallow;
Matthew Williamsfa774182013-06-18 15:44:11 -0700346 return this;
347 }
348
349 /**
Shreyas Basarge8c834c02016-01-07 13:53:16 +0000350 * Specify whether the sync requires the phone to be plugged in.
351 * @param requiresCharging true if sync requires the phone to be plugged in. Default false.
352 */
353 public Builder setRequiresCharging(boolean requiresCharging) {
354 mRequiresCharging = true;
355 return this;
356 }
357
358 /**
Matthew Williams64939ae2014-06-04 09:25:11 -0700359 * Specify an authority and account for this transfer.
Matthew Williamsfa774182013-06-18 15:44:11 -0700360 *
Matthew Williams64939ae2014-06-04 09:25:11 -0700361 * @param authority A String identifying the content provider to be synced.
Matthew Williamsfa774182013-06-18 15:44:11 -0700362 * @param account Account to sync. Can be null unless this is a periodic
363 * sync, for which verification by the ContentResolver will
364 * fail. If a sync is performed without an account, the
365 */
366 public Builder setSyncAdapter(Account account, String authority) {
367 if (mSyncTarget != SYNC_TARGET_UNKNOWN) {
368 throw new IllegalArgumentException("Sync target has already been defined.");
369 }
Matthew Williams632515b2013-10-10 15:51:00 -0700370 if (authority != null && authority.length() == 0) {
371 throw new IllegalArgumentException("Authority must be non-empty");
372 }
Matthew Williamsfa774182013-06-18 15:44:11 -0700373 mSyncTarget = SYNC_TARGET_ADAPTER;
374 mAccount = account;
375 mAuthority = authority;
Matthew Williamsfa774182013-06-18 15:44:11 -0700376 return this;
377 }
378
379 /**
380 * Developer-provided extras handed back when sync actually occurs. This bundle is copied
Matthew Williamsc81891c2013-07-24 19:09:30 -0700381 * into the SyncRequest returned by {@link #build()}.
Matthew Williamsfa774182013-06-18 15:44:11 -0700382 *
383 * Example:
384 * <pre>
385 * String[] syncItems = {"dog", "cat", "frog", "child"};
386 * SyncRequest.Builder builder =
387 * new SyncRequest.Builder()
388 * .setSyncAdapter(dummyAccount, dummyProvider)
Russ Schnappc43a6bb2014-05-07 12:56:13 -0700389 * .syncOnce();
Matthew Williamsfa774182013-06-18 15:44:11 -0700390 *
391 * for (String syncData : syncItems) {
392 * Bundle extras = new Bundle();
393 * extras.setString("data", syncData);
394 * builder.setExtras(extras);
395 * ContentResolver.sync(builder.build()); // Each sync() request creates a unique sync.
396 * }
397 * </pre>
Matthew Williamsfa774182013-06-18 15:44:11 -0700398 * Only values of the following types may be used in the extras bundle:
399 * <ul>
400 * <li>Integer</li>
401 * <li>Long</li>
402 * <li>Boolean</li>
403 * <li>Float</li>
404 * <li>Double</li>
405 * <li>String</li>
406 * <li>Account</li>
407 * <li>null</li>
408 * </ul>
409 * If any data is present in the bundle not of this type, build() will
410 * throw a runtime exception.
411 *
Matthew Williamsc81891c2013-07-24 19:09:30 -0700412 * @param bundle extras bundle to set.
Matthew Williamsfa774182013-06-18 15:44:11 -0700413 */
414 public Builder setExtras(Bundle bundle) {
415 mCustomExtras = bundle;
416 return this;
417 }
418
419 /**
Matthew Williamsc81891c2013-07-24 19:09:30 -0700420 * Convenience function for setting {@link ContentResolver#SYNC_EXTRAS_DO_NOT_RETRY}.
Matthew Williamsfa774182013-06-18 15:44:11 -0700421 *
Matthew Williamsc81891c2013-07-24 19:09:30 -0700422 * A one-off sync operation that fails will be retried with exponential back-off unless
423 * this is set to false. Not valid for periodic sync and will throw an
424 * <code>IllegalArgumentException</code> in build().
425 *
426 * @param noRetry true to not retry a failed sync. Default false.
Matthew Williamsfa774182013-06-18 15:44:11 -0700427 */
Matthew Williamsc81891c2013-07-24 19:09:30 -0700428 public Builder setNoRetry(boolean noRetry) {
429 mNoRetry = noRetry;
Matthew Williamsfa774182013-06-18 15:44:11 -0700430 return this;
431 }
432
433 /**
Matthew Williamsc81891c2013-07-24 19:09:30 -0700434 * Convenience function for setting {@link ContentResolver#SYNC_EXTRAS_IGNORE_SETTINGS}.
435 *
436 * Not valid for periodic sync and will throw an <code>IllegalArgumentException</code> in
437 * {@link #build()}.
Matthew Williams56dbf8f2013-07-26 12:56:39 -0700438 * <p>Throws <code>IllegalArgumentException</code> if called and
439 * {@link #setDisallowMetered(boolean)} has been set.
440 *
Matthew Williamsc81891c2013-07-24 19:09:30 -0700441 *
442 * @param ignoreSettings true to ignore the sync automatically settings. Default false.
Matthew Williamsfa774182013-06-18 15:44:11 -0700443 */
444 public Builder setIgnoreSettings(boolean ignoreSettings) {
Matthew Williams56dbf8f2013-07-26 12:56:39 -0700445 if (mDisallowMetered && ignoreSettings) {
446 throw new IllegalArgumentException("setIgnoreSettings(true) after having specified"
447 + " sync settings with this builder.");
448 }
Matthew Williamsfa774182013-06-18 15:44:11 -0700449 mIgnoreSettings = ignoreSettings;
450 return this;
451 }
452
453 /**
Ying Wang8cf4e132013-07-24 20:47:19 -0700454 * Convenience function for setting {@link ContentResolver#SYNC_EXTRAS_IGNORE_BACKOFF}.
Matthew Williamsfa774182013-06-18 15:44:11 -0700455 *
Matthew Williamsc81891c2013-07-24 19:09:30 -0700456 * Ignoring back-off will force the sync scheduling process to ignore any back-off that was
457 * the result of a failed sync, as well as to invalidate any {@link SyncResult#delayUntil}
458 * value that may have been set by the adapter. Successive failures will not honor this
459 * flag. Not valid for periodic sync and will throw an <code>IllegalArgumentException</code>
460 * in {@link #build()}.
461 *
462 * @param ignoreBackoff ignore back off settings. Default false.
Matthew Williamsfa774182013-06-18 15:44:11 -0700463 */
464 public Builder setIgnoreBackoff(boolean ignoreBackoff) {
465 mIgnoreBackoff = ignoreBackoff;
466 return this;
467 }
468
469 /**
Matthew Williamsc81891c2013-07-24 19:09:30 -0700470 * Convenience function for setting {@link ContentResolver#SYNC_EXTRAS_MANUAL}.
471 *
472 * Not valid for periodic sync and will throw an <code>IllegalArgumentException</code> in
473 * {@link #build()}.
474 *
475 * @param isManual User-initiated sync or not. Default false.
Matthew Williamsfa774182013-06-18 15:44:11 -0700476 */
477 public Builder setManual(boolean isManual) {
478 mIsManual = isManual;
479 return this;
480 }
481
482 /**
Matthew Williamsc81891c2013-07-24 19:09:30 -0700483 * An expedited sync runs immediately and can preempt other non-expedited running syncs.
484 *
485 * Not valid for periodic sync and will throw an <code>IllegalArgumentException</code> in
486 * {@link #build()}.
487 *
488 * @param expedited whether to run expedited. Default false.
Matthew Williamsfa774182013-06-18 15:44:11 -0700489 */
490 public Builder setExpedited(boolean expedited) {
491 mExpedited = expedited;
492 return this;
493 }
494
495 /**
Matthew Williamsfa774182013-06-18 15:44:11 -0700496 * Performs validation over the request and throws the runtime exception
Matthew Williamsc81891c2013-07-24 19:09:30 -0700497 * <code>IllegalArgumentException</code> if this validation fails.
Matthew Williamsfa774182013-06-18 15:44:11 -0700498 *
499 * @return a SyncRequest with the information contained within this
500 * builder.
501 */
502 public SyncRequest build() {
503 // Validate the extras bundle
Matthew Williams68e39c32013-07-25 16:40:23 -0700504 ContentResolver.validateSyncExtrasBundle(mCustomExtras);
Matthew Williamsfa774182013-06-18 15:44:11 -0700505 if (mCustomExtras == null) {
506 mCustomExtras = new Bundle();
507 }
Matthew Williams68e39c32013-07-25 16:40:23 -0700508 // Combine builder extra flags into the config bundle.
509 mSyncConfigExtras = new Bundle();
Matthew Williamsfa774182013-06-18 15:44:11 -0700510 if (mIgnoreBackoff) {
Matthew Williams68e39c32013-07-25 16:40:23 -0700511 mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_BACKOFF, true);
Matthew Williamsfa774182013-06-18 15:44:11 -0700512 }
Matthew Williams56dbf8f2013-07-26 12:56:39 -0700513 if (mDisallowMetered) {
514 mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_DISALLOW_METERED, true);
Matthew Williamsfa774182013-06-18 15:44:11 -0700515 }
Shreyas Basarge8c834c02016-01-07 13:53:16 +0000516 if (mRequiresCharging) {
517 mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_REQUIRE_CHARGING, true);
518 }
Matthew Williamsfa774182013-06-18 15:44:11 -0700519 if (mIgnoreSettings) {
Matthew Williams68e39c32013-07-25 16:40:23 -0700520 mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, true);
Matthew Williamsfa774182013-06-18 15:44:11 -0700521 }
522 if (mNoRetry) {
Matthew Williams68e39c32013-07-25 16:40:23 -0700523 mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, true);
Matthew Williamsfa774182013-06-18 15:44:11 -0700524 }
525 if (mExpedited) {
Matthew Williams68e39c32013-07-25 16:40:23 -0700526 mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
Matthew Williamsfa774182013-06-18 15:44:11 -0700527 }
528 if (mIsManual) {
Matthew Williams56dbf8f2013-07-26 12:56:39 -0700529 mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_BACKOFF, true);
530 mSyncConfigExtras.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, true);
Matthew Williamsfa774182013-06-18 15:44:11 -0700531 }
Matthew Williamsfa774182013-06-18 15:44:11 -0700532 if (mSyncType == SYNC_TYPE_PERIODIC) {
Matthew Williams68e39c32013-07-25 16:40:23 -0700533 // If this is a periodic sync ensure than invalid extras were not set.
Matthew Williams64939ae2014-06-04 09:25:11 -0700534 if (ContentResolver.invalidPeriodicExtras(mCustomExtras) ||
Matthew Williams56dbf8f2013-07-26 12:56:39 -0700535 ContentResolver.invalidPeriodicExtras(mSyncConfigExtras)) {
536 throw new IllegalArgumentException("Illegal extras were set");
537 }
Matthew Williams56dbf8f2013-07-26 12:56:39 -0700538 }
Matthew Williamsfa774182013-06-18 15:44:11 -0700539 // Ensure that a target for the sync has been set.
540 if (mSyncTarget == SYNC_TARGET_UNKNOWN) {
Matthew Williams64939ae2014-06-04 09:25:11 -0700541 throw new IllegalArgumentException("Must specify an adapter with" +
542 " setSyncAdapter(Account, String");
Matthew Williamsfa774182013-06-18 15:44:11 -0700543 }
544 return new SyncRequest(this);
545 }
Matthew Williams64939ae2014-06-04 09:25:11 -0700546 }
Matthew Williamsfa774182013-06-18 15:44:11 -0700547}