From 2ca3d152d144fdd49e0f049a777540a835f2b120 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 18 Mar 2024 14:05:49 +0100 Subject: [PATCH] Restored initial login form on assistant landing page --- .../ui/assistant/fragment/LandingFragment.kt | 49 +++++++++++++ .../viewmodel/AccountLoginViewModel.kt | 2 +- .../assistant/viewmodel/LandingViewModel.kt | 36 +--------- .../res/layout/assistant_landing_fragment.xml | 72 ++++++++++++++++++- .../res/navigation/assistant_nav_graph.xml | 3 + 5 files changed, 123 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/LandingFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/LandingFragment.kt index 0d6947b25..6179f3ebd 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/LandingFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/LandingFragment.kt @@ -27,16 +27,21 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread import androidx.fragment.app.Fragment +import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.navGraphViewModels +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.AssistantLandingFragmentBinding +import org.linphone.ui.assistant.AssistantActivity import org.linphone.ui.assistant.model.AcceptConditionsAndPolicyDialogModel import org.linphone.ui.assistant.viewmodel.LandingViewModel import org.linphone.utils.DialogUtils +import org.linphone.utils.PhoneNumberUtils @UiThread class LandingFragment : Fragment() { @@ -65,6 +70,14 @@ class LandingFragment : Fragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel + coreContext.postOnCoreThread { + val dialPlan = PhoneNumberUtils.getDeviceDialPlan(requireContext()) + if (dialPlan != null) { + viewModel.internationalPrefix.postValue(dialPlan.countryCallingCode) + viewModel.internationalPrefixIsoCountryCode.postValue(dialPlan.isoCountryCode) + } + } + binding.setBackClickListener { requireActivity().finish() } @@ -90,6 +103,42 @@ class LandingFragment : Fragment() { } } + binding.setForgottenPasswordClickListener { + val url = getString(R.string.web_platform_forgotten_password_url) + try { + val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + startActivity(browserIntent) + } catch (ise: IllegalStateException) { + Log.e( + "$TAG Can't start ACTION_VIEW intent for URL [$url], IllegalStateException: $ise" + ) + } + } + + viewModel.showPassword.observe(viewLifecycleOwner) { + lifecycleScope.launch { + delay(50) + binding.password.setSelection(binding.password.text?.length ?: 0) + } + } + + viewModel.accountLoggedInEvent.observe(viewLifecycleOwner) { + it.consume { + Log.i("$TAG Account successfully logged-in, go to profile mode fragment") + val action = LandingFragmentDirections.actionLandingFragmentToProfileModeFragment() + findNavController().navigate(action) + } + } + + viewModel.accountLoginErrorEvent.observe(viewLifecycleOwner) { + it.consume { message -> + (requireActivity() as AssistantActivity).showRedToast( + message, + R.drawable.warning_circle + ) + } + } + viewModel.redirectToDigestAuthEvent.observe(viewLifecycleOwner) { it.consume { address -> goToLoginFragment(address) diff --git a/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountLoginViewModel.kt b/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountLoginViewModel.kt index fde2be2fd..359a18d69 100644 --- a/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountLoginViewModel.kt +++ b/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountLoginViewModel.kt @@ -38,7 +38,7 @@ import org.linphone.core.tools.Log import org.linphone.utils.AppUtils import org.linphone.utils.Event -class AccountLoginViewModel @UiThread constructor() : ViewModel() { +open class AccountLoginViewModel @UiThread constructor() : ViewModel() { companion object { private const val TAG = "[Account Login ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/assistant/viewmodel/LandingViewModel.kt b/app/src/main/java/org/linphone/ui/assistant/viewmodel/LandingViewModel.kt index a361506b4..5c523b918 100644 --- a/app/src/main/java/org/linphone/ui/assistant/viewmodel/LandingViewModel.kt +++ b/app/src/main/java/org/linphone/ui/assistant/viewmodel/LandingViewModel.kt @@ -21,22 +21,17 @@ package org.linphone.ui.assistant.viewmodel import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences -import org.linphone.core.Factory -import org.linphone.core.tools.Log import org.linphone.utils.Event -class LandingViewModel @UiThread constructor() : ViewModel() { +class LandingViewModel @UiThread constructor() : AccountLoginViewModel() { companion object { private const val TAG = "[Account Login ViewModel]" } val showBackButton = MutableLiveData() - val sipIdentity = MutableLiveData() - val hideCreateAccount = MutableLiveData() val hideScanQrCode = MutableLiveData() @@ -63,33 +58,4 @@ class LandingViewModel @UiThread constructor() : ViewModel() { conditionsAndPrivacyPolicyAccepted = corePreferences.conditionsAndPrivacyPolicyAccepted } } - - @UiThread - fun login() { - coreContext.postOnCoreThread { - var identity = sipIdentity.value.orEmpty().trim() - if (!identity.startsWith("sip:")) { - identity = "sip:$identity" - } - if (!identity.contains("@")) { - identity = "$identity@${corePreferences.defaultDomain}" - } - val identityAddress = Factory.instance().createAddress(identity) - if (identityAddress == null) { - // TODO: FIXME: show error - Log.e("$TAG Can't parse [$identity] as Address!") - return@postOnCoreThread - } - - // TODO: SSO or password auth? - if (identityAddress.domain == corePreferences.defaultDomain) { - Log.i("$TAG Address matches default domain, using digest authentication") - redirectToDigestAuthEvent.postValue(Event(identityAddress.asStringUriOnly())) - } else { - Log.i("$TAG Address doesn't match default domain, using Single Sign On") - // TODO FIXME: use username or full SIP address as login? - redirectToSingleSignOnEvent.postValue(Event(identityAddress.username.orEmpty())) - } - } - } } diff --git a/app/src/main/res/layout/assistant_landing_fragment.xml b/app/src/main/res/layout/assistant_landing_fragment.xml index 1b48c4e78..39c719f89 100644 --- a/app/src/main/res/layout/assistant_landing_fragment.xml +++ b/app/src/main/res/layout/assistant_landing_fragment.xml @@ -8,6 +8,9 @@ + @@ -102,9 +105,54 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"/> + + + + + + + + + app:layout_constraintTop_toBottomOf="@id/forgotten_password"/> +