From 633b0b0e42f15aaef50ea7201ff9768fa77dfd02 Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Sat, 12 Jan 2019 06:21:41 +0000 Subject: [PATCH] new transaction: advance to next field upon autocompletion of account name or description --- .../ui/activity/NewTransactionActivity.java | 15 ++-- .../net/ktnx/mobileledger/utils/MLDB.java | 90 ++++++++++--------- 2 files changed, 56 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/activity/NewTransactionActivity.java b/app/src/main/java/net/ktnx/mobileledger/ui/activity/NewTransactionActivity.java index bc904a09..6f8c1b3d 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/activity/NewTransactionActivity.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/activity/NewTransactionActivity.java @@ -82,15 +82,12 @@ public class NewTransactionActivity extends AppCompatActivity implements TaskCal setSupportActionBar(toolbar); text_date = findViewById(R.id.new_transaction_date); - text_date.setOnFocusChangeListener(new View.OnFocusChangeListener() { - @Override - public void onFocusChange(View v, boolean hasFocus) { - if (hasFocus) pickTransactionDate(v); - } + text_date.setOnFocusChangeListener((v, hasFocus) -> { + if (hasFocus) pickTransactionDate(v); }); text_descr = findViewById(R.id.new_transaction_description); MLDB.hook_autocompletion_adapter(this, text_descr, MLDB.DESCRIPTION_HISTORY_TABLE, - "description", false); + "description", false, findViewById(R.id.new_transaction_acc_1)); hook_text_change_listener(text_descr); progress = findViewById(R.id.save_transaction_progress); @@ -102,8 +99,8 @@ public class NewTransactionActivity extends AppCompatActivity implements TaskCal AutoCompleteTextView acc_name_view = (AutoCompleteTextView) row.getChildAt(0); TextView amount_view = (TextView) row.getChildAt(1); hook_swipe_listener(row); - MLDB.hook_autocompletion_adapter(this, acc_name_view, MLDB.ACCOUNTS_TABLE, "name", - true); + MLDB.hook_autocompletion_adapter(this, acc_name_view, MLDB.ACCOUNTS_TABLE, "name", true, + amount_view); hook_text_change_listener(acc_name_view); hook_text_change_listener(amount_view); // Log.d("swipe", "hooked to row "+i); @@ -299,7 +296,7 @@ public class NewTransactionActivity extends AppCompatActivity implements TaskCal if (focus) acc.requestFocus(); hook_swipe_listener(row); - MLDB.hook_autocompletion_adapter(this, acc, MLDB.ACCOUNTS_TABLE, "name", true); + MLDB.hook_autocompletion_adapter(this, acc, MLDB.ACCOUNTS_TABLE, "name", true, amt); hook_text_change_listener(acc); hook_text_change_listener(amt); } diff --git a/app/src/main/java/net/ktnx/mobileledger/utils/MLDB.java b/app/src/main/java/net/ktnx/mobileledger/utils/MLDB.java index 393392c3..b3557936 100644 --- a/app/src/main/java/net/ktnx/mobileledger/utils/MLDB.java +++ b/app/src/main/java/net/ktnx/mobileledger/utils/MLDB.java @@ -29,6 +29,7 @@ import android.database.sqlite.SQLiteOpenHelper; import android.os.Build; import android.provider.FontsContract; import android.util.Log; +import android.view.View; import android.widget.AutoCompleteTextView; import android.widget.FilterQueryProvider; import android.widget.SimpleCursorAdapter; @@ -132,6 +133,13 @@ public final class MLDB { final AutoCompleteTextView view, final String table, final String field, final boolean profileSpecific) { + hook_autocompletion_adapter(context, view, table, field, profileSpecific, null); + } + @TargetApi(Build.VERSION_CODES.N) + public static void hook_autocompletion_adapter(final Context context, + final AutoCompleteTextView view, final String table, final String field, + final boolean profileSpecific, + final View nextView) { String[] from = {field}; int[] to = {android.R.id.text1}; SimpleCursorAdapter adapter = @@ -139,57 +147,59 @@ public final class MLDB { from, to, 0); adapter.setStringConversionColumn(1); - FilterQueryProvider provider = new FilterQueryProvider() { - @Override - public Cursor runQuery(CharSequence constraint) { - if (constraint == null) return null; + FilterQueryProvider provider = constraint -> { + if (constraint == null) return null; - String str = constraint.toString().toUpperCase(); - Log.d("autocompletion", "Looking for " + str); - String[] col_names = {FontsContract.Columns._ID, field}; - MatrixCursor c = new MatrixCursor(col_names); + String str = constraint.toString().toUpperCase(); + Log.d("autocompletion", "Looking for " + str); + String[] col_names = {FontsContract.Columns._ID, field}; + MatrixCursor c = new MatrixCursor(col_names); - String sql; - String[] params; - if (profileSpecific) { - sql = 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 profile=? AND %s_upper LIKE '%%'||?||'%%' " + - "ORDER BY 2, 1;", field, field, field, field, table, field); - params = new String[]{str, str, str, Data.profile.get().getUuid(), str}; - } - else { - sql = 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); - params = new String[]{str, str, str, str}; - } - Log.d("autocompletion", sql); - SQLiteDatabase db = MLDB.getReadableDatabase(); + String sql; + String[] params; + if (profileSpecific) { + sql = 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 profile=? AND %s_upper LIKE '%%'||?||'%%' " + + "ORDER BY 2, 1;", field, field, field, field, table, field); + params = new String[]{str, str, str, Data.profile.get().getUuid(), str}; + } + else { + sql = 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); + params = new String[]{str, str, str, str}; + } + Log.d("autocompletion", sql); + SQLiteDatabase db = MLDB.getReadableDatabase(); - try (Cursor matches = db.rawQuery(sql, params)) { - int i = 0; - while (matches.moveToNext()) { - String match = matches.getString(0); - int order = matches.getInt(1); - Log.d("autocompletion", String.format("match: %s |%d", match, order)); - c.newRow().add(i++).add(match); - } + try (Cursor matches = db.rawQuery(sql, params)) { + int i = 0; + while (matches.moveToNext()) { + String match = matches.getString(0); + int order = matches.getInt(1); + Log.d("autocompletion", String.format("match: %s |%d", match, order)); + c.newRow().add(i++).add(match); } + } - return c; + return c; - } }; adapter.setFilterQueryProvider(provider); view.setAdapter(adapter); + + if (nextView != null) { + view.setOnItemClickListener((parent, itemView, position, id) -> { + nextView.requestFocus(View.FOCUS_FORWARD); + }); + } } public static void init(Application context) { MLDB.context = context; -- 2.39.2