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

Commit 38909fde authored by Stefan Niedermann's avatar Stefan Niedermann
Browse files

Improve handling of account deletions

parent c9b4e198
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -267,9 +267,9 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A
                    .apply(RequestOptions.circleCropTransform())
                    .into(activityBinding.launchAccountSwitcher);

            mainViewModel.synchronizeNotes(nextAccount, new IResponseCallback() {
            mainViewModel.synchronizeNotes(nextAccount, new IResponseCallback<Void>() {
                @Override
                public void onSuccess() {
                public void onSuccess(Void v) {
                    Log.d(TAG, "Successfully synchronized notes for " + nextAccount.getAccountName());
                }

@@ -309,9 +309,9 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A
        final LiveData<Account> accountLiveData = mainViewModel.getCurrentAccount();
        accountLiveData.observe(this, (currentAccount) -> {
            accountLiveData.removeObservers(this);
            mainViewModel.synchronizeNotes(currentAccount, new IResponseCallback() {
            mainViewModel.synchronizeNotes(currentAccount, new IResponseCallback<Void>() {
                @Override
                public void onSuccess() {
                public void onSuccess(Void v) {
                    Log.d(TAG, "Successfully synchronized notes for " + currentAccount.getAccountName());
                }

@@ -428,9 +428,9 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A
            final LiveData<Account> syncLiveData = mainViewModel.getCurrentAccount();
            final Observer<Account> syncObserver = currentAccount -> {
                syncLiveData.removeObservers(this);
                mainViewModel.synchronizeCapabilitiesAndNotes(currentAccount, new IResponseCallback() {
                mainViewModel.synchronizeCapabilitiesAndNotes(currentAccount, new IResponseCallback<Void>() {
                    @Override
                    public void onSuccess() {
                    public void onSuccess(Void v) {
                        Log.d(TAG, "Successfully synchronized capabilities and notes for " + currentAccount.getAccountName());
                    }

@@ -633,6 +633,7 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A
                                final Capabilities capabilities = CapabilitiesClient.getCapabilities(getApplicationContext(), ssoAccount, null);
                                LiveData<Account> createLiveData = mainViewModel.addAccount(ssoAccount.url, ssoAccount.userId, ssoAccount.name, capabilities);
                                runOnUiThread(() -> createLiveData.observe(this, (account) -> {
                                    createLiveData.removeObservers(this);
                                    new Thread(() -> {
                                        Log.i(TAG, capabilities.toString());
                                        final Account a = mainViewModel.getLocalAccountByAccountName(ssoAccount.name);
+8 −8
Original line number Diff line number Diff line
@@ -369,11 +369,11 @@ public class MainViewModel extends AndroidViewModel {
        return items;
    }

    public void synchronizeCapabilitiesAndNotes(@NonNull Account localAccount, @NonNull IResponseCallback callback) {
    public void synchronizeCapabilitiesAndNotes(@NonNull Account localAccount, @NonNull IResponseCallback<Void> callback) {
        Log.i(TAG, "[synchronizeCapabilitiesAndNotes] Synchronize capabilities for " + localAccount.getAccountName());
        synchronizeCapabilities(localAccount, new IResponseCallback() {
        synchronizeCapabilities(localAccount, new IResponseCallback<Void>() {
            @Override
            public void onSuccess() {
            public void onSuccess(Void v) {
                Log.i(TAG, "[synchronizeCapabilitiesAndNotes] Synchronize notes for " + localAccount.getAccountName());
                synchronizeNotes(localAccount, callback);
            }
@@ -388,7 +388,7 @@ public class MainViewModel extends AndroidViewModel {
    /**
     * Updates the network status if necessary and pulls the latest {@link Capabilities} of the given {@param localAccount}
     */
    public void synchronizeCapabilities(@NonNull Account localAccount, @NonNull IResponseCallback callback) {
    public void synchronizeCapabilities(@NonNull Account localAccount, @NonNull IResponseCallback<Void> callback) {
        new Thread(() -> {
            final NotesServerSyncHelper syncHelper = db.getNoteServerSyncHelper();
            if (!syncHelper.isSyncPossible()) {
@@ -403,14 +403,14 @@ public class MainViewModel extends AndroidViewModel {
                    localAccount.setTextColor(capabilities.getTextColor());
                    BrandingUtil.saveBrandColors(getApplication(), localAccount.getColor(), localAccount.getTextColor());
                    db.updateApiVersion(localAccount.getId(), capabilities.getApiVersion());
                    callback.onSuccess();
                    callback.onSuccess(null);
                } catch (NextcloudFilesAppAccountNotFoundException e) {
                    db.getAccountDao().deleteAccount(localAccount);
                    callback.onError(e);
                } catch (Exception e) {
                    if (e instanceof NextcloudHttpRequestFailedException && ((NextcloudHttpRequestFailedException) e).getStatusCode() == HttpURLConnection.HTTP_NOT_MODIFIED) {
                        Log.i(TAG, "[synchronizeCapabilities] Capabilities not modified.");
                        callback.onSuccess();
                        callback.onSuccess(null);
                    } else {
                        callback.onError(e);
                    }
@@ -428,7 +428,7 @@ public class MainViewModel extends AndroidViewModel {
    /**
     * Updates the network status if necessary and pulls the latest notes of the given {@param localAccount}
     */
    public void synchronizeNotes(@NonNull Account currentAccount, @NonNull IResponseCallback callback) {
    public void synchronizeNotes(@NonNull Account currentAccount, @NonNull IResponseCallback<Void> callback) {
        new Thread(() -> {
            Log.v(TAG, "[synchronize] - currentAccount: " + currentAccount.getAccountName());
            final NotesServerSyncHelper syncHelper = db.getNoteServerSyncHelper();
@@ -437,7 +437,7 @@ public class MainViewModel extends AndroidViewModel {
            }
            if (syncHelper.isSyncPossible()) {
                syncHelper.scheduleSync(currentAccount, false);
                callback.onSuccess();
                callback.onSuccess(null);
            } else { // Sync is not possible
                if (syncHelper.isNetworkConnected() && syncHelper.isSyncOnlyOnWifi()) {
                    callback.onError(new IntendedOfflineException("Network is connected, but sync is not possible."));
+3 −14
Original line number Diff line number Diff line
@@ -22,10 +22,10 @@ public class ManageAccountAdapter extends RecyclerView.Adapter<ManageAccountView
    private final List<Account> localAccounts = new ArrayList<>();
    @NonNull
    private final Consumer<Account> onAccountClick;
    @Nullable
    @NonNull
    private final Consumer<Account> onAccountDelete;

    public ManageAccountAdapter(@NonNull Consumer<Account> onAccountClick, @Nullable Consumer<Account> onAccountDelete) {
    public ManageAccountAdapter(@NonNull Consumer<Account> onAccountClick, @NonNull Consumer<Account> onAccountDelete) {
        this.onAccountClick = onAccountClick;
        this.onAccountDelete = onAccountDelete;
        setHasStableIds(true);
@@ -48,18 +48,7 @@ public class ManageAccountAdapter extends RecyclerView.Adapter<ManageAccountView
        holder.bind(localAccount, (localAccountClicked) -> {
            setCurrentLocalAccount(localAccountClicked);
            onAccountClick.accept(localAccountClicked);
        }, (localAccountToDelete -> {
            if (onAccountDelete != null) {
                for (int i = 0; i < localAccounts.size(); i++) {
                    if (localAccounts.get(i).getId() == localAccountToDelete.getId()) {
                        localAccounts.remove(i);
                        notifyItemRemoved(i);
                        break;
                    }
                }
                onAccountDelete.accept(localAccountToDelete);
            }
        }), currentLocalAccount != null && currentLocalAccount.getId() == localAccount.getId());
        }, onAccountDelete, currentLocalAccount != null && currentLocalAccount.getId() == localAccount.getId());
    }

    @Override
+1 −1
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ import static it.niedermann.owncloud.notes.branding.BrandingUtil.applyBrandToLay

public class ManageAccountViewHolder extends RecyclerView.ViewHolder {

    private ItemAccountChooseBinding binding;
    private final ItemAccountChooseBinding binding;

    public ManageAccountViewHolder(@NonNull View itemView) {
        super(itemView);
+29 −38
Original line number Diff line number Diff line
@@ -2,24 +2,22 @@ package it.niedermann.owncloud.notes.manageaccounts;

import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.ViewModelProvider;

import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException;
import com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException;
import com.nextcloud.android.sso.helper.SingleAccountHelper;
import com.nextcloud.android.sso.model.SingleSignOnAccount;

import it.niedermann.owncloud.notes.LockedActivity;
import it.niedermann.owncloud.notes.databinding.ActivityManageAccountsBinding;
import it.niedermann.owncloud.notes.persistence.NotesDatabase;
import it.niedermann.owncloud.notes.persistence.entity.Account;

import static androidx.lifecycle.Transformations.distinctUntilChanged;
import it.niedermann.owncloud.notes.shared.model.IResponseCallback;

public class ManageAccountsActivity extends LockedActivity {

    private ActivityManageAccountsBinding binding;
    private ManageAccountsViewModel viewModel;
    private ManageAccountAdapter adapter;
    private NotesDatabase db = null;

@@ -28,45 +26,38 @@ public class ManageAccountsActivity extends LockedActivity {
        super.onCreate(savedInstanceState);

        binding = ActivityManageAccountsBinding.inflate(getLayoutInflater());
        viewModel = new ViewModelProvider(this).get(ManageAccountsViewModel.class);
        setContentView(binding.getRoot());

        setSupportActionBar(binding.toolbar);

        db = NotesDatabase.getInstance(this);

        distinctUntilChanged(db.getAccountDao().getAccounts$()).observe(this, (localAccounts) -> {
            adapter = new ManageAccountAdapter((localAccount) -> SingleAccountHelper.setCurrentAccount(getApplicationContext(), localAccount.getAccountName()), (localAccount) -> {
                LiveData<Void> deleteLiveData = db.deleteAccount(localAccount);
                deleteLiveData.observe(this, (v) -> {
                    for (Account temp : localAccounts) {
                        if (temp.getId() == localAccount.getId()) {
                            localAccounts.remove(temp);
                            break;
                        }
                    }
                    if (localAccounts.size() > 0) {
                        SingleAccountHelper.setCurrentAccount(getApplicationContext(), localAccounts.get(0).getAccountName());
                        adapter.setCurrentLocalAccount(localAccounts.get(0));
                    } else {
                        SingleAccountHelper.setCurrentAccount(getApplicationContext(), null);
        adapter = new ManageAccountAdapter(
                (accountToSelect) -> viewModel.selectAccount(accountToSelect, this),
                (accountToDelete) -> viewModel.deleteAccount(accountToDelete, this)
        );

        binding.accounts.setAdapter(adapter);

        viewModel.getAccounts$().observe(this, (accounts) -> {
            if (accounts == null || accounts.size() < 1) {
                finish();
                return;
            }
                    deleteLiveData.removeObservers(this);
                });
            });
            adapter.setLocalAccounts(localAccounts);
            try {
                final SingleSignOnAccount ssoAccount = SingleAccountHelper.getCurrentSingleSignOnAccount(this);
                if (ssoAccount != null) {
                    new Thread(() -> {
                        final Account account = db.getAccountDao().getAccountByName(ssoAccount.name);
                        runOnUiThread(() -> adapter.setCurrentLocalAccount(account));
                    }).start();
            this.adapter.setLocalAccounts(accounts);
            viewModel.getCurrentAccount(this, new IResponseCallback<Account>() {
                @Override
                public void onSuccess(Account result) {
                    runOnUiThread(() -> adapter.setCurrentLocalAccount(result));
                }
            } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) {
                e.printStackTrace();

                @Override
                public void onError(@NonNull Throwable t) {
                    runOnUiThread(() -> adapter.setCurrentLocalAccount(null));
                    t.printStackTrace();
                }
            binding.accounts.setAdapter(adapter);
            });
        });
    }

Loading