summaryrefslogtreecommitdiffstats
path: root/core/java/android/accounts/AccountManagerService.java
diff options
context:
space:
mode:
authorAmith Yamasani <yamasani@google.com>2012-04-05 18:29:52 -0700
committerAmith Yamasani <yamasani@google.com>2012-04-11 10:29:18 -0700
commitf29f2369cf4e1de090c985ed53d3f5e59535986a (patch)
treebc5523343e49a6333a4648111a495eab5588a05c /core/java/android/accounts/AccountManagerService.java
parentd3ce6f50c114f58a3f50e44764e9b315ac41f637 (diff)
downloadframeworks_base-f29f2369cf4e1de090c985ed53d3f5e59535986a.zip
frameworks_base-f29f2369cf4e1de090c985ed53d3f5e59535986a.tar.gz
frameworks_base-f29f2369cf4e1de090c985ed53d3f5e59535986a.tar.bz2
Fix a race condition in SyncManager.onAccountsUpdated()
Get the full list of accounts from AccountManagerService in one shot instead of getting them per user. Bug: 6263091 Change-Id: I488f24749a96281ef1e2a620820399c97f471024
Diffstat (limited to 'core/java/android/accounts/AccountManagerService.java')
-rw-r--r--core/java/android/accounts/AccountManagerService.java25
1 files changed, 25 insertions, 0 deletions
diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java
index 197c1bd..241fecb 100644
--- a/core/java/android/accounts/AccountManagerService.java
+++ b/core/java/android/accounts/AccountManagerService.java
@@ -1488,6 +1488,31 @@ public class AccountManagerService
}
}
+ /**
+ * Returns all the accounts qualified by user.
+ * @hide
+ */
+ public AccountAndUser[] getAllAccounts() {
+ ArrayList<AccountAndUser> allAccounts = new ArrayList<AccountAndUser>();
+ List<UserInfo> users = getAllUsers();
+ if (users == null) return new AccountAndUser[0];
+
+ synchronized(mUsers) {
+ for (UserInfo user : users) {
+ UserAccounts userAccounts = getUserAccounts(user.id);
+ if (userAccounts == null) continue;
+ synchronized (userAccounts.cacheLock) {
+ Account[] accounts = getAccountsFromCacheLocked(userAccounts, null);
+ for (int a = 0; a < accounts.length; a++) {
+ allAccounts.add(new AccountAndUser(accounts[a], user.id));
+ }
+ }
+ }
+ }
+ AccountAndUser[] accountsArray = new AccountAndUser[allAccounts.size()];
+ return allAccounts.toArray(accountsArray);
+ }
+
public Account[] getAccounts(String type) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "getAccounts: accountType " + type