Automatic backup: change save method to SAF

pull/2207/head
mihanentalpo 1 month ago
parent 26daab836d
commit 8529e82adc

@ -2,13 +2,11 @@ package org.isoron.uhabits.database
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri
import android.util.Log
import androidx.work.CoroutineWorker import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
import org.isoron.uhabits.HabitsApplication import org.isoron.uhabits.HabitsApplication
import org.isoron.uhabits.utils.DatabaseUtils import org.isoron.uhabits.utils.DatabaseUtils
import org.isoron.uhabits.utils.UriUtils
import java.io.File
import java.io.IOException
class PublicBackupWorker( class PublicBackupWorker(
appContext: Context, appContext: Context,
@ -19,13 +17,13 @@ class PublicBackupWorker(
val app = applicationContext as HabitsApplication val app = applicationContext as HabitsApplication
val prefs = app.component.preferences val prefs = app.component.preferences
val uriString = prefs.publicBackupUri ?: return Result.failure() val uriString = prefs.publicBackupUri ?: return Result.failure()
val path = UriUtils.getPathFromTreeUri(applicationContext, Uri.parse(uriString)) val folderUri = Uri.parse(uriString)
?: return Result.failure()
return try { return try {
val addDate = prefs.isPublicBackupAddDateEnabled val addDate = prefs.isPublicBackupAddDateEnabled
DatabaseUtils.saveDatabaseCopy(applicationContext, File(path), addDate) DatabaseUtils.saveDatabaseCopy(applicationContext, folderUri, addDate)
Result.success() Result.success()
} catch (e: IOException) { } catch (e: Exception) {
Log.e("PublicBackupWorker", "backup failed", e)
Result.retry() Result.retry()
} }
} }

@ -20,7 +20,9 @@ package org.isoron.uhabits.utils
import android.content.Context import android.content.Context
import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteDatabase
import android.net.Uri
import android.util.Log import android.util.Log
import androidx.documentfile.provider.DocumentFile
import org.isoron.uhabits.HabitsApplication.Companion.isTestMode import org.isoron.uhabits.HabitsApplication.Companion.isTestMode
import org.isoron.uhabits.HabitsDatabaseOpener import org.isoron.uhabits.HabitsDatabaseOpener
import org.isoron.uhabits.core.DATABASE_FILENAME import org.isoron.uhabits.core.DATABASE_FILENAME
@ -73,6 +75,35 @@ object DatabaseUtils {
return dbCopy.absolutePath return dbCopy.absolutePath
} }
@JvmStatic
@Throws(IOException::class)
fun saveDatabaseCopy(
context: Context,
folderUri: Uri,
add_date: Boolean = true
): String {
val dateFormat: SimpleDateFormat = getBackupDateFormat()
val filename = if (add_date) {
val date = dateFormat.format(getLocalTime())
"Loop Habits Backup $date.db"
} else {
"Loop Habits Backup.db"
}
val folder = DocumentFile.fromTreeUri(context, folderUri)
?: throw IOException("Invalid folder uri")
val document = folder.createFile("application/octet-stream", filename)
?: throw IOException("Failed to create backup file")
context.contentResolver.openOutputStream(document.uri).use { outStream ->
val out = outStream ?: throw IOException("Cannot open output stream")
getDatabaseFile(context).inputStream().use { inStream ->
inStream.copyTo(out)
}
}
return document.uri.toString()
}
fun openDatabase(): SQLiteDatabase { fun openDatabase(): SQLiteDatabase {
checkNotNull(opener) checkNotNull(opener)
return opener!!.writableDatabase return opener!!.writableDatabase

Loading…
Cancel
Save