From 9a7c8eb9f6f43f8a8004138308d29d10570efc0d Mon Sep 17 00:00:00 2001 From: kunfei Date: Sat, 8 Feb 2020 22:15:57 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/help/AppConfig.kt | 10 ++ .../main/java/io/legado/app/help/BookHelp.kt | 4 +- .../java/io/legado/app/help/storage/Backup.kt | 15 +-- .../app/model/localBook/AnalyzeTxtFile.kt | 2 +- .../app/ui/config/BackupConfigFragment.kt | 88 ++++++++++----- .../io/legado/app/ui/main/MainActivity.kt | 10 +- .../io/legado/app/ui/main/my/MyFragment.kt | 100 ++++++++++++------ .../java/io/legado/app/utils/FileUtils.kt | 2 +- 8 files changed, 156 insertions(+), 75 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/AppConfig.kt b/app/src/main/java/io/legado/app/help/AppConfig.kt index a5c0352aa..eab1acd6b 100644 --- a/app/src/main/java/io/legado/app/help/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/AppConfig.kt @@ -28,6 +28,16 @@ object AppConfig { App.INSTANCE.putPrefBoolean("transparentStatusBar", value) } + var backupPath: String? + get() = App.INSTANCE.getPrefString(PreferKey.backupPath) + set(value) { + if (value.isNullOrEmpty()) { + App.INSTANCE.removePref(PreferKey.backupPath) + } else { + App.INSTANCE.putPrefString(PreferKey.backupPath, value) + } + } + var isShowRSS: Boolean get() = App.INSTANCE.getPrefBoolean(PreferKey.showRss, true) set(value) { diff --git a/app/src/main/java/io/legado/app/help/BookHelp.kt b/app/src/main/java/io/legado/app/help/BookHelp.kt index de8c0a5a7..67ea2bd30 100644 --- a/app/src/main/java/io/legado/app/help/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/BookHelp.kt @@ -75,7 +75,7 @@ object BookHelp { )?.uri?.writeText(App.INSTANCE, content) } } else { - FileUtils.createFileIfNotExist( + FileUtils.createFolderIfNotExist( File(downloadPath), subDirs = *arrayOf(cacheFolderName, bookFolderName(book)) ).listFiles()?.forEach { @@ -101,7 +101,7 @@ object BookHelp { )?.listFiles()?.size ?: 0 } } else { - return FileUtils.createFileIfNotExist( + return FileUtils.createFolderIfNotExist( File(downloadPath), subDirs = *arrayOf(cacheFolderName, bookFolderName(book)) ).list()?.size ?: 0 diff --git a/app/src/main/java/io/legado/app/help/storage/Backup.kt b/app/src/main/java/io/legado/app/help/storage/Backup.kt index 30e77eab6..82485c363 100644 --- a/app/src/main/java/io/legado/app/help/storage/Backup.kt +++ b/app/src/main/java/io/legado/app/help/storage/Backup.kt @@ -8,6 +8,7 @@ import io.legado.app.help.ReadBookConfig import io.legado.app.utils.DocumentUtils import io.legado.app.utils.FileUtils import io.legado.app.utils.GSON +import io.legado.app.utils.isContentPath import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.withContext import org.jetbrains.anko.defaultSharedPreferences @@ -43,7 +44,7 @@ object Backup { ) } - suspend fun backup(context: Context, uri: Uri?) { + suspend fun backup(context: Context, path: String = legadoPath) { withContext(IO) { writeListToJson(App.db.bookDao().all, "bookshelf.json", backupPath) writeListToJson(App.db.bookGroupDao().all, "bookGroup.json", backupPath) @@ -70,10 +71,10 @@ object Backup { edit.commit() } WebDavHelp.backUpWebDav(backupPath) - if (uri != null) { - copyBackup(context, uri) + if (path.isContentPath()) { + copyBackup(context, Uri.parse(path)) } else { - copyBackup() + copyBackup(File(path)) } } } @@ -100,12 +101,12 @@ object Backup { } } - private fun copyBackup() { + private fun copyBackup(file: File) { try { for (fileName in backupFileNames) { - FileUtils.createFileIfNotExist(backupPath + File.separator + "bookshelf.json") + FileUtils.createFileIfNotExist(backupPath + File.separator + fileName) .copyTo( - FileUtils.createFileIfNotExist(legadoPath + File.separator + "bookshelf.json"), + FileUtils.createFileIfNotExist(file, fileName), true ) } diff --git a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt index 9783dca3e..99b6b95d3 100644 --- a/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt @@ -24,7 +24,7 @@ object AnalyzeTxtFile { val rootFile = App.INSTANCE.getExternalFilesDir(null) ?: App.INSTANCE.externalCacheDir ?: App.INSTANCE.cacheDir - FileUtils.createFileIfNotExist(rootFile, subDirs = *arrayOf(folderName)) + FileUtils.createFolderIfNotExist(rootFile, subDirs = *arrayOf(folderName)) } fun analyze(context: Context, book: Book): ArrayList { diff --git a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt index 38f5568fb..76f9e92de 100644 --- a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt @@ -14,6 +14,7 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import io.legado.app.R import io.legado.app.constant.PreferKey +import io.legado.app.help.AppConfig import io.legado.app.help.IntentHelp import io.legado.app.help.permission.Permissions import io.legado.app.help.permission.PermissionsCompat @@ -127,40 +128,71 @@ class BackupConfigFragment : PreferenceFragmentCompat(), } private fun backup() { - val backupPath = getPrefString(PreferKey.backupPath) - if (backupPath?.isNotEmpty() == true) { - val uri = Uri.parse(backupPath) - val doc = DocumentFile.fromTreeUri(requireContext(), uri) - if (doc?.canWrite() == true) { - launch { - Backup.backup(requireContext(), uri) - toast(R.string.backup_success) + val backupPath = AppConfig.backupPath + if (backupPath.isNullOrEmpty()) { + selectBackupFolder() + } else { + if (backupPath.isContentPath()) { + val uri = Uri.parse(backupPath) + val doc = DocumentFile.fromTreeUri(requireContext(), uri) + if (doc?.canWrite() == true) { + launch { + Backup.backup(requireContext(), backupPath) + toast(R.string.backup_success) + } + } else { + selectBackupFolder() } } else { - selectBackupFolder() + backupUsePermission() } - } else { - selectBackupFolder() } } + private fun backupUsePermission(path: String = Backup.legadoPath) { + PermissionsCompat.Builder(this) + .addPermissions(*Permissions.Group.STORAGE) + .rationale(R.string.tip_perm_request_storage) + .onGranted { + launch { + Backup.backup(requireContext(), path) + toast(R.string.backup_success) + } + } + .request() + } + private fun selectBackupFolder() { - try { - val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - startActivityForResult(intent, backupSelectRequestCode) - } catch (e: java.lang.Exception) { - PermissionsCompat.Builder(this) - .addPermissions(*Permissions.Group.STORAGE) - .rationale(R.string.tip_perm_request_storage) - .onGranted { - launch { - Backup.backup(requireContext(), null) - toast(R.string.backup_success) + alert { + titleResource = R.string.select_folder + items(arrayListOf("默认路径", "系统文件夹选择器", "自带文件夹选择器")) { _, index -> + when (index) { + 0 -> PermissionsCompat.Builder(this@BackupConfigFragment) + .addPermissions(*Permissions.Group.STORAGE) + .rationale(R.string.tip_perm_request_storage) + .onGranted { + launch { + AppConfig.backupPath = Backup.legadoPath + toast(R.string.backup_success) + } + } + .request() + 1 -> { + try { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + startActivityForResult(intent, backupSelectRequestCode) + } catch (e: java.lang.Exception) { + e.printStackTrace() + toast(e.localizedMessage ?: "ERROR") + } + } + 2 -> { + } } - .request() - } + } + }.show() } fun restore() { @@ -313,10 +345,10 @@ class BackupConfigFragment : PreferenceFragmentCompat(), uri, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION ) - putPrefString(PreferKey.backupPath, uri.toString()) + AppConfig.backupPath = uri.toString() findPreference(PreferKey.backupPath)?.summary = uri.toString() launch { - Backup.backup(requireContext(), uri) + Backup.backup(requireContext(), uri.toString()) toast(R.string.backup_success) } } @@ -327,7 +359,7 @@ class BackupConfigFragment : PreferenceFragmentCompat(), uri, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION ) - putPrefString(PreferKey.backupPath, uri.toString()) + AppConfig.backupPath = uri.toString() findPreference(PreferKey.backupPath)?.summary = uri.toString() launch { Restore.restore(requireContext(), uri) diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index 3b4bbb859..c540a8448 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -128,14 +128,16 @@ class MainActivity : VMBaseActivity(R.layout.activity_main), private fun backup() { Coroutine.async { val backupPath = getPrefString(PreferKey.backupPath) - if (backupPath?.isNotEmpty() == true) { + if (backupPath.isNullOrEmpty()) { + Backup.backup(this@MainActivity) + } else { val uri = Uri.parse(backupPath) val doc = DocumentFile.fromTreeUri(this@MainActivity, uri) if (doc?.canWrite() == true) { - Backup.backup(this@MainActivity, uri) + Backup.backup(this@MainActivity, backupPath) + } else { + Backup.backup(this@MainActivity) } - } else { - Backup.backup(this@MainActivity, null) } } } diff --git a/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt b/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt index 09969afda..af907c5a4 100644 --- a/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt @@ -16,12 +16,14 @@ import io.legado.app.R import io.legado.app.base.BaseFragment import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey +import io.legado.app.help.AppConfig import io.legado.app.help.BookHelp 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.lib.theme.ATH import io.legado.app.lib.theme.prefs.ATESwitchPreference import io.legado.app.service.WebService @@ -45,7 +47,8 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config) { val fragmentTag = "prefFragment" var preferenceFragment = childFragmentManager.findFragmentByTag(fragmentTag) if (preferenceFragment == null) preferenceFragment = PreferenceFragment() - childFragmentManager.beginTransaction().replace(R.id.pre_fragment, preferenceFragment, fragmentTag).commit() + childFragmentManager.beginTransaction() + .replace(R.id.pre_fragment, preferenceFragment, fragmentTag).commit() } override fun onCompatCreateOptionsMenu(menu: Menu) { @@ -60,42 +63,72 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config) { } } - private fun backup() { - val backupPath = getPrefString(PreferKey.backupPath) - if (backupPath?.isNotEmpty() == true) { - val uri = Uri.parse(backupPath) - val doc = DocumentFile.fromTreeUri(requireContext(), uri) - if (doc?.canWrite() == true) { - launch { - Backup.backup(requireContext(), uri) - toast(R.string.backup_success) + val backupPath = AppConfig.backupPath + if (backupPath.isNullOrEmpty()) { + selectBackupFolder() + } else { + if (backupPath.isContentPath()) { + val uri = Uri.parse(backupPath) + val doc = DocumentFile.fromTreeUri(requireContext(), uri) + if (doc?.canWrite() == true) { + launch { + Backup.backup(requireContext(), backupPath) + toast(R.string.backup_success) + } + } else { + selectBackupFolder() } } else { - selectBackupFolder() + backupUsePermission() } - } else { - selectBackupFolder() } } + private fun backupUsePermission(path: String = Backup.legadoPath) { + PermissionsCompat.Builder(this) + .addPermissions(*Permissions.Group.STORAGE) + .rationale(R.string.tip_perm_request_storage) + .onGranted { + launch { + Backup.backup(requireContext(), path) + toast(R.string.backup_success) + } + } + .request() + } + private fun selectBackupFolder() { - try { - val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - startActivityForResult(intent, backupSelectRequestCode) - } catch (e: java.lang.Exception) { - PermissionsCompat.Builder(this) - .addPermissions(*Permissions.Group.STORAGE) - .rationale(R.string.tip_perm_request_storage) - .onGranted { - launch { - Backup.backup(requireContext(), null) - toast(R.string.backup_success) + alert { + titleResource = R.string.select_folder + items(arrayListOf("默认路径", "系统文件夹选择器", "自带文件夹选择器")) { _, index -> + when (index) { + 0 -> PermissionsCompat.Builder(this@MyFragment) + .addPermissions(*Permissions.Group.STORAGE) + .rationale(R.string.tip_perm_request_storage) + .onGranted { + launch { + AppConfig.backupPath = Backup.legadoPath + toast(R.string.backup_success) + } + } + .request() + 1 -> { + try { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + startActivityForResult(intent, backupSelectRequestCode) + } catch (e: java.lang.Exception) { + e.printStackTrace() + toast(e.localizedMessage ?: "ERROR") + } + } + 2 -> { + } } - .request() - } + } + }.show() } fun restore() { @@ -148,9 +181,9 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config) { uri, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION ) - putPrefString(PreferKey.backupPath, uri.toString()) + AppConfig.backupPath = uri.toString() launch { - Backup.backup(requireContext(), uri) + Backup.backup(requireContext(), uri.toString()) toast(R.string.backup_success) } } @@ -161,7 +194,7 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config) { uri, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION ) - putPrefString(PreferKey.backupPath, uri.toString()) + AppConfig.backupPath = uri.toString() launch { Restore.restore(requireContext(), uri) toast(R.string.restore_success) @@ -202,14 +235,17 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config) { super.onPause() } - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + override fun onSharedPreferenceChanged( + sharedPreferences: SharedPreferences?, + key: String? + ) { when (key) { PreferKey.themeMode -> App.INSTANCE.applyDayNight() PreferKey.webService -> { if (requireContext().getPrefBoolean("webService")) { WebService.start(requireContext()) toast(R.string.service_start) - }else{ + } else { WebService.stop(requireContext()) toast(R.string.service_stop) } diff --git a/app/src/main/java/io/legado/app/utils/FileUtils.kt b/app/src/main/java/io/legado/app/utils/FileUtils.kt index 13e55161d..8dbfa318f 100644 --- a/app/src/main/java/io/legado/app/utils/FileUtils.kt +++ b/app/src/main/java/io/legado/app/utils/FileUtils.kt @@ -22,7 +22,7 @@ object FileUtils { return createFileIfNotExist(filePath) } - fun createFileIfNotExist(root: File, vararg subDirs: String): File { + fun createFolderIfNotExist(root: File, vararg subDirs: String): File { val filePath = root.absolutePath + File.separator + subDirs.joinToString(File.separator) return createFolderIfNotExist(filePath) }