import android.content.Context;
import android.content.Intent;
import android.database.AbstractCursor;
-import android.database.Cursor;
import android.os.Bundle;
import android.os.ParcelFormatException;
-import android.text.TextUtils;
import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import androidx.activity.result.ActivityResultLauncher;
-import androidx.annotation.NonNull;
import androidx.core.view.MenuCompat;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.fragment.NavHostFragment;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.google.android.material.snackbar.Snackbar;
import net.ktnx.mobileledger.BuildConfig;
import net.ktnx.mobileledger.R;
-import net.ktnx.mobileledger.async.AsyncCrasher;
import net.ktnx.mobileledger.async.DescriptionSelectedCallback;
+import net.ktnx.mobileledger.async.GeneralBackgroundTasks;
import net.ktnx.mobileledger.async.SendTransactionTask;
import net.ktnx.mobileledger.async.TaskCallback;
+import net.ktnx.mobileledger.dao.BaseDAO;
+import net.ktnx.mobileledger.dao.TransactionDAO;
import net.ktnx.mobileledger.databinding.ActivityNewTransactionBinding;
import net.ktnx.mobileledger.db.DB;
import net.ktnx.mobileledger.db.TemplateHeader;
+import net.ktnx.mobileledger.db.TransactionWithAccounts;
import net.ktnx.mobileledger.model.Data;
import net.ktnx.mobileledger.model.LedgerTransaction;
import net.ktnx.mobileledger.model.MatchedTemplate;
import net.ktnx.mobileledger.ui.FabManager;
import net.ktnx.mobileledger.ui.QR;
import net.ktnx.mobileledger.ui.activity.ProfileThemedActivity;
+import net.ktnx.mobileledger.ui.activity.SplashActivity;
import net.ktnx.mobileledger.ui.templates.TemplatesActivity;
import net.ktnx.mobileledger.utils.Logger;
-import net.ktnx.mobileledger.utils.MLDB;
import net.ktnx.mobileledger.utils.Misc;
import java.util.ArrayList;
b = ActivityNewTransactionBinding.inflate(getLayoutInflater(), null, false);
setContentView(b.getRoot());
setSupportActionBar(b.toolbar);
- Data.observeProfile(this,
- mobileLedgerProfile -> b.toolbar.setSubtitle(mobileLedgerProfile.getName()));
+ Data.observeProfile(this, profile -> {
+ if (profile == null) {
+ Logger.debug("new-t-act", "no active profile. Redirecting to SplashActivity");
+ Intent intent = new Intent(this, SplashActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_TASK_ON_HOME | Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(intent);
+ finish();
+ }
+ else
+ b.toolbar.setSubtitle(profile.getName());
+ });
NavHostFragment navHostFragment = (NavHostFragment) Objects.requireNonNull(
getSupportFragmentManager().findFragmentById(R.id.new_transaction_nav));
try {
SendTransactionTask saver =
- new SendTransactionTask(this, mProfile, model.getSimulateSaveFlag());
- saver.execute(tr);
+ new SendTransactionTask(this, mProfile, tr, model.getSimulateSaveFlag());
+ saver.start();
}
catch (Exception e) {
- debug("new-transaction", "Unknown error", e);
+ debug("new-transaction", "Unknown error: " + e);
Bundle b = new Bundle();
b.putString("error", "unknown error");
}
public boolean onSimulateCrashMenuItemClicked(MenuItem item) {
debug("crash", "Will crash intentionally");
- new AsyncCrasher().execute();
+ GeneralBackgroundTasks.run(() -> { throw new RuntimeException("Simulated crash");});
return true;
}
public boolean onCreateOptionsMenu(Menu menu) {
getResources().getDisplayMetrics()));
}
@Override
- public void done(String error) {
+ public void onTransactionSaveDone(String error, Object arg) {
Bundle b = new Bundle();
if (error != null) {
b.putString("error", error);
navController.navigate(R.id.action_newTransactionSavingFragment_Failure, b);
}
- else
+ else {
navController.navigate(R.id.action_newTransactionSavingFragment_Success, b);
+
+ BaseDAO.runAsync(() -> commitToDb((LedgerTransaction) arg));
+ }
+ }
+ public void commitToDb(LedgerTransaction tr) {
+ TransactionWithAccounts dbTransaction = tr.toDBO();
+ DB.get()
+ .getTransactionDAO()
+ .appendSync(dbTransaction);
}
public boolean onToggleSimulateSaveMenuItemClicked(MenuItem item) {
model.toggleSimulateSave();
.create()
.show();
}
- public void descriptionSelected(String description) {
+ public void onDescriptionSelected(String description) {
debug("description selected", description);
if (!model.accountListIsEmpty())
return;
- String accFilter = mProfile.getPreferredAccountsFilter();
-
- ArrayList<String> params = new ArrayList<>();
- StringBuilder sb = new StringBuilder("select t.profile, t.id from transactions t");
+ BaseDAO.runAsync(() -> {
+ String accFilter = mProfile.getPreferredAccountsFilter();
- if (!TextUtils.isEmpty(accFilter)) {
- sb.append(" JOIN transaction_accounts ta")
- .append(" ON ta.profile = t.profile")
- .append(" AND ta.transaction_id = t.id");
- }
+ TransactionDAO trDao = DB.get()
+ .getTransactionDAO();
- sb.append(" WHERE t.description=?");
- params.add(description);
-
- if (!TextUtils.isEmpty(accFilter)) {
- sb.append(" AND ta.account_name LIKE '%'||?||'%'");
- params.add(accFilter);
- }
+ TransactionWithAccounts tr = null;
- sb.append(" ORDER BY t.year desc, t.month desc, t.day desc LIMIT 1");
+ if (Misc.emptyIsNull(accFilter) != null)
+ tr = trDao.getFirstByDescriptionHavingAccountSync(description, accFilter);
+ if (tr == null)
+ tr = trDao.getFirstByDescriptionSync(description);
- final String sql = sb.toString();
- debug("description", sql);
- debug("description", params.toString());
-
- // FIXME: handle exceptions?
- MLDB.queryInBackground(sql, params.toArray(new String[]{}), new MLDB.CallbackHelper() {
- @Override
- public void onStart() {
- model.incrementBusyCounter();
- }
- @Override
- public void onDone() {
- model.decrementBusyCounter();
- }
- @Override
- public boolean onRow(@NonNull Cursor cursor) {
- final long profileId = cursor.getLong(0);
- final int transactionId = cursor.getInt(1);
- runOnUiThread(() -> model.loadTransactionIntoModel(profileId, transactionId));
- return false; // limit 1, by the way
- }
- @Override
- public void onNoRows() {
- if (TextUtils.isEmpty(accFilter))
- return;
-
- debug("description", "Trying transaction search without preferred account filter");
-
- final String broaderSql =
- "select t.profile, t.id from transactions t where t.description=?" +
- " ORDER BY year desc, month desc, day desc LIMIT 1";
- params.remove(1);
- debug("description", broaderSql);
- debug("description", description);
-
- runOnUiThread(() -> Snackbar.make(b.newTransactionNav,
- R.string.ignoring_preferred_account, Snackbar.LENGTH_INDEFINITE)
- .show());
-
- MLDB.queryInBackground(broaderSql, new String[]{description},
- new MLDB.CallbackHelper() {
- @Override
- public void onStart() {
- model.incrementBusyCounter();
- }
- @Override
- public boolean onRow(@NonNull Cursor cursor) {
- final long profileId = cursor.getLong(0);
- final int transactionId = cursor.getInt(1);
- runOnUiThread(() -> model.loadTransactionIntoModel(profileId,
- transactionId));
- return false;
- }
- @Override
- public void onDone() {
- model.decrementBusyCounter();
- }
- });
- }
+ if (tr != null)
+ model.loadTransactionIntoModel(tr);
});
}
private void onFabPressed() {