pull/94/head
parent
c97017e961
commit
952abab4f9
@ -0,0 +1,173 @@ |
||||
package io.legado.app.ui.config |
||||
|
||||
import android.app.Activity.RESULT_OK |
||||
import android.content.Intent |
||||
import android.net.Uri |
||||
import androidx.documentfile.provider.DocumentFile |
||||
import androidx.fragment.app.Fragment |
||||
import io.legado.app.App |
||||
import io.legado.app.R |
||||
import io.legado.app.constant.PreferKey |
||||
import io.legado.app.help.AppConfig |
||||
import io.legado.app.help.coroutine.Coroutine |
||||
import io.legado.app.help.permission.Permissions |
||||
import io.legado.app.help.permission.PermissionsCompat |
||||
import io.legado.app.help.storage.Backup |
||||
import io.legado.app.help.storage.Restore |
||||
import io.legado.app.help.storage.WebDavHelp |
||||
import io.legado.app.lib.dialogs.alert |
||||
import io.legado.app.utils.getPrefString |
||||
import io.legado.app.utils.isContentPath |
||||
import io.legado.app.utils.toast |
||||
import kotlinx.coroutines.Dispatchers.Main |
||||
import org.jetbrains.anko.toast |
||||
|
||||
object BackupRestoreUi { |
||||
|
||||
private const val backupSelectRequestCode = 22 |
||||
private const val restoreSelectRequestCode = 33 |
||||
|
||||
fun backup(fragment: Fragment) { |
||||
val backupPath = AppConfig.backupPath |
||||
if (backupPath.isNullOrEmpty()) { |
||||
selectBackupFolder(fragment) |
||||
} else { |
||||
if (backupPath.isContentPath()) { |
||||
val uri = Uri.parse(backupPath) |
||||
val doc = DocumentFile.fromTreeUri(fragment.requireContext(), uri) |
||||
if (doc?.canWrite() == true) { |
||||
Coroutine.async { |
||||
Backup.backup(fragment.requireContext(), backupPath) |
||||
}.onSuccess { |
||||
fragment.toast(R.string.backup_success) |
||||
} |
||||
} else { |
||||
selectBackupFolder(fragment) |
||||
} |
||||
} else { |
||||
backupUsePermission(fragment) |
||||
} |
||||
} |
||||
} |
||||
|
||||
private fun backupUsePermission(fragment: Fragment, path: String = Backup.legadoPath) { |
||||
PermissionsCompat.Builder(fragment) |
||||
.addPermissions(*Permissions.Group.STORAGE) |
||||
.rationale(R.string.tip_perm_request_storage) |
||||
.onGranted { |
||||
Coroutine.async { |
||||
Backup.backup(fragment.requireContext(), path) |
||||
}.onSuccess { |
||||
fragment.toast(R.string.backup_success) |
||||
} |
||||
} |
||||
.request() |
||||
} |
||||
|
||||
fun selectBackupFolder(fragment: Fragment) { |
||||
fragment.alert { |
||||
titleResource = R.string.select_folder |
||||
items(arrayListOf("默认路径", "系统文件夹选择器", "自带文件夹选择器")) { _, index -> |
||||
when (index) { |
||||
0 -> PermissionsCompat.Builder(fragment) |
||||
.addPermissions(*Permissions.Group.STORAGE) |
||||
.rationale(R.string.tip_perm_request_storage) |
||||
.onGranted { |
||||
AppConfig.backupPath = Backup.legadoPath |
||||
backupUsePermission(fragment) |
||||
} |
||||
.request() |
||||
1 -> { |
||||
try { |
||||
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) |
||||
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) |
||||
fragment.startActivityForResult(intent, backupSelectRequestCode) |
||||
} catch (e: java.lang.Exception) { |
||||
e.printStackTrace() |
||||
fragment.toast(e.localizedMessage ?: "ERROR") |
||||
} |
||||
} |
||||
2 -> { |
||||
|
||||
} |
||||
} |
||||
} |
||||
}.show() |
||||
} |
||||
|
||||
fun restore(fragment: Fragment) { |
||||
Coroutine.async(context = Main) { |
||||
if (!WebDavHelp.showRestoreDialog(fragment.requireContext()) { |
||||
fragment.toast(R.string.restore_success) |
||||
}) { |
||||
val backupPath = fragment.getPrefString(PreferKey.backupPath) |
||||
if (backupPath?.isNotEmpty() == true) { |
||||
val uri = Uri.parse(backupPath) |
||||
val doc = DocumentFile.fromTreeUri(fragment.requireContext(), uri) |
||||
if (doc?.canWrite() == true) { |
||||
Restore.restore(fragment.requireContext(), uri) |
||||
fragment.toast(R.string.restore_success) |
||||
} else { |
||||
selectRestoreFolder(fragment) |
||||
} |
||||
} else { |
||||
selectRestoreFolder(fragment) |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
private fun selectRestoreFolder(fragment: Fragment) { |
||||
try { |
||||
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) |
||||
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) |
||||
fragment.startActivityForResult(intent, restoreSelectRequestCode) |
||||
} catch (e: java.lang.Exception) { |
||||
PermissionsCompat.Builder(fragment) |
||||
.addPermissions(*Permissions.Group.STORAGE) |
||||
.rationale(R.string.tip_perm_request_storage) |
||||
.onGranted { |
||||
Coroutine.async { |
||||
Restore.restore(Backup.legadoPath) |
||||
}.onSuccess { |
||||
fragment.toast(R.string.restore_success) |
||||
} |
||||
} |
||||
.request() |
||||
} |
||||
} |
||||
|
||||
fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { |
||||
when (requestCode) { |
||||
backupSelectRequestCode -> if (resultCode == RESULT_OK) { |
||||
data?.data?.let { uri -> |
||||
App.INSTANCE.contentResolver.takePersistableUriPermission( |
||||
uri, |
||||
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION |
||||
) |
||||
AppConfig.backupPath = uri.toString() |
||||
Coroutine.async { |
||||
Backup.backup(App.INSTANCE, uri.toString()) |
||||
}.onSuccess { |
||||
App.INSTANCE.toast(R.string.backup_success) |
||||
} |
||||
} |
||||
} |
||||
restoreSelectRequestCode -> if (resultCode == RESULT_OK) { |
||||
data?.data?.let { uri -> |
||||
App.INSTANCE.contentResolver.takePersistableUriPermission( |
||||
uri, |
||||
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION |
||||
) |
||||
AppConfig.backupPath = uri.toString() |
||||
Coroutine.async { |
||||
Restore.restore(App.INSTANCE, uri) |
||||
}.onSuccess { |
||||
App.INSTANCE.toast(R.string.restore_success) |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue