X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fasync%2FRetrieveAccountsTask.java;h=a27b1c8cb5b27b5c2b0567726c1a139026cbaff8;hp=3d96d3270f188bb09346769a63ac3325b0e147f9;hb=a1d55154e1c9fb72fcd60de31d6e64e8d046f96d;hpb=6c58c1072c9af6ea0d0f52baeae7f95ba7f7ee2f diff --git a/app/src/main/java/net/ktnx/mobileledger/async/RetrieveAccountsTask.java b/app/src/main/java/net/ktnx/mobileledger/async/RetrieveAccountsTask.java index 3d96d327..a27b1c8c 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/RetrieveAccountsTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/RetrieveAccountsTask.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 @@ -19,11 +19,12 @@ package net.ktnx.mobileledger.async; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; +import android.os.OperationCanceledException; import android.util.Log; -import net.ktnx.mobileledger.AccountSummary; import net.ktnx.mobileledger.R; import net.ktnx.mobileledger.model.LedgerAccount; +import net.ktnx.mobileledger.ui.activity.MainActivity; import net.ktnx.mobileledger.utils.MLDB; import net.ktnx.mobileledger.utils.NetworkUtil; @@ -41,11 +42,10 @@ import java.util.regex.Pattern; public class RetrieveAccountsTask extends android.os.AsyncTask { int error; - + WeakReference mContext; private SharedPreferences pref; - WeakReference mContext; - public RetrieveAccountsTask(WeakReference context) { + public RetrieveAccountsTask(WeakReference context) { mContext = context; error = 0; } @@ -56,110 +56,123 @@ public class RetrieveAccountsTask extends android.os.AsyncTask\\s*([-+]?[\\d.,]+)(?:\\s+(\\S+))?"); + Pattern tr_end_re = Pattern.compile(""); + Pattern descriptions_line_re = + Pattern.compile("\\bdescriptionsSuggester\\s*=\\s*new\\b"); + Pattern description_items_re = + Pattern.compile("\"value\":\"([^\"]+)\""); + int count = 0; + while ((line = buf.readLine()) != null) { + throwIfCancelled(); + + Matcher m = account_name_re.matcher(line); + if (m.find()) { + String acct_encoded = m.group(1); + String acct_name = URLDecoder.decode(acct_encoded, "UTF-8"); + acct_name = acct_name.replace("\"", ""); + Log.d("account-parser", acct_name); + + addAccount(db, acct_name); + publishProgress(++count); + + last_account_name = acct_name; + + continue; + } - Matcher tr_m = tr_re.matcher(line); - if (tr_m.find()) { - Log.d("account-parser", " - another account expected"); - last_account_name = null; - continue; - } + Matcher tr_m = tr_end_re.matcher(line); + if (tr_m.find()) { + Log.d("account-parser", " - another account expected"); + last_account_name = null; + continue; + } - if (last_account_name != null) { - m = value_re.matcher(line); - boolean match_found = false; - while (m.find()) { - match_found = true; - String value = m.group(1); - String currency = m.group(2); - if (currency == null) currency = ""; - value = value.replace(',', '.'); - Log.d("db", "curr=" + currency + ", value=" + value); - db.execSQL( - "insert or replace into account_values(account, currency, value, keep) values(?, ?, ?, 1);", - new Object[]{last_account_name, currency, Float.valueOf(value) - }); - } - - if (match_found) continue; + if (last_account_name != null) { + m = account_value_re.matcher(line); + boolean match_found = false; + while (m.find()) { + throwIfCancelled(); + + match_found = true; + String value = m.group(1); + String currency = m.group(2); + if (currency == null) currency = ""; + value = value.replace(',', '.'); + Log.d("db", "curr=" + currency + ", value=" + value); + db.execSQL( + "insert or replace into account_values(account, currency, value, keep) values(?, ?, ?, 1);", + new Object[]{last_account_name, currency, + Float.valueOf(value) + }); } - m = descriptions_line_re.matcher(line); - if (m.find()) { - db.execSQL("update description_history set keep=0;"); - m = description_items_re.matcher(line); - while (m.find()) { - String description = m.group(1); - if (description.isEmpty()) continue; - - Log.d("db", String.format("Stored description: %s", - description)); - db.execSQL("insert or replace into description_history" - + "(description, description_upper, keep) " + "values(?, ?, 1);", - new Object[]{description, description.toUpperCase() - }); - } - } + if (match_found) continue; } - db.execSQL("delete from account_values where keep=0;"); - db.execSQL("delete from accounts where keep=0;"); -// db.execSQL("delete from description_history where keep=0;"); - db.setTransactionSuccessful(); - } - finally { - db.endTransaction(); + m = descriptions_line_re.matcher(line); + if (m.find()) { + db.execSQL("update description_history set keep=0;"); + m = description_items_re.matcher(line); + while (m.find()) { + throwIfCancelled(); + + String description = m.group(1); + if (description.isEmpty()) continue; + + Log.d("db", String.format("Stored description: %s", + description)); + db.execSQL("insert or replace into description_history" + + "(description, description_upper, keep) " + + "values(?, ?, 1);", + new Object[]{description, description.toUpperCase() + }); + } + } } + db.execSQL("delete from account_values where keep=0;"); + db.execSQL("delete from accounts where keep=0;"); + db.setTransactionSuccessful(); + } + catch (OperationCanceledException e) { + Log.w("async", "Account retrieval cancelled"); + } + finally { + db.endTransaction(); } } } } - } catch (MalformedURLException e) { + } + catch (MalformedURLException e) { error = R.string.err_bad_backend_url; e.printStackTrace(); } @@ -178,24 +191,26 @@ public class RetrieveAccountsTask extends android.os.AsyncTask