mirror of
https://github.com/gedoor/legado.git
synced 2024-09-01 09:34:25 +08:00
朗读引擎添加登录功能
This commit is contained in:
parent
fdcb738ede
commit
76abf4a7f9
@ -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 ->
|
||||
|
@ -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))
|
||||
}
|
||||
|
||||
}
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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)
|
||||
|
@ -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>
|
||||
|
23
app/src/main/res/menu/speak_engine_edit.xml
Normal file
23
app/src/main/res/menu/speak_engine_edit.xml
Normal 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>
|
Loading…
Reference in New Issue
Block a user