X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fasync%2FRetrieveTransactionsTask.java;h=9636208b65a2446787383307ce4efb9ffc371a51;hb=de897f405d8b9885835dd8ecc7c622607b3716a0;hp=8b795ac1296ab703a74918a3a53393ba7418882f;hpb=5df10dc0b58df4d4be4e9ab34f1e0f477ca46766;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 8b795ac1..9636208b 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java @@ -18,26 +18,21 @@ package net.ktnx.mobileledger.async; import android.annotation.SuppressLint; -import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.OperationCanceledException; import androidx.annotation.NonNull; -import androidx.room.Transaction; +import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.RuntimeJsonMappingException; -import net.ktnx.mobileledger.App; import net.ktnx.mobileledger.dao.AccountDAO; -import net.ktnx.mobileledger.dao.AccountValueDAO; -import net.ktnx.mobileledger.dao.TransactionAccountDAO; import net.ktnx.mobileledger.dao.TransactionDAO; import net.ktnx.mobileledger.db.Account; import net.ktnx.mobileledger.db.AccountWithAmounts; import net.ktnx.mobileledger.db.DB; import net.ktnx.mobileledger.db.Option; import net.ktnx.mobileledger.db.Profile; -import net.ktnx.mobileledger.db.TransactionAccount; import net.ktnx.mobileledger.db.TransactionWithAccounts; import net.ktnx.mobileledger.err.HTTPException; import net.ktnx.mobileledger.json.API; @@ -50,7 +45,6 @@ import net.ktnx.mobileledger.model.LedgerTransaction; import net.ktnx.mobileledger.model.LedgerTransactionAccount; import net.ktnx.mobileledger.ui.MainModel; import net.ktnx.mobileledger.utils.Logger; -import net.ktnx.mobileledger.utils.MLDB; import net.ktnx.mobileledger.utils.NetworkUtil; import java.io.BufferedReader; @@ -88,6 +82,7 @@ public class RetrieveTransactionsTask extends private static final Pattern reEnd = Pattern.compile("\\bid=\"addmodal\""); private static final Pattern reDecimalPoint = Pattern.compile("\\.\\d\\d?$"); private static final Pattern reDecimalComma = Pattern.compile(",\\d\\d?$"); + private static final String TAG = "RTT"; // %3A is '=' private final Pattern reAccountName = Pattern.compile("/register\\?q=inacct%3A([a-zA-Z0-9%]+)\""); @@ -408,21 +403,20 @@ public class RetrieveTransactionsTask extends } } private List retrieveAccountListAnyVersion() - throws HTTPException, ApiNotSupportedException { + throws ApiNotSupportedException, IOException, HTTPException { for (API ver : API.allVersions) { try { return retrieveAccountListForVersion(ver); } - catch (Exception e) { + catch (JsonParseException | RuntimeJsonMappingException e) { Logger.debug("json", String.format(Locale.US, "Error during account list retrieval using API %s", - ver.getDescription())); + ver.getDescription()), e); } - throw new ApiNotSupportedException(); } - throw new RuntimeException("This should never be reached"); + throw new ApiNotSupportedException(); } private List retrieveAccountListForVersion(API version) throws IOException, HTTPException { @@ -437,7 +431,6 @@ public class RetrieveTransactionsTask extends throw new HTTPException(http.getResponseCode(), http.getResponseMessage()); } publishProgress(Progress.indeterminate()); - SQLiteDatabase db = App.getDatabase(); ArrayList list = new ArrayList<>(); HashMap map = new HashMap<>(); throwIfCancelled(); @@ -483,16 +476,15 @@ public class RetrieveTransactionsTask extends try { return retrieveTransactionListForVersion(ver); } - catch (Exception | HTTPException e) { + catch (Exception e) { Logger.debug("json", String.format(Locale.US, "Error during account list retrieval using API %s", ver.getDescription())); } - throw new ApiNotSupportedException(); } - throw new RuntimeException("This should never be reached"); + throw new ApiNotSupportedException(); } private List retrieveTransactionListForVersion(API apiVersion) throws IOException, ParseException, HTTPException { @@ -578,11 +570,11 @@ public class RetrieveTransactionsTask extends retrieveTransactionListLegacy(accounts, transactions); } - storeAccountsAndTransactions(accounts, transactions); - mainModel.updateDisplayedTransactionsFromWeb(transactions); - return new Result(accounts, transactions); + new AccountAndTransactionListSaver(accounts, transactions).start(); + + return new Result(null); } catch (MalformedURLException e) { e.printStackTrace(); @@ -590,8 +582,8 @@ public class RetrieveTransactionsTask extends } catch (HTTPException e) { e.printStackTrace(); - return new Result(String.format("HTTP error %d: %s", e.getResponseCode(), - e.getResponseMessage())); + return new Result( + String.format("HTTP error %d: %s", e.getResponseCode(), e.getMessage())); } catch (IOException e) { e.printStackTrace(); @@ -617,55 +609,6 @@ public class RetrieveTransactionsTask extends Data.backgroundTaskFinished(); } } - @Transaction - private void storeAccountsAndTransactions(List accounts, - List transactions) { - AccountDAO accDao = DB.get() - .getAccountDAO(); - TransactionDAO trDao = DB.get() - .getTransactionDAO(); - TransactionAccountDAO trAccDao = DB.get() - .getTransactionAccountDAO(); - AccountValueDAO valDao = DB.get() - .getAccountValueDAO(); - - final List list = new ArrayList<>(); - for (LedgerAccount acc : accounts) { - final AccountWithAmounts a = acc.toDBOWithAmounts(); - Account existing = accDao.getByNameSync(profile.getId(), acc.getName()); - if (existing != null) { - a.account.setExpanded(existing.isExpanded()); - a.account.setAmountsExpanded(existing.isAmountsExpanded()); - a.account.setId( - existing.getId()); // not strictly needed, but since we have it anyway... - } - - list.add(a); - } - accDao.storeAccountsSync(list, profile.getId()); - - long trGen = trDao.getGenerationSync(profile.getId()); - for (LedgerTransaction tr : transactions) { - TransactionWithAccounts tran = tr.toDBO(); - tran.transaction.setGeneration(trGen); - tran.transaction.setProfileId(profile.getId()); - - tran.transaction.setId(trDao.insertSync(tran.transaction)); - - for (TransactionAccount trAcc : tran.accounts) { - trAcc.setGeneration(trGen); - trAcc.setTransactionId(tran.transaction.getId()); - trAcc.setId(trAccDao.insertSync(trAcc)); - } - } - - trDao.purgeOldTransactionsSync(profile.getId(), trGen); - - DB.get() - .getOptionDAO() - .insertSync(new Option(profile.getId(), MLDB.OPT_LAST_SCRAPE, - String.valueOf((new Date()).getTime()))); - } public void throwIfCancelled() { if (isCancelled()) throw new OperationCanceledException(null); @@ -763,4 +706,55 @@ public class RetrieveTransactionsTask extends this.transactions = transactions; } } + + private class AccountAndTransactionListSaver extends Thread { + private final List accounts; + private final List transactions; + public AccountAndTransactionListSaver(List accounts, + List transactions) { + this.accounts = accounts; + this.transactions = transactions; + } + @Override + public void run() { + AccountDAO accDao = DB.get() + .getAccountDAO(); + TransactionDAO trDao = DB.get() + .getTransactionDAO(); + + Logger.debug(TAG, "Preparing account list"); + final List list = new ArrayList<>(); + for (LedgerAccount acc : accounts) { + final AccountWithAmounts a = acc.toDBOWithAmounts(); + Account existing = accDao.getByNameSync(profile.getId(), acc.getName()); + if (existing != null) { + a.account.setExpanded(existing.isExpanded()); + a.account.setAmountsExpanded(existing.isAmountsExpanded()); + a.account.setId(existing.getId()); // not strictly needed, but since we have it + // anyway... + } + + list.add(a); + } + Logger.debug(TAG, "Account list prepared. Storing"); + accDao.storeAccountsSync(list, profile.getId()); + Logger.debug(TAG, "Account list stored"); + + Logger.debug(TAG, "Preparing transaction list"); + final List tranList = new ArrayList<>(); + + for (LedgerTransaction tr : transactions) + tranList.add(tr.toDBO()); + + Logger.debug(TAG, "Storing transaction list"); + trDao.storeTransactionsSync(tranList, profile.getId()); + + Logger.debug(TAG, "Transactions stored"); + + DB.get() + .getOptionDAO() + .insertSync(new Option(profile.getId(), Option.OPT_LAST_SCRAPE, + String.valueOf((new Date()).getTime()))); + } + } }