From 76abf4a7f927c16c5b449d75e1251b6d5582e4ae Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 6 Oct 2021 16:14:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=97=E8=AF=BB=E5=BC=95=E6=93=8E=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=99=BB=E5=BD=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/book/read/config/SpeakEngineDialog.kt | 35 +------- .../book/read/config/SpeakEngineEditDialog.kt | 85 +++++++++++++++++++ .../read/config/SpeakEngineEditViewModel.kt | 38 +++++++++ .../app/ui/config/CoverConfigFragment.kt | 2 +- .../main/res/layout/dialog_http_tts_edit.xml | 9 +- app/src/main/res/menu/speak_engine_edit.xml | 23 +++++ 6 files changed, 155 insertions(+), 37 deletions(-) create mode 100644 app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineEditDialog.kt create mode 100644 app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineEditViewModel.kt create mode 100644 app/src/main/res/menu/speak_engine_edit.xml diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineDialog.kt index 1c877c8dc..b9db433e1 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineDialog.kt @@ -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() 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(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 -> diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineEditDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineEditDialog.kt new file mode 100644 index 000000000..7a3967cdf --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineEditDialog.kt @@ -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() + + 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)) + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineEditViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineEditViewModel.kt new file mode 100644 index 000000000..dfc60286e --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineEditViewModel.kt @@ -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() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/config/CoverConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/CoverConfigFragment.kt index a9af38f93..2ad33e459 100644 --- a/app/src/main/java/io/legado/app/ui/config/CoverConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/CoverConfigFragment.kt @@ -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) diff --git a/app/src/main/res/layout/dialog_http_tts_edit.xml b/app/src/main/res/layout/dialog_http_tts_edit.xml index b14dac4a0..e92400dc4 100644 --- a/app/src/main/res/layout/dialog_http_tts_edit.xml +++ b/app/src/main/res/layout/dialog_http_tts_edit.xml @@ -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" /> @@ -81,11 +82,11 @@ @@ -95,11 +96,11 @@ diff --git a/app/src/main/res/menu/speak_engine_edit.xml b/app/src/main/res/menu/speak_engine_edit.xml new file mode 100644 index 000000000..09d88a0cb --- /dev/null +++ b/app/src/main/res/menu/speak_engine_edit.xml @@ -0,0 +1,23 @@ + + + + + + + + + + \ No newline at end of file