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=dc73944332b728ccae78e798089fa71c11d9a35c;hp=062c93361d5cba27c7027896e9c993390ca8415e;hb=abd5a19252bf81af903c3406132030e3ad63704f;hpb=a999dc7cb0bb71e7b88ce8e3c79a1884487355ef 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 062c9336..dc739443 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java @@ -23,6 +23,7 @@ import android.os.AsyncTask; import android.os.OperationCanceledException; import android.util.Log; +import net.ktnx.mobileledger.err.HTTPException; import net.ktnx.mobileledger.json.AccountListParser; import net.ktnx.mobileledger.json.ParsedBalance; import net.ktnx.mobileledger.json.ParsedLedgerAccount; @@ -38,7 +39,6 @@ import net.ktnx.mobileledger.utils.MLDB; import net.ktnx.mobileledger.utils.NetworkUtil; import java.io.BufferedReader; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -107,18 +107,24 @@ public class RetrieveTransactionsTask context.onRetrieveDone(null); } private String retrieveTransactionListLegacy(MobileLedgerProfile profile) - throws IOException, ParseException { + throws IOException, ParseException, HTTPException { Progress progress = new Progress(); int maxTransactionId = Progress.INDETERMINATE; ArrayList accountList = new ArrayList<>(); HashMap accountNames = new HashMap<>(); - LedgerAccount lastAccount = null; + LedgerAccount lastAccount = null, prevAccount = null; boolean onlyStarred = Data.optShowOnlyStarred.get(); HttpURLConnection http = NetworkUtil.prepareConnection(profile, "journal"); http.setAllowUserInteraction(false); publishProgress(progress); - try (SQLiteDatabase db = MLDB.getWritableDatabase()) { + switch (http.getResponseCode()) { + case 200: + break; + default: + throw new HTTPException(http.getResponseCode(), http.getResponseMessage()); + } + try (SQLiteDatabase db = MLDB.getDatabase()) { try (InputStream resp = http.getInputStream()) { if (http.getResponseCode() != 200) throw new IOException(String.format("HTTP error %d", http.getResponseCode())); @@ -163,12 +169,15 @@ public class RetrieveTransactionsTask acct_name = acct_name.replace("\"", ""); L(String.format("found account: %s", acct_name)); - lastAccount = profile.loadAccount(acct_name); - if (lastAccount == null) { + prevAccount = lastAccount; + lastAccount = profile.tryLoadAccount(db, acct_name); + if (lastAccount == null) lastAccount = new LedgerAccount(acct_name); - profile.storeAccount(db, lastAccount); - } + else lastAccount.removeAmounts(); + profile.storeAccount(db, lastAccount); + if (prevAccount != null) prevAccount + .setHasSubAccounts(prevAccount.isParentOf(lastAccount)); // make sure the parent account(s) are present, // synthesising them if necessary String parentName = lastAccount.getParentName(); @@ -183,16 +192,18 @@ public class RetrieveTransactionsTask while (!toAppend.isEmpty()) { String aName = toAppend.pop(); LedgerAccount acc = new LedgerAccount(aName); - acc.setHidden(lastAccount.isHidden()); - if (!onlyStarred || !acc.isHidden()) - accountList.add(acc); + acc.setHiddenByStar(lastAccount.isHiddenByStar()); + acc.setHasSubAccounts(true); + if ((!onlyStarred || !acc.isHiddenByStar()) && + acc.isVisible(accountList)) accountList.add(acc); L(String.format("gap-filling with %s", aName)); accountNames.put(aName, null); profile.storeAccount(db, acc); } } - if (!onlyStarred || !lastAccount.isHidden()) + if ((!onlyStarred || !lastAccount.isHiddenByStar()) && + lastAccount.isVisible(accountList)) accountList.add(lastAccount); accountNames.put(acct_name, null); @@ -357,62 +368,90 @@ public class RetrieveTransactionsTask new String[]{profile.getUuid()}); db.execSQL("update accounts set keep=0 where profile=?;", new String[]{profile.getUuid()}); } - private boolean retrieveAccountList(MobileLedgerProfile profile) throws IOException { + private boolean retrieveAccountList(MobileLedgerProfile profile) + throws IOException, HTTPException { Progress progress = new Progress(); HttpURLConnection http = NetworkUtil.prepareConnection(profile, "accounts"); http.setAllowUserInteraction(false); + switch (http.getResponseCode()) { + case 200: + break; + case 404: + return false; + default: + throw new HTTPException(http.getResponseCode(), http.getResponseMessage()); + } publishProgress(progress); - try (SQLiteDatabase db = MLDB.getWritableDatabase()) { - try (InputStream resp = http.getInputStream()) { - if (http.getResponseCode() != 200) - throw new IOException(String.format("HTTP error %d", http.getResponseCode())); + SQLiteDatabase db = MLDB.getDatabase(); + try (InputStream resp = http.getInputStream()) { + if (http.getResponseCode() != 200) + throw new IOException(String.format("HTTP error %d", http.getResponseCode())); - db.beginTransaction(); - try { - profile.markAccountsAsNotPresent(db); + db.beginTransaction(); + try { + profile.markAccountsAsNotPresent(db); - AccountListParser parser = new AccountListParser(resp); - ArrayList accountList = new ArrayList<>(); + AccountListParser parser = new AccountListParser(resp); + ArrayList accountList = new ArrayList<>(); - while (true) { - throwIfCancelled(); - ParsedLedgerAccount parsedAccount = parser.nextAccount(); - if (parsedAccount == null) break; - - LedgerAccount acc = new LedgerAccount(parsedAccount.getAname()); - profile.storeAccount(db, acc); - for (ParsedBalance b : parsedAccount.getAebalance()) { - profile.storeAccountValue(db, acc.getName(), b.getAcommodity(), - b.getAquantity().asFloat()); - } + LedgerAccount prevAccount = null; - accountList.add(acc); - } + while (true) { throwIfCancelled(); + ParsedLedgerAccount parsedAccount = parser.nextAccount(); + if (parsedAccount == null) break; - profile.deleteNotPresentAccounts(db); - throwIfCancelled(); - db.setTransactionSuccessful(); - Data.accounts.set(accountList); - } - finally { - db.endTransaction(); + LedgerAccount acc = profile.tryLoadAccount(db, parsedAccount.getAname()); + if (acc == null) acc = new LedgerAccount(parsedAccount.getAname()); + else acc.removeAmounts(); + + profile.storeAccount(db, acc); + for (ParsedBalance b : parsedAccount.getAebalance()) { + profile.storeAccountValue(db, acc.getName(), b.getAcommodity(), + b.getAquantity().asFloat()); + } + + if (acc.isVisible(accountList)) accountList.add(acc); + + if (prevAccount != null) { + prevAccount.setHasSubAccounts( + acc.getName().startsWith(prevAccount.getName() + ":")); + } + + prevAccount = acc; } + throwIfCancelled(); + + profile.deleteNotPresentAccounts(db); + throwIfCancelled(); + db.setTransactionSuccessful(); + Data.accounts.set(accountList); + } + finally { + db.endTransaction(); } } return true; } private boolean retrieveTransactionList(MobileLedgerProfile profile) - throws IOException, ParseException { + throws IOException, ParseException, HTTPException { Progress progress = new Progress(); int maxTransactionId = Progress.INDETERMINATE; HttpURLConnection http = NetworkUtil.prepareConnection(profile, "transactions"); http.setAllowUserInteraction(false); publishProgress(progress); - try (SQLiteDatabase db = MLDB.getWritableDatabase()) { + switch (http.getResponseCode()) { + case 200: + break; + case 404: + return false; + default: + throw new HTTPException(http.getResponseCode(), http.getResponseMessage()); + } + try (SQLiteDatabase db = MLDB.getDatabase()) { try (InputStream resp = http.getInputStream()) { if (http.getResponseCode() != 200) throw new IOException(String.format("HTTP error %d", http.getResponseCode())); @@ -451,6 +490,10 @@ public class RetrieveTransactionsTask progress.setTotal(maxTransactionId); } + if ((progress.getTotal() == Progress.INDETERMINATE) || + (progress.getTotal() < transaction.getId())) + progress.setTotal(transaction.getId()); + progress.setProgress(++processedTransactionCount); publishProgress(progress); } @@ -483,13 +526,13 @@ public class RetrieveTransactionsTask e.printStackTrace(); return "Invalid server URL"; } - catch (FileNotFoundException e) { + catch (HTTPException e) { e.printStackTrace(); - return "Invalid user name or password"; + return String.format("HTTP error %d: %s", e.getResponseCode(), e.getResponseMessage()); } catch (IOException e) { e.printStackTrace(); - return "Network error"; + return e.getLocalizedMessage(); } catch (ParseException e) { e.printStackTrace();