朗读引擎添加登录功能

This commit is contained in:
gedoor 2021-10-06 16:14:38 +08:00
parent fdcb738ede
commit 76abf4a7f9
6 changed files with 165 additions and 47 deletions

View File

@ -1,6 +1,5 @@
package io.legado.app.ui.book.read.config
import android.annotation.SuppressLint
import android.content.Context
import android.os.Bundle
import android.view.MenuItem
@ -16,7 +15,6 @@ import io.legado.app.base.adapter.RecyclerAdapter
import io.legado.app.data.appDb
import io.legado.app.data.entities.HttpTTS
import io.legado.app.databinding.DialogEditTextBinding
import io.legado.app.databinding.DialogHttpTtsEditBinding
import io.legado.app.databinding.DialogRecyclerViewBinding
import io.legado.app.databinding.ItemHttpTtsBinding
import io.legado.app.help.AppConfig
@ -25,9 +23,7 @@ import io.legado.app.lib.dialogs.SelectItem
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.model.ReadAloud
import io.legado.app.ui.document.HandleFileContract
import io.legado.app.ui.widget.dialog.TextDialog
import io.legado.app.utils.*
import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.flow.collect
@ -115,7 +111,7 @@ class SpeakEngineDialog : BaseDialogFragment(R.layout.dialog_recycler_view),
override fun onMenuItemClick(item: MenuItem?): Boolean {
when (item?.itemId) {
R.id.menu_add -> editHttpTTS()
R.id.menu_add -> showDialogFragment<SpeakEngineEditDialog>()
R.id.menu_default -> viewModel.importDefault()
R.id.menu_import_local -> importDocResult.launch {
mode = HandleFileContract.FILE
@ -174,32 +170,6 @@ class SpeakEngineDialog : BaseDialogFragment(R.layout.dialog_recycler_view),
}
}
@SuppressLint("InflateParams")
private fun editHttpTTS(v: HttpTTS? = null) {
val httpTTS = v?.copy() ?: HttpTTS()
requireContext().alert(titleResource = R.string.speak_engine) {
val alertBinding = DialogHttpTtsEditBinding.inflate(layoutInflater)
alertBinding.tvName.setText(httpTTS.name)
alertBinding.tvUrl.setText(httpTTS.url)
customView { alertBinding.root }
cancelButton()
okButton {
alertBinding.apply {
httpTTS.name = tvName.text.toString()
httpTTS.url = tvUrl.text.toString()
appDb.httpTTSDao.insert(httpTTS)
ReadAloud.upReadAloudClass()
}
}
neutralButton(R.string.help) {
val helpStr = String(
requireContext().assets.open("help/httpTTSHelp.md").readBytes()
)
showDialogFragment(TextDialog(helpStr, TextDialog.Mode.MD))
}
}
}
inner class Adapter(context: Context) :
RecyclerAdapter<HttpTTS, ItemHttpTtsBinding>(context) {
@ -228,7 +198,8 @@ class SpeakEngineDialog : BaseDialogFragment(R.layout.dialog_recycler_view),
}
}
ivEdit.setOnClickListener {
editHttpTTS(getItemByLayoutPosition(holder.layoutPosition))
val id = getItemByLayoutPosition(holder.layoutPosition)!!.id
showDialogFragment(SpeakEngineEditDialog(id))
}
ivMenuDelete.setOnClickListener {
getItemByLayoutPosition(holder.layoutPosition)?.let { httpTTS ->

View File

@ -0,0 +1,85 @@
package io.legado.app.ui.book.read.config
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.viewModels
import io.legado.app.R
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.widget.dialog.TextDialog
import io.legado.app.utils.*
import io.legado.app.utils.viewbindingdelegate.viewBinding
class SpeakEngineEditDialog() : BaseDialogFragment(R.layout.dialog_http_tts_edit),
Toolbar.OnMenuItemClickListener {
constructor(id: Long) : this() {
arguments = Bundle().apply {
putLong("id", id)
}
}
private val binding by viewBinding(DialogHttpTtsEditBinding::bind)
private val viewModel by viewModels<SpeakEngineEditViewModel>()
override fun onStart() {
super.onStart()
setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
}
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
binding.toolBar.setBackgroundColor(primaryColor)
viewModel.initData(arguments) {
initView(httpTTS = it)
}
initMenu()
}
fun initMenu() {
binding.toolBar.inflateMenu(R.menu.speak_engine_edit)
binding.toolBar.menu.applyTint(requireContext())
binding.toolBar.setOnMenuItemClickListener(this)
}
fun initView(httpTTS: HttpTTS) {
binding.tvName.setText(httpTTS.name)
binding.tvUrl.setText(httpTTS.url)
binding.tvLoginUrl.setText(httpTTS.loginUrl)
binding.tvLoginUi.setText(GSON.toJson(httpTTS.loginUi))
binding.tvLoginCheckJs.setText(httpTTS.loginCheckJs)
binding.tvHeaders.setText(httpTTS.header)
}
override fun onMenuItemClick(item: MenuItem?): Boolean {
when (item?.itemId) {
R.id.menu_save -> viewModel.save(dataFromView())
R.id.menu_help -> help()
}
return true
}
private fun dataFromView(): HttpTTS {
return HttpTTS(
id = viewModel.id ?: System.currentTimeMillis(),
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()
)
}
private fun help() {
val helpStr = String(
requireContext().assets.open("help/httpTTSHelp.md").readBytes()
)
showDialogFragment(TextDialog(helpStr, TextDialog.Mode.MD))
}
}

View File

@ -0,0 +1,38 @@
package io.legado.app.ui.book.read.config
import android.app.Application
import android.os.Bundle
import io.legado.app.base.BaseViewModel
import io.legado.app.data.appDb
import io.legado.app.data.entities.HttpTTS
import io.legado.app.model.ReadAloud
class SpeakEngineEditViewModel(app: Application) : BaseViewModel(app) {
var id: Long? = null
fun initData(arguments: Bundle?, success: (httpTTS: HttpTTS) -> Unit) {
execute {
if (id == null) {
id = arguments?.getLong("id")
val httpTTS = id?.let {
return@let appDb.httpTTSDao.get(it)
}
return@execute httpTTS
}
return@execute null
}.onSuccess {
it?.let {
success.invoke(it)
}
}
}
fun save(httpTTS: HttpTTS) {
execute {
appDb.httpTTSDao.insert(httpTTS)
ReadAloud.upReadAloudClass()
}
}
}

View File

@ -81,7 +81,7 @@ class CoverConfigFragment : BasePreferenceFragment(),
@SuppressLint("PrivateResource")
override fun onPreferenceTreeClick(preference: Preference?): Boolean {
when (val key = preference?.key) {
when (preference?.key) {
PreferKey.defaultCover ->
if (getPrefString(PreferKey.defaultCover).isNullOrEmpty()) {
selectImage.launch(requestCodeCover)

View File

@ -11,6 +11,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="?attr/actionBarStyle"
app:title="@string/speak_engine"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:titleTextAppearance="@style/ToolbarTitle" />
@ -78,20 +79,6 @@
</io.legado.app.ui.widget.text.TextInputLayout>
<io.legado.app.ui.widget.text.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/source_http_header"
tools:ignore="HardcodedText">
<io.legado.app.ui.widget.code.CodeView
android:id="@+id/tv_headers"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="TouchTargetSizeCheck,SpeakableTextPresentCheck" />
</io.legado.app.ui.widget.text.TextInputLayout>
<io.legado.app.ui.widget.text.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -106,6 +93,20 @@
</io.legado.app.ui.widget.text.TextInputLayout>
<io.legado.app.ui.widget.text.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/source_http_header"
tools:ignore="HardcodedText">
<io.legado.app.ui.widget.code.CodeView
android:id="@+id/tv_headers"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="TouchTargetSizeCheck,SpeakableTextPresentCheck" />
</io.legado.app.ui.widget.text.TextInputLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="AlwaysShowAction">
<item
android:id="@+id/menu_save"
android:icon="@drawable/ic_save"
android:title="@string/action_save"
app:showAsAction="always" />
<item
android:id="@+id/menu_login"
android:title="@string/login"
app:showAsAction="never" />
<item
android:id="@+id/menu_help"
android:title="@string/help"
app:showAsAction="never" />
</menu>