SyncOperation.java revision 307da1a46b4c9b711bafe8fbaaa6b98e8868c18e
1307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintanapackage android.content;
2307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
3307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintanaimport android.accounts.Account;
4307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintanaimport android.os.Bundle;
5307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintanaimport android.os.SystemClock;
6307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
7307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana/**
8307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana * Value type that represents a sync operation.
9307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana * @hide
10307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana */
11307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintanapublic class SyncOperation implements Comparable {
12307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public final Account account;
13307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public int syncSource;
14307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public String authority;
15307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public Bundle extras;
16307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public final String key;
17307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public long earliestRunTime;
18307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public boolean expedited;
19307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public SyncStorageEngine.PendingOperation pendingOperation;
20307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
21307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public SyncOperation(Account account, int source, String authority, Bundle extras,
22307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana            long delay) {
23307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.account = account;
24307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.syncSource = source;
25307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.authority = authority;
26307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.extras = new Bundle(extras);
27307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        removeFalseExtra(ContentResolver.SYNC_EXTRAS_UPLOAD);
28307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        removeFalseExtra(ContentResolver.SYNC_EXTRAS_MANUAL);
29307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        removeFalseExtra(ContentResolver.SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS);
30307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        removeFalseExtra(ContentResolver.SYNC_EXTRAS_EXPEDITED);
31307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        removeFalseExtra(ContentResolver.SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS);
32307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        final long now = SystemClock.elapsedRealtime();
33307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        if (delay < 0) {
34307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana            this.expedited = true;
35307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana            this.earliestRunTime = now;
36307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        } else {
37307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana            this.expedited = false;
38307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana            this.earliestRunTime = now + delay;
39307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        }
40307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.key = toKey();
41307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    }
42307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
43307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    private void removeFalseExtra(String extraName) {
44307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        if (!extras.getBoolean(extraName, false)) {
45307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana            extras.remove(extraName);
46307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        }
47307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    }
48307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
49307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    SyncOperation(SyncOperation other) {
50307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.account = other.account;
51307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.syncSource = other.syncSource;
52307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.authority = other.authority;
53307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.extras = new Bundle(other.extras);
54307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.expedited = other.expedited;
55307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.earliestRunTime = SystemClock.elapsedRealtime();
56307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.key = toKey();
57307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    }
58307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
59307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public String toString() {
60307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        StringBuilder sb = new StringBuilder();
61307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append("authority: ").append(authority);
62307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append(" account: ").append(account);
63307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append(" extras: ");
64307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        extrasToStringBuilder(extras, sb);
65307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append(" syncSource: ").append(syncSource);
66307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append(" when: ").append(earliestRunTime);
67307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append(" expedited: ").append(expedited);
68307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        return sb.toString();
69307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    }
70307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
71307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    private String toKey() {
72307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        StringBuilder sb = new StringBuilder();
73307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append("authority: ").append(authority);
74307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append(" account: ").append(account);
75307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append(" extras: ");
76307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        extrasToStringBuilder(extras, sb);
77307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        return sb.toString();
78307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    }
79307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
80307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public static void extrasToStringBuilder(Bundle bundle, StringBuilder sb) {
81307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append("[");
82307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        for (String key : bundle.keySet()) {
83307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana            sb.append(key).append("=").append(bundle.get(key)).append(" ");
84307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        }
85307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append("]");
86307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    }
87307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
88307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public int compareTo(Object o) {
89307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        SyncOperation other = (SyncOperation)o;
90307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        if (earliestRunTime == other.earliestRunTime) {
91307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana            return 0;
92307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        }
93307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        return (earliestRunTime < other.earliestRunTime) ? -1 : 1;
94307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    }
95307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana}
96