mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 14:27:57 +01:00 
			
		
		
		
	Refactor backup restore process to stop relying on file extension
This commit is contained in:
		| @@ -12,7 +12,6 @@ import android.widget.Toast | ||||
| import androidx.appcompat.app.AlertDialog | ||||
| import androidx.core.net.toUri | ||||
| import androidx.core.os.bundleOf | ||||
| import androidx.documentfile.provider.DocumentFile | ||||
| import androidx.preference.PreferenceScreen | ||||
| import com.google.android.material.dialog.MaterialAlertDialogBuilder | ||||
| import com.hippo.unifile.UniFile | ||||
| @@ -201,26 +200,7 @@ class SettingsBackupController : SettingsController() { | ||||
|                     ) | ||||
|                 } | ||||
|                 CODE_BACKUP_RESTORE -> { | ||||
|                     uri?.path?.let { | ||||
|                         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)) | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                     uri?.let { RestoreBackupDialog(it).showDialog(router) } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| @@ -284,32 +264,28 @@ class SettingsBackupController : SettingsController() { | ||||
|     } | ||||
|  | ||||
|     class RestoreBackupDialog(bundle: Bundle? = null) : DialogController(bundle) { | ||||
|         constructor(uri: Uri, type: Int) : this( | ||||
|             bundleOf( | ||||
|                 KEY_URI to uri, | ||||
|                 KEY_TYPE to type | ||||
|             ) | ||||
|         constructor(uri: Uri) : this( | ||||
|             bundleOf(KEY_URI to uri) | ||||
|         ) | ||||
|  | ||||
|         override fun onCreateDialog(savedViewState: Bundle?): Dialog { | ||||
|             val activity = activity!! | ||||
|             val uri: Uri = args.getParcelable(KEY_URI)!! | ||||
|             val type: Int = args.getInt(KEY_TYPE) | ||||
|  | ||||
|             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) { | ||||
|                     activity.getString(R.string.backup_restore_content_full) | ||||
|                 } else { | ||||
|                     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()) { | ||||
|                     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_TYPE = "RestoreBackupDialog.type" | ||||
|  | ||||
| private const val CODE_BACKUP_DIR = 503 | ||||
| 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="backup_created">Backup created</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_manga">Backup does not contain any manga.</string> | ||||
|     <string name="backup_restore_missing_sources">Missing sources:</string> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user