diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt index 20770cdb5..c16660612 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt @@ -27,14 +27,16 @@ import io.legado.app.lib.theme.bottomBackground import io.legado.app.lib.theme.getPrimaryTextColor import io.legado.app.lib.theme.getSecondaryTextColor import io.legado.app.ui.book.read.ReadBookActivityHelp +import io.legado.app.ui.filechooser.FileChooserDialog import io.legado.app.ui.filechooser.FilePicker import io.legado.app.utils.* import kotlinx.android.synthetic.main.dialog_read_bg_text.* import kotlinx.android.synthetic.main.item_bg_image.view.* import org.jetbrains.anko.sdk27.listeners.onCheckedChange import org.jetbrains.anko.sdk27.listeners.onClick +import java.io.File -class BgTextConfigDialog : BaseDialogFragment() { +class BgTextConfigDialog : BaseDialogFragment(), FileChooserDialog.CallBack { companion object { const val TEXT_COLOR = 121 @@ -192,8 +194,57 @@ class BgTextConfigDialog : BaseDialogFragment() { } } + @Suppress("BlockingMethodInNonBlockingContext") private fun exportConfig(uri: Uri) { + execute { + val configDirPath = FileUtils.getPath(requireContext().eCacheDir, "readConfig") + FileUtils.deleteFile(configDirPath) + val configDir = FileUtils.createFolderIfNotExist(configDirPath) + val configExportPath = FileUtils.getPath(configDir, "readConfig.json") + FileUtils.deleteFile(configExportPath) + val configExportFile = FileUtils.createFileIfNotExist(configExportPath) + configExportFile.writeText(GSON.toJson(ReadBookConfig.durConfig)) + val fontPath = ReadBookConfig.textFont + if (fontPath.isNotEmpty()) { + val fontName = FileUtils.getName(fontPath) + val fontBytes = Uri.parse(fontPath).readBytes(requireContext()) + fontBytes?.let { + val fontExportFile = FileUtils.createFileIfNotExist(configDir, fontName) + fontExportFile.writeBytes(it) + } + } + if (ReadBookConfig.durConfig.bgType() == 2) { + val bgName = FileUtils.getName(ReadBookConfig.durConfig.bgStr()) + val bgFile = File(ReadBookConfig.durConfig.bgStr()) + if (bgFile.exists()) { + val bgExportFile = FileUtils.createFileIfNotExist(configDir, bgName) + bgFile.copyTo(bgExportFile) + } + } + val configZipPath = FileUtils.getPath(requireContext().eCacheDir, "readConfig.zip") + if (ZipUtils.zipFile(configDirPath, configZipPath)) { + uri.writeBytes(requireContext(), File(configZipPath).readBytes()) + } + }.onSuccess { + toast("导出成功") + }.onError { + toast("导出失败:${it.localizedMessage}") + } + } + + private fun importConfig(uri: Uri) { + if (uri.toString().isContentPath()) { + + } else { + } + } + + override fun onFilePicked(requestCode: Int, currentPath: String) { + when (requestCode) { + requestCodeImport -> importConfig(Uri.parse(currentPath)) + requestCodeExport -> exportConfig(Uri.parse(currentPath)) + } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -204,6 +255,16 @@ class BgTextConfigDialog : BaseDialogFragment() { setBgFromUri(uri) } } + requestCodeImport -> if (resultCode == RESULT_OK) { + data?.data?.let { uri -> + importConfig(uri) + } + } + requestCodeExport -> if (resultCode == RESULT_OK) { + data?.data?.let { uri -> + exportConfig(uri) + } + } } } diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt index 29be62163..e291ac625 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt @@ -11,7 +11,7 @@ import io.legado.app.utils.FileUtils import io.legado.app.utils.GSON import io.legado.app.utils.splitNotBlank import io.legado.app.utils.writeText -import org.jetbrains.anko.toast +import org.jetbrains.anko.longToast import java.io.File class BookSourceViewModel(application: Application) : BaseViewModel(application) { @@ -144,9 +144,9 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) FileUtils.createFileIfNotExist(file, "exportBookSource.json") .writeText(json) }.onSuccess { - context.toast("成功导出至\n${file.absolutePath}") + context.longToast("成功导出至\n${file.absolutePath}") }.onError { - context.toast("导出失败\n${it.localizedMessage}") + context.longToast("导出失败\n${it.localizedMessage}") } } @@ -157,9 +157,9 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) doc.createFile("", "exportBookSource.json") ?.writeText(context, json) }.onSuccess { - context.toast("成功导出至\n${doc.uri.path}") + context.longToast("成功导出至\n${doc.uri.path}") }.onError { - context.toast("导出失败\n${it.localizedMessage}") + context.longToast("导出失败\n${it.localizedMessage}") } } diff --git a/app/src/main/java/io/legado/app/utils/ContextExtensions.kt b/app/src/main/java/io/legado/app/utils/ContextExtensions.kt index 1734997f2..0bb238a79 100644 --- a/app/src/main/java/io/legado/app/utils/ContextExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/ContextExtensions.kt @@ -1,4 +1,5 @@ @file:Suppress("unused") + package io.legado.app.utils import android.annotation.SuppressLint @@ -20,7 +21,6 @@ import androidx.core.content.edit import cn.bingoogolapple.qrcode.zxing.QRCodeEncoder import com.google.zxing.EncodeHintType import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel -import io.legado.app.App import io.legado.app.BuildConfig import io.legado.app.R import org.jetbrains.anko.defaultSharedPreferences @@ -83,24 +83,25 @@ val Context.sysScreenOffTime: Int get() { var screenOffTime = 0 try { - screenOffTime = Settings.System.getInt(contentResolver, Settings.System.SCREEN_OFF_TIMEOUT) + screenOffTime = + Settings.System.getInt(contentResolver, Settings.System.SCREEN_OFF_TIMEOUT) } catch (e: Exception) { e.printStackTrace() } return screenOffTime -} + } val Context.statusBarHeight: Int get() { val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android") return resources.getDimensionPixelSize(resourceId) -} + } val Context.navigationBarHeight: Int get() { val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android") return resources.getDimensionPixelSize(resourceId) -} + } @SuppressLint("SetWorldReadable") fun Context.shareWithQr(title: String, text: String) { @@ -162,7 +163,10 @@ val Context.sysBattery: Int } val Context.externalFilesDir: File - get() = App.INSTANCE.getExternalFilesDir(null) ?: App.INSTANCE.filesDir + get() = this.getExternalFilesDir(null) ?: this.filesDir + +val Context.eCacheDir: File + get() = this.externalCacheDir ?: this.cacheDir fun Context.openUrl(url: String) { openUrl(Uri.parse(url))