Refactor backup restore process to stop relying on file extension
This commit is contained in:
parent
13afa9f476
commit
6107f5f3d2
2 changed files with 11 additions and 37 deletions
|
@ -12,7 +12,6 @@ import android.widget.Toast
|
||||||
import androidx.appcompat.app.AlertDialog
|
import androidx.appcompat.app.AlertDialog
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.documentfile.provider.DocumentFile
|
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import com.hippo.unifile.UniFile
|
import com.hippo.unifile.UniFile
|
||||||
|
@ -201,26 +200,7 @@ class SettingsBackupController : SettingsController() {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
CODE_BACKUP_RESTORE -> {
|
CODE_BACKUP_RESTORE -> {
|
||||||
uri?.path?.let {
|
uri?.let { RestoreBackupDialog(it).showDialog(router) }
|
||||||
val fileName = DocumentFile.fromSingleUri(activity, uri)?.name ?: uri.toString()
|
|
||||||
when {
|
|
||||||
fileName.endsWith(".proto.gz") -> {
|
|
||||||
RestoreBackupDialog(
|
|
||||||
uri,
|
|
||||||
BackupConst.BACKUP_TYPE_FULL
|
|
||||||
).showDialog(router)
|
|
||||||
}
|
|
||||||
fileName.endsWith(".json") -> {
|
|
||||||
RestoreBackupDialog(
|
|
||||||
uri,
|
|
||||||
BackupConst.BACKUP_TYPE_LEGACY
|
|
||||||
).showDialog(router)
|
|
||||||
}
|
|
||||||
else -> {
|
|
||||||
activity.toast(activity.getString(R.string.invalid_backup_file_type, fileName))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -284,32 +264,28 @@ class SettingsBackupController : SettingsController() {
|
||||||
}
|
}
|
||||||
|
|
||||||
class RestoreBackupDialog(bundle: Bundle? = null) : DialogController(bundle) {
|
class RestoreBackupDialog(bundle: Bundle? = null) : DialogController(bundle) {
|
||||||
constructor(uri: Uri, type: Int) : this(
|
constructor(uri: Uri) : this(
|
||||||
bundleOf(
|
bundleOf(KEY_URI to uri)
|
||||||
KEY_URI to uri,
|
|
||||||
KEY_TYPE to type
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
|
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
|
||||||
val activity = activity!!
|
val activity = activity!!
|
||||||
val uri: Uri = args.getParcelable(KEY_URI)!!
|
val uri: Uri = args.getParcelable(KEY_URI)!!
|
||||||
val type: Int = args.getInt(KEY_TYPE)
|
|
||||||
|
|
||||||
return try {
|
return try {
|
||||||
|
var type = BackupConst.BACKUP_TYPE_FULL
|
||||||
|
val results = runCatching {
|
||||||
|
FullBackupRestoreValidator().validate(activity, uri)
|
||||||
|
}.recoverCatching {
|
||||||
|
type = BackupConst.BACKUP_TYPE_LEGACY
|
||||||
|
LegacyBackupRestoreValidator().validate(activity, uri)
|
||||||
|
}.getOrThrow()
|
||||||
|
|
||||||
var message = if (type == BackupConst.BACKUP_TYPE_FULL) {
|
var message = if (type == BackupConst.BACKUP_TYPE_FULL) {
|
||||||
activity.getString(R.string.backup_restore_content_full)
|
activity.getString(R.string.backup_restore_content_full)
|
||||||
} else {
|
} else {
|
||||||
activity.getString(R.string.backup_restore_content)
|
activity.getString(R.string.backup_restore_content)
|
||||||
}
|
}
|
||||||
|
|
||||||
val validator = if (type == BackupConst.BACKUP_TYPE_FULL) {
|
|
||||||
FullBackupRestoreValidator()
|
|
||||||
} else {
|
|
||||||
LegacyBackupRestoreValidator()
|
|
||||||
}
|
|
||||||
|
|
||||||
val results = validator.validate(activity, uri)
|
|
||||||
if (results.missingSources.isNotEmpty()) {
|
if (results.missingSources.isNotEmpty()) {
|
||||||
message += "\n\n${activity.getString(R.string.backup_restore_missing_sources)}\n${results.missingSources.joinToString("\n") { "- $it" }}"
|
message += "\n\n${activity.getString(R.string.backup_restore_missing_sources)}\n${results.missingSources.joinToString("\n") { "- $it" }}"
|
||||||
}
|
}
|
||||||
|
@ -336,7 +312,6 @@ class SettingsBackupController : SettingsController() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private const val KEY_URI = "RestoreBackupDialog.uri"
|
private const val KEY_URI = "RestoreBackupDialog.uri"
|
||||||
private const val KEY_TYPE = "RestoreBackupDialog.type"
|
|
||||||
|
|
||||||
private const val CODE_BACKUP_DIR = 503
|
private const val CODE_BACKUP_DIR = 503
|
||||||
private const val CODE_BACKUP_CREATE = 504
|
private const val CODE_BACKUP_CREATE = 504
|
||||||
|
|
|
@ -424,7 +424,6 @@
|
||||||
<string name="tracker_not_logged_in">Not logged in: %1$s</string>
|
<string name="tracker_not_logged_in">Not logged in: %1$s</string>
|
||||||
<string name="backup_created">Backup created</string>
|
<string name="backup_created">Backup created</string>
|
||||||
<string name="invalid_backup_file">Invalid backup file</string>
|
<string name="invalid_backup_file">Invalid backup file</string>
|
||||||
<string name="invalid_backup_file_type">Invalid backup file type: %1$s\nIt should end with ".proto.gz" or ".json".</string>
|
|
||||||
<string name="invalid_backup_file_missing_data">File is missing data.</string>
|
<string name="invalid_backup_file_missing_data">File is missing data.</string>
|
||||||
<string name="invalid_backup_file_missing_manga">Backup does not contain any manga.</string>
|
<string name="invalid_backup_file_missing_manga">Backup does not contain any manga.</string>
|
||||||
<string name="backup_restore_missing_sources">Missing sources:</string>
|
<string name="backup_restore_missing_sources">Missing sources:</string>
|
||||||
|
|
Reference in a new issue