1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.content;
18
19import android.os.Parcel;
20import android.os.Parcelable;
21import android.util.Log;
22
23import java.util.ArrayList;
24
25/** @hide */
26public class SyncStatusInfo implements Parcelable {
27    static final int VERSION = 2;
28
29    public final int authorityId;
30    public long totalElapsedTime;
31    public int numSyncs;
32    public int numSourcePoll;
33    public int numSourceServer;
34    public int numSourceLocal;
35    public int numSourceUser;
36    public int numSourcePeriodic;
37    public long lastSuccessTime;
38    public int lastSuccessSource;
39    public long lastFailureTime;
40    public int lastFailureSource;
41    public String lastFailureMesg;
42    public long initialFailureTime;
43    public boolean pending;
44    public boolean initialize;
45    public ArrayList<Long> periodicSyncTimes;
46
47    private static final String TAG = "Sync";
48
49    public SyncStatusInfo(int authorityId) {
50        this.authorityId = authorityId;
51    }
52
53    public int getLastFailureMesgAsInt(int def) {
54        final int i = ContentResolver.syncErrorStringToInt(lastFailureMesg);
55        if (i > 0) {
56            return i;
57        } else {
58            Log.d(TAG, "Unknown lastFailureMesg:" + lastFailureMesg);
59            return def;
60        }
61    }
62
63    public int describeContents() {
64        return 0;
65    }
66
67    public void writeToParcel(Parcel parcel, int flags) {
68        parcel.writeInt(VERSION);
69        parcel.writeInt(authorityId);
70        parcel.writeLong(totalElapsedTime);
71        parcel.writeInt(numSyncs);
72        parcel.writeInt(numSourcePoll);
73        parcel.writeInt(numSourceServer);
74        parcel.writeInt(numSourceLocal);
75        parcel.writeInt(numSourceUser);
76        parcel.writeLong(lastSuccessTime);
77        parcel.writeInt(lastSuccessSource);
78        parcel.writeLong(lastFailureTime);
79        parcel.writeInt(lastFailureSource);
80        parcel.writeString(lastFailureMesg);
81        parcel.writeLong(initialFailureTime);
82        parcel.writeInt(pending ? 1 : 0);
83        parcel.writeInt(initialize ? 1 : 0);
84        if (periodicSyncTimes != null) {
85            parcel.writeInt(periodicSyncTimes.size());
86            for (long periodicSyncTime : periodicSyncTimes) {
87                parcel.writeLong(periodicSyncTime);
88            }
89        } else {
90            parcel.writeInt(-1);
91        }
92    }
93
94    public SyncStatusInfo(Parcel parcel) {
95        int version = parcel.readInt();
96        if (version != VERSION && version != 1) {
97            Log.w("SyncStatusInfo", "Unknown version: " + version);
98        }
99        authorityId = parcel.readInt();
100        totalElapsedTime = parcel.readLong();
101        numSyncs = parcel.readInt();
102        numSourcePoll = parcel.readInt();
103        numSourceServer = parcel.readInt();
104        numSourceLocal = parcel.readInt();
105        numSourceUser = parcel.readInt();
106        lastSuccessTime = parcel.readLong();
107        lastSuccessSource = parcel.readInt();
108        lastFailureTime = parcel.readLong();
109        lastFailureSource = parcel.readInt();
110        lastFailureMesg = parcel.readString();
111        initialFailureTime = parcel.readLong();
112        pending = parcel.readInt() != 0;
113        initialize = parcel.readInt() != 0;
114        if (version == 1) {
115            periodicSyncTimes = null;
116        } else {
117            int N = parcel.readInt();
118            if (N < 0) {
119                periodicSyncTimes = null;
120            } else {
121                periodicSyncTimes = new ArrayList<Long>();
122                for (int i=0; i<N; i++) {
123                    periodicSyncTimes.add(parcel.readLong());
124                }
125            }
126        }
127    }
128
129    public void setPeriodicSyncTime(int index, long when) {
130        ensurePeriodicSyncTimeSize(index);
131        periodicSyncTimes.set(index, when);
132    }
133
134    private void ensurePeriodicSyncTimeSize(int index) {
135        if (periodicSyncTimes == null) {
136            periodicSyncTimes = new ArrayList<Long>(0);
137        }
138
139        final int requiredSize = index + 1;
140        if (periodicSyncTimes.size() < requiredSize) {
141            for (int i = periodicSyncTimes.size(); i < requiredSize; i++) {
142                periodicSyncTimes.add((long) 0);
143            }
144        }
145    }
146
147    public long getPeriodicSyncTime(int index) {
148        if (periodicSyncTimes == null || periodicSyncTimes.size() < (index + 1)) {
149            return 0;
150        }
151        return periodicSyncTimes.get(index);
152    }
153
154    public void removePeriodicSyncTime(int index) {
155        ensurePeriodicSyncTimeSize(index);
156        periodicSyncTimes.remove(index);
157    }
158
159    public static final Creator<SyncStatusInfo> CREATOR = new Creator<SyncStatusInfo>() {
160        public SyncStatusInfo createFromParcel(Parcel in) {
161            return new SyncStatusInfo(in);
162        }
163
164        public SyncStatusInfo[] newArray(int size) {
165            return new SyncStatusInfo[size];
166        }
167    };
168}