blob: 663e6e476c5a1f5f6cc367e735c6b42072319257 [file] [log] [blame]
Dianne Hackborn231cc602009-04-27 17:10:36 -07001/*
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
Fred Quintanac5d1c6d2010-01-27 12:17:49 -080023import java.util.ArrayList;
24
Dianne Hackborn231cc602009-04-27 17:10:36 -070025/** @hide */
26public class SyncStatusInfo implements Parcelable {
Makoto Onuki15e7a252017-06-08 17:12:05 -070027 private static final String TAG = "Sync";
28
29 static final int VERSION = 3;
30
31 private static final int MAX_EVENT_COUNT = 10;
Fred Quintanac5d1c6d2010-01-27 12:17:49 -080032
Dianne Hackborn231cc602009-04-27 17:10:36 -070033 public final int authorityId;
34 public long totalElapsedTime;
35 public int numSyncs;
36 public int numSourcePoll;
37 public int numSourceServer;
38 public int numSourceLocal;
39 public int numSourceUser;
Fred Quintanac5d1c6d2010-01-27 12:17:49 -080040 public int numSourcePeriodic;
Dianne Hackborn231cc602009-04-27 17:10:36 -070041 public long lastSuccessTime;
42 public int lastSuccessSource;
43 public long lastFailureTime;
44 public int lastFailureSource;
45 public String lastFailureMesg;
46 public long initialFailureTime;
47 public boolean pending;
Costin Manolache5ed64cd2009-09-22 14:41:46 -070048 public boolean initialize;
Georgi Nikolovdbe846b2013-06-25 14:09:56 -070049
50 // Warning: It is up to the external caller to ensure there are
51 // no race conditions when accessing this list
52 private ArrayList<Long> periodicSyncTimes;
Fred Quintanac5d1c6d2010-01-27 12:17:49 -080053
Makoto Onuki15e7a252017-06-08 17:12:05 -070054 private final ArrayList<Long> mLastEventTimes = new ArrayList<>();
55 private final ArrayList<String> mLastEvents = new ArrayList<>();
Fred Quintanac5d1c6d2010-01-27 12:17:49 -080056
Jeff Sharkey7a96c392012-11-15 14:01:46 -080057 public SyncStatusInfo(int authorityId) {
Dianne Hackborn231cc602009-04-27 17:10:36 -070058 this.authorityId = authorityId;
59 }
60
61 public int getLastFailureMesgAsInt(int def) {
Alon Albert5c113fa2013-02-07 08:07:32 -080062 final int i = ContentResolver.syncErrorStringToInt(lastFailureMesg);
63 if (i > 0) {
64 return i;
65 } else {
66 Log.d(TAG, "Unknown lastFailureMesg:" + lastFailureMesg);
67 return def;
Dianne Hackborn231cc602009-04-27 17:10:36 -070068 }
Dianne Hackborn231cc602009-04-27 17:10:36 -070069 }
Fred Quintanac5d1c6d2010-01-27 12:17:49 -080070
Dianne Hackborn231cc602009-04-27 17:10:36 -070071 public int describeContents() {
72 return 0;
73 }
74
75 public void writeToParcel(Parcel parcel, int flags) {
76 parcel.writeInt(VERSION);
77 parcel.writeInt(authorityId);
78 parcel.writeLong(totalElapsedTime);
79 parcel.writeInt(numSyncs);
80 parcel.writeInt(numSourcePoll);
81 parcel.writeInt(numSourceServer);
82 parcel.writeInt(numSourceLocal);
83 parcel.writeInt(numSourceUser);
84 parcel.writeLong(lastSuccessTime);
85 parcel.writeInt(lastSuccessSource);
86 parcel.writeLong(lastFailureTime);
87 parcel.writeInt(lastFailureSource);
88 parcel.writeString(lastFailureMesg);
89 parcel.writeLong(initialFailureTime);
90 parcel.writeInt(pending ? 1 : 0);
Costin Manolache5ed64cd2009-09-22 14:41:46 -070091 parcel.writeInt(initialize ? 1 : 0);
Fred Quintanac5d1c6d2010-01-27 12:17:49 -080092 if (periodicSyncTimes != null) {
93 parcel.writeInt(periodicSyncTimes.size());
94 for (long periodicSyncTime : periodicSyncTimes) {
95 parcel.writeLong(periodicSyncTime);
96 }
97 } else {
98 parcel.writeInt(-1);
99 }
Makoto Onuki15e7a252017-06-08 17:12:05 -0700100 parcel.writeInt(mLastEventTimes.size());
101 for (int i = 0; i < mLastEventTimes.size(); i++) {
102 parcel.writeLong(mLastEventTimes.get(i));
103 parcel.writeString(mLastEvents.get(i));
104 }
Dianne Hackborn231cc602009-04-27 17:10:36 -0700105 }
106
Jeff Sharkey7a96c392012-11-15 14:01:46 -0800107 public SyncStatusInfo(Parcel parcel) {
Dianne Hackborn231cc602009-04-27 17:10:36 -0700108 int version = parcel.readInt();
Fred Quintanac5d1c6d2010-01-27 12:17:49 -0800109 if (version != VERSION && version != 1) {
Dianne Hackborn231cc602009-04-27 17:10:36 -0700110 Log.w("SyncStatusInfo", "Unknown version: " + version);
111 }
112 authorityId = parcel.readInt();
113 totalElapsedTime = parcel.readLong();
114 numSyncs = parcel.readInt();
115 numSourcePoll = parcel.readInt();
116 numSourceServer = parcel.readInt();
117 numSourceLocal = parcel.readInt();
118 numSourceUser = parcel.readInt();
119 lastSuccessTime = parcel.readLong();
120 lastSuccessSource = parcel.readInt();
121 lastFailureTime = parcel.readLong();
122 lastFailureSource = parcel.readInt();
123 lastFailureMesg = parcel.readString();
124 initialFailureTime = parcel.readLong();
125 pending = parcel.readInt() != 0;
Costin Manolache5ed64cd2009-09-22 14:41:46 -0700126 initialize = parcel.readInt() != 0;
Fred Quintanac5d1c6d2010-01-27 12:17:49 -0800127 if (version == 1) {
128 periodicSyncTimes = null;
129 } else {
Makoto Onuki15e7a252017-06-08 17:12:05 -0700130 final int count = parcel.readInt();
131 if (count < 0) {
Fred Quintanac5d1c6d2010-01-27 12:17:49 -0800132 periodicSyncTimes = null;
133 } else {
134 periodicSyncTimes = new ArrayList<Long>();
Makoto Onuki15e7a252017-06-08 17:12:05 -0700135 for (int i = 0; i < count; i++) {
Fred Quintanac5d1c6d2010-01-27 12:17:49 -0800136 periodicSyncTimes.add(parcel.readLong());
137 }
138 }
Makoto Onuki15e7a252017-06-08 17:12:05 -0700139 if (version >= 3) {
140 mLastEventTimes.clear();
141 mLastEvents.clear();
142 final int nEvents = parcel.readInt();
143 for (int i = 0; i < nEvents; i++) {
144 mLastEventTimes.add(parcel.readLong());
145 mLastEvents.add(parcel.readString());
146 }
147 }
Fred Quintanac5d1c6d2010-01-27 12:17:49 -0800148 }
Dianne Hackborn231cc602009-04-27 17:10:36 -0700149 }
Fred Quintanac5d1c6d2010-01-27 12:17:49 -0800150
Georgi Nikolovdbe846b2013-06-25 14:09:56 -0700151 public SyncStatusInfo(SyncStatusInfo other) {
152 authorityId = other.authorityId;
153 totalElapsedTime = other.totalElapsedTime;
154 numSyncs = other.numSyncs;
155 numSourcePoll = other.numSourcePoll;
156 numSourceServer = other.numSourceServer;
157 numSourceLocal = other.numSourceLocal;
158 numSourceUser = other.numSourceUser;
159 numSourcePeriodic = other.numSourcePeriodic;
160 lastSuccessTime = other.lastSuccessTime;
161 lastSuccessSource = other.lastSuccessSource;
162 lastFailureTime = other.lastFailureTime;
163 lastFailureSource = other.lastFailureSource;
164 lastFailureMesg = other.lastFailureMesg;
165 initialFailureTime = other.initialFailureTime;
166 pending = other.pending;
167 initialize = other.initialize;
168 if (other.periodicSyncTimes != null) {
169 periodicSyncTimes = new ArrayList<Long>(other.periodicSyncTimes);
170 }
Makoto Onuki15e7a252017-06-08 17:12:05 -0700171 mLastEventTimes.addAll(other.mLastEventTimes);
172 mLastEvents.addAll(other.mLastEvents);
Georgi Nikolovdbe846b2013-06-25 14:09:56 -0700173 }
174
Fred Quintanac5d1c6d2010-01-27 12:17:49 -0800175 public void setPeriodicSyncTime(int index, long when) {
Georgi Nikolovdbe846b2013-06-25 14:09:56 -0700176 // The list is initialized lazily when scheduling occurs so we need to make sure
177 // we initialize elements < index to zero (zero is ignore for scheduling purposes)
Fred Quintanac5d1c6d2010-01-27 12:17:49 -0800178 ensurePeriodicSyncTimeSize(index);
179 periodicSyncTimes.set(index, when);
180 }
181
Georgi Nikolovdbe846b2013-06-25 14:09:56 -0700182 public long getPeriodicSyncTime(int index) {
183 if (periodicSyncTimes != null && index < periodicSyncTimes.size()) {
184 return periodicSyncTimes.get(index);
185 } else {
186 return 0;
187 }
188 }
189
190 public void removePeriodicSyncTime(int index) {
191 if (periodicSyncTimes != null && index < periodicSyncTimes.size()) {
192 periodicSyncTimes.remove(index);
193 }
194 }
195
Makoto Onuki15e7a252017-06-08 17:12:05 -0700196 /** */
197 public void addEvent(String message) {
198 if (mLastEventTimes.size() >= MAX_EVENT_COUNT) {
199 mLastEventTimes.remove(MAX_EVENT_COUNT - 1);
200 mLastEvents.remove(MAX_EVENT_COUNT - 1);
201 }
202 mLastEventTimes.add(0, System.currentTimeMillis());
203 mLastEvents.add(0, message);
204 }
205
206 /** */
207 public int getEventCount() {
208 return mLastEventTimes.size();
209 }
210
211 /** */
212 public long getEventTime(int i) {
213 return mLastEventTimes.get(i);
214 }
215
216 /** */
217 public String getEvent(int i) {
218 return mLastEvents.get(i);
219 }
220
Georgi Nikolovdbe846b2013-06-25 14:09:56 -0700221 public static final Creator<SyncStatusInfo> CREATOR = new Creator<SyncStatusInfo>() {
222 public SyncStatusInfo createFromParcel(Parcel in) {
223 return new SyncStatusInfo(in);
224 }
225
226 public SyncStatusInfo[] newArray(int size) {
227 return new SyncStatusInfo[size];
228 }
229 };
230
Fred Quintanac5d1c6d2010-01-27 12:17:49 -0800231 private void ensurePeriodicSyncTimeSize(int index) {
232 if (periodicSyncTimes == null) {
233 periodicSyncTimes = new ArrayList<Long>(0);
234 }
235
236 final int requiredSize = index + 1;
237 if (periodicSyncTimes.size() < requiredSize) {
238 for (int i = periodicSyncTimes.size(); i < requiredSize; i++) {
239 periodicSyncTimes.add((long) 0);
240 }
241 }
242 }
Dianne Hackborn231cc602009-04-27 17:10:36 -0700243}