Merge remote-tracking branch 'origin/master'

pull/1259/head
gedoor 3 years ago
commit 79e93bee0a
  1. 3
      app/src/androidTest/java/io/legado/app/ExampleInstrumentedTest.kt
  2. 1
      app/src/main/java/io/legado/app/constant/EventBus.kt
  3. 2
      app/src/main/java/io/legado/app/constant/PreferKey.kt
  4. 3
      app/src/main/java/io/legado/app/help/AppConfig.kt
  5. 26
      app/src/main/java/io/legado/app/model/Debug.kt
  6. 28
      app/src/main/java/io/legado/app/service/CheckSourceService.kt
  7. 2
      app/src/main/java/io/legado/app/ui/book/source/debug/BookSourceDebugModel.kt
  8. 14
      app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt
  9. 9
      app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt
  10. 2
      app/src/main/java/io/legado/app/ui/rss/source/debug/RssSourceDebugModel.kt
  11. 4
      app/src/main/java/io/legado/app/web/SourceDebugWebSocket.kt
  12. 36
      app/src/main/res/layout/item_book_source.xml
  13. 2
      app/src/main/res/values-es-rES/strings.xml
  14. 2
      app/src/main/res/values-ja-rJP/strings.xml
  15. 2
      app/src/main/res/values-pt-rBR/strings.xml
  16. 2
      app/src/main/res/values-zh-rHK/strings.xml
  17. 2
      app/src/main/res/values-zh-rTW/strings.xml
  18. 2
      app/src/main/res/values-zh/strings.xml
  19. 2
      app/src/main/res/values/strings.xml
  20. 7
      app/src/main/res/xml/pref_config_other.xml
  21. 3
      app/src/test/java/io/legado/app/ExampleUnitTest.kt

@ -4,12 +4,9 @@ import android.net.Uri
import android.util.Log import android.util.Log
import androidx.test.InstrumentationRegistry import androidx.test.InstrumentationRegistry
import androidx.test.runner.AndroidJUnit4 import androidx.test.runner.AndroidJUnit4
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.junit.Assert.*
/** /**
* Instrumented test, which will execute on an Android device. * Instrumented test, which will execute on an Android device.
* *

@ -22,6 +22,7 @@ object EventBus {
const val UP_DOWNLOAD = "upDownload" const val UP_DOWNLOAD = "upDownload"
const val SAVE_CONTENT = "saveContent" const val SAVE_CONTENT = "saveContent"
const val CHECK_SOURCE = "checkSource" const val CHECK_SOURCE = "checkSource"
const val CHECK_SOURCE_MESSAGE = "checkSourceMessage"
const val CHECK_SOURCE_DONE = "checkSourceDone" const val CHECK_SOURCE_DONE = "checkSourceDone"
const val TIP_COLOR = "tipColor" const val TIP_COLOR = "tipColor"
const val SOURCE_CHANGED = "sourceChanged" const val SOURCE_CHANGED = "sourceChanged"

@ -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()) {

@ -1,10 +1,7 @@
package io.legado.app.model package io.legado.app.model
import android.annotation.SuppressLint import android.annotation.SuppressLint
import io.legado.app.data.entities.Book import io.legado.app.data.entities.*
import io.legado.app.data.entities.BookChapter
import io.legado.app.data.entities.RssArticle
import io.legado.app.data.entities.RssSource
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
@ -14,11 +11,14 @@ import io.legado.app.utils.msg
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
import java.util.concurrent.ConcurrentHashMap
object Debug { object Debug {
var callback: Callback? = null var callback: Callback? = null
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>()
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())
@ -34,7 +34,7 @@ object Debug {
state: Int = 1 state: Int = 1
) { ) {
callback?.let { callback?.let {
if (debugSource != sourceUrl || !print) return if ((debugSource != sourceUrl || !print) && !isChecking) return
var printMsg = msg ?: "" var printMsg = msg ?: ""
if (isHtml) { if (isHtml) {
printMsg = HtmlFormatter.format(msg) printMsg = HtmlFormatter.format(msg)
@ -44,6 +44,10 @@ object Debug {
printMsg = "$time $printMsg" printMsg = "$time $printMsg"
} }
it.printLog(state, printMsg) it.printLog(state, printMsg)
if (sourceUrl != null && printMsg.length < 30) {
debugMessageMap[sourceUrl] = printMsg
callback?.postCheckMessageEvent(sourceUrl)
}
} }
} }
@ -61,6 +65,17 @@ object Debug {
} }
} }
fun startChecking(source: BookSource) {
startTime = System.currentTimeMillis()
isChecking = true
debugMessageMap[source.bookSourceUrl] = "开始校验"
}
fun finishChecking() {
callback = null
isChecking = false
}
fun startDebug(scope: CoroutineScope, rssSource: RssSource) { fun startDebug(scope: CoroutineScope, rssSource: RssSource) {
cancelDebug() cancelDebug()
debugSource = rssSource.sourceUrl debugSource = rssSource.sourceUrl
@ -246,6 +261,7 @@ object Debug {
interface Callback { interface Callback {
fun printLog(state: Int, msg: String) fun printLog(state: Int, msg: String)
fun postCheckMessageEvent(sourceUrl: String)
} }
} }

@ -12,6 +12,7 @@ import io.legado.app.data.entities.BookSource
import io.legado.app.help.AppConfig 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.webBook.WebBook import io.legado.app.model.webBook.WebBook
import io.legado.app.service.help.CheckSource import io.legado.app.service.help.CheckSource
import io.legado.app.ui.book.source.manage.BookSourceActivity import io.legado.app.ui.book.source.manage.BookSourceActivity
@ -29,6 +30,7 @@ class CheckSourceService : BaseService() {
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 var debugCallback : Debug.Callback? = null
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)
@ -48,6 +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
threadCount = 1
}
upNotification() upNotification()
} }
@ -106,6 +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)
}
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()) {
@ -135,6 +152,10 @@ class CheckSourceService : BaseService() {
"error:${it.localizedMessage} "error:${it.localizedMessage}
${source.bookSourceComment}" ${source.bookSourceComment}"
""".trimIndent() """.trimIndent()
debugCallback?.let {
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("失效")
@ -143,6 +164,11 @@ class CheckSourceService : BaseService() {
?.filterNot { ?.filterNot {
it.startsWith("error:") it.startsWith("error:")
}?.joinToString("\n") }?.joinToString("\n")
debugCallback?.let { debugCallback
Debug.debugMessageMap[source.bookSourceUrl] = Debug.debugMessageMap[source.bookSourceUrl] + " 成功"
postEvent(EventBus.CHECK_SOURCE_MESSAGE, source.bookSourceUrl)
}
appDb.bookSourceDao.update(source) appDb.bookSourceDao.update(source)
}.onFinally(searchCoroutine) { }.onFinally(searchCoroutine) {
onNext(source.bookSourceUrl, source.bookSourceName) onNext(source.bookSourceUrl, source.bookSourceName)
@ -156,7 +182,7 @@ class CheckSourceService : BaseService() {
notificationMsg = notificationMsg =
getString(R.string.progress_show, sourceName, checkedIds.size, allIds.size) getString(R.string.progress_show, sourceName, checkedIds.size, allIds.size)
upNotification() upNotification()
if (processIndex >= allIds.size + threadCount - 1) { if (processIndex > allIds.size + threadCount - 1) {
stopSelf() stopSelf()
} }
} }

@ -51,6 +51,8 @@ class BookSourceDebugModel(application: Application) : BaseViewModel(application
} }
} }
override fun postCheckMessageEvent(sourceUrl: String) {}
override fun onCleared() { override fun onCleared() {
super.onCleared() super.onCleared()
Debug.cancelDebug(true) Debug.cancelDebug(true)

@ -9,6 +9,7 @@ import android.view.SubMenu
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.core.os.bundleOf
import androidx.documentfile.provider.DocumentFile import androidx.documentfile.provider.DocumentFile
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
@ -24,6 +25,7 @@ import io.legado.app.help.LocalConfig
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.ATH
import io.legado.app.lib.theme.primaryTextColor import io.legado.app.lib.theme.primaryTextColor
import io.legado.app.model.Debug
import io.legado.app.service.help.CheckSource import io.legado.app.service.help.CheckSource
import io.legado.app.ui.association.ImportBookSourceDialog import io.legado.app.ui.association.ImportBookSourceDialog
import io.legado.app.ui.book.source.debug.BookSourceDebugActivity import io.legado.app.ui.book.source.debug.BookSourceDebugActivity
@ -39,7 +41,7 @@ import io.legado.app.ui.widget.recycler.VerticalDivider
import io.legado.app.utils.* import io.legado.app.utils.*
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.File import java.io.File
@ -434,6 +436,7 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
} }
} }
observeEvent<Int>(EventBus.CHECK_SOURCE_DONE) { observeEvent<Int>(EventBus.CHECK_SOURCE_DONE) {
Debug.finishChecking()
snackBar?.dismiss() snackBar?.dismiss()
snackBar = null snackBar = null
groups.map { group -> groups.map { group ->
@ -443,6 +446,15 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
} }
} }
} }
observeEvent<String>(EventBus.CHECK_SOURCE_MESSAGE) { bookSourceUrl ->
sourceFlowJob?.cancel()
sourceFlowJob = launch {
appDb.bookSourceDao.flowSearch(bookSourceUrl)
.map { adapter.getItems().indexOf(it[0]) }
.collect {
adapter.notifyItemChanged(it, bundleOf(Pair(EventBus.CHECK_SOURCE_MESSAGE, null))) }
}
}
} }
override fun upCountView() { override fun upCountView() {

@ -13,9 +13,11 @@ import androidx.recyclerview.widget.RecyclerView
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.base.adapter.RecyclerAdapter
import io.legado.app.constant.EventBus
import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.BookSource
import io.legado.app.databinding.ItemBookSourceBinding import io.legado.app.databinding.ItemBookSourceBinding
import io.legado.app.lib.theme.backgroundColor import io.legado.app.lib.theme.backgroundColor
import io.legado.app.model.Debug
import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.DragSelectTouchHelper
import io.legado.app.ui.widget.recycler.ItemTouchCallback.Callback import io.legado.app.ui.widget.recycler.ItemTouchCallback.Callback
import io.legado.app.utils.ColorUtils import io.legado.app.utils.ColorUtils
@ -107,11 +109,18 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) :
} }
swtEnabled.isChecked = item.enabled swtEnabled.isChecked = item.enabled
cbBookSource.isChecked = selected.contains(item) cbBookSource.isChecked = selected.contains(item)
ivDebugText.text = Debug.debugMessageMap[item.bookSourceUrl] ?: ""
ivDebugText.visibility = if(ivDebugText.text.toString().length > 1) View.VISIBLE else View.GONE
upShowExplore(ivExplore, item) upShowExplore(ivExplore, item)
} else { } else {
payload.keySet().map { payload.keySet().map {
when (it) { when (it) {
"selected" -> cbBookSource.isChecked = selected.contains(item) "selected" -> cbBookSource.isChecked = selected.contains(item)
EventBus.CHECK_SOURCE_MESSAGE -> {
ivDebugText.text = Debug.debugMessageMap[item.bookSourceUrl] ?: ""
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,6 +44,8 @@ class RssSourceDebugModel(application: Application) : BaseViewModel(application)
} }
} }
override fun postCheckMessageEvent(sourceUrl: String) {}
override fun onCleared() { override fun onCleared() {
super.onCleared() super.onCleared()
Debug.cancelDebug(true) Debug.cancelDebug(true)

@ -95,4 +95,8 @@ class SourceDebugWebSocket(handshakeRequest: NanoHTTPD.IHTTPSession) :
} }
} }
override fun postCheckMessageEvent(sourceUrl: String) {
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="parent" /> 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="parent" /> 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="parent" /> 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_toBottomOf="parent" 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
@ -68,4 +68,32 @@
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<io.legado.app.lib.theme.view.ATEProgressBar
android:id="@+id/iv_progressBar"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_gravity="start|center_vertical"
android:animationResolution="1000"
android:indeterminate="true"
android:visibility="gone"
android:indeterminateBehavior="repeat"
tools:visibility="visible"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/iv_debug_text"
app:layout_constraintBottom_toBottomOf="@id/iv_debug_text" />
<TextView
android:id="@+id/iv_debug_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
tools:text="@string/debug_hint"
android:text=""
android:visibility="gone"
tools:visibility="visible"
android:layout_marginStart="10dp"
app:layout_constraintStart_toEndOf="@id/iv_progressBar"
app:layout_constraintTop_toBottomOf="@id/cb_book_source"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

@ -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"

@ -1,9 +1,8 @@
package io.legado.app package io.legado.app
import org.junit.Assert.assertEquals
import org.junit.Test import org.junit.Test
import org.junit.Assert.*
/** /**
* Example local unit test, which will execute on the development machine (host). * Example local unit test, which will execute on the development machine (host).
* *

Loading…
Cancel
Save