Skip to content

Commit c677fdc

Browse files
committed
Merge branch 'develop' into passcode
2 parents e85aa3c + e0eaa3d commit c677fdc

39 files changed

Lines changed: 1021 additions & 485 deletions

.travis.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
language: android
22
jdk: oraclejdk7
3+
env: _JAVA_OPTIONS="-Xmx768m -Xms768m"
34
android:
45
components:
56
- platform-tools
@@ -14,18 +15,17 @@ android:
1415
- extra-google-google_play_services
1516
- extra-google-m2repository
1617
- extra-android-m2repository
17-
#- addon-google_apis-google-19
18+
- addon-google_apis-google-19
1819

1920
# Specify at least one system image,
2021
# if you need to run emulator(s) during your tests
2122
- sys-img-armeabi-v7a-android-19
2223

23-
before_install:
24-
#- echo yes | android update sdk --all --filter build-tools-22.0.1 --no-ui --force > /dev/null
25-
2624
# Emulator Management: Create, Start and Wait
2725
before_script:
26+
- mkdir sdcard
27+
- mksdcard -l gnucash-sdcard 64M sdcard/gnucash-sdcard.img
2828
- echo no | android create avd --force -n test -t android-19 --abi armeabi-v7a
29-
- emulator -avd test -no-skin -no-audio -no-window &
29+
- emulator -avd test -no-skin -no-audio -no-window -no-boot-anim -sdcard sdcard/gnucash-sdcard.img &
3030
- android-wait-for-emulator
3131
- adb shell input keyevent 82 &

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<a href="https://travis-ci.org/codinguser/gnucash-android">
1+
<a href="https://travis-ci.org/codinguser/gnucash-android" target="_blank">
22
<img src="https://travis-ci.org/codinguser/gnucash-android.svg?branch=develop" alt="Travis build status" />
33
</a>
44

app/build.gradle

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ apply plugin: 'crashlytics'
66
def versionMajor = 1
77
def versionMinor = 6
88
def versionPatch = 0
9-
def versionBuild = 3
9+
def versionBuild = 4
1010

1111
def buildTime() {
12-
def df = new SimpleDateFormat("yyyyMMdd_HHmm'UTC'")
12+
def df = new SimpleDateFormat("yyyyMMdd")
1313
df.setTimeZone(TimeZone.getTimeZone("UTC"))
1414
return df.format(new Date())
1515
}
@@ -24,12 +24,14 @@ android {
2424
buildToolsVersion "22.0.1"
2525
defaultConfig {
2626
applicationId "org.gnucash.android"
27+
testApplicationId 'org.gnucash.android.test'
2728
minSdkVersion 10
2829
targetSdkVersion 19
2930
versionCode versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild
3031
versionName "${versionMajor}.${versionMinor}.${versionPatch}"
3132
resValue "string", "app_version_name", "${versionName}"
3233
resValue "string", "app_minor_version", "${versionMinor}"
34+
buildConfigField "boolean", "USE_CRASHLYTICS", "false"
3335
if (project.hasProperty("RELEASE_DROPBOX_APP_KEY")){
3436
resValue "string", "dropbox_app_key", RELEASE_DROPBOX_APP_KEY
3537
resValue "string", "dropbox_app_secret", RELEASE_DROPBOX_APP_SECRET
@@ -69,11 +71,13 @@ android {
6971
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
7072
if (project.hasProperty("RELEASE_STORE_FILE")){
7173
signingConfig signingConfigs.release
74+
} else {
75+
signingConfig signingConfigs.debug
7276
}
7377
}
7478
debug {
7579
debuggable true
76-
ext.enableCrashlytics = false
80+
signingConfig signingConfigs.debug
7781
}
7882
}
7983
lintOptions {
@@ -83,7 +87,7 @@ android {
8387
productFlavors {
8488
development {
8589
applicationId 'org.gnucash.android.devel'
86-
testApplicationId 'org.gnucash.android.test.devel'
90+
testApplicationId 'org.gnucash.android.devel.test'
8791
resValue "string", "app_name", "GnuCash-devel"
8892
versionName "${versionMajor}.${versionMinor}.${versionPatch}-dev${versionBuild}_${buildTime()}"
8993
resValue "string", "app_version_name", "${versionName}"
@@ -93,11 +97,11 @@ android {
9397
resValue "string", "app_name", "GnuCash - beta"
9498
versionName "${versionMajor}.${versionMinor}.${versionPatch}-beta${versionBuild}_r${gitSha()}"
9599
resValue "string", "app_version_name", "${versionName}"
100+
buildConfigField "boolean", "USE_CRASHLYTICS", "true"
96101
}
97102

98103
production {
99104
resValue "string", "app_name", "GnuCash"
100-
ext.enableCrashlytics = false //TODO: enable for production builds
101105
}
102106

103107
}

app/src/androidTest/java/org/gnucash/android/test/ui/AccountsActivityTest.java

Lines changed: 50 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
import android.util.Log;
2828
import android.view.View;
2929
import android.widget.EditText;
30+
3031
import com.robotium.solo.Solo;
32+
3133
import org.gnucash.android.R;
3234
import org.gnucash.android.db.AccountsDbAdapter;
3335
import org.gnucash.android.db.DatabaseHelper;
@@ -37,7 +39,6 @@
3739
import org.gnucash.android.model.Money;
3840
import org.gnucash.android.model.Split;
3941
import org.gnucash.android.model.Transaction;
40-
import org.gnucash.android.test.util.ActionBarUtils;
4142
import org.gnucash.android.ui.account.AccountsActivity;
4243
import org.gnucash.android.ui.account.AccountsListFragment;
4344

@@ -64,10 +65,7 @@ public AccountsActivityTest() {
6465

6566
protected void setUp() throws Exception {
6667
Context context = getInstrumentation().getTargetContext();
67-
Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
68-
editor.putBoolean(context.getString(R.string.key_first_run), false);
69-
editor.putInt(AccountsActivity.LAST_OPEN_TAB_INDEX, AccountsActivity.INDEX_TOP_LEVEL_ACCOUNTS_FRAGMENT);
70-
editor.commit();
68+
preventFirstRunDialogs(context);
7169

7270
mDbHelper = new DatabaseHelper(context);
7371
try {
@@ -86,32 +84,40 @@ protected void setUp() throws Exception {
8684
account.setUID(DUMMY_ACCOUNT_UID);
8785
account.setCurrency(Currency.getInstance(DUMMY_ACCOUNT_CURRENCY_CODE));
8886
mAccountsDbAdapter.addAccount(account);
89-
90-
//the What's new dialog is usually displayed on first run
91-
String dismissDialog = getActivity().getString(R.string.label_dismiss);
92-
if (mSolo.waitForText(dismissDialog,1,1000)){
93-
mSolo.clickOnText(dismissDialog);
94-
}
9587
}
9688

97-
/*
98-
public void testDisplayAccountsList(){
99-
final int NUMBER_OF_ACCOUNTS = 15;
100-
for (int i = 0; i < NUMBER_OF_ACCOUNTS; i++) {
101-
Account account = new Account("Acct " + i);
102-
mAccountsDbAdapter.addAccount(account);
103-
}
89+
public static void preventFirstRunDialogs(Context context) {
90+
Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
10491

105-
//there should exist a listview of accounts
106-
refreshAccountsList();
107-
mSolo.waitForText("Acct");
108-
mSolo.scrollToBottom();
92+
//do not show first run dialog
93+
editor.putBoolean(context.getString(R.string.key_first_run), false);
94+
editor.putInt(AccountsActivity.LAST_OPEN_TAB_INDEX, AccountsActivity.INDEX_TOP_LEVEL_ACCOUNTS_FRAGMENT);
10995

110-
ListView accountsListView = (ListView) mSolo.getView(android.R.id.list);
111-
assertNotNull(accountsListView);
112-
assertEquals(NUMBER_OF_ACCOUNTS + 1, accountsListView.getCount());
113-
}
114-
*/
96+
//do not show "What's new" dialog
97+
String minorVersion = context.getString(R.string.app_minor_version);
98+
int currentMinor = Integer.parseInt(minorVersion);
99+
editor.putInt(context.getString(R.string.key_previous_minor_version), currentMinor);
100+
editor.commit();
101+
}
102+
103+
/*
104+
public void testDisplayAccountsList(){
105+
final int NUMBER_OF_ACCOUNTS = 15;
106+
for (int i = 0; i < NUMBER_OF_ACCOUNTS; i++) {
107+
Account account = new Account("Acct " + i);
108+
mAccountsDbAdapter.addAccount(account);
109+
}
110+
111+
//there should exist a listview of accounts
112+
refreshAccountsList();
113+
mSolo.waitForText("Acct");
114+
mSolo.scrollToBottom();
115+
116+
ListView accountsListView = (ListView) mSolo.getView(android.R.id.list);
117+
assertNotNull(accountsListView);
118+
assertEquals(NUMBER_OF_ACCOUNTS + 1, accountsListView.getCount());
119+
}
120+
*/
115121
public void testSearchAccounts(){
116122
String SEARCH_ACCOUNT_NAME = "Search Account";
117123

@@ -122,15 +128,17 @@ public void testSearchAccounts(){
122128
refreshAccountsList();
123129

124130
//enter search query
125-
ActionBarUtils.clickSherlockActionBarItem(mSolo, R.id.menu_search);
126-
mSolo.sleep(200);
131+
// ActionBarUtils.clickSherlockActionBarItem(mSolo, R.id.menu_search);
132+
mSolo.clickOnActionBarItem(R.id.menu_search);
133+
mSolo.sleep(2000);
127134
mSolo.enterText(0, "Se");
128-
135+
mSolo.sleep(3000);
129136
boolean accountFound = mSolo.waitForText(SEARCH_ACCOUNT_NAME, 1, 2000);
130137
assertTrue(accountFound);
131138

132139
mSolo.clearEditText(0);
133140

141+
mSolo.sleep(2000);
134142
//the child account should be hidden again
135143
accountFound = mSolo.waitForText(SEARCH_ACCOUNT_NAME, 1, 2000);
136144
assertFalse(accountFound);
@@ -174,13 +182,14 @@ public void testChangeParentAccount(){
174182
mSolo.waitForText(accountName);
175183

176184
mSolo.clickLongOnText(accountName);
177-
mSolo.clickOnView(getActivity().findViewById(R.id.context_menu_edit_accounts));
185+
mSolo.clickOnView(mSolo.getView(R.id.context_menu_edit_accounts));
178186
mSolo.waitForView(EditText.class);
179187

180188
mSolo.clickOnCheckBox(1);
181189
mSolo.pressSpinnerItem(2, 0);
182190

183-
mSolo.clickOnView(getActivity().findViewById(R.id.menu_save));
191+
// mSolo.clickOnView(mSolo.getView(R.id.menu_save));
192+
mSolo.clickOnActionBarItem(R.id.menu_save);
184193

185194
mSolo.waitForText(getActivity().getString(R.string.title_accounts));
186195
Account editedAccount = mAccountsDbAdapter.getAccount(accountUID);
@@ -192,6 +201,7 @@ public void testChangeParentAccount(){
192201

193202
public void testEditAccount(){
194203
refreshAccountsList();
204+
mSolo.sleep(2000);
195205
mSolo.waitForText(DUMMY_ACCOUNT_NAME);
196206

197207
String editedAccountName = "Edited Account";
@@ -207,7 +217,7 @@ public void testEditAccount(){
207217

208218
clickSherlockActionBarItem(R.id.menu_save);
209219

210-
mSolo.waitForDialogToClose(2000);
220+
mSolo.waitForDialogToClose();
211221
mSolo.waitForText("Accounts");
212222

213223
List<Account> accounts = mAccountsDbAdapter.getAllAccounts();
@@ -216,7 +226,8 @@ public void testEditAccount(){
216226
assertEquals("Edited Account", latest.getName());
217227
assertEquals(DUMMY_ACCOUNT_CURRENCY_CODE, latest.getCurrency().getCurrencyCode());
218228
}
219-
229+
230+
//TODO: Add test for moving content of accounts before deleting it
220231
public void testDeleteAccount(){
221232
final String accountNameToDelete = "TO BE DELETED";
222233
final String accountUidToDelete = "to-be-deleted";
@@ -238,9 +249,11 @@ public void testDeleteAccount(){
238249

239250
clickSherlockActionBarItem(R.id.context_menu_delete);
240251

252+
mSolo.waitForDialogToOpen();
253+
mSolo.clickOnRadioButton(0);
241254
mSolo.clickOnView(mSolo.getView(R.id.btn_save));
242255

243-
mSolo.waitForDialogToClose(1000);
256+
mSolo.waitForDialogToClose();
244257
mSolo.waitForText("Accounts");
245258

246259
Exception expectedException = null;
@@ -285,7 +298,8 @@ public void testIntentAccountCreation(){
285298

286299
protected void tearDown() throws Exception {
287300
mSolo.finishOpenedActivities();
288-
mSolo.sleep(1000);
301+
mSolo.waitForEmptyActivityStack(20000);
302+
mSolo.sleep(5000);
289303
mAccountsDbAdapter.deleteAllRecords();
290304

291305
super.tearDown();

app/src/androidTest/java/org/gnucash/android/test/ui/ExportTransactionsTest.java

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public ExportTransactionsTest() {
6161

6262
@Override
6363
protected void setUp() throws Exception {
64-
super.setUp();
64+
AccountsActivityTest.preventFirstRunDialogs(getInstrumentation().getTargetContext());
6565
mSolo = new Solo(getInstrumentation(), getActivity());
6666

6767
mDbHelper = new DatabaseHelper(getActivity());
@@ -111,24 +111,28 @@ public void testXmlExport(){
111111

112112
/**
113113
* Generates export for the specified format and tests that the file actually is created
114-
* @param format
114+
* @param format Export format to use
115115
*/
116116
public void testExport(ExportFormat format){
117117
File folder = new File(Exporter.EXPORT_FOLDER_PATH);
118118
folder.mkdirs();
119+
mSolo.sleep(5000);
120+
assertThat(folder).exists();
121+
119122
for (File file : folder.listFiles()) {
120123
file.delete();
121124
}
122125

123-
mSolo.setNavigationDrawer(Solo.OPENED);
124-
mSolo.clickOnText(mSolo.getString(R.string.nav_menu_export));
126+
mSolo.clickOnActionBarItem(R.id.menu_export);
127+
mSolo.waitForDialogToOpen(5000);
128+
129+
mSolo.waitForText(getActivity().getString(R.string.title_export_dialog));
125130

126-
mSolo.waitForText(getActivity().getString(R.string.menu_export_transactions));
127131
mSolo.clickOnText(format.name());
128-
mSolo.clickOnButton(mSolo.getString(R.string.btn_export));
132+
mSolo.clickOnView(mSolo.getView(R.id.btn_save));
129133

130134
mSolo.waitForDialogToClose(10000);
131-
mSolo.sleep(2000); //sleep so that emulators can save the file
135+
mSolo.sleep(5000); //sleep so that emulators can save the file
132136

133137
assertThat(folder.listFiles().length).isEqualTo(1);
134138
File exportFile = folder.listFiles()[0];
@@ -151,20 +155,26 @@ public void testDeleteTransactionsAfterExport(){
151155
/**
152156
* Test creating a scheduled export
153157
*/
154-
public void atestCreateExportSchedule(){
155-
mSolo.setNavigationDrawer(Solo.OPENED);
156-
mSolo.clickOnText(mSolo.getString(R.string.nav_menu_export));
157-
mSolo.waitForText(getActivity().getString(R.string.menu_export_transactions));
158+
public void testCreateExportSchedule(){
159+
// mSolo.setNavigationDrawer(Solo.OPENED);
160+
// mSolo.clickOnText(mSolo.getString(R.string.nav_menu_export));
161+
mSolo.clickOnActionBarItem(R.id.menu_export);
162+
mSolo.waitForDialogToOpen(5000);
158163

159164
mSolo.clickOnText(ExportFormat.XML.name());
160165
mSolo.clickOnView(mSolo.getView(R.id.input_recurrence));
161-
162-
mSolo.clickOnText("OFF");
163-
mSolo.pressSpinnerItem(0, 1);
164-
mSolo.clickOnText("Done");
165-
mSolo.clickOnButton(mSolo.getString(R.string.btn_export));
166-
mSolo.waitForDialogToClose(5000);
167-
166+
mSolo.waitForDialogToOpen();
167+
mSolo.sleep(2000);
168+
mSolo.clickOnButton(0); //switch on the recurrence dialog
169+
mSolo.sleep(2000);
170+
mSolo.pressSpinnerItem(0, -1);
171+
mSolo.clickOnButton(1);
172+
mSolo.waitForDialogToClose();
173+
mSolo.sleep(2000);
174+
mSolo.clickOnView(mSolo.getView(R.id.btn_save));
175+
mSolo.waitForDialogToClose();
176+
177+
mSolo.sleep(2000); //wait for database save
168178

169179
ScheduledActionDbAdapter scheduledactionDbAdapter = new ScheduledActionDbAdapter(mDb);
170180
assertThat(scheduledactionDbAdapter.getAllEnabledScheduledActions())
@@ -173,13 +183,16 @@ public void atestCreateExportSchedule(){
173183

174184
ScheduledAction action = scheduledactionDbAdapter.getAllScheduledActions().get(0);
175185
assertThat(action.getPeriodType()).isEqualTo(PeriodType.DAY);
186+
assertThat(action.getEndTime()).isEqualTo(0);
176187
}
177188

178189
//todo: add testing of export flag to unit test
179190
//todo: add test of ignore exported transactions to unit tests
180191
@Override
181192
protected void tearDown() throws Exception {
182193
mSolo.finishOpenedActivities();
194+
mSolo.waitForEmptyActivityStack(20000);
195+
mSolo.sleep(5000);
183196
mAccountsDbAdapter.deleteAllRecords();
184197
mDbHelper.close();
185198
mDb.close();

0 commit comments

Comments
 (0)