From baf2c1075552acb7e6009f8c84ffbb75b3ab63ea Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 1 Apr 2020 10:55:43 +0200 Subject: [PATCH] Improved remote provisioning wrong url format error display --- .../fragments/RemoteProvisioningFragment.kt | 11 ----------- .../viewmodels/RemoteProvisioningViewModel.kt | 19 ++++++++++++++++++- .../org/linphone/utils/DataBindingUtils.kt | 16 ++++++++++++++++ ...assistant_remote_provisioning_fragment.xml | 9 ++++----- 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/RemoteProvisioningFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/RemoteProvisioningFragment.kt index 2125479da..772287922 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/RemoteProvisioningFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/RemoteProvisioningFragment.kt @@ -20,7 +20,6 @@ package org.linphone.activities.assistant.fragments import android.os.Bundle -import android.util.Patterns import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -61,16 +60,6 @@ class RemoteProvisioningFragment : Fragment() { viewModel = ViewModelProvider(this).get(RemoteProvisioningViewModel::class.java) binding.viewModel = viewModel - binding.setApplyClickListener { - val url = viewModel.urlToFetch.value.orEmpty() - if (Patterns.WEB_URL.matcher(url).matches()) { - viewModel.fetchAndApply(url) - } else { - val activity = requireActivity() as AssistantActivity - activity.showSnackBar(R.string.assistant_remote_provisioning_wrong_format) - } - } - binding.setQrCodeClickListener { if (findNavController().currentDestination?.id == R.id.remoteProvisioningFragment) { findNavController().navigate(R.id.action_remoteProvisioningFragment_to_qrCodeFragment) diff --git a/app/src/main/java/org/linphone/activities/assistant/viewmodels/RemoteProvisioningViewModel.kt b/app/src/main/java/org/linphone/activities/assistant/viewmodels/RemoteProvisioningViewModel.kt index 7da8e9b87..6a09416e3 100644 --- a/app/src/main/java/org/linphone/activities/assistant/viewmodels/RemoteProvisioningViewModel.kt +++ b/app/src/main/java/org/linphone/activities/assistant/viewmodels/RemoteProvisioningViewModel.kt @@ -19,6 +19,7 @@ */ package org.linphone.activities.assistant.viewmodels +import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext @@ -30,6 +31,9 @@ import org.linphone.utils.Event class RemoteProvisioningViewModel : ViewModel() { val urlToFetch = MutableLiveData() + val urlError = MutableLiveData() + + val fetchEnabled: MediatorLiveData = MediatorLiveData() val fetchInProgress = MutableLiveData() val fetchSuccessfulEvent = MutableLiveData>() @@ -50,6 +54,14 @@ class RemoteProvisioningViewModel : ViewModel() { init { fetchInProgress.value = false coreContext.core.addListener(listener) + + fetchEnabled.value = false + fetchEnabled.addSource(urlToFetch) { + fetchEnabled.value = isFetchEnabled() + } + fetchEnabled.addSource(urlError) { + fetchEnabled.value = isFetchEnabled() + } } override fun onCleared() { @@ -57,11 +69,16 @@ class RemoteProvisioningViewModel : ViewModel() { super.onCleared() } - fun fetchAndApply(url: String) { + fun fetchAndApply() { + val url = urlToFetch.value.orEmpty() coreContext.core.provisioningUri = url Log.w("[Remote Provisioning] Url set to [$url], restarting Core") fetchInProgress.value = true coreContext.core.stop() coreContext.core.start() } + + private fun isFetchEnabled(): Boolean { + return urlToFetch.value.orEmpty().isNotEmpty() && urlError.value.orEmpty().isEmpty() + } } diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index d0699e193..02c67a522 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -368,6 +368,22 @@ fun addEmailEditTextValidation(editText: EditText, enabled: Boolean) { }) } +@BindingAdapter("urlConfirmationValidation") +fun addUrlEditTextValidation(editText: EditText, enabled: Boolean) { + if (!enabled) return + editText.addTextChangedListener(object : TextWatcher { + override fun afterTextChanged(s: Editable?) { } + + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + if (!Patterns.WEB_URL.matcher(s).matches()) { + editText.error = editText.context.getString(R.string.assistant_remote_provisioning_wrong_format) + } + } + }) +} + @BindingAdapter("passwordConfirmationValidation") fun addPasswordConfirmationEditTextValidation(password: EditText, passwordConfirmation: EditText) { password.addTextChangedListener(object : TextWatcher { diff --git a/app/src/main/res/layout/assistant_remote_provisioning_fragment.xml b/app/src/main/res/layout/assistant_remote_provisioning_fragment.xml index 7b39d1080..e3eb4f849 100644 --- a/app/src/main/res/layout/assistant_remote_provisioning_fragment.xml +++ b/app/src/main/res/layout/assistant_remote_provisioning_fragment.xml @@ -5,9 +5,6 @@ - @@ -68,6 +65,8 @@ android:layout_height="wrap_content"/>