diff --git a/app/build.gradle b/app/build.gradle index 1a604260e..ea22064b2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,13 +20,13 @@ static def gitSha() { android { - compileSdkVersion 26 - buildToolsVersion '27.0.0' + compileSdkVersion 27 + buildToolsVersion '27.0.3' defaultConfig { applicationId "org.gnucash.android" testApplicationId 'org.gnucash.android.test' minSdkVersion 19 - targetSdkVersion 26 + targetSdkVersion 27 versionCode versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild versionName "${versionMajor}.${versionMinor}.${versionPatch}" resValue "string", "app_version_name", "${versionName}" @@ -179,7 +179,7 @@ afterEvaluate { } -def androidSupportVersion = "26.0.1" +def androidSupportVersion = "27.0.2" def androidEspressoVersion = "3.0.0" def androidSupportTestVersion = "1.0.0" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c8857485a..f212cde86 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -121,6 +121,8 @@ + @@ -154,6 +156,12 @@ + + + + + */ public class BootReceiver extends BroadcastReceiver { @@ -32,5 +33,6 @@ public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { GnuCashApplication.startScheduledActionExecutionService(context); + BackupManager.schedulePeriodicBackups(context); } } diff --git a/app/src/main/java/org/gnucash/android/receivers/PeriodicJobReceiver.java b/app/src/main/java/org/gnucash/android/receivers/PeriodicJobReceiver.java new file mode 100644 index 000000000..e0af3aa46 --- /dev/null +++ b/app/src/main/java/org/gnucash/android/receivers/PeriodicJobReceiver.java @@ -0,0 +1,46 @@ +/* Copyright (c) 2018 Àlex Magaz Graça + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gnucash.android.receivers; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +import org.gnucash.android.util.BackupJob; + +/** + * Receiver to run periodic jobs. + * + * @author Àlex Magaz Graça + */ +public class PeriodicJobReceiver extends BroadcastReceiver { + private static final String LOG_TAG = "PeriodicJobReceiver"; + + public static final String ACTION_BACKUP = "org.gnucash.android.action_backup"; + + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction() == null) { + Log.w(LOG_TAG, "No action was set in the intent. Ignoring..."); + return; + } + + if (intent.getAction().equals(ACTION_BACKUP)) { + BackupJob.enqueueWork(context); + } + } +} diff --git a/app/src/main/java/org/gnucash/android/service/ScheduledActionService.java b/app/src/main/java/org/gnucash/android/service/ScheduledActionService.java index 3852212e5..c345d52c3 100644 --- a/app/src/main/java/org/gnucash/android/service/ScheduledActionService.java +++ b/app/src/main/java/org/gnucash/android/service/ScheduledActionService.java @@ -71,7 +71,6 @@ protected void onHandleIntent(Intent intent) { PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); wakeLock.acquire(); - BackupManager.backupAllBooks(); //First run automatic backup of all books before doing anything else try { BooksDbAdapter booksDbAdapter = BooksDbAdapter.getInstance(); List books = booksDbAdapter.getAllRecords(); diff --git a/app/src/main/java/org/gnucash/android/ui/account/AccountsActivity.java b/app/src/main/java/org/gnucash/android/ui/account/AccountsActivity.java index 8b2be04b5..846330af8 100644 --- a/app/src/main/java/org/gnucash/android/ui/account/AccountsActivity.java +++ b/app/src/main/java/org/gnucash/android/ui/account/AccountsActivity.java @@ -342,6 +342,7 @@ private void init() { showWhatsNewDialog(this); } GnuCashApplication.startScheduledActionExecutionService(this); + BackupManager.schedulePeriodicBackups(this); } @Override diff --git a/app/src/main/java/org/gnucash/android/util/BackupJob.java b/app/src/main/java/org/gnucash/android/util/BackupJob.java new file mode 100644 index 000000000..9f68814e5 --- /dev/null +++ b/app/src/main/java/org/gnucash/android/util/BackupJob.java @@ -0,0 +1,46 @@ +/* Copyright (c) 2018 Àlex Magaz Graça + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gnucash.android.util; + +import android.content.Context; +import android.content.Intent; +import android.support.annotation.NonNull; +import android.support.v4.app.JobIntentService; +import android.util.Log; + + +/** + * Job to back up books periodically. + * + *

The backups are triggered by an alarm set in + * {@link BackupManager#schedulePeriodicBackups(Context)} + * (through {@link org.gnucash.android.receivers.PeriodicJobReceiver}).

+ */ +public class BackupJob extends JobIntentService { + private static final String LOG_TAG = "BackupJob"; + private static final int JOB_ID = 1000; + + public static void enqueueWork(Context context) { + Intent intent = new Intent(context, BackupJob.class); + enqueueWork(context, BackupJob.class, JOB_ID, intent); + } + + @Override + protected void onHandleWork(@NonNull Intent intent) { + Log.i(LOG_TAG, "Doing backup of all books."); + BackupManager.backupAllBooks(); + } +} diff --git a/app/src/main/java/org/gnucash/android/util/BackupManager.java b/app/src/main/java/org/gnucash/android/util/BackupManager.java index 1431272f3..9969ab638 100644 --- a/app/src/main/java/org/gnucash/android/util/BackupManager.java +++ b/app/src/main/java/org/gnucash/android/util/BackupManager.java @@ -1,11 +1,29 @@ +/* Copyright (c) 2018 Àlex Magaz Graça + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.gnucash.android.util; +import android.app.AlarmManager; +import android.app.PendingIntent; import android.content.Context; +import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; +import android.os.SystemClock; import android.support.annotation.Nullable; import android.util.Log; -import android.widget.ArrayAdapter; import com.crashlytics.android.Crashlytics; @@ -16,6 +34,7 @@ import org.gnucash.android.export.Exporter; import org.gnucash.android.export.xml.GncXmlExporter; import org.gnucash.android.model.Book; +import org.gnucash.android.receivers.PeriodicJobReceiver; import org.gnucash.android.ui.settings.PreferenceActivity; import java.io.BufferedOutputStream; @@ -29,15 +48,19 @@ import java.util.List; import java.util.zip.GZIPOutputStream; + +/** + * Deals with all backup-related tasks. + */ public class BackupManager { private static final String LOG_TAG = "BackupManager"; public static final String KEY_BACKUP_FILE = "book_backup_file_key"; /** * Perform an automatic backup of all books in the database. - * This method is run everytime the service is executed + * This method is run every time the service is executed */ - public static void backupAllBooks() { + static void backupAllBooks() { BooksDbAdapter booksDbAdapter = BooksDbAdapter.getInstance(); List bookUIDs = booksDbAdapter.getAllBookUIDs(); Context context = GnuCashApplication.getAppContext(); @@ -155,4 +178,16 @@ public static List getBackupList(String bookUID) { Collections.reverse(backupFilesList); return backupFilesList; } + + public static void schedulePeriodicBackups(Context context) { + Log.i(LOG_TAG, "Scheduling backup job"); + Intent intent = new Intent(context, PeriodicJobReceiver.class); + intent.setAction(PeriodicJobReceiver.ACTION_BACKUP); + PendingIntent alarmIntent = PendingIntent.getBroadcast(context,0, intent, + PendingIntent.FLAG_UPDATE_CURRENT); + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, + SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_FIFTEEN_MINUTES, + AlarmManager.INTERVAL_DAY, alarmIntent); + } }