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;
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;
context.onRetrieveDone(null);
}
private String retrieveTransactionListLegacy(MobileLedgerProfile profile)
- throws IOException, ParseException {
+ throws IOException, ParseException, HTTPException {
Progress progress = new Progress();
int maxTransactionId = Progress.INDETERMINATE;
ArrayList<LedgerAccount> accountList = new ArrayList<>();
HashMap<String, Void> 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);
+ switch (http.getResponseCode()) {
+ case 200:
+ break;
+ default:
+ throw new HTTPException(http.getResponseCode(), http.getResponseMessage());
+ }
try (SQLiteDatabase db = MLDB.getWritableDatabase()) {
try (InputStream resp = http.getInputStream()) {
if (http.getResponseCode() != 200)
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(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();
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(acc);
+ profile.storeAccount(db, acc);
}
}
- if (!onlyStarred || !lastAccount.isHidden())
+ if ((!onlyStarred || !lastAccount.isHiddenByStar()) &&
+ lastAccount.isVisible(accountList))
accountList.add(lastAccount);
accountNames.put(acct_name, null);
if (currency == null) currency = "";
value = value.replace(',', '.');
L("curr=" + currency + ", value=" + value);
- profile.storeAccountValue(lastAccount.getName(), currency,
+ profile.storeAccountValue(db, lastAccount.getName(), currency,
Float.valueOf(value));
lastAccount.addAmount(Float.parseFloat(value), currency);
}
if (matchedTransactionsCount ==
MATCHING_TRANSACTIONS_LIMIT)
{
- profile.markTransactionsBeforeTransactionAsPresent(db, transaction);
+ profile.markTransactionsBeforeTransactionAsPresent(db,
+ transaction);
progress.setTotal(progress.getProgress());
publishProgress(progress);
break LINES;
}
}
else {
- profile.storeTransaction(transaction);
+ profile.storeTransaction(db, transaction);
matchedTransactionsCount = 0;
progress.setTotal(maxTransactionId);
}
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()) {
AccountListParser parser = new AccountListParser(resp);
ArrayList<LedgerAccount> accountList = new ArrayList<>();
+ LedgerAccount prevAccount = null;
+
while (true) {
throwIfCancelled();
ParsedLedgerAccount parsedAccount = parser.nextAccount();
if (parsedAccount == null) break;
- LedgerAccount acc = new LedgerAccount(parsedAccount.getAname());
- profile.storeAccount(acc);
+ 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(acc.getName(), b.getAcommodity(),
+ profile.storeAccountValue(db, acc.getName(), b.getAcommodity(),
b.getAquantity().asFloat());
}
- accountList.add(acc);
+ if (acc.isVisible(accountList)) accountList.add(acc);
+
+ if (prevAccount != null) {
+ prevAccount.setHasSubAccounts(
+ acc.getName().startsWith(prevAccount.getName() + ":"));
+ }
+
+ prevAccount = acc;
}
throwIfCancelled();
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);
+ switch (http.getResponseCode()) {
+ case 200:
+ break;
+ case 404:
+ return false;
+ default:
+ throw new HTTPException(http.getResponseCode(), http.getResponseMessage());
+ }
try (SQLiteDatabase db = MLDB.getWritableDatabase()) {
try (InputStream resp = http.getInputStream()) {
if (http.getResponseCode() != 200)
}
}
else {
- profile.storeTransaction(transaction);
+ profile.storeTransaction(db, transaction);
matchedTransactionsCount = 0;
progress.setTotal(maxTransactionId);
}
+ if ((progress.getTotal() == Progress.INDETERMINATE) ||
+ (progress.getTotal() < transaction.getId()))
+ progress.setTotal(transaction.getId());
+
progress.setProgress(++processedTransactionCount);
publishProgress(progress);
}
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();