diff --git a/app/src/main/java/org/gnucash/android/ui/transaction/SplitEditorFragment.java b/app/src/main/java/org/gnucash/android/ui/transaction/SplitEditorFragment.java index a3a141a32..0b6416069 100644 --- a/app/src/main/java/org/gnucash/android/ui/transaction/SplitEditorFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/transaction/SplitEditorFragment.java @@ -25,6 +25,8 @@ import android.support.v4.widget.SimpleCursorAdapter; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; +import android.text.Editable; +import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -32,6 +34,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; +import android.widget.CompoundButton; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; @@ -41,6 +44,7 @@ import org.gnucash.android.R; import org.gnucash.android.db.AccountsDbAdapter; +import org.gnucash.android.db.CommoditiesDbAdapter; import org.gnucash.android.db.DatabaseSchema; import org.gnucash.android.model.AccountType; import org.gnucash.android.model.BaseModel; @@ -60,7 +64,6 @@ import java.math.BigDecimal; import java.util.ArrayList; -import java.util.Currency; import java.util.List; import butterknife.Bind; @@ -75,12 +78,14 @@ public class SplitEditorFragment extends Fragment { @Bind(R.id.split_list_layout) LinearLayout mSplitsLinearLayout; @Bind(R.id.calculator_keyboard) KeyboardView mKeyboardView; + @Bind(R.id.imbalance_textview) TextView mImbalanceTextView; private AccountsDbAdapter mAccountsDbAdapter; private Cursor mCursor; private SimpleCursorAdapter mCursorAdapter; private List mSplitItemViewList; private String mAccountUID; + private Commodity mCommodity; private BigDecimal mBaseAmount = BigDecimal.ZERO; @@ -88,6 +93,8 @@ public class SplitEditorFragment extends Fragment { CalculatorKeyboard mCalculatorKeyboard; + BalanceTextWatcher mImbalanceWatcher = new BalanceTextWatcher(); + /** * Create and return a new instance of the fragment with the appropriate paramenters * @param args Arguments to be set to the fragment.
@@ -143,6 +150,8 @@ public void onActivityCreated(Bundle savedInstanceState) { view.findViewById(R.id.input_accounts_spinner).setEnabled(false); view.findViewById(R.id.btn_remove_split).setVisibility(View.GONE); } + + TransactionsActivity.displayBalance(mImbalanceTextView, new Money(mBaseAmount.negate(), mCommodity)); } @Override @@ -214,6 +223,7 @@ private void initArgs() { + DatabaseSchema.AccountEntry.COLUMN_PLACEHOLDER + " = 0" + ")"; mCursor = mAccountsDbAdapter.fetchAccountsOrderedByFullName(conditions, null); + mCommodity = CommoditiesDbAdapter.getInstance().getCommodity(mAccountsDbAdapter.getCurrencyCode(mAccountUID)); } /** @@ -226,7 +236,7 @@ class SplitViewHolder implements OnTransferFundsListener{ @Bind(R.id.input_accounts_spinner) Spinner accountsSpinner; @Bind(R.id.split_currency_symbol) TextView splitCurrencyTextView; @Bind(R.id.split_uid) TextView splitUidTextView; - @Bind(R.id.btn_split_type) TransactionTypeSwitch splitTypeButton; + @Bind(R.id.btn_split_type) TransactionTypeSwitch splitTypeSwitch; View splitView; Money quantity; @@ -253,15 +263,15 @@ public void onClick(View view) { mRemovedSplitUIDs.add(splitUidTextView.getText().toString()); mSplitsLinearLayout.removeView(splitView); mSplitItemViewList.remove(splitView); + mImbalanceWatcher.afterTextChanged(null); } }); updateTransferAccountsList(accountsSpinner); - Currency accountCurrency = Currency.getInstance(mAccountsDbAdapter.getCurrencyCode(mAccountUID)); - splitCurrencyTextView.setText(accountCurrency.getSymbol()); - splitTypeButton.setAmountFormattingListener(splitAmountEditText, splitCurrencyTextView); - splitTypeButton.setChecked(mBaseAmount.signum() > 0); + splitCurrencyTextView.setText(mCommodity.getSymbol()); + splitTypeSwitch.setAmountFormattingListener(splitAmountEditText, splitCurrencyTextView); + splitTypeSwitch.setChecked(mBaseAmount.signum() > 0); splitUidTextView.setText(BaseModel.generateUID()); if (split != null) { @@ -272,12 +282,18 @@ public void onClick(View view) { splitUidTextView.setText(split.getUID()); String splitAccountUID = split.getAccountUID(); setSelectedTransferAccount(mAccountsDbAdapter.getID(splitAccountUID), accountsSpinner); - splitTypeButton.setAccountType(mAccountsDbAdapter.getAccountType(splitAccountUID)); - splitTypeButton.setChecked(split.getType()); + splitTypeSwitch.setAccountType(mAccountsDbAdapter.getAccountType(splitAccountUID)); + splitTypeSwitch.setChecked(split.getType()); } - accountsSpinner.setOnItemSelectedListener(new SplitAccountListener(splitTypeButton, this)); - + accountsSpinner.setOnItemSelectedListener(new SplitAccountListener(splitTypeSwitch, this)); + splitTypeSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + mImbalanceWatcher.afterTextChanged(null); + } + }); + splitAmountEditText.addTextChangedListener(mImbalanceWatcher); } } @@ -360,7 +376,7 @@ private List extractSplitsFromView(){ String accountUID = mAccountsDbAdapter.getUID(viewHolder.accountsSpinner.getSelectedItemId()); Split split = new Split(valueAmount, accountUID); split.setMemo(viewHolder.splitMemoEditText.getText().toString()); - split.setType(viewHolder.splitTypeButton.getTransactionType()); + split.setType(viewHolder.splitTypeSwitch.getTransactionType()); split.setUID(viewHolder.splitUidTextView.getText().toString().trim()); if (viewHolder.quantity != null) split.setQuantity(viewHolder.quantity.absolute()); @@ -369,6 +385,43 @@ private List extractSplitsFromView(){ return splitList; } + /** + * Updates the displayed balance of the accounts when the amount of a split is changed + */ + private class BalanceTextWatcher implements TextWatcher { + + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { + //nothing to see here, move along + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { + //nothing to see here, move along + } + + @Override + public void afterTextChanged(Editable editable) { + BigDecimal imbalance = BigDecimal.ZERO; + + for (View splitItem : mSplitItemViewList) { + SplitViewHolder viewHolder = (SplitViewHolder) splitItem.getTag(); + viewHolder.splitAmountEditText.removeTextChangedListener(this); + BigDecimal amount = viewHolder.splitAmountEditText.getValue(); + if (amount != null) { + if (viewHolder.splitTypeSwitch.isChecked()) { + imbalance = imbalance.subtract(amount); + } else { + imbalance = imbalance.add(amount); + } + } + viewHolder.splitAmountEditText.addTextChangedListener(this); + } + + TransactionsActivity.displayBalance(mImbalanceTextView, new Money(imbalance.negate(), mCommodity)); + } + } + /** * Listens to changes in the transfer account and updates the currency symbol, the label of the * transaction type and if neccessary diff --git a/app/src/main/java/org/gnucash/android/ui/transaction/TransactionFormFragment.java b/app/src/main/java/org/gnucash/android/ui/transaction/TransactionFormFragment.java index ed4c48f1c..6cd8d00b3 100644 --- a/app/src/main/java/org/gnucash/android/ui/transaction/TransactionFormFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/transaction/TransactionFormFragment.java @@ -39,6 +39,7 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.AutoCompleteTextView; @@ -355,6 +356,8 @@ public void onNothingSelected(AdapterView adapterView) { initializeViewsWithTransaction(); mEditMode = true; } + + getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); } /** diff --git a/app/src/main/java/org/gnucash/android/ui/util/widget/CalculatorEditText.java b/app/src/main/java/org/gnucash/android/ui/util/widget/CalculatorEditText.java index 2b6bb4551..cad60a0b6 100644 --- a/app/src/main/java/org/gnucash/android/ui/util/widget/CalculatorEditText.java +++ b/app/src/main/java/org/gnucash/android/ui/util/widget/CalculatorEditText.java @@ -37,14 +37,12 @@ import org.gnucash.android.R; import org.gnucash.android.app.GnuCashApplication; -import org.gnucash.android.db.CommoditiesDbAdapter; import org.gnucash.android.model.Commodity; import org.gnucash.android.ui.common.FormActivity; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; -import java.util.Currency; import java.util.Locale; /** diff --git a/app/src/main/res/layout/fragment_split_editor.xml b/app/src/main/res/layout/fragment_split_editor.xml index 884d8aebe..ebc5337ab 100644 --- a/app/src/main/res/layout/fragment_split_editor.xml +++ b/app/src/main/res/layout/fragment_split_editor.xml @@ -21,9 +21,37 @@ limitations under the License. android:layout_height="match_parent" tools:context=".ui.FormActivity"> + + + + + + + + + android:textSize="22sp"> + +