diff --git a/app/src/main/java/io/legado/app/data/entities/rule/RowUi.kt b/app/src/main/java/io/legado/app/data/entities/rule/RowUi.kt index e983d1a44..ff4884891 100644 --- a/app/src/main/java/io/legado/app/data/entities/rule/RowUi.kt +++ b/app/src/main/java/io/legado/app/data/entities/rule/RowUi.kt @@ -6,6 +6,16 @@ import kotlinx.parcelize.Parcelize @Parcelize data class RowUi( var name: String, - var type: String?, - var action: String? -) : Parcelable \ No newline at end of file + var type: String = "text", + var action: String? = null +) : Parcelable { + + object Type { + + const val text = "text" + const val password = "password" + const val button = "button" + + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookActivity.kt index 55e1d07b7..46f78a335 100644 --- a/app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookActivity.kt @@ -93,7 +93,7 @@ class RemoteBookActivity : BaseImportBookActivity upPath() - R.id.menu_server_config -> {} + R.id.menu_server_config -> showDialogFragment(ServerConfigDialog()) R.id.menu_log -> showDialogFragment() R.id.menu_help -> showHelp("webDavBookHelp") R.id.menu_sort_name -> { diff --git a/app/src/main/java/io/legado/app/ui/book/import/remote/ServerConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/import/remote/ServerConfigDialog.kt index 4e30c9780..62dba84a3 100644 --- a/app/src/main/java/io/legado/app/ui/book/import/remote/ServerConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/import/remote/ServerConfigDialog.kt @@ -1,4 +1,97 @@ package io.legado.app.ui.book.import.remote -class ServerConfigDialog { +import android.os.Bundle +import android.text.InputType +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.widget.Toolbar +import io.legado.app.R +import io.legado.app.base.BaseDialogFragment +import io.legado.app.data.entities.rule.RowUi +import io.legado.app.databinding.DialogWebdavServerBinding +import io.legado.app.databinding.ItemSourceEditBinding +import io.legado.app.lib.theme.primaryColor +import io.legado.app.utils.ACache +import io.legado.app.utils.GSON +import io.legado.app.utils.applyTint +import io.legado.app.utils.setLayout +import io.legado.app.utils.viewbindingdelegate.viewBinding + +class ServerConfigDialog : BaseDialogFragment(R.layout.dialog_webdav_server, true), + Toolbar.OnMenuItemClickListener { + + private val binding by viewBinding(DialogWebdavServerBinding::bind) + + private val serverUi = listOf( + RowUi("url"), + RowUi("user"), + RowUi("password", RowUi.Type.password) + ) + + override fun onStart() { + super.onStart() + setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) + } + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + binding.toolBar.setBackgroundColor(primaryColor) + binding.toolBar.inflateMenu(R.menu.server_config) + binding.toolBar.menu.applyTint(requireContext()) + binding.toolBar.setOnMenuItemClickListener(this) + initConfigView() + } + + override fun onMenuItemClick(item: MenuItem): Boolean { + when (item.itemId) { + R.id.menu_save -> { + val data = getConfigData() + ACache.get().put("remoteServerConfig", GSON.toJson(data)) + dismissAllowingStateLoss() + } + } + return true + } + + private fun initConfigView() { + val data = ACache.get().getAsJSONObject("remoteServerConfig") + serverUi.forEachIndexed { index, rowUi -> + when (rowUi.type) { + RowUi.Type.text -> ItemSourceEditBinding.inflate( + layoutInflater, + binding.root, + false + ).let { + binding.flexbox.addView(it.root) + it.root.id = index + 1000 + it.textInputLayout.hint = rowUi.name + it.editText.setText(data?.getString(rowUi.name)) + } + RowUi.Type.password -> ItemSourceEditBinding.inflate( + layoutInflater, + binding.root, + false + ).let { + binding.flexbox.addView(it.root) + it.root.id = index + 1000 + it.textInputLayout.hint = rowUi.name + it.editText.inputType = + InputType.TYPE_TEXT_VARIATION_PASSWORD or InputType.TYPE_CLASS_TEXT + it.editText.setText(data?.getString(rowUi.name)) + } + } + } + } + + private fun getConfigData(): Map { + val data = hashMapOf() + serverUi.forEachIndexed { index, rowUi -> + val rowView = binding.root.findViewById(index + 1000) + ItemSourceEditBinding.bind(rowView).editText.text?.let { + data[rowUi.name] = it.toString() + } + } + return data + } + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/login/SourceLoginDialog.kt b/app/src/main/java/io/legado/app/ui/login/SourceLoginDialog.kt index 5d8b956ec..42fb8c82d 100644 --- a/app/src/main/java/io/legado/app/ui/login/SourceLoginDialog.kt +++ b/app/src/main/java/io/legado/app/ui/login/SourceLoginDialog.kt @@ -45,24 +45,35 @@ class SourceLoginDialog : BaseDialogFragment(R.layout.dialog_login, true) { val loginUi = source.loginUi() loginUi?.forEachIndexed { index, rowUi -> when (rowUi.type) { - "text" -> ItemSourceEditBinding.inflate(layoutInflater, binding.root, false).let { + RowUi.Type.text -> ItemSourceEditBinding.inflate( + layoutInflater, + binding.root, + false + ).let { binding.flexbox.addView(it.root) - it.root.id = index + it.root.id = index + 1000 it.textInputLayout.hint = rowUi.name it.editText.setText(loginInfo?.get(rowUi.name)) } - "password" -> ItemSourceEditBinding.inflate(layoutInflater, binding.root, false) - .let { - binding.flexbox.addView(it.root) - it.root.id = index - it.textInputLayout.hint = rowUi.name - it.editText.inputType = - InputType.TYPE_TEXT_VARIATION_PASSWORD or InputType.TYPE_CLASS_TEXT - it.editText.setText(loginInfo?.get(rowUi.name)) - } - "button" -> ItemFilletTextBinding.inflate(layoutInflater, binding.root, false).let { + RowUi.Type.password -> ItemSourceEditBinding.inflate( + layoutInflater, + binding.root, + false + ).let { binding.flexbox.addView(it.root) - it.root.id = index + it.root.id = index + 1000 + it.textInputLayout.hint = rowUi.name + it.editText.inputType = + InputType.TYPE_TEXT_VARIATION_PASSWORD or InputType.TYPE_CLASS_TEXT + it.editText.setText(loginInfo?.get(rowUi.name)) + } + RowUi.Type.button -> ItemFilletTextBinding.inflate( + layoutInflater, + binding.root, + false + ).let { + binding.flexbox.addView(it.root) + it.root.id = index + 1000 it.textView.text = rowUi.name it.textView.setPadding(16.dpToPx()) it.root.onClick { @@ -77,8 +88,11 @@ class SourceLoginDialog : BaseDialogFragment(R.layout.dialog_login, true) { put("result", getLoginData(loginUi)) } } - }.onFailure { - AppLog.put("LoginUI Button ${rowUi.name} JavaScript error", it) + }.onFailure { e -> + AppLog.put( + "LoginUI Button ${rowUi.name} JavaScript error", + e + ) } } } @@ -112,7 +126,7 @@ class SourceLoginDialog : BaseDialogFragment(R.layout.dialog_login, true) { loginUi?.forEachIndexed { index, rowUi -> when (rowUi.type) { "text", "password" -> { - val rowView = binding.root.findViewById(index) + val rowView = binding.root.findViewById(index + 1000) ItemSourceEditBinding.bind(rowView).editText.text?.let { loginData[rowUi.name] = it.toString() } diff --git a/app/src/main/res/layout/dialog_webdav_server.xml b/app/src/main/res/layout/dialog_webdav_server.xml new file mode 100644 index 000000000..1644ac588 --- /dev/null +++ b/app/src/main/res/layout/dialog_webdav_server.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/server_config.xml b/app/src/main/res/menu/server_config.xml new file mode 100644 index 000000000..0c2ba6d93 --- /dev/null +++ b/app/src/main/res/menu/server_config.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file