Merge branch 'gedoor:master' into master

pull/1155/head
bushixuanqi 4 years ago committed by GitHub
commit 2eeba49b3d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 5
      README.md
  2. 54
      app/src/main/AndroidManifest.xml
  3. 17
      app/src/main/assets/updateLog.md
  4. 1
      app/src/main/java/io/legado/app/help/JsExtensions.kt
  5. 59
      app/src/main/java/io/legado/app/help/ReadBookConfig.kt
  6. 2
      app/src/main/java/io/legado/app/help/ThemeConfig.kt
  7. 15
      app/src/main/java/io/legado/app/ui/association/ImportBookSourceActivity.kt
  8. 14
      app/src/main/java/io/legado/app/ui/association/ImportReplaceRuleActivity.kt
  9. 15
      app/src/main/java/io/legado/app/ui/association/ImportRssSourceActivity.kt
  10. 48
      app/src/main/java/io/legado/app/ui/association/OnLineImportActivity.kt
  11. 107
      app/src/main/java/io/legado/app/ui/association/OnLineImportViewModel.kt
  12. 59
      app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt
  13. 49
      app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt

@ -21,7 +21,10 @@
<a href="https://play.google.com/store/apps/details?id=io.legado.play.release"><img width="200px" alt="Google Play" src="https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png"/></a> or <a href="https://www.coolapk.com/apk/io.legado.app.release"><img width="100px" height="100px" alt="CoolApk" src="https://github.com/Celeter/build/raw/master/.github/scripts/coolapk.png"/></a> or [Releases](https://github.com/gedoor/legado/releases/latest) <a href="https://play.google.com/store/apps/details?id=io.legado.play.release"><img width="200px" alt="Google Play" src="https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png"/></a> or <a href="https://www.coolapk.com/apk/io.legado.app.release"><img width="100px" height="100px" alt="CoolApk" src="https://github.com/Celeter/build/raw/master/.github/scripts/coolapk.png"/></a> or [Releases](https://github.com/gedoor/legado/releases/latest)
## 阅读API ## 阅读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小说目录规则,在线朗读引擎,主题,阅读排版
## 感谢 ## 感谢
``` ```

@ -319,16 +319,6 @@
<data android:mimeType="text/plain" /> <data android:mimeType="text/plain" />
</intent-filter> </intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="import"
android:scheme="legado" />
</intent-filter>
</activity> </activity>
<!-- 一键导入 --> <!-- 一键导入 -->
<activity <activity
@ -341,59 +331,25 @@
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
<data <data android:scheme="legado" />
android:host="import" <data android:scheme="yuedu" />
android:scheme="legado" />
</intent-filter> </intent-filter>
</activity> </activity>
<!-- 导入书源 --> <!-- 导入书源 -->
<activity <activity
android:name=".ui.association.ImportBookSourceActivity" android:name=".ui.association.ImportBookSourceActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout" android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:theme="@style/AppTheme.Transparent"> android:theme="@style/AppTheme.Transparent" />
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="booksource"
android:scheme="yuedu" />
</intent-filter>
</activity>
<!-- 导入订阅源 --> <!-- 导入订阅源 -->
<activity <activity
android:name=".ui.association.ImportRssSourceActivity" android:name=".ui.association.ImportRssSourceActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout" android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:theme="@style/AppTheme.Transparent"> android:theme="@style/AppTheme.Transparent" />
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="rsssource"
android:scheme="yuedu" />
</intent-filter>
</activity>
<!-- 导入替换规则 --> <!-- 导入替换规则 -->
<activity <activity
android:name=".ui.association.ImportReplaceRuleActivity" android:name=".ui.association.ImportReplaceRuleActivity"
android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout" android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
android:theme="@style/AppTheme.Transparent"> android:theme="@style/AppTheme.Transparent" />
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="replace"
android:scheme="yuedu" />
</intent-filter>
</activity>
<!-- 打开文件 --> <!-- 打开文件 -->
<activity <activity
android:name=".ui.association.FileAssociationActivity" android:name=".ui.association.FileAssociationActivity"

@ -8,13 +8,16 @@
* 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则出现问题。先关闭替换净化并刷新,再观察是否正常。如果正常说明净化规则存在误杀,如果关闭后仍然出现相关问题,请点击源链接查看原文与正文是否相同,如果不同,再进行反馈。 * 正文出现缺字漏字、内容缺失、排版错乱等情况,有可能是净化规则出现问题。先关闭替换净化并刷新,再观察是否正常。如果正常说明净化规则存在误杀,如果关闭后仍然出现相关问题,请点击源链接查看原文与正文是否相同,如果不同,再进行反馈。
* 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源!
**2021/07/21** **2021/07/22**
* 非关键规则添加try防止报错中断解析 1. 非关键规则添加try防止报错中断解析
* 添加获取封面的api 2. 添加获取封面的api
* 获取正文api使用替换规则 3. 获取正文api使用替换规则
* 添加一个ronet版本,网络访问使用Chromium内核 4. 添加一个ronet版本,网络访问使用Chromium内核
* web书架增加【最近一次更新书籍信息的时间】 5. web书架增加【最近一次更新书籍信息的时间】
* 采用Flow替换LiveData,优化资源使用 6. 采用Flow替换LiveData,优化资源使用
7. 统一网络一键导入路径legado://import/{path}?src={url}
* path: bookSource,rssSource,replaceRule,textTocRule,httpTTS,theme,readConfig
* 添加了txt小说规则,在线朗读引擎,主题,排版 的一键导入支持,老url依然可用
**2021/07/16** **2021/07/16**
1. js扩展函数添加删除本地文件方法 1. js扩展函数添加删除本地文件方法

@ -346,7 +346,6 @@ interface JsExtensions {
} }
val bos = ByteArrayOutputStream() val bos = ByteArrayOutputStream()
val zis = ZipInputStream(ByteArrayInputStream(bytes)) val zis = ZipInputStream(ByteArrayInputStream(bytes))
var entry: ZipEntry? = zis.nextEntry var entry: ZipEntry? = zis.nextEntry
while (entry != null) { while (entry != null) {
if (entry.name.equals(path)) { if (entry.name.equals(path)) {

@ -10,6 +10,8 @@ import io.legado.app.constant.PreferKey
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.ui.book.read.page.provider.ChapterProvider import io.legado.app.ui.book.read.page.provider.ChapterProvider
import io.legado.app.utils.* import io.legado.app.utils.*
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.withContext
import splitties.init.appCtx import splitties.init.appCtx
import java.io.File import java.io.File
@ -355,6 +357,63 @@ object ReadBookConfig {
return exportConfig 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 @Keep
class Config( class Config(
var name: String = "", var name: String = "",

@ -76,7 +76,7 @@ object ThemeConfig {
return false return false
} }
private fun addConfig(newConfig: Config) { fun addConfig(newConfig: Config) {
configList.forEachIndexed { index, config -> configList.forEachIndexed { index, config ->
if (newConfig.themeName == config.themeName) { if (newConfig.themeName == config.themeName) {
configList[index] = newConfig configList[index] = newConfig

@ -8,8 +8,6 @@ import io.legado.app.constant.Theme
import io.legado.app.databinding.ActivityTranslucenceBinding import io.legado.app.databinding.ActivityTranslucenceBinding
import io.legado.app.help.IntentDataHelp import io.legado.app.help.IntentDataHelp
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.utils.toastOnUi
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
@ -49,18 +47,7 @@ class ImportBookSourceActivity :
viewModel.importSource(it) viewModel.importSource(it)
return return
} }
intent.data?.let { finish()
when (it.path) {
"/importonline" -> it.getQueryParameter("src")?.let { url ->
viewModel.importSource(url)
}
else -> {
binding.rotateLoading.hide()
toastOnUi(R.string.wrong_format)
finish()
}
}
} ?: finish()
} }
private fun errorDialog(msg: String) { private fun errorDialog(msg: String) {

@ -7,7 +7,6 @@ import io.legado.app.constant.Theme
import io.legado.app.databinding.ActivityTranslucenceBinding import io.legado.app.databinding.ActivityTranslucenceBinding
import io.legado.app.help.IntentDataHelp import io.legado.app.help.IntentDataHelp
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.utils.toastOnUi
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
class ImportReplaceRuleActivity : class ImportReplaceRuleActivity :
@ -46,18 +45,7 @@ class ImportReplaceRuleActivity :
viewModel.import(it) viewModel.import(it)
return return
} }
intent.data?.let { finish()
when (it.path) {
"/importonline" -> it.getQueryParameter("src")?.let { url ->
viewModel.import(url)
}
else -> {
binding.rotateLoading.hide()
toastOnUi("格式不对")
finish()
}
}
} ?: finish()
} }
private fun errorDialog(msg: String) { private fun errorDialog(msg: String) {

@ -8,8 +8,6 @@ import io.legado.app.constant.Theme
import io.legado.app.databinding.ActivityTranslucenceBinding import io.legado.app.databinding.ActivityTranslucenceBinding
import io.legado.app.help.IntentDataHelp import io.legado.app.help.IntentDataHelp
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.utils.toastOnUi
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
class ImportRssSourceActivity : class ImportRssSourceActivity :
@ -48,18 +46,7 @@ class ImportRssSourceActivity :
viewModel.importSource(it) viewModel.importSource(it)
return return
} }
intent.data?.let { finish()
when (it.path) {
"/importonline" -> it.getQueryParameter("src")?.let { url ->
viewModel.importSource(url)
}
else -> {
binding.rotateLoading.hide()
toastOnUi(R.string.wrong_format)
finish()
}
}
} ?: finish()
} }
private fun errorDialog(msg: String) { private fun errorDialog(msg: String) {

@ -3,15 +3,22 @@ package io.legado.app.ui.association
import android.os.Bundle import android.os.Bundle
import androidx.activity.viewModels import androidx.activity.viewModels
import io.legado.app.R 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.constant.Theme
import io.legado.app.databinding.ActivityTranslucenceBinding import io.legado.app.databinding.ActivityTranslucenceBinding
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.utils.toastOnUi
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
class OnLineImportActivity : BaseActivity<ActivityTranslucenceBinding>(theme = Theme.Transparent) { /**
* 网络一键导入
* 格式: legado://import/{path}?src={url}
*/
class OnLineImportActivity :
VMBaseActivity<ActivityTranslucenceBinding, OnLineImportViewModel>(theme = Theme.Transparent) {
override val binding by viewBinding(ActivityTranslucenceBinding::inflate) override val binding by viewBinding(ActivityTranslucenceBinding::inflate)
override val viewModel by viewModels<OnLineImportViewModel>()
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onActivityCreated(savedInstanceState: Bundle?) {
intent.data?.let { intent.data?.let {
@ -21,10 +28,21 @@ class OnLineImportActivity : BaseActivity<ActivityTranslucenceBinding>(theme = T
return return
} }
when (it.path) { when (it.path) {
"bookSource" -> importBookSource(url) "/bookSource" -> importBookSource(url)
"rssSource" -> importRssSource(url) "/rssSource" -> importRssSource(url)
"replaceRule" -> importReplaceRule(url) "/replaceRule" -> importReplaceRule(url)
else -> { "/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()
}
} }
} }
} }
@ -35,14 +53,14 @@ class OnLineImportActivity : BaseActivity<ActivityTranslucenceBinding>(theme = T
binding.rotateLoading.show() binding.rotateLoading.show()
viewModel.errorLiveData.observe(this, { viewModel.errorLiveData.observe(this, {
binding.rotateLoading.hide() binding.rotateLoading.hide()
errorDialog(it) finallyDialog(getString(R.string.error), it)
}) })
viewModel.successLiveData.observe(this, { viewModel.successLiveData.observe(this, {
binding.rotateLoading.hide() binding.rotateLoading.hide()
if (it > 0) { if (it > 0) {
ImportBookSourceDialog().show(supportFragmentManager, "bookSource") ImportBookSourceDialog().show(supportFragmentManager, "bookSource")
} else { } else {
errorDialog(getString(R.string.wrong_format)) finallyDialog(getString(R.string.error), getString(R.string.wrong_format))
} }
}) })
viewModel.importSource(url) viewModel.importSource(url)
@ -53,14 +71,14 @@ class OnLineImportActivity : BaseActivity<ActivityTranslucenceBinding>(theme = T
binding.rotateLoading.show() binding.rotateLoading.show()
viewModel.errorLiveData.observe(this, { viewModel.errorLiveData.observe(this, {
binding.rotateLoading.hide() binding.rotateLoading.hide()
errorDialog(it) finallyDialog(getString(R.string.error), it)
}) })
viewModel.successLiveData.observe(this, { viewModel.successLiveData.observe(this, {
binding.rotateLoading.hide() binding.rotateLoading.hide()
if (it > 0) { if (it > 0) {
ImportRssSourceDialog().show(supportFragmentManager, "rssSource") ImportRssSourceDialog().show(supportFragmentManager, "rssSource")
} else { } else {
errorDialog(getString(R.string.wrong_format)) finallyDialog(getString(R.string.error), getString(R.string.wrong_format))
} }
}) })
viewModel.importSource(url) viewModel.importSource(url)
@ -71,22 +89,22 @@ class OnLineImportActivity : BaseActivity<ActivityTranslucenceBinding>(theme = T
binding.rotateLoading.show() binding.rotateLoading.show()
viewModel.errorLiveData.observe(this, { viewModel.errorLiveData.observe(this, {
binding.rotateLoading.hide() binding.rotateLoading.hide()
errorDialog(it) finallyDialog(getString(R.string.error), it)
}) })
viewModel.successLiveData.observe(this, { viewModel.successLiveData.observe(this, {
binding.rotateLoading.hide() binding.rotateLoading.hide()
if (it > 0) { if (it > 0) {
ImportReplaceRuleDialog().show(supportFragmentManager, "replaceRule") ImportReplaceRuleDialog().show(supportFragmentManager, "replaceRule")
} else { } else {
errorDialog(getString(R.string.wrong_format)) finallyDialog(getString(R.string.error), getString(R.string.wrong_format))
} }
}) })
viewModel.import(url) viewModel.import(url)
} }
private fun errorDialog(msg: String) { private fun finallyDialog(title: String, msg: String) {
alert(getString(R.string.error), msg) { alert(title, msg) {
okButton { } okButton()
onDismiss { onDismiss {
finish() finish()
} }

@ -1,6 +1,111 @@
package io.legado.app.ui.association package io.legado.app.ui.association
import io.legado.app.App import io.legado.app.App
import io.legado.app.R
import io.legado.app.base.BaseViewModel 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
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) 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 ->
if (json.isJsonArray()) {
GSON.fromJsonArray<TxtTocRule>(json)?.let {
appDb.txtTocRuleDao.insert(*it.toTypedArray())
} ?: throw Exception("格式不对")
} else {
GSON.fromJsonObject<TxtTocRule>(json)?.let {
appDb.txtTocRuleDao.insert(it)
} ?: throw Exception("格式不对")
}
}
}.onSuccess {
finally.invoke(context.getString(R.string.success), "导入Txt规则成功")
}.onError {
finally.invoke(context.getString(R.string.error), it.localizedMessage ?: "未知错误")
}
}
fun importHttpTTS(url: String, finally: (title: String, msg: String) -> Unit) {
execute {
okHttpClient.newCall {
url(url)
}.text("utf-8").let { json ->
if (json.isJsonArray()) {
GSON.fromJsonArray<HttpTTS>(json)?.let {
appDb.httpTTSDao.insert(*it.toTypedArray())
return@execute it.size
} ?: throw Exception("格式不对")
} else {
GSON.fromJsonObject<HttpTTS>(json)?.let {
appDb.httpTTSDao.insert(it)
return@execute 1
} ?: 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) {
execute {
okHttpClient.newCall {
url(url)
}.text("utf-8").let { json ->
if (json.isJsonArray()) {
GSON.fromJsonArray<ThemeConfig.Config>(json)?.forEach {
ThemeConfig.addConfig(it)
} ?: throw Exception("格式不对")
} else {
GSON.fromJsonObject<ThemeConfig.Config>(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 ?: "未知错误")
}
}
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 ?: "未知错误")
}
}
}

@ -308,6 +308,7 @@ class BgTextConfigDialog : BaseDialogFragment() {
private fun importNetConfig(url: String) { private fun importNetConfig(url: String) {
execute { execute {
@Suppress("BlockingMethodInNonBlockingContext")
okHttpClient.newCall { okHttpClient.newCall {
url(url) url(url)
}.bytes().let { }.bytes().let {
@ -318,9 +319,9 @@ class BgTextConfigDialog : BaseDialogFragment() {
} }
} }
@Suppress("BlockingMethodInNonBlockingContext")
private fun importConfig(uri: Uri) { private fun importConfig(uri: Uri) {
execute { execute {
@Suppress("BlockingMethodInNonBlockingContext")
importConfig(uri.readBytes(requireContext())!!) importConfig(uri.readBytes(requireContext())!!)
}.onError { }.onError {
it.printStackTrace() it.printStackTrace()
@ -328,61 +329,13 @@ class BgTextConfigDialog : BaseDialogFragment() {
} }
} }
@Suppress("BlockingMethodInNonBlockingContext") @Suppress("BlockingMethodInNonBlockingContext", "BlockingMethodInNonBlockingContext")
private fun importConfig(byteArray: ByteArray) { private fun importConfig(byteArray: ByteArray) {
execute { execute {
val configZipPath = FileUtils.getPath(requireContext().externalCache, configFileName) ReadBookConfig.import(byteArray)
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)
}.onSuccess { }.onSuccess {
ReadBookConfig.durConfig = it
postEvent(EventBus.UP_CONFIG, true)
toastOnUi("导入成功") toastOnUi("导入成功")
}.onError { }.onError {
it.printStackTrace() it.printStackTrace()

@ -2,7 +2,6 @@ package io.legado.app.ui.rss.read
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.DownloadManager import android.app.DownloadManager
import android.content.Intent
import android.content.pm.ActivityInfo import android.content.pm.ActivityInfo
import android.content.res.Configuration import android.content.res.Configuration
import android.net.Uri import android.net.Uri
@ -23,9 +22,7 @@ import io.legado.app.help.AppConfig
import io.legado.app.lib.theme.DrawableUtils import io.legado.app.lib.theme.DrawableUtils
import io.legado.app.lib.theme.primaryTextColor import io.legado.app.lib.theme.primaryTextColor
import io.legado.app.service.help.Download import io.legado.app.service.help.Download
import io.legado.app.ui.association.ImportBookSourceActivity import io.legado.app.ui.association.OnLineImportActivity
import io.legado.app.ui.association.ImportReplaceRuleActivity
import io.legado.app.ui.association.ImportRssSourceActivity
import io.legado.app.ui.document.FilePicker import io.legado.app.ui.document.FilePicker
import io.legado.app.ui.document.FilePickerParam import io.legado.app.ui.document.FilePickerParam
import io.legado.app.utils.* import io.legado.app.utils.*
@ -332,41 +329,23 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
} }
private fun shouldOverrideUrlLoading(url: Uri): Boolean { private fun shouldOverrideUrlLoading(url: Uri): Boolean {
if (url.scheme == "http" || url.scheme == "https") { when (url.scheme) {
return false "http", "https" -> {
} else if (url.scheme == "yuedu") { return false
when (url.host) { }
"booksource" -> { "legado", "yuedu" -> {
val intent = Intent( startActivity<OnLineImportActivity> {
this@ReadRssActivity, data = url
ImportBookSourceActivity::class.java
)
intent.data = url
startActivity(intent)
}
"rsssource" -> {
val intent = Intent(
this@ReadRssActivity,
ImportRssSourceActivity::class.java
)
intent.data = url
startActivity(intent)
} }
"replace" -> { return true
val intent = Intent( }
this@ReadRssActivity, else -> {
ImportReplaceRuleActivity::class.java binding.root.longSnackbar("跳转其它应用", "确认") {
) openUrl(url)
intent.data = url
startActivity(intent)
} }
return true
} }
return true
}
binding.root.longSnackbar("跳转其它应用", "确认") {
openUrl(url)
} }
return true
} }
} }

Loading…
Cancel
Save