/*
- * Copyright © 2019 Damyan Ivanov.
+ * Copyright © 2020 Damyan Ivanov.
* This file is part of MoLe.
* MoLe is free software: you can distribute it and/or modify it
* under the term of the GNU General Public License as published by
package net.ktnx.mobileledger.ui.activity;
-import android.os.AsyncTask;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
-import android.widget.ProgressBar;
-import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
-import androidx.lifecycle.ViewModelProviders;
-import androidx.recyclerview.widget.ItemTouchHelper;
-import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.google.android.material.floatingactionbutton.FloatingActionButton;
-import com.google.android.material.snackbar.BaseTransientBottomBar;
-import com.google.android.material.snackbar.Snackbar;
+import androidx.lifecycle.ViewModelProvider;
+import androidx.navigation.NavController;
+import androidx.navigation.fragment.NavHostFragment;
import net.ktnx.mobileledger.BuildConfig;
import net.ktnx.mobileledger.R;
import net.ktnx.mobileledger.async.TaskCallback;
import net.ktnx.mobileledger.model.Data;
import net.ktnx.mobileledger.model.LedgerTransaction;
-import net.ktnx.mobileledger.model.LedgerTransactionAccount;
-import java.util.Date;
import java.util.Objects;
import static net.ktnx.mobileledger.utils.Logger.debug;
-/*
- * 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)
- * */
-
-public class NewTransactionActivity extends ProfileThemedActivity implements TaskCallback {
- private static SendTransactionTask saver;
- private ProgressBar progress;
- private FloatingActionButton fab;
- private NewTransactionItemsAdapter listAdapter;
- private NewTransactionModel viewModel;
- private RecyclerView list;
+public class NewTransactionActivity extends ProfileThemedActivity implements TaskCallback,
+ NewTransactionFragment.OnNewTransactionFragmentInteractionListener {
+ private NavController navController;
+ private NewTransactionModel model;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_transaction);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
- Data.profile.observe(this,
+ Data.observeProfile(this,
mobileLedgerProfile -> toolbar.setSubtitle(mobileLedgerProfile.getName()));
- progress = findViewById(R.id.save_transaction_progress);
- fab = findViewById(R.id.fab);
- fab.setOnClickListener(v -> saveTransaction());
+ NavHostFragment navHostFragment = (NavHostFragment) Objects.requireNonNull(
+ getSupportFragmentManager().findFragmentById(R.id.new_transaction_nav));
+ navController = navHostFragment.getNavController();
Objects.requireNonNull(getSupportActionBar())
.setDisplayHomeAsUpEnabled(true);
- list = findViewById(R.id.new_transaction_accounts);
- viewModel = ViewModelProviders.of(this)
- .get(NewTransactionModel.class);
- listAdapter = new NewTransactionItemsAdapter(viewModel, mProfile);
- list.setAdapter(listAdapter);
- list.setLayoutManager(new LinearLayoutManager(this));
- Data.profile.observe(this, profile -> listAdapter.setProfile(profile));
- listAdapter.notifyDataSetChanged();
- new ItemTouchHelper(new ItemTouchHelper.Callback() {
- @Override
- public int getMovementFlags(@NonNull RecyclerView recyclerView,
- @NonNull RecyclerView.ViewHolder viewHolder) {
- int flags = makeFlag(ItemTouchHelper.ACTION_STATE_IDLE, ItemTouchHelper.END);
- // the top item is always there (date and description)
- if (viewHolder.getAdapterPosition() > 0) {
- if (viewModel.getAccountCount() > 2) {
- flags |= makeFlag(ItemTouchHelper.ACTION_STATE_SWIPE,
- ItemTouchHelper.START | ItemTouchHelper.END);
- }
- }
- return flags;
- }
- @Override
- public boolean onMove(@NonNull RecyclerView recyclerView,
- @NonNull RecyclerView.ViewHolder viewHolder,
- @NonNull RecyclerView.ViewHolder target) {
- return false;
- }
- @Override
- public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
- if (viewModel.getAccountCount() == 2)
- Snackbar.make(list, R.string.msg_at_least_two_accounts_are_required,
- Snackbar.LENGTH_LONG)
- .setAction("Action", null)
- .show();
- else {
- int pos = viewHolder.getAdapterPosition();
- viewModel.removeItem(pos - 1);
- listAdapter.notifyItemRemoved(pos);
- viewModel.sendCountNotifications(); // needed after items re-arrangement
- viewModel.checkTransactionSubmittable(listAdapter);
- }
- }
- }).attachToRecyclerView(list);
-
- viewModel.isSubmittable()
- .observe(this, isSubmittable -> {
- if (isSubmittable) {
- if (fab != null) {
- fab.show();
- fab.setEnabled(true);
- }
- }
- else {
- if (fab != null) {
- fab.hide();
- }
- }
- });
- viewModel.checkTransactionSubmittable(listAdapter);
+ model = new ViewModelProvider(this).get(NewTransactionModel.class);
}
@Override
protected void initProfile() {
@Override
public void finish() {
super.finish();
- overridePendingTransition(R.anim.dummy, R.anim.slide_out_right);
+ overridePendingTransition(R.anim.dummy, R.anim.slide_out_down);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- finish();
- return true;
+ if (item.getItemId() == android.R.id.home) {
+ finish();
+ return true;
}
return super.onOptionsItemSelected(item);
}
- @Override
- protected void onStart() {
- super.onStart();
- // FIXME if (tvDescription.getText().toString().isEmpty()) tvDescription.requestFocus();
- }
- public void saveTransaction() {
- if (fab != null)
- fab.setEnabled(false);
- listAdapter.toggleAllEditing(false);
- progress.setVisibility(View.VISIBLE);
+ public void onTransactionSave(LedgerTransaction tr) {
+ navController.navigate(R.id.action_newTransactionFragment_to_newTransactionSavingFragment);
try {
- saver = new SendTransactionTask(this, mProfile);
-
- Date date = viewModel.getDate();
- LedgerTransaction tr =
- new LedgerTransaction(null, date, viewModel.getDescription(), mProfile);
-
- LedgerTransactionAccount emptyAmountAccount = null;
- float emptyAmountAccountBalance = 0;
- for (int i = 0; i < viewModel.getAccountCount(); i++) {
- LedgerTransactionAccount acc = viewModel.getAccount(i);
- if (acc.getAccountName()
- .trim()
- .isEmpty())
- continue;
-
- if (acc.isAmountSet()) {
- emptyAmountAccountBalance += acc.getAmount();
- }
- else {
- emptyAmountAccount = acc;
- }
-
- tr.addAccount(acc);
- }
-
- if (emptyAmountAccount != null)
- emptyAmountAccount.setAmount(-emptyAmountAccountBalance);
+ SendTransactionTask saver =
+ new SendTransactionTask(this, mProfile, model.getSimulateSave());
saver.execute(tr);
}
catch (Exception e) {
debug("new-transaction", "Unknown error", e);
- progress.setVisibility(View.GONE);
- listAdapter.toggleAllEditing(true);
- if (fab != null)
- fab.setEnabled(true);
+ Bundle b = new Bundle();
+ b.putString("error", "unknown error");
+ navController.navigate(R.id.newTransactionFragment, b);
}
}
public void simulateCrash(MenuItem item) {
if (BuildConfig.DEBUG) {
menu.findItem(R.id.action_simulate_crash)
.setVisible(true);
+ menu.findItem(R.id.action_simulate_save)
+ .setVisible(true);
}
+ model.observeSimulateSave(this, state -> {
+ menu.findItem(R.id.action_simulate_save)
+ .setChecked(state);
+ findViewById(R.id.simulationLabel).setVisibility(state ? View.VISIBLE : View.GONE);
+ });
+
return true;
}
return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
getResources().getDisplayMetrics()));
}
- public void resetTransactionFromMenu(MenuItem item) {
- listAdapter.reset();
- }
@Override
public void done(String error) {
- progress.setVisibility(View.INVISIBLE);
- debug("visuals", "hiding progress");
-
- if (error == null)
- listAdapter.reset();
+ Bundle b = new Bundle();
+ if (error != null) {
+ b.putString("error", error);
+ navController.navigate(R.id.action_newTransactionSavingFragment_Failure, b);
+ }
else
- Snackbar.make(list, error, BaseTransientBottomBar.LENGTH_LONG)
- .show();
-
- listAdapter.toggleAllEditing(true);
-
- viewModel.checkTransactionSubmittable(listAdapter);
+ navController.navigate(R.id.action_newTransactionSavingFragment_Success, b);
}
-
- private class AsyncCrasher extends AsyncTask<Void, Void, Void> {
- @Override
- protected Void doInBackground(Void... voids) {
- throw new RuntimeException("Simulated crash");
- }
+ public void toggleSimulateSave(MenuItem item) {
+ model.toggleSimulateSave();
}
}