From c09a842fe1f10e0838a697f0625cc0d175a22e9a Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 22 Jul 2021 19:52:01 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E5=AF=BC=E5=85=A5txt=E5=B0=8F=E8=AF=B4=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/association/OnLineImportActivity.kt | 25 +++++++++------- .../ui/association/OnLineImportViewModel.kt | 29 ++++++++++++++++++- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt b/app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt index 45cc57de7..7e44b1251 100644 --- a/app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt +++ b/app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt @@ -3,15 +3,17 @@ package io.legado.app.ui.association import android.os.Bundle import androidx.activity.viewModels import io.legado.app.R -import io.legado.app.base.BaseActivity +import io.legado.app.base.VMBaseActivity import io.legado.app.constant.Theme import io.legado.app.databinding.ActivityTranslucenceBinding import io.legado.app.lib.dialogs.alert import io.legado.app.utils.viewbindingdelegate.viewBinding -class OnLineImportActivity : BaseActivity(theme = Theme.Transparent) { +class OnLineImportActivity : + VMBaseActivity(theme = Theme.Transparent) { override val binding by viewBinding(ActivityTranslucenceBinding::inflate) + override val viewModel by viewModels() override fun onActivityCreated(savedInstanceState: Bundle?) { intent.data?.let { @@ -24,6 +26,7 @@ class OnLineImportActivity : BaseActivity(theme = T "bookSource" -> importBookSource(url) "rssSource" -> importRssSource(url) "replaceRule" -> importReplaceRule(url) + "textTocRule" -> viewModel.importTextTocRule(url, this::finallyDialog) else -> { } } @@ -35,14 +38,14 @@ class OnLineImportActivity : BaseActivity(theme = T binding.rotateLoading.show() viewModel.errorLiveData.observe(this, { binding.rotateLoading.hide() - errorDialog(it) + finallyDialog(getString(R.string.error), it) }) viewModel.successLiveData.observe(this, { binding.rotateLoading.hide() if (it > 0) { ImportBookSourceDialog().show(supportFragmentManager, "bookSource") } else { - errorDialog(getString(R.string.wrong_format)) + finallyDialog(getString(R.string.error), getString(R.string.wrong_format)) } }) viewModel.importSource(url) @@ -53,14 +56,14 @@ class OnLineImportActivity : BaseActivity(theme = T binding.rotateLoading.show() viewModel.errorLiveData.observe(this, { binding.rotateLoading.hide() - errorDialog(it) + finallyDialog(getString(R.string.error), it) }) viewModel.successLiveData.observe(this, { binding.rotateLoading.hide() if (it > 0) { ImportRssSourceDialog().show(supportFragmentManager, "rssSource") } else { - errorDialog(getString(R.string.wrong_format)) + finallyDialog(getString(R.string.error), getString(R.string.wrong_format)) } }) viewModel.importSource(url) @@ -71,22 +74,22 @@ class OnLineImportActivity : BaseActivity(theme = T binding.rotateLoading.show() viewModel.errorLiveData.observe(this, { binding.rotateLoading.hide() - errorDialog(it) + finallyDialog(getString(R.string.error), it) }) viewModel.successLiveData.observe(this, { binding.rotateLoading.hide() if (it > 0) { ImportReplaceRuleDialog().show(supportFragmentManager, "replaceRule") } else { - errorDialog(getString(R.string.wrong_format)) + finallyDialog(getString(R.string.error), getString(R.string.wrong_format)) } }) viewModel.import(url) } - private fun errorDialog(msg: String) { - alert(getString(R.string.error), msg) { - okButton { } + private fun finallyDialog(title: String, msg: String) { + alert(title, msg) { + okButton() onDismiss { finish() } diff --git a/app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt b/app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt index 8dfba367e..c3eab090d 100644 --- a/app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt @@ -1,6 +1,33 @@ package io.legado.app.ui.association import io.legado.app.App +import io.legado.app.R import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb +import io.legado.app.data.entities.TxtTocRule +import io.legado.app.help.http.newCall +import io.legado.app.help.http.okHttpClient +import io.legado.app.help.http.text +import io.legado.app.utils.GSON +import io.legado.app.utils.fromJsonArray -class OnLineImportViewModel(app: App) : BaseViewModel(app) \ No newline at end of file +class OnLineImportViewModel(app: App) : BaseViewModel(app) { + + fun importTextTocRule(url: String, finally: (title: String, msg: String) -> Unit) { + execute { + okHttpClient.newCall { + url(url) + }.text("utf-8").let { json -> + GSON.fromJsonArray(json)?.let { + appDb.txtTocRuleDao.insert(*it.toTypedArray()) + } + } + }.onSuccess { + finally.invoke(context.getString(R.string.success), "导入Txt规则成功") + }.onError { + finally.invoke(context.getString(R.string.error), it.localizedMessage ?: "未知错误") + } + } + + +} \ No newline at end of file From bb0eb83e61e2514c61bd9a42f641b2fca546232a Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 22 Jul 2021 20:20:27 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/association/OnLineImportActivity.kt | 5 ++ .../ui/association/OnLineImportViewModel.kt | 23 ++++++- .../legado/app/ui/rss/read/ReadRssActivity.kt | 60 +++++++++---------- 3 files changed, 56 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt b/app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt index 7e44b1251..cd2104167 100644 --- a/app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt +++ b/app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt @@ -9,6 +9,9 @@ import io.legado.app.databinding.ActivityTranslucenceBinding import io.legado.app.lib.dialogs.alert import io.legado.app.utils.viewbindingdelegate.viewBinding +/** + * 网络一键导入 + */ class OnLineImportActivity : VMBaseActivity(theme = Theme.Transparent) { @@ -27,6 +30,8 @@ class OnLineImportActivity : "rssSource" -> importRssSource(url) "replaceRule" -> importReplaceRule(url) "textTocRule" -> viewModel.importTextTocRule(url, this::finallyDialog) + "httpTTS" -> viewModel.importHttpTTS(url, this::finallyDialog) + "theme" -> viewModel.importTheme(url, this::finallyDialog) else -> { } } diff --git a/app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt b/app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt index c3eab090d..2e07cb09a 100644 --- a/app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt @@ -4,6 +4,7 @@ import io.legado.app.App import io.legado.app.R import io.legado.app.base.BaseViewModel import io.legado.app.data.appDb +import io.legado.app.data.entities.HttpTTS import io.legado.app.data.entities.TxtTocRule import io.legado.app.help.http.newCall import io.legado.app.help.http.okHttpClient @@ -20,7 +21,7 @@ class OnLineImportViewModel(app: App) : BaseViewModel(app) { }.text("utf-8").let { json -> GSON.fromJsonArray(json)?.let { appDb.txtTocRuleDao.insert(*it.toTypedArray()) - } + } ?: throw Exception("格式不对") } }.onSuccess { finally.invoke(context.getString(R.string.success), "导入Txt规则成功") @@ -29,5 +30,25 @@ class OnLineImportViewModel(app: App) : BaseViewModel(app) { } } + fun importHttpTTS(url: String, finally: (title: String, msg: String) -> Unit) { + execute { + okHttpClient.newCall { + url(url) + }.text("utf-8").let { json -> + GSON.fromJsonArray(json)?.let { + appDb.httpTTSDao.insert(*it.toTypedArray()) + return@execute it.size + } ?: throw Exception("格式不对") + } + }.onSuccess { + finally.invoke(context.getString(R.string.success), "导入${it}朗读引擎") + }.onError { + finally.invoke(context.getString(R.string.error), it.localizedMessage ?: "未知错误") + } + } + + fun importTheme(url: String, finally: (title: String, msg: String) -> Unit) { + + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index 73bfd6e24..9884af35e 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -2,7 +2,6 @@ package io.legado.app.ui.rss.read import android.annotation.SuppressLint import android.app.DownloadManager -import android.content.Intent import android.content.pm.ActivityInfo import android.content.res.Configuration import android.net.Uri @@ -26,6 +25,7 @@ import io.legado.app.service.help.Download import io.legado.app.ui.association.ImportBookSourceActivity import io.legado.app.ui.association.ImportReplaceRuleActivity import io.legado.app.ui.association.ImportRssSourceActivity +import io.legado.app.ui.association.OnLineImportActivity import io.legado.app.ui.document.FilePicker import io.legado.app.ui.document.FilePickerParam import io.legado.app.utils.* @@ -332,41 +332,39 @@ class ReadRssActivity : VMBaseActivity } private fun shouldOverrideUrlLoading(url: Uri): Boolean { - if (url.scheme == "http" || url.scheme == "https") { - return false - } else if (url.scheme == "yuedu") { - when (url.host) { - "booksource" -> { - val intent = Intent( - this@ReadRssActivity, - ImportBookSourceActivity::class.java - ) - intent.data = url - startActivity(intent) + when (url.scheme) { + "http", "https" -> { + return false + } + "legado" -> { + when (url.host) { + "import" -> startActivity { + data = url + } } - "rsssource" -> { - val intent = Intent( - this@ReadRssActivity, - ImportRssSourceActivity::class.java - ) - intent.data = url - startActivity(intent) + return true + } + "yuedu" -> { + when (url.host) { + "booksource" -> startActivity { + data = url + } + "rsssource" -> startActivity { + data = url + } + "replace" -> startActivity { + data = url + } } - "replace" -> { - val intent = Intent( - this@ReadRssActivity, - ImportReplaceRuleActivity::class.java - ) - intent.data = url - startActivity(intent) + return true + } + else -> { + binding.root.longSnackbar("跳转其它应用", "确认") { + openUrl(url) } + return true } - return true - } - binding.root.longSnackbar("跳转其它应用", "确认") { - openUrl(url) } - return true } } From 2ea0c313274cf1e0ab7acadab53309adeecd09e9 Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 22 Jul 2021 20:46:17 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E4=B8=BB=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/help/ThemeConfig.kt | 2 +- .../ui/association/OnLineImportViewModel.kt | 50 ++++++++++++++++--- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/ThemeConfig.kt b/app/src/main/java/io/legado/app/help/ThemeConfig.kt index f0fdab71b..e7a88d40f 100644 --- a/app/src/main/java/io/legado/app/help/ThemeConfig.kt +++ b/app/src/main/java/io/legado/app/help/ThemeConfig.kt @@ -76,7 +76,7 @@ object ThemeConfig { return false } - private fun addConfig(newConfig: Config) { + fun addConfig(newConfig: Config) { configList.forEachIndexed { index, config -> if (newConfig.themeName == config.themeName) { configList[index] = newConfig diff --git a/app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt b/app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt index 2e07cb09a..7488a895b 100644 --- a/app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt @@ -6,11 +6,14 @@ import io.legado.app.base.BaseViewModel import io.legado.app.data.appDb import io.legado.app.data.entities.HttpTTS import io.legado.app.data.entities.TxtTocRule +import io.legado.app.help.ThemeConfig import io.legado.app.help.http.newCall import io.legado.app.help.http.okHttpClient import io.legado.app.help.http.text import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonArray +import io.legado.app.utils.fromJsonObject +import io.legado.app.utils.isJsonArray class OnLineImportViewModel(app: App) : BaseViewModel(app) { @@ -19,9 +22,15 @@ class OnLineImportViewModel(app: App) : BaseViewModel(app) { okHttpClient.newCall { url(url) }.text("utf-8").let { json -> - GSON.fromJsonArray(json)?.let { - appDb.txtTocRuleDao.insert(*it.toTypedArray()) - } ?: throw Exception("格式不对") + if (json.isJsonArray()) { + GSON.fromJsonArray(json)?.let { + appDb.txtTocRuleDao.insert(*it.toTypedArray()) + } ?: throw Exception("格式不对") + } else { + GSON.fromJsonObject(json)?.let { + appDb.txtTocRuleDao.insert(it) + } ?: throw Exception("格式不对") + } } }.onSuccess { finally.invoke(context.getString(R.string.success), "导入Txt规则成功") @@ -35,10 +44,17 @@ class OnLineImportViewModel(app: App) : BaseViewModel(app) { okHttpClient.newCall { url(url) }.text("utf-8").let { json -> - GSON.fromJsonArray(json)?.let { - appDb.httpTTSDao.insert(*it.toTypedArray()) - return@execute it.size - } ?: throw Exception("格式不对") + if (json.isJsonArray()) { + GSON.fromJsonArray(json)?.let { + appDb.httpTTSDao.insert(*it.toTypedArray()) + return@execute it.size + } ?: throw Exception("格式不对") + } else { + GSON.fromJsonObject(json)?.let { + appDb.httpTTSDao.insert(it) + return@execute 1 + } ?: throw Exception("格式不对") + } } }.onSuccess { finally.invoke(context.getString(R.string.success), "导入${it}朗读引擎") @@ -48,7 +64,25 @@ class OnLineImportViewModel(app: App) : BaseViewModel(app) { } fun importTheme(url: String, finally: (title: String, msg: String) -> Unit) { - + execute { + okHttpClient.newCall { + url(url) + }.text("utf-8").let { json -> + if (json.isJsonArray()) { + GSON.fromJsonArray(json)?.forEach { + ThemeConfig.addConfig(it) + } ?: throw Exception("格式不对") + } else { + GSON.fromJsonObject(json)?.let { + ThemeConfig.addConfig(it) + } ?: throw Exception("格式不对") + } + } + }.onSuccess { + finally.invoke(context.getString(R.string.success), "导入主题成功") + }.onError { + finally.invoke(context.getString(R.string.error), it.localizedMessage ?: "未知错误") + } } } \ No newline at end of file From e46cb97808add80e15e2ab1b1126fdfc75903f2c Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 22 Jul 2021 20:47:47 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/association/OnLineImportActivity.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt b/app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt index cd2104167..389b5b7ab 100644 --- a/app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt +++ b/app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt @@ -11,6 +11,7 @@ import io.legado.app.utils.viewbindingdelegate.viewBinding /** * 网络一键导入 + * 格式: legado://import/{path}?src={url} */ class OnLineImportActivity : VMBaseActivity(theme = Theme.Transparent) { From 5453c15049822f40e288c409d834d834e8d63e58 Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 22 Jul 2021 22:34:27 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=92=E7=89=88?= =?UTF-8?q?=E4=B8=80=E9=94=AE=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 17 +++--- .../java/io/legado/app/help/JsExtensions.kt | 1 - .../java/io/legado/app/help/ReadBookConfig.kt | 59 +++++++++++++++++++ .../ui/association/OnLineImportActivity.kt | 1 + .../ui/association/OnLineImportViewModel.kt | 23 ++++++++ .../ui/book/read/config/BgTextConfigDialog.kt | 59 ++----------------- 6 files changed, 99 insertions(+), 61 deletions(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 46aa445f1..05d94e9f2 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -8,13 +8,16 @@ * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则出现问题。先关闭替换净化并刷新,再观察是否正常。如果正常说明净化规则存在误杀,如果关闭后仍然出现相关问题,请点击源链接查看原文与正文是否相同,如果不同,再进行反馈。 * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! -**2021/07/21** -* 非关键规则添加try防止报错中断解析 -* 添加获取封面的api -* 获取正文api使用替换规则 -* 添加一个ronet版本,网络访问使用Chromium内核 -* web书架增加【最近一次更新书籍信息的时间】 -* 采用Flow替换LiveData,优化资源使用 +**2021/07/22** +1. 非关键规则添加try防止报错中断解析 +2. 添加获取封面的api +3. 获取正文api使用替换规则 +4. 添加一个ronet版本,网络访问使用Chromium内核 +5. web书架增加【最近一次更新书籍信息的时间】 +6. 采用Flow替换LiveData,优化资源使用 +7. 统一网络一键导入路径legado://import/{path}?src={url} +* path: bookSource,rssSource,replaceRule,textTocRule,httpTTS,theme,readConfig +* 添加了txt小说规则,在线朗读引擎,主题,排版 的一键导入支持,老url依然可用 **2021/07/16** 1. js扩展函数添加删除本地文件方法 diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index 60580566f..edf8ae55b 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -346,7 +346,6 @@ interface JsExtensions { } val bos = ByteArrayOutputStream() val zis = ZipInputStream(ByteArrayInputStream(bytes)) - var entry: ZipEntry? = zis.nextEntry while (entry != null) { if (entry.name.equals(path)) { diff --git a/app/src/main/java/io/legado/app/help/ReadBookConfig.kt b/app/src/main/java/io/legado/app/help/ReadBookConfig.kt index b024838f3..d76027909 100644 --- a/app/src/main/java/io/legado/app/help/ReadBookConfig.kt +++ b/app/src/main/java/io/legado/app/help/ReadBookConfig.kt @@ -10,6 +10,8 @@ import io.legado.app.constant.PreferKey import io.legado.app.help.coroutine.Coroutine import io.legado.app.ui.book.read.page.provider.ChapterProvider import io.legado.app.utils.* +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.withContext import splitties.init.appCtx import java.io.File @@ -355,6 +357,63 @@ object ReadBookConfig { return exportConfig } + suspend fun import(byteArray: ByteArray): Config { + return withContext(IO) { + val configZipPath = FileUtils.getPath(appCtx.externalCache, configFileName) + FileUtils.deleteFile(configZipPath) + val zipFile = FileUtils.createFileIfNotExist(configZipPath) + zipFile.writeBytes(byteArray) + val configDirPath = FileUtils.getPath(appCtx.externalCache, "readConfig") + FileUtils.deleteFile(configDirPath) + @Suppress("BlockingMethodInNonBlockingContext") + ZipUtils.unzipFile(zipFile, FileUtils.createFolderIfNotExist(configDirPath)) + val configDir = FileUtils.createFolderIfNotExist(configDirPath) + val configFile = FileUtils.getFile(configDir, "readConfig.json") + val config: Config = GSON.fromJsonObject(configFile.readText())!! + if (config.textFont.isNotEmpty()) { + val fontName = FileUtils.getName(config.textFont) + val fontPath = + FileUtils.getPath(appCtx.externalFiles, "font", fontName) + if (!FileUtils.exist(fontPath)) { + FileUtils.getFile(configDir, fontName).copyTo(File(fontPath)) + } + config.textFont = fontPath + } + if (config.bgType == 2) { + val bgName = FileUtils.getName(config.bgStr) + val bgPath = FileUtils.getPath(appCtx.externalFiles, "bg", bgName) + if (!FileUtils.exist(bgPath)) { + val bgFile = FileUtils.getFile(configDir, bgName) + if (bgFile.exists()) { + bgFile.copyTo(File(bgPath)) + } + } + } + if (config.bgTypeNight == 2) { + val bgName = FileUtils.getName(config.bgStrNight) + val bgPath = FileUtils.getPath(appCtx.externalFiles, "bg", bgName) + if (!FileUtils.exist(bgPath)) { + val bgFile = FileUtils.getFile(configDir, bgName) + if (bgFile.exists()) { + bgFile.copyTo(File(bgPath)) + } + } + } + if (config.bgTypeEInk == 2) { + val bgName = FileUtils.getName(config.bgStrEInk) + @Suppress("BlockingMethodInNonBlockingContext") val bgPath = + FileUtils.getPath(appCtx.externalFiles, "bg", bgName) + if (!FileUtils.exist(bgPath)) { + val bgFile = FileUtils.getFile(configDir, bgName) + if (bgFile.exists()) { + bgFile.copyTo(File(bgPath)) + } + } + } + return@withContext config + } + } + @Keep class Config( var name: String = "", diff --git a/app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt b/app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt index 389b5b7ab..6973a844b 100644 --- a/app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt +++ b/app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt @@ -33,6 +33,7 @@ class OnLineImportActivity : "textTocRule" -> viewModel.importTextTocRule(url, this::finallyDialog) "httpTTS" -> viewModel.importHttpTTS(url, this::finallyDialog) "theme" -> viewModel.importTheme(url, this::finallyDialog) + "readConfig" -> viewModel.importReadConfig(url, this::finallyDialog) else -> { } } diff --git a/app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt b/app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt index 7488a895b..2526d32b9 100644 --- a/app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt @@ -6,6 +6,7 @@ import io.legado.app.base.BaseViewModel import io.legado.app.data.appDb import io.legado.app.data.entities.HttpTTS import io.legado.app.data.entities.TxtTocRule +import io.legado.app.help.ReadBookConfig import io.legado.app.help.ThemeConfig import io.legado.app.help.http.newCall import io.legado.app.help.http.okHttpClient @@ -85,4 +86,26 @@ class OnLineImportViewModel(app: App) : BaseViewModel(app) { } } + fun importReadConfig(url: String, finally: (title: String, msg: String) -> Unit) { + execute { + @Suppress("BlockingMethodInNonBlockingContext") + val bytes = okHttpClient.newCall { + url(url) + }.bytes() + val config = ReadBookConfig.import(bytes) + ReadBookConfig.configList.forEachIndexed { index, c -> + if (c.name == config.name) { + ReadBookConfig.configList[index] = config + return@execute config.name + } + ReadBookConfig.configList.add(config) + return@execute config.name + } + }.onSuccess { + finally.invoke(context.getString(R.string.success), "导入排版成功") + }.onError { + finally.invoke(context.getString(R.string.error), it.localizedMessage ?: "未知错误") + } + } + } \ No newline at end of file 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 3837b6c22..5175f6610 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 @@ -308,6 +308,7 @@ class BgTextConfigDialog : BaseDialogFragment() { private fun importNetConfig(url: String) { execute { + @Suppress("BlockingMethodInNonBlockingContext") okHttpClient.newCall { url(url) }.bytes().let { @@ -318,9 +319,9 @@ class BgTextConfigDialog : BaseDialogFragment() { } } - @Suppress("BlockingMethodInNonBlockingContext") private fun importConfig(uri: Uri) { execute { + @Suppress("BlockingMethodInNonBlockingContext") importConfig(uri.readBytes(requireContext())!!) }.onError { it.printStackTrace() @@ -328,61 +329,13 @@ class BgTextConfigDialog : BaseDialogFragment() { } } - @Suppress("BlockingMethodInNonBlockingContext") + @Suppress("BlockingMethodInNonBlockingContext", "BlockingMethodInNonBlockingContext") private fun importConfig(byteArray: ByteArray) { execute { - val configZipPath = FileUtils.getPath(requireContext().externalCache, configFileName) - FileUtils.deleteFile(configZipPath) - val zipFile = FileUtils.createFileIfNotExist(configZipPath) - zipFile.writeBytes(byteArray) - val configDirPath = FileUtils.getPath(requireContext().externalCache, "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 fontPath = - FileUtils.getPath(requireContext().externalFiles, "font", fontName) - if (!FileUtils.exist(fontPath)) { - FileUtils.getFile(configDir, fontName).copyTo(File(fontPath)) - } - config.textFont = fontPath - } - if (config.bgType == 2) { - val bgName = FileUtils.getName(config.bgStr) - val bgPath = FileUtils.getPath(requireContext().externalFiles, "bg", bgName) - if (!FileUtils.exist(bgPath)) { - val bgFile = FileUtils.getFile(configDir, bgName) - if (bgFile.exists()) { - bgFile.copyTo(File(bgPath)) - } - } - } - if (config.bgTypeNight == 2) { - val bgName = FileUtils.getName(config.bgStrNight) - val bgPath = FileUtils.getPath(requireContext().externalFiles, "bg", bgName) - if (!FileUtils.exist(bgPath)) { - val bgFile = FileUtils.getFile(configDir, bgName) - if (bgFile.exists()) { - bgFile.copyTo(File(bgPath)) - } - } - } - if (config.bgTypeEInk == 2) { - val bgName = FileUtils.getName(config.bgStrEInk) - val bgPath = FileUtils.getPath(requireContext().externalFiles, "bg", bgName) - if (!FileUtils.exist(bgPath)) { - val bgFile = FileUtils.getFile(configDir, bgName) - if (bgFile.exists()) { - bgFile.copyTo(File(bgPath)) - } - } - } - ReadBookConfig.durConfig = config - postEvent(EventBus.UP_CONFIG, true) + ReadBookConfig.import(byteArray) }.onSuccess { + ReadBookConfig.durConfig = it + postEvent(EventBus.UP_CONFIG, true) toastOnUi("导入成功") }.onError { it.printStackTrace() From ee2dff25936fc12afa32338ce1825e69dfdcc6cf Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 22 Jul 2021 23:15:13 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 33 ++----------------- .../ui/association/OnLineImportActivity.kt | 24 +++++++++----- .../legado/app/ui/rss/read/ReadRssActivity.kt | 25 ++------------ 3 files changed, 22 insertions(+), 60 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fea75c6a4..2da0a69a1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -341,9 +341,9 @@ - + + + @@ -351,48 +351,21 @@ android:name=".ui.association.ImportBookSourceActivity" android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout" android:theme="@style/AppTheme.Transparent"> - - - - - - - - - - - - - - - - - - - - - importBookSource(url) - "rssSource" -> importRssSource(url) - "replaceRule" -> importReplaceRule(url) - "textTocRule" -> viewModel.importTextTocRule(url, this::finallyDialog) - "httpTTS" -> viewModel.importHttpTTS(url, this::finallyDialog) - "theme" -> viewModel.importTheme(url, this::finallyDialog) - "readConfig" -> viewModel.importReadConfig(url, this::finallyDialog) - else -> { + "/bookSource" -> importBookSource(url) + "/rssSource" -> importRssSource(url) + "/replaceRule" -> importReplaceRule(url) + "/textTocRule" -> viewModel.importTextTocRule(url, this::finallyDialog) + "/httpTTS" -> viewModel.importHttpTTS(url, this::finallyDialog) + "/theme" -> viewModel.importTheme(url, this::finallyDialog) + "/readConfig" -> viewModel.importReadConfig(url, this::finallyDialog) + "/importonline" -> when (it.host) { + "booksource" -> importBookSource(url) + "rsssource" -> importRssSource(url) + "replace" -> importReplaceRule(url) + else -> { + toastOnUi("url error") + finish() + } } } } diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index 9884af35e..ecadd4519 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -22,9 +22,6 @@ import io.legado.app.help.AppConfig import io.legado.app.lib.theme.DrawableUtils import io.legado.app.lib.theme.primaryTextColor import io.legado.app.service.help.Download -import io.legado.app.ui.association.ImportBookSourceActivity -import io.legado.app.ui.association.ImportReplaceRuleActivity -import io.legado.app.ui.association.ImportRssSourceActivity import io.legado.app.ui.association.OnLineImportActivity import io.legado.app.ui.document.FilePicker import io.legado.app.ui.document.FilePickerParam @@ -336,25 +333,9 @@ class ReadRssActivity : VMBaseActivity "http", "https" -> { return false } - "legado" -> { - when (url.host) { - "import" -> startActivity { - data = url - } - } - return true - } - "yuedu" -> { - when (url.host) { - "booksource" -> startActivity { - data = url - } - "rsssource" -> startActivity { - data = url - } - "replace" -> startActivity { - data = url - } + "legado", "yuedu" -> { + startActivity { + data = url } return true } From 95638ab95cdbc2d157d377edf78f9894f9320482 Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 22 Jul 2021 23:28:15 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 12 +++--------- .../ui/association/ImportBookSourceActivity.kt | 15 +-------------- .../ui/association/ImportReplaceRuleActivity.kt | 14 +------------- .../app/ui/association/ImportRssSourceActivity.kt | 15 +-------------- 4 files changed, 6 insertions(+), 50 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2da0a69a1..5edd914e6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -350,23 +350,17 @@ - - + android:theme="@style/AppTheme.Transparent" /> - - + android:theme="@style/AppTheme.Transparent" /> - - + android:theme="@style/AppTheme.Transparent" /> it.getQueryParameter("src")?.let { url -> - viewModel.importSource(url) - } - else -> { - binding.rotateLoading.hide() - toastOnUi(R.string.wrong_format) - finish() - } - } - } ?: finish() + finish() } private fun errorDialog(msg: String) { diff --git a/app/src/main/java/io/legado/app/ui/association/ImportReplaceRuleActivity.kt b/app/src/main/java/io/legado/app/ui/association/ImportReplaceRuleActivity.kt index d01b49f26..a202a03e9 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportReplaceRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportReplaceRuleActivity.kt @@ -7,7 +7,6 @@ import io.legado.app.constant.Theme import io.legado.app.databinding.ActivityTranslucenceBinding import io.legado.app.help.IntentDataHelp import io.legado.app.lib.dialogs.alert -import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding class ImportReplaceRuleActivity : @@ -46,18 +45,7 @@ class ImportReplaceRuleActivity : viewModel.import(it) return } - intent.data?.let { - when (it.path) { - "/importonline" -> it.getQueryParameter("src")?.let { url -> - viewModel.import(url) - } - else -> { - binding.rotateLoading.hide() - toastOnUi("格式不对") - finish() - } - } - } ?: finish() + finish() } private fun errorDialog(msg: String) { diff --git a/app/src/main/java/io/legado/app/ui/association/ImportRssSourceActivity.kt b/app/src/main/java/io/legado/app/ui/association/ImportRssSourceActivity.kt index 7a2cfe9d9..a7a82a2cb 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportRssSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportRssSourceActivity.kt @@ -8,8 +8,6 @@ import io.legado.app.constant.Theme import io.legado.app.databinding.ActivityTranslucenceBinding import io.legado.app.help.IntentDataHelp import io.legado.app.lib.dialogs.alert - -import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding class ImportRssSourceActivity : @@ -48,18 +46,7 @@ class ImportRssSourceActivity : viewModel.importSource(it) return } - intent.data?.let { - when (it.path) { - "/importonline" -> it.getQueryParameter("src")?.let { url -> - viewModel.importSource(url) - } - else -> { - binding.rotateLoading.hide() - toastOnUi(R.string.wrong_format) - finish() - } - } - } ?: finish() + finish() } private fun errorDialog(msg: String) { From a50f80d874fb6025db77cf0ac4afe65d9b01de04 Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 22 Jul 2021 23:31:14 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5edd914e6..522dd2c43 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -319,16 +319,6 @@ - - - - - - - - - From 6642ded3f920d8f1a0810ba7f4e324f1e9fa0495 Mon Sep 17 00:00:00 2001 From: gedoor Date: Thu, 22 Jul 2021 23:37:28 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e63456b42..843400d98 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,10 @@ Google Play or CoolApk or [Releases](https://github.com/gedoor/legado/releases/latest) ## 阅读API -阅读3.0 提供了2种方式的API:`Web方式`和`Content Provider方式`。您可以在[这里](api.md)根据需要自行调用。 +* 阅读3.0 提供了2种方式的API:`Web方式`和`Content Provider方式`。您可以在[这里](api.md)根据需要自行调用。 +* 可通过url唤起阅读进行一键导入,url格式: legado://import/{path}?src={url} +* path类型: bookSource,rssSource,replaceRule,textTocRule,httpTTS,theme,readConfig +* path类型解释: 书源,订阅源,替换规则,本地txt小说目录规则,在线朗读引擎,主题,阅读排版 ## 感谢 ```