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); }