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;
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;
import net.ktnx.mobileledger.ui.transaction_list.TransactionListFragment;
import net.ktnx.mobileledger.utils.Colors;
import net.ktnx.mobileledger.utils.Logger;
+import net.ktnx.mobileledger.utils.Misc;
import org.jetbrains.annotations.NotNull;
public static final String STATE_ACC_FILTER = "account_filter";
private static final boolean FAB_HIDDEN = false;
private static final boolean FAB_SHOWN = true;
+ private ConverterThread converterThread = null;
private SectionsPagerAdapter mSectionsPagerAdapter;
private ProfilesRecyclerViewAdapter mProfileListAdapter;
private int mCurrentPage;
createShortcuts(newList);
Profile currentProfile = Data.getProfile();
- if (currentProfile == null || !newList.contains(currentProfile)) {
+ boolean currentProfilePresent = false;
+ if (currentProfile != null) {
+ for (Profile p : newList) {
+ if (p.getId() == currentProfile.getId()) {
+ currentProfilePresent = true;
+ break;
+ }
+ }
+ }
+ if (!currentProfilePresent) {
Logger.debug(TAG, "Switching profile because the current is no longer available");
Data.setCurrentProfile(newList.get(0));
}
return;
}
- mainModel.stopTransactionsRetrieval();
+ mainModel.getAccountFilter()
+ .observe(this, this::onAccountFilterChanged);
+ mainModel.stopTransactionsRetrieval();
mainModel.clearTransactions();
-
- if (haveProfile) {
- Logger.debug("transactions", "requesting list reload");
- mainModel.scheduleTransactionListReload();
+ }
+ private void onAccountFilterChanged(String accFilter) {
+ Logger.debug(TAG, "account filter changed, reloading transactions");
+// mainModel.scheduleTransactionListReload();
+ LiveData<List<TransactionWithAccounts>> transactions =
+ new MutableLiveData<>(new ArrayList<TransactionWithAccounts>());
+ 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 -> {
+ Logger.debug(TAG,
+ String.format(Locale.ROOT, "got transaction list from DB (%d transactions)",
+ list.size()));
+
+ if (converterThread != null)
+ converterThread.interrupt();
+ converterThread = new ConverterThread(mainModel, list, accFilter);
+ converterThread.start();
+ });
}
private void profileThemeChanged() {
// un-hook all observed LiveData
return 2;
}
}
+
+ static private class ConverterThread extends Thread {
+ private final List<TransactionWithAccounts> list;
+ private final MainModel model;
+ private final String accFilter;
+ public ConverterThread(@NonNull MainModel model,
+ @NonNull List<TransactionWithAccounts> list, String accFilter) {
+ this.model = model;
+ this.list = list;
+ this.accFilter = accFilter;
+ }
+ @Override
+ public void run() {
+ TransactionAccumulator accumulator = new TransactionAccumulator(accFilter);
+
+ for (TransactionWithAccounts tr : list) {
+ if (isInterrupted()) {
+ Logger.debug(TAG, "ConverterThread bailing out on interrupt");
+ return;
+ }
+ accumulator.put(new LedgerTransaction(tr));
+ }
+
+ if (isInterrupted()) {
+ Logger.debug(TAG, "ConverterThread bailing out on interrupt");
+ return;
+ }
+
+ Logger.debug(TAG, "ConverterThread publishing results");
+
+ Misc.onMainThread(() -> accumulator.publishResults(model));
+ }
+ }
}