X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Factivity%2FNewTransactionActivity.java;h=310232d2057a6fc9585d5f29ec0118adfce629b9;hp=66c66da16472746c4b43146db0a4424ad662ba28;hb=c4d80cd461385af945cd3e599ad2307ad5adcfe6;hpb=889caa76c8e742031ad6cf7b8757fedfc06b52fe 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 66c66da1..310232d2 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 @@ -21,11 +21,6 @@ import android.annotation.SuppressLint; import android.database.Cursor; import android.os.AsyncTask; import android.os.Bundle; -import android.support.design.widget.BaseTransientBottomBar; -import android.support.design.widget.FloatingActionButton; -import android.support.design.widget.Snackbar; -import android.support.v4.app.DialogFragment; -import android.support.v7.widget.Toolbar; import android.text.Editable; import android.text.InputType; import android.text.TextWatcher; @@ -45,10 +40,14 @@ import android.widget.TableRow; import android.widget.TextView; import android.widget.Toast; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.android.material.snackbar.BaseTransientBottomBar; +import com.google.android.material.snackbar.Snackbar; + import net.ktnx.mobileledger.BuildConfig; import net.ktnx.mobileledger.R; import net.ktnx.mobileledger.async.DescriptionSelectedCallback; -import net.ktnx.mobileledger.async.SaveTransactionTask; +import net.ktnx.mobileledger.async.SendTransactionTask; import net.ktnx.mobileledger.async.TaskCallback; import net.ktnx.mobileledger.model.Data; import net.ktnx.mobileledger.model.LedgerTransaction; @@ -62,21 +61,22 @@ 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; +import androidx.appcompat.widget.Toolbar; +import androidx.fragment.app.DialogFragment; + /* * TODO: nicer progress while transaction is submitted * 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 CrashReportingActivity +public class NewTransactionActivity extends ProfileThemedActivity implements TaskCallback, DescriptionSelectedCallback { - private static SaveTransactionTask saver; + private static SendTransactionTask saver; private TableLayout table; private ProgressBar progress; private FloatingActionButton fab; @@ -92,7 +92,7 @@ public class NewTransactionActivity extends CrashReportingActivity setContentView(R.layout.activity_new_transaction); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - toolbar.setSubtitle(Data.profile.get().getName()); + toolbar.setSubtitle(mProfile.getName()); tvDate = findViewById(R.id.new_transaction_date); tvDate.setOnFocusChangeListener((v, hasFocus) -> { @@ -121,7 +121,16 @@ public class NewTransactionActivity extends CrashReportingActivity // Log.d("swipe", "hooked to row "+i); } } + @Override + protected void initProfile() { + String profileUUID = getIntent().getStringExtra("profile_uuid"); + if (profileUUID != null) { + mProfile = Data.getProfile(profileUUID); + if (mProfile == null) finish(); + } + else super.initProfile(); + } @Override public void finish() { super.finish(); @@ -148,7 +157,7 @@ public class NewTransactionActivity extends CrashReportingActivity progress.setVisibility(View.VISIBLE); try { - saver = new SaveTransactionTask(this); + saver = new SendTransactionTask(this, mProfile); String dateString = tvDate.getText().toString(); Date date; @@ -157,16 +166,30 @@ public class NewTransactionActivity extends CrashReportingActivity LedgerTransaction tr = new LedgerTransaction(date, tvDescription.getText().toString()); TableLayout table = findViewById(R.id.new_transaction_accounts_table); + LedgerTransactionAccount emptyAmountAccount = null; + float emptyAmountAccountBalance = 0; for (int i = 0; i < table.getChildCount(); i++) { TableRow row = (TableRow) table.getChildAt(i); String acc = ((TextView) row.getChildAt(0)).getText().toString(); + if (acc.isEmpty()) continue; + String amt = ((TextView) row.getChildAt(1)).getText().toString(); - LedgerTransactionAccount item = - amt.length() > 0 ? new LedgerTransactionAccount(acc, Float.parseFloat(amt)) - : new LedgerTransactionAccount(acc); + LedgerTransactionAccount item; + if (amt.length() > 0) { + final float amount = Float.parseFloat(amt); + item = new LedgerTransactionAccount(acc, amount); + emptyAmountAccountBalance += amount; + } + else { + item = new LedgerTransactionAccount(acc); + emptyAmountAccount = item; + } tr.addAccount(item); } + + if (emptyAmountAccount != null) + emptyAmountAccount.setAmount(-emptyAmountAccountBalance); saver.execute(tr); } catch (ParseException e) { @@ -200,8 +223,7 @@ public class NewTransactionActivity extends CrashReportingActivity } 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); @@ -235,6 +257,12 @@ public class NewTransactionActivity extends CrashReportingActivity 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; @@ -481,34 +509,43 @@ public class NewTransactionActivity extends CrashReportingActivity Log.d("descr selected", description); if (!inputStateIsInitial()) return; - try (Cursor c = MLDB.getReadableDatabase().rawQuery( - "select profile, id from transactions where description=? order by date desc " + - "limit 1", new String[]{description})) - { + String accFilter = mProfile.getPreferredAccountsFilter(); + + ArrayList 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 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; + MobileLedgerProfile profile = Data.getProfile(profileUUID); 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); - int i = 0; + tr = profile.loadTransaction(transactionId); table = findViewById(R.id.new_transaction_accounts_table); ArrayList accounts = tr.getAccounts(); TableRow firstNegative = null; int negativeCount = 0; - for (i = 0; i < accounts.size(); i++) { + for (int i = 0; i < accounts.size(); i++) { LedgerTransactionAccount acc = accounts.get(i); TableRow row = (TableRow) table.getChildAt(i); if (row == null) row = doAddAccountRow(false); @@ -549,7 +586,7 @@ public class NewTransactionActivity extends CrashReportingActivity return true; } - private class AsyncCrasher extends AsyncTask{ + private class AsyncCrasher extends AsyncTask { @Override protected Void doInBackground(Void... voids) { throw new RuntimeException("Simulated crash");