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
24c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana/**
25fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams * Value type that contains information about a periodic sync.
26c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana */
27c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintanapublic class PeriodicSync implements Parcelable {
28fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    /** The account to be synced. Can be null. */
29c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    public final Account account;
30fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    /** The authority of the sync. Can be null. */
31c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    public final String authority;
32c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    /** Any extras that parameters that are to be passed to the sync adapter. */
33c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    public final Bundle extras;
34fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    /** How frequently the sync should be scheduled, in seconds. Kept around for API purposes. */
35c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    public final long period;
36fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    /**
37fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     * How much flexibility can be taken in scheduling the sync, in seconds.
38fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     * {@hide}
39fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     */
40fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    public final long flexTime;
41c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
42fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams      /**
435a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams       * Creates a new PeriodicSync, copying the Bundle. This constructor is no longer used.
44fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams       */
45fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    public PeriodicSync(Account account, String authority, Bundle extras, long periodInSeconds) {
46c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        this.account = account;
47c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        this.authority = authority;
48fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        if (extras == null) {
49fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams            this.extras = new Bundle();
50fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        } else {
51fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams            this.extras = new Bundle(extras);
52fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        }
53fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        this.period = periodInSeconds;
54fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        // Old API uses default flex time. No-one should be using this ctor anyway.
55fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        this.flexTime = 0L;
56fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    }
57fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
58fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    /**
59fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     * Create a copy of a periodic sync.
60fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     * {@hide}
61fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     */
62fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    public PeriodicSync(PeriodicSync other) {
63fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        this.account = other.account;
64fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        this.authority = other.authority;
65fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        this.extras = new Bundle(other.extras);
66fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        this.period = other.period;
67fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        this.flexTime = other.flexTime;
68fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    }
69fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
70fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    /**
71fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     * A PeriodicSync for a sync with a specified provider.
72fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     * {@hide}
73fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     */
74fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    public PeriodicSync(Account account, String authority, Bundle extras,
75fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams            long period, long flexTime) {
76fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        this.account = account;
77fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        this.authority = authority;
78c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        this.extras = new Bundle(extras);
79c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        this.period = period;
80fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        this.flexTime = flexTime;
81c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    }
82c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
83fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    private PeriodicSync(Parcel in) {
845a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams        this.account = in.readParcelable(null);
855a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams        this.authority = in.readString();
86fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        this.extras = in.readBundle();
87fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        this.period = in.readLong();
88fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        this.flexTime = in.readLong();
89fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    }
90fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
91fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    @Override
92c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    public int describeContents() {
93c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        return 0;
94c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    }
95c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
96fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    @Override
97c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    public void writeToParcel(Parcel dest, int flags) {
985a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams        dest.writeParcelable(account, flags);
995a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams        dest.writeString(authority);
100c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        dest.writeBundle(extras);
101c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        dest.writeLong(period);
102fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        dest.writeLong(flexTime);
103c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    }
104c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
105c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    public static final Creator<PeriodicSync> CREATOR = new Creator<PeriodicSync>() {
106fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        @Override
107c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        public PeriodicSync createFromParcel(Parcel source) {
108fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams            return new PeriodicSync(source);
109c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        }
110c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
111fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        @Override
112c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        public PeriodicSync[] newArray(int size) {
113c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana            return new PeriodicSync[size];
114c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        }
115c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    };
116c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana
117fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    @Override
118c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    public boolean equals(Object o) {
119c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        if (o == this) {
120c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana            return true;
121c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        }
122c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        if (!(o instanceof PeriodicSync)) {
123c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana            return false;
124c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        }
125c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana        final PeriodicSync other = (PeriodicSync) o;
1265a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams        return account.equals(other.account)
1275a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams                && authority.equals(other.authority)
1285a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams                && period == other.period
1295a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams                && syncExtrasEquals(extras, other.extras);
1307a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey    }
1317a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey
132fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    /**
1335a9decd589f3f6a512168fd669ee2c5d8daa238bMatthew Williams     * Periodic sync extra comparison function.
134fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     * {@hide}
135fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams     */
1367a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey    public static boolean syncExtrasEquals(Bundle b1, Bundle b2) {
1377a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey        if (b1.size() != b2.size()) {
1387a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey            return false;
1397a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey        }
1407a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey        if (b1.isEmpty()) {
1417a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey            return true;
1427a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey        }
1437a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey        for (String key : b1.keySet()) {
1447a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey            if (!b2.containsKey(key)) {
1457a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey                return false;
1467a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey            }
1477a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey            if (!b1.get(key).equals(b2.get(key))) {
1487a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey                return false;
1497a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey            }
1507a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey        }
1517a96c39c510923ef73bbb06ab20109f0168b8eb1Jeff Sharkey        return true;
152c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana    }
153fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams
154fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    @Override
155fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    public String toString() {
156fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams        return "account: " + account +
157fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams               ", authority: " + authority +
158fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams               ". period: " + period + "s " +
159fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams               ", flex: " + flexTime;
160fa77418134c6f1f80af225a78819f069e9c974fbMatthew Williams    }
161c5d1c6db61f208b206b260f897bb5bbc64be4d97Fred Quintana}
162