From 68cd8ad9a58628674aec13a0d43fd89683728669 Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Sat, 24 Apr 2021 00:36:04 +0300 Subject: [PATCH] fully employ room for loading transactions off DB --- .../async/RetrieveTransactionsTask.java | 2 - .../async/UpdateTransactionsTask.java | 82 ------------------- .../ktnx/mobileledger/dao/TransactionDAO.java | 4 + .../net/ktnx/mobileledger/ui/MainModel.java | 5 -- .../ui/activity/MainActivity.java | 33 +++++++- 5 files changed, 35 insertions(+), 91 deletions(-) delete mode 100644 app/src/main/java/net/ktnx/mobileledger/async/UpdateTransactionsTask.java diff --git a/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java b/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java index a9517e1c..7470f0ea 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java @@ -570,8 +570,6 @@ public class RetrieveTransactionsTask extends retrieveTransactionListLegacy(accounts, transactions); } - mainModel.updateDisplayedTransactionsFromWeb(transactions); - new AccountAndTransactionListSaver(accounts, transactions).start(); Data.lastUpdateDate.postValue(new Date()); diff --git a/app/src/main/java/net/ktnx/mobileledger/async/UpdateTransactionsTask.java b/app/src/main/java/net/ktnx/mobileledger/async/UpdateTransactionsTask.java deleted file mode 100644 index 785ec144..00000000 --- a/app/src/main/java/net/ktnx/mobileledger/async/UpdateTransactionsTask.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright © 2021 Damyan Ivanov. - * This file is part of MoLe. - * MoLe is free software: you can distribute it and/or modify it - * under the term of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your opinion), any later version. - * - * MoLe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License terms for details. - * - * You should have received a copy of the GNU General Public License - * along with MoLe. If not, see . - */ - -package net.ktnx.mobileledger.async; - -import android.os.AsyncTask; - -import net.ktnx.mobileledger.db.DB; -import net.ktnx.mobileledger.db.Profile; -import net.ktnx.mobileledger.db.TransactionWithAccounts; -import net.ktnx.mobileledger.model.Data; -import net.ktnx.mobileledger.model.LedgerTransaction; -import net.ktnx.mobileledger.ui.MainModel; -import net.ktnx.mobileledger.utils.Logger; - -import java.util.ArrayList; -import java.util.List; - -import static net.ktnx.mobileledger.db.Profile.NO_PROFILE_ID; -import static net.ktnx.mobileledger.utils.Logger.debug; - -public class UpdateTransactionsTask extends AsyncTask { - protected String doInBackground(MainModel[] parentModel) { - final Profile profile = Data.getProfile(); - - long profileId = (profile == null) ? NO_PROFILE_ID : profile.getId(); - Data.backgroundTaskStarted(); - try { - Logger.debug("UTT", "Starting DB transaction list retrieval"); - - final MainModel model = parentModel[0]; - final String accFilter = model.getAccountFilter() - .getValue(); - final List transactions; - - if (profileId == NO_PROFILE_ID) - transactions = new ArrayList<>(); - else if (accFilter == null) { - transactions = DB.get() - .getTransactionDAO() - .getAllWithAccountsSync(profileId); - } - else { - transactions = DB.get() - .getTransactionDAO() - .getAllWithAccountsFilteredSync(profileId, accFilter); - } - - TransactionAccumulator accumulator = new TransactionAccumulator(accFilter); - - for (TransactionWithAccounts tr : transactions) { - if (isCancelled()) - return null; - - accumulator.put(new LedgerTransaction(tr)); - } - - accumulator.publishResults(model); - - debug("UTT", "transaction list value updated"); - - return null; - } - finally { - Data.backgroundTaskFinished(); - } - } -} diff --git a/app/src/main/java/net/ktnx/mobileledger/dao/TransactionDAO.java b/app/src/main/java/net/ktnx/mobileledger/dao/TransactionDAO.java index 5af78ea9..2c0995e1 100644 --- a/app/src/main/java/net/ktnx/mobileledger/dao/TransactionDAO.java +++ b/app/src/main/java/net/ktnx/mobileledger/dao/TransactionDAO.java @@ -106,6 +106,10 @@ public abstract class TransactionDAO extends BaseDAO { @Query("SELECT * FROM transactions WHERE profile_id = :profileId") public abstract List getAllWithAccountsSync(long profileId); + @androidx.room.Transaction + @Query("SELECT * FROM transactions WHERE profile_id = :profileId") + public abstract LiveData> getAllWithAccounts(long profileId); + @androidx.room.Transaction @Query("SELECT distinct(tr.id), tr.ledger_id, tr.profile_id, tr.data_hash, tr.year, tr.month," + " tr.day, tr.description, tr.comment, tr.generation FROM transactions tr JOIN " + diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/MainModel.java b/app/src/main/java/net/ktnx/mobileledger/ui/MainModel.java index 2355d2a8..4247e39f 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/MainModel.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/MainModel.java @@ -25,7 +25,6 @@ import androidx.lifecycle.ViewModel; import net.ktnx.mobileledger.async.RetrieveTransactionsTask; import net.ktnx.mobileledger.async.TransactionAccumulator; -import net.ktnx.mobileledger.async.UpdateTransactionsTask; import net.ktnx.mobileledger.db.Profile; import net.ktnx.mobileledger.model.Data; import net.ktnx.mobileledger.model.LedgerAccount; @@ -50,10 +49,6 @@ public class MainModel extends ViewModel { transient private RetrieveTransactionsTask retrieveTransactionsTask; transient private Thread displayedAccountsUpdater; private TransactionsDisplayedFilter displayedTransactionsUpdater; - public void scheduleTransactionListReload() { - UpdateTransactionsTask task = new UpdateTransactionsTask(); - task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, this); - } public LiveData getUpdatingFlag() { return updatingFlag; } diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java b/app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java index 46cc410e..406d0d73 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java @@ -41,6 +41,8 @@ import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -51,11 +53,14 @@ import com.google.android.material.snackbar.Snackbar; import net.ktnx.mobileledger.R; import net.ktnx.mobileledger.async.RetrieveTransactionsTask; +import net.ktnx.mobileledger.async.TransactionAccumulator; import net.ktnx.mobileledger.databinding.ActivityMainBinding; import net.ktnx.mobileledger.db.DB; import net.ktnx.mobileledger.db.Option; import net.ktnx.mobileledger.db.Profile; +import net.ktnx.mobileledger.db.TransactionWithAccounts; import net.ktnx.mobileledger.model.Data; +import net.ktnx.mobileledger.model.LedgerTransaction; import net.ktnx.mobileledger.ui.FabManager; import net.ktnx.mobileledger.ui.MainModel; import net.ktnx.mobileledger.ui.account_summary.AccountSummaryFragment; @@ -457,9 +462,33 @@ public class MainActivity extends ProfileThemedActivity implements FabManager.Fa } mainModel.getAccountFilter() - .observe(this, v -> { + .observe(this, accFilter -> { Logger.debug(TAG, "account filter changed, reloading transactions"); - mainModel.scheduleTransactionListReload(); +// mainModel.scheduleTransactionListReload(); + LiveData> transactions = + new MutableLiveData<>(new ArrayList()); + if (profile != null) { + if (accFilter == null || accFilter.isEmpty()) { + transactions = DB.get() + .getTransactionDAO() + .getAllWithAccounts(profile.getId()); + } + else { + transactions = DB.get() + .getTransactionDAO() + .getAllWithAccountsFiltered(profile.getId(), + accFilter); + } + } + + transactions.observe(this, list -> { + TransactionAccumulator accumulator = new TransactionAccumulator(accFilter); + + for (TransactionWithAccounts tr : list) + accumulator.put(new LedgerTransaction(tr)); + + accumulator.publishResults(mainModel); + }); }); mainModel.stopTransactionsRetrieval(); -- 2.39.2