diff --git a/core/java/android/content/SyncResult.java b/core/java/android/content/SyncResult.java
index 18abebe..8b0afbd 100644
--- a/core/java/android/content/SyncResult.java
+++ b/core/java/android/content/SyncResult.java
@@ -20,30 +20,110 @@
 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 {
+    /**
+     * 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;
+
+    /**
+     * 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;
+
+    /**
+     * 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;
+
+    /**
+     * 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;
+
+    /**
+     * 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;
+
+    /**
+     * This field is ignored by the SyncManager.
+     */
     public boolean partialSyncUnavailable;
+
+    /**
+     * This field is ignored by the SyncManager.
+     */
     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;
+
+    /**
+     * 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;
+
+    /**
+     * 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;
 
     static {
         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() {
         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) {
         this.syncAlreadyInProgress = syncAlreadyInProgress;
         this.tooManyDeletions = false;
@@ -67,6 +147,21 @@
         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() {
         return stats.numParseExceptions > 0
                 || stats.numConflictDetectedExceptions > 0
@@ -76,10 +171,26 @@
                 || 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() {
         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() {
         return hasSoftError() || hasHardError();
     }
@@ -90,6 +201,10 @@
                 || 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() {
         if (syncAlreadyInProgress) {
             throw new UnsupportedOperationException(
diff --git a/core/java/android/content/SyncStats.java b/core/java/android/content/SyncStats.java
index cc544c0..b7f2a85 100644
--- a/core/java/android/content/SyncStats.java
+++ b/core/java/android/content/SyncStats.java
@@ -20,17 +20,77 @@
 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 {
+    /**
+     * 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;
+
+    /**
+     * 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;
+
+    /**
+     * 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;
+
+    /**
+     * 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;
+
+    /**
+     * Counter for tracking how many inserts were performed by the sync operation, as defined
+     * by the SyncAdapter.
+     */
     public long numInserts;
+
+    /**
+     * Counter for tracking how many updates were performed by the sync operation, as defined
+     * by the SyncAdapter.
+     */
     public long numUpdates;
+
+    /**
+     * Counter for tracking how many deletes were performed by the sync operation, as defined
+     * by the SyncAdapter.
+     */
     public long numDeletes;
+
+    /**
+     * Counter for tracking how many entries were affected by the sync operation, as defined
+     * by the SyncAdapter.
+     */
     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 SyncStats() {
@@ -75,6 +135,9 @@
         return sb.toString();
     }
 
+    /**
+     * Reset all the counters to 0.
+     */
     public void clear() {
         numAuthExceptions = 0;
         numIoExceptions = 0;
