diff --git a/api/current.xml b/api/current.xml
index 394a68a10872f..815b9ff2a2245 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -30038,6 +30038,48 @@
>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
CREATOR = new Creator() {
public ActiveSyncInfo createFromParcel(Parcel in) {
return new ActiveSyncInfo(in);
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 29f388ac1beae..1b0ef340a1ccd 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -156,11 +156,8 @@ public abstract class ContentResolver {
/** @hide */
public static final int SYNC_ERROR_INTERNAL = 8;
- /** @hide */
public static final int SYNC_OBSERVER_TYPE_SETTINGS = 1<<0;
- /** @hide */
public static final int SYNC_OBSERVER_TYPE_PENDING = 1<<1;
- /** @hide */
public static final int SYNC_OBSERVER_TYPE_ACTIVE = 1<<2;
/** @hide */
public static final int SYNC_OBSERVER_TYPE_STATUS = 1<<3;
@@ -1183,7 +1180,6 @@ public abstract class ContentResolver {
/**
* If a sync is active returns the information about it, otherwise returns false.
* @return the ActiveSyncInfo for the currently active sync or null if one is not active.
- * @hide
*/
public static ActiveSyncInfo getActiveSync() {
try {
@@ -1222,7 +1218,24 @@ public abstract class ContentResolver {
}
}
+ /**
+ * Request notifications when the different aspects of the SyncManager change. The
+ * different items that can be requested are:
+ *
+ * - {@link #SYNC_OBSERVER_TYPE_PENDING}
+ *
- {@link #SYNC_OBSERVER_TYPE_ACTIVE}
+ *
- {@link #SYNC_OBSERVER_TYPE_SETTINGS}
+ *
+ * The caller can set one or more of the status types in the mask for any
+ * given listener registration.
+ * @param mask the status change types that will cause the callback to be invoked
+ * @param callback observer to be invoked when the status changes
+ * @return a handle that can be used to remove the listener at a later time
+ */
public static Object addStatusChangeListener(int mask, final SyncStatusObserver callback) {
+ if (callback == null) {
+ throw new IllegalArgumentException("you passed in a null callback");
+ }
try {
ISyncStatusObserver.Stub observer = new ISyncStatusObserver.Stub() {
public void onStatusChanged(int which) throws RemoteException {
@@ -1236,7 +1249,14 @@ public abstract class ContentResolver {
}
}
+ /**
+ * Remove a previously registered status change listener.
+ * @param handle the handle that was returned by {@link #addStatusChangeListener}
+ */
public static void removeStatusChangeListener(Object handle) {
+ if (handle == null) {
+ throw new IllegalArgumentException("you passed in a null handle");
+ }
try {
getContentService().removeStatusChangeListener((ISyncStatusObserver.Stub) handle);
} catch (RemoteException e) {
diff --git a/core/java/android/content/ContentService.java b/core/java/android/content/ContentService.java
index e0dfab59ee221..b5a78fa95c712 100644
--- a/core/java/android/content/ContentService.java
+++ b/core/java/android/content/ContentService.java
@@ -437,7 +437,7 @@ public final class ContentService extends IContentService.Stub {
long identityToken = clearCallingIdentity();
try {
SyncManager syncManager = getSyncManager();
- if (syncManager != null) {
+ if (syncManager != null && callback != null) {
syncManager.getSyncStorageEngine().addStatusChangeListener(mask, callback);
}
} finally {
@@ -449,7 +449,7 @@ public final class ContentService extends IContentService.Stub {
long identityToken = clearCallingIdentity();
try {
SyncManager syncManager = getSyncManager();
- if (syncManager != null) {
+ if (syncManager != null && callback != null) {
syncManager.getSyncStorageEngine().removeStatusChangeListener(callback);
}
} finally {
diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java
index 317e5a9beb71c..393bbba17e1d3 100644
--- a/core/java/android/content/SyncManager.java
+++ b/core/java/android/content/SyncManager.java
@@ -982,8 +982,8 @@ public class SyncManager implements OnAccountsUpdateListener {
ActiveSyncInfo active = mSyncStorageEngine.getActiveSync();
if (active != null) {
SyncStorageEngine.AuthorityInfo authority
- = mSyncStorageEngine.getAuthority(active.authorityId);
- final long durationInSeconds = (now - active.startTime) / 1000;
+ = mSyncStorageEngine.getAuthority(active.getAuthorityId());
+ final long durationInSeconds = (now - active.getStartTime()) / 1000;
pw.print("Active sync: ");
pw.print(authority != null ? authority.account : "");
pw.print(" ");
diff --git a/core/java/android/content/SyncStorageEngine.java b/core/java/android/content/SyncStorageEngine.java
index 5aad3af63f73e..240da72c1e884 100644
--- a/core/java/android/content/SyncStorageEngine.java
+++ b/core/java/android/content/SyncStorageEngine.java
@@ -664,7 +664,7 @@ public class SyncStorageEngine extends Handler {
}
if (mActiveSync != null) {
- AuthorityInfo ainfo = getAuthority(mActiveSync.authorityId);
+ AuthorityInfo ainfo = getAuthority(mActiveSync.getAuthorityId());
if (ainfo != null && ainfo.account.equals(account)
&& ainfo.authority.equals(authority)) {
return true;