Skip to content

Commit

Permalink
Calculator error parsing amount string. (codinguser#67)
Browse files Browse the repository at this point in the history
  • Loading branch information
pnemonic78 committed Apr 3, 2024
1 parent 4a494be commit f552d54
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,26 +21,20 @@
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.assertThat;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withInputType;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;

import android.Manifest;
import android.app.UiAutomation;
import android.content.Intent;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.text.InputType;

import androidx.test.espresso.action.ViewActions;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.rule.ActivityTestRule;
import androidx.test.rule.GrantPermissionRule;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.uiautomator.UiDevice;

import org.gnucash.android.R;
import org.gnucash.android.app.GnuCashApplication;
Expand All @@ -58,7 +52,6 @@
import org.gnucash.android.ui.transaction.TransactionsActivity;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.ClassRule;
Expand All @@ -84,10 +77,6 @@ public class CalculatorEditTextTest {
private static SplitsDbAdapter mSplitsDbAdapter;
private TransactionsActivity mTransactionsActivity;

public CalculatorEditTextTest() {
}


@Rule
public GrantPermissionRule animationPermissionsRule = GrantPermissionRule.grant(Manifest.permission.SET_ANIMATION_SCALE);

Expand All @@ -113,7 +102,6 @@ public static void prepTestCase() {

@Before
public void setUp() throws Exception {

mAccountsDbAdapter.deleteAllRecords();

CommoditiesDbAdapter commoditiesDbAdapter = CommoditiesDbAdapter.getInstance();
Expand All @@ -132,7 +120,6 @@ public void setUp() throws Exception {
intent.putExtra(UxArgument.SELECTED_ACCOUNT_UID, DUMMY_ACCOUNT_UID);
mActivityRule.launchActivity(intent);
mTransactionsActivity = mActivityRule.getActivity();

}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,14 @@
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.cursoradapter.widget.SimpleCursorAdapter;
import androidx.fragment.app.Fragment;

import com.google.android.material.snackbar.Snackbar;

import net.objecthunter.exp4j.Expression;
import net.objecthunter.exp4j.ExpressionBuilder;

Expand Down Expand Up @@ -381,8 +382,7 @@ private boolean canSave() {
*/
private void saveSplits() {
if (!canSave()) {
Toast.makeText(getActivity(), R.string.toast_error_check_split_amounts,
Toast.LENGTH_SHORT).show();
Snackbar.make(getView(), R.string.toast_error_check_split_amounts, Snackbar.LENGTH_SHORT).show();
return;
}

Expand All @@ -402,13 +402,12 @@ private ArrayList<Split> extractSplitsFromView() {
ArrayList<Split> splitList = new ArrayList<>();
for (View splitView : mSplitItemViewList) {
SplitViewHolder viewHolder = (SplitViewHolder) splitView.getTag();
if (viewHolder.splitAmountEditText.getValue() == null)
BigDecimal enteredAmount = viewHolder.splitAmountEditText.getValue();
if (enteredAmount == null)
continue;

BigDecimal amountBigDecimal = viewHolder.splitAmountEditText.getValue();

String currencyCode = mAccountsDbAdapter.getCurrencyCode(mAccountUID);
Money valueAmount = new Money(amountBigDecimal.abs(), Commodity.getInstance(currencyCode));
Money valueAmount = new Money(enteredAmount.abs(), Commodity.getInstance(currencyCode));

String accountUID = mAccountsDbAdapter.getUID(viewHolder.accountsSpinner.getSelectedItemId());
Split split = new Split(valueAmount, accountUID);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
Expand Down Expand Up @@ -287,10 +286,10 @@ private void startTransferFunds() {
|| mSplitQuantity != null) //if both accounts have same currency
return;

BigDecimal amountBigd = mAmountEditText.getValue();
if ((amountBigd == null) || amountBigd.equals(BigDecimal.ZERO))
BigDecimal enteredAmount = mAmountEditText.getValue();
if ((enteredAmount == null) || enteredAmount.equals(BigDecimal.ZERO))
return;
Money amount = new Money(amountBigd, fromCommodity).abs();
Money amount = new Money(enteredAmount, fromCommodity).abs();

TransferFundsDialogFragment fragment
= TransferFundsDialogFragment.getInstance(amount, targetCurrencyCode, this);
Expand Down Expand Up @@ -610,15 +609,19 @@ private void updateTransferAccountsList() {
* Opens the split editor dialog
*/
private void openSplitEditor() {
if (mAmountEditText.getValue() == null) {
Toast.makeText(getActivity(), R.string.toast_enter_amount_to_split, Toast.LENGTH_SHORT).show();
BigDecimal enteredAmount = mAmountEditText.getValue();
if (enteredAmount == null) {
Snackbar.make(getView(), R.string.toast_enter_amount_to_split, Snackbar.LENGTH_SHORT).show();
mAmountEditText.requestFocus();
mAmountEditText.setError(getString(R.string.toast_enter_amount_to_split));
return;
} else {
mAmountEditText.setError(null);
}

String baseAmountString;

if (mTransaction == null) { //if we are creating a new transaction (not editing an existing one)
BigDecimal enteredAmount = mAmountEditText.getValue();
baseAmountString = enteredAmount.toPlainString();
} else {
Money biggestAmount = Money.createZeroInstance(mTransaction.getCurrencyCode());
Expand Down Expand Up @@ -717,9 +720,10 @@ private List<Split> extractSplitsFromView() {
return mSplitsList;
}

BigDecimal amountBigd = mAmountEditText.getValue();
BigDecimal enteredAmount = mAmountEditText.getValue();
if (enteredAmount == null) enteredAmount = BigDecimal.ZERO;
String baseCurrencyCode = mTransactionsDbAdapter.getAccountCurrencyCode(mAccountUID);
Money value = new Money(amountBigd, Commodity.getInstance(baseCurrencyCode));
Money value = new Money(enteredAmount, Commodity.getInstance(baseCurrencyCode));
Money quantity = new Money(value);

String transferAcctUID = getTransferAccountUID();
Expand Down Expand Up @@ -917,16 +921,15 @@ private void scheduleRecurringTransaction(String transactionUID) {
} else {
scheduledAction.setUID(scheduledActionUID);
scheduledActionDbAdapter.updateRecurrenceAttributes(scheduledAction);
Toast.makeText(getActivity(), R.string.toast_updated_transaction_recurring_schedule, Toast.LENGTH_SHORT).show();
Snackbar.make(getView(), R.string.toast_updated_transaction_recurring_schedule, Snackbar.LENGTH_SHORT).show();
}
} else {
if (recurrence != null) {
scheduledAction.setActionUID(transactionUID);
scheduledActionDbAdapter.addRecord(scheduledAction, DatabaseAdapter.UpdateMethod.replace);
Toast.makeText(getActivity(), R.string.toast_scheduled_recurring_transaction, Toast.LENGTH_SHORT).show();
Snackbar.make(getView(), R.string.toast_scheduled_recurring_transaction, Snackbar.LENGTH_SHORT).show();
}
}

}


Expand Down Expand Up @@ -954,16 +957,18 @@ public boolean onOptionsItemSelected(MenuItem item) {
return true;

case R.id.menu_save:
View parentLayout = getActivity().findViewById(android.R.id.content);

if (canSave()) {
saveNewTransaction();
} else {
if (mAmountEditText.getValue() == null) {
Snackbar.make(parentLayout, R.string.toast_transanction_amount_required, Snackbar.LENGTH_LONG).show();
Snackbar.make(getView(), R.string.toast_transanction_amount_required, Snackbar.LENGTH_LONG).show();
mAmountEditText.requestFocus();
mAmountEditText.setError(getString(R.string.toast_transanction_amount_required));
} else {
mAmountEditText.setError(null);
}
if (mUseDoubleEntry && mTransferAccountSpinner.getCount() == 0) {
Snackbar.make(parentLayout,
Snackbar.make(getView(),
R.string.toast_disable_double_entry_to_save_transaction,
Snackbar.LENGTH_LONG).show();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -315,10 +315,14 @@ public boolean isInputModified() {
*/
public @Nullable BigDecimal getValue() {
evaluate();
String text = getText().toString();
if (text.isEmpty()) {
return null;
}
try { //catch any exceptions in the conversion e.g. if a string with only "-" is entered
return AmountParser.parse(getText().toString());
return AmountParser.parse(text);
} catch (ParseException e) {
String msg = "Error parsing amount string " + getText() + " from CalculatorEditText";
String msg = "Error parsing amount string \"" + text + "\" from CalculatorEditText";
Timber.i(e, msg);
return null;
}
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/java/org/gnucash/android/util/AmountParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ public class AmountParser {
* @throws ParseException if the full string couldn't be parsed as an amount.
*/
public static BigDecimal parse(String amount) throws ParseException {
if (amount == null || amount.isEmpty()) {
throw new ParseException("Parse error", 0);
}
DecimalFormat formatter = (DecimalFormat) NumberFormat.getNumberInstance();
formatter.setParseBigDecimal(true);
ParsePosition parsePosition = new ParsePosition(0);
Expand Down

0 comments on commit f552d54

Please sign in to comment.