X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fasync%2FRetrieveTransactionsTask.java;h=0768817e5673bc1242c3ffc44040aa76492b667b;hp=f3b4bea6ce7bf12c8c278dcaeb5612685b431ec8;hb=1c5029961976470f2a7691f8dd9bb52a591a6467;hpb=b4b2b3c53bc6dc2611654eda59447325be482f66 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 f3b4bea6..0768817e 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java @@ -1,5 +1,5 @@ /* - * Copyright © 2018 Damyan Ivanov. + * Copyright © 2019 Damyan Ivanov. * This file is part of Mobile-Ledger. * Mobile-Ledger is free software: you can distribute it and/or modify it * under the term of the GNU General Public License as published by @@ -21,11 +21,12 @@ import android.annotation.SuppressLint; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; +import android.util.Log; import net.ktnx.mobileledger.R; -import net.ktnx.mobileledger.TransactionListActivity; import net.ktnx.mobileledger.model.LedgerTransaction; -import net.ktnx.mobileledger.model.LedgerTransactionItem; +import net.ktnx.mobileledger.model.LedgerTransactionAccount; +import net.ktnx.mobileledger.ui.transaction_list.TransactionListFragment; import net.ktnx.mobileledger.utils.MLDB; import net.ktnx.mobileledger.utils.NetworkUtil; @@ -37,6 +38,7 @@ import java.io.InputStreamReader; import java.lang.ref.WeakReference; import java.net.HttpURLConnection; import java.net.MalformedURLException; +import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -48,12 +50,12 @@ public class RetrieveTransactionsTask extends private static final Pattern transactionDescriptionPattern = Pattern.compile(" contextRef; + protected WeakReference contextRef; protected int error; private boolean success; - public RetrieveTransactionsTask(WeakReference contextRef) { + public RetrieveTransactionsTask(WeakReference contextRef) { this.contextRef = contextRef; } private static final void L(String msg) { @@ -62,24 +64,31 @@ public class RetrieveTransactionsTask extends @Override protected void onProgressUpdate(Progress... values) { super.onProgressUpdate(values); - TransactionListActivity context = getContext(); + TransactionListFragment context = getContext(); if (context == null) return; context.onRetrieveProgress(values[0]); } @Override protected void onPreExecute() { super.onPreExecute(); - TransactionListActivity context = getContext(); + TransactionListFragment context = getContext(); if (context == null) return; context.onRetrieveStart(); } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); - TransactionListActivity context = getContext(); + TransactionListFragment context = getContext(); if (context == null) return; context.onRetrieveDone(success); } + @Override + protected void onCancelled() { + super.onCancelled(); + TransactionListFragment context = getContext(); + if (context == null) return; + context.onRetrieveDone(false); + } @SuppressLint("DefaultLocale") @Override protected Void doInBackground(Params... params) { @@ -91,9 +100,9 @@ public class RetrieveTransactionsTask extends NetworkUtil.prepare_connection(params[0].getBackendPref(), "journal"); http.setAllowUserInteraction(false); publishProgress(progress); - TransactionListActivity ctx = contextRef.get(); + TransactionListFragment ctx = getContext(); if (ctx == null) return null; - try (SQLiteDatabase db = MLDB.getWritableDatabase(ctx)) { + try (SQLiteDatabase db = MLDB.getWritableDatabase()) { try (InputStream resp = http.getInputStream()) { if (http.getResponseCode() != 200) throw new IOException( String.format("HTTP error %d", http.getResponseCode())); @@ -101,7 +110,7 @@ public class RetrieveTransactionsTask extends try { db.execSQL("UPDATE transactions set keep=0"); - int state = ParserState.EXPECTING_JOURNAL; + ParserState state = ParserState.EXPECTING_JOURNAL; String line; BufferedReader buf = new BufferedReader(new InputStreamReader(resp, "UTF-8")); @@ -116,14 +125,14 @@ public class RetrieveTransactionsTask extends Matcher m; //L(String.format("State is %d", state)); switch (state) { - case ParserState.EXPECTING_JOURNAL: + case EXPECTING_JOURNAL: if (!line.isEmpty() && (line.charAt(0) == ' ')) continue; if (line.equals("

General Journal

")) { state = ParserState.EXPECTING_TRANSACTION; L("→ expecting transaction"); } break; - case ParserState.EXPECTING_TRANSACTION: + case EXPECTING_TRANSACTION: if (!line.isEmpty() && (line.charAt(0) == ' ')) continue; m = transactionStartPattern.matcher(line); if (m.find()) { @@ -147,7 +156,7 @@ public class RetrieveTransactionsTask extends break LINES; } break; - case ParserState.EXPECTING_TRANSACTION_DESCRIPTION: + case EXPECTING_TRANSACTION_DESCRIPTION: if (!line.isEmpty() && (line.charAt(0) == ' ')) continue; m = transactionDescriptionPattern.matcher(line); if (m.find()) { @@ -165,7 +174,7 @@ public class RetrieveTransactionsTask extends m.group(1), m.group(2))); } break; - case ParserState.EXPECTING_TRANSACTION_DETAILS: + case EXPECTING_TRANSACTION_DETAILS: if (line.isEmpty()) { // transaction data collected if (transaction.existsInDb(db)) { @@ -177,6 +186,7 @@ public class RetrieveTransactionsTask extends db.execSQL("UPDATE transactions SET keep=1 WHERE " + "id < ?", new Integer[]{transaction.getId()}); + success = true; progress.setTotal(progress.getProgress()); publishProgress(progress); break LINES; @@ -211,9 +221,11 @@ public class RetrieveTransactionsTask extends if (m.find()) { String acc_name = m.group(1); String amount = m.group(2); + String currency = m.group(3); amount = amount.replace(',', '.'); - transaction.add_item(new LedgerTransactionItem(acc_name, - Float.valueOf(amount))); + transaction.addAccount( + new LedgerTransactionAccount(acc_name, + Float.valueOf(amount), currency)); L(String.format("%s = %s", acc_name, amount)); } else throw new IllegalStateException( @@ -223,7 +235,7 @@ public class RetrieveTransactionsTask extends break; default: throw new RuntimeException( - String.format("Unknown parser state %d", state)); + String.format("Unknown parser state %s", state.name())); } } if (!isCancelled()) { @@ -237,7 +249,12 @@ public class RetrieveTransactionsTask extends } } - if (success && !isCancelled()) ctx.model.reloadTransactions(ctx); + if (success && !isCancelled()) { + Log.d("db", "Updating transaction list stamp"); + MLDB.set_option_value(MLDB.OPT_TRANSACTION_LIST_STAMP, + new Date().getTime()); + ctx.model.reloadTransactions(ctx); + } } catch (MalformedURLException e) { error = R.string.err_bad_backend_url; @@ -253,10 +270,15 @@ public class RetrieveTransactionsTask extends } return null; } - TransactionListActivity getContext() { + TransactionListFragment getContext() { return contextRef.get(); } + private enum ParserState { + EXPECTING_JOURNAL, EXPECTING_TRANSACTION, EXPECTING_TRANSACTION_DESCRIPTION, + EXPECTING_TRANSACTION_DETAILS + } + public static class Params { private SharedPreferences backendPref; @@ -298,11 +320,4 @@ public class RetrieveTransactionsTask extends super(message); } } - - private class ParserState { - static final int EXPECTING_JOURNAL = 0; - static final int EXPECTING_TRANSACTION = 1; - static final int EXPECTING_TRANSACTION_DESCRIPTION = 2; - static final int EXPECTING_TRANSACTION_DETAILS = 3; - } }