From 98e9e855438405cf5b760495a74cdf6e66e8b297 Mon Sep 17 00:00:00 2001 From: Fyodor Kupolov Date: Fri, 9 Dec 2016 14:58:05 -0800 Subject: [PATCH] Always delete from CE table in removeAccountInternal Test: AMSTest passes Bug: 32660831 Change-Id: Iad40bf151f885a86eb6b4e074e9ec83159277e47 --- .../server/accounts/AccountManagerService.java | 17 ++++++++++------- .../com/android/server/accounts/AccountsDb.java | 2 +- .../accounts/AccountManagerServiceTest.java | 4 ++-- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index 8fd1d2f163ff8..c65aed7565f37 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -2136,14 +2136,17 @@ public class AccountManagerService try { accountId = accounts.accountsDb.findDeAccountId(account); if (accountId >= 0) { - accounts.accountsDb.deleteDeAccount(accountId); - if (userUnlocked) { - // Delete from CE table - accounts.accountsDb.deleteCeAccount(accountId); - } - accounts.accountsDb.setTransactionSuccessful(); - isChanged = true; + isChanged = accounts.accountsDb.deleteDeAccount(accountId); } + // always delete from CE table if CE storage is available + // DE account could be removed while CE was locked + if (userUnlocked) { + long ceAccountId = accounts.accountsDb.findCeAccountId(account); + if (ceAccountId >= 0) { + accounts.accountsDb.deleteCeAccount(ceAccountId); + } + } + accounts.accountsDb.setTransactionSuccessful(); } finally { accounts.accountsDb.endTransaction(); } diff --git a/services/core/java/com/android/server/accounts/AccountsDb.java b/services/core/java/com/android/server/accounts/AccountsDb.java index a160b3a2ea470..5ca74711ddbbc 100644 --- a/services/core/java/com/android/server/accounts/AccountsDb.java +++ b/services/core/java/com/android/server/accounts/AccountsDb.java @@ -1201,7 +1201,7 @@ class AccountsDb implements AutoCloseable { } boolean deleteCeAccount(long accountId) { - SQLiteDatabase db = mDeDatabase.getReadableDatabaseUserIsUnlocked(); + SQLiteDatabase db = mDeDatabase.getWritableDatabaseUserIsUnlocked(); return db.delete( CE_TABLE_ACCOUNTS, ACCOUNTS_ID + "=" + accountId, null) > 0; } diff --git a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java index 9c241d759a3eb..c74cda66abdcc 100644 --- a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java @@ -254,11 +254,11 @@ public class AccountManagerServiceTest extends AndroidTestCase { // Unlock the user and verify that db has been updated ams2.onUserUnlocked(newIntentForUser(UserHandle.USER_SYSTEM)); - accountsNumber = readNumberOfAccountsFromDbFile(originalContext, ceDatabaseName); - assertEquals("CE database should now have 1 account", 2, accountsNumber); accounts = ams2.getAccounts(UserHandle.USER_SYSTEM, mContext.getOpPackageName()); assertEquals(1, accounts.length); assertEquals("Only a2 should be returned", a2, accounts[0]); + accountsNumber = readNumberOfAccountsFromDbFile(originalContext, ceDatabaseName); + assertEquals("CE database should now have 1 account", 1, accountsNumber); } @SmallTest