diff options
author | Stefan Niedermann <info@niedermann.it> | 2021-06-17 20:40:58 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2021-06-17 20:40:58 +0300 |
commit | 398e1d64aed19ae9e04975ede2c3b1c86e3c47e5 (patch) | |
tree | 57ad7a443e9202ef63ee0e24ae8fb9363933d150 /app/src/main | |
parent | 714eee03090deb490c797e1a70293e0cb54c92a3 (diff) |
Use IResponseCallback in favor of observeOnce for importing accounts
Signed-off-by: Stefan Niedermann <info@niedermann.it>
Diffstat (limited to 'app/src/main')
6 files changed, 63 insertions, 95 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java index 89aec9beb..f9723fa27 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java @@ -317,8 +317,18 @@ public class SyncManager { } @AnyThread - public WrappedLiveData<Account> createAccount(@NonNull Account account) { - return dataBaseAdapter.createAccount(account); + public void createAccount(@NonNull Account account, @NonNull IResponseCallback<Account> callback) { + executor.submit(() -> { + try { + final Account createdAccount = dataBaseAdapter.createAccountDirectly(account); + if (createdAccount == null) { + throw new RuntimeException("Created account is null. Source: " + account); + } + callback.onResponse(createdAccount); + } catch (Throwable t) { + callback.onError(t); + } + }); } public boolean hasInternetConnection() { @@ -510,12 +520,12 @@ public class SyncManager { @AnyThread public void createBoard(long accountId, @NonNull Board board, @NonNull IResponseCallback<FullBoard> callback) { executor.submit(() -> { - Account account = dataBaseAdapter.getAccountByIdDirectly(accountId); - User owner = dataBaseAdapter.getUserByUidDirectly(accountId, account.getUserName()); + final Account account = dataBaseAdapter.getAccountByIdDirectly(accountId); + final User owner = dataBaseAdapter.getUserByUidDirectly(accountId, account.getUserName()); if (owner == null) { - callback.onError(new Exception("Owner is null. This can be the case if the Deck app has never before been opened in the webinterface")); + callback.onError(new IllegalStateException("Owner is null. This can be the case if the Deck app has never before been opened in the webinterface")); } else { - FullBoard fullBoard = new FullBoard(); + final FullBoard fullBoard = new FullBoard(); board.setOwnerId(owner.getLocalId()); fullBoard.setOwner(owner); fullBoard.setBoard(board); @@ -720,10 +730,10 @@ public class SyncManager { @AnyThread public void deleteComment(long accountId, long localCardId, long localCommentId, @NonNull IResponseCallback<Void> callback) { executor.submit(() -> { - Account account = dataBaseAdapter.getAccountByIdDirectly(accountId); - Card card = dataBaseAdapter.getCardByLocalIdDirectly(accountId, localCardId); - DeckComment entity = dataBaseAdapter.getCommentByLocalIdDirectly(accountId, localCommentId); - OcsComment commentEntity = OcsComment.of(entity); + final Account account = dataBaseAdapter.getAccountByIdDirectly(accountId); + final Card card = dataBaseAdapter.getCardByLocalIdDirectly(accountId, localCardId); + final DeckComment entity = dataBaseAdapter.getCommentByLocalIdDirectly(accountId, localCommentId); + final OcsComment commentEntity = OcsComment.of(entity); new DataPropagationHelper(serverAdapter, dataBaseAdapter, executor).deleteEntity(new DeckCommentsDataProvider(null, card), commentEntity, ResponseCallback.from(account, callback)); }); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java index eb720e345..703d50730 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java @@ -75,7 +75,6 @@ import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetUser; import it.niedermann.nextcloud.deck.model.widget.filter.dto.FilterWidgetCard; import it.niedermann.nextcloud.deck.model.widget.singlecard.SingleCardWidgetModel; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.LiveDataHelper; -import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.WrappedLiveData; import it.niedermann.nextcloud.deck.ui.upcomingcards.UpcomingCardsAdapterItem; import it.niedermann.nextcloud.deck.ui.widget.singlecard.SingleCardWidget; @@ -514,20 +513,19 @@ public class DataBaseAdapter { db.getLabelDao().delete(label); } - public WrappedLiveData<Account> createAccount(Account account) { - return LiveDataHelper.wrapInLiveData(() -> { - final long id = db.getAccountDao().insert(account); + @WorkerThread + public Account createAccountDirectly(@NonNull Account account) { + final long id = db.getAccountDao().insert(account); - widgetNotifierExecutor.submit(() -> { - DeckLog.verbose("Adding new created", Account.class.getSimpleName(), " with ", id, " to all instances of ", EWidgetType.UPCOMING_WIDGET.name()); - for (FilterWidget widget : getFilterWidgetsByType(EWidgetType.UPCOMING_WIDGET)) { - widget.getAccounts().add(new FilterWidgetAccount(id, false)); - updateFilterWidgetDirectly(widget); - } - notifyFilterWidgetsAboutChangedEntity(FilterWidget.EChangedEntityType.ACCOUNT, id); - }); - return readAccountDirectly(id); + widgetNotifierExecutor.submit(() -> { + DeckLog.verbose("Adding new created", Account.class.getSimpleName(), " with ", id, " to all instances of ", EWidgetType.UPCOMING_WIDGET.name()); + for (FilterWidget widget : getFilterWidgetsByType(EWidgetType.UPCOMING_WIDGET)) { + widget.getAccounts().add(new FilterWidgetAccount(id, false)); + updateFilterWidgetDirectly(widget); + } + notifyFilterWidgetsAboutChangedEntity(FilterWidget.EChangedEntityType.ACCOUNT, id); }); + return readAccountDirectly(id); } public void deleteAccount(long id) { @@ -588,15 +586,6 @@ public class DataBaseAdapter { return distinctUntilChanged(db.getBoardDao().getBoardsWithEditPermissionsForAccount(accountId)); } - public WrappedLiveData<Board> createBoard(long accountId, @NonNull Board board) { - return LiveDataHelper.wrapInLiveData(() -> { - board.setAccountId(accountId); - final long id = db.getBoardDao().insert(board); - notifyFilterWidgetsAboutChangedEntity(FilterWidget.EChangedEntityType.BOARD, id); - return db.getBoardDao().getBoardByLocalIdDirectly(id); - }); - } - @WorkerThread public long createBoardDirectly(long accountId, @NonNull Board board) { board.setAccountId(accountId); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/util/LiveDataHelper.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/util/LiveDataHelper.java index 059ed5e6b..397d1339f 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/util/LiveDataHelper.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/util/LiveDataHelper.java @@ -65,20 +65,6 @@ public class LiveDataHelper { liveData.observe(owner, tempObserver); } - public static <T> WrappedLiveData<T> wrapInLiveData(final LiveDataWrapper<T> liveDataWrapper) { - final WrappedLiveData<T> liveData = new WrappedLiveData<>(); - - executor.submit(() -> { - try { - liveDataWrapper.postResult(liveData); - } catch (Throwable t) { - liveData.postError(t); - } - }); - - return liveData; - } - public interface DataChangeProcessor<T> { void onDataChanged(T data); } @@ -86,19 +72,4 @@ public class LiveDataHelper { public interface DataTransformator<I, O> { O transform(I data); } - - public interface LiveDataWrapper<T> { - T getData(); - - default void postResult(WrappedLiveData<T> liveData) { - liveData.setError(null); - T data = null; - try { - data = getData(); - } catch (RuntimeException e) { - liveData.setError(e); - } - liveData.postValue(data); - } - } }
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/ImportAccountActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/ImportAccountActivity.java index 39fa8dead..85b1d6b1e 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/ImportAccountActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/ImportAccountActivity.java @@ -24,6 +24,7 @@ import com.nextcloud.android.sso.ui.UiExceptionManager; import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.api.IResponseCallback; import it.niedermann.nextcloud.deck.api.ResponseCallback; import it.niedermann.nextcloud.deck.databinding.ActivityImportAccountBinding; import it.niedermann.nextcloud.deck.exceptions.OfflineException; @@ -31,7 +32,6 @@ import it.niedermann.nextcloud.deck.model.Account; import it.niedermann.nextcloud.deck.model.ocs.Capabilities; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; import it.niedermann.nextcloud.deck.persistence.sync.SyncWorker; -import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.WrappedLiveData; import it.niedermann.nextcloud.deck.ui.exception.ExceptionDialogFragment; import it.niedermann.nextcloud.deck.ui.exception.ExceptionHandler; @@ -114,20 +114,12 @@ public class ImportAccountActivity extends AppCompatActivity { SingleAccountHelper.setCurrentAccount(getApplicationContext(), account.name); SyncManager syncManager = new SyncManager(ImportAccountActivity.this); - final WrappedLiveData<Account> accountLiveData = syncManager.createAccount(new Account(account.name, account.userId, account.url)); - accountLiveData.observe(ImportAccountActivity.this, (Account createdAccount) -> { - if (accountLiveData.hasError()) { - final Throwable error = accountLiveData.getError(); - if (error instanceof SQLiteConstraintException) { - DeckLog.error("Account has already been added, this should not be the case"); - } - assert error != null; - setStatusText(error.getMessage()); - runOnUiThread(() -> ExceptionDialogFragment.newInstance(error, createdAccount).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())); - restoreWifiPref(); - } else { + final Account accountToCreate = new Account(account.name, account.userId, account.url); + syncManager.createAccount(accountToCreate, new IResponseCallback<Account>() { + @Override + public void onResponse(Account createdAccount) { // Remember last account - THIS HAS TO BE DONE SYNCHRONOUSLY - SharedPreferences.Editor editor = sharedPreferences.edit(); + final SharedPreferences.Editor editor = sharedPreferences.edit(); DeckLog.log("--- Write: shared_preference_last_account | ", createdAccount.getId()); editor.putLong(sharedPreferenceLastAccount, createdAccount.getId()); editor.commit(); @@ -157,11 +149,8 @@ public class ImportAccountActivity extends AppCompatActivity { } else { setStatusText(getString(R.string.deck_outdated_please_update, response.getDeckVersion().getOriginalVersion())); runOnUiThread(() -> { - binding.updateDeckButton.setOnClickListener((v) -> { - Intent openURL = new Intent(Intent.ACTION_VIEW); - openURL.setData(Uri.parse(createdAccount.getUrl() + urlFragmentUpdateDeck)); - startActivity(openURL); - }); + binding.updateDeckButton.setOnClickListener((v) -> startActivity(new Intent(Intent.ACTION_VIEW) + .setData(Uri.parse(createdAccount.getUrl() + urlFragmentUpdateDeck)))); binding.updateDeckButton.setVisibility(View.VISIBLE); }); rollbackAccountCreation(syncManager, createdAccount.getId()); @@ -185,6 +174,17 @@ public class ImportAccountActivity extends AppCompatActivity { } }); } + + @Override + public void onError(Throwable error) { + IResponseCallback.super.onError(error); + if (error instanceof SQLiteConstraintException) { + DeckLog.error("Account has already been added, this should not be the case"); + } + setStatusText(error.getMessage()); + runOnUiThread(() -> ExceptionDialogFragment.newInstance(error, accountToCreate).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())); + restoreWifiPref(); + } }); } }); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java index 9b9978f7d..b65069d69 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainActivity.java @@ -77,7 +77,6 @@ import it.niedermann.nextcloud.deck.model.internal.FilterInformation; import it.niedermann.nextcloud.deck.model.ocs.Capabilities; import it.niedermann.nextcloud.deck.model.ocs.Version; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; -import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.WrappedLiveData; import it.niedermann.nextcloud.deck.ui.about.AboutActivity; import it.niedermann.nextcloud.deck.ui.accountswitcher.AccountSwitcherDialog; import it.niedermann.nextcloud.deck.ui.archivedboards.ArchivedBoardsActvitiy; @@ -834,14 +833,11 @@ public class MainActivity extends AppCompatActivity implements DeleteStackListen default: try { AccountImporter.onActivityResult(requestCode, resultCode, data, this, (account) -> { - final WrappedLiveData<Account> accountLiveData = mainViewModel.createAccount(new Account(account.name, account.userId, account.url)); - accountLiveData.observe(this, (createdAccount) -> { - if (!accountLiveData.hasError()) { - if (createdAccount == null) { - throw new IllegalStateException("Created account must not be null"); - } - - final SyncManager importSyncManager = new SyncManager(this, account.name); + final Account accountToCreate = new Account(account.name, account.userId, account.url); + mainViewModel.createAccount(accountToCreate, new IResponseCallback<Account>() { + @Override + public void onResponse(Account createdAccount) { + final SyncManager importSyncManager = new SyncManager(MainActivity.this, account.name); importSyncManager.refreshCapabilities(new ResponseCallback<Capabilities>(createdAccount) { @SuppressLint("StringFormatInvalid") @Override @@ -915,13 +911,16 @@ public class MainActivity extends AppCompatActivity implements DeleteStackListen } } }); - } else { - final Throwable error = accountLiveData.getError(); + } + + @Override + public void onError(Throwable error) { + IResponseCallback.super.onError(error); if (error instanceof SQLiteConstraintException) { DeckLog.warn("Account already added"); BrandedSnackbar.make(binding.coordinatorLayout, R.string.account_already_added, Snackbar.LENGTH_LONG).show(); } else { - ExceptionDialogFragment.newInstance(error, createdAccount).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName()); + ExceptionDialogFragment.newInstance(error, accountToCreate).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName()); } } }); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainViewModel.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainViewModel.java index 44667e4ad..ffa220d94 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainViewModel.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/MainViewModel.java @@ -32,7 +32,6 @@ import it.niedermann.nextcloud.deck.model.internal.FilterInformation; import it.niedermann.nextcloud.deck.model.ocs.Capabilities; import it.niedermann.nextcloud.deck.model.ocs.comment.DeckComment; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; -import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.WrappedLiveData; @SuppressWarnings("WeakerAccess") public class MainViewModel extends AndroidViewModel { @@ -130,8 +129,8 @@ public class MainViewModel extends AndroidViewModel { return syncManager.hasAccounts(); } - public WrappedLiveData<Account> createAccount(@NonNull Account accout) { - return syncManager.createAccount(accout); + public void createAccount(@NonNull Account account, @NonNull IResponseCallback<Account> callback) { + syncManager.createAccount(account, callback); } public void deleteAccount(long id) { |