diff options
| author | 2016-02-18 19:08:33 +0000 | |
|---|---|---|
| committer | 2016-02-18 19:08:34 +0000 | |
| commit | 62e1f4891773eecbd144d58e05c61562bb46d2eb (patch) | |
| tree | 6c9f60b63d3671207434076861354c388f2ae811 | |
| parent | 5b7188aebc2401c9c010543eff62ef53036c147b (diff) | |
| parent | a666d74d4bc7e1298314c516d1309571fb87c212 (diff) | |
Merge "[Fix extra data in cache]" into nyc-dev
| -rw-r--r-- | services/core/java/com/android/server/accounts/AccountManagerService.java | 90 |
1 files changed, 54 insertions, 36 deletions
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index ca1e3719c037..163b9be2374b 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -660,7 +660,12 @@ public class AccountManagerService long identityToken = clearCallingIdentity(); try { UserAccounts accounts = getUserAccounts(userId); - return readUserDataInternal(accounts, account, key); + synchronized (accounts.cacheLock) { + if (!accountExistsCacheLocked(accounts, account)) { + return null; + } + return readUserDataInternalLocked(accounts, account, key); + } } finally { restoreCallingIdentity(identityToken); } @@ -1716,44 +1721,58 @@ public class AccountManagerService long identityToken = clearCallingIdentity(); try { UserAccounts accounts = getUserAccounts(userId); - setUserdataInternal(accounts, account, key, value); + synchronized (accounts.cacheLock) { + if (!accountExistsCacheLocked(accounts, account)) { + return; + } + setUserdataInternalLocked(accounts, account, key, value); + } } finally { restoreCallingIdentity(identityToken); } } - private void setUserdataInternal(UserAccounts accounts, Account account, String key, + private boolean accountExistsCacheLocked(UserAccounts accounts, Account account) { + if (accounts.accountCache.containsKey(account.type)) { + for (Account acc : getUserAccountsForCaller().accountCache.get(account.type)) { + if (acc.name.equals(account.name)) { + return true; + } + } + } + return false; + } + + private void setUserdataInternalLocked(UserAccounts accounts, Account account, String key, String value) { if (account == null || key == null) { return; } - synchronized (accounts.cacheLock) { - final SQLiteDatabase db = accounts.openHelper.getWritableDatabase(); - db.beginTransaction(); - try { - long accountId = getAccountIdLocked(db, account); - if (accountId < 0) { + final SQLiteDatabase db = accounts.openHelper.getWritableDatabase(); + db.beginTransaction(); + try { + long accountId = getAccountIdLocked(db, account); + if (accountId < 0) { + return; + } + long extrasId = getExtrasIdLocked(db, accountId, key); + if (extrasId < 0) { + extrasId = insertExtraLocked(db, accountId, key, value); + if (extrasId < 0) { return; } - long extrasId = getExtrasIdLocked(db, accountId, key); - if (extrasId < 0 ) { - extrasId = insertExtraLocked(db, accountId, key, value); - if (extrasId < 0) { - return; - } - } else { - ContentValues values = new ContentValues(); - values.put(EXTRAS_VALUE, value); - if (1 != db.update(TABLE_EXTRAS, values, EXTRAS_ID + "=" + extrasId, null)) { - return; - } - + } else { + ContentValues values = new ContentValues(); + values.put(EXTRAS_VALUE, value); + if (1 != db.update(TABLE_EXTRAS, values, EXTRAS_ID + "=" + extrasId, null)) { + return; } - writeUserDataIntoCacheLocked(accounts, db, account, key, value); - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); + } + writeUserDataIntoCacheLocked(accounts, db, account, key, value); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); } } @@ -4788,17 +4807,16 @@ public class AccountManagerService } } - protected String readUserDataInternal(UserAccounts accounts, Account account, String key) { - synchronized (accounts.cacheLock) { - HashMap<String, String> userDataForAccount = accounts.userDataCache.get(account); - if (userDataForAccount == null) { - // need to populate the cache for this account - final SQLiteDatabase db = accounts.openHelper.getReadableDatabase(); - userDataForAccount = readUserDataForAccountFromDatabaseLocked(db, account); - accounts.userDataCache.put(account, userDataForAccount); - } - return userDataForAccount.get(key); + protected String readUserDataInternalLocked( + UserAccounts accounts, Account account, String key) { + HashMap<String, String> userDataForAccount = accounts.userDataCache.get(account); + if (userDataForAccount == null) { + // need to populate the cache for this account + final SQLiteDatabase db = accounts.openHelper.getReadableDatabase(); + userDataForAccount = readUserDataForAccountFromDatabaseLocked(db, account); + accounts.userDataCache.put(account, userDataForAccount); } + return userDataForAccount.get(key); } protected HashMap<String, String> readUserDataForAccountFromDatabaseLocked( |