@ -1,27 +1,41 @@
package org.koitharu.kotatsu.settings.backup
package org.koitharu.kotatsu.settings.backup
import android.net.Uri
import android.os.Bundle
import android.os.Bundle
import android.view.LayoutInflater
import android.view.LayoutInflater
import android.view.View
import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AlertDialog
import androidx.core.view.isVisible
import androidx.core.view.isVisible
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.AlertDialogFragment
import org.koitharu.kotatsu.base.ui.AlertDialogFragment
import org.koitharu.kotatsu.databinding.DialogProgressBinding
import org.koitharu.kotatsu.databinding.DialogProgressBinding
import org.koitharu.kotatsu.utils.ShareHelper
import org.koitharu.kotatsu.utils.ext.getDisplayMessage
import org.koitharu.kotatsu.utils.ext.getDisplayMessage
import org.koitharu.kotatsu.utils.progress.Progress
import org.koitharu.kotatsu.utils.progress.Progress
import java.io.File
import java.io.File
import java.io.FileOutputStream
class BackupDialogFragment : AlertDialogFragment < DialogProgressBinding > ( ) {
class BackupDialogFragment : AlertDialogFragment < DialogProgressBinding > ( ) {
private val viewModel by viewModel < BackupViewModel > ( mode = LazyThreadSafetyMode . NONE )
private val viewModel by viewModel < BackupViewModel > ( mode = LazyThreadSafetyMode . NONE )
private var backup : File ? = null
private val saveFileContract =
registerForActivityResult ( ActivityResultContracts . CreateDocument ( ) ) { uri ->
val file = backup
if ( uri != null && file != null ) {
saveBackup ( file , uri )
} else {
dismiss ( )
}
}
override fun onInflateView (
override fun onInflateView (
inflater : LayoutInflater ,
inflater : LayoutInflater ,
container : ViewGroup ?
container : ViewGroup ? ,
) = DialogProgressBinding . inflate ( inflater , container , false )
) = DialogProgressBinding . inflate ( inflater , container , false )
override fun onViewCreated ( view : View , savedInstanceState : Bundle ? ) {
override fun onViewCreated ( view : View , savedInstanceState : Bundle ? ) {
@ -60,8 +74,22 @@ class BackupDialogFragment : AlertDialogFragment<DialogProgressBinding>() {
}
}
private fun onBackupDone ( file : File ) {
private fun onBackupDone ( file : File ) {
ShareHelper ( context ?: return ) . shareBackup ( file )
this . backup = file
dismiss ( )
saveFileContract . launch ( file . name )
}
private fun saveBackup ( file : File , output : Uri ) {
try {
requireContext ( ) . contentResolver . openFileDescriptor ( output , " w " ) ?. use { fd ->
FileOutputStream ( fd . fileDescriptor ) . use {
it . write ( file . readBytes ( ) )
}
}
Toast . makeText ( requireContext ( ) , R . string . backup _saved , Toast . LENGTH _LONG ) . show ( )
dismiss ( )
} catch ( e : Exception ) {
onError ( e )
}
}
}
companion object {
companion object {