SyncResult.java revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
1package android.content;
2
3import android.os.Parcel;
4import android.os.Parcelable;
5
6/**
7 * This class is used to store information about the result of a sync
8 *
9 * @hide
10 */
11public final class SyncResult implements Parcelable {
12    public final boolean syncAlreadyInProgress;
13    public boolean tooManyDeletions;
14    public boolean tooManyRetries;
15    public boolean databaseError;
16    public boolean fullSyncRequested;
17    public boolean partialSyncUnavailable;
18    public boolean moreRecordsToGet;
19    public final SyncStats stats;
20    public static final SyncResult ALREADY_IN_PROGRESS;
21
22    static {
23        ALREADY_IN_PROGRESS = new SyncResult(true);
24    }
25
26    public SyncResult() {
27        this(false);
28    }
29
30    private SyncResult(boolean syncAlreadyInProgress) {
31        this.syncAlreadyInProgress = syncAlreadyInProgress;
32        this.tooManyDeletions = false;
33        this.tooManyRetries = false;
34        this.fullSyncRequested = false;
35        this.partialSyncUnavailable = false;
36        this.moreRecordsToGet = false;
37        this.stats = new SyncStats();
38    }
39
40    private SyncResult(Parcel parcel) {
41        syncAlreadyInProgress = parcel.readInt() != 0;
42        tooManyDeletions = parcel.readInt() != 0;
43        tooManyRetries = parcel.readInt() != 0;
44        databaseError = parcel.readInt() != 0;
45        fullSyncRequested = parcel.readInt() != 0;
46        partialSyncUnavailable = parcel.readInt() != 0;
47        moreRecordsToGet = parcel.readInt() != 0;
48        stats = new SyncStats(parcel);
49    }
50
51    public boolean hasHardError() {
52        return stats.numParseExceptions > 0
53                || stats.numConflictDetectedExceptions > 0
54                || stats.numAuthExceptions > 0
55                || tooManyDeletions
56                || tooManyRetries
57                || databaseError;
58    }
59
60    public boolean hasSoftError() {
61        return syncAlreadyInProgress || stats.numIoExceptions > 0;
62    }
63
64    public boolean hasError() {
65        return hasSoftError() || hasHardError();
66    }
67
68    public boolean madeSomeProgress() {
69        return ((stats.numDeletes > 0) && !tooManyDeletions)
70                || stats.numInserts > 0
71                || stats.numUpdates > 0;
72    }
73
74    public void clear() {
75        if (syncAlreadyInProgress) {
76            throw new UnsupportedOperationException(
77                    "you are not allowed to clear the ALREADY_IN_PROGRESS SyncStats");
78        }
79        tooManyDeletions = false;
80        tooManyRetries = false;
81        databaseError = false;
82        fullSyncRequested = false;
83        partialSyncUnavailable = false;
84        moreRecordsToGet = false;
85        stats.clear();
86    }
87
88    public static final Creator<SyncResult> CREATOR = new Creator<SyncResult>() {
89        public SyncResult createFromParcel(Parcel in) {
90            return new SyncResult(in);
91        }
92
93        public SyncResult[] newArray(int size) {
94            return new SyncResult[size];
95        }
96    };
97
98    public int describeContents() {
99        return 0;
100    }
101
102    public void writeToParcel(Parcel parcel, int flags) {
103        parcel.writeInt(syncAlreadyInProgress ? 1 : 0);
104        parcel.writeInt(tooManyDeletions ? 1 : 0);
105        parcel.writeInt(tooManyRetries ? 1 : 0);
106        parcel.writeInt(databaseError ? 1 : 0);
107        parcel.writeInt(fullSyncRequested ? 1 : 0);
108        parcel.writeInt(partialSyncUnavailable ? 1 : 0);
109        parcel.writeInt(moreRecordsToGet ? 1 : 0);
110        stats.writeToParcel(parcel, flags);
111    }
112
113    @Override
114    public String toString() {
115        StringBuilder sb = new StringBuilder();
116        sb.append(" syncAlreadyInProgress: ").append(syncAlreadyInProgress);
117        sb.append(" tooManyDeletions: ").append(tooManyDeletions);
118        sb.append(" tooManyRetries: ").append(tooManyRetries);
119        sb.append(" databaseError: ").append(databaseError);
120        sb.append(" fullSyncRequested: ").append(fullSyncRequested);
121        sb.append(" partialSyncUnavailable: ").append(partialSyncUnavailable);
122        sb.append(" moreRecordsToGet: ").append(moreRecordsToGet);
123        sb.append(" stats: ").append(stats);
124        return sb.toString();
125    }
126
127    /**
128     * Generates a debugging string indicating the status.
129     * The string consist of a sequence of code letter followed by the count.
130     * Code letters are f - fullSyncRequested, r - partialSyncUnavailable,
131     * X - hardError, e - numParseExceptions, c - numConflictDetectedExceptions,
132     * a - numAuthExceptions, D - tooManyDeletions, R - tooManyRetries,
133     * b - databaseError, x - softError, l - syncAlreadyInProgress,
134     * I - numIoExceptions
135     * @return debugging string.
136     */
137    public String toDebugString() {
138        StringBuffer sb = new StringBuffer();
139
140        if (fullSyncRequested) {
141            sb.append("f1");
142        }
143        if (partialSyncUnavailable) {
144            sb.append("r1");
145        }
146        if (hasHardError()) {
147            sb.append("X1");
148        }
149        if (stats.numParseExceptions > 0) {
150            sb.append("e").append(stats.numParseExceptions);
151        }
152        if (stats.numConflictDetectedExceptions > 0) {
153            sb.append("c").append(stats.numConflictDetectedExceptions);
154        }
155        if (stats.numAuthExceptions > 0) {
156            sb.append("a").append(stats.numAuthExceptions);
157        }
158        if (tooManyDeletions) {
159            sb.append("D1");
160        }
161        if (tooManyRetries) {
162            sb.append("R1");
163        }
164        if (databaseError) {
165            sb.append("b1");
166        }
167        if (hasSoftError()) {
168            sb.append("x1");
169        }
170        if (syncAlreadyInProgress) {
171            sb.append("l1");
172        }
173        if (stats.numIoExceptions > 0) {
174            sb.append("I").append(stats.numIoExceptions);
175        }
176        return sb.toString();
177    }
178}
179