Loading app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsActivity.java +34 −12 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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) { Loading @@ -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) -> { Loading @@ -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); Loading app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsViewModel.java +4 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 app/src/main/java/it/niedermann/owncloud/notes/persistence/dao/NoteDao.java +3 −0 Original line number Diff line number Diff line Loading @@ -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); } app/src/main/res/values/strings.xml +8 −0 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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> fastlane/metadata/android/en-US/changelogs/3004001.txt 0 → 100644 +1 −0 Original line number Diff line number Diff line - ⚠️️ Display confirm dialog when deleting an account with unsynchronized changes (#989) No newline at end of file Loading
app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsActivity.java +34 −12 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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) { Loading @@ -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) -> { Loading @@ -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); Loading
app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsViewModel.java +4 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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
app/src/main/java/it/niedermann/owncloud/notes/persistence/dao/NoteDao.java +3 −0 Original line number Diff line number Diff line Loading @@ -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); }
app/src/main/res/values/strings.xml +8 −0 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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>
fastlane/metadata/android/en-US/changelogs/3004001.txt 0 → 100644 +1 −0 Original line number Diff line number Diff line - ⚠️️ Display confirm dialog when deleting an account with unsynchronized changes (#989) No newline at end of file