Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d3fbb89a authored by Stefan Niedermann's avatar Stefan Niedermann
Browse files

Fix #989 -️️ Display confirm dialog when deleting an account with unsynchronized changes

parent 38909fde
Loading
Loading
Loading
Loading
+34 −12
Original line number Diff line number Diff line
@@ -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);
+4 −2
Original line number Diff line number Diff line
@@ -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
+3 −0
Original line number Diff line number Diff line
@@ -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);
}
+8 −0
Original line number Diff line number Diff line
@@ -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>
+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