Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions app/src/main/assets/updateLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
* 关注合作公众号 **[小说拾遗]** 获取好看的小说。
* 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。

**2021/02/19**
**2021/02/20**
* 下一页规则改为在内容规则之后执行
* 书籍导出增加编码设置和导出文件夹设置
* 书籍导出增加编码设置和导出文件夹设置,使用替换设置
* 导入源添加等待框
* 修复一些崩溃bug

**2021/02/16**
* 修复分享内容不对的bug
Expand Down
1 change: 1 addition & 0 deletions app/src/main/java/io/legado/app/constant/PreferKey.kt
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ object PreferKey {
const val autoRefresh = "auto_refresh"
const val defaultToRead = "defaultToRead"
const val exportCharset = "exportCharset"
const val exportUseReplace = "exportUseReplace"

const val cPrimary = "colorPrimary"
const val cAccent = "colorAccent"
Expand Down
119 changes: 62 additions & 57 deletions app/src/main/java/io/legado/app/help/AppConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,44 +9,43 @@ import splitties.init.appCtx

@Suppress("MemberVisibilityCanBePrivate")
object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
private val context get() = appCtx
val isGooglePlay = context.channel == "google"
val isGooglePlay = appCtx.channel == "google"
var userAgent: String = getPrefUserAgent()
var replaceEnableDefault = context.getPrefBoolean(PreferKey.replaceEnableDefault, true)
var isEInkMode = context.getPrefString(PreferKey.themeMode) == "3"
var clickActionTL = context.getPrefInt(PreferKey.clickActionTL, 2)
var clickActionTC = context.getPrefInt(PreferKey.clickActionTC, 2)
var clickActionTR = context.getPrefInt(PreferKey.clickActionTR, 1)
var clickActionML = context.getPrefInt(PreferKey.clickActionML, 2)
var clickActionMC = context.getPrefInt(PreferKey.clickActionMC, 0)
var clickActionMR = context.getPrefInt(PreferKey.clickActionMR, 1)
var clickActionBL = context.getPrefInt(PreferKey.clickActionBL, 2)
var clickActionBC = context.getPrefInt(PreferKey.clickActionBC, 1)
var clickActionBR = context.getPrefInt(PreferKey.clickActionBR, 1)
var replaceEnableDefault = appCtx.getPrefBoolean(PreferKey.replaceEnableDefault, true)
var isEInkMode = appCtx.getPrefString(PreferKey.themeMode) == "3"
var clickActionTL = appCtx.getPrefInt(PreferKey.clickActionTL, 2)
var clickActionTC = appCtx.getPrefInt(PreferKey.clickActionTC, 2)
var clickActionTR = appCtx.getPrefInt(PreferKey.clickActionTR, 1)
var clickActionML = appCtx.getPrefInt(PreferKey.clickActionML, 2)
var clickActionMC = appCtx.getPrefInt(PreferKey.clickActionMC, 0)
var clickActionMR = appCtx.getPrefInt(PreferKey.clickActionMR, 1)
var clickActionBL = appCtx.getPrefInt(PreferKey.clickActionBL, 2)
var clickActionBC = appCtx.getPrefInt(PreferKey.clickActionBC, 1)
var clickActionBR = appCtx.getPrefInt(PreferKey.clickActionBR, 1)

override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
when (key) {
PreferKey.themeMode -> isEInkMode = context.getPrefString(PreferKey.themeMode) == "3"
PreferKey.themeMode -> isEInkMode = appCtx.getPrefString(PreferKey.themeMode) == "3"
PreferKey.clickActionTL -> clickActionTL =
context.getPrefInt(PreferKey.clickActionTL, 2)
appCtx.getPrefInt(PreferKey.clickActionTL, 2)
PreferKey.clickActionTC -> clickActionTC =
context.getPrefInt(PreferKey.clickActionTC, 2)
appCtx.getPrefInt(PreferKey.clickActionTC, 2)
PreferKey.clickActionTR -> clickActionTR =
context.getPrefInt(PreferKey.clickActionTR, 2)
appCtx.getPrefInt(PreferKey.clickActionTR, 2)
PreferKey.clickActionML -> clickActionML =
context.getPrefInt(PreferKey.clickActionML, 2)
appCtx.getPrefInt(PreferKey.clickActionML, 2)
PreferKey.clickActionMC -> clickActionMC =
context.getPrefInt(PreferKey.clickActionMC, 2)
appCtx.getPrefInt(PreferKey.clickActionMC, 2)
PreferKey.clickActionMR -> clickActionMR =
context.getPrefInt(PreferKey.clickActionMR, 2)
appCtx.getPrefInt(PreferKey.clickActionMR, 2)
PreferKey.clickActionBL -> clickActionBL =
context.getPrefInt(PreferKey.clickActionBL, 2)
appCtx.getPrefInt(PreferKey.clickActionBL, 2)
PreferKey.clickActionBC -> clickActionBC =
context.getPrefInt(PreferKey.clickActionBC, 2)
appCtx.getPrefInt(PreferKey.clickActionBC, 2)
PreferKey.clickActionBR -> clickActionBR =
context.getPrefInt(PreferKey.clickActionBR, 2)
appCtx.getPrefInt(PreferKey.clickActionBR, 2)
PreferKey.readBodyToLh -> ReadBookConfig.readBodyToLh =
context.getPrefBoolean(PreferKey.readBodyToLh, true)
appCtx.getPrefBoolean(PreferKey.readBodyToLh, true)
PreferKey.userAgent -> userAgent = getPrefUserAgent()
}
}
Expand All @@ -61,109 +60,115 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
}

var isNightTheme: Boolean
get() = isNightTheme(context)
get() = isNightTheme(appCtx)
set(value) {
if (isNightTheme != value) {
if (value) {
context.putPrefString(PreferKey.themeMode, "2")
appCtx.putPrefString(PreferKey.themeMode, "2")
} else {
context.putPrefString(PreferKey.themeMode, "1")
appCtx.putPrefString(PreferKey.themeMode, "1")
}
}
}

val isTransparentStatusBar: Boolean
get() = context.getPrefBoolean(PreferKey.transparentStatusBar, true)
get() = appCtx.getPrefBoolean(PreferKey.transparentStatusBar, true)

val immNavigationBar: Boolean
get() = context.getPrefBoolean(PreferKey.immNavigationBar, true)
get() = appCtx.getPrefBoolean(PreferKey.immNavigationBar, true)

val screenOrientation: String?
get() = context.getPrefString(PreferKey.screenOrientation)
get() = appCtx.getPrefString(PreferKey.screenOrientation)

var backupPath: String?
get() = context.getPrefString(PreferKey.backupPath)
get() = appCtx.getPrefString(PreferKey.backupPath)
set(value) {
if (value.isNullOrEmpty()) {
context.removePref(PreferKey.backupPath)
appCtx.removePref(PreferKey.backupPath)
} else {
context.putPrefString(PreferKey.backupPath, value)
appCtx.putPrefString(PreferKey.backupPath, value)
}
}

val isShowRSS: Boolean
get() = context.getPrefBoolean(PreferKey.showRss, true)
get() = appCtx.getPrefBoolean(PreferKey.showRss, true)

val autoRefreshBook: Boolean
get() = context.getPrefBoolean(PreferKey.autoRefresh)
get() = appCtx.getPrefBoolean(PreferKey.autoRefresh)

var threadCount: Int
get() = context.getPrefInt(PreferKey.threadCount, 16)
get() = appCtx.getPrefInt(PreferKey.threadCount, 16)
set(value) {
context.putPrefInt(PreferKey.threadCount, value)
appCtx.putPrefInt(PreferKey.threadCount, value)
}

var importBookPath: String?
get() = context.getPrefString("importBookPath")
get() = appCtx.getPrefString("importBookPath")
set(value) {
if (value == null) {
context.removePref("importBookPath")
appCtx.removePref("importBookPath")
} else {
context.putPrefString("importBookPath", value)
appCtx.putPrefString("importBookPath", value)
}
}

var ttsSpeechRate: Int
get() = context.getPrefInt(PreferKey.ttsSpeechRate, 5)
get() = appCtx.getPrefInt(PreferKey.ttsSpeechRate, 5)
set(value) {
context.putPrefInt(PreferKey.ttsSpeechRate, value)
appCtx.putPrefInt(PreferKey.ttsSpeechRate, value)
}

var chineseConverterType: Int
get() = context.getPrefInt(PreferKey.chineseConverterType)
get() = appCtx.getPrefInt(PreferKey.chineseConverterType)
set(value) {
context.putPrefInt(PreferKey.chineseConverterType, value)
appCtx.putPrefInt(PreferKey.chineseConverterType, value)
}

var systemTypefaces: Int
get() = context.getPrefInt(PreferKey.systemTypefaces)
get() = appCtx.getPrefInt(PreferKey.systemTypefaces)
set(value) {
context.putPrefInt(PreferKey.systemTypefaces, value)
appCtx.putPrefInt(PreferKey.systemTypefaces, value)
}

var elevation: Int
get() = context.getPrefInt(PreferKey.barElevation, AppConst.sysElevation)
get() = appCtx.getPrefInt(PreferKey.barElevation, AppConst.sysElevation)
set(value) {
context.putPrefInt(PreferKey.barElevation, value)
appCtx.putPrefInt(PreferKey.barElevation, value)
}

var exportCharset: String
get() {
val c = context.getPrefString(PreferKey.exportCharset)
val c = appCtx.getPrefString(PreferKey.exportCharset)
if (c.isNullOrBlank()) {
return "UTF-8"
}
return c
}
set(value) {
context.putPrefString(PreferKey.exportCharset, value)
appCtx.putPrefString(PreferKey.exportCharset, value)
}

var exportUseReplace: Boolean
get() = appCtx.getPrefBoolean(PreferKey.exportUseReplace, true)
set(value) {
appCtx.putPrefBoolean(PreferKey.exportUseReplace, value)
}

val autoChangeSource: Boolean
get() = context.getPrefBoolean(PreferKey.autoChangeSource, true)
get() = appCtx.getPrefBoolean(PreferKey.autoChangeSource, true)

val changeSourceLoadInfo get() = context.getPrefBoolean(PreferKey.changeSourceLoadToc)
val changeSourceLoadInfo get() = appCtx.getPrefBoolean(PreferKey.changeSourceLoadToc)

val changeSourceLoadToc get() = context.getPrefBoolean(PreferKey.changeSourceLoadToc)
val changeSourceLoadToc get() = appCtx.getPrefBoolean(PreferKey.changeSourceLoadToc)

val importKeepName get() = context.getPrefBoolean(PreferKey.importKeepName)
val importKeepName get() = appCtx.getPrefBoolean(PreferKey.importKeepName)

val syncBookProgress get() = context.getPrefBoolean(PreferKey.syncBookProgress, true)
val syncBookProgress get() = appCtx.getPrefBoolean(PreferKey.syncBookProgress, true)

val preDownload get() = context.getPrefBoolean(PreferKey.preDownload, true)
val preDownload get() = appCtx.getPrefBoolean(PreferKey.preDownload, true)

private fun getPrefUserAgent(): String {
val ua = context.getPrefString(PreferKey.userAgent)
val ua = appCtx.getPrefString(PreferKey.userAgent)
if (ua.isNullOrBlank()) {
return "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
}
Expand Down
5 changes: 3 additions & 2 deletions app/src/main/java/io/legado/app/help/ContentProcessor.kt
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,11 @@ class ContentProcessor(private val bookName: String, private val bookOrigin: Str
book: Book,
title: String, //已经经过简繁转换
content: String,
isRead: Boolean = true
isRead: Boolean = true,
useReplace: Boolean = book.getUseReplaceRule()
): List<String> {
var content1 = content
if (book.getUseReplaceRule()) {
if (useReplace) {
replaceRules.forEach { item ->
if (item.pattern.isNotEmpty()) {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import io.legado.app.databinding.DialogRecyclerViewBinding
import io.legado.app.databinding.ItemSourceImportBinding
import io.legado.app.help.AppConfig
import io.legado.app.lib.dialogs.alert
import io.legado.app.ui.widget.dialog.WaitDialog
import io.legado.app.utils.dp
import io.legado.app.utils.putPrefBoolean
import io.legado.app.utils.splitNotBlank
Expand Down Expand Up @@ -70,7 +71,10 @@ class ImportBookSourceDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickList
}
binding.tvOk.visible()
binding.tvOk.setOnClickListener {
val waitDialog = WaitDialog(requireContext())
waitDialog.show()
viewModel.importSelect {
waitDialog.dismiss()
dismissAllowingStateLoss()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import io.legado.app.databinding.DialogRecyclerViewBinding
import io.legado.app.databinding.ItemSourceImportBinding
import io.legado.app.help.AppConfig
import io.legado.app.lib.dialogs.alert
import io.legado.app.ui.widget.dialog.WaitDialog
import io.legado.app.utils.dp
import io.legado.app.utils.putPrefBoolean
import io.legado.app.utils.splitNotBlank
Expand Down Expand Up @@ -68,7 +69,10 @@ class ImportRssSourceDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListe
}
binding.tvOk.visible()
binding.tvOk.setOnClickListener {
val waitDialog = WaitDialog(requireContext())
waitDialog.show()
viewModel.importSelect {
waitDialog.dismiss()
dismissAllowingStateLoss()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ class CacheActivity : VMBaseActivity<ActivityCacheBookBinding, CacheViewModel>()
return super.onPrepareOptionsMenu(menu)
}

override fun onMenuOpened(featureId: Int, menu: Menu): Boolean {
menu.findItem(R.id.menu_enable_replace).isChecked = AppConfig.exportUseReplace
return super.onMenuOpened(featureId, menu)
}

private fun upMenu() {
menu?.findItem(R.id.menu_book_group)?.subMenu?.let { subMenu ->
subMenu.removeGroup(R.id.menu_group)
Expand All @@ -100,6 +105,7 @@ class CacheActivity : VMBaseActivity<ActivityCacheBookBinding, CacheViewModel>()
CacheBook.stop(this@CacheActivity)
}
}
R.id.menu_enable_replace -> AppConfig.exportUseReplace = !item.isChecked
R.id.menu_export_folder -> export(-1)
R.id.menu_export_charset -> showCharsetConfig()
R.id.menu_log ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import io.legado.app.constant.AppPattern
import io.legado.app.constant.PreferKey
import io.legado.app.data.appDb
import io.legado.app.data.entities.Book
import io.legado.app.help.AppConfig
import io.legado.app.help.BookHelp
import io.legado.app.help.ContentProcessor
import io.legado.app.help.storage.BookWebDav
Expand Down Expand Up @@ -86,6 +87,7 @@ class CacheViewModel(application: Application) : BaseViewModel(application) {
}

private suspend fun getAllContents(book: Book): String {
val useReplace = AppConfig.exportUseReplace
val contentProcessor = ContentProcessor(book.name, book.origin)
val stringBuilder = StringBuilder()
stringBuilder.append(book.name)
Expand All @@ -94,7 +96,7 @@ class CacheViewModel(application: Application) : BaseViewModel(application) {
appDb.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter ->
BookHelp.getContent(book, chapter).let { content ->
val content1 = contentProcessor
.getContent(book, chapter.title, content ?: "null", false)
.getContent(book, chapter.title, content ?: "null", false, useReplace)
.joinToString("\n")
stringBuilder.append("\n\n")
.append(content1)
Expand Down
28 changes: 28 additions & 0 deletions app/src/main/java/io/legado/app/ui/widget/dialog/WaitDialog.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package io.legado.app.ui.widget.dialog

import android.app.Dialog
import android.content.Context
import io.legado.app.databinding.DialogWaitBinding


@Suppress("unused")
class WaitDialog(context: Context) : Dialog(context) {

val binding = DialogWaitBinding.inflate(layoutInflater)

init {
setCanceledOnTouchOutside(false)
setContentView(binding.root)
}

fun setText(text: String): WaitDialog {
binding.tvMsg.text = text
return this
}

fun setText(res: Int): WaitDialog {
binding.tvMsg.setText(res)
return this
}

}
25 changes: 25 additions & 0 deletions app/src/main/res/layout/dialog_wait.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/background"
android:gravity="center"
android:padding="20dp"
android:orientation="horizontal">

<ProgressBar
android:id="@+id/pb"
android:layout_width="30dp"
android:layout_height="30dp"
android:indeterminateBehavior="repeat"
android:indeterminateOnly="true" />

<TextView
android:id="@+id/tv_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="6dp"
android:gravity="center"
android:text="执行中......"
android:textColor="@color/primaryText" />
</LinearLayout>
Loading