From a60550e0eb08e0239d1fcea261b37ba592a35ba4 Mon Sep 17 00:00:00 2001 From: Yu Ping Hu Date: Mon, 25 Nov 2013 10:02:34 -0800 Subject: [PATCH] Fix account deletion when removing security policies. - Delete accounts, not just account data. - Wait for PIM data to get deleted before proceeding. - Reconcile after deleting an account. Bug: 11856902 Change-Id: Ie52b7c583688bf48a33bcf6b4e555b8c055b476c --- .../com/android/emailcommon/service/EmailServiceProxy.java | 4 ++++ src/com/android/email/SecurityPolicy.java | 4 +++- src/com/android/email/provider/EmailProvider.java | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/emailcommon/src/com/android/emailcommon/service/EmailServiceProxy.java b/emailcommon/src/com/android/emailcommon/service/EmailServiceProxy.java index f2173c327..8e3575ec1 100644 --- a/emailcommon/src/com/android/emailcommon/service/EmailServiceProxy.java +++ b/emailcommon/src/com/android/emailcommon/service/EmailServiceProxy.java @@ -375,6 +375,10 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService { mService.deleteAccountPIMData(emailAddress); } }, "deleteAccountPIMData"); + // This can be called when deleting accounts. After making this call, the caller will + // ask for account reconciliation, which will kill the processes. We wait for completion + // to avoid the race. + waitForCompletion(); } /** diff --git a/src/com/android/email/SecurityPolicy.java b/src/com/android/email/SecurityPolicy.java index fa63c840b..de1b31dfa 100644 --- a/src/com/android/email/SecurityPolicy.java +++ b/src/com/android/email/SecurityPolicy.java @@ -32,6 +32,7 @@ import android.net.Uri; import android.os.Bundle; import android.os.RemoteException; +import com.android.email.provider.AccountReconciler; import com.android.email.provider.EmailProvider; import com.android.email.service.EmailBroadcastProcessorService; import com.android.email.service.EmailServiceUtils; @@ -699,13 +700,14 @@ public class SecurityPolicy { " secured account(s)"); while (c.moveToNext()) { long accountId = c.getLong(EmailContent.ID_PROJECTION_COLUMN); - Uri uri = EmailProvider.uiUri("uiaccountdata", accountId); + Uri uri = EmailProvider.uiUri("uiaccount", accountId); cr.delete(uri, null, null); } } finally { c.close(); } policiesUpdated(); + AccountReconciler.reconcileAccounts(context); } /** diff --git a/src/com/android/email/provider/EmailProvider.java b/src/com/android/email/provider/EmailProvider.java index 972698f05..e0523f16f 100644 --- a/src/com/android/email/provider/EmailProvider.java +++ b/src/com/android/email/provider/EmailProvider.java @@ -5499,6 +5499,8 @@ public class EmailProvider extends ContentProvider { AccountBackupRestore.backup(context); SecurityPolicy.getInstance(context).reducePolicies(); MailActivityEmail.setServicesEnabledSync(context); + // TODO: We ought to reconcile accounts here, but some callers do this in a loop, + // which would be a problem when the first account reconciliation shuts us down. return 1; } catch (Exception e) { LogUtils.w(Logging.LOG_TAG, "Exception while deleting account", e);