X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2FRetrieveAccountsTask.java;h=60583f9b13ec7afadd3e96689ad216ce18955594;hb=e2711df6904ff8f7ef8a2d10241d78c7cf3e8e8c;hp=60e6c4564eace74d89facdad4f8667c509a6e70e;hpb=eb198c42090580a7bc2e72e1ba4738eda914ce3e;p=mobile-ledger.git diff --git a/app/src/main/java/net/ktnx/mobileledger/RetrieveAccountsTask.java b/app/src/main/java/net/ktnx/mobileledger/RetrieveAccountsTask.java index 60e6c456..60583f9b 100644 --- a/app/src/main/java/net/ktnx/mobileledger/RetrieveAccountsTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/RetrieveAccountsTask.java @@ -1,83 +1,101 @@ package net.ktnx.mobileledger; import android.content.SharedPreferences; -import android.database.sqlite.SQLiteDatabase; import android.util.Log; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.net.Authenticator; import java.net.HttpURLConnection; import java.net.MalformedURLException; -import java.net.PasswordAuthentication; -import java.net.URL; import java.net.URLDecoder; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class RetrieveAccountsTask extends android.os.AsyncTask { - private int error; +import static net.ktnx.mobileledger.MobileLedgerDB.db; - SharedPreferences pref; - public void setPref(SharedPreferences pref) { - this.pref = pref; - } - public RetrieveAccountsTask() { +abstract public class RetrieveAccountsTask extends android.os.AsyncTask { + int error; + + private SharedPreferences pref; + + RetrieveAccountsTask() { error = 0; } - protected Void doInBackground(SQLiteDatabase... sqLiteDatabases) { - final String backend_url = pref.getString("backend_url", ""); - final boolean use_auth = pref.getBoolean("backend_use_http_auth", false); - final SQLiteDatabase db = sqLiteDatabases[0]; + void setPref(SharedPreferences pref) { + this.pref = pref; + } + + protected Void doInBackground(Void... params) { try { - Log.d("update_accounts", "Connecting to "+backend_url); - HttpURLConnection http = (HttpURLConnection) new URL(backend_url + "/journal").openConnection(); - if (use_auth) { - final String auth_user = pref.getString("backend_auth_user", ""); - final String auth_password = pref.getString("backend_auth_password", ""); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - Log.d("http-auth", "called"); - return new PasswordAuthentication(auth_user, auth_password.toCharArray()); - } - }); -// final String basic_auth = String.format("Basic %s:%s", auth_user, auth_password); -// http.setRequestProperty("Authorization", basic_auth); - Log.d("update_accounts", "Will auth as "+auth_user+" with password of "+auth_password.length()+" characters"); - } - http.setAllowUserInteraction(true); + HttpURLConnection http = NetworkUtil.prepare_connection( pref, "add"); + http.setAllowUserInteraction(false); http.setRequestProperty("Accept-Charset", "UTF-8"); + publishProgress(0); InputStream resp = http.getInputStream(); try { Log.d("update_accounts", String.valueOf(http.getResponseCode())); if (http.getResponseCode() != 200) { - error = R.string.err_http_error; + throw new IOException(String.format("HTTP error: %d %s", http.getResponseCode(), http.getResponseMessage())); } else { + if (db.inTransaction()) throw new AssertionError(); + db.beginTransaction(); - db.execSQL("delete from accounts;"); try { + db.execSQL("update account_values set keep=0;"); + db.execSQL("update accounts set keep=0;"); + String line; + String last_account_name = null; BufferedReader buf = new BufferedReader(new InputStreamReader(resp, "UTF-8")); // %3A is '=' - Pattern re = Pattern.compile('"' + backend_url + "/register\\?q=inacct%3A([a-zA-Z0-9%]+)\\\""); + Pattern re = Pattern.compile("/register\\?q=inacct%3A([a-zA-Z0-9%]+)\""); + Pattern value_re = Pattern.compile("\\s*([-+]?[\\d.,]+)(?:\\s+(\\S+))?"); + Pattern tr_re = Pattern.compile(""); + int count = 0; while ((line = buf.readLine()) != null) { + Matcher m = re.matcher(line); - while (m.find()) { + 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); - db.execSQL("insert into accounts(name) values(?)", new Object[]{acct_name} ); + db.execSQL("insert or replace into accounts(name, keep) values(?, 1)", new Object[]{acct_name} ); + publishProgress(++count); + + last_account_name = acct_name; + + continue; + } + + Matcher tr_m = tr_re.matcher(line); + if (tr_m.find()) { + last_account_name = null; + continue; + } + + if (last_account_name == null) continue; + + m = value_re.matcher(line); + while (m.find()) { + 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)}); } } + db.execSQL("delete from account_values where keep=0;"); + db.execSQL("delete from accounts where keep=0;"); db.setTransactionSuccessful(); } finally { @@ -104,10 +122,7 @@ public class RetrieveAccountsTask extends android.os.AsyncTask