115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/*
215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2010 The Android Open Source Project
315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License.
615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at
715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software
1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and
1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License.
1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */
1615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root
17307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintanapackage android.content;
18307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
19307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintanaimport android.accounts.Account;
20307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintanaimport android.os.Bundle;
21307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintanaimport android.os.SystemClock;
22307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
23307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana/**
24307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana * Value type that represents a sync operation.
25307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana * @hide
26307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana */
27307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintanapublic class SyncOperation implements Comparable {
28307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public final Account account;
29307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public int syncSource;
30307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public String authority;
31307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public Bundle extras;
32307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public final String key;
33307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public long earliestRunTime;
34307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public boolean expedited;
35307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public SyncStorageEngine.PendingOperation pendingOperation;
36307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
37307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public SyncOperation(Account account, int source, String authority, Bundle extras,
3882c5c4248a5dcd648ecbc311e2b8cd765c388aabFred Quintana            long delayInMs) {
39307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.account = account;
40307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.syncSource = source;
41307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.authority = authority;
42307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.extras = new Bundle(extras);
43307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        removeFalseExtra(ContentResolver.SYNC_EXTRAS_UPLOAD);
44307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        removeFalseExtra(ContentResolver.SYNC_EXTRAS_MANUAL);
4553bd2522ca7767f46646606123b6e2689b811850Fred Quintana        removeFalseExtra(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS);
4653bd2522ca7767f46646606123b6e2689b811850Fred Quintana        removeFalseExtra(ContentResolver.SYNC_EXTRAS_IGNORE_BACKOFF);
4753bd2522ca7767f46646606123b6e2689b811850Fred Quintana        removeFalseExtra(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY);
48307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        removeFalseExtra(ContentResolver.SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS);
49307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        removeFalseExtra(ContentResolver.SYNC_EXTRAS_EXPEDITED);
50307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        removeFalseExtra(ContentResolver.SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS);
51307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        final long now = SystemClock.elapsedRealtime();
5282c5c4248a5dcd648ecbc311e2b8cd765c388aabFred Quintana        if (delayInMs < 0) {
53307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana            this.expedited = true;
54307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana            this.earliestRunTime = now;
55307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        } else {
56307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana            this.expedited = false;
5782c5c4248a5dcd648ecbc311e2b8cd765c388aabFred Quintana            this.earliestRunTime = now + delayInMs;
58307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        }
59307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.key = toKey();
60307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    }
61307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
62307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    private void removeFalseExtra(String extraName) {
63307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        if (!extras.getBoolean(extraName, false)) {
64307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana            extras.remove(extraName);
65307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        }
66307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    }
67307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
68307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    SyncOperation(SyncOperation other) {
69307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.account = other.account;
70307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.syncSource = other.syncSource;
71307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.authority = other.authority;
72307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.extras = new Bundle(other.extras);
73307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.expedited = other.expedited;
74307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.earliestRunTime = SystemClock.elapsedRealtime();
75307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        this.key = toKey();
76307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    }
77307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
78307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public String toString() {
79307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        StringBuilder sb = new StringBuilder();
80307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append("authority: ").append(authority);
81307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append(" account: ").append(account);
82307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append(" extras: ");
8377c560f3d7891d9ae1ad714b5f65a22ff4f4c06bFred Quintana        extrasToStringBuilder(extras, sb, false /* asKey */);
84307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append(" syncSource: ").append(syncSource);
85307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append(" when: ").append(earliestRunTime);
86307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append(" expedited: ").append(expedited);
87307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        return sb.toString();
88307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    }
89307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
90307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    private String toKey() {
91307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        StringBuilder sb = new StringBuilder();
92307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append("authority: ").append(authority);
935cbaba857a48b1de1fad93cd943a508fdb1e2850Fred Quintana	sb.append(" account {name=" + account.name + ", type=" + account.type + "}");
94307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append(" extras: ");
9577c560f3d7891d9ae1ad714b5f65a22ff4f4c06bFred Quintana        extrasToStringBuilder(extras, sb, true /* asKey */);
96307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        return sb.toString();
97307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    }
98307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
9977c560f3d7891d9ae1ad714b5f65a22ff4f4c06bFred Quintana    public static void extrasToStringBuilder(Bundle bundle, StringBuilder sb, boolean asKey) {
100307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append("[");
101307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        for (String key : bundle.keySet()) {
10277c560f3d7891d9ae1ad714b5f65a22ff4f4c06bFred Quintana            // if we are writing this as a key don't consider whether this
10377c560f3d7891d9ae1ad714b5f65a22ff4f4c06bFred Quintana            // is an initialization sync or not when computing the key since
10477c560f3d7891d9ae1ad714b5f65a22ff4f4c06bFred Quintana            // we set this flag appropriately when dispatching the sync request.
10577c560f3d7891d9ae1ad714b5f65a22ff4f4c06bFred Quintana            if (asKey && ContentResolver.SYNC_EXTRAS_INITIALIZE.equals(key)) {
10677c560f3d7891d9ae1ad714b5f65a22ff4f4c06bFred Quintana                continue;
10777c560f3d7891d9ae1ad714b5f65a22ff4f4c06bFred Quintana            }
108307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana            sb.append(key).append("=").append(bundle.get(key)).append(" ");
109307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        }
110307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        sb.append("]");
111307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    }
112307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana
113307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    public int compareTo(Object o) {
114307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        SyncOperation other = (SyncOperation)o;
115307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        if (earliestRunTime == other.earliestRunTime) {
116307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana            return 0;
117307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        }
118307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana        return (earliestRunTime < other.earliestRunTime) ? -1 : 1;
119307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana    }
120307da1a46b4c9b711bafe8fbaaa6b98e8868c18eFred Quintana}
121