From afa92b8f3d8f85fe2dde309f8f778926396539ea Mon Sep 17 00:00:00 2001 From: Fred Quintana Date: Tue, 1 Dec 2009 16:27:03 -0800 Subject: [PATCH] remove accounts for authenticators that are uninstalled --- .../accounts/AccountManagerService.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java index 1a8d9b6645bb9..de011539d1229 100644 --- a/core/java/android/accounts/AccountManagerService.java +++ b/core/java/android/accounts/AccountManagerService.java @@ -225,6 +225,35 @@ public class AccountManagerService mSimWatcher = new SimWatcher(mContext); sThis.set(this); + + validateAccounts(); + } + + private void validateAccounts() { + boolean accountDeleted = false; + SQLiteDatabase db = mOpenHelper.getWritableDatabase(); + Cursor cursor = db.query(TABLE_ACCOUNTS, + new String[]{ACCOUNTS_ID, ACCOUNTS_TYPE, ACCOUNTS_NAME}, + null, null, null, null, null); + try { + while (cursor.moveToNext()) { + final long accountId = cursor.getLong(0); + final String accountType = cursor.getString(1); + final String accountName = cursor.getString(2); + if (mAuthenticatorCache.getServiceInfo(AuthenticatorDescription.newKey(accountType)) + == null) { + Log.d(TAG, "deleting account " + accountName + " because type " + + accountType + " no longer has a registered authenticator"); + db.delete(TABLE_ACCOUNTS, ACCOUNTS_ID + "=" + accountId, null); + accountDeleted = true; + } + } + } finally { + cursor.close(); + if (accountDeleted) { + sendAccountsChangedBroadcast(); + } + } } public void onServiceChanged(AuthenticatorDescription desc, boolean removed) {