diff options
author | Stefan Niedermann <info@niedermann.it> | 2021-04-24 13:39:04 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2021-04-24 13:39:04 +0300 |
commit | d3fbb89a9e7833f7efe6bc3c2ea12a40e42b0d8d (patch) | |
tree | d50c22007da15abee489839467f5c893ddfa5c92 | |
parent | 38909fde268119d22fcc7021ef733e5bd2776168 (diff) |
Fix #989 -️️ Display confirm dialog when deleting an account with unsynchronized changes
5 files changed, 50 insertions, 14 deletions
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsActivity.java index 5e230a74..4c307b07 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsActivity.java @@ -6,11 +6,11 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; -import com.nextcloud.android.sso.helper.SingleAccountHelper; - import it.niedermann.owncloud.notes.LockedActivity; +import it.niedermann.owncloud.notes.R; +import it.niedermann.owncloud.notes.branding.BrandedDeleteAlertDialogBuilder; import it.niedermann.owncloud.notes.databinding.ActivityManageAccountsBinding; -import it.niedermann.owncloud.notes.persistence.NotesDatabase; +import it.niedermann.owncloud.notes.exception.ExceptionDialogFragment; import it.niedermann.owncloud.notes.persistence.entity.Account; import it.niedermann.owncloud.notes.shared.model.IResponseCallback; @@ -19,7 +19,6 @@ public class ManageAccountsActivity extends LockedActivity { private ActivityManageAccountsBinding binding; private ManageAccountsViewModel viewModel; private ManageAccountAdapter adapter; - private NotesDatabase db = null; @Override public void onCreate(@Nullable Bundle savedInstanceState) { @@ -27,17 +26,11 @@ public class ManageAccountsActivity extends LockedActivity { binding = ActivityManageAccountsBinding.inflate(getLayoutInflater()); viewModel = new ViewModelProvider(this).get(ManageAccountsViewModel.class); - setContentView(binding.getRoot()); + setContentView(binding.getRoot()); setSupportActionBar(binding.toolbar); - db = NotesDatabase.getInstance(this); - - adapter = new ManageAccountAdapter( - (accountToSelect) -> viewModel.selectAccount(accountToSelect, this), - (accountToDelete) -> viewModel.deleteAccount(accountToDelete, this) - ); - + adapter = new ManageAccountAdapter(this::selectAccount, this::deleteAccount); binding.accounts.setAdapter(adapter); viewModel.getAccounts$().observe(this, (accounts) -> { @@ -61,6 +54,35 @@ public class ManageAccountsActivity extends LockedActivity { }); } + private void selectAccount(@NonNull Account accountToSelect) { + viewModel.selectAccount(accountToSelect, this); + } + + private void deleteAccount(@NonNull Account accountToDelete) { + viewModel.countUnsynchronizedNotes(accountToDelete.getId(), new IResponseCallback<Long>() { + @Override + public void onSuccess(Long unsynchronizedChangesCount) { + runOnUiThread(() -> { + if (unsynchronizedChangesCount != null && unsynchronizedChangesCount > 0) { + new BrandedDeleteAlertDialogBuilder(ManageAccountsActivity.this) + .setTitle(getString(R.string.remove_account, accountToDelete.getUserName())) + .setMessage(getResources().getQuantityString(R.plurals.remove_account_message, (int) unsynchronizedChangesCount.longValue(), accountToDelete.getAccountName(), unsynchronizedChangesCount)) + .setNeutralButton(android.R.string.cancel, null) + .setPositiveButton(R.string.simple_remove, (d, l) -> viewModel.deleteAccount(accountToDelete, ManageAccountsActivity.this)) + .show(); + } else { + viewModel.deleteAccount(accountToDelete, ManageAccountsActivity.this); + } + }); + } + + @Override + public void onError(@NonNull Throwable t) { + ExceptionDialogFragment.newInstance(t).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName()); + } + }); + } + @Override public void applyBrand(int mainColor, int textColor) { applyBrandToPrimaryToolbar(binding.appBar, binding.toolbar); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsViewModel.java b/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsViewModel.java index b86b6fac..3e7e430a 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsViewModel.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsViewModel.java @@ -8,7 +8,6 @@ import androidx.annotation.Nullable; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; -import com.nextcloud.android.sso.AccountImporter; import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException; import com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException; import com.nextcloud.android.sso.helper.SingleAccountHelper; @@ -16,7 +15,6 @@ import com.nextcloud.android.sso.helper.SingleAccountHelper; import java.util.List; import it.niedermann.owncloud.notes.persistence.NotesDatabase; -import it.niedermann.owncloud.notes.persistence.SSOClient; import it.niedermann.owncloud.notes.persistence.entity.Account; import it.niedermann.owncloud.notes.shared.model.IResponseCallback; @@ -68,4 +66,8 @@ public class ManageAccountsViewModel extends AndroidViewModel { public void selectAccount(@Nullable Account account, @NonNull Context context) { SingleAccountHelper.setCurrentAccount(context, (account == null) ? null : account.getAccountName()); } + + public void countUnsynchronizedNotes(long accountId, @NonNull IResponseCallback<Long> callback) { + new Thread(() -> callback.onSuccess(db.getNoteDao().countUnsynchronizedNotes(accountId))).start(); + } }
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/dao/NoteDao.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/dao/NoteDao.java index b0e93d2c..8cc73bf8 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/dao/NoteDao.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/dao/NoteDao.java @@ -194,4 +194,7 @@ public interface NoteDao { @Query("SELECT accountId, category, COUNT(*) as 'totalNotes' FROM NOTE WHERE STATUS != 'LOCAL_DELETED' AND accountId = :accountId AND category != '' AND category LIKE :searchTerm GROUP BY category") LiveData<List<CategoryWithNotesCount>> searchCategories$(Long accountId, String searchTerm); + + @Query("SELECT COUNT(*) FROM NOTE WHERE STATUS != '' AND accountId = :accountId") + Long countUnsynchronizedNotes(long accountId); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0bf4663e..957c00e0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -13,6 +13,7 @@ <string name="action_sorting_method">Sorting method</string> <string name="simple_cancel">Cancel</string> <string name="simple_edit">Edit</string> + <string name="simple_remove">Remove</string> <string name="action_edit_save">Save</string> <string name="simple_about">About</string> <string name="simple_link">Link</string> @@ -298,4 +299,11 @@ <string name="no_other_accounts">You don\'t have configured any other accounts yet.</string> <string name="choose_account">Choose account</string> <string name="context_based_formatting">Context based formatting popover</string> + + + <plurals name="remove_account_message"> + <item quantity="one">Removing the account %1$s will also delete one unsynchronized change irrecoverable.</item> + <item quantity="other">Removing the account %1$s will also delete %2$d unsynchronized changes irrecoverable.</item> + </plurals> + <string name="remove_account">Remove %1$s</string> </resources> diff --git a/fastlane/metadata/android/en-US/changelogs/3004001.txt b/fastlane/metadata/android/en-US/changelogs/3004001.txt new file mode 100644 index 00000000..7b083e92 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/3004001.txt @@ -0,0 +1 @@ +- ⚠️️ Display confirm dialog when deleting an account with unsynchronized changes (#989)
\ No newline at end of file |