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. 88
      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. 100
      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)
}
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) {

@ -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

@ -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
)
}

@ -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<BookChapter> {

@ -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<Preference>(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<Preference>(PreferKey.backupPath)?.summary = uri.toString()
launch {
Restore.restore(requireContext(), uri)

@ -128,14 +128,16 @@ class MainActivity : VMBaseActivity<MainViewModel>(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)
}
}
}

@ -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)
}

@ -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)
}

Loading…
Cancel
Save