feat: 优化书源校验,自定义搜索关键字

pull/238/head
gedoor 5 years ago
parent 3a5cc4b44f
commit 7ee7dd08c5
  1. 19
      app/src/main/java/io/legado/app/service/CheckSourceService.kt
  2. 61
      app/src/main/java/io/legado/app/service/help/CheckSource.kt
  3. 24
      app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt

@ -7,13 +7,11 @@ import io.legado.app.R
import io.legado.app.base.BaseService import io.legado.app.base.BaseService
import io.legado.app.constant.AppConst import io.legado.app.constant.AppConst
import io.legado.app.constant.IntentAction import io.legado.app.constant.IntentAction
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.WebBook 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
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.asCoroutineDispatcher
import org.jetbrains.anko.toast import org.jetbrains.anko.toast
import java.util.concurrent.Executors import java.util.concurrent.Executors
@ -80,24 +78,15 @@ class CheckSourceService : BaseService() {
if (source.searchUrl.isNullOrEmpty()) { if (source.searchUrl.isNullOrEmpty()) {
onNext(sourceUrl) onNext(sourceUrl)
} else { } else {
check(source) CheckSource(source).check(this, searchPool) {
onNext(it)
}
} }
} ?: onNext(sourceUrl) } ?: onNext(sourceUrl)
} }
} }
} }
private fun check(source: BookSource) {
val webBook = WebBook(source)
tasks.add(webBook.searchBook("我的", scope = this, context = searchPool)
.onError(IO) {
source.addGroup("失效")
App.db.bookSourceDao().update(source)
}.onFinally(IO) {
onNext(source.bookSourceUrl)
})
}
private fun onNext(sourceUrl: String) { private fun onNext(sourceUrl: String) {
synchronized(this) { synchronized(this) {
check() check()

@ -2,34 +2,59 @@ package io.legado.app.service.help
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import io.legado.app.App
import io.legado.app.R import io.legado.app.R
import io.legado.app.constant.IntentAction import io.legado.app.constant.IntentAction
import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.BookSource
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.model.WebBook
import io.legado.app.service.CheckSourceService import io.legado.app.service.CheckSourceService
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import org.jetbrains.anko.toast import org.jetbrains.anko.toast
import kotlin.coroutines.CoroutineContext
object CheckSource { class CheckSource(val source: BookSource) {
fun start(context: Context, sources: List<BookSource>) { companion object {
if (sources.isEmpty()) { var keyword = "我的"
context.toast(R.string.non_select)
return fun start(context: Context, sources: List<BookSource>) {
} if (sources.isEmpty()) {
val selectedIds: ArrayList<String> = arrayListOf() context.toast(R.string.non_select)
sources.map { return
selectedIds.add(it.bookSourceUrl) }
val selectedIds: ArrayList<String> = arrayListOf()
sources.map {
selectedIds.add(it.bookSourceUrl)
}
Intent(context, CheckSourceService::class.java).let {
it.action = IntentAction.start
it.putExtra("selectIds", selectedIds)
context.startService(it)
}
} }
Intent(context, CheckSourceService::class.java).let {
it.action = IntentAction.start fun stop(context: Context) {
it.putExtra("selectIds", selectedIds) Intent(context, CheckSourceService::class.java).let {
context.startService(it) it.action = IntentAction.stop
context.startService(it)
}
} }
} }
fun stop(context: Context) { fun check(
Intent(context, CheckSourceService::class.java).let { scope: CoroutineScope,
it.action = IntentAction.stop context: CoroutineContext,
context.startService(it) onNext: (sourceUrl: String) -> Unit
} ): Coroutine<*> {
val webBook = WebBook(source)
return webBook.searchBook(keyword, scope = scope, context = context)
.onError(Dispatchers.IO) {
source.addGroup("失效")
App.db.bookSourceDao().update(source)
}.onFinally(Dispatchers.IO) {
onNext(source.bookSourceUrl)
}
} }
} }

@ -231,13 +231,35 @@ class BookSourceActivity : VMBaseActivity<BookSourceViewModel>(R.layout.activity
R.id.menu_enable_explore -> viewModel.enableSelectExplore(adapter.getSelection()) R.id.menu_enable_explore -> viewModel.enableSelectExplore(adapter.getSelection())
R.id.menu_disable_explore -> viewModel.disableSelectExplore(adapter.getSelection()) R.id.menu_disable_explore -> viewModel.disableSelectExplore(adapter.getSelection())
R.id.menu_export_selection -> FilePicker.selectFolder(this, exportRequestCode) R.id.menu_export_selection -> FilePicker.selectFolder(this, exportRequestCode)
R.id.menu_check_source -> CheckSource.start(this, adapter.getSelection()) R.id.menu_check_source -> checkSource()
R.id.menu_top_sel -> viewModel.topSource(*adapter.getSelection().toTypedArray()) R.id.menu_top_sel -> viewModel.topSource(*adapter.getSelection().toTypedArray())
R.id.menu_bottom_sel -> viewModel.bottomSource(*adapter.getSelection().toTypedArray()) R.id.menu_bottom_sel -> viewModel.bottomSource(*adapter.getSelection().toTypedArray())
} }
return true return true
} }
@SuppressLint("InflateParams")
private fun checkSource() {
alert(titleResource = R.string.search_book_key) {
var editText: AutoCompleteTextView? = null
customView {
layoutInflater.inflate(R.layout.dialog_edit_text, null).apply {
editText = edit_view
edit_view.setText(CheckSource.keyword)
}
}
okButton {
editText?.text?.toString()?.let {
if (it.isNotEmpty()) {
CheckSource.keyword = it
}
}
CheckSource.start(this@BookSourceActivity, adapter.getSelection())
}
noButton { }
}.show().applyTint()
}
private fun upGroupMenu() { private fun upGroupMenu() {
groupMenu?.removeGroup(R.id.source_group) groupMenu?.removeGroup(R.id.source_group)
groups.sortedWith(Collator.getInstance(java.util.Locale.CHINESE)) groups.sortedWith(Collator.getInstance(java.util.Locale.CHINESE))

Loading…
Cancel
Save