From 2e1cd7426d77f2baead45b68984076f4ab330381 Mon Sep 17 00:00:00 2001 From: Hicham Boushaba Date: Mon, 9 Jan 2023 17:14:02 +0100 Subject: [PATCH 1/4] Add error screen for application passwords unavailability --- ...licationPasswordsDisabledDialogFragment.kt | 35 +++++++++++++++++++ .../LoginSiteCredentialsFragment.kt | 5 +++ .../LoginSiteCredentialsViewModel.kt | 11 +++++- WooCommerce/src/main/res/values/strings.xml | 2 ++ 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/error/ApplicationPasswordsDisabledDialogFragment.kt diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/error/ApplicationPasswordsDisabledDialogFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/error/ApplicationPasswordsDisabledDialogFragment.kt new file mode 100644 index 000000000000..91998b6f8d61 --- /dev/null +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/error/ApplicationPasswordsDisabledDialogFragment.kt @@ -0,0 +1,35 @@ +package com.woocommerce.android.ui.login.error + +import androidx.core.os.bundleOf +import androidx.fragment.app.setFragmentResult +import com.woocommerce.android.R +import com.woocommerce.android.support.help.HelpOrigin +import com.woocommerce.android.ui.login.error.base.LoginBaseErrorDialogFragment +import com.woocommerce.android.util.ChromeCustomTabUtils + +class ApplicationPasswordsDisabledDialogFragment : LoginBaseErrorDialogFragment() { + companion object { + private const val SITE_URL_KEY = "site-url" + private const val APPLICATION_PASSWORDS_GUIDE = + "https://make.wordpress.org/core/2020/11/05/application-passwords-integration-guide/" + + fun newInstance(siteUrl: String) = ApplicationPasswordsDisabledDialogFragment().apply { + arguments = bundleOf(SITE_URL_KEY to siteUrl) + } + } + + override val text: CharSequence + get() = getString(R.string.login_application_passwords_unavailable, requireArguments().getString(SITE_URL_KEY)) + override val helpOrigin: HelpOrigin + get() = HelpOrigin.LOGIN_SITE_ADDRESS + + override val inlineButtons: List + get() = listOf( + LoginErrorButton( + title = R.string.login_application_passwords_help, + onClick = { + ChromeCustomTabUtils.launchUrl(requireContext(), APPLICATION_PASSWORDS_GUIDE) + } + ) + ) +} diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/sitecredentials/LoginSiteCredentialsFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/sitecredentials/LoginSiteCredentialsFragment.kt index 958bc2904dee..807b15f9c60a 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/sitecredentials/LoginSiteCredentialsFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/sitecredentials/LoginSiteCredentialsFragment.kt @@ -11,8 +11,10 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import com.woocommerce.android.ui.base.UIMessageResolver import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground +import com.woocommerce.android.ui.login.error.ApplicationPasswordsDisabledDialogFragment import com.woocommerce.android.ui.login.error.notwoo.LoginNotWooDialogFragment import com.woocommerce.android.ui.login.sitecredentials.LoginSiteCredentialsViewModel.LoggedIn +import com.woocommerce.android.ui.login.sitecredentials.LoginSiteCredentialsViewModel.ShowApplicationPasswordsUnavailableScreen import com.woocommerce.android.ui.login.sitecredentials.LoginSiteCredentialsViewModel.ShowNonWooErrorScreen import com.woocommerce.android.ui.login.sitecredentials.LoginSiteCredentialsViewModel.ShowResetPasswordScreen import com.woocommerce.android.viewmodel.MultiLiveEvent.Event.Exit @@ -69,6 +71,9 @@ class LoginSiteCredentialsFragment : Fragment() { is ShowResetPasswordScreen -> loginListener.forgotPassword(it.siteAddress) is ShowNonWooErrorScreen -> LoginNotWooDialogFragment.newInstance(it.siteAddress) .show(childFragmentManager, LoginNotWooDialogFragment.TAG) + is ShowApplicationPasswordsUnavailableScreen -> ApplicationPasswordsDisabledDialogFragment + .newInstance(it.siteAddress) + .show(childFragmentManager, LoginNotWooDialogFragment.TAG) is ShowSnackbar -> uiMessageResolver.showSnack(it.message) is ShowUiStringSnackbar -> uiMessageResolver.showSnack(it.message) is Exit -> requireActivity().onBackPressedDispatcher.onBackPressed() diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/sitecredentials/LoginSiteCredentialsViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/sitecredentials/LoginSiteCredentialsViewModel.kt index e07328f2ecbe..beb43148bd32 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/sitecredentials/LoginSiteCredentialsViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/sitecredentials/LoginSiteCredentialsViewModel.kt @@ -22,7 +22,9 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.Parcelize @@ -46,7 +48,8 @@ class LoginSiteCredentialsViewModel @Inject constructor( private val wpApiSiteRepository: WPApiSiteRepository, private val selectedSite: SelectedSite, private val loginAnalyticsListener: LoginAnalyticsListener, - private val resourceProvider: ResourceProvider + private val resourceProvider: ResourceProvider, + private val applicationPasswordsNotifier: ApplicationPasswordsNotifier ) : ScopedViewModel(savedStateHandle) { companion object { const val SITE_ADDRESS_KEY = "site-address" @@ -77,6 +80,11 @@ class LoginSiteCredentialsViewModel @Inject constructor( init { loginAnalyticsListener.trackUsernamePasswordFormViewed() + applicationPasswordsNotifier.featureUnavailableEvents + .onEach { + triggerEvent(ShowApplicationPasswordsUnavailableScreen(siteAddress)) + } + .launchIn(this) } fun onUsernameChanged(username: String) { @@ -193,4 +201,5 @@ class LoginSiteCredentialsViewModel @Inject constructor( data class LoggedIn(val localSiteId: Int) : MultiLiveEvent.Event() data class ShowResetPasswordScreen(val siteAddress: String) : MultiLiveEvent.Event() data class ShowNonWooErrorScreen(val siteAddress: String) : MultiLiveEvent.Event() + data class ShowApplicationPasswordsUnavailableScreen(val siteAddress: String) : MultiLiveEvent.Event() } diff --git a/WooCommerce/src/main/res/values/strings.xml b/WooCommerce/src/main/res/values/strings.xml index 2085e7412cbb..ef60d23ada97 100644 --- a/WooCommerce/src/main/res/values/strings.xml +++ b/WooCommerce/src/main/res/values/strings.xml @@ -335,6 +335,7 @@ Try connecting again to access your store. Continue connection Exit Without Connecting + It looks like Application Passwords feature is disabled in your site %1$s.\n Please enable it to use the WooCommerce app.