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