Backup system now retries if it failed

master
Laurent 1 year ago
parent d178540ceb
commit 85f8ecbe21
  1. 2
      app/src/main/java/net/pokeranalytics/android/api/BackupApi.kt
  2. 21
      app/src/main/java/net/pokeranalytics/android/ui/activity/HomeActivity.kt
  3. 17
      app/src/main/java/net/pokeranalytics/android/util/BackupOperator.kt
  4. 37
      app/src/main/java/net/pokeranalytics/android/util/BackupWorker.kt
  5. 19
      app/src/main/java/net/pokeranalytics/android/util/Preferences.kt

@ -37,7 +37,7 @@ interface MyBackupApi {
object BackupApi { 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 // 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 { suspend fun backupFile(context: Context, mail: String, fileName: String, fileContent: String): Boolean {

@ -17,8 +17,10 @@ import net.pokeranalytics.android.model.realm.Currency
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.ui.activity.components.BaseActivity import net.pokeranalytics.android.ui.activity.components.BaseActivity
import net.pokeranalytics.android.ui.adapter.HomePagerAdapter import net.pokeranalytics.android.ui.adapter.HomePagerAdapter
import net.pokeranalytics.android.util.BackupTask
import net.pokeranalytics.android.util.Preferences import net.pokeranalytics.android.util.Preferences
import net.pokeranalytics.android.util.billing.AppGuard 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.findAll
import net.pokeranalytics.android.util.extensions.isSameMonth import net.pokeranalytics.android.util.extensions.isSameMonth
import java.util.* import java.util.*
@ -76,6 +78,7 @@ class HomeActivity : BaseActivity(), NewPerformanceListener {
AppGuard.requestPurchasesUpdate() AppGuard.requestPurchasesUpdate()
this.homePagerAdapter?.activityResumed() this.homePagerAdapter?.activityResumed()
lookForCalendarBadge() lookForCalendarBadge()
checkForFailedBackups()
} }
private lateinit var binding: ActivityHomeBinding 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()
}
}
}
} }

@ -7,6 +7,7 @@ import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager import androidx.work.WorkManager
import io.realm.Realm import io.realm.Realm
import io.realm.RealmResults import io.realm.RealmResults
import net.pokeranalytics.android.BuildConfig
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.model.realm.Transaction import net.pokeranalytics.android.model.realm.Transaction
import net.pokeranalytics.android.util.csv.DataType import net.pokeranalytics.android.util.csv.DataType
@ -49,18 +50,24 @@ class BackupOperator(var context: Context) {
private fun backupDataType(dataType: DataType) { private fun backupDataType(dataType: DataType) {
val data = Data.Builder() val data = Data.Builder()
.putInt(BackupTask.ParamKeys.DATA.value, dataType.ordinal) .putInt(BackupWorker.ParamKeys.DATA.value, dataType.ordinal)
val backupTask = OneTimeWorkRequestBuilder<BackupTask>() var duration = 10L
.setInitialDelay(10, TimeUnit.HOURS) var unit = TimeUnit.HOURS
// .setInitialDelay(10, TimeUnit.SECONDS) if (BuildConfig.DEBUG) {
duration = 1L
unit = TimeUnit.SECONDS
}
val backupWorker = OneTimeWorkRequestBuilder<BackupWorker>()
.setInitialDelay(duration, unit)
.setInputData(data.build()) .setInputData(data.build())
.addTag(dataType.workId) .addTag(dataType.workId)
.build() .build()
Timber.d(">>> create backupTask") Timber.d(">>> create backupTask")
WorkManager.getInstance(context).enqueueUniqueWork(dataType.workId, ExistingWorkPolicy.REPLACE, backupTask) WorkManager.getInstance(context).enqueueUniqueWork(dataType.workId, ExistingWorkPolicy.REPLACE, backupWorker)
} }
} }

@ -17,7 +17,7 @@ import timber.log.Timber
import java.util.* 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) { enum class ParamKeys(val value: String) {
DATA("title"), DATA("title"),
@ -31,20 +31,29 @@ class BackupTask(var context: Context, var params: WorkerParameters) : Worker(co
val dataType = DataType.values()[dataTypeInt] val dataType = DataType.values()[dataTypeInt]
Preferences.getBackupEmail(context)?.let { email -> Preferences.getBackupEmail(context)?.let { email ->
when(dataType) { val task = BackupTask(dataType, email, context)
DataType.SESSION -> { task.start()
backupSessions(email)
}
DataType.TRANSACTION -> {
backupTransactions(email)
}
}
} }
return Result.success() 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") Timber.d(">>>> backup sessions")
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
@ -53,12 +62,13 @@ class BackupTask(var context: Context, var params: WorkerParameters) : Worker(co
val fileName = "sessions_${Date().dateTimeFileFormatted}.csv" val fileName = "sessions_${Date().dateTimeFileFormatted}.csv"
CoroutineScope(context = Dispatchers.IO).launch { 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() realm.close()
} }
private fun backupTransactions(email: String) { private fun backupTransactions() {
Timber.d(">>>> backup transactions") Timber.d(">>>> backup transactions")
val realm = Realm.getDefaultInstance() val realm = Realm.getDefaultInstance()
@ -67,7 +77,8 @@ class BackupTask(var context: Context, var params: WorkerParameters) : Worker(co
val fileName = "transactions_${Date().dateTimeFileFormatted}.csv" val fileName = "transactions_${Date().dateTimeFileFormatted}.csv"
CoroutineScope(context = Dispatchers.IO).launch { 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() realm.close()
} }

@ -51,7 +51,9 @@ class Preferences {
LAST_CALENDAR_BADGE_DATE("lastCalendarBadgeDate"), LAST_CALENDAR_BADGE_DATE("lastCalendarBadgeDate"),
PATCH_RATED_AMOUNT("patchRatedAmount[new field]"), PATCH_RATED_AMOUNT("patchRatedAmount[new field]"),
BACKUP_EMAIL("backupEmail"), BACKUP_EMAIL("backupEmail"),
LANGUAGE_CODE("languageCode") LANGUAGE_CODE("languageCode"),
SESSIONS_BACKUP_SUCCESS("sessionsBackupSuccess"),
TRANSACTIONS_BACKUP_SUCCESS("transactionsBackupSuccess")
} }
enum class FeedMessage { enum class FeedMessage {
@ -352,6 +354,21 @@ class Preferences {
return getString(Keys.LANGUAGE_CODE, context) 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)
}
} }
} }

Loading…
Cancel
Save