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: + * + * 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;