1c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana/* 2c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * Copyright (C) 2010 The Android Open Source Project 3c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * 4c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * Licensed under the Apache License, Version 2.0 (the "License"); 5c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * you may not use this file except in compliance with the License. 6c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * You may obtain a copy of the License at 7c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * 8c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * http://www.apache.org/licenses/LICENSE-2.0 9c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * 10c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * Unless required by applicable law or agreed to in writing, software 11c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * distributed under the License is distributed on an "AS IS" BASIS, 12c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * See the License for the specific language governing permissions and 14c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana * limitations under the License. 15c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana */ 16c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana 17c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintanapackage android.content; 18c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana 19c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintanaimport android.os.Parcelable; 20c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintanaimport android.os.Bundle; 21c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintanaimport android.os.Parcel; 22c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintanaimport android.accounts.Account; 23c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana 249ad2c8403354a985258c098681067e74b9e2f638Matthew Williamsimport java.util.Objects; 259ad2c8403354a985258c098681067e74b9e2f638Matthew Williams 26c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana/** 27fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams * Value type that contains information about a periodic sync. 28c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana */ 29c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintanapublic class PeriodicSync implements Parcelable { 30fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams /** The account to be synced. Can be null. */ 31c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana public final Account account; 32fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams /** The authority of the sync. Can be null. */ 33c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana public final String authority; 34c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana /** Any extras that parameters that are to be passed to the sync adapter. */ 35c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana public final Bundle extras; 36fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams /** How frequently the sync should be scheduled, in seconds. Kept around for API purposes. */ 37c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana public final long period; 38fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams /** 39fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams * How much flexibility can be taken in scheduling the sync, in seconds. 40fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams * {@hide} 41fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams */ 42fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams public final long flexTime; 43c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana 44fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams /** 455a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams * Creates a new PeriodicSync, copying the Bundle. This constructor is no longer used. 46fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams */ 47fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams public PeriodicSync(Account account, String authority, Bundle extras, long periodInSeconds) { 48c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana this.account = account; 49c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana this.authority = authority; 50fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams if (extras == null) { 51fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams this.extras = new Bundle(); 52fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams } else { 53fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams this.extras = new Bundle(extras); 54fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams } 55fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams this.period = periodInSeconds; 56fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams // Old API uses default flex time. No-one should be using this ctor anyway. 57fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams this.flexTime = 0L; 58fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams } 59fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams 60fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams /** 61fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams * Create a copy of a periodic sync. 62fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams * {@hide} 63fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams */ 64fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams public PeriodicSync(PeriodicSync other) { 65fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams this.account = other.account; 66fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams this.authority = other.authority; 67fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams this.extras = new Bundle(other.extras); 68fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams this.period = other.period; 69fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams this.flexTime = other.flexTime; 70fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams } 71fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams 72fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams /** 73fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams * A PeriodicSync for a sync with a specified provider. 74fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams * {@hide} 75fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams */ 76fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams public PeriodicSync(Account account, String authority, Bundle extras, 77fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams long period, long flexTime) { 78fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams this.account = account; 79fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams this.authority = authority; 80c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana this.extras = new Bundle(extras); 81c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana this.period = period; 82fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams this.flexTime = flexTime; 83c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana } 84c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana 85fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams private PeriodicSync(Parcel in) { 865a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams this.account = in.readParcelable(null); 875a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams this.authority = in.readString(); 88fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams this.extras = in.readBundle(); 89fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams this.period = in.readLong(); 90fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams this.flexTime = in.readLong(); 91fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams } 92fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams 93fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams @Override 94c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana public int describeContents() { 95c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana return 0; 96c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana } 97c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana 98fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams @Override 99c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana public void writeToParcel(Parcel dest, int flags) { 1005a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams dest.writeParcelable(account, flags); 1015a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams dest.writeString(authority); 102c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana dest.writeBundle(extras); 103c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana dest.writeLong(period); 104fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams dest.writeLong(flexTime); 105c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana } 106c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana 107c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana public static final Creator<PeriodicSync> CREATOR = new Creator<PeriodicSync>() { 108fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams @Override 109c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana public PeriodicSync createFromParcel(Parcel source) { 110fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams return new PeriodicSync(source); 111c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana } 112c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana 113fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams @Override 114c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana public PeriodicSync[] newArray(int size) { 115c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana return new PeriodicSync[size]; 116c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana } 117c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana }; 118c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana 119fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams @Override 120c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana public boolean equals(Object o) { 121c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana if (o == this) { 122c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana return true; 123c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana } 124c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana if (!(o instanceof PeriodicSync)) { 125c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana return false; 126c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana } 127c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana final PeriodicSync other = (PeriodicSync) o; 1285a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams return account.equals(other.account) 1295a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams && authority.equals(other.authority) 1305a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams && period == other.period 1315a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams && syncExtrasEquals(extras, other.extras); 1327a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey } 1337a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey 134fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams /** 1355a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams * Periodic sync extra comparison function. 136fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams * {@hide} 137fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams */ 1387a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey public static boolean syncExtrasEquals(Bundle b1, Bundle b2) { 1397a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey if (b1.size() != b2.size()) { 1407a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey return false; 1417a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey } 1427a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey if (b1.isEmpty()) { 1437a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey return true; 1447a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey } 1457a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey for (String key : b1.keySet()) { 1467a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey if (!b2.containsKey(key)) { 1477a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey return false; 1487a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey } 1499ad2c8403354a985258c098681067e74b9e2f638Matthew Williams // Null check. According to ContentResolver#validateSyncExtrasBundle null-valued keys 1509ad2c8403354a985258c098681067e74b9e2f638Matthew Williams // are allowed in the bundle. 1519ad2c8403354a985258c098681067e74b9e2f638Matthew Williams if (!Objects.equals(b1.get(key), b2.get(key))) { 1527a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey return false; 1537a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey } 1547a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey } 1557a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey return true; 156c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana } 157fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams 158fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams @Override 159fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams public String toString() { 160fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams return "account: " + account + 161fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams ", authority: " + authority + 162fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams ". period: " + period + "s " + 163fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams ", flex: " + flexTime; 164fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams } 165c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana} 166