diff --git a/CHANGELOG.md b/CHANGELOG.md index 481f7a9be..c2247b57f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ Change Log =============================================================================== +Version 1.5.2 *(2015-01-26)* +---------------------------- +* Fixed: Crash when importing XML with TRADING accounts +* Fixed: Full name not updated when account name is changed +* Fixed: Toggle button shown when double-entry is disabled +* Fixed: Amount input problems on some devices or keyboards +* Fixed: Crash when changing the parent of an account +* Fixed: Deleting a transaction only deletes some splits, not the whole. + Version 1.5.1 *(2014-10-08)* ---------------------------- * Fixed: Crash when upgrading from v1.4.x to v1.5.x diff --git a/CONTRIBUTORS b/CONTRIBUTORS index ac8d111d0..914ec14b7 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -18,4 +18,7 @@ Pedro Abel windwarrior Oleksandr Tyshkovets Lei Xiao Bao -Yongxin Wang \ No newline at end of file +Yongxin Wang +Matthew Hague +Spanti Nicola +Jesse Shieh \ No newline at end of file diff --git a/app/AndroidManifest.xml b/app/AndroidManifest.xml index bb5e85fb3..e8b95b82f 100644 --- a/app/AndroidManifest.xml +++ b/app/AndroidManifest.xml @@ -17,7 +17,7 @@ diff --git a/app/pom.xml b/app/pom.xml index 1d5b95158..943109fba 100644 --- a/app/pom.xml +++ b/app/pom.xml @@ -22,7 +22,7 @@ Gnucash Android companion application - 1.5.1-SNAPSHOT + 1.5.2-SNAPSHOT org.gnucash.android gnucash-android-parent diff --git a/app/res/values-de/strings.xml b/app/res/values-de/strings.xml index 8bb64a179..fcd0d7d4d 100644 --- a/app/res/values-de/strings.xml +++ b/app/res/values-de/strings.xml @@ -364,6 +364,7 @@ WÄHRUNG AKTIENKONTO INVESTMENTFONDS + TRADING QIF diff --git a/app/res/values-el/strings.xml b/app/res/values-el/strings.xml index 001b3eb86..7ecd03097 100644 --- a/app/res/values-el/strings.xml +++ b/app/res/values-el/strings.xml @@ -379,6 +379,7 @@ ΝΟΜΙΣΜΑ ΜΕΤΟΧΗ ΑΜΟΙΒΑΙΟ ΚΕΦΑΛΑΙΟ + TRADING QIF diff --git a/app/res/values-es-rMX/strings.xml b/app/res/values-es-rMX/strings.xml index 478058cda..a1a311d8e 100644 --- a/app/res/values-es-rMX/strings.xml +++ b/app/res/values-es-rMX/strings.xml @@ -364,6 +364,7 @@ DIVISA ACCIONES FONDOS + TRADING QIF diff --git a/app/res/values-es/strings.xml b/app/res/values-es/strings.xml index 9ff3b5934..1fd5b2bf7 100644 --- a/app/res/values-es/strings.xml +++ b/app/res/values-es/strings.xml @@ -364,6 +364,7 @@ DIVISA ACCIONES FONDOS + TRADING QIF diff --git a/app/res/values-fr/strings.xml b/app/res/values-fr/strings.xml index afa76eda5..df6536761 100644 --- a/app/res/values-fr/strings.xml +++ b/app/res/values-fr/strings.xml @@ -362,6 +362,7 @@ DEVISES ACTIONS FONDS COMMUNS + TRADING QIF diff --git a/app/res/values-hu/strings.xml b/app/res/values-hu/strings.xml index 34f1c293a..9fc0013e4 100644 --- a/app/res/values-hu/strings.xml +++ b/app/res/values-hu/strings.xml @@ -366,6 +366,7 @@ CURRENCY STOCK MUTUAL FUND + TRADING QIF diff --git a/app/res/values-it/strings.xml b/app/res/values-it/strings.xml index dd4a4b39a..d635b32fb 100644 --- a/app/res/values-it/strings.xml +++ b/app/res/values-it/strings.xml @@ -366,6 +366,7 @@ VALUTA AZIONE FONDO COMUNE + TRADING QIF diff --git a/app/res/values-nb/strings.xml b/app/res/values-nb/strings.xml index edbb061c9..a503fd154 100644 --- a/app/res/values-nb/strings.xml +++ b/app/res/values-nb/strings.xml @@ -365,6 +365,7 @@ VALUTA AKSJE AKSJEFOND + TRADING QIF diff --git a/app/res/values-nl/strings.xml b/app/res/values-nl/strings.xml index 701593649..7ebd8f30e 100644 --- a/app/res/values-nl/strings.xml +++ b/app/res/values-nl/strings.xml @@ -366,6 +366,7 @@ CURRENCY STOCK MUTUAL FUND + TRADING QIF diff --git a/app/res/values-pt-rBR/strings.xml b/app/res/values-pt-rBR/strings.xml index 06e1aef42..c1a814ac7 100644 --- a/app/res/values-pt-rBR/strings.xml +++ b/app/res/values-pt-rBR/strings.xml @@ -364,6 +364,7 @@ CURRENCY AÇÕES FUNDO MÚTUO + TRADING QIF diff --git a/app/res/values-ru/strings.xml b/app/res/values-ru/strings.xml index 876309c1e..941c12134 100644 --- a/app/res/values-ru/strings.xml +++ b/app/res/values-ru/strings.xml @@ -362,6 +362,7 @@ СОБСТВЕННЫЕ СРЕДСТВА ТОРГОВЛЯ ВЗАИМНЫЙ ФОНД + TRADING QIF diff --git a/app/res/values-zh/strings.xml b/app/res/values-zh/strings.xml index 23a3a9310..343f2e3e6 100644 --- a/app/res/values-zh/strings.xml +++ b/app/res/values-zh/strings.xml @@ -362,6 +362,7 @@ 货币 股票 共同基金 + TRADING QIF diff --git a/app/res/values/key_strings.xml b/app/res/values/key_strings.xml index 6a716b600..0d580e1f4 100644 --- a/app/res/values/key_strings.xml +++ b/app/res/values/key_strings.xml @@ -41,6 +41,7 @@ CURRENCY STOCK MUTUAL + TRADING QIF diff --git a/app/res/values/strings.xml b/app/res/values/strings.xml index 94988cebe..5b1ea7688 100644 --- a/app/res/values/strings.xml +++ b/app/res/values/strings.xml @@ -17,7 +17,7 @@ GnuCash - 1.5.1 + 1.5.2 Create Account Edit Account Info @@ -376,6 +376,7 @@ CURRENCY STOCK MUTUAL FUND + TRADING QIF diff --git a/app/src/org/gnucash/android/db/TransactionsDbAdapter.java b/app/src/org/gnucash/android/db/TransactionsDbAdapter.java index e27d7269d..5820adf9f 100644 --- a/app/src/org/gnucash/android/db/TransactionsDbAdapter.java +++ b/app/src/org/gnucash/android/db/TransactionsDbAdapter.java @@ -546,14 +546,10 @@ public Cursor fetchRecord(long rowId) { * @return Cursor to the data set containing all matching transactions */ public Cursor fetchTransactionsStartingWith(String prefix){ - StringBuffer stringBuffer = new StringBuffer(TransactionEntry.COLUMN_DESCRIPTION) - .append(" LIKE '").append(prefix).append("%'"); - String selection = stringBuffer.toString(); - return mDb.query(TransactionEntry.TABLE_NAME, new String[]{TransactionEntry._ID, TransactionEntry.COLUMN_DESCRIPTION}, - selection, - null, null, null, + TransactionEntry.COLUMN_DESCRIPTION + " LIKE ?", + new String[]{prefix+"%"}, null, null, TransactionEntry.COLUMN_DESCRIPTION + " ASC"); } diff --git a/app/src/org/gnucash/android/model/AccountType.java b/app/src/org/gnucash/android/model/AccountType.java index ea41c89d8..171156cdc 100644 --- a/app/src/org/gnucash/android/model/AccountType.java +++ b/app/src/org/gnucash/android/model/AccountType.java @@ -8,7 +8,7 @@ public enum AccountType { CASH(TransactionType.DEBIT), BANK(TransactionType.DEBIT), CREDIT, ASSET(TransactionType.DEBIT), LIABILITY, INCOME, EXPENSE(TransactionType.DEBIT), PAYABLE, RECEIVABLE(TransactionType.DEBIT), EQUITY, CURRENCY, - STOCK(TransactionType.DEBIT), MUTUAL(TransactionType.DEBIT), ROOT; + STOCK(TransactionType.DEBIT), MUTUAL(TransactionType.DEBIT), TRADING, ROOT; /** * Indicates that this type of normal balance the account type has diff --git a/app/src/org/gnucash/android/ui/account/AccountFormFragment.java b/app/src/org/gnucash/android/ui/account/AccountFormFragment.java index 91d5136ad..eb7f58716 100644 --- a/app/src/org/gnucash/android/ui/account/AccountFormFragment.java +++ b/app/src/org/gnucash/android/ui/account/AccountFormFragment.java @@ -554,10 +554,10 @@ private void loadParentAccountList(AccountType accountType){ if (mAccount != null){ //if editing an account mDescendantAccountUIDs = mAccountsDbAdapter.getDescendantAccountUIDs(mAccount.getUID(), null, null); - mDescendantAccountUIDs.add(mAccountUID); //cannot set self as parent // limit cyclic account hierarchies. condition += " AND (" + DatabaseSchema.AccountEntry.COLUMN_PARENT_ACCOUNT_UID + " IS NULL " - + " OR " + DatabaseSchema.AccountEntry.COLUMN_UID + " NOT IN ( '" + TextUtils.join("','", mDescendantAccountUIDs) + "' ) )"; + + " OR " + DatabaseSchema.AccountEntry.COLUMN_UID + " NOT IN ( '" + + TextUtils.join("','", mDescendantAccountUIDs) + "','" + mAccountUID + "' ) )"; } //if we are reloading the list, close the previous cursor first @@ -684,6 +684,7 @@ public void onDestroy() { private void saveAccount() { // accounts to update, in case we're updating full names of a sub account tree ArrayList accountsToUpdate = new ArrayList(); + boolean nameChanged = false; if (mAccount == null){ String name = getEnteredName(); if (name == null || name.length() == 0){ @@ -694,8 +695,10 @@ private void saveAccount() { } mAccount = new Account(getEnteredName()); } - else - mAccount.setName(getEnteredName()); + else { + nameChanged = !mAccount.getName().equals(getEnteredName()); + mAccount.setName(getEnteredName()); + } String curCode = mCurrencyCodes.get(mCurrencySpinner .getSelectedItemPosition()); @@ -730,8 +733,8 @@ private void saveAccount() { long parentAccountId = mAccountsDbAdapter.getID(mParentAccountUID); // update full names - if (mDescendantAccountUIDs == null || newParentAccountId != parentAccountId) { - // new Account or parent account changed + if (nameChanged || mDescendantAccountUIDs == null || newParentAccountId != parentAccountId) { + // current account name changed or new Account or parent account changed String newAccountFullName; if (newParentAccountId == mRootAccountId){ newAccountFullName = mAccount.getName(); @@ -742,8 +745,8 @@ private void saveAccount() { } mAccount.setFullName(newAccountFullName); if (mDescendantAccountUIDs != null) { - // modifying existing account - if (parentAccountId != newParentAccountId && mDescendantAccountUIDs.size() > 0) { + // modifying existing account, e.t. name changed and/or parent changed + if ((nameChanged || parentAccountId != newParentAccountId) && mDescendantAccountUIDs.size() > 0) { // parent change, update all full names of descent accounts accountsToUpdate.addAll(mAccountsDbAdapter.getSimpleAccountList( DatabaseSchema.AccountEntry.COLUMN_UID + " IN ('" + diff --git a/app/src/org/gnucash/android/ui/transaction/TransactionFormFragment.java b/app/src/org/gnucash/android/ui/transaction/TransactionFormFragment.java index aa993df41..f31827f7a 100644 --- a/app/src/org/gnucash/android/ui/transaction/TransactionFormFragment.java +++ b/app/src/org/gnucash/android/ui/transaction/TransactionFormFragment.java @@ -284,7 +284,7 @@ public CharSequence convertToString(Cursor cursor) { adapter.setFilterQueryProvider(new FilterQueryProvider() { @Override public Cursor runQuery(CharSequence name) { - return mTransactionsDbAdapter.fetchTransactionsStartingWith(name.toString()); + return mTransactionsDbAdapter.fetchTransactionsStartingWith(name==null?"":name.toString()); } }); @@ -343,15 +343,17 @@ private void initializeViewsWithTransaction(){ //if there are more than two splits (which is the default for one entry), then //disable editing of the transfer account. User should open editor - if (mTransaction.getSplits().size() > 2) { - setAmountEditViewVisible(View.GONE); - } else { + if (mSplitsList.size() == 2 && mSplitsList.get(0).isPairOf(mSplitsList.get(1))) { for (Split split : mTransaction.getSplits()) { //two splits, one belongs to this account and the other to another account if (mUseDoubleEntry && !split.getAccountUID().equals(mAccountUID)) { setSelectedTransferAccount(mAccountsDbAdapter.getAccountID(split.getAccountUID())); } } + } else { + if (mUseDoubleEntry) { + setAmountEditViewVisible(View.GONE); + } } mSplitsList = new ArrayList(mTransaction.getSplits()); //we need a copy so we can modify with impunity mAmountEditText.setEnabled(mSplitsList.size() <= 2); @@ -720,6 +722,7 @@ public void setSplitList(List splitList, List removedSplitUIDs){ Money balance = Transaction.computeBalance(mAccountUID, mSplitsList); mAmountEditText.setText(balance.toPlainString()); + mTransactionTypeButton.setChecked(balance.isNegative()); //once we set the split list, do not allow direct editing of the total if (mSplitsList.size() > 1){ mAmountEditText.setEnabled(false); diff --git a/app/src/org/gnucash/android/ui/transaction/TransactionsListFragment.java b/app/src/org/gnucash/android/ui/transaction/TransactionsListFragment.java index 337262b80..8cf642f85 100644 --- a/app/src/org/gnucash/android/ui/transaction/TransactionsListFragment.java +++ b/app/src/org/gnucash/android/ui/transaction/TransactionsListFragment.java @@ -117,11 +117,9 @@ public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return true; case R.id.context_menu_delete: - SplitsDbAdapter splitsDbAdapter = new SplitsDbAdapter(getActivity()); for (long id : getListView().getCheckedItemIds()) { - splitsDbAdapter.deleteSplitsForTransactionAndAccount(mTransactionsDbAdapter.getUID(id), mAccountUID); + mTransactionsDbAdapter.deleteRecord(id); } - splitsDbAdapter.close(); refresh(); mode.finish(); WidgetConfigurationActivity.updateAllWidgets(getActivity()); diff --git a/app/src/org/gnucash/android/ui/util/AmountInputFormatter.java b/app/src/org/gnucash/android/ui/util/AmountInputFormatter.java index 5e90b50da..abead0c4b 100644 --- a/app/src/org/gnucash/android/ui/util/AmountInputFormatter.java +++ b/app/src/org/gnucash/android/ui/util/AmountInputFormatter.java @@ -47,7 +47,7 @@ public AmountInputFormatter(EditText amountInput) { @Override public void afterTextChanged(Editable s) { - if (s.length() == 0) + if (s.length() == 0 || s.toString().equals(current)) return; //make sure that the sign of the input is in line with the type button state BigDecimal amount = TransactionFormFragment.parseInputToDecimal(s.toString()); diff --git a/app/src/org/gnucash/android/ui/util/TransactionTypeToggleButton.java b/app/src/org/gnucash/android/ui/util/TransactionTypeToggleButton.java index 23dba92ca..022141e61 100644 --- a/app/src/org/gnucash/android/ui/util/TransactionTypeToggleButton.java +++ b/app/src/org/gnucash/android/ui/util/TransactionTypeToggleButton.java @@ -93,6 +93,7 @@ public void setAccountType(AccountType accountType){ break; case CURRENCY: case ROOT: + default: setTextOn(context.getString(R.string.label_debit)); setTextOff(context.getString(R.string.label_credit)); break; diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml index b58439508..8c766e7a6 100644 --- a/integration-tests/pom.xml +++ b/integration-tests/pom.xml @@ -17,7 +17,7 @@ 4.0.0 - 1.5.1-SNAPSHOT + 1.5.2-SNAPSHOT org.gnucash.android gnucash-android-parent diff --git a/pom.xml b/pom.xml index 18ad16716..b66000058 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ 4.0.0 - 1.5.1-SNAPSHOT + 1.5.2-SNAPSHOT org.gnucash.android gnucash-android-parent GnuCash Android parent