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