package android.content; import android.os.Parcel; import android.os.Parcelable; /** * This class is used to store information about the result of a sync * * @hide */ public final class SyncResult implements Parcelable { public final boolean syncAlreadyInProgress; public boolean tooManyDeletions; public boolean tooManyRetries; public boolean databaseError; public boolean fullSyncRequested; public boolean partialSyncUnavailable; public boolean moreRecordsToGet; public final SyncStats stats; public static final SyncResult ALREADY_IN_PROGRESS; static { ALREADY_IN_PROGRESS = new SyncResult(true); } public SyncResult() { this(false); } private SyncResult(boolean syncAlreadyInProgress) { this.syncAlreadyInProgress = syncAlreadyInProgress; this.tooManyDeletions = false; this.tooManyRetries = false; this.fullSyncRequested = false; this.partialSyncUnavailable = false; this.moreRecordsToGet = false; this.stats = new SyncStats(); } private SyncResult(Parcel parcel) { syncAlreadyInProgress = parcel.readInt() != 0; tooManyDeletions = parcel.readInt() != 0; tooManyRetries = parcel.readInt() != 0; databaseError = parcel.readInt() != 0; fullSyncRequested = parcel.readInt() != 0; partialSyncUnavailable = parcel.readInt() != 0; moreRecordsToGet = parcel.readInt() != 0; stats = new SyncStats(parcel); } public boolean hasHardError() { return stats.numParseExceptions > 0 || stats.numConflictDetectedExceptions > 0 || stats.numAuthExceptions > 0 || tooManyDeletions || tooManyRetries || databaseError; } public boolean hasSoftError() { return syncAlreadyInProgress || stats.numIoExceptions > 0; } public boolean hasError() { return hasSoftError() || hasHardError(); } public boolean madeSomeProgress() { return ((stats.numDeletes > 0) && !tooManyDeletions) || stats.numInserts > 0 || stats.numUpdates > 0; } public void clear() { if (syncAlreadyInProgress) { throw new UnsupportedOperationException( "you are not allowed to clear the ALREADY_IN_PROGRESS SyncStats"); } tooManyDeletions = false; tooManyRetries = false; databaseError = false; fullSyncRequested = false; partialSyncUnavailable = false; moreRecordsToGet = false; stats.clear(); } public static final Creator<SyncResult> CREATOR = new Creator<SyncResult>() { public SyncResult createFromParcel(Parcel in) { return new SyncResult(in); } public SyncResult[] newArray(int size) { return new SyncResult[size]; } }; public int describeContents() { return 0; } public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(syncAlreadyInProgress ? 1 : 0); parcel.writeInt(tooManyDeletions ? 1 : 0); parcel.writeInt(tooManyRetries ? 1 : 0); parcel.writeInt(databaseError ? 1 : 0); parcel.writeInt(fullSyncRequested ? 1 : 0); parcel.writeInt(partialSyncUnavailable ? 1 : 0); parcel.writeInt(moreRecordsToGet ? 1 : 0); stats.writeToParcel(parcel, flags); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(" syncAlreadyInProgress: ").append(syncAlreadyInProgress); sb.append(" tooManyDeletions: ").append(tooManyDeletions); sb.append(" tooManyRetries: ").append(tooManyRetries); sb.append(" databaseError: ").append(databaseError); sb.append(" fullSyncRequested: ").append(fullSyncRequested); sb.append(" partialSyncUnavailable: ").append(partialSyncUnavailable); sb.append(" moreRecordsToGet: ").append(moreRecordsToGet); sb.append(" stats: ").append(stats); return sb.toString(); } /** * Generates a debugging string indicating the status. * The string consist of a sequence of code letter followed by the count. * Code letters are f - fullSyncRequested, r - partialSyncUnavailable, * X - hardError, e - numParseExceptions, c - numConflictDetectedExceptions, * a - numAuthExceptions, D - tooManyDeletions, R - tooManyRetries, * b - databaseError, x - softError, l - syncAlreadyInProgress, * I - numIoExceptions * @return debugging string. */ public String toDebugString() { StringBuffer sb = new StringBuffer(); if (fullSyncRequested) { sb.append("f1"); } if (partialSyncUnavailable) { sb.append("r1"); } if (hasHardError()) { sb.append("X1"); } if (stats.numParseExceptions > 0) { sb.append("e").append(stats.numParseExceptions); } if (stats.numConflictDetectedExceptions > 0) { sb.append("c").append(stats.numConflictDetectedExceptions); } if (stats.numAuthExceptions > 0) { sb.append("a").append(stats.numAuthExceptions); } if (tooManyDeletions) { sb.append("D1"); } if (tooManyRetries) { sb.append("R1"); } if (databaseError) { sb.append("b1"); } if (hasSoftError()) { sb.append("x1"); } if (syncAlreadyInProgress) { sb.append("l1"); } if (stats.numIoExceptions > 0) { sb.append("I").append(stats.numIoExceptions); } return sb.toString(); } }