diff --git a/app/build.gradle b/app/build.gradle index 095970f17..38a6294a3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -116,10 +116,12 @@ android { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 } - packagingOptions { - exclude "META-INF/INDEX.LIST" + resources { + excludes += ['META-INF/INDEX.LIST'] + } } + sourceSets { // Adds exported schema location as test app assets. androidTest.assets.srcDirs += files("$projectDir/schemas".toString()) diff --git a/app/src/main/java/io/legado/app/data/entities/Server.kt b/app/src/main/java/io/legado/app/data/entities/Server.kt index 2faa6b2c9..c8d580729 100644 --- a/app/src/main/java/io/legado/app/data/entities/Server.kt +++ b/app/src/main/java/io/legado/app/data/entities/Server.kt @@ -23,7 +23,7 @@ data class Server( ) : Parcelable { enum class TYPE { - WEBDAV, ALIYUN, GOOGLEYUN + WEBDAV } override fun hashCode(): Int { 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 2a926e2ea..8c7296fe6 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 @@ -10,7 +10,6 @@ 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.appDb import io.legado.app.data.entities.Server import io.legado.app.data.entities.rule.RowUi import io.legado.app.databinding.DialogWebdavServerBinding @@ -19,7 +18,9 @@ import io.legado.app.lib.theme.primaryColor import io.legado.app.utils.GSON import io.legado.app.utils.applyTint import io.legado.app.utils.setLayout +import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding +import org.json.JSONObject class ServerConfigDialog() : BaseDialogFragment(R.layout.dialog_webdav_server, true), Toolbar.OnMenuItemClickListener { @@ -33,7 +34,7 @@ class ServerConfigDialog() : BaseDialogFragment(R.layout.dialog_webdav_server, t private val binding by viewBinding(DialogWebdavServerBinding::bind) private val viewModel by viewModels() - private val serverUi = listOf( + private val webDavServerUi = listOf( RowUi("url"), RowUi("username"), RowUi("password", RowUi.Type.password) @@ -50,33 +51,36 @@ class ServerConfigDialog() : BaseDialogFragment(R.layout.dialog_webdav_server, t binding.toolBar.menu.applyTint(requireContext()) binding.toolBar.setOnMenuItemClickListener(this) viewModel.init(arguments?.getLong("id")) { - upConfigView(viewModel.server) + upConfigView(viewModel.mServer) } } override fun onMenuItemClick(item: MenuItem): Boolean { when (item.itemId) { - R.id.menu_save -> { - val data = getConfigData() - if (data.isEmpty()) { - appDb.serverDao.delete(10001) - } else { - appDb.serverDao.insert( - Server( - id = 10001, - config = GSON.toJson(data) - ) - ) + R.id.menu_save -> getServer()?.let { + viewModel.save(it) { + dismissAllowingStateLoss() } - dismissAllowingStateLoss() } } return true } private fun upConfigView(server: Server?) { - val data = appDb.serverDao.get(10001)?.getConfigJsonObject() - serverUi.forEachIndexed { index, rowUi -> + binding.etId.setText(server?.id?.toString()) + binding.etName.setText(server?.name) + binding.spType.setSelection( + when (server?.type) { + else -> 0 + } + ) + when (server?.type) { + else -> upWebDavServerUi(server?.getConfigJsonObject()) + } + } + + private fun upWebDavServerUi(config: JSONObject?) { + webDavServerUi.forEachIndexed { index, rowUi -> when (rowUi.type) { RowUi.Type.text -> ItemSourceEditBinding.inflate( layoutInflater, @@ -86,7 +90,7 @@ class ServerConfigDialog() : BaseDialogFragment(R.layout.dialog_webdav_server, t binding.flexbox.addView(it.root) it.root.id = index + 1000 it.textInputLayout.hint = rowUi.name - it.editText.setText(data?.getString(rowUi.name)) + it.editText.setText(config?.getString(rowUi.name)) } RowUi.Type.password -> ItemSourceEditBinding.inflate( layoutInflater, @@ -98,15 +102,34 @@ class ServerConfigDialog() : BaseDialogFragment(R.layout.dialog_webdav_server, t 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)) + it.editText.setText(config?.getString(rowUi.name)) } } } } - private fun getConfigData(): Map { + private fun getServer(): Server? { + val id = kotlin.runCatching { + binding.etId.text.toString().toLong() + }.getOrNull() + if (id == null) { + toastOnUi("id不能为空") + return null + } + val server = viewModel.mServer?.copy(id = id) ?: Server(id = id) + server.name = binding.etName.text.toString() + server.type = when (binding.spType.selectedItemPosition) { + else -> Server.TYPE.WEBDAV + } + server.config = when (server.type) { + else -> GSON.toJson(getWebDavConfig()) + } + return server + } + + private fun getWebDavConfig(): HashMap { val data = hashMapOf() - serverUi.forEachIndexed { index, rowUi -> + webDavServerUi.forEachIndexed { index, rowUi -> val rowView = binding.root.findViewById(index + 1000) ItemSourceEditBinding.bind(rowView).editText.text?.let { data[rowUi.name] = it.toString() diff --git a/app/src/main/java/io/legado/app/ui/book/import/remote/ServerConfigViewModel.kt b/app/src/main/java/io/legado/app/ui/book/import/remote/ServerConfigViewModel.kt index ed816b7ed..b88740440 100644 --- a/app/src/main/java/io/legado/app/ui/book/import/remote/ServerConfigViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/import/remote/ServerConfigViewModel.kt @@ -4,18 +4,38 @@ import android.app.Application import io.legado.app.base.BaseViewModel import io.legado.app.data.appDb import io.legado.app.data.entities.Server +import io.legado.app.utils.toastOnUi class ServerConfigViewModel(application: Application): BaseViewModel(application) { - var server: Server? = null + var mServer: Server? = null fun init(id: Long?, onSuccess: () -> Unit) { execute { - if (server == null && id != null) { - server = appDb.serverDao.get(id) + if (mServer == null && id != null) { + mServer = appDb.serverDao.get(id) + mServer + } else { + null } + }.onSuccess { + if (it != null) { + onSuccess.invoke() + } + } + } + + fun save(server: Server, onSuccess: () -> Unit) { + execute { + mServer?.let { + appDb.serverDao.delete(it) + } + mServer = server + appDb.serverDao.insert(server) }.onSuccess { onSuccess.invoke() + }.onError { + context.toastOnUi("保存出错\n${it.localizedMessage}") } } diff --git a/app/src/main/res/layout/dialog_webdav_server.xml b/app/src/main/res/layout/dialog_webdav_server.xml index 1644ac588..a422a5427 100644 --- a/app/src/main/res/layout/dialog_webdav_server.xml +++ b/app/src/main/res/layout/dialog_webdav_server.xml @@ -28,10 +28,61 @@ app:popupTheme="@style/AppTheme.PopupOverlay" app:titleTextAppearance="@style/ToolbarTitle" /> + + + + + + + + + + + + + + + + + + + android:overScrollMode="ifContentScrolls" + tools:ignore="SpeakableTextPresentCheck"> + + + WEBDAV + + Text Audio