Loading app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java +7 −6 Original line number Diff line number Diff line Loading @@ -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()); } Loading Loading @@ -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()); } Loading Loading @@ -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()); } Loading Loading @@ -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); Loading app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java +8 −8 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -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()) { Loading @@ -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); } Loading @@ -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(); Loading @@ -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.")); Loading app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountAdapter.java +3 −14 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 Loading app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountViewHolder.java +1 −1 Original line number Diff line number Diff line Loading @@ -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); Loading app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsActivity.java +29 −38 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading
app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java +7 −6 Original line number Diff line number Diff line Loading @@ -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()); } Loading Loading @@ -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()); } Loading Loading @@ -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()); } Loading Loading @@ -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); Loading
app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java +8 −8 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -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()) { Loading @@ -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); } Loading @@ -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(); Loading @@ -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.")); Loading
app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountAdapter.java +3 −14 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 Loading
app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountViewHolder.java +1 −1 Original line number Diff line number Diff line Loading @@ -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); Loading
app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsActivity.java +29 −38 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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