Add Android Backup Service settings

* Add option to disable upload to backup service
* Display date of last upload
pull/1122/head
Alex Baker 5 years ago
parent 63931c789e
commit ddf9f79b18

@ -123,6 +123,7 @@
<application <application
android:allowBackup="true" android:allowBackup="true"
android:backupAgent="org.tasks.backup.TasksBackupAgent" android:backupAgent="org.tasks.backup.TasksBackupAgent"
android:backupInForeground="true"
android:networkSecurityConfig="@xml/network_security_config" android:networkSecurityConfig="@xml/network_security_config"
android:icon="@mipmap/ic_launcher_blue" android:icon="@mipmap/ic_launcher_blue"
android:label="@string/app_name" android:label="@string/app_name"

@ -2,15 +2,19 @@ package org.tasks.backup
import android.app.backup.BackupAgentHelper import android.app.backup.BackupAgentHelper
import android.app.backup.BackupDataInput import android.app.backup.BackupDataInput
import android.app.backup.BackupDataOutput
import android.app.backup.FileBackupHelper import android.app.backup.FileBackupHelper
import android.net.Uri import android.net.Uri
import android.os.ParcelFileDescriptor import android.os.ParcelFileDescriptor
import com.todoroo.andlib.utility.DateUtilities.now
import com.todoroo.astrid.backup.BackupConstants import com.todoroo.astrid.backup.BackupConstants
import dagger.hilt.EntryPoint import dagger.hilt.EntryPoint
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.android.EntryPointAccessors import dagger.hilt.android.EntryPointAccessors
import dagger.hilt.android.components.ApplicationComponent import dagger.hilt.android.components.ApplicationComponent
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import org.tasks.R
import org.tasks.preferences.Preferences
import timber.log.Timber import timber.log.Timber
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
@ -20,14 +24,25 @@ class TasksBackupAgent : BackupAgentHelper() {
@InstallIn(ApplicationComponent::class) @InstallIn(ApplicationComponent::class)
internal interface TasksBackupAgentEntryPoint { internal interface TasksBackupAgentEntryPoint {
val tasksJsonImporter: TasksJsonImporter val tasksJsonImporter: TasksJsonImporter
val preferences: Preferences
} }
private lateinit var importer: TasksJsonImporter private lateinit var importer: TasksJsonImporter
private lateinit var preferences: Preferences
private val enabled: Boolean
get() = preferences.getBoolean(R.string.p_backups_android_backup_enabled, true)
override fun onCreate() { override fun onCreate() {
val hilt = EntryPointAccessors.fromApplication(applicationContext, TasksBackupAgentEntryPoint::class.java) EntryPointAccessors
importer = hilt.tasksJsonImporter .fromApplication(applicationContext, TasksBackupAgentEntryPoint::class.java)
addHelper(BACKUP_KEY, FileBackupHelper(this, BackupConstants.INTERNAL_BACKUP)) .let {
importer = it.tasksJsonImporter
preferences = it.preferences
}
if (enabled) {
addHelper(BACKUP_KEY, FileBackupHelper(this, BackupConstants.INTERNAL_BACKUP))
}
} }
@Throws(IOException::class) @Throws(IOException::class)
@ -44,6 +59,14 @@ class TasksBackupAgent : BackupAgentHelper() {
} }
} }
override fun onBackup(oldState: ParcelFileDescriptor?, data: BackupDataOutput?, newState: ParcelFileDescriptor?) {
super.onBackup(oldState, data, newState)
if (enabled) {
preferences.setLong(R.string.p_backups_android_backup_last, now())
}
}
override fun onQuotaExceeded(backupDataBytes: Long, quotaBytes: Long) { override fun onQuotaExceeded(backupDataBytes: Long, quotaBytes: Long) {
Timber.e("onQuotaExceeded(%s, %s)", backupDataBytes, quotaBytes) Timber.e("onQuotaExceeded(%s, %s)", backupDataBytes, quotaBytes)
} }

@ -258,6 +258,7 @@ class TasksJsonImporter @Inject constructor(
companion object { companion object {
private val ignorePrefs = intArrayOf( private val ignorePrefs = intArrayOf(
R.string.p_current_version, R.string.p_current_version,
R.string.p_backups_android_backup_last
) )
} }
} }

@ -6,7 +6,7 @@ import android.os.Bundle
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.SwitchPreferenceCompat import androidx.preference.SwitchPreferenceCompat
import com.google.api.services.drive.DriveScopes import com.google.api.services.drive.DriveScopes
import com.todoroo.astrid.gtasks.auth.GtasksLoginActivity import com.todoroo.andlib.utility.DateUtilities
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.tasks.PermissionUtil import org.tasks.PermissionUtil
import org.tasks.R import org.tasks.R
@ -20,6 +20,7 @@ import org.tasks.preferences.FragmentPermissionRequestor
import org.tasks.preferences.PermissionRequestor import org.tasks.preferences.PermissionRequestor
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.ui.Toaster import org.tasks.ui.Toaster
import java.util.*
import javax.inject.Inject import javax.inject.Inject
private const val REQUEST_CODE_BACKUP_DIR = 10001 private const val REQUEST_CODE_BACKUP_DIR = 10001
@ -35,6 +36,7 @@ class Backups : InjectingPreferenceFragment() {
@Inject lateinit var permissionRequestor: FragmentPermissionRequestor @Inject lateinit var permissionRequestor: FragmentPermissionRequestor
@Inject lateinit var toaster: Toaster @Inject lateinit var toaster: Toaster
@Inject lateinit var googleAccountManager: GoogleAccountManager @Inject lateinit var googleAccountManager: GoogleAccountManager
@Inject lateinit var locale: Locale
override fun getPreferenceXml() = R.xml.preferences_backups override fun getPreferenceXml() = R.xml.preferences_backups
@ -62,6 +64,17 @@ class Backups : InjectingPreferenceFragment() {
super.onResume() super.onResume()
updateGoogleDriveCheckbox() updateGoogleDriveCheckbox()
val lastBackup = preferences.getLong(R.string.p_backups_android_backup_last, 0L)
findPreference(R.string.p_backups_android_backup_enabled).summary =
getString(
R.string.last_backup,
if (lastBackup == 0L) {
getString(R.string.last_backup_never)
} else {
DateUtilities.getLongDateStringWithTime(lastBackup, locale)
}
)
} }
override fun onRequestPermissionsResult( override fun onRequestPermissionsResult(

@ -373,6 +373,8 @@
<string name="p_show_whats_new">show_whats_new</string> <string name="p_show_whats_new">show_whats_new</string>
<string name="p_just_updated">just_updated</string> <string name="p_just_updated">just_updated</string>
<string name="p_clicked_rate">clicked_rate</string> <string name="p_clicked_rate">clicked_rate</string>
<string name="p_backups_android_backup_enabled">backups_android_backup_enabled</string>
<string name="p_backups_android_backup_last">backups_android_backup_last</string>
<string name="p_current_version">cv</string> <string name="p_current_version">cv</string>
<string name="event_whats_new">whats_new</string> <string name="event_whats_new">whats_new</string>

@ -637,4 +637,9 @@ File %1$s contained %2$s.\n\n
<string name="reset_sort_order">Reset sort order</string> <string name="reset_sort_order">Reset sort order</string>
<string name="permission_read_tasks">Full access to Tasks database</string> <string name="permission_read_tasks">Full access to Tasks database</string>
<string name="account_not_found">Account not found</string> <string name="account_not_found">Account not found</string>
<string name="android_auto_backup">Android Backup Service</string>
<string name="android_auto_backup_device_summary">You must also opt in to backup service through your device settings. Not all devices provide backup service.</string>
<string name="last_backup">Last backup: %s</string>
<string name="last_backup_never">never</string>
<string name="device_settings">Device settings</string>
</resources> </resources>

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<Preference <Preference
android:key="@string/p_backup_dir" android:key="@string/p_backup_dir"
@ -17,4 +18,21 @@
android:key="@string/backup_BAc_export" android:key="@string/backup_BAc_export"
android:title="@string/backup_BAc_export" /> android:title="@string/backup_BAc_export" />
<PreferenceCategory
android:title="@string/android_auto_backup">
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="@string/p_backups_android_backup_enabled"
android:title="@string/enabled" />
<Preference
android:title="@string/device_settings"
android:summary="@string/android_auto_backup_device_summary"
app:icon="@drawable/ic_open_in_new_24px">
<intent android:action="android.settings.SETTINGS" />
</Preference>
</PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>
Loading…
Cancel
Save