X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fasync%2FRetrieveTransactionsTask.java;h=5d634d2f1ab1e8d0632eac6848a7ef627d135f27;hb=99c3bfb3451ebb1fc55d728d8d1741849cf789db;hp=8a75996cd2adf53c3aabe381964c0cd66f63e5d3;hpb=c4a094e722e19b0119e2ede3dd96f778a128f7aa;p=mobile-ledger.git 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 8a75996c..5d634d2f 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java @@ -414,9 +414,26 @@ public class RetrieveTransactionsTask else acc.removeAmounts(); profile.storeAccount(db, acc); + String lastCurrency = null; + float lastCurrencyAmount = 0; for (ParsedBalance b : parsedAccount.getAibalance()) { - profile.storeAccountValue(db, acc.getName(), b.getAcommodity(), - b.getAquantity().asFloat()); + final String currency = b.getAcommodity(); + final float amount = b.getAquantity().asFloat(); + if (currency.equals(lastCurrency)) lastCurrencyAmount += amount; + else { + if (lastCurrency != null) { + profile.storeAccountValue(db, acc.getName(), lastCurrency, + lastCurrencyAmount); + acc.addAmount(lastCurrencyAmount, lastCurrency); + } + lastCurrency = currency; + lastCurrencyAmount = amount; + } + } + if (lastCurrency != null) { + profile.storeAccountValue(db, acc.getName(), lastCurrency, + lastCurrencyAmount); + acc.addAmount(lastCurrencyAmount, lastCurrency); } if (acc.isVisible(accountList)) accountList.add(acc); @@ -475,17 +492,43 @@ public class RetrieveTransactionsTask int processedTransactionCount = 0; + DetectedTransactionOrder transactionOrder = DetectedTransactionOrder.UNKNOWN; + int orderAccumulator = 0; + int lastTransactionId = 0; + while (true) { throwIfCancelled(); ParsedLedgerTransaction parsedTransaction = parser.nextTransaction(); throwIfCancelled(); if (parsedTransaction == null) break; + LedgerTransaction transaction = parsedTransaction.asLedgerTransaction(); + if (transaction.getId() > lastTransactionId) orderAccumulator++; + else orderAccumulator--; + lastTransactionId = transaction.getId(); + if (transactionOrder == DetectedTransactionOrder.UNKNOWN) { + if (orderAccumulator > 30) { + transactionOrder = DetectedTransactionOrder.FILE; + Log.d("rtt", String.format( + "Detected native file order after %d transactions (factor %d)", + processedTransactionCount, orderAccumulator)); + progress.setTotal(Data.transactions.size()); + } + else if (orderAccumulator < -30) { + transactionOrder = DetectedTransactionOrder.REVERSE_CHRONOLOGICAL; + Log.d("rtt", String.format( + "Detected reverse chronological order after %d transactions (factor %d)", + processedTransactionCount, orderAccumulator)); + } + } + if (transaction.existsInDb(db)) { profile.markTransactionAsPresent(db, transaction); matchedTransactionsCount++; - if (matchedTransactionsCount == MATCHING_TRANSACTIONS_LIMIT) { + if ((transactionOrder == DetectedTransactionOrder.REVERSE_CHRONOLOGICAL) && + (matchedTransactionsCount == MATCHING_TRANSACTIONS_LIMIT)) + { profile.markTransactionsBeforeTransactionAsPresent(db, transaction); progress.setTotal(progress.getProgress()); publishProgress(progress); @@ -500,8 +543,10 @@ public class RetrieveTransactionsTask progress.setTotal(maxTransactionId); } - if ((progress.getTotal() == Progress.INDETERMINATE) || - (progress.getTotal() < transaction.getId())) + + if ((transactionOrder != DetectedTransactionOrder.UNKNOWN) && + ((progress.getTotal() == Progress.INDETERMINATE) || + (progress.getTotal() < transaction.getId()))) progress.setTotal(transaction.getId()); progress.setProgress(++processedTransactionCount); @@ -521,6 +566,8 @@ public class RetrieveTransactionsTask return true; } + + ; @SuppressLint("DefaultLocale") @Override protected String doInBackground(Void... params) { @@ -561,6 +608,7 @@ public class RetrieveTransactionsTask private void throwIfCancelled() { if (isCancelled()) throw new OperationCanceledException(null); } + enum DetectedTransactionOrder {UNKNOWN, REVERSE_CHRONOLOGICAL, FILE} private enum ParserState { EXPECTING_ACCOUNT, EXPECTING_ACCOUNT_AMOUNT, EXPECTING_JOURNAL, EXPECTING_TRANSACTION,