115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/* 215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2008 The Android Open Source Project 315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License. 615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at 715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * http://www.apache.org/licenses/LICENSE-2.0 915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software 1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS, 1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and 1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License. 1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */ 1615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.content; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 2320c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * This class is used to communicate the results of a sync operation to the SyncManager. 2420c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * Based on the values here the SyncManager will determine the disposition of the 2520c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * sync and whether or not a new sync operation needs to be scheduled in the future. 2620c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class SyncResult implements Parcelable { 2920c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana /** 3020c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * Used to indicate that the SyncAdapter is already performing a sync operation, though 3120c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * not necessarily for the requested account and authority and that it wasn't able to 3220c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * process this request. The SyncManager will reschedule the request to run later. 3320c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana */ 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean syncAlreadyInProgress; 3520c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana 3620c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana /** 3720c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * Used to indicate that the SyncAdapter determined that it would need to issue 3820c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * too many delete operations to the server in order to satisfy the request 3920c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * (as defined by the SyncAdapter). The SyncManager will record 4020c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * that the sync request failed and will cause a System Notification to be created 4120c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * asking the user what they want to do about this. It will give the user a chance to 4220c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * choose between (1) go ahead even with those deletes, (2) revert the deletes, 4320c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * or (3) take no action. If the user decides (1) or (2) the SyncManager will issue another 4420c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * sync request with either {@link ContentResolver#SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS} 4520c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * or {@link ContentResolver#SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS} set in the extras. 4620c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * It is then up to the SyncAdapter to decide how to honor that request. 4720c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana */ 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean tooManyDeletions; 4920c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana 5020c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana /** 5120c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * Used to indicate that the SyncAdapter experienced a hard error due to trying the same 5220c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * operation too many times (as defined by the SyncAdapter). The SyncManager will record 5320c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * that the sync request failed and it will not reschedule the request. 5420c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana */ 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean tooManyRetries; 5620c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana 5720c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana /** 5820c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * Used to indicate that the SyncAdapter experienced a hard error due to an error it 5920c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * received from interacting with the storage later. The SyncManager will record that 6020c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * the sync request failed and it will not reschedule the request. 6120c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana */ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean databaseError; 6320c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana 6420c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana /** 6520c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * If set the SyncManager will request an immediate sync with the same Account and authority 6620c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * (but empty extras Bundle) as was used in the sync request. 6720c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana */ 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean fullSyncRequested; 6920c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana 7020c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana /** 7120c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * This field is ignored by the SyncManager. 7220c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana */ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean partialSyncUnavailable; 7420c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana 7520c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana /** 7620c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * This field is ignored by the SyncManager. 7720c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana */ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean moreRecordsToGet; 79307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana 8020c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana /** 8120c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * Used to indicate to the SyncManager that future sync requests that match the request's 8220c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * Account and authority should be delayed at least this many seconds. 8320c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana */ 84307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana public long delayUntil; 8520c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana 8620c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana /** 8720c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * Used to hold extras statistics about the sync operation. Some of these indicate that 8820c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * the sync request resulted in a hard or soft error, others are for purely informational 8920c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * purposes. 9020c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana */ 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final SyncStats stats; 9220c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana 9320c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana /** 9420c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * This instance of a SyncResult is returned by the SyncAdapter in response to a 9520c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * sync request when a sync is already underway. The SyncManager will reschedule the 9620c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * sync request to try again later. 9720c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana */ 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final SyncResult ALREADY_IN_PROGRESS; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ALREADY_IN_PROGRESS = new SyncResult(true); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10420c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana /** 10520c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * Create a "clean" SyncResult. If this is returned without any changes then the 10620c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * SyncManager will consider the sync to have completed successfully. The various fields 10720c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * can be set by the SyncAdapter in order to give the SyncManager more information as to 10820c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * the disposition of the sync. 10920c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * <p> 11020c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * The errors are classified into two broad categories: hard errors and soft errors. 11120c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * Soft errors are retried with exponential backoff. Hard errors are not retried (except 11220c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * when the hard error is for a {@link ContentResolver#SYNC_EXTRAS_UPLOAD} request, 11320c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * in which the request is retryed without the {@link ContentResolver#SYNC_EXTRAS_UPLOAD} 11420c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * extra set). The SyncManager checks the type of error by calling 11520c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * {@link SyncResult#hasHardError()} and {@link SyncResult#hasSoftError()}. If both are 11620c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * true then the SyncManager treats it as a hard error, not a soft error. 11720c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana */ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SyncResult() { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(false); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12220c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana /** 12320c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * Internal helper for creating a clean SyncResult or one that indicated that 12420c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * a sync is already in progress. 12520c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * @param syncAlreadyInProgress if true then set the {@link #syncAlreadyInProgress} flag 12620c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana */ 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SyncResult(boolean syncAlreadyInProgress) { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.syncAlreadyInProgress = syncAlreadyInProgress; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.tooManyDeletions = false; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.tooManyRetries = false; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.fullSyncRequested = false; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.partialSyncUnavailable = false; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.moreRecordsToGet = false; 134307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana this.delayUntil = 0; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.stats = new SyncStats(); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SyncResult(Parcel parcel) { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project syncAlreadyInProgress = parcel.readInt() != 0; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tooManyDeletions = parcel.readInt() != 0; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tooManyRetries = parcel.readInt() != 0; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project databaseError = parcel.readInt() != 0; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fullSyncRequested = parcel.readInt() != 0; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project partialSyncUnavailable = parcel.readInt() != 0; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moreRecordsToGet = parcel.readInt() != 0; 146307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana delayUntil = parcel.readLong(); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stats = new SyncStats(parcel); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15020c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana /** 15120c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * Convenience method for determining if the SyncResult indicates that a hard error 15220c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * occurred. See {@link #SyncResult()} for an explanation of what the SyncManager does 15320c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * when it sees a hard error. 15420c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * <p> 15520c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * A hard error is indicated when any of the following is true: 15620c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * <ul> 15720c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * <li> {@link SyncStats#numParseExceptions} > 0 15820c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * <li> {@link SyncStats#numConflictDetectedExceptions} > 0 15920c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * <li> {@link SyncStats#numAuthExceptions} > 0 16020c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * <li> {@link #tooManyDeletions} 16120c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * <li> {@link #tooManyRetries} 16220c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * <li> {@link #databaseError} 16320c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * @return true if a hard error is indicated 16420c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana */ 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasHardError() { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return stats.numParseExceptions > 0 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || stats.numConflictDetectedExceptions > 0 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || stats.numAuthExceptions > 0 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || tooManyDeletions 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || tooManyRetries 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || databaseError; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17420c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana /** 17520c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * Convenience method for determining if the SyncResult indicates that a soft error 17620c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * occurred. See {@link #SyncResult()} for an explanation of what the SyncManager does 17720c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * when it sees a soft error. 17820c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * <p> 17920c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * A soft error is indicated when any of the following is true: 18020c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * <ul> 18120c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * <li> {@link SyncStats#numIoExceptions} > 0 18220c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * <li> {@link #syncAlreadyInProgress} 18320c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * </ul> 18420c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * @return true if a hard error is indicated 18520c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana */ 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasSoftError() { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return syncAlreadyInProgress || stats.numIoExceptions > 0; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19020c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana /** 19120c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * A convenience method for determining of the SyncResult indicates that an error occurred. 19220c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * @return true if either a soft or hard error occurred 19320c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana */ 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasError() { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hasSoftError() || hasHardError(); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean madeSomeProgress() { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((stats.numDeletes > 0) && !tooManyDeletions) 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || stats.numInserts > 0 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || stats.numUpdates > 0; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20420c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana /** 20520c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * Clears the SyncResult to a clean state. Throws an {@link UnsupportedOperationException} 20620c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana * if this is called when {@link #syncAlreadyInProgress} is set. 20720c640e0f4c11f56cb02abaac0a25fe84ebfa487Fred Quintana */ 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clear() { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (syncAlreadyInProgress) { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException( 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "you are not allowed to clear the ALREADY_IN_PROGRESS SyncStats"); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tooManyDeletions = false; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tooManyRetries = false; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project databaseError = false; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fullSyncRequested = false; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project partialSyncUnavailable = false; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project moreRecordsToGet = false; 219307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana delayUntil = 0; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stats.clear(); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Creator<SyncResult> CREATOR = new Creator<SyncResult>() { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SyncResult createFromParcel(Parcel in) { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SyncResult(in); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SyncResult[] newArray(int size) { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SyncResult[size]; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel parcel, int flags) { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeInt(syncAlreadyInProgress ? 1 : 0); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeInt(tooManyDeletions ? 1 : 0); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeInt(tooManyRetries ? 1 : 0); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeInt(databaseError ? 1 : 0); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeInt(fullSyncRequested ? 1 : 0); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeInt(partialSyncUnavailable ? 1 : 0); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeInt(moreRecordsToGet ? 1 : 0); 245307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana parcel.writeLong(delayUntil); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stats.writeToParcel(parcel, flags); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(); 25277709755b74bcc852cd511ff833c2827c0f0e1aaFred Quintana sb.append("SyncResult:"); 25377709755b74bcc852cd511ff833c2827c0f0e1aaFred Quintana if (syncAlreadyInProgress) { 25477709755b74bcc852cd511ff833c2827c0f0e1aaFred Quintana sb.append(" syncAlreadyInProgress: ").append(syncAlreadyInProgress); 25577709755b74bcc852cd511ff833c2827c0f0e1aaFred Quintana } 25677709755b74bcc852cd511ff833c2827c0f0e1aaFred Quintana if (tooManyDeletions) sb.append(" tooManyDeletions: ").append(tooManyDeletions); 25777709755b74bcc852cd511ff833c2827c0f0e1aaFred Quintana if (tooManyRetries) sb.append(" tooManyRetries: ").append(tooManyRetries); 25877709755b74bcc852cd511ff833c2827c0f0e1aaFred Quintana if (databaseError) sb.append(" databaseError: ").append(databaseError); 25977709755b74bcc852cd511ff833c2827c0f0e1aaFred Quintana if (fullSyncRequested) sb.append(" fullSyncRequested: ").append(fullSyncRequested); 26077709755b74bcc852cd511ff833c2827c0f0e1aaFred Quintana if (partialSyncUnavailable) { 26177709755b74bcc852cd511ff833c2827c0f0e1aaFred Quintana sb.append(" partialSyncUnavailable: ").append(partialSyncUnavailable); 26277709755b74bcc852cd511ff833c2827c0f0e1aaFred Quintana } 26377709755b74bcc852cd511ff833c2827c0f0e1aaFred Quintana if (moreRecordsToGet) sb.append(" moreRecordsToGet: ").append(moreRecordsToGet); 264307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana if (delayUntil > 0) sb.append(" delayUntil: ").append(delayUntil); 26577709755b74bcc852cd511ff833c2827c0f0e1aaFred Quintana sb.append(stats); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Generates a debugging string indicating the status. 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The string consist of a sequence of code letter followed by the count. 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Code letters are f - fullSyncRequested, r - partialSyncUnavailable, 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * X - hardError, e - numParseExceptions, c - numConflictDetectedExceptions, 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a - numAuthExceptions, D - tooManyDeletions, R - tooManyRetries, 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * b - databaseError, x - softError, l - syncAlreadyInProgress, 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * I - numIoExceptions 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return debugging string. 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toDebugString() { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuffer sb = new StringBuffer(); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fullSyncRequested) { 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("f1"); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (partialSyncUnavailable) { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("r1"); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasHardError()) { 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("X1"); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (stats.numParseExceptions > 0) { 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("e").append(stats.numParseExceptions); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (stats.numConflictDetectedExceptions > 0) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("c").append(stats.numConflictDetectedExceptions); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (stats.numAuthExceptions > 0) { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("a").append(stats.numAuthExceptions); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tooManyDeletions) { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("D1"); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tooManyRetries) { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("R1"); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (databaseError) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("b1"); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasSoftError()) { 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("x1"); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (syncAlreadyInProgress) { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("l1"); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (stats.numIoExceptions > 0) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("I").append(stats.numIoExceptions); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 321