add sync polling

- added the ability to specify that a sync (of account/authority/extras)
  should occur at a given frequency
- the existing daily poll code was replaced with seeding each
  account/authority with a 24 hour periodic sync
- enhanced the "adb shell dumpsys content" output to show the
  periodic syncs and when they will next run
diff --git a/core/java/android/content/SyncStatusInfo.java b/core/java/android/content/SyncStatusInfo.java
index b8fda03..bb2b2da 100644
--- a/core/java/android/content/SyncStatusInfo.java
+++ b/core/java/android/content/SyncStatusInfo.java
@@ -20,10 +20,12 @@
 import android.os.Parcelable;
 import android.util.Log;
 
+import java.util.ArrayList;
+
 /** @hide */
 public class SyncStatusInfo implements Parcelable {
-    static final int VERSION = 1;
-    
+    static final int VERSION = 2;
+
     public final int authorityId;
     public long totalElapsedTime;
     public int numSyncs;
@@ -31,6 +33,7 @@
     public int numSourceServer;
     public int numSourceLocal;
     public int numSourceUser;
+    public int numSourcePeriodic;
     public long lastSuccessTime;
     public int lastSuccessSource;
     public long lastFailureTime;
@@ -39,7 +42,10 @@
     public long initialFailureTime;
     public boolean pending;
     public boolean initialize;
-    
+    public ArrayList<Long> periodicSyncTimes;
+
+    private static final String TAG = "Sync";
+
     SyncStatusInfo(int authorityId) {
         this.authorityId = authorityId;
     }
@@ -50,10 +56,11 @@
                 return Integer.parseInt(lastFailureMesg);
             }
         } catch (NumberFormatException e) {
+            Log.d(TAG, "error parsing lastFailureMesg of " + lastFailureMesg, e);
         }
         return def;
     }
-    
+
     public int describeContents() {
         return 0;
     }
@@ -75,11 +82,19 @@
         parcel.writeLong(initialFailureTime);
         parcel.writeInt(pending ? 1 : 0);
         parcel.writeInt(initialize ? 1 : 0);
+        if (periodicSyncTimes != null) {
+            parcel.writeInt(periodicSyncTimes.size());
+            for (long periodicSyncTime : periodicSyncTimes) {
+                parcel.writeLong(periodicSyncTime);
+            }
+        } else {
+            parcel.writeInt(-1);
+        }
     }
 
     SyncStatusInfo(Parcel parcel) {
         int version = parcel.readInt();
-        if (version != VERSION) {
+        if (version != VERSION && version != 1) {
             Log.w("SyncStatusInfo", "Unknown version: " + version);
         }
         authorityId = parcel.readInt();
@@ -97,8 +112,51 @@
         initialFailureTime = parcel.readLong();
         pending = parcel.readInt() != 0;
         initialize = parcel.readInt() != 0;
+        if (version == 1) {
+            periodicSyncTimes = null;
+        } else {
+            int N = parcel.readInt();
+            if (N < 0) {
+                periodicSyncTimes = null;
+            } else {
+                periodicSyncTimes = new ArrayList<Long>();
+                for (int i=0; i<N; i++) {
+                    periodicSyncTimes.add(parcel.readLong());
+                }
+            }
+        }
     }
-    
+
+    public void setPeriodicSyncTime(int index, long when) {
+        ensurePeriodicSyncTimeSize(index);
+        periodicSyncTimes.set(index, when);
+    }
+
+    private void ensurePeriodicSyncTimeSize(int index) {
+        if (periodicSyncTimes == null) {
+            periodicSyncTimes = new ArrayList<Long>(0);
+        }
+
+        final int requiredSize = index + 1;
+        if (periodicSyncTimes.size() < requiredSize) {
+            for (int i = periodicSyncTimes.size(); i < requiredSize; i++) {
+                periodicSyncTimes.add((long) 0);
+            }
+        }
+    }
+
+    public long getPeriodicSyncTime(int index) {
+        if (periodicSyncTimes == null || periodicSyncTimes.size() < (index + 1)) {
+            return 0;
+        }
+        return periodicSyncTimes.get(index);
+    }
+
+    public void removePeriodicSyncTime(int index) {
+        ensurePeriodicSyncTimeSize(index);
+        periodicSyncTimes.remove(index);
+    }
+
     public static final Creator<SyncStatusInfo> CREATOR = new Creator<SyncStatusInfo>() {
         public SyncStatusInfo createFromParcel(Parcel in) {
             return new SyncStatusInfo(in);