From a9eba1af4e1a0eb94f6999bba52ac826a4e1829d Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Wed, 3 May 2017 17:53:38 +0100 Subject: [PATCH] Account upgrade: raise an error when account migration fails. Account migration works in most cases, though while testing I managed to get it to fail in some rare occasions. This commit adds a check to verify the number of contacts we thought we migrated is equal to the number of contacts we have after migration. If the check fails, it presents the user with a notification that opens the relevant FAQ entry on the EteSync website. --- .../etesync/syncadapter/AccountSettings.java | 19 +++++++++++++++++-- .../com/etesync/syncadapter/Constants.java | 1 + .../syncadapter/NotificationHelper.java | 3 +++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/etesync/syncadapter/AccountSettings.java b/app/src/main/java/com/etesync/syncadapter/AccountSettings.java index 2449d79e..6f696228 100644 --- a/app/src/main/java/com/etesync/syncadapter/AccountSettings.java +++ b/app/src/main/java/com/etesync/syncadapter/AccountSettings.java @@ -253,6 +253,8 @@ public class AccountSettings { private void updateInner(int fromVersion) throws ContactsStorageException { if (fromVersion < 2) { + long affected = -1; + long newCount = -1; @Cleanup("release") ContentProviderClient provider = context.getContentResolver().acquireContentProviderClient(ContactsContract.AUTHORITY); if (provider == null) // no access to contacts provider @@ -288,14 +290,14 @@ public class AccountSettings { throw new ContactsStorageException("Couldn't create address book account"); LocalAddressBook.setUserData(accountManager, addressBookAccount, account, info.uid); - LocalAddressBook addressBook = new LocalAddressBook(context, addressBookAccount, provider); + LocalAddressBook newAddressBook = new LocalAddressBook(context, addressBookAccount, provider); // move contacts to new address book App.log.info("Moving contacts from " + account + " to " + addressBookAccount); ContentValues newAccount = new ContentValues(2); newAccount.put(ContactsContract.RawContacts.ACCOUNT_NAME, addressBookAccount.name); newAccount.put(ContactsContract.RawContacts.ACCOUNT_TYPE, addressBookAccount.type); - int affected = provider.update(ContactsContract.RawContacts.CONTENT_URI.buildUpon() + affected = provider.update(ContactsContract.RawContacts.CONTENT_URI.buildUpon() .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, account.name) .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, account.type) .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(), @@ -303,6 +305,7 @@ public class AccountSettings { ContactsContract.RawContacts.ACCOUNT_NAME + "=? AND " + ContactsContract.RawContacts.ACCOUNT_TYPE + "=?", new String[]{account.name, account.type}); App.log.info(affected + " contacts moved to new address book"); + newCount = newAddressBook.count(); } ContactsContract.SyncState.set(provider, account, null); @@ -314,6 +317,13 @@ public class AccountSettings { // request sync of new address book account ContentResolver.setIsSyncable(account, App.getAddressBooksAuthority(), 1); setSyncInterval(App.getAddressBooksAuthority(), Constants.DEFAULT_SYNC_INTERVAL); + + // Error handling + if ((affected != -1) && (affected != newCount)) { + NotificationHelper notificationHelper = new NotificationHelper(context, "account-migration", Constants.NOTIFICATION_ACCOUNT_UPDATE); + notificationHelper.setThrowable(new AccountMigrationException("Failed to upgrade account")); + notificationHelper.notify("Account upgrade failed", "upgrading account"); + } } } @@ -337,4 +347,9 @@ public class AccountSettings { } + public static class AccountMigrationException extends Exception { + public AccountMigrationException(String msg) { + super(msg); + } + } } diff --git a/app/src/main/java/com/etesync/syncadapter/Constants.java b/app/src/main/java/com/etesync/syncadapter/Constants.java index fa7b1875..8517481b 100644 --- a/app/src/main/java/com/etesync/syncadapter/Constants.java +++ b/app/src/main/java/com/etesync/syncadapter/Constants.java @@ -21,6 +21,7 @@ public class Constants { NOTIFICATION_CONTACTS_SYNC = 10, NOTIFICATION_CALENDAR_SYNC = 11, NOTIFICATION_TASK_SYNC = 12, + NOTIFICATION_ACCOUNT_UPDATE = 13, NOTIFICATION_PERMISSIONS = 20; public static final Uri webUri = Uri.parse((DEBUG_REMOTE_URL == null) ? "https://www.etesync.com/" : DEBUG_REMOTE_URL); diff --git a/app/src/main/java/com/etesync/syncadapter/NotificationHelper.java b/app/src/main/java/com/etesync/syncadapter/NotificationHelper.java index e165a3d9..3c708a5c 100644 --- a/app/src/main/java/com/etesync/syncadapter/NotificationHelper.java +++ b/app/src/main/java/com/etesync/syncadapter/NotificationHelper.java @@ -98,6 +98,9 @@ public class NotificationHelper { } else if (e instanceof Exceptions.UserInactiveException) { WebViewActivity.openUrl(this, Constants.dashboard); return; + } else if (e instanceof AccountSettings.AccountMigrationException) { + WebViewActivity.openUrl(this, Constants.faqUri.buildUpon().encodedFragment("account-migration-error").build()); + return; } else { detailsIntent = new Intent(this, DebugInfoActivity.class); }