Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 018579c4 authored by Fred Quintana's avatar Fred Quintana Committed by Android Git Automerger
Browse files

am b2dbae87: am 6ce78924: Merge "Add JavaDoc for SyncResult http://b/2420252" into froyo

Merge commit 'b2dbae87' into kraken

* commit 'b2dbae87':
  Add JavaDoc for SyncResult
parents c65ede9b b2dbae87
Loading
Loading
Loading
Loading
+117 −2
Original line number Original line Diff line number Diff line
@@ -20,30 +20,110 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable;


/**
/**
 * This class is used to store information about the result of a sync
 * This class is used to communicate the results of a sync operation to the SyncManager.
 * Based on the values here the SyncManager will determine the disposition of the
 * sync and whether or not a new sync operation needs to be scheduled in the future.
 *
 */
 */
public final class SyncResult implements Parcelable {
public final class SyncResult implements Parcelable {
    /**
     * Used to indicate that the SyncAdapter is already performing a sync operation, though
     * not necessarily for the requested account and authority and that it wasn't able to
     * process this request. The SyncManager will reschedule the request to run later.
     */
    public final boolean syncAlreadyInProgress;
    public final boolean syncAlreadyInProgress;

    /**
     * Used to indicate that the SyncAdapter determined that it would need to issue
     * too many delete operations to the server in order to satisfy the request
     * (as defined by the SyncAdapter). The SyncManager will record
     * that the sync request failed and will cause a System Notification to be created
     * asking the user what they want to do about this. It will give the user a chance to
     * choose between (1) go ahead even with those deletes, (2) revert the deletes,
     * or (3) take no action. If the user decides (1) or (2) the SyncManager will issue another
     * sync request with either {@link ContentResolver#SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS}
     * or {@link ContentResolver#SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS} set in the extras.
     * It is then up to the SyncAdapter to decide how to honor that request.
     */
    public boolean tooManyDeletions;
    public boolean tooManyDeletions;

    /**
     * Used to indicate that the SyncAdapter experienced a hard error due to trying the same
     * operation too many times (as defined by the SyncAdapter). The SyncManager will record
     * that the sync request failed and it will not reschedule the request.
     */
    public boolean tooManyRetries;
    public boolean tooManyRetries;

    /**
     * Used to indicate that the SyncAdapter experienced a hard error due to an error it
     * received from interacting with the storage later. The SyncManager will record that
     * the sync request failed and it will not reschedule the request.
     */
    public boolean databaseError;
    public boolean databaseError;

    /**
     * If set the SyncManager will request an immediate sync with the same Account and authority
     * (but empty extras Bundle) as was used in the sync request.
     */
    public boolean fullSyncRequested;
    public boolean fullSyncRequested;

    /**
     * This field is ignored by the SyncManager.
     */
    public boolean partialSyncUnavailable;
    public boolean partialSyncUnavailable;

    /**
     * This field is ignored by the SyncManager.
     */
    public boolean moreRecordsToGet;
    public boolean moreRecordsToGet;


    // in seconds since epoch
    /**
     * Used to indicate to the SyncManager that future sync requests that match the request's
     * Account and authority should be delayed at least this many seconds.
     */
    public long delayUntil;
    public long delayUntil;

    /**
     * Used to hold extras statistics about the sync operation. Some of these indicate that
     * the sync request resulted in a hard or soft error, others are for purely informational
     * purposes.
     */
    public final SyncStats stats;
    public final SyncStats stats;

    /**
     * This instance of a SyncResult is returned by the SyncAdapter in response to a
     * sync request when a sync is already underway. The SyncManager will reschedule the
     * sync request to try again later.
     */
    public static final SyncResult ALREADY_IN_PROGRESS;
    public static final SyncResult ALREADY_IN_PROGRESS;


    static {
    static {
        ALREADY_IN_PROGRESS = new SyncResult(true);
        ALREADY_IN_PROGRESS = new SyncResult(true);
    }
    }


    /**
     * Create a "clean" SyncResult. If this is returned without any changes then the
     * SyncManager will consider the sync to have completed successfully. The various fields
     * can be set by the SyncAdapter in order to give the SyncManager more information as to
     * the disposition of the sync.
     * <p>
     * The errors are classified into two broad categories: hard errors and soft errors.
     * Soft errors are retried with exponential backoff. Hard errors are not retried (except
     * when the hard error is for a {@link ContentResolver#SYNC_EXTRAS_UPLOAD} request,
     * in which the request is retryed without the {@link ContentResolver#SYNC_EXTRAS_UPLOAD}
     * extra set). The SyncManager checks the type of error by calling
     * {@link SyncResult#hasHardError()} and  {@link SyncResult#hasSoftError()}. If both are
     * true then the SyncManager treats it as a hard error, not a soft error.
     */
    public SyncResult() {
    public SyncResult() {
        this(false);
        this(false);
    }
    }


    /**
     * Internal helper for creating a clean SyncResult or one that indicated that
     * a sync is already in progress.
     * @param syncAlreadyInProgress if true then set the {@link #syncAlreadyInProgress} flag
     */
    private SyncResult(boolean syncAlreadyInProgress) {
    private SyncResult(boolean syncAlreadyInProgress) {
        this.syncAlreadyInProgress = syncAlreadyInProgress;
        this.syncAlreadyInProgress = syncAlreadyInProgress;
        this.tooManyDeletions = false;
        this.tooManyDeletions = false;
@@ -67,6 +147,21 @@ public final class SyncResult implements Parcelable {
        stats = new SyncStats(parcel);
        stats = new SyncStats(parcel);
    }
    }


    /**
     * Convenience method for determining if the SyncResult indicates that a hard error
     * occurred. See {@link #SyncResult()} for an explanation of what the SyncManager does
     * when it sees a hard error.
     * <p>
     * A hard error is indicated when any of the following is true:
     * <ul>
     * <li> {@link SyncStats#numParseExceptions} > 0
     * <li> {@link SyncStats#numConflictDetectedExceptions} > 0
     * <li> {@link SyncStats#numAuthExceptions} > 0
     * <li> {@link #tooManyDeletions}
     * <li> {@link #tooManyRetries}
     * <li> {@link #databaseError}
     * @return true if a hard error is indicated
     */
    public boolean hasHardError() {
    public boolean hasHardError() {
        return stats.numParseExceptions > 0
        return stats.numParseExceptions > 0
                || stats.numConflictDetectedExceptions > 0
                || stats.numConflictDetectedExceptions > 0
@@ -76,10 +171,26 @@ public final class SyncResult implements Parcelable {
                || databaseError;
                || databaseError;
    }
    }


    /**
     * Convenience method for determining if the SyncResult indicates that a soft error
     * occurred. See {@link #SyncResult()} for an explanation of what the SyncManager does
     * when it sees a soft error.
     * <p>
     * A soft error is indicated when any of the following is true:
     * <ul>
     * <li> {@link SyncStats#numIoExceptions} > 0
     * <li> {@link #syncAlreadyInProgress}
     * </ul>
     * @return true if a hard error is indicated
     */
    public boolean hasSoftError() {
    public boolean hasSoftError() {
        return syncAlreadyInProgress || stats.numIoExceptions > 0;
        return syncAlreadyInProgress || stats.numIoExceptions > 0;
    }
    }


    /**
     * A convenience method for determining of the SyncResult indicates that an error occurred.
     * @return true if either a soft or hard error occurred
     */
    public boolean hasError() {
    public boolean hasError() {
        return hasSoftError() || hasHardError();
        return hasSoftError() || hasHardError();
    }
    }
@@ -90,6 +201,10 @@ public final class SyncResult implements Parcelable {
                || stats.numUpdates > 0;
                || stats.numUpdates > 0;
    }
    }


    /**
     * Clears the SyncResult to a clean state. Throws an {@link UnsupportedOperationException}
     * if this is called when {@link #syncAlreadyInProgress} is set.
     */
    public void clear() {
    public void clear() {
        if (syncAlreadyInProgress) {
        if (syncAlreadyInProgress) {
            throw new UnsupportedOperationException(
            throw new UnsupportedOperationException(
+64 −1
Original line number Original line Diff line number Diff line
@@ -20,17 +20,77 @@ import android.os.Parcelable;
import android.os.Parcel;
import android.os.Parcel;


/**
/**
 * @hide
 * Used to record various statistics about the result of a sync operation. The SyncManager
 * gets access to these via a {@link SyncResult} and uses some of them to determine the
 * disposition of the sync. See {@link SyncResult} for further dicussion on how the
 * SyncManager uses these values.
 */
 */
public class SyncStats implements Parcelable {
public class SyncStats implements Parcelable {
    /**
     * The SyncAdapter was unable to authenticate the {@link android.accounts.Account}
     * that was specified in the request. The user needs to take some action to resolve
     * before a future request can expect to succeed. This is considered a hard error.
     */
    public long numAuthExceptions;
    public long numAuthExceptions;

    /**
     * The SyncAdapter had a problem, most likely with the network connectivity or a timeout
     * while waiting for a network response. The request may succeed if it is tried again
     * later. This is considered a soft error.
     */
    public long numIoExceptions;
    public long numIoExceptions;

    /**
     * The SyncAdapter had a problem with the data it received from the server or the storage
     * later. This problem will likely repeat if the request is tried again. The problem
     * will need to be cleared up by either the server or the storage layer (likely with help
     * from the user). If the SyncAdapter cleans up the data itself then it typically won't
     * increment this value although it may still do so in order to record that it had to
     * perform some cleanup. E.g., if the SyncAdapter received a bad entry from the server
     * when processing a feed of entries, it may choose to drop the entry and thus make
     * progress and still increment this value just so the SyncAdapter can record that an
     * error occurred. This is considered a hard error.
     */
    public long numParseExceptions;
    public long numParseExceptions;

    /**
     * The SyncAdapter detected that there was an unrecoverable version conflict when it
     * attempted to update or delete a version of a resource on the server. This is expected
     * to clear itself automatically once the new state is retrieved from the server,
     * though it may remain until the user intervenes manually, perhaps by clearing the
     * local storage and starting over frmo scratch. This is considered a hard error.
     */
    public long numConflictDetectedExceptions;
    public long numConflictDetectedExceptions;

    /**
     * Counter for tracking how many inserts were performed by the sync operation, as defined
     * by the SyncAdapter.
     */
    public long numInserts;
    public long numInserts;

    /**
     * Counter for tracking how many updates were performed by the sync operation, as defined
     * by the SyncAdapter.
     */
    public long numUpdates;
    public long numUpdates;

    /**
     * Counter for tracking how many deletes were performed by the sync operation, as defined
     * by the SyncAdapter.
     */
    public long numDeletes;
    public long numDeletes;

    /**
     * Counter for tracking how many entries were affected by the sync operation, as defined
     * by the SyncAdapter.
     */
    public long numEntries;
    public long numEntries;

    /**
     * Counter for tracking how many entries, either from the server or the local store, were
     * ignored during the sync operation. This could happen if the SyncAdapter detected some
     * unparsable data but decided to skip it and move on rather than failing immediately.
     */
    public long numSkippedEntries;
    public long numSkippedEntries;


    public SyncStats() {
    public SyncStats() {
@@ -75,6 +135,9 @@ public class SyncStats implements Parcelable {
        return sb.toString();
        return sb.toString();
    }
    }


    /**
     * Reset all the counters to 0.
     */
    public void clear() {
    public void clear() {
        numAuthExceptions = 0;
        numAuthExceptions = 0;
        numIoExceptions = 0;
        numIoExceptions = 0;