diff --git a/app/src/main/java/net/pokeranalytics/android/api/BackupApi.kt b/app/src/main/java/net/pokeranalytics/android/api/BackupApi.kt index 31f77461..e410b769 100644 --- a/app/src/main/java/net/pokeranalytics/android/api/BackupApi.kt +++ b/app/src/main/java/net/pokeranalytics/android/api/BackupApi.kt @@ -37,7 +37,7 @@ interface MyBackupApi { object BackupApi { - val service = BackupService() + private val service = BackupService() // curl -F recipient=laurent@staxriver.com -F file=@test.txt https://www.pokeranalytics.net/backup/send suspend fun backupFile(context: Context, mail: String, fileName: String, fileContent: String): Boolean { diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt index 59fe47b9..55a8cfca 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt @@ -17,8 +17,10 @@ import net.pokeranalytics.android.model.realm.Currency import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.ui.activity.components.BaseActivity import net.pokeranalytics.android.ui.adapter.HomePagerAdapter +import net.pokeranalytics.android.util.BackupTask import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.billing.AppGuard +import net.pokeranalytics.android.util.csv.DataType import net.pokeranalytics.android.util.extensions.findAll import net.pokeranalytics.android.util.extensions.isSameMonth import java.util.* @@ -76,6 +78,7 @@ class HomeActivity : BaseActivity(), NewPerformanceListener { AppGuard.requestPurchasesUpdate() this.homePagerAdapter?.activityResumed() lookForCalendarBadge() + checkForFailedBackups() } private lateinit var binding: ActivityHomeBinding @@ -205,4 +208,22 @@ class HomeActivity : BaseActivity(), NewPerformanceListener { } + private fun checkForFailedBackups() { + + if (!Preferences.sessionsBackupSuccess(this)) { + Preferences.getBackupEmail(this)?.let { email -> + val task = BackupTask(DataType.SESSION, email, this) + task.start() + } + } + + if (!Preferences.transactionsBackupSuccess(this)) { + Preferences.getBackupEmail(this)?.let { email -> + val task = BackupTask(DataType.TRANSACTION, email, this) + task.start() + } + } + + } + } diff --git a/app/src/main/java/net/pokeranalytics/android/util/BackupOperator.kt b/app/src/main/java/net/pokeranalytics/android/util/BackupOperator.kt index 6233e11a..b38054ac 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/BackupOperator.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/BackupOperator.kt @@ -7,6 +7,7 @@ import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkManager import io.realm.Realm import io.realm.RealmResults +import net.pokeranalytics.android.BuildConfig import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.util.csv.DataType @@ -49,18 +50,24 @@ class BackupOperator(var context: Context) { private fun backupDataType(dataType: DataType) { val data = Data.Builder() - .putInt(BackupTask.ParamKeys.DATA.value, dataType.ordinal) + .putInt(BackupWorker.ParamKeys.DATA.value, dataType.ordinal) - val backupTask = OneTimeWorkRequestBuilder() - .setInitialDelay(10, TimeUnit.HOURS) -// .setInitialDelay(10, TimeUnit.SECONDS) + var duration = 10L + var unit = TimeUnit.HOURS + if (BuildConfig.DEBUG) { + duration = 1L + unit = TimeUnit.SECONDS + } + + val backupWorker = OneTimeWorkRequestBuilder() + .setInitialDelay(duration, unit) .setInputData(data.build()) .addTag(dataType.workId) .build() Timber.d(">>> create backupTask") - WorkManager.getInstance(context).enqueueUniqueWork(dataType.workId, ExistingWorkPolicy.REPLACE, backupTask) + WorkManager.getInstance(context).enqueueUniqueWork(dataType.workId, ExistingWorkPolicy.REPLACE, backupWorker) } } diff --git a/app/src/main/java/net/pokeranalytics/android/util/BackupTask.kt b/app/src/main/java/net/pokeranalytics/android/util/BackupWorker.kt similarity index 69% rename from app/src/main/java/net/pokeranalytics/android/util/BackupTask.kt rename to app/src/main/java/net/pokeranalytics/android/util/BackupWorker.kt index 5ac6150b..e113a39a 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/BackupTask.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/BackupWorker.kt @@ -17,7 +17,7 @@ import timber.log.Timber import java.util.* -class BackupTask(var context: Context, var params: WorkerParameters) : Worker(context, params) { +class BackupWorker(var context: Context, var params: WorkerParameters) : Worker(context, params) { enum class ParamKeys(val value: String) { DATA("title"), @@ -31,20 +31,29 @@ class BackupTask(var context: Context, var params: WorkerParameters) : Worker(co val dataType = DataType.values()[dataTypeInt] Preferences.getBackupEmail(context)?.let { email -> - when(dataType) { - DataType.SESSION -> { - backupSessions(email) - } - DataType.TRANSACTION -> { - backupTransactions(email) - } - } + val task = BackupTask(dataType, email, context) + task.start() } return Result.success() } - private fun backupSessions(email: String) { +} + +class BackupTask(val dataType: DataType, val email: String, val context: Context) { + + fun start() { + when(this.dataType) { + DataType.SESSION -> { + backupSessions() + } + DataType.TRANSACTION -> { + backupTransactions() + } + } + } + + private fun backupSessions() { Timber.d(">>>> backup sessions") val realm = Realm.getDefaultInstance() @@ -53,12 +62,13 @@ class BackupTask(var context: Context, var params: WorkerParameters) : Worker(co val fileName = "sessions_${Date().dateTimeFileFormatted}.csv" CoroutineScope(context = Dispatchers.IO).launch { - BackupApi.backupFile(context, email, fileName, csv) + val success = BackupApi.backupFile(context, email, fileName, csv) + Preferences.setSessionsBackupSuccess(success, context) } realm.close() } - private fun backupTransactions(email: String) { + private fun backupTransactions() { Timber.d(">>>> backup transactions") val realm = Realm.getDefaultInstance() @@ -67,7 +77,8 @@ class BackupTask(var context: Context, var params: WorkerParameters) : Worker(co val fileName = "transactions_${Date().dateTimeFileFormatted}.csv" CoroutineScope(context = Dispatchers.IO).launch { - BackupApi.backupFile(context, email, fileName, csv) + val success = BackupApi.backupFile(context, email, fileName, csv) + Preferences.setTransactionsBackupSuccess(success, context) } realm.close() } diff --git a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt index a750c75b..dc12e9be 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt @@ -51,7 +51,9 @@ class Preferences { LAST_CALENDAR_BADGE_DATE("lastCalendarBadgeDate"), PATCH_RATED_AMOUNT("patchRatedAmount[new field]"), BACKUP_EMAIL("backupEmail"), - LANGUAGE_CODE("languageCode") + LANGUAGE_CODE("languageCode"), + SESSIONS_BACKUP_SUCCESS("sessionsBackupSuccess"), + TRANSACTIONS_BACKUP_SUCCESS("transactionsBackupSuccess") } enum class FeedMessage { @@ -352,6 +354,21 @@ class Preferences { return getString(Keys.LANGUAGE_CODE, context) } + fun setTransactionsBackupSuccess(success: Boolean, context: Context) { + setBoolean(Keys.TRANSACTIONS_BACKUP_SUCCESS, success, context) + } + + fun transactionsBackupSuccess(context: Context): Boolean { + return getBoolean(Keys.TRANSACTIONS_BACKUP_SUCCESS, context, true) + } + + fun setSessionsBackupSuccess(success: Boolean, context: Context) { + setBoolean(Keys.SESSIONS_BACKUP_SUCCESS, success, context) + } + + fun sessionsBackupSuccess(context: Context): Boolean { + return getBoolean(Keys.SESSIONS_BACKUP_SUCCESS, context, true) + } } }