import static net.ktnx.mobileledger.SettingsActivity.PREF_KEY_SHOW_ONLY_STARRED_ACCOUNTS;
public class AccountSummary extends AppCompatActivity {
- DrawerLayout drawer;
-
private static long account_list_last_updated;
private static boolean account_list_needs_update = true;
+ DrawerLayout drawer;
MenuItem mShowHiddenAccounts;
SharedPreferences.OnSharedPreferenceChangeListener sBindPreferenceSummaryToValueListener;
private AccountSummaryViewModel model;
setSupportActionBar(toolbar);
drawer = findViewById(R.id.drawer_layout);
- ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
- this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
+ ActionBarDrawerToggle toggle =
+ new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open,
+ R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
android.widget.TextView ver = drawer.findViewById(R.id.drawer_version_text);
try {
- PackageInfo pi = getApplicationContext().getPackageManager().getPackageInfo(getPackageName(), 0);
+ PackageInfo pi =
+ getApplicationContext().getPackageManager().getPackageInfo(getPackageName(), 0);
ver.setText(pi.versionName);
- } catch (Exception e) {
+ }
+ catch (Exception e) {
e.printStackTrace();
}
llm.setOrientation(LinearLayoutManager.VERTICAL);
root.setLayoutManager(llm);
- root.addOnItemTouchListener(new RecyclerItemListener(this, root, new RecyclerItemListener.RecyclerTouchListener() {
- @Override
- public void onClickItem(View v, int position) {
- Log.d("list", String.format("item %d clicked", position));
- if (modelAdapter.isSelectionActive()) {
- modelAdapter.selectItem(position);
- }
- }
-
- @Override
- public void onLongClickItem(View v, int position) {
- Log.d("list", String.format("item %d long-clicked", position));
- modelAdapter.startSelection();
- if (optMenu != null) {
- optMenu.findItem(R.id.menu_acc_summary_cancel_selection).setVisible(true);
- optMenu.findItem(R.id.menu_acc_summary_confirm_selection).setVisible(true);
- optMenu.findItem(R.id.menu_acc_summary_only_starred).setVisible(false);
- }
- {
- FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.btn_add_transaction);
- if (fab != null) fab.hide();
- }
- }
- }));
+ root.addOnItemTouchListener(new RecyclerItemListener(this, root,
+ new RecyclerItemListener.RecyclerTouchListener() {
+ @Override
+ public void onClickItem(View v, int position) {
+ Log.d("list", String.format("item %d clicked", position));
+ if (modelAdapter.isSelectionActive()) {
+ modelAdapter.selectItem(position);
+ }
+ }
+
+ @Override
+ public void onLongClickItem(View v, int position) {
+ Log.d("list", String.format("item %d long-clicked", position));
+ modelAdapter.startSelection();
+ if (optMenu != null) {
+ optMenu.findItem(R.id.menu_acc_summary_cancel_selection)
+ .setVisible(true);
+ optMenu.findItem(R.id.menu_acc_summary_confirm_selection)
+ .setVisible(true);
+ optMenu.findItem(R.id.menu_acc_summary_only_starred).setVisible(false);
+ }
+ {
+ FloatingActionButton fab = findViewById(R.id.btn_add_transaction);
+ if (fab != null) fab.hide();
+ }
+ }
+ }));
root.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
DrawerLayout drawer = findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
- } else {
+ }
+ else {
super.onBackPressed();
}
}
update_accounts(true);
}
- public
- void onShowOnlyStarredClicked(MenuItem mi) {
+ public void onShowOnlyStarredClicked(MenuItem mi) {
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
boolean flag = pref.getBoolean(PREF_KEY_SHOW_ONLY_STARRED_ACCOUNTS, false);
private void update_accounts(boolean force) {
long now = new Date().getTime();
- if ((now > (account_list_last_updated + (24 * 3600*1000))) || force) {
- Log.d("db", "accounts last updated at " + account_list_last_updated+" and now is " + now+". re-fetching");
+ if ((now > (account_list_last_updated + (24 * 3600 * 1000))) || force) {
+ Log.d("db",
+ "accounts last updated at " + account_list_last_updated + " and now is " + now +
+ ". re-fetching");
update_accounts();
}
}
if (error != 0) {
String err_text = getResources().getString(error);
Log.d("visual", String.format("showing snackbar: %s", err_text));
- Snackbar.make(drawer, err_text, Snackbar.LENGTH_LONG ).show();
+ Snackbar.make(drawer, err_text, Snackbar.LENGTH_LONG).show();
}
else {
MLDB.set_option_value(this, "last_refresh", new Date().getTime());
* */
public class NewTransactionActivity extends AppCompatActivity implements TaskCallback {
+ private static SaveTransactionTask saver;
private TableLayout table;
private ProgressBar progress;
private TextView text_date;
private AutoCompleteTextView text_descr;
- private static SaveTransactionTask saver;
private MenuItem mSave;
@Override
text_date = findViewById(R.id.new_transaction_date);
text_date.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
- public
- void onFocusChange(View v, boolean hasFocus) {
+ public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) pickTransactionDate(v);
}
});
}
@Override
- protected
- void onStart() {
+ protected void onStart() {
super.onStart();
if (text_descr.getText().toString().isEmpty()) text_descr.requestFocus();
}
LedgerTransaction tr = new LedgerTransaction(date, text_descr.getText().toString());
TableLayout table = findViewById(R.id.new_transaction_accounts_table);
- for ( int i = 0; i < table.getChildCount(); i++ ) {
+ for (int i = 0; i < table.getChildCount(); i++) {
TableRow row = (TableRow) table.getChildAt(i);
String acc = ((TextView) row.getChildAt(0)).getText().toString();
String amt = ((TextView) row.getChildAt(1)).getText().toString();
LedgerTransactionItem item =
- amt.length() > 0
- ? new LedgerTransactionItem( acc, Float.parseFloat(amt))
- : new LedgerTransactionItem( acc );
+ amt.length() > 0 ? new LedgerTransactionItem(acc, Float.parseFloat(amt))
+ : new LedgerTransactionItem(acc);
tr.add_item(item);
}
// Toast.makeText(NewTransactionActivity.this, "LEFT", Toast.LENGTH_LONG).show();
}
else {
- Snackbar.make(table, R.string.msg_at_least_two_accounts_are_required, Snackbar.LENGTH_LONG)
- .setAction("Action", null).show();
+ Snackbar.make(table, R.string.msg_at_least_two_accounts_are_required,
+ Snackbar.LENGTH_LONG).setAction("Action", null).show();
}
}
-// @Override
+ // @Override
// public boolean performClick(View view, MotionEvent m) {
// return true;
// }
}
@TargetApi(Build.VERSION_CODES.N)
- private void hook_autocompletion_adapter(final AutoCompleteTextView view, final String table, final String field) {
+ private void hook_autocompletion_adapter(final AutoCompleteTextView view, final String table,
+ final String field) {
String[] from = {field};
int[] to = {android.R.id.text1};
SimpleCursorAdapter adapter =
FilterQueryProvider provider = new FilterQueryProvider() {
@Override
- public
- Cursor runQuery(CharSequence constraint) {
+ public Cursor runQuery(CharSequence constraint) {
if (constraint == null) return null;
String str = constraint.toString().toUpperCase();
try (SQLiteDatabase db = MLDB.getReadableDatabase(getApplicationContext())) {
try (Cursor matches = db.rawQuery(String.format(
- "SELECT %s as a, case when %s_upper LIKE ?||'%%' then 1 "
- + "WHEN %s_upper LIKE '%%:'||?||'%%' then 2 "
- + "WHEN %s_upper LIKE '%% '||?||'%%' then 3 " + "else 9 end "
- + "FROM %s " + "WHERE %s_upper LIKE '%%'||?||'%%' "
- + "ORDER BY 2, 1;", field, field, field, field, table, field),
+ "SELECT %s as a, case when %s_upper LIKE ?||'%%' then 1 " +
+ "WHEN %s_upper LIKE '%%:'||?||'%%' then 2 " +
+ "WHEN %s_upper LIKE '%% '||?||'%%' then 3 " + "else 9 end " +
+ "FROM %s " + "WHERE %s_upper LIKE '%%'||?||'%%' " + "ORDER BY 2, 1;",
+ field, field, field, field, table, field),
new String[]{str, str, str, str}))
{
int i = 0;
}
public int dp2px(float dp) {
- return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics()));
+ return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
+ getResources().getDisplayMetrics()));
}
private void do_add_account_row(boolean focus) {
final AutoCompleteTextView acc = new AutoCompleteTextView(this);
- acc.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT, 9f));
+ acc.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT,
+ TableRow.LayoutParams.WRAP_CONTENT, 9f));
acc.setHint(R.string.new_transaction_account_hint);
acc.setWidth(0);
- acc.setImeOptions(EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NO_ENTER_ACTION
- | EditorInfo.IME_FLAG_NAVIGATE_NEXT);
+ acc.setImeOptions(EditorInfo.IME_ACTION_NEXT | EditorInfo.IME_FLAG_NO_ENTER_ACTION |
+ EditorInfo.IME_FLAG_NAVIGATE_NEXT);
acc.setSingleLine(true);
final EditText amt = new EditText(this);
TableRow.LayoutParams.MATCH_PARENT, 1f));
amt.setHint(R.string.new_transaction_amount_hint);
amt.setWidth(0);
- amt.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_NUMBER_FLAG_DECIMAL );
+ amt.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED |
+ InputType.TYPE_NUMBER_FLAG_DECIMAL);
amt.setMinWidth(dp2px(40));
amt.setTextAlignment(EditText.TEXT_ALIGNMENT_VIEW_END);
amt.setImeOptions(EditorInfo.IME_ACTION_DONE);
acc.setNextFocusRightId(amt.getId());
final TableRow row = new TableRow(this);
- row.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.MATCH_PARENT));
+ row.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT,
+ TableRow.LayoutParams.MATCH_PARENT));
row.setGravity(Gravity.BOTTOM);
row.addView(acc);
row.addView(amt);
do_add_account_row(true);
}
- public
- void resetTransactionFromMenu(MenuItem item) {
+ public void resetTransactionFromMenu(MenuItem item) {
reset_form();
}
save_transaction();
}
- private
- boolean is_zero(float f) {
+ private boolean is_zero(float f) {
return (f < 0.005) && (f > -0.005);
}
}
}
- if ((empty_rows == 0) && ((table.getChildCount() == accounts) || (table.getChildCount()
- == amounts)))
+ if ((empty_rows == 0) &&
+ ((table.getChildCount() == accounts) || (table.getChildCount() == amounts)))
{
do_add_account_row(false);
}
- Log.d("submittable", String.format("accounts=%d, accounts_with_values=%s, "
- + "amounts_with_accounts=%d, amounts=%d, running_total=%1.2f, "
- + "single_empty_with_acc=%s", accounts, accounts_with_values,
- amounts_with_accounts, amounts, running_total,
+ Log.d("submittable", String.format("accounts=%d, accounts_with_values=%s, " +
+ "amounts_with_accounts=%d, amounts=%d, running_total=%1.2f, " +
+ "single_empty_with_acc=%s", accounts,
+ accounts_with_values, amounts_with_accounts, amounts, running_total,
(single_empty_amount && single_empty_amount_has_account) ? "true" : "false"));
- if (have_description && (accounts >= 2) && (accounts_with_values >= (accounts - 1)) && (
- amounts_with_accounts == amounts) && (
- single_empty_amount && single_empty_amount_has_account || is_zero(
- running_total)))
+ if (have_description && (accounts >= 2) && (accounts_with_values >= (accounts - 1)) &&
+ (amounts_with_accounts == amounts) &&
+ (single_empty_amount && single_empty_amount_has_account || is_zero(running_total)))
{
if (mSave != null) mSave.setVisible(true);
}
}
@Override
- public
- void done(String error) {
+ public void done(String error) {
progress.setVisibility(View.INVISIBLE);
Log.d("visuals", "hiding progress");
text_descr.requestFocus();
- while(table.getChildCount() > 2) {
+ while (table.getChildCount() > 2) {
table.removeViewAt(2);
}
- for( int i = 0; i < 2; i++ ) {
+ for (int i = 0; i < 2; i++) {
TableRow tr = (TableRow) table.getChildAt(i);
- if ( tr == null) break;
+ if (tr == null) break;
- ((TextView)tr.getChildAt(0)).setText("");
- ((TextView)tr.getChildAt(1)).setText("");
+ ((TextView) tr.getChildAt(0)).setText("");
+ ((TextView) tr.getChildAt(1)).setText("");
}
}
}
try (SQLiteDatabase db = MLDB.getReadableDatabase(ctx.getApplicationContext())) {
tr.loadData(db);
- holder.tvDescription
- .setText(String.format("%s\n%s", tr.getDescription(), tr.getDate()));
- TableLayout tbl = holder.row.findViewById(R.id.transaction_row_acc_amounts);
- tbl.removeAllViews();
- for (Iterator<LedgerTransactionItem> it = tr.getItemsIterator(); it.hasNext(); ) {
- LedgerTransactionItem acc = it.next();
- TableRow row = new TableRow(holder.row.getContext());
- TextView child = new TextView(ctx);
- child.setText(acc.getShortAccountName());
- row.addView(child);
- child = new TextView(ctx);
- child.setText(acc.toString());
- row.addView(child);
- tbl.addView(row);
- }
-
- if (position % 2 == 0) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) holder.row
- .setBackgroundColor(
- rm.getColor(R.color.table_row_even_bg, ctx.getTheme()));
- else holder.row.setBackgroundColor(rm.getColor(R.color.table_row_even_bg));
- }
- else {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) holder.row
- .setBackgroundColor(
- rm.getColor(R.color.drawer_background, ctx.getTheme()));
- else holder.row.setBackgroundColor(rm.getColor(R.color.drawer_background));
- }
+ holder.tvDescription
+ .setText(String.format("%s\n%s", tr.getDescription(), tr.getDate()));
+ TableLayout tbl = holder.row.findViewById(R.id.transaction_row_acc_amounts);
+ tbl.removeAllViews();
+ for (Iterator<LedgerTransactionItem> it = tr.getItemsIterator(); it.hasNext(); ) {
+ LedgerTransactionItem acc = it.next();
+ TableRow row = new TableRow(holder.row.getContext());
+ TextView child = new TextView(ctx);
+ child.setText(acc.getShortAccountName());
+ row.addView(child);
+ child = new TextView(ctx);
+ child.setText(acc.toString());
+ row.addView(child);
+ tbl.addView(row);
+ }
- holder.row.setTag(R.id.POS, position);
+ if (position % 2 == 0) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) holder.row
+ .setBackgroundColor(rm.getColor(R.color.table_row_even_bg, ctx.getTheme()));
+ else holder.row.setBackgroundColor(rm.getColor(R.color.table_row_even_bg));
}
+ else {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) holder.row
+ .setBackgroundColor(rm.getColor(R.color.drawer_background, ctx.getTheme()));
+ else holder.row.setBackgroundColor(rm.getColor(R.color.drawer_background));
+ }
+
+ holder.row.setTag(R.id.POS, position);
}
}
public class RetrieveAccountsTask extends android.os.AsyncTask<Void, Integer, Void> {
int error;
-
- private SharedPreferences pref;
WeakReference<AccountSummary> mContext;
+ private SharedPreferences pref;
public RetrieveAccountsTask(WeakReference<AccountSummary> context) {
mContext = context;
protected Void doInBackground(Void... params) {
try {
- HttpURLConnection http = NetworkUtil.prepare_connection( pref, "add");
+ HttpURLConnection http = NetworkUtil.prepare_connection(pref, "add");
publishProgress(0);
- try (SQLiteDatabase db = MLDB.getDatabase(mContext.get(), MLDB.DatabaseMode.WRITE)) {
- try (InputStream resp = http.getInputStream()) {
- Log.d("update_accounts", String.valueOf(http.getResponseCode()));
- if (http.getResponseCode() != 200) {
- throw new IOException(
- String.format("HTTP error: %d %s", http.getResponseCode(), http.getResponseMessage()));
- }
- else {
- if (db.inTransaction()) throw new AssertionError();
-
- db.beginTransaction();
-
- 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 account_name_re = Pattern.compile("/register\\?q=inacct%3A([a-zA-Z0-9%]+)\"");
- Pattern value_re = Pattern.compile(
- "<span class=\"[^\"]*\\bamount\\b[^\"]*\">\\s*([-+]?[\\d.,]+)(?:\\s+(\\S+))?</span>");
- Pattern tr_re = Pattern.compile("</tr>");
- 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) {
- 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;
- }
+ try (SQLiteDatabase db = MLDB.getWritableDatabase(mContext.get())) {
+ try (InputStream resp = http.getInputStream()) {
+ Log.d("update_accounts", String.valueOf(http.getResponseCode()));
+ if (http.getResponseCode() != 200) {
+ throw new IOException(
+ String.format("HTTP error: %d %s", http.getResponseCode(),
+ http.getResponseMessage()));
+ }
+ else {
+ if (db.inTransaction()) throw new AssertionError();
+
+ db.beginTransaction();
+
+ 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 account_name_re =
+ Pattern.compile("/register\\?q=inacct%3A([a-zA-Z0-9%]+)\"");
+ Pattern value_re = Pattern.compile(
+ "<span class=\"[^\"]*\\bamount\\b[^\"]*\">\\s*([-+]?[\\d.,]+)(?:\\s+(\\S+))?</span>");
+ Pattern tr_re = Pattern.compile("</tr>");
+ 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) {
+ 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", "<tr> - another account expected");
- last_account_name = null;
- continue;
- }
+ Matcher tr_m = tr_re.matcher(line);
+ if (tr_m.find()) {
+ Log.d("account-parser", "<tr> - 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 = 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)
+ });
}
- 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()) {
+ 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.execSQL("delete from description_history where keep=0;");
+ db.setTransactionSuccessful();
+ }
+ finally {
+ db.endTransaction();
}
+
}
}
}
- } catch (MalformedURLException e) {
+ }
+ catch (MalformedURLException e) {
error = R.string.err_bad_backend_url;
e.printStackTrace();
}
private void addAccount(SQLiteDatabase db, String name) {
do {
LedgerAccount acc = new LedgerAccount(name);
- db.execSQL(
- "update accounts set level = ?, keep = 1 where name = ?",
+ db.execSQL("update accounts set level = ?, keep = 1 where name = ?",
new Object[]{acc.getLevel(), name});
- db.execSQL("insert into accounts(name, name_upper, parent_name, level) select ?,?,"
- + "?,? " + "where (select changes() = 0)",
+ db.execSQL("insert into accounts(name, name_upper, parent_name, level) select ?,?," +
+ "?,? " + "where (select changes() = 0)",
new Object[]{name, name.toUpperCase(), acc.getParentName(), acc.getLevel()});
name = acc.getParentName();
} while (name != null);
Context ctx = contextRef.get();
if (ctx == null) return null;
try (SQLiteDatabase db = MLDB.getWritableDatabase(ctx)) {
- try (InputStream resp = http.getInputStream()) {
- if (http.getResponseCode() != 200) throw new IOException(
- String.format("HTTP error %d", http.getResponseCode()));
- db.beginTransaction();
- try {
- db.execSQL("DELETE FROM transactions;");
- db.execSQL("DELETE FROM transaction_accounts");
+ try (InputStream resp = http.getInputStream()) {
+ if (http.getResponseCode() != 200) throw new IOException(
+ String.format("HTTP error %d", http.getResponseCode()));
+ db.beginTransaction();
+ try {
+ db.execSQL("DELETE FROM transactions;");
+ db.execSQL("DELETE FROM transaction_accounts");
- int state = ParserState.EXPECTING_JOURNAL;
- String line;
- BufferedReader buf =
- new BufferedReader(new InputStreamReader(resp, "UTF-8"));
+ int state = ParserState.EXPECTING_JOURNAL;
+ String line;
+ BufferedReader buf =
+ new BufferedReader(new InputStreamReader(resp, "UTF-8"));
- int transactionCount = 0;
- int transactionId = 0;
- LedgerTransaction transaction = null;
- LINES:
- while ((line = buf.readLine()) != null) {
- if (isCancelled()) break;
- if (!line.isEmpty() && (line.charAt(0) == ' ')) continue;
- Matcher m;
- //L(String.format("State is %d", state));
- switch (state) {
- case ParserState.EXPECTING_JOURNAL:
- if (line.equals("<h2>General Journal</h2>")) {
- state = ParserState.EXPECTING_TRANSACTION;
- L("→ expecting transaction");
- }
- break;
- case ParserState.EXPECTING_TRANSACTION:
- m = transactionStartPattern.matcher(line);
- if (m.find()) {
- transactionId = Integer.valueOf(m.group(1));
- state = ParserState.EXPECTING_TRANSACTION_DESCRIPTION;
- L(String.format("found transaction %d → expecting " +
- "description", transactionId));
- progress.setProgress(++transactionCount);
- if (progress.getTotal() == Progress.INDETERMINATE)
- progress.setTotal(transactionId);
- publishProgress(progress);
- }
- m = endPattern.matcher(line);
- if (m.find()) {
- L("--- transaction list complete ---");
- success = true;
- break LINES;
- }
- break;
- case ParserState.EXPECTING_TRANSACTION_DESCRIPTION:
- m = transactionDescriptionPattern.matcher(line);
- if (m.find()) {
- if (transactionId == 0)
- throw new TransactionParserException(
- "Transaction Id is 0 while expecting " +
- "description");
+ int transactionCount = 0;
+ int transactionId = 0;
+ LedgerTransaction transaction = null;
+ LINES:
+ while ((line = buf.readLine()) != null) {
+ if (isCancelled()) break;
+ Matcher m;
+ //L(String.format("State is %d", state));
+ switch (state) {
+ case ParserState.EXPECTING_JOURNAL:
+ if (!line.isEmpty() && (line.charAt(0) == ' ')) continue;
+ if (line.equals("<h2>General Journal</h2>")) {
+ state = ParserState.EXPECTING_TRANSACTION;
+ L("→ expecting transaction");
+ }
+ break;
+ case ParserState.EXPECTING_TRANSACTION:
+ if (!line.isEmpty() && (line.charAt(0) == ' ')) continue;
+ m = transactionStartPattern.matcher(line);
+ if (m.find()) {
+ transactionId = Integer.valueOf(m.group(1));
+ state = ParserState.EXPECTING_TRANSACTION_DESCRIPTION;
+ L(String.format(
+ "found transaction %d → expecting " + "description",
+ transactionId));
+ progress.setProgress(++transactionCount);
+ if (progress.getTotal() == Progress.INDETERMINATE)
+ progress.setTotal(transactionId);
+ publishProgress(progress);
+ }
+ m = endPattern.matcher(line);
+ if (m.find()) {
+ L("--- transaction list complete ---");
+ success = true;
+ break LINES;
+ }
+ break;
+ case ParserState.EXPECTING_TRANSACTION_DESCRIPTION:
+ if (!line.isEmpty() && (line.charAt(0) == ' ')) continue;
+ m = transactionDescriptionPattern.matcher(line);
+ if (m.find()) {
+ if (transactionId == 0)
+ throw new TransactionParserException(
+ "Transaction Id is 0 while expecting " +
+ "description");
- transaction =
- new LedgerTransaction(transactionId, m.group(1),
- m.group(2));
- state = ParserState.EXPECTING_TRANSACTION_DETAILS;
- L(String.format("transaction %d created for %s (%s) →" +
- " expecting details", transactionId,
- m.group(1), m.group(2)));
- }
- break;
- case ParserState.EXPECTING_TRANSACTION_DETAILS:
- if (line.isEmpty()) {
- // transaction data collected
- transaction.insertInto(db);
+ transaction =
+ new LedgerTransaction(transactionId, m.group(1),
+ m.group(2));
+ state = ParserState.EXPECTING_TRANSACTION_DETAILS;
+ L(String.format("transaction %d created for %s (%s) →" +
+ " expecting details", transactionId,
+ m.group(1), m.group(2)));
+ }
+ break;
+ case ParserState.EXPECTING_TRANSACTION_DETAILS:
+ if (line.isEmpty()) {
+ // transaction data collected
+ transaction.insertInto(db);
- state = ParserState.EXPECTING_TRANSACTION;
- L(String.format("transaction %s saved → expecting " +
- "transaction", transaction.getId()));
+ state = ParserState.EXPECTING_TRANSACTION;
+ L(String.format(
+ "transaction %s saved → expecting " + "transaction",
+ transaction.getId()));
// sounds like a good idea, but transaction-1 may not be the first one chronologically
// for example, when you add the initial seeding transaction after entering some others
// "parser");
// break LINES;
// }
+ }
+ else {
+ m = transactionDetailsPattern.matcher(line);
+ if (m.find()) {
+ String acc_name = m.group(1);
+ String amount = m.group(2);
+ amount = amount.replace(',', '.');
+ transaction.add_item(new LedgerTransactionItem(acc_name,
+ Float.valueOf(amount)));
+ L(String.format("%s = %s", acc_name, amount));
}
- else {
- m = transactionDetailsPattern.matcher(line);
- if (m.find()) {
- String acc_name = m.group(1);
- String amount = m.group(2);
- amount = amount.replace(',', '.');
- transaction.add_item(
- new LedgerTransactionItem(acc_name,
- Float.valueOf(amount)));
- L(String.format("%s = %s", acc_name, amount));
- }
- else throw new IllegalStateException(String.format(
- "Can't parse transaction details"));
- }
- break;
- default:
- throw new RuntimeException(
- String.format("Unknown " + "parser state %d",
- state));
- }
+ else throw new IllegalStateException(
+ String.format("Can't parse transaction details"));
+ }
+ break;
+ default:
+ throw new RuntimeException(
+ String.format("Unknown " + "parser state %d", state));
}
- if (!isCancelled()) db.setTransactionSuccessful();
- }
- finally {
- db.endTransaction();
}
+ if (!isCancelled()) db.setTransactionSuccessful();
+ }
+ finally {
+ db.endTransaction();
}
}
}