X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fmodel%2FMobileLedgerProfile.java;h=fc940e9ad6f8850b33e4ee9dd118dafc746e1ac3;hp=21acf677ddc426fac048fb79937d2dbbb49a406e;hb=d08ab8235d0fd152c772b2dd5ffa1ca5747f67b1;hpb=d58f8f4a9edd8b96005d1900c51b589471424165 diff --git a/app/src/main/java/net/ktnx/mobileledger/model/MobileLedgerProfile.java b/app/src/main/java/net/ktnx/mobileledger/model/MobileLedgerProfile.java index 21acf677..fc940e9a 100644 --- a/app/src/main/java/net/ktnx/mobileledger/model/MobileLedgerProfile.java +++ b/app/src/main/java/net/ktnx/mobileledger/model/MobileLedgerProfile.java @@ -24,11 +24,14 @@ import android.util.SparseArray; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; import net.ktnx.mobileledger.App; import net.ktnx.mobileledger.R; import net.ktnx.mobileledger.async.DbOpQueue; import net.ktnx.mobileledger.async.SendTransactionTask; +import net.ktnx.mobileledger.utils.Logger; import net.ktnx.mobileledger.utils.MLDB; import net.ktnx.mobileledger.utils.Misc; @@ -61,6 +64,9 @@ public final class MobileLedgerProfile { private SendTransactionTask.API apiVersion = SendTransactionTask.API.auto; private Calendar firstTransactionDate; private Calendar lastTransactionDate; + private MutableLiveData> accounts = + new MutableLiveData<>(new ArrayList<>()); + private AccountListLoader loader = null; public MobileLedgerProfile() { this.uuid = String.valueOf(UUID.randomUUID()); } @@ -141,6 +147,26 @@ public final class MobileLedgerProfile { db.endTransaction(); } } + public LiveData> getAccounts() { + return accounts; + } + synchronized public void scheduleAccountListReload() { + Logger.debug("async-acc", "scheduleAccountListReload() enter"); + if ((loader != null) && loader.isAlive()) { + Logger.debug("async-acc", "returning early - loader already active"); + return; + } + + Logger.debug("async-acc", "Starting AccountListLoader"); + loader = new AccountListLoader(this); + loader.start(); + } + synchronized public void abortAccountListReload() { + if (loader == null) + return; + loader.interrupt(); + loader = null; + } public boolean getShowCommentsByDefault() { return showCommentsByDefault; } @@ -402,7 +428,7 @@ public final class MobileLedgerProfile { } @Nullable public LedgerAccount tryLoadAccount(SQLiteDatabase db, String accName) { - try (Cursor cursor = db.rawQuery("SELECT a.expanded, (select 1 from accounts a2 " + + try (Cursor cursor = db.rawQuery("SELECT a.expanded, a.amounts_expanded, (select 1 from accounts a2 " + "where a2.profile = a.profile and a2.name like a" + ".name||':%' limit 1) " + "FROM accounts a WHERE a.profile = ? and a.name=?", @@ -411,7 +437,8 @@ public final class MobileLedgerProfile { if (cursor.moveToFirst()) { LedgerAccount acc = new LedgerAccount(this, accName); acc.setExpanded(cursor.getInt(0) == 1); - acc.setHasSubAccounts(cursor.getInt(1) == 1); + acc.setAmountsExpanded(cursor.getInt(1) == 1); + acc.setHasSubAccounts(cursor.getInt(2) == 1); try (Cursor c2 = db.rawQuery( "SELECT value, currency FROM account_values WHERE profile = ? " + @@ -573,6 +600,9 @@ public final class MobileLedgerProfile { public Calendar getLastTransactionDate() { return lastTransactionDate; } + public void setAccounts(ArrayList list) { + accounts.postValue(list); + } public enum FutureDates { None(0), OneWeek(7), TwoWeeks(14), OneMonth(30), TwoMonths(60), ThreeMonths(90), SixMonths(180), OneYear(365), All(-1); @@ -617,4 +647,42 @@ public final class MobileLedgerProfile { } } } + + static class AccountListLoader extends Thread { + MobileLedgerProfile profile; + AccountListLoader(MobileLedgerProfile profile) { + this.profile = profile; + } + @Override + public void run() { + Logger.debug("async-acc", "AccountListLoader::run() entered"); + String profileUUID = profile.getUuid(); + ArrayList newList = new ArrayList<>(); + + String sql = "SELECT a.name from accounts a WHERE a.profile = ?"; + sql += " ORDER BY a.name"; + + SQLiteDatabase db = App.getDatabase(); + try (Cursor cursor = db.rawQuery(sql, new String[]{profileUUID})) { + while (cursor.moveToNext()) { + if (isInterrupted()) + return; + + final String accName = cursor.getString(0); +// debug("accounts", +// String.format("Read account '%s' from DB [%s]", accName, +// profileUUID)); + LedgerAccount acc = profile.loadAccount(db, accName); + if (acc.isVisible(newList)) + newList.add(acc); + } + } + + if (isInterrupted()) + return; + + Logger.debug("async-acc", "AccountListLoader::run() posting new list"); + profile.accounts.postValue(newList); + } + } }