adding share preference option and clear legacy code

adding share preference option
clear legacy code
pull/1251/head
Jason Yao 3 years ago
parent 144f29f501
commit 73033e14cb
  1. 2
      app/src/main/java/io/legado/app/constant/PreferKey.kt
  2. 3
      app/src/main/java/io/legado/app/help/AppConfig.kt
  3. 8
      app/src/main/java/io/legado/app/model/Debug.kt
  4. 45
      app/src/main/java/io/legado/app/service/CheckSourceService.kt
  5. 4
      app/src/main/java/io/legado/app/ui/book/source/debug/BookSourceDebugModel.kt
  6. 23
      app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt
  7. 14
      app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt
  8. 4
      app/src/main/java/io/legado/app/ui/rss/source/debug/RssSourceDebugModel.kt
  9. 2
      app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt
  10. 14
      app/src/main/res/layout/item_book_source.xml
  11. 2
      app/src/main/res/values-es-rES/strings.xml
  12. 2
      app/src/main/res/values-ja-rJP/strings.xml
  13. 2
      app/src/main/res/values-pt-rBR/strings.xml
  14. 2
      app/src/main/res/values-zh-rHK/strings.xml
  15. 2
      app/src/main/res/values-zh-rTW/strings.xml
  16. 2
      app/src/main/res/values-zh/strings.xml
  17. 2
      app/src/main/res/values/strings.xml
  18. 7
      app/src/main/res/xml/pref_config_other.xml

@ -100,5 +100,5 @@ object PreferKey {
const val cNBBackground = "colorBottomBackgroundNight" const val cNBBackground = "colorBottomBackgroundNight"
const val bgImageN = "backgroundImageNight" const val bgImageN = "backgroundImageNight"
const val bgImageNBlurring = "backgroundImageNightBlurring" const val bgImageNBlurring = "backgroundImageNightBlurring"
const val checkSourceMessage = "checkSourceMessage"
} }

@ -246,6 +246,9 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
val fullScreenGesturesSupport: Boolean val fullScreenGesturesSupport: Boolean
get() = appCtx.getPrefBoolean(PreferKey.fullScreenGesturesSupport, false) get() = appCtx.getPrefBoolean(PreferKey.fullScreenGesturesSupport, false)
val checkSourceMessage: Boolean
get() = appCtx.getPrefBoolean(PreferKey.checkSourceMessage)
private fun getPrefUserAgent(): String { private fun getPrefUserAgent(): String {
val ua = appCtx.getPrefString(PreferKey.userAgent) val ua = appCtx.getPrefString(PreferKey.userAgent)
if (ua.isNullOrBlank()) { if (ua.isNullOrBlank()) {

@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.util.Log import android.util.Log
import io.legado.app.constant.EventBus import io.legado.app.constant.EventBus
import io.legado.app.data.entities.* import io.legado.app.data.entities.*
import io.legado.app.help.AppConfig
import io.legado.app.help.coroutine.CompositeCoroutine import io.legado.app.help.coroutine.CompositeCoroutine
import io.legado.app.model.rss.Rss import io.legado.app.model.rss.Rss
import io.legado.app.model.webBook.WebBook import io.legado.app.model.webBook.WebBook
@ -20,7 +21,7 @@ object Debug {
private var debugSource: String? = null private var debugSource: String? = null
private val tasks: CompositeCoroutine = CompositeCoroutine() private val tasks: CompositeCoroutine = CompositeCoroutine()
val debugMessageMap = ConcurrentHashMap<String, String>() val debugMessageMap = ConcurrentHashMap<String, String>()
var isChecking: Boolean = false private var isChecking: Boolean = false
@SuppressLint("ConstantLocale") @SuppressLint("ConstantLocale")
private val DEBUG_TIME_FORMAT = SimpleDateFormat("[mm:ss.SSS]", Locale.getDefault()) private val DEBUG_TIME_FORMAT = SimpleDateFormat("[mm:ss.SSS]", Locale.getDefault())
@ -48,8 +49,7 @@ object Debug {
it.printLog(state, printMsg) it.printLog(state, printMsg)
if (sourceUrl != null && printMsg.length < 30) { if (sourceUrl != null && printMsg.length < 30) {
debugMessageMap[sourceUrl] = printMsg debugMessageMap[sourceUrl] = printMsg
callback?.printCheckSourceMessage(sourceUrl, printMsg) callback?.postCheckMessageEvent(sourceUrl)
Log.d(EventBus.CHECK_SOURCE_MESSAGE, "debugMessage after filter $printMsg")
} }
} }
} }
@ -264,7 +264,7 @@ object Debug {
interface Callback { interface Callback {
fun printLog(state: Int, msg: String) fun printLog(state: Int, msg: String)
fun printCheckSourceMessage(sourceUrl: String, msg: String) fun postCheckMessageEvent(sourceUrl: String)
} }
} }

@ -1,7 +1,6 @@
package io.legado.app.service package io.legado.app.service
import android.content.Intent import android.content.Intent
import android.util.Log
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.BaseService import io.legado.app.base.BaseService
@ -10,6 +9,7 @@ import io.legado.app.constant.EventBus
import io.legado.app.constant.IntentAction import io.legado.app.constant.IntentAction
import io.legado.app.data.appDb import io.legado.app.data.appDb
import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.BookSource
import io.legado.app.help.AppConfig
import io.legado.app.help.IntentHelp import io.legado.app.help.IntentHelp
import io.legado.app.help.coroutine.CompositeCoroutine import io.legado.app.help.coroutine.CompositeCoroutine
import io.legado.app.model.Debug import io.legado.app.model.Debug
@ -23,23 +23,14 @@ import java.util.concurrent.Executors
import kotlin.math.min import kotlin.math.min
class CheckSourceService : BaseService() { class CheckSourceService : BaseService() {
private var threadCount = 1 private var threadCount = AppConfig.threadCount
private var searchCoroutine = Executors.newFixedThreadPool(min(threadCount,8)).asCoroutineDispatcher() private var searchCoroutine = Executors.newFixedThreadPool(min(threadCount,8)).asCoroutineDispatcher()
private var tasks = CompositeCoroutine() private var tasks = CompositeCoroutine()
private val allIds = ArrayList<String>() private val allIds = ArrayList<String>()
private val checkedIds = ArrayList<String>() private val checkedIds = ArrayList<String>()
private var processIndex = 0 private var processIndex = 0
private var notificationMsg = "" private var notificationMsg = ""
private val debugCallback = object : Debug.Callback{ private var debugCallback : Debug.Callback? = null
override fun printLog(state: Int, msg: String) {
}
@Synchronized
override fun printCheckSourceMessage(sourceUrl: String, msg: String) {
postEvent(EventBus.CHECK_SOURCE_MESSAGE, Pair(sourceUrl, null))
Log.d(EventBus.CHECK_SOURCE_MESSAGE, "printCheckSourceMessage to post $sourceUrl $msg")
}
}
private val notificationBuilder by lazy { private val notificationBuilder by lazy {
NotificationCompat.Builder(this, AppConst.channelIdReadAloud) NotificationCompat.Builder(this, AppConst.channelIdReadAloud)
.setSmallIcon(R.drawable.ic_network_check) .setSmallIcon(R.drawable.ic_network_check)
@ -59,7 +50,18 @@ class CheckSourceService : BaseService() {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
notificationMsg = getString(R.string.start) notificationMsg = getString(R.string.start)
if (AppConfig.checkSourceMessage) {
debugCallback = object : Debug.Callback {
override fun printLog(state: Int, msg: String) {}
@Synchronized
override fun postCheckMessageEvent(sourceUrl: String) {
postEvent(EventBus.CHECK_SOURCE_MESSAGE, sourceUrl)
}
}
Debug.callback = debugCallback Debug.callback = debugCallback
threadCount = 1
}
upNotification() upNotification()
} }
@ -118,7 +120,9 @@ class CheckSourceService : BaseService() {
fun check(source: BookSource) { fun check(source: BookSource) {
execute(context = searchCoroutine) { execute(context = searchCoroutine) {
if (AppConfig.checkSourceMessage) {
Debug.startChecking(source) Debug.startChecking(source)
}
val webBook = WebBook(source) val webBook = WebBook(source)
var books = webBook.searchBookAwait(this, CheckSource.keyword) var books = webBook.searchBookAwait(this, CheckSource.keyword)
if (books.isEmpty()) { if (books.isEmpty()) {
@ -148,8 +152,10 @@ class CheckSourceService : BaseService() {
"error:${it.localizedMessage} "error:${it.localizedMessage}
${source.bookSourceComment}" ${source.bookSourceComment}"
""".trimIndent() """.trimIndent()
val message = Debug.debugMessageMap[source.bookSourceUrl] + " 失败" debugCallback?.let {
postEvent(EventBus.CHECK_SOURCE_MESSAGE, Pair(source.bookSourceUrl, message)) Debug.debugMessageMap[source.bookSourceUrl] = Debug.debugMessageMap[source.bookSourceUrl] + " 失败"
postEvent(EventBus.CHECK_SOURCE_MESSAGE, source.bookSourceUrl)
}
appDb.bookSourceDao.update(source) appDb.bookSourceDao.update(source)
}.onSuccess(searchCoroutine) { }.onSuccess(searchCoroutine) {
source.removeGroup("失效") source.removeGroup("失效")
@ -158,14 +164,11 @@ class CheckSourceService : BaseService() {
?.filterNot { ?.filterNot {
it.startsWith("error:") it.startsWith("error:")
}?.joinToString("\n") }?.joinToString("\n")
Debug.debugMessageMap[source.bookSourceUrl]?.let { lastMessage -> debugCallback?.let { debugCallback
lastMessage.indexOf("]").let { Debug.debugMessageMap[source.bookSourceUrl] = Debug.debugMessageMap[source.bookSourceUrl] + " 成功"
if (it > 0) { postEvent(EventBus.CHECK_SOURCE_MESSAGE, source.bookSourceUrl)
val timeMessage = lastMessage.substring(0, it) + " 校验成功"
postEvent(EventBus.CHECK_SOURCE_MESSAGE, Pair(source.bookSourceUrl, timeMessage))
}
}
} }
appDb.bookSourceDao.update(source) appDb.bookSourceDao.update(source)
}.onFinally(searchCoroutine) { }.onFinally(searchCoroutine) {
onNext(source.bookSourceUrl, source.bookSourceName) onNext(source.bookSourceUrl, source.bookSourceName)

@ -51,9 +51,7 @@ class BookSourceDebugModel(application: Application) : BaseViewModel(application
} }
} }
override fun printCheckSourceMessage(sourceUrl: String, msg: String) { override fun postCheckMessageEvent(sourceUrl: String) {}
TODO("Not yet implemented")
}
override fun onCleared() { override fun onCleared() {
super.onCleared() super.onCleared()

@ -340,7 +340,6 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
CheckSource.keyword = it CheckSource.keyword = it
} }
} }
adapter.notifyItemRangeChanged(0, adapter.itemCount, bundleOf(Pair("startChecking", null)))
CheckSource.start(this@BookSourceActivity, adapter.selection) CheckSource.start(this@BookSourceActivity, adapter.selection)
} }
noButton() noButton()
@ -442,23 +441,21 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
snackBar?.dismiss() snackBar?.dismiss()
Debug.finishChecking() Debug.finishChecking()
snackBar = null snackBar = null
// groups.map { group -> groups.map { group ->
// if (group.contains("失效")) { if (group.contains("失效")) {
// searchView.setQuery("失效", true) searchView.setQuery("失效", true)
// toastOnUi("发现有失效书源,已为您自动筛选!") toastOnUi("发现有失效书源,已为您自动筛选!")
// } }
// } }
} }
observeEvent<Pair<String, String?>>(EventBus.CHECK_SOURCE_MESSAGE) { messagePair -> observeEvent<String>(EventBus.CHECK_SOURCE_MESSAGE) { bookSourceUrl ->
sourceFlowJob?.cancel() sourceFlowJob?.cancel()
sourceFlowJob = launch { sourceFlowJob = launch {
appDb.bookSourceDao.flowSearch(messagePair.first) appDb.bookSourceDao.flowSearch(bookSourceUrl)
.map { adapter.getItems().indexOf(it[0]) } .map { adapter.getItems().indexOf(it[0]) }
.collect { .collect {
adapter.notifyItemChanged(it, bundleOf(Pair(EventBus.CHECK_SOURCE_MESSAGE, messagePair.second))) } adapter.notifyItemChanged(it, bundleOf(Pair(EventBus.CHECK_SOURCE_MESSAGE, null))) }
} }
} }
} }

@ -116,22 +116,10 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) :
payload.keySet().map { payload.keySet().map {
when (it) { when (it) {
"selected" -> cbBookSource.isChecked = selected.contains(item) "selected" -> cbBookSource.isChecked = selected.contains(item)
"startChecking" -> {
ivProgressBar.visibility = if(selected.contains(item)) View.VISIBLE else ivProgressBar.visibility
}
"checkSourceDone" -> {
ivProgressBar.visibility = if(selected.contains(item)) View.GONE else ivProgressBar.visibility
}
EventBus.CHECK_SOURCE_MESSAGE -> { EventBus.CHECK_SOURCE_MESSAGE -> {
val message = payload[it] as? String?
if (message != null) {
ivDebugText.text = message
ivProgressBar.visibility = View.GONE
}
else{
ivDebugText.text = Debug.debugMessageMap[item.bookSourceUrl] ?: "" ivDebugText.text = Debug.debugMessageMap[item.bookSourceUrl] ?: ""
}
ivDebugText.visibility = if(ivDebugText.text.toString().length > 1) View.VISIBLE else View.GONE ivDebugText.visibility = if(ivDebugText.text.toString().length > 1) View.VISIBLE else View.GONE
ivProgressBar.visibility = if(ivDebugText.text.toString().contains(Regex("成功|失败"))) View.GONE else View.VISIBLE
} }
} }
} }

@ -44,9 +44,7 @@ class RssSourceDebugModel(application: Application) : BaseViewModel(application)
} }
} }
override fun printCheckSourceMessage(sourceUrl: String, msg: String) { override fun postCheckMessageEvent(sourceUrl: String) {}
TODO("Not yet implemented")
}
override fun onCleared() { override fun onCleared() {
super.onCleared() super.onCleared()

@ -95,7 +95,7 @@ class SourceDebugWebSocket(handshakeRequest: NanoHTTPD.IHTTPSession) :
} }
} }
override fun printCheckSourceMessage(sourceUrl: String, msg: String) { override fun postCheckMessageEvent(sourceUrl: String) {
TODO("Not yet implemented") TODO("Not yet implemented")
} }

@ -17,7 +17,7 @@
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/swt_enabled" app:layout_constraintRight_toLeftOf="@id/swt_enabled"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="@id/iv_menu_more" /> app:layout_constraintBottom_toTopOf="@id/iv_debug_text" />
<io.legado.app.lib.theme.view.ATESwitch <io.legado.app.lib.theme.view.ATESwitch
android:id="@+id/swt_enabled" android:id="@+id/swt_enabled"
@ -29,7 +29,7 @@
tools:ignore="RtlSymmetry" tools:ignore="RtlSymmetry"
app:layout_constraintRight_toLeftOf="@id/iv_edit" app:layout_constraintRight_toLeftOf="@id/iv_edit"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="@id/iv_menu_more" /> app:layout_constraintBottom_toTopOf="@id/iv_debug_text" />
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_edit" android:id="@+id/iv_edit"
@ -43,7 +43,7 @@
android:tint="@color/primaryText" android:tint="@color/primaryText"
app:layout_constraintRight_toLeftOf="@id/iv_menu_more" app:layout_constraintRight_toLeftOf="@id/iv_menu_more"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="@id/iv_menu_more" /> app:layout_constraintBottom_toTopOf="@id/iv_debug_text" />
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_menu_more" android:id="@+id/iv_menu_more"
@ -55,7 +55,7 @@
android:tint="@color/primaryText" android:tint="@color/primaryText"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/iv_progressBar" app:layout_constraintBottom_toTopOf="@id/iv_debug_text"
tools:ignore="RtlHardcoded" /> tools:ignore="RtlHardcoded" />
<io.legado.app.ui.widget.image.CircleImageView <io.legado.app.ui.widget.image.CircleImageView
@ -79,8 +79,8 @@
android:indeterminateBehavior="repeat" android:indeterminateBehavior="repeat"
tools:visibility="visible" tools:visibility="visible"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_menu_more" app:layout_constraintTop_toTopOf="@id/iv_debug_text"
app:layout_constraintBottom_toBottomOf="parent" /> app:layout_constraintBottom_toBottomOf="@id/iv_debug_text" />
<TextView <TextView
android:id="@+id/iv_debug_text" android:id="@+id/iv_debug_text"
@ -92,7 +92,7 @@
tools:visibility="visible" tools:visibility="visible"
android:layout_marginStart="10dp" android:layout_marginStart="10dp"
app:layout_constraintStart_toEndOf="@id/iv_progressBar" app:layout_constraintStart_toEndOf="@id/iv_progressBar"
app:layout_constraintTop_toTopOf="@id/iv_progressBar" app:layout_constraintTop_toBottomOf="@id/cb_book_source"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" /> app:layout_constraintEnd_toEndOf="parent" />

@ -853,4 +853,6 @@
<string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string> <string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string>
<string name="pref_media_button_per_next_summary">上一段|下一段/上一章|下一章</string> <string name="pref_media_button_per_next_summary">上一段|下一段/上一章|下一章</string>
<string name="read_aloud_by_page_summary">及时翻页,翻页时会停顿一下</string> <string name="read_aloud_by_page_summary">及时翻页,翻页时会停顿一下</string>
<string name="check_source_show_debug_message">La fuente del libro de cheques muestra un mensaje de depuración</string>
<string name="check_source_show_debug_message_summary">Muestra los pasos y el tiempo de la solicitud de red durante la verificación de la fuente del libro; actualmente solo admite la verificación de un solo hilo</string>
</resources> </resources>

@ -854,4 +854,6 @@
<string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string> <string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string>
<string name="pref_media_button_per_next_summary">上一段|下一段/上一章|下一章</string> <string name="pref_media_button_per_next_summary">上一段|下一段/上一章|下一章</string>
<string name="read_aloud_by_page_summary">及时翻页,翻页时会停顿一下</string> <string name="read_aloud_by_page_summary">及时翻页,翻页时会停顿一下</string>
<string name="check_source_show_debug_message">Check book source shows debug message</string>
<string name="check_source_show_debug_message_summary">Show network status and timestamp during source checking, currently only supports single-thread</string>
</resources> </resources>

@ -853,4 +853,6 @@
<string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string> <string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string>
<string name="pref_media_button_per_next_summary">上一段|下一段/上一章|下一章</string> <string name="pref_media_button_per_next_summary">上一段|下一段/上一章|下一章</string>
<string name="read_aloud_by_page_summary">及时翻页,翻页时会停顿一下</string> <string name="read_aloud_by_page_summary">及时翻页,翻页时会停顿一下</string>
<string name="check_source_show_debug_message">Verificar a fonte do livro mostra uma mensagem de depuração</string>
<string name="check_source_show_debug_message_summary">Exibir etapas de solicitação de rede e tempo durante a verificação da fonte do livro; atualmente, oferece suporte apenas à verificação de thread único</string>
</resources> </resources>

@ -855,5 +855,7 @@
<string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string> <string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string>
<string name="pref_media_button_per_next_summary">上一段|下一段/上一章|下一章</string> <string name="pref_media_button_per_next_summary">上一段|下一段/上一章|下一章</string>
<string name="read_aloud_by_page_summary">及时翻页,翻页时会停顿一下</string> <string name="read_aloud_by_page_summary">及时翻页,翻页时会停顿一下</string>
<string name="check_source_show_debug_message">校驗書源顯示詳細信息</string>
<string name="check_source_show_debug_message_summary">書源校驗時顯示網絡請求步驟和時間,當前只支持單線程校驗</string>
</resources> </resources>

@ -856,5 +856,7 @@
<string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string> <string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string>
<string name="pref_media_button_per_next_summary">上一段|下一段/上一章|下一章</string> <string name="pref_media_button_per_next_summary">上一段|下一段/上一章|下一章</string>
<string name="read_aloud_by_page_summary">及时翻页,翻页时会停顿一下</string> <string name="read_aloud_by_page_summary">及时翻页,翻页时会停顿一下</string>
<string name="check_source_show_debug_message">校驗書源顯示詳細信息</string>
<string name="check_source_show_debug_message_summary">書源校驗時顯示網絡請求步驟和時間,當前只支持單線程校驗</string>
</resources> </resources>

@ -857,5 +857,7 @@
<string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string> <string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string>
<string name="pref_media_button_per_next_summary">上一段|下一段/上一章|下一章</string> <string name="pref_media_button_per_next_summary">上一段|下一段/上一章|下一章</string>
<string name="read_aloud_by_page_summary">及时翻页,翻页时会停顿一下</string> <string name="read_aloud_by_page_summary">及时翻页,翻页时会停顿一下</string>
<string name="check_source_show_debug_message">校验显示详细信息</string>
<string name="check_source_show_debug_message_summary">书源校验时显示网络请求步骤和时间,当前只支持单线程校验</string>
</resources> </resources>

@ -858,5 +858,7 @@
<string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string> <string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string>
<string name="pref_media_button_per_next_summary">上一段|下一段/上一章|下一章</string> <string name="pref_media_button_per_next_summary">上一段|下一段/上一章|下一章</string>
<string name="read_aloud_by_page_summary">及时翻页,翻页时会停顿一下</string> <string name="read_aloud_by_page_summary">及时翻页,翻页时会停顿一下</string>
<string name="check_source_show_debug_message">Check book source shows debug message</string>
<string name="check_source_show_debug_message_summary">Show network status and timestamp during source checking, currently only supports single-thread</string>
</resources> </resources>

@ -103,6 +103,13 @@
android:title="@string/threads_num_title" android:title="@string/threads_num_title"
app:iconSpaceReserved="false" /> app:iconSpaceReserved="false" />
<io.legado.app.ui.widget.prefs.SwitchPreference
android:defaultValue="false"
android:key="checkSourceMessage"
android:summary="@string/check_source_show_debug_message_summary"
android:title="@string/check_source_show_debug_message"
app:iconSpaceReserved="false" />
<io.legado.app.ui.widget.prefs.SwitchPreference <io.legado.app.ui.widget.prefs.SwitchPreference
android:defaultValue="true" android:defaultValue="true"
android:key="process_text" android:key="process_text"

Loading…
Cancel
Save