import net.ktnx.mobileledger.ui.DatePickerFragment;
import net.ktnx.mobileledger.ui.OnSwipeTouchListener;
import net.ktnx.mobileledger.utils.Globals;
+import net.ktnx.mobileledger.utils.LockHolder;
import net.ktnx.mobileledger.utils.MLDB;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
-import java.util.List;
import java.util.Locale;
import java.util.Objects;
* TODO: reports
* TODO: get rid of the custom session/cookie and auth code?
* (the last problem with the POST was the missing content-length header)
- * TODO: nicer swiping removal with visual feedback
* */
public class NewTransactionActivity extends ProfileThemedActivity
}
private void hookSwipeListener(final TableRow row) {
row.getChildAt(0).setOnTouchListener(new OnSwipeTouchListener(this) {
- public void onSwipeLeft() {
-// Log.d("swipe", "LEFT" + row.getId());
+ private void onSwipeAside() {
if (table.getChildCount() > 2) {
TableRow prev_row = (TableRow) table.getChildAt(table.indexOfChild(row) - 1);
TableRow next_row = (TableRow) table.getChildAt(table.indexOfChild(row) + 1);
Snackbar.LENGTH_LONG).setAction("Action", null).show();
}
}
+ public void onSwipeLeft() {
+ onSwipeAside();
+ }
+ public void onSwipeRight() {
+ onSwipeAside();
+ }
// @Override
// public boolean performClick(View view, MotionEvent m) {
// return true;
Log.d("descr selected", description);
if (!inputStateIsInitial()) return;
- try (Cursor c = MLDB.getDatabase().rawQuery(
- "select profile, id from transactions where description=? order by date desc " +
- "limit 1", new String[]{description}))
- {
+ MobileLedgerProfile currentProfile = Data.profile.get();
+ String accFilter = currentProfile.getPreferredAccountsFilter();
+
+ ArrayList<String> params = new ArrayList<>();
+ StringBuilder sb = new StringBuilder(
+ "select t.profile, t.id from transactions t where t.description=?");
+ params.add(description);
+
+ if (accFilter != null) {
+ sb.append(" AND EXISTS (").append("SELECT 1 FROM transaction_accounts ta ")
+ .append("WHERE ta.profile = t.profile").append(" AND ta.transaction_id = t.id")
+ .append(" AND UPPER(ta.account_name) LIKE '%'||?||'%')");
+ params.add(accFilter.toUpperCase());
+ }
+
+ sb.append(" ORDER BY date desc limit 1");
+
+ final String sql = sb.toString();
+ Log.d("descr", sql);
+ Log.d("descr", params.toString());
+
+ try (Cursor c = MLDB.getDatabase().rawQuery(sql, params.toArray(new String[]{}))) {
if (!c.moveToNext()) return;
String profileUUID = c.getString(0);
int transactionId = c.getInt(1);
- List<MobileLedgerProfile> profiles = Data.profiles.getList();
- MobileLedgerProfile profile = null;
- for (int i = 0; i < profiles.size(); i++) {
- MobileLedgerProfile p = profiles.get(i);
- if (p.getUuid().equals(profileUUID)) {
- profile = p;
- break;
+ LedgerTransaction tr;
+ try (LockHolder lh = Data.profiles.lockForReading()) {
+ MobileLedgerProfile profile = null;
+ for (int i = 0; i < Data.profiles.size(); i++) {
+ MobileLedgerProfile p = Data.profiles.get(i);
+ if (p.getUuid().equals(profileUUID)) {
+ profile = p;
+ break;
+ }
}
- }
- if (profile == null) throw new RuntimeException(String.format(
- "Unable to find profile %s, which is supposed to contain " +
- "transaction %d with description %s", profileUUID, transactionId, description));
+ if (profile == null) throw new RuntimeException(String.format(
+ "Unable to find profile %s, which is supposed to contain " +
+ "transaction %d with description %s", profileUUID, transactionId,
+ description));
- LedgerTransaction tr = profile.loadTransaction(transactionId);
+ tr = profile.loadTransaction(transactionId);
+ }
int i = 0;
table = findViewById(R.id.new_transaction_accounts_table);
ArrayList<LedgerTransactionAccount> accounts = tr.getAccounts();
return true;
}
- private class AsyncCrasher extends AsyncTask<Void, Void, Void>{
+ private class AsyncCrasher extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
throw new RuntimeException("Simulated crash");