pull/94/head
kunfei 5 years ago
parent c1cdccc9f9
commit 9a7c8eb9f6
  1. 10
      app/src/main/java/io/legado/app/help/AppConfig.kt
  2. 4
      app/src/main/java/io/legado/app/help/BookHelp.kt
  3. 15
      app/src/main/java/io/legado/app/help/storage/Backup.kt
  4. 2
      app/src/main/java/io/legado/app/model/localBook/AnalyzeTxtFile.kt
  5. 60
      app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt
  6. 10
      app/src/main/java/io/legado/app/ui/main/MainActivity.kt
  7. 72
      app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt
  8. 2
      app/src/main/java/io/legado/app/utils/FileUtils.kt

@ -28,6 +28,16 @@ object AppConfig {
App.INSTANCE.putPrefBoolean("transparentStatusBar", value) 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 var isShowRSS: Boolean
get() = App.INSTANCE.getPrefBoolean(PreferKey.showRss, true) get() = App.INSTANCE.getPrefBoolean(PreferKey.showRss, true)
set(value) { set(value) {

@ -75,7 +75,7 @@ object BookHelp {
)?.uri?.writeText(App.INSTANCE, content) )?.uri?.writeText(App.INSTANCE, content)
} }
} else { } else {
FileUtils.createFileIfNotExist( FileUtils.createFolderIfNotExist(
File(downloadPath), File(downloadPath),
subDirs = *arrayOf(cacheFolderName, bookFolderName(book)) subDirs = *arrayOf(cacheFolderName, bookFolderName(book))
).listFiles()?.forEach { ).listFiles()?.forEach {
@ -101,7 +101,7 @@ object BookHelp {
)?.listFiles()?.size ?: 0 )?.listFiles()?.size ?: 0
} }
} else { } else {
return FileUtils.createFileIfNotExist( return FileUtils.createFolderIfNotExist(
File(downloadPath), File(downloadPath),
subDirs = *arrayOf(cacheFolderName, bookFolderName(book)) subDirs = *arrayOf(cacheFolderName, bookFolderName(book))
).list()?.size ?: 0 ).list()?.size ?: 0

@ -8,6 +8,7 @@ import io.legado.app.help.ReadBookConfig
import io.legado.app.utils.DocumentUtils import io.legado.app.utils.DocumentUtils
import io.legado.app.utils.FileUtils import io.legado.app.utils.FileUtils
import io.legado.app.utils.GSON import io.legado.app.utils.GSON
import io.legado.app.utils.isContentPath
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.jetbrains.anko.defaultSharedPreferences 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) { withContext(IO) {
writeListToJson(App.db.bookDao().all, "bookshelf.json", backupPath) writeListToJson(App.db.bookDao().all, "bookshelf.json", backupPath)
writeListToJson(App.db.bookGroupDao().all, "bookGroup.json", backupPath) writeListToJson(App.db.bookGroupDao().all, "bookGroup.json", backupPath)
@ -70,10 +71,10 @@ object Backup {
edit.commit() edit.commit()
} }
WebDavHelp.backUpWebDav(backupPath) WebDavHelp.backUpWebDav(backupPath)
if (uri != null) { if (path.isContentPath()) {
copyBackup(context, uri) copyBackup(context, Uri.parse(path))
} else { } else {
copyBackup() copyBackup(File(path))
} }
} }
} }
@ -100,12 +101,12 @@ object Backup {
} }
} }
private fun copyBackup() { private fun copyBackup(file: File) {
try { try {
for (fileName in backupFileNames) { for (fileName in backupFileNames) {
FileUtils.createFileIfNotExist(backupPath + File.separator + "bookshelf.json") FileUtils.createFileIfNotExist(backupPath + File.separator + fileName)
.copyTo( .copyTo(
FileUtils.createFileIfNotExist(legadoPath + File.separator + "bookshelf.json"), FileUtils.createFileIfNotExist(file, fileName),
true true
) )
} }

@ -24,7 +24,7 @@ object AnalyzeTxtFile {
val rootFile = App.INSTANCE.getExternalFilesDir(null) val rootFile = App.INSTANCE.getExternalFilesDir(null)
?: App.INSTANCE.externalCacheDir ?: App.INSTANCE.externalCacheDir
?: App.INSTANCE.cacheDir ?: App.INSTANCE.cacheDir
FileUtils.createFileIfNotExist(rootFile, subDirs = *arrayOf(folderName)) FileUtils.createFolderIfNotExist(rootFile, subDirs = *arrayOf(folderName))
} }
fun analyze(context: Context, book: Book): ArrayList<BookChapter> { fun analyze(context: Context, book: Book): ArrayList<BookChapter> {

@ -14,6 +14,7 @@ import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import io.legado.app.R import io.legado.app.R
import io.legado.app.constant.PreferKey import io.legado.app.constant.PreferKey
import io.legado.app.help.AppConfig
import io.legado.app.help.IntentHelp import io.legado.app.help.IntentHelp
import io.legado.app.help.permission.Permissions import io.legado.app.help.permission.Permissions
import io.legado.app.help.permission.PermissionsCompat import io.legado.app.help.permission.PermissionsCompat
@ -127,40 +128,71 @@ class BackupConfigFragment : PreferenceFragmentCompat(),
} }
private fun backup() { private fun backup() {
val backupPath = getPrefString(PreferKey.backupPath) val backupPath = AppConfig.backupPath
if (backupPath?.isNotEmpty() == true) { if (backupPath.isNullOrEmpty()) {
selectBackupFolder()
} else {
if (backupPath.isContentPath()) {
val uri = Uri.parse(backupPath) val uri = Uri.parse(backupPath)
val doc = DocumentFile.fromTreeUri(requireContext(), uri) val doc = DocumentFile.fromTreeUri(requireContext(), uri)
if (doc?.canWrite() == true) { if (doc?.canWrite() == true) {
launch { launch {
Backup.backup(requireContext(), uri) Backup.backup(requireContext(), backupPath)
toast(R.string.backup_success) toast(R.string.backup_success)
} }
} else { } else {
selectBackupFolder() selectBackupFolder()
} }
} else { } else {
selectBackupFolder() backupUsePermission()
}
} }
} }
private fun selectBackupFolder() { private fun backupUsePermission(path: String = Backup.legadoPath) {
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) PermissionsCompat.Builder(this)
.addPermissions(*Permissions.Group.STORAGE) .addPermissions(*Permissions.Group.STORAGE)
.rationale(R.string.tip_perm_request_storage) .rationale(R.string.tip_perm_request_storage)
.onGranted { .onGranted {
launch { launch {
Backup.backup(requireContext(), null) Backup.backup(requireContext(), path)
toast(R.string.backup_success) toast(R.string.backup_success)
} }
} }
.request() .request()
} }
private fun selectBackupFolder() {
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 -> {
}
}
}
}.show()
} }
fun restore() { fun restore() {
@ -313,10 +345,10 @@ class BackupConfigFragment : PreferenceFragmentCompat(),
uri, uri,
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
) )
putPrefString(PreferKey.backupPath, uri.toString()) AppConfig.backupPath = uri.toString()
findPreference<Preference>(PreferKey.backupPath)?.summary = uri.toString() findPreference<Preference>(PreferKey.backupPath)?.summary = uri.toString()
launch { launch {
Backup.backup(requireContext(), uri) Backup.backup(requireContext(), uri.toString())
toast(R.string.backup_success) toast(R.string.backup_success)
} }
} }
@ -327,7 +359,7 @@ class BackupConfigFragment : PreferenceFragmentCompat(),
uri, uri,
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
) )
putPrefString(PreferKey.backupPath, uri.toString()) AppConfig.backupPath = uri.toString()
findPreference<Preference>(PreferKey.backupPath)?.summary = uri.toString() findPreference<Preference>(PreferKey.backupPath)?.summary = uri.toString()
launch { launch {
Restore.restore(requireContext(), uri) Restore.restore(requireContext(), uri)

@ -128,14 +128,16 @@ class MainActivity : VMBaseActivity<MainViewModel>(R.layout.activity_main),
private fun backup() { private fun backup() {
Coroutine.async { Coroutine.async {
val backupPath = getPrefString(PreferKey.backupPath) val backupPath = getPrefString(PreferKey.backupPath)
if (backupPath?.isNotEmpty() == true) { if (backupPath.isNullOrEmpty()) {
Backup.backup(this@MainActivity)
} else {
val uri = Uri.parse(backupPath) val uri = Uri.parse(backupPath)
val doc = DocumentFile.fromTreeUri(this@MainActivity, uri) val doc = DocumentFile.fromTreeUri(this@MainActivity, uri)
if (doc?.canWrite() == true) { if (doc?.canWrite() == true) {
Backup.backup(this@MainActivity, uri) Backup.backup(this@MainActivity, backupPath)
}
} else { } else {
Backup.backup(this@MainActivity, null) Backup.backup(this@MainActivity)
}
} }
} }
} }

@ -16,12 +16,14 @@ import io.legado.app.R
import io.legado.app.base.BaseFragment import io.legado.app.base.BaseFragment
import io.legado.app.constant.EventBus import io.legado.app.constant.EventBus
import io.legado.app.constant.PreferKey import io.legado.app.constant.PreferKey
import io.legado.app.help.AppConfig
import io.legado.app.help.BookHelp import io.legado.app.help.BookHelp
import io.legado.app.help.permission.Permissions import io.legado.app.help.permission.Permissions
import io.legado.app.help.permission.PermissionsCompat import io.legado.app.help.permission.PermissionsCompat
import io.legado.app.help.storage.Backup import io.legado.app.help.storage.Backup
import io.legado.app.help.storage.Restore import io.legado.app.help.storage.Restore
import io.legado.app.help.storage.WebDavHelp 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.ATH
import io.legado.app.lib.theme.prefs.ATESwitchPreference import io.legado.app.lib.theme.prefs.ATESwitchPreference
import io.legado.app.service.WebService import io.legado.app.service.WebService
@ -45,7 +47,8 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config) {
val fragmentTag = "prefFragment" val fragmentTag = "prefFragment"
var preferenceFragment = childFragmentManager.findFragmentByTag(fragmentTag) var preferenceFragment = childFragmentManager.findFragmentByTag(fragmentTag)
if (preferenceFragment == null) preferenceFragment = PreferenceFragment() 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) { override fun onCompatCreateOptionsMenu(menu: Menu) {
@ -60,42 +63,72 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config) {
} }
} }
private fun backup() { private fun backup() {
val backupPath = getPrefString(PreferKey.backupPath) val backupPath = AppConfig.backupPath
if (backupPath?.isNotEmpty() == true) { if (backupPath.isNullOrEmpty()) {
selectBackupFolder()
} else {
if (backupPath.isContentPath()) {
val uri = Uri.parse(backupPath) val uri = Uri.parse(backupPath)
val doc = DocumentFile.fromTreeUri(requireContext(), uri) val doc = DocumentFile.fromTreeUri(requireContext(), uri)
if (doc?.canWrite() == true) { if (doc?.canWrite() == true) {
launch { launch {
Backup.backup(requireContext(), uri) Backup.backup(requireContext(), backupPath)
toast(R.string.backup_success) toast(R.string.backup_success)
} }
} else { } else {
selectBackupFolder() selectBackupFolder()
} }
} else { } else {
selectBackupFolder() backupUsePermission()
}
} }
} }
private fun selectBackupFolder() { private fun backupUsePermission(path: String = Backup.legadoPath) {
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) PermissionsCompat.Builder(this)
.addPermissions(*Permissions.Group.STORAGE) .addPermissions(*Permissions.Group.STORAGE)
.rationale(R.string.tip_perm_request_storage) .rationale(R.string.tip_perm_request_storage)
.onGranted { .onGranted {
launch { launch {
Backup.backup(requireContext(), null) Backup.backup(requireContext(), path)
toast(R.string.backup_success) toast(R.string.backup_success)
} }
} }
.request() .request()
} }
private fun selectBackupFolder() {
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 -> {
}
}
}
}.show()
} }
fun restore() { fun restore() {
@ -148,9 +181,9 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config) {
uri, uri,
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
) )
putPrefString(PreferKey.backupPath, uri.toString()) AppConfig.backupPath = uri.toString()
launch { launch {
Backup.backup(requireContext(), uri) Backup.backup(requireContext(), uri.toString())
toast(R.string.backup_success) toast(R.string.backup_success)
} }
} }
@ -161,7 +194,7 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config) {
uri, uri,
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
) )
putPrefString(PreferKey.backupPath, uri.toString()) AppConfig.backupPath = uri.toString()
launch { launch {
Restore.restore(requireContext(), uri) Restore.restore(requireContext(), uri)
toast(R.string.restore_success) toast(R.string.restore_success)
@ -202,14 +235,17 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config) {
super.onPause() super.onPause()
} }
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { override fun onSharedPreferenceChanged(
sharedPreferences: SharedPreferences?,
key: String?
) {
when (key) { when (key) {
PreferKey.themeMode -> App.INSTANCE.applyDayNight() PreferKey.themeMode -> App.INSTANCE.applyDayNight()
PreferKey.webService -> { PreferKey.webService -> {
if (requireContext().getPrefBoolean("webService")) { if (requireContext().getPrefBoolean("webService")) {
WebService.start(requireContext()) WebService.start(requireContext())
toast(R.string.service_start) toast(R.string.service_start)
}else{ } else {
WebService.stop(requireContext()) WebService.stop(requireContext())
toast(R.string.service_stop) toast(R.string.service_stop)
} }

@ -22,7 +22,7 @@ object FileUtils {
return createFileIfNotExist(filePath) 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) val filePath = root.absolutePath + File.separator + subDirs.joinToString(File.separator)
return createFolderIfNotExist(filePath) return createFolderIfNotExist(filePath)
} }

Loading…
Cancel
Save