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