import net.ktnx.mobileledger.async.RetrieveAccountsTask;
import net.ktnx.mobileledger.model.LedgerAccount;
-import net.ktnx.mobileledger.utils.MobileLedgerDatabase;
+import net.ktnx.mobileledger.utils.MLDB;
import java.lang.ref.WeakReference;
import java.util.Date;
private static boolean account_list_needs_update = true;
MenuItem mShowHiddenAccounts;
SharedPreferences.OnSharedPreferenceChangeListener sBindPreferenceSummaryToValueListener;
- private MobileLedgerDatabase dbh;
private AccountSummaryViewModel model;
private AccountSummaryAdapter modelAdapter;
private Menu optMenu;
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
- dbh = new MobileLedgerDatabase(this);
-
drawer = findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
}
model = ViewModelProviders.of(this).get(AccountSummaryViewModel.class);
- List<LedgerAccount> accounts = model.getAccounts();
+ List<LedgerAccount> accounts = model.getAccounts(getApplicationContext());
modelAdapter = new AccountSummaryAdapter(accounts);
RecyclerView root = findViewById(R.id.account_root);
}
private void prepare_db() {
- account_list_last_updated = dbh.get_option_value("last_refresh", (long) 0);
+ account_list_last_updated = MLDB.get_option_value(this, "last_refresh", (long) 0);
}
private void update_accounts(boolean force) {
Snackbar.make(drawer, err_text, Snackbar.LENGTH_LONG ).show();
}
else {
- dbh.set_option_value("last_refresh", new Date().getTime() );
+ MLDB.set_option_value(this, "last_refresh", new Date().getTime());
update_account_table();
}
}
private void update_account_table() {
- model.reloadAccounts();
+ model.reloadAccounts(getApplicationContext());
modelAdapter.notifyDataSetChanged();
}
void stopSelection() {
stopSelection();
}
public void onConfirmAccSelection(MenuItem item) {
- model.commitSelections();
+ model.commitSelections(getApplicationContext());
stopSelection();
}
}
import android.widget.TextView;
import net.ktnx.mobileledger.model.LedgerAccount;
-import net.ktnx.mobileledger.utils.MobileLedgerDatabase;
+import net.ktnx.mobileledger.utils.MLDB;
import java.util.ArrayList;
import java.util.List;
import static net.ktnx.mobileledger.SettingsActivity.PREF_KEY_SHOW_ONLY_STARRED_ACCOUNTS;
class AccountSummaryViewModel extends AndroidViewModel {
- private MobileLedgerDatabase dbh;
private List<LedgerAccount> accounts;
public AccountSummaryViewModel(@NonNull Application application) {
super(application);
- dbh = new MobileLedgerDatabase(application);
}
- List<LedgerAccount> getAccounts() {
+ List<LedgerAccount> getAccounts(Context context) {
if (accounts == null) {
accounts = new ArrayList<>();
- reloadAccounts();
+ reloadAccounts(context);
}
return accounts;
}
- void reloadAccounts() {
+ void reloadAccounts(Context context) {
accounts.clear();
boolean showingOnlyStarred =
PreferenceManager.getDefaultSharedPreferences(getApplication())
if (showingOnlyStarred) sql += " WHERE hidden = 0";
sql += " ORDER BY name";
- try (SQLiteDatabase db = dbh.getReadableDatabase()) {
+ try (SQLiteDatabase db = MLDB.getReadableDatabase(context)) {
try (Cursor cursor = db
.rawQuery(sql,null))
{
}
}
}
- void commitSelections() {
- try(SQLiteDatabase db = dbh.getWritableDatabase()) {
+ void commitSelections(Context context) {
+ try(SQLiteDatabase db = MLDB.getWritableDatabase(context)) {
db.beginTransaction();
try {
for (LedgerAccount acc : accounts) {
import net.ktnx.mobileledger.model.LedgerTransaction;
import net.ktnx.mobileledger.model.LedgerTransactionItem;
import net.ktnx.mobileledger.ui.DatePickerFragment;
-import net.ktnx.mobileledger.utils.MobileLedgerDatabase;
+import net.ktnx.mobileledger.utils.MLDB;
import java.util.Date;
import java.util.Objects;
private AutoCompleteTextView text_descr;
private static SaveTransactionTask saver;
private MenuItem mSave;
- private MobileLedgerDatabase dbh;
@Override
protected void onCreate(Bundle savedInstanceState) {
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
- dbh = new MobileLedgerDatabase(this);
-
text_date = findViewById(R.id.new_transaction_date);
text_date.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
}
});
text_descr = findViewById(R.id.new_transaction_description);
- hook_autocompletion_adapter(text_descr, MobileLedgerDatabase
- .DESCRIPTION_HISTORY_TABLE, "description");
+ hook_autocompletion_adapter(text_descr, MLDB.DESCRIPTION_HISTORY_TABLE, "description");
hook_text_change_listener(text_descr);
progress = findViewById(R.id.save_transaction_progress);
AutoCompleteTextView acc_name_view = (AutoCompleteTextView) row.getChildAt(0);
TextView amount_view = (TextView) row.getChildAt(1);
hook_swipe_listener(row);
- hook_autocompletion_adapter(acc_name_view, MobileLedgerDatabase.ACCOUNTS_TABLE, "name");
+ hook_autocompletion_adapter(acc_name_view, MLDB.ACCOUNTS_TABLE, "name");
hook_text_change_listener(acc_name_view);
hook_text_change_listener(amount_view);
// Log.d("swipe", "hooked to row "+i);
String[] col_names = {FontsContract.Columns._ID, field};
MatrixCursor c = new MatrixCursor(col_names);
- try (SQLiteDatabase db = dbh.getReadableDatabase()) {
+ try (SQLiteDatabase db = MLDB.getReadableDatabase(getApplicationContext())) {
try (Cursor matches = db.rawQuery(String.format(
"SELECT %s as a, case when %s_upper LIKE ?||'%%' then 1 "
if (focus) acc.requestFocus();
hook_swipe_listener(row);
- hook_autocompletion_adapter(acc, MobileLedgerDatabase.ACCOUNTS_TABLE, "name");
+ hook_autocompletion_adapter(acc, MLDB.ACCOUNTS_TABLE, "name");
hook_text_change_listener(acc);
hook_text_change_listener(amt);
}
import net.ktnx.mobileledger.async.RetrieveTransactionsTask;
import net.ktnx.mobileledger.model.LedgerTransaction;
import net.ktnx.mobileledger.ui.transaction_list.TransactionListViewModel;
-import net.ktnx.mobileledger.utils.MobileLedgerDatabase;
+import net.ktnx.mobileledger.utils.MLDB;
import java.lang.ref.WeakReference;
import java.time.ZoneId;
setupActionBar();
- MobileLedgerDatabase dbh = new MobileLedgerDatabase(this);
-
swiper = findViewById(R.id.transaction_swipe);
if (swiper == null) throw new RuntimeException("Can't get hold on the swipe layout");
root = findViewById(R.id.transaction_root);
throw new RuntimeException("Can't get hold on the transaction list progress bar");
tvLastUpdate = findViewById(R.id.transactions_last_update);
{
- long last_update = dbh.get_option_value("transaction_list_last_update", 0L);
+ long last_update = MLDB.get_option_value(this, "transaction_list_last_update", 0L);
Log.d("transactions", String.format("Last update = %d", last_update));
if (last_update == 0) tvLastUpdate.setText("never");
else {
}
}
model = ViewModelProviders.of(this).get(TransactionListViewModel.class);
- List<LedgerTransaction> transactions = model.getTransactions(dbh);
+ List<LedgerTransaction> transactions = model.getTransactions(getApplicationContext());
modelAdapter = new TransactionListAdapter(transactions);
RecyclerView root = findViewById(R.id.transaction_root);
progressBar.setVisibility(View.GONE);
swiper.setRefreshing(false);
if (success) {
- MobileLedgerDatabase dbh = new MobileLedgerDatabase(this);
Date now = new Date();
- dbh.set_option_value("transaction_list_last_update", now.getTime());
+ MLDB.set_option_value(getApplicationContext(), "transaction_list_last_update",
+ now.getTime());
updateLastUpdateText(now);
modelAdapter.notifyDataSetChanged();
}
import net.ktnx.mobileledger.model.LedgerTransaction;
import net.ktnx.mobileledger.model.LedgerTransactionItem;
-import net.ktnx.mobileledger.utils.MobileLedgerDatabase;
+import net.ktnx.mobileledger.utils.MLDB;
import java.util.Iterator;
import java.util.List;
LedgerTransaction tr = transactions.get(position);
Context ctx = holder.row.getContext();
Resources rm = ctx.getResources();
- try (MobileLedgerDatabase dbh = new MobileLedgerDatabase(ctx)) {
- try (SQLiteDatabase db = dbh.getReadableDatabase()) {
- tr.loadData(db);
+ try (SQLiteDatabase db = MLDB.getReadableDatabase(ctx.getApplicationContext())) {
+ tr.loadData(db);
holder.tvDescription
.setText(String.format("%s\n%s", tr.getDescription(), tr.getDate()));
import net.ktnx.mobileledger.AccountSummary;
import net.ktnx.mobileledger.R;
import net.ktnx.mobileledger.model.LedgerAccount;
-import net.ktnx.mobileledger.utils.MobileLedgerDatabase;
+import net.ktnx.mobileledger.utils.MLDB;
import net.ktnx.mobileledger.utils.NetworkUtil;
import java.io.BufferedReader;
try {
HttpURLConnection http = NetworkUtil.prepare_connection( pref, "add");
publishProgress(0);
- try(MobileLedgerDatabase dbh = new MobileLedgerDatabase(mContext.get())) {
- try(SQLiteDatabase db = dbh.getWritableDatabase()) {
+ 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) {
import net.ktnx.mobileledger.TransactionListActivity;
import net.ktnx.mobileledger.model.LedgerTransaction;
import net.ktnx.mobileledger.model.LedgerTransactionItem;
-import net.ktnx.mobileledger.utils.MobileLedgerDatabase;
+import net.ktnx.mobileledger.utils.MLDB;
import net.ktnx.mobileledger.utils.NetworkUtil;
import java.io.BufferedReader;
publishProgress(progress);
Context ctx = contextRef.get();
if (ctx == null) return null;
- try (MobileLedgerDatabase dbh = new MobileLedgerDatabase(ctx)) {
- try (SQLiteDatabase db = dbh.getWritableDatabase()) {
+ 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()));
package net.ktnx.mobileledger.ui.transaction_list;
import android.arch.lifecycle.ViewModel;
+import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import net.ktnx.mobileledger.model.LedgerTransaction;
-import net.ktnx.mobileledger.utils.MobileLedgerDatabase;
+import net.ktnx.mobileledger.utils.MLDB;
import java.util.ArrayList;
import java.util.List;
private List<LedgerTransaction> transactions;
- public List<LedgerTransaction> getTransactions(MobileLedgerDatabase dbh) {
+ public List<LedgerTransaction> getTransactions(Context context) {
if (transactions == null) {
transactions = new ArrayList<>();
- reloadTransactions(dbh);
+ reloadTransactions(context);
}
return transactions;
}
- private void reloadTransactions(MobileLedgerDatabase dbh) {
+ private void reloadTransactions(Context context) {
transactions.clear();
String sql = "SELECT id FROM transactions ORDER BY date desc, id desc";
- try (SQLiteDatabase db = dbh.getReadableDatabase()) {
+ try (SQLiteDatabase db = MLDB.getReadableDatabase(context)) {
try (Cursor cursor = db.rawQuery(sql, null)) {
while (cursor.moveToNext()) {
transactions.add(new LedgerTransaction(cursor.getInt(0)));
--- /dev/null
+/*
+ * Copyright © 2018 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your opinion), any later version.
+ *
+ * Mobile-Ledger is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License terms for details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mobile-Ledger. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package net.ktnx.mobileledger.utils;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.database.SQLException;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.util.Log;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Locale;
+
+import static net.ktnx.mobileledger.utils.MLDB.DatabaseMode.READ;
+import static net.ktnx.mobileledger.utils.MLDB.DatabaseMode.WRITE;
+
+public final class MLDB {
+ public enum DatabaseMode { READ, WRITE };
+ public static final String ACCOUNTS_TABLE = "accounts";
+ public static final String DESCRIPTION_HISTORY_TABLE = "description_history";
+ private static MobileLedgerDatabase helperForReading, helperForWriting;
+
+ public static synchronized SQLiteDatabase getDatabase(Context context, DatabaseMode mode) {
+ if (mode == READ) {
+ if (helperForReading == null) helperForReading = new MobileLedgerDatabase(context);
+ return helperForReading.getReadableDatabase();
+ }
+ else {
+ if (helperForWriting == null) helperForWriting = new MobileLedgerDatabase(context);
+ return helperForWriting.getWritableDatabase();
+ }
+ }
+ public static SQLiteDatabase getReadableDatabase(Context context) {
+ return getDatabase(context, READ);
+ }
+ public static SQLiteDatabase getWritableDatabase(Context context) {
+ return getDatabase(context, WRITE);
+ }
+ static public int get_option_value(Context context, String name, int default_value) {
+ String s = get_option_value(context, name, String.valueOf(default_value));
+ try {
+ return Integer.parseInt(s);
+ }
+ catch (Exception e) {
+ Log.d("db", "returning default int value of " + name, e);
+ return default_value;
+ }
+ }
+
+ static public long get_option_value(Context context, String name, long default_value) {
+ String s = get_option_value(context, name, String.valueOf(default_value));
+ try {
+ return Long.parseLong(s);
+ }
+ catch (Exception e) {
+ Log.d("db", "returning default long value of " + name, e);
+ return default_value;
+ }
+ }
+
+ static public String get_option_value(Context context, String name, String default_value) {
+ Log.d("db", "about to fetch option " + name);
+ try (SQLiteDatabase db = getReadableDatabase(context)) {
+ try (Cursor cursor = db
+ .rawQuery("select value from options where name=?", new String[]{name}))
+ {
+ if (cursor.moveToFirst()) {
+ String result = cursor.getString(0);
+
+ if (result == null) result = default_value;
+
+ Log.d("db", "option " + name + "=" + result);
+ return result;
+ }
+ else return default_value;
+ }
+ catch (Exception e) {
+ Log.d("db", "returning default value for " + name, e);
+ return default_value;
+ }
+ }
+ }
+
+ static public void set_option_value(Context context, String name, String value) {
+ Log.d("db", "setting option " + name + "=" + value);
+ try (SQLiteDatabase db = getWritableDatabase(context)) {
+ db.execSQL("insert or replace into options(name, value) values(?, ?);",
+ new String[]{name, value});
+ }
+ }
+
+ static public void set_option_value(Context context, String name, long value) {
+ set_option_value(context, name, String.valueOf(value));
+ }
+}
+
+class MobileLedgerDatabase extends SQLiteOpenHelper implements AutoCloseable {
+ public static final String DB_NAME = "mobile-ledger.db";
+ public static final int LATEST_REVISION = 8;
+
+ private final Context mContext;
+
+ public MobileLedgerDatabase(Context context) {
+ super(context, DB_NAME, null, LATEST_REVISION);
+ Log.d("db", "creating helper instance");
+ mContext = context;
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ Log.d("db", "onCreate called");
+ onUpgrade(db, -1, LATEST_REVISION);
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ Log.d("db", "onUpgrade called");
+ for (int i = oldVersion + 1; i <= newVersion; i++) applyRevision(db, i);
+ }
+
+ private void applyRevision(SQLiteDatabase db, int rev_no) {
+ final Resources rm = mContext.getResources();
+ String rev_file = String.format(Locale.US, "sql_%d", rev_no);
+
+ int res_id = rm.getIdentifier(rev_file, "raw", mContext.getPackageName());
+ if (res_id == 0) throw new SQLException(
+ String.format(Locale.US, "No resource for revision %d", rev_no));
+ db.beginTransaction();
+ try (InputStream res = rm.openRawResource(res_id)) {
+ Log.d("db", "Applying revision " + String.valueOf(rev_no));
+ InputStreamReader isr = new InputStreamReader(res);
+ BufferedReader reader = new BufferedReader(isr);
+
+ String line;
+ while ((line = reader.readLine()) != null) {
+ db.execSQL(line);
+ }
+
+ db.setTransactionSuccessful();
+ }
+ catch (IOException e) {
+ Log.e("db", String.format("Error opening raw resource for revision %d", rev_no));
+ e.printStackTrace();
+ }
+ finally {
+ db.endTransaction();
+ }
+ }
+}
+++ /dev/null
-/*
- * Copyright © 2018 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
- * the Free Software Foundation, either version 3 of the License, or
- * (at your opinion), any later version.
- *
- * Mobile-Ledger is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License terms for details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Mobile-Ledger. If not, see <https://www.gnu.org/licenses/>.
- */
-
-package net.ktnx.mobileledger.utils;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.database.Cursor;
-import android.database.SQLException;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.util.Log;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Locale;
-
-public class MobileLedgerDatabase extends SQLiteOpenHelper implements AutoCloseable {
- public static final String DB_NAME = "mobile-ledger.db";
- public static final String ACCOUNTS_TABLE = "accounts";
- public static final String DESCRIPTION_HISTORY_TABLE = "description_history";
- public static final int LATEST_REVISION = 8;
-
- private final Context mContext;
-
- public
- MobileLedgerDatabase(Context context) {
- super(context, DB_NAME, null, LATEST_REVISION);
- Log.d("db", "creating helper instance");
- mContext = context;
- }
-
- @Override
- public
- void onCreate(SQLiteDatabase db) {
- Log.d("db", "onCreate called");
- onUpgrade(db, -1, LATEST_REVISION);
- }
-
- @Override
- public
- void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- Log.d("db", "onUpgrade called");
- for(int i = oldVersion+1; i <= newVersion; i++) applyRevision(db, i);
- }
-
- private void applyRevision(SQLiteDatabase db, int
- rev_no) {
- final Resources rm = mContext.getResources();
- String rev_file = String.format(Locale.US, "sql_%d", rev_no);
-
- int res_id = rm.getIdentifier(rev_file, "raw", mContext.getPackageName());
- if (res_id == 0)
- throw new SQLException(String.format(Locale.US, "No resource for revision %d", rev_no));
- db.beginTransaction();
- try (InputStream res = rm.openRawResource(res_id)) {
- Log.d("db", "Applying revision " + String.valueOf(rev_no));
- InputStreamReader isr = new InputStreamReader(res);
- BufferedReader reader = new BufferedReader(isr);
-
- String line;
- while ((line = reader.readLine()) != null) {
- db.execSQL(line);
- }
-
- db.setTransactionSuccessful();
- }
- catch (IOException e) {
- Log.e("db", String.format("Error opening raw resource for revision %d", rev_no));
- e.printStackTrace();
- }
- finally {
- db.endTransaction();
- }
- }
- public int get_option_value(String name, int default_value) {
- String s = get_option_value(name, String.valueOf(default_value));
- try {
- return Integer.parseInt(s);
- }
- catch (Exception e) {
- Log.d("db", "returning default int value of "+name, e);
- return default_value;
- }
- }
-
- public long get_option_value(String name, long default_value) {
- String s = get_option_value(name, String.valueOf(default_value));
- try {
- return Long.parseLong(s);
- }
- catch (Exception e) {
- Log.d("db", "returning default long value of "+name, e);
- return default_value;
- }
- }
-
- public String get_option_value(String name, String default_value) {
- Log.d("db", "about to fetch option "+name);
- try(SQLiteDatabase db = getReadableDatabase()) {
- try (Cursor cursor = db
- .rawQuery("select value from options where name=?", new String[]{name}))
- {
- if (cursor.moveToFirst()) {
- String result = cursor.getString(0);
-
- if (result == null) result = default_value;
-
- Log.d("db", "option " + name + "=" + result);
- return result;
- }
- else return default_value;
- }
- catch (Exception e) {
- Log.d("db", "returning default value for " + name, e);
- return default_value;
- }
- }
- }
-
- public void set_option_value(String name, String value) {
- Log.d("db", "setting option "+name+"="+value);
- try(SQLiteDatabase db = getWritableDatabase()) {
- db.execSQL("insert or replace into options(name, value) values(?, ?);",
- new String[]{name, value});
- }
- }
-
- public void set_option_value(String name, long value) {
- set_option_value(name, String.valueOf(value));
- }
- public static long get_option_value(Context context, String name, long default_value) {
- try(MobileLedgerDatabase db = new MobileLedgerDatabase(context)) {
- return db.get_option_value(name, default_value);
- }
- }
- public static void set_option_value(Context context, String name, String value) {
- try(MobileLedgerDatabase db = new MobileLedgerDatabase(context)) {
- db.set_option_value(name, value);
- }
- }
-}