diff --git a/core/java/android/content/SyncInfo.java b/core/java/android/content/SyncInfo.java index 0284882963c72..cffc653e44ef7 100644 --- a/core/java/android/content/SyncInfo.java +++ b/core/java/android/content/SyncInfo.java @@ -54,6 +54,14 @@ public class SyncInfo implements Parcelable { this.startTime = startTime; } + /** @hide */ + public SyncInfo(SyncInfo other) { + this.authorityId = other.authorityId; + this.account = new Account(other.account.name, other.account.type); + this.authority = other.authority; + this.startTime = other.startTime; + } + /** @hide */ public int describeContents() { return 0; diff --git a/services/java/com/android/server/content/ContentService.java b/services/java/com/android/server/content/ContentService.java index cb35ef11c6f6d..023bf2b206140 100644 --- a/services/java/com/android/server/content/ContentService.java +++ b/services/java/com/android/server/content/ContentService.java @@ -660,7 +660,7 @@ public final class ContentService extends IContentService.Stub { int userId = UserHandle.getCallingUserId(); long identityToken = clearCallingIdentity(); try { - return getSyncManager().getSyncStorageEngine().getCurrentSyncs(userId); + return getSyncManager().getSyncStorageEngine().getCurrentSyncsCopy(userId); } finally { restoreCallingIdentity(identityToken); } diff --git a/services/java/com/android/server/content/SyncStorageEngine.java b/services/java/com/android/server/content/SyncStorageEngine.java index 41ef22959be52..5ebf9ea9ba5ea 100644 --- a/services/java/com/android/server/content/SyncStorageEngine.java +++ b/services/java/com/android/server/content/SyncStorageEngine.java @@ -1295,20 +1295,40 @@ public class SyncStorageEngine extends Handler { } /** - * Return a list of the currently active syncs. Note that the returned items are the - * real, live active sync objects, so be careful what you do with it. + * Return a list of the currently active syncs. Note that the returned + * items are the real, live active sync objects, so be careful what you do + * with it. */ - public List getCurrentSyncs(int userId) { + private List getCurrentSyncs(int userId) { synchronized (mAuthorities) { - ArrayList syncs = mCurrentSyncs.get(userId); - if (syncs == null) { - syncs = new ArrayList(); - mCurrentSyncs.put(userId, syncs); - } - return syncs; + return getCurrentSyncsLocked(userId); } } + /** + * @return a copy of the current syncs data structure. Will not return + * null. + */ + public List getCurrentSyncsCopy(int userId) { + synchronized (mAuthorities) { + final List syncs = getCurrentSyncsLocked(userId); + final List syncsCopy = new ArrayList(); + for (SyncInfo sync : syncs) { + syncsCopy.add(new SyncInfo(sync)); + } + return syncsCopy; + } + } + + private List getCurrentSyncsLocked(int userId) { + ArrayList syncs = mCurrentSyncs.get(userId); + if (syncs == null) { + syncs = new ArrayList(); + mCurrentSyncs.put(userId, syncs); + } + return syncs; + } + /** * Return an array of the current sync status for all authorities. Note * that the objects inside the array are the real, live status objects,