阅读配置导入

pull/363/head
gedoor 5 years ago
parent d7f7c91936
commit acf0db017f
  1. 2
      app/src/main/java/io/legado/app/help/CrashHandler.kt
  2. 2
      app/src/main/java/io/legado/app/help/storage/Backup.kt
  3. 4
      app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt
  4. 43
      app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt
  5. 4
      app/src/main/java/io/legado/app/ui/config/OtherConfigFragment.kt
  6. 21
      app/src/main/java/io/legado/app/utils/RealPathUtil.kt

@ -147,7 +147,7 @@ class CrashHandler : Thread.UncaughtExceptionHandler {
it.delete() it.delete()
} }
} }
FileUtils.createFileIfNotExist(rootFile, fileName, "crash") FileUtils.createFileIfNotExist(rootFile, "crash", fileName)
.writeText(sb.toString()) .writeText(sb.toString())
} }
} }

@ -130,7 +130,7 @@ object Backup {
if (file.exists()) { if (file.exists()) {
file.copyTo( file.copyTo(
if (isAuto) { if (isAuto) {
FileUtils.createFileIfNotExist(rootFile, fileName, "auto") FileUtils.createFileIfNotExist(rootFile, "auto", fileName)
} else { } else {
FileUtils.createFileIfNotExist(rootFile, fileName) FileUtils.createFileIfNotExist(rootFile, fileName)
}, true }, true

@ -111,7 +111,7 @@ class BookInfoEditActivity :
val doc = DocumentFile.fromSingleUri(this, uri) val doc = DocumentFile.fromSingleUri(this, uri)
doc?.name?.let { doc?.name?.let {
var file = this.externalFilesDir var file = this.externalFilesDir
file = FileUtils.createFileIfNotExist(file, it, "covers") file = FileUtils.createFileIfNotExist(file, "covers", it)
kotlin.runCatching { kotlin.runCatching {
DocumentUtils.readBytes(this, doc.uri) DocumentUtils.readBytes(this, doc.uri)
}.getOrNull()?.let { byteArray -> }.getOrNull()?.let { byteArray ->
@ -131,7 +131,7 @@ class BookInfoEditActivity :
val imgFile = File(path) val imgFile = File(path)
if (imgFile.exists()) { if (imgFile.exists()) {
var file = this.externalFilesDir var file = this.externalFilesDir
file = FileUtils.createFileIfNotExist(file, imgFile.name, "covers") file = FileUtils.createFileIfNotExist(file, "covers", imgFile.name)
file.writeBytes(imgFile.readBytes()) file.writeBytes(imgFile.readBytes())
coverChangeTo(file.absolutePath) coverChangeTo(file.absolutePath)
} }

@ -46,6 +46,7 @@ class BgTextConfigDialog : BaseDialogFragment(), FileChooserDialog.CallBack {
private val requestCodeBg = 123 private val requestCodeBg = 123
private val requestCodeExport = 131 private val requestCodeExport = 131
private val requestCodeImport = 132 private val requestCodeImport = 132
private val configFileName = "readConfig.zip"
private lateinit var adapter: BgAdapter private lateinit var adapter: BgAdapter
var primaryTextColor = 0 var primaryTextColor = 0
var secondaryTextColor = 0 var secondaryTextColor = 0
@ -225,7 +226,6 @@ class BgTextConfigDialog : BaseDialogFragment(), FileChooserDialog.CallBack {
exportFiles.add(bgExportFile) exportFiles.add(bgExportFile)
} }
} }
val configFileName = "readConfig.zip"
val configZipPath = FileUtils.getPath(requireContext().eCacheDir, configFileName) val configZipPath = FileUtils.getPath(requireContext().eCacheDir, configFileName)
if (ZipUtils.zipFiles(exportFiles, File(configZipPath))) { if (ZipUtils.zipFiles(exportFiles, File(configZipPath))) {
if (uri.isContentPath()) { if (uri.isContentPath()) {
@ -242,25 +242,52 @@ class BgTextConfigDialog : BaseDialogFragment(), FileChooserDialog.CallBack {
} }
} }
}.onSuccess { }.onSuccess {
toast("导出成功") toast("导出成功, 文件名为 $configFileName")
}.onError { }.onError {
it.printStackTrace() it.printStackTrace()
longToast("导出失败:${it.localizedMessage}") longToast("导出失败:${it.localizedMessage}")
} }
} }
@Suppress("BlockingMethodInNonBlockingContext")
private fun importConfig(uri: Uri) { private fun importConfig(uri: Uri) {
if (uri.toString().isContentPath()) { execute {
val configZipPath = FileUtils.getPath(requireContext().eCacheDir, configFileName)
} else { FileUtils.deleteFile(configZipPath)
val zipFile = FileUtils.createFileIfNotExist(configZipPath)
zipFile.writeBytes(uri.readBytes(requireContext())!!)
val configDirPath = FileUtils.getPath(requireContext().eCacheDir, "readConfig")
FileUtils.deleteFile(configDirPath)
ZipUtils.unzipFile(zipFile, FileUtils.createFolderIfNotExist(configDirPath))
val configDir = FileUtils.createFolderIfNotExist(configDirPath)
val configFile = FileUtils.getFile(configDir, "readConfig.json")
val config: ReadBookConfig.Config = GSON.fromJsonObject(configFile.readText())!!
if (config.textFont.isNotEmpty()) {
val fontName = FileUtils.getName(config.textFont)
val file = FileUtils.createFileIfNotExist(
requireContext().externalFilesDir,
"font",
fontName
)
FileUtils.getFile(configDir, fontName).copyTo(file)
config.textFont = file.absolutePath
}
if (config.bgType() == 2) {
val bgName = FileUtils.getName(config.bgStr())
}
}.onSuccess {
toast("导入成功")
}.onError {
it.printStackTrace()
longToast("导入失败:${it.localizedMessage}")
} }
} }
override fun onFilePicked(requestCode: Int, currentPath: String) { override fun onFilePicked(requestCode: Int, currentPath: String) {
when (requestCode) { when (requestCode) {
requestCodeImport -> importConfig(Uri.parse(currentPath)) requestCodeImport -> importConfig(Uri.fromFile(File(currentPath)))
requestCodeExport -> exportConfig(Uri.parse(currentPath)) requestCodeExport -> exportConfig(Uri.fromFile(File(currentPath)))
} }
} }
@ -291,7 +318,7 @@ class BgTextConfigDialog : BaseDialogFragment(), FileChooserDialog.CallBack {
doc?.name?.let { doc?.name?.let {
var file = requireContext().getExternalFilesDir(null) var file = requireContext().getExternalFilesDir(null)
?: requireContext().filesDir ?: requireContext().filesDir
file = FileUtils.createFileIfNotExist(file, it, "bg") file = FileUtils.createFileIfNotExist(file, "bg", it)
kotlin.runCatching { kotlin.runCatching {
DocumentUtils.readBytes(requireContext(), doc.uri) DocumentUtils.readBytes(requireContext(), doc.uri)
}.getOrNull()?.let { byteArray -> }.getOrNull()?.let { byteArray ->

@ -186,7 +186,7 @@ class OtherConfigFragment : BasePreferenceFragment(),
val doc = DocumentFile.fromSingleUri(requireContext(), uri) val doc = DocumentFile.fromSingleUri(requireContext(), uri)
doc?.name?.let { doc?.name?.let {
var file = requireContext().externalFilesDir var file = requireContext().externalFilesDir
file = FileUtils.createFileIfNotExist(file, it, "covers") file = FileUtils.createFileIfNotExist(file, "covers", it)
kotlin.runCatching { kotlin.runCatching {
DocumentUtils.readBytes(requireContext(), doc.uri) DocumentUtils.readBytes(requireContext(), doc.uri)
}.getOrNull()?.let { byteArray -> }.getOrNull()?.let { byteArray ->
@ -207,7 +207,7 @@ class OtherConfigFragment : BasePreferenceFragment(),
val imgFile = File(path) val imgFile = File(path)
if (imgFile.exists()) { if (imgFile.exists()) {
var file = requireContext().externalFilesDir var file = requireContext().externalFilesDir
file = FileUtils.createFileIfNotExist(file, imgFile.name, "covers") file = FileUtils.createFileIfNotExist(file, "covers", imgFile.name)
file.writeBytes(imgFile.readBytes()) file.writeBytes(imgFile.readBytes())
putPrefString(PreferKey.defaultCover, file.absolutePath) putPrefString(PreferKey.defaultCover, file.absolutePath)
CoverImageView.upDefaultCover() CoverImageView.upDefaultCover()

@ -23,10 +23,7 @@ object RealPathUtil {
private var filePathUri: Uri? = null private var filePathUri: Uri? = null
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
fun getPath( fun getPath(context: Context, uri: Uri): String? {
context: Context,
uri: Uri
): String? {
//check here to KITKAT or new version //check here to KITKAT or new version
@SuppressLint("ObsoleteSdkInt") @SuppressLint("ObsoleteSdkInt")
val isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT val isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
@ -53,12 +50,16 @@ object RealPathUtil {
val split = docId.split(":").toTypedArray() val split = docId.split(":").toTypedArray()
val type = split[0] val type = split[0]
var contentUri: Uri? = null var contentUri: Uri? = null
if ("image" == type) { when (type) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI "image" -> {
} else if ("video" == type) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI }
} else if ("audio" == type) { "video" -> {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
}
"audio" -> {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
}
} }
val selection = "_id=?" val selection = "_id=?"
val selectionArgs = arrayOf( val selectionArgs = arrayOf(

Loading…
Cancel
Save