朗读引擎添加登录功能

pull/1395/head
gedoor 4 years ago
parent 76abf4a7f9
commit 682af16d51
  1. 15
      app/src/main/java/io/legado/app/data/entities/BaseSource.kt
  2. 6
      app/src/main/java/io/legado/app/data/entities/BookSource.kt
  3. 3
      app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt
  4. 3
      app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt
  5. 3
      app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt
  6. 20
      app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineEditDialog.kt
  7. 4
      app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineEditViewModel.kt
  8. 18
      app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt
  9. 3
      app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt
  10. 6
      app/src/main/java/io/legado/app/ui/login/SourceLoginActivity.kt
  11. 13
      app/src/main/java/io/legado/app/ui/login/SourceLoginViewModel.kt
  12. 3
      app/src/main/java/io/legado/app/ui/main/explore/ExploreAdapter.kt
  13. 3
      app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt
  14. 3
      app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt
  15. 22
      app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt

@ -7,10 +7,7 @@ import io.legado.app.help.AppConfig
import io.legado.app.help.CacheManager
import io.legado.app.help.JsExtensions
import io.legado.app.help.http.CookieStore
import io.legado.app.utils.EncoderUtils
import io.legado.app.utils.GSON
import io.legado.app.utils.fromJsonObject
import io.legado.app.utils.printOnDebug
import io.legado.app.utils.*
import javax.script.SimpleBindings
/**
@ -28,6 +25,16 @@ interface BaseSource : JsExtensions {
fun getKey(): String
fun getLoginUiStr(): String? {
return loginUi?.let {
GSON.toJson(it)
}
}
fun setLoginUi(uiJson: String?) {
loginUi = GSON.fromJsonArray(uiJson)
}
fun getLoginJs(): String? {
val loginJs = loginUrl
return when {

@ -105,12 +105,6 @@ data class BookSource(
override fun equals(other: Any?) =
if (other is BookSource) other.bookSourceUrl == bookSourceUrl else false
fun getLoginUiStr(): String? {
return loginUi?.let {
GSON.toJson(it)
}
}
fun getSearchRule() = ruleSearch ?: SearchRule()
fun getExploreRule() = ruleExplore ?: ExploreRule()

@ -98,7 +98,8 @@ class AudioPlayActivity :
}
R.id.menu_login -> AudioPlay.bookSource?.let {
startActivity<SourceLoginActivity> {
putExtra("sourceUrl", it.bookSourceUrl)
putExtra("type", "bookSource")
putExtra("key", it.bookSourceUrl)
}
}
R.id.menu_copy_audio_url -> sendToClip(AudioPlayService.url)

@ -158,7 +158,8 @@ class BookInfoActivity :
}
R.id.menu_login -> viewModel.bookSource?.let {
startActivity<SourceLoginActivity> {
putExtra("sourceUrl", it.bookSourceUrl)
putExtra("type", "bookSource")
putExtra("key", it.bookSourceUrl)
}
}
R.id.menu_top -> viewModel.topBook()

@ -791,7 +791,8 @@ class ReadBookActivity : ReadBookBaseActivity(),
override fun showLogin() {
ReadBook.bookSource?.let {
startActivity<SourceLoginActivity> {
putExtra("sourceUrl", it.bookSourceUrl)
putExtra("type", "bookSource")
putExtra("key", it.bookSourceUrl)
}
}
}

@ -11,6 +11,7 @@ import io.legado.app.base.BaseDialogFragment
import io.legado.app.data.entities.HttpTTS
import io.legado.app.databinding.DialogHttpTtsEditBinding
import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.login.SourceLoginActivity
import io.legado.app.ui.widget.dialog.TextDialog
import io.legado.app.utils.*
import io.legado.app.utils.viewbindingdelegate.viewBinding
@ -50,7 +51,7 @@ class SpeakEngineEditDialog() : BaseDialogFragment(R.layout.dialog_http_tts_edit
binding.tvName.setText(httpTTS.name)
binding.tvUrl.setText(httpTTS.url)
binding.tvLoginUrl.setText(httpTTS.loginUrl)
binding.tvLoginUi.setText(GSON.toJson(httpTTS.loginUi))
binding.tvLoginUi.setText(httpTTS.getLoginUiStr())
binding.tvLoginCheckJs.setText(httpTTS.loginCheckJs)
binding.tvHeaders.setText(httpTTS.header)
}
@ -58,6 +59,18 @@ class SpeakEngineEditDialog() : BaseDialogFragment(R.layout.dialog_http_tts_edit
override fun onMenuItemClick(item: MenuItem?): Boolean {
when (item?.itemId) {
R.id.menu_save -> viewModel.save(dataFromView())
R.id.menu_login -> dataFromView().let { httpTts ->
if (httpTts.loginUrl.isNullOrBlank()) {
toastOnUi("登录url不能为空")
} else {
viewModel.save(httpTts) {
startActivity<SourceLoginActivity> {
putExtra("type", "httpTts")
putExtra("key", httpTts.id.toString())
}
}
}
}
R.id.menu_help -> help()
}
return true
@ -69,10 +82,11 @@ class SpeakEngineEditDialog() : BaseDialogFragment(R.layout.dialog_http_tts_edit
name = binding.tvName.text.toString(),
url = binding.tvUrl.text.toString(),
loginUrl = binding.tvLoginUrl.text?.toString(),
loginUi = GSON.fromJsonArray(binding.tvLoginUi.text?.toString()),
loginCheckJs = binding.tvLoginCheckJs.text?.toString(),
header = binding.tvHeaders.text?.toString()
)
).apply {
setLoginUi(binding.tvLoginUi.text?.toString())
}
}
private fun help() {

@ -28,10 +28,12 @@ class SpeakEngineEditViewModel(app: Application) : BaseViewModel(app) {
}
}
fun save(httpTTS: HttpTTS) {
fun save(httpTTS: HttpTTS, success: (() -> Unit)? = null) {
execute {
appDb.httpTTSDao.insert(httpTTS)
ReadAloud.upReadAloudClass()
}.onSuccess {
success?.invoke()
}
}

@ -85,6 +85,11 @@ class BookSourceEditActivity :
return super.onCompatCreateOptionsMenu(menu)
}
override fun onMenuOpened(featureId: Int, menu: Menu): Boolean {
menu.findItem(R.id.menu_login)?.isVisible = !viewModel.bookSource?.loginUrl.isNullOrBlank()
return super.onMenuOpened(featureId, menu)
}
override fun onCompatOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menu_save -> getSource().let { source ->
@ -114,13 +119,12 @@ class BookSourceEditActivity :
ErrorCorrectionLevel.L
)
R.id.menu_help -> showRuleHelp()
R.id.menu_login -> getSource().let {
if (checkSource(it)) {
if (it.loginUrl.isNullOrEmpty()) {
toastOnUi(R.string.source_no_login)
} else {
R.id.menu_login -> getSource().let { source ->
if (checkSource(source)) {
viewModel.save(source) {
startActivity<SourceLoginActivity> {
putExtra("sourceUrl", it.bookSourceUrl)
putExtra("type", "bookSource")
putExtra("key", source.bookSourceUrl)
}
}
}
@ -296,7 +300,7 @@ class BookSourceEditActivity :
"bookSourceName" -> source.bookSourceName = it.value ?: ""
"bookSourceGroup" -> source.bookSourceGroup = it.value
"loginUrl" -> source.loginUrl = it.value
"loginUi" -> source.loginUi = GSON.fromJsonArray(it.value)
"loginUi" -> source.setLoginUi(it.value)
"loginCheckJs" -> source.loginCheckJs = it.value
"bookUrlPattern" -> source.bookUrlPattern = it.value
"header" -> source.header = it.value

@ -169,7 +169,8 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) :
R.id.menu_top -> callBack.toTop(source)
R.id.menu_bottom -> callBack.toBottom(source)
R.id.menu_login -> context.startActivity<SourceLoginActivity> {
putExtra("sourceUrl", source.bookSourceUrl)
putExtra("type", "bookSource")
putExtra("key", source.bookSourceUrl)
}
R.id.menu_debug_source -> callBack.debug(source)
R.id.menu_del -> callBack.del(source)

@ -16,10 +16,8 @@ class SourceLoginActivity : VMBaseActivity<ActivitySourceLoginBinding, SourceLog
override val viewModel by viewModels<SourceLoginViewModel>()
override fun onActivityCreated(savedInstanceState: Bundle?) {
intent.getStringExtra("sourceUrl")?.let {
viewModel.initData(it) { source ->
initView(source)
}
viewModel.initData(intent) { source ->
initView(source)
}
}

@ -1,20 +1,25 @@
package io.legado.app.ui.login
import android.app.Application
import android.content.Intent
import io.legado.app.base.BaseViewModel
import io.legado.app.data.appDb
import io.legado.app.data.entities.BaseSource
import io.legado.app.model.NoStackTraceException
import io.legado.app.utils.toastOnUi
class SourceLoginViewModel(application: Application) : BaseViewModel(application) {
var source: BaseSource? = null
fun initData(sourceUrl: String, success: (bookSource: BaseSource) -> Unit) {
fun initData(intent: Intent, success: (bookSource: BaseSource) -> Unit) {
execute {
source = appDb.bookSourceDao.getBookSource(sourceUrl)
if (source == null) {
source = appDb.rssSourceDao.getByKey(sourceUrl)
val sourceKey = intent.getStringExtra("key")
?: throw NoStackTraceException("没有参数")
when (intent.getStringExtra("type")) {
"bookSource" -> source = appDb.bookSourceDao.getBookSource(sourceKey)
"rssSource" -> source = appDb.rssSourceDao.getByKey(sourceKey)
"httpTts" -> source = appDb.httpTTSDao.get(sourceKey.toLong())
}
source
}.onSuccess {

@ -164,7 +164,8 @@ class ExploreAdapter(context: Context, private val scope: CoroutineScope, val ca
R.id.menu_edit -> callBack.editSource(source.bookSourceUrl)
R.id.menu_top -> callBack.toTop(source)
R.id.menu_login -> context.startActivity<SourceLoginActivity> {
putExtra("sourceUrl", source.bookSourceUrl)
putExtra("type", "bookSource")
putExtra("key", source.bookSourceUrl)
}
R.id.menu_refresh -> Coroutine.async(scope) {
ACache.get(context, "explore").remove(source.bookSourceUrl)

@ -67,7 +67,8 @@ class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewMo
override fun onCompatOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menu_login -> startActivity<SourceLoginActivity> {
putExtra("sourceUrl", viewModel.rssSource?.sourceUrl)
putExtra("type", "rssSource")
putExtra("key", viewModel.rssSource?.sourceUrl)
}
R.id.menu_set_source_variable -> setSourceVariable()
R.id.menu_edit_source -> viewModel.rssSource?.sourceUrl?.let {

@ -98,7 +98,8 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
} ?: toastOnUi(R.string.null_url)
R.id.menu_aloud -> readAloud()
R.id.menu_login -> startActivity<SourceLoginActivity> {
putExtra("sourceUrl", viewModel.rssSource?.loginUrl)
putExtra("type", "rssSource")
putExtra("key", viewModel.rssSource?.loginUrl)
}
}
return super.onCompatOptionsItemSelected(item)

@ -20,6 +20,7 @@ import io.legado.app.help.LocalConfig
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.dialogs.selector
import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.login.SourceLoginActivity
import io.legado.app.ui.qrcode.QrCodeResult
import io.legado.app.ui.rss.source.debug.RssSourceDebugActivity
import io.legado.app.ui.widget.KeyboardToolPop
@ -87,6 +88,11 @@ class RssSourceEditActivity :
return super.onCompatCreateOptionsMenu(menu)
}
override fun onMenuOpened(featureId: Int, menu: Menu): Boolean {
menu.findItem(R.id.menu_login)?.isVisible = !viewModel.rssSource.loginUrl.isNullOrBlank()
return super.onMenuOpened(featureId, menu)
}
override fun onCompatOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menu_save -> {
@ -108,6 +114,16 @@ class RssSourceEditActivity :
}
}
}
R.id.menu_login -> getRssSource().let {
if (checkSource(it)) {
viewModel.save(it) {
startActivity<SourceLoginActivity> {
putExtra("type", "rssSource")
putExtra("key", it.sourceUrl)
}
}
}
}
R.id.menu_copy_source -> sendToClip(GSON.toJson(getRssSource()))
R.id.menu_qr_code_camera -> qrCodeResult.launch(null)
R.id.menu_paste_source -> viewModel.pasteSource { upRecyclerView(it) }
@ -143,6 +159,9 @@ class RssSourceEditActivity :
add(EditEntity("sourceIcon", source?.sourceIcon, R.string.source_icon))
add(EditEntity("sourceGroup", source?.sourceGroup, R.string.source_group))
add(EditEntity("sourceComment", source?.sourceComment, R.string.comment))
add(EditEntity("loginUrl", source?.loginUrl, R.string.login_url))
add(EditEntity("loginUi", source?.getLoginUiStr(), R.string.login_ui))
add(EditEntity("loginCheckJs", source?.loginCheckJs, R.string.login_check_js))
add(EditEntity("header", source?.header, R.string.source_http_header))
add(
EditEntity(
@ -176,6 +195,9 @@ class RssSourceEditActivity :
"sourceIcon" -> source.sourceIcon = it.value ?: ""
"sourceGroup" -> source.sourceGroup = it.value
"sourceComment" -> source.sourceComment = it.value
"loginUrl" -> source.loginUrl = it.value
"loginUi" -> source.setLoginUi(it.value)
"loginCheckJs" -> source.loginCheckJs = it.value
"header" -> source.header = it.value
"concurrentRate" -> source.concurrentRate = it.value
"sortUrl" -> source.sortUrl = it.value

Loading…
Cancel
Save