Skip to content

Commit 0935748

Browse files
committed
Fixed: Crash when bulk moving transactions
Fixed: Missing string for internationalization in ru_RU locale - fixes #143 Fixed: Random crashes when opening ScheduledTransactions list - fixes #141 Fixed: Blank screen after closing AccountFormFragment Fixed: Correct normal balance of the different types of ASSET accounts Fixed: Limit the target accounts for bulk transfers to same currency and non-placeholder accounts Improved: Remember last opened tab in accounts list Improved: Added version infomation for feedback email Updated version for 1.3.1 beta release
1 parent fc1a97b commit 0935748

File tree

10 files changed

+86
-49
lines changed

10 files changed

+86
-49
lines changed

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
Change Log
22
===============================================================================
3+
Version 1.3.1 *(2014-02-14)*
4+
----------------------------
5+
* Fixed: Crash when bulk moving transactions
6+
* Fixed: Missing string for internationalization in ru_RU locale
7+
* Fixed: Random crashes when opening ScheduledTransactions list
8+
* Fixed: Blank screen after closing AccountFormFragment
9+
* Fixed: Correct normal balance of the different types of ASSET accounts
10+
* Fixed: Limit the target accounts for bulk transfers to same currency and non-placeholder accounts
11+
* Improved: Remember last opened tab in accounts list
12+
* Improved: Added version information for feedback email
13+
* Improved: Lists of accounts are now sorted by the fully qualified account name
14+
315
Version 1.3.0 *(2014-02-10)*
416
----------------------------
517
* Fixed: Some file managers do not display all files available for import

app/AndroidManifest.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717

1818
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
1919
package="org.gnucash.android"
20-
android:versionCode="25"
21-
android:versionName="1.3.0" >
20+
android:versionCode="26"
21+
android:versionName="@string/app_version_name" >
2222

2323
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15"/>
2424

app/res/values-ru/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@
336336
<string name="title_progress_importing_accounts">Импортируются счета</string>
337337
<string name="toast_tap_again_to_confirm_delete">Нажмите ещё раз для подтверждения. ВСЕ записи будут удалены!</string>
338338
<string name="section_header_transactions">Проводки</string>
339-
<string name="section_header_accounts">Дочерние счета</string>
339+
<string name="section_header_subaccounts">Дочерние счета</string>
340340
<string name="menu_search_accounts">Поиск</string>
341341
<string name="title_default_export_format">Формат экспорта по умолчанию</string>
342342
<string name="summary_default_export_format">Формат файла, используемый по умолчанию при экспорте</string>

app/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
1919
<string name="app_name">GnuCash</string>
20+
<string name="app_version_name">1.3.1</string>
2021
<string name="title_add_account">Create Account</string>
2122
<string name="title_edit_account">Edit Account</string>
2223
<string name="info_details">Info</string>

app/res/xml/preference_headers.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
</header>
3030
<header android:title="Send feedback">
3131
<intent android:action="android.intent.action.VIEW"
32-
android:data="mailto:[email protected]?subject=GnuCash Android Feedback" />
32+
android:data="mailto:[email protected]" >
33+
<extra android:name="android.intent.extra.SUBJECT" android:value="GnuCash Android Feedback" />
34+
<extra android:name="android.intent.extra.TEXT" android:value="@string/app_version_name" />
35+
</intent>
3336
</header>
3437
</preference-headers>

app/src/org/gnucash/android/model/Account.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,9 @@ public class Account {
7171
* they are currently not used except for exporting
7272
*/
7373
public enum AccountType {
74-
CASH(TransactionType.DEBIT), BANK, CREDIT, ASSET(TransactionType.DEBIT), LIABILITY, INCOME,
75-
EXPENSE(TransactionType.DEBIT), PAYABLE, RECEIVABLE, EQUITY, CURRENCY, STOCK, MUTUAL, ROOT;
74+
CASH(TransactionType.DEBIT), BANK(TransactionType.DEBIT), CREDIT, ASSET(TransactionType.DEBIT), LIABILITY,
75+
INCOME, EXPENSE(TransactionType.DEBIT), PAYABLE, RECEIVABLE(TransactionType.DEBIT), EQUITY, CURRENCY,
76+
STOCK(TransactionType.DEBIT), MUTUAL(TransactionType.DEBIT), ROOT;
7677

7778
/**
7879
* Indicates that this type of normal balance the account type has

app/src/org/gnucash/android/ui/account/AccountsActivity.java

Lines changed: 42 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@
5858
import java.io.FileNotFoundException;
5959
import java.io.InputStream;
6060
import java.util.Currency;
61+
import java.util.HashMap;
6162
import java.util.Locale;
63+
import java.util.Map;
6264

6365
/**
6466
* Manages actions related to accounts, displaying, exporting and creating new accounts
@@ -123,12 +125,21 @@ public class AccountsActivity extends SherlockFragmentActivity implements OnAcco
123125
*/
124126
public static final int INDEX_FAVORITE_ACCOUNTS_FRAGMENT = 2;
125127

128+
/**
129+
* Used to save the index of the last open tab and restore the pager to that index
130+
*/
131+
public static final String LAST_OPEN_TAB_INDEX = "last_open_tab";
132+
126133
/**
127134
* Map containing fragments for the different tabs
128135
*/
129-
private SparseArray<Refreshable> mFragmentPageReferenceMap = new SparseArray<Refreshable>();
136+
private Map<Integer,Refreshable> mFragmentPageReferenceMap = new HashMap<Integer, Refreshable>();
137+
138+
/**
139+
* ViewPager which manages the different tabs
140+
*/
141+
private ViewPager mPager;
130142

131-
132143
/**
133144
* Dialog which is shown to the user on first start prompting the user to create some accounts
134145
*/
@@ -201,14 +212,14 @@ public void onCreate(Bundle savedInstanceState) {
201212

202213
init();
203214

204-
ViewPager pager = (ViewPager) findViewById(R.id.pager);
215+
mPager = (ViewPager) findViewById(R.id.pager);
205216
TitlePageIndicator titlePageIndicator = (TitlePageIndicator) findViewById(R.id.titles);
206217

207218
final Intent intent = getIntent();
208219
String action = intent.getAction();
209220
if (action != null && action.equals(Intent.ACTION_INSERT_OR_EDIT)) {
210221
//enter account creation/edit mode if that was specified
211-
pager.setVisibility(View.GONE);
222+
mPager.setVisibility(View.GONE);
212223
titlePageIndicator.setVisibility(View.GONE);
213224

214225
long accountId = intent.getLongExtra(UxArgument.SELECTED_ACCOUNT_ID, 0L);
@@ -219,15 +230,15 @@ public void onCreate(Bundle savedInstanceState) {
219230
showAddAccountFragment(parentAccountId);
220231
}
221232
} else if (action != null && action.equals(ACTION_VIEW_RECURRING)) {
222-
pager.setVisibility(View.GONE);
233+
mPager.setVisibility(View.GONE);
223234
titlePageIndicator.setVisibility(View.GONE);
224235
showRecurringTransactionsFragment();
225236
} else {
226237
//show the simple accounts list
227238
PagerAdapter mPagerAdapter = new AccountViewPagerAdapter(getSupportFragmentManager());
228-
pager.setAdapter(mPagerAdapter);
229-
titlePageIndicator.setViewPager(pager);
230-
pager.setCurrentItem(INDEX_TOP_LEVEL_ACCOUNTS_FRAGMENT);
239+
mPager.setAdapter(mPagerAdapter);
240+
titlePageIndicator.setViewPager(mPager);
241+
mPager.setCurrentItem(INDEX_TOP_LEVEL_ACCOUNTS_FRAGMENT);
231242
}
232243

233244
}
@@ -268,6 +279,16 @@ private void init() {
268279
protected void onResume() {
269280
super.onResume();
270281
TransactionsActivity.sLastTitleColor = -1;
282+
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
283+
int lastTabIndex = preferences.getInt(LAST_OPEN_TAB_INDEX, INDEX_TOP_LEVEL_ACCOUNTS_FRAGMENT);
284+
mPager.setCurrentItem(lastTabIndex);
285+
}
286+
287+
@Override
288+
protected void onStop() {
289+
super.onPause();
290+
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
291+
preferences.edit().putInt(LAST_OPEN_TAB_INDEX, mPager.getCurrentItem()).commit();
271292
}
272293

273294
/**
@@ -276,25 +297,19 @@ protected void onResume() {
276297
* @return <code>true</code> if the minor version has been increased, <code>false</code> otherwise.
277298
*/
278299
private boolean hasNewFeatures(){
279-
try {
280-
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
281-
String versionName = packageInfo.versionName;
282-
int end = versionName.indexOf('.');
283-
int currentMinor = Integer.parseInt(versionName.substring(0, end));
284-
285-
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
286-
int previousMinor = prefs.getInt(getString(R.string.key_previous_minor_version), 0);
287-
if (currentMinor > previousMinor){
288-
Editor editor = prefs.edit();
289-
editor.putInt(getString(R.string.key_previous_minor_version), currentMinor);
290-
editor.commit();
291-
return true;
292-
}
293-
} catch (NameNotFoundException e) {
294-
//do not show anything in that case
295-
e.printStackTrace();
296-
}
297-
return false;
300+
String versionName = getResources().getString(R.string.app_version_name);
301+
int end = versionName.indexOf('.');
302+
int currentMinor = Integer.parseInt(versionName.substring(0, end));
303+
304+
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
305+
int previousMinor = prefs.getInt(getString(R.string.key_previous_minor_version), 0);
306+
if (currentMinor > previousMinor){
307+
Editor editor = prefs.edit();
308+
editor.putInt(getString(R.string.key_previous_minor_version), currentMinor);
309+
editor.commit();
310+
return true;
311+
}
312+
return false;
298313
}
299314

300315
/**
@@ -409,7 +424,6 @@ private void showAccountFormFragment(Bundle args){
409424
fragmentTransaction.replace(R.id.fragment_container,
410425
accountFormFragment, AccountsActivity.FRAGMENT_NEW_ACCOUNT);
411426

412-
fragmentTransaction.addToBackStack(null);
413427
fragmentTransaction.commit();
414428
}
415429

app/src/org/gnucash/android/ui/transaction/BulkMoveDialogFragment.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818

1919
import org.gnucash.android.R;
2020
import org.gnucash.android.db.AccountsDbAdapter;
21+
import org.gnucash.android.db.DatabaseHelper;
2122
import org.gnucash.android.db.TransactionsDbAdapter;
2223
import org.gnucash.android.ui.UxArgument;
24+
import org.gnucash.android.ui.util.Refreshable;
2325
import org.gnucash.android.ui.widget.WidgetConfigurationActivity;
2426

2527
import android.database.Cursor;
@@ -102,7 +104,12 @@ public void onActivityCreated(Bundle savedInstanceState) {
102104
getDialog().setTitle(title);
103105

104106
mAccountsDbAdapter = new AccountsDbAdapter(getActivity());
105-
Cursor cursor = mAccountsDbAdapter.fetchAllRecordsOrderedByFullName();
107+
String conditions = "(" + DatabaseHelper.KEY_ROW_ID + " != " + mOriginAccountId + " AND "
108+
+ DatabaseHelper.KEY_CURRENCY_CODE + " = '" + mAccountsDbAdapter.getCurrencyCode(mOriginAccountId)
109+
+ "' AND " + DatabaseHelper.KEY_UID + " != '" + mAccountsDbAdapter.getGnuCashRootAccountUID()
110+
+ "' AND " + DatabaseHelper.KEY_PLACEHOLDER + " = 0"
111+
+ ")";
112+
Cursor cursor = mAccountsDbAdapter.fetchAccountsOrderedByFullName(conditions);
106113

107114
SimpleCursorAdapter mCursorAdapter = new QualifiedAccountNameCursorAdapter(getActivity(),
108115
android.R.layout.simple_spinner_item, cursor);
@@ -142,13 +149,9 @@ public void onClick(View v) {
142149
trxnAdapter.moveTranscation(trxnId, dstAccountId);
143150
}
144151
trxnAdapter.close();
145-
146-
Fragment f = getActivity()
147-
.getSupportFragmentManager()
148-
.findFragmentByTag(TransactionsActivity.FRAGMENT_TRANSACTIONS_LIST);
149-
152+
150153
WidgetConfigurationActivity.updateAllWidgets(getActivity());
151-
((TransactionsListFragment)f).refresh();
154+
((Refreshable)getTargetFragment()).refresh();
152155
dismiss();
153156
}
154157
});

app/src/org/gnucash/android/ui/transaction/ScheduledTransactionsListFragment.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -351,14 +351,16 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
351351
parentView.post(new Runnable() {
352352
@Override
353353
public void run() {
354-
float extraPadding = getResources().getDimension(R.dimen.edge_padding);
355-
final android.graphics.Rect hitRect = new Rect();
356-
checkBoxView.getHitRect(hitRect);
357-
hitRect.right += extraPadding;
358-
hitRect.bottom += 3*extraPadding;
359-
hitRect.top -= extraPadding;
360-
hitRect.left -= 2*extraPadding;
361-
parentView.setTouchDelegate(new TouchDelegate(hitRect, checkBoxView));
354+
if (isAdded()){ //may be run when fragment has been unbound from activity
355+
float extraPadding = getResources().getDimension(R.dimen.edge_padding);
356+
final android.graphics.Rect hitRect = new Rect();
357+
checkBoxView.getHitRect(hitRect);
358+
hitRect.right += extraPadding;
359+
hitRect.bottom += 3*extraPadding;
360+
hitRect.top -= extraPadding;
361+
hitRect.left -= 2*extraPadding;
362+
parentView.setTouchDelegate(new TouchDelegate(hitRect, checkBoxView));
363+
}
362364
}
363365
});
364366

app/src/org/gnucash/android/ui/transaction/TransactionsListFragment.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ protected void showBulkMoveDialog(){
341341
args.putLong(UxArgument.ORIGIN_ACCOUNT_ID, mAccountID);
342342
args.putLongArray(UxArgument.SELECTED_TRANSACTION_IDS, getListView().getCheckedItemIds());
343343
bulkMoveFragment.setArguments(args);
344+
bulkMoveFragment.setTargetFragment(this, 0);
344345
bulkMoveFragment.show(ft, "bulk_move_dialog");
345346
}
346347

0 commit comments

Comments
 (0)