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 androidx.test.InstrumentationRegistry
import androidx.test.runner.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*

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

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

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

@ -1,10 +1,7 @@
package io.legado.app.model
import android.annotation.SuppressLint
import io.legado.app.data.entities.Book
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.data.entities.*
import io.legado.app.help.coroutine.CompositeCoroutine
import io.legado.app.model.rss.Rss
import io.legado.app.model.webBook.WebBook
@ -14,11 +11,14 @@ import io.legado.app.utils.msg
import kotlinx.coroutines.CoroutineScope
import java.text.SimpleDateFormat
import java.util.*
import java.util.concurrent.ConcurrentHashMap
object Debug {
var callback: Callback? = null
private var debugSource: String? = null
private val tasks: CompositeCoroutine = CompositeCoroutine()
val debugMessageMap = ConcurrentHashMap<String, String>()
private var isChecking: Boolean = false
@SuppressLint("ConstantLocale")
private val DEBUG_TIME_FORMAT = SimpleDateFormat("[mm:ss.SSS]", Locale.getDefault())
@ -34,7 +34,7 @@ object Debug {
state: Int = 1
) {
callback?.let {
if (debugSource != sourceUrl || !print) return
if ((debugSource != sourceUrl || !print) && !isChecking) return
var printMsg = msg ?: ""
if (isHtml) {
printMsg = HtmlFormatter.format(msg)
@ -44,6 +44,10 @@ object Debug {
printMsg = "$time $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) {
cancelDebug()
debugSource = rssSource.sourceUrl
@ -246,6 +261,7 @@ object Debug {
interface Callback {
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.IntentHelp
import io.legado.app.help.coroutine.CompositeCoroutine
import io.legado.app.model.Debug
import io.legado.app.model.webBook.WebBook
import io.legado.app.service.help.CheckSource
import io.legado.app.ui.book.source.manage.BookSourceActivity
@ -29,6 +30,7 @@ class CheckSourceService : BaseService() {
private val checkedIds = ArrayList<String>()
private var processIndex = 0
private var notificationMsg = ""
private var debugCallback : Debug.Callback? = null
private val notificationBuilder by lazy {
NotificationCompat.Builder(this, AppConst.channelIdReadAloud)
.setSmallIcon(R.drawable.ic_network_check)
@ -48,6 +50,18 @@ class CheckSourceService : BaseService() {
override fun onCreate() {
super.onCreate()
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()
}
@ -106,6 +120,9 @@ class CheckSourceService : BaseService() {
fun check(source: BookSource) {
execute(context = searchCoroutine) {
if (AppConfig.checkSourceMessage) {
Debug.startChecking(source)
}
val webBook = WebBook(source)
var books = webBook.searchBookAwait(this, CheckSource.keyword)
if (books.isEmpty()) {
@ -135,6 +152,10 @@ class CheckSourceService : BaseService() {
"error:${it.localizedMessage}
${source.bookSourceComment}"
""".trimIndent()
debugCallback?.let {
Debug.debugMessageMap[source.bookSourceUrl] = Debug.debugMessageMap[source.bookSourceUrl] + " 失败"
postEvent(EventBus.CHECK_SOURCE_MESSAGE, source.bookSourceUrl)
}
appDb.bookSourceDao.update(source)
}.onSuccess(searchCoroutine) {
source.removeGroup("失效")
@ -143,6 +164,11 @@ class CheckSourceService : BaseService() {
?.filterNot {
it.startsWith("error:")
}?.joinToString("\n")
debugCallback?.let { debugCallback
Debug.debugMessageMap[source.bookSourceUrl] = Debug.debugMessageMap[source.bookSourceUrl] + " 成功"
postEvent(EventBus.CHECK_SOURCE_MESSAGE, source.bookSourceUrl)
}
appDb.bookSourceDao.update(source)
}.onFinally(searchCoroutine) {
onNext(source.bookSourceUrl, source.bookSourceName)
@ -156,7 +182,7 @@ class CheckSourceService : BaseService() {
notificationMsg =
getString(R.string.progress_show, sourceName, checkedIds.size, allIds.size)
upNotification()
if (processIndex >= allIds.size + threadCount - 1) {
if (processIndex > allIds.size + threadCount - 1) {
stopSelf()
}
}

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

@ -9,6 +9,7 @@ import android.view.SubMenu
import androidx.activity.viewModels
import androidx.appcompat.widget.PopupMenu
import androidx.appcompat.widget.SearchView
import androidx.core.os.bundleOf
import androidx.documentfile.provider.DocumentFile
import androidx.recyclerview.widget.ItemTouchHelper
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.theme.ATH
import io.legado.app.lib.theme.primaryTextColor
import io.legado.app.model.Debug
import io.legado.app.service.help.CheckSource
import io.legado.app.ui.association.ImportBookSourceDialog
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.viewbindingdelegate.viewBinding
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import java.io.File
@ -434,6 +436,7 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
}
}
observeEvent<Int>(EventBus.CHECK_SOURCE_DONE) {
Debug.finishChecking()
snackBar?.dismiss()
snackBar = null
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() {

@ -13,9 +13,11 @@ import androidx.recyclerview.widget.RecyclerView
import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.RecyclerAdapter
import io.legado.app.constant.EventBus
import io.legado.app.data.entities.BookSource
import io.legado.app.databinding.ItemBookSourceBinding
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.ItemTouchCallback.Callback
import io.legado.app.utils.ColorUtils
@ -107,11 +109,18 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) :
}
swtEnabled.isChecked = item.enabled
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)
} else {
payload.keySet().map {
when (it) {
"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() {
super.onCleared()
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_constraintRight_toLeftOf="@id/swt_enabled"
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
android:id="@+id/swt_enabled"
@ -29,7 +29,7 @@
tools:ignore="RtlSymmetry"
app:layout_constraintRight_toLeftOf="@id/iv_edit"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
app:layout_constraintBottom_toTopOf="@id/iv_debug_text" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_edit"
@ -43,7 +43,7 @@
android:tint="@color/primaryText"
app:layout_constraintRight_toLeftOf="@id/iv_menu_more"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
app:layout_constraintBottom_toTopOf="@id/iv_debug_text" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_menu_more"
@ -55,7 +55,7 @@
android:tint="@color/primaryText"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintBottom_toTopOf="@id/iv_debug_text"
tools:ignore="RtlHardcoded" />
<io.legado.app.ui.widget.image.CircleImageView
@ -68,4 +68,32 @@
app:layout_constraintRight_toRightOf="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>

@ -853,4 +853,6 @@
<string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string>
<string name="pref_media_button_per_next_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>

@ -854,4 +854,6 @@
<string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string>
<string name="pref_media_button_per_next_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>

@ -853,4 +853,6 @@
<string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string>
<string name="pref_media_button_per_next_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>

@ -855,5 +855,7 @@
<string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string>
<string name="pref_media_button_per_next_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>

@ -856,5 +856,7 @@
<string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string>
<string name="pref_media_button_per_next_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>

@ -857,5 +857,7 @@
<string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string>
<string name="pref_media_button_per_next_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>

@ -858,5 +858,7 @@
<string name="pref_media_button_per_next">媒体按钮•上一首|下一首</string>
<string name="pref_media_button_per_next_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>

@ -103,6 +103,13 @@
android:title="@string/threads_num_title"
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
android:defaultValue="true"
android:key="process_text"

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

Loading…
Cancel
Save