Files
gotify-android-client/app/src/main/kotlin/com/github/gotify/login/AdvancedDialog.kt
2024-06-11 21:12:06 +02:00

138 lines
5.2 KiB
Kotlin

package com.github.gotify.login
import android.content.Context
import android.view.LayoutInflater
import android.widget.CompoundButton
import androidx.core.widget.doOnTextChanged
import com.github.gotify.R
import com.github.gotify.databinding.AdvancedSettingsDialogBinding
import com.google.android.material.dialog.MaterialAlertDialogBuilder
internal class AdvancedDialog(
private val context: Context,
private val layoutInflater: LayoutInflater
) {
private lateinit var binding: AdvancedSettingsDialogBinding
private var onCheckedChangeListener: CompoundButton.OnCheckedChangeListener? = null
private lateinit var onClickSelectCaCertificate: Runnable
private lateinit var onClickRemoveCaCertificate: Runnable
private lateinit var onClickSelectClientCertificate: Runnable
private lateinit var onClickRemoveClientCertificate: Runnable
private lateinit var onClose: (password: String) -> Unit
fun onDisableSSLChanged(
onCheckedChangeListener: CompoundButton.OnCheckedChangeListener?
): AdvancedDialog {
this.onCheckedChangeListener = onCheckedChangeListener
return this
}
fun onClickSelectCaCertificate(onClickSelectCaCertificate: Runnable): AdvancedDialog {
this.onClickSelectCaCertificate = onClickSelectCaCertificate
return this
}
fun onClickRemoveCaCertificate(onClickRemoveCaCertificate: Runnable): AdvancedDialog {
this.onClickRemoveCaCertificate = onClickRemoveCaCertificate
return this
}
fun onClickSelectClientCertificate(onClickSelectClientCertificate: Runnable): AdvancedDialog {
this.onClickSelectClientCertificate = onClickSelectClientCertificate
return this
}
fun onClickRemoveClientCertificate(onClickRemoveClientCertificate: Runnable): AdvancedDialog {
this.onClickRemoveClientCertificate = onClickRemoveClientCertificate
return this
}
fun onClose(onClose: (password: String) -> Unit): AdvancedDialog {
this.onClose = onClose
return this
}
fun show(
disableSSL: Boolean,
caCertPath: String? = null,
caCertCN: String?,
clientCertPath: String? = null,
clientCertPassword: String?
): AdvancedDialog {
binding = AdvancedSettingsDialogBinding.inflate(layoutInflater)
binding.disableSSL.isChecked = disableSSL
binding.disableSSL.setOnCheckedChangeListener(onCheckedChangeListener)
if (!clientCertPassword.isNullOrEmpty()) {
binding.clientCertPasswordEdittext.setText(clientCertPassword)
}
binding.clientCertPasswordEdittext.doOnTextChanged { _, _, _, _ ->
if (binding.selectedClientCert.text.toString() ==
context.getString(R.string.certificate_found)
) {
showPasswordMissing(binding.clientCertPasswordEdittext.text.toString().isEmpty())
}
}
if (caCertPath == null) {
showSelectCaCertificate()
} else {
showRemoveCaCertificate(caCertCN!!)
}
if (clientCertPath == null) {
showSelectClientCertificate()
} else {
showRemoveClientCertificate()
}
MaterialAlertDialogBuilder(context)
.setView(binding.root)
.setTitle(R.string.advanced_settings)
.setPositiveButton(context.getString(R.string.done), null)
.setOnDismissListener {
onClose(binding.clientCertPasswordEdittext.text.toString())
}
.show()
return this
}
private fun showSelectCaCertificate() {
binding.toggleCaCert.setText(R.string.select_ca_certificate)
binding.toggleCaCert.setOnClickListener { onClickSelectCaCertificate.run() }
binding.selectedCaCert.setText(R.string.no_certificate_selected)
}
fun showRemoveCaCertificate(certificateCN: String) {
binding.toggleCaCert.setText(R.string.remove_ca_certificate)
binding.toggleCaCert.setOnClickListener {
showSelectCaCertificate()
onClickRemoveCaCertificate.run()
}
binding.selectedCaCert.text = certificateCN
}
private fun showSelectClientCertificate() {
binding.toggleClientCert.setText(R.string.select_client_certificate)
binding.toggleClientCert.setOnClickListener { onClickSelectClientCertificate.run() }
binding.selectedClientCert.setText(R.string.no_certificate_selected)
showPasswordMissing(false)
binding.clientCertPasswordEdittext.text = null
}
fun showRemoveClientCertificate() {
binding.toggleClientCert.setText(R.string.remove_client_certificate)
binding.toggleClientCert.setOnClickListener {
showSelectClientCertificate()
onClickRemoveClientCertificate.run()
}
binding.selectedClientCert.setText(R.string.certificate_found)
showPasswordMissing(binding.clientCertPasswordEdittext.text.toString().isEmpty())
}
private fun showPasswordMissing(toggled: Boolean) {
val error = if (toggled) {
context.getString(R.string.client_cert_password_missing)
} else {
null
}
binding.clientCertPassword.error = error
}
}