From 6033a74d2ab57220ae6310ec2f90f3420fbc9677 Mon Sep 17 00:00:00 2001 From: Annabella Koch Date: Thu, 6 Jun 2024 11:49:42 -0700 Subject: [PATCH 1/4] Fix issue with enter address manually button --- .../addresselement/AddressElementNavigator.kt | 4 ++++ .../addresselement/AutocompleteViewModel.kt | 2 ++ .../addresselement/InputAddressViewModel.kt | 22 +++++++++++++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/paymentsheet/src/main/java/com/stripe/android/paymentsheet/addresselement/AddressElementNavigator.kt b/paymentsheet/src/main/java/com/stripe/android/paymentsheet/addresselement/AddressElementNavigator.kt index 938714a007e..b54bc7fecf8 100644 --- a/paymentsheet/src/main/java/com/stripe/android/paymentsheet/addresselement/AddressElementNavigator.kt +++ b/paymentsheet/src/main/java/com/stripe/android/paymentsheet/addresselement/AddressElementNavigator.kt @@ -41,4 +41,8 @@ internal class AddressElementNavigator @Inject constructor() { } } } + + companion object { + internal const val FORCE_EXPANDED_FORM_KEY = "force_expanded_form" + } } diff --git a/paymentsheet/src/main/java/com/stripe/android/paymentsheet/addresselement/AutocompleteViewModel.kt b/paymentsheet/src/main/java/com/stripe/android/paymentsheet/addresselement/AutocompleteViewModel.kt index a3e810a4232..4243e2314b3 100644 --- a/paymentsheet/src/main/java/com/stripe/android/paymentsheet/addresselement/AutocompleteViewModel.kt +++ b/paymentsheet/src/main/java/com/stripe/android/paymentsheet/addresselement/AutocompleteViewModel.kt @@ -7,6 +7,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import com.stripe.android.paymentsheet.PaymentSheet +import com.stripe.android.paymentsheet.addresselement.AddressElementNavigator.Companion.FORCE_EXPANDED_FORM_KEY import com.stripe.android.paymentsheet.addresselement.analytics.AddressLauncherEventReporter import com.stripe.android.paymentsheet.injection.AutocompleteViewModelSubcomponent import com.stripe.android.ui.core.elements.autocomplete.PlacesClientProxy @@ -150,6 +151,7 @@ internal class AutocompleteViewModel @Inject constructor( } fun onEnterAddressManually() { + navigator.setResult(FORCE_EXPANDED_FORM_KEY, true) setResultAndGoBack( AddressDetails( address = PaymentSheet.Address( diff --git a/paymentsheet/src/main/java/com/stripe/android/paymentsheet/addresselement/InputAddressViewModel.kt b/paymentsheet/src/main/java/com/stripe/android/paymentsheet/addresselement/InputAddressViewModel.kt index c02cc1a45fa..539ed94edf8 100644 --- a/paymentsheet/src/main/java/com/stripe/android/paymentsheet/addresselement/InputAddressViewModel.kt +++ b/paymentsheet/src/main/java/com/stripe/android/paymentsheet/addresselement/InputAddressViewModel.kt @@ -10,6 +10,7 @@ import com.stripe.android.paymentsheet.injection.InputAddressViewModelSubcompone import com.stripe.android.ui.core.elements.LayoutSpec import com.stripe.android.uicore.elements.IdentifierSpec import com.stripe.android.uicore.forms.FormFieldEntry +import com.stripe.android.uicore.utils.combineAsStateFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch @@ -25,6 +26,9 @@ internal class InputAddressViewModel @Inject constructor( private val _collectedAddress = MutableStateFlow(args.config?.address) val collectedAddress: StateFlow = _collectedAddress + private val _forceExpandedForm = MutableStateFlow(false) + private val forceExpandedForm: StateFlow = _forceExpandedForm + private val _formController = MutableStateFlow(null) val formController: StateFlow = _formController @@ -50,7 +54,21 @@ internal class InputAddressViewModel @Inject constructor( } viewModelScope.launch { - collectedAddress.collect { addressDetails -> + navigator.getResultFlow( + AddressElementNavigator.FORCE_EXPANDED_FORM_KEY + )?.collect { + _forceExpandedForm.emit(it) + } + } + + viewModelScope.launch { + combineAsStateFlow(collectedAddress, forceExpandedForm) { collectedAddress, forceExpandedForm -> + Pair( + collectedAddress, + forceExpandedForm + ) + }.collect { (addressDetails, forceExpandedFormNullable) -> + val forceExpandedForm = forceExpandedFormNullable ?: false val initialValues: Map = addressDetails ?.toIdentifierMap() ?: emptyMap() @@ -59,7 +77,7 @@ internal class InputAddressViewModel @Inject constructor( .stripeIntent(null) .merchantName("") .shippingValues(null) - .formSpec(buildFormSpec(addressDetails?.address?.line1 == null)) + .formSpec(buildFormSpec(!forceExpandedForm && addressDetails?.address?.line1 == null)) .initialValues(initialValues) .build().formController } From 7e796f19b54fe2b55461f5173393551250524f8b Mon Sep 17 00:00:00 2001 From: Annabella Koch Date: Thu, 6 Jun 2024 11:53:09 -0700 Subject: [PATCH 2/4] name param --- .../paymentsheet/addresselement/InputAddressViewModel.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/paymentsheet/src/main/java/com/stripe/android/paymentsheet/addresselement/InputAddressViewModel.kt b/paymentsheet/src/main/java/com/stripe/android/paymentsheet/addresselement/InputAddressViewModel.kt index 539ed94edf8..b43333649b9 100644 --- a/paymentsheet/src/main/java/com/stripe/android/paymentsheet/addresselement/InputAddressViewModel.kt +++ b/paymentsheet/src/main/java/com/stripe/android/paymentsheet/addresselement/InputAddressViewModel.kt @@ -77,7 +77,11 @@ internal class InputAddressViewModel @Inject constructor( .stripeIntent(null) .merchantName("") .shippingValues(null) - .formSpec(buildFormSpec(!forceExpandedForm && addressDetails?.address?.line1 == null)) + .formSpec( + buildFormSpec( + condensedForm = !forceExpandedForm && addressDetails?.address?.line1 == null + ) + ) .initialValues(initialValues) .build().formController } From e37479274ee638c1beb4d7ac5ac5df96b275f3c2 Mon Sep 17 00:00:00 2001 From: Annabella Koch Date: Thu, 6 Jun 2024 11:54:24 -0700 Subject: [PATCH 3/4] Update CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1df82e35584..ddcb467284c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## XX.XX.XX - 20XX-XX-XX +### AddressElement +* [FIXED][8596](https://github.com/stripe/stripe-android/pull/8596) Fixed issue where "Enter address manually" button only worked the first time it was clicked. + ## 20.44.2 - 2024-06-03 ### Identity From fae4b2e12861915e13deeed3c55bc491c3f692c5 Mon Sep 17 00:00:00 2001 From: Annabella Koch Date: Thu, 6 Jun 2024 14:59:25 -0700 Subject: [PATCH 4/4] fix tests --- .../paymentsheet/addresselement/InputAddressViewModelTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/paymentsheet/src/test/java/com/stripe/android/paymentsheet/addresselement/InputAddressViewModelTest.kt b/paymentsheet/src/test/java/com/stripe/android/paymentsheet/addresselement/InputAddressViewModelTest.kt index 3aad5e87cf4..2b96cdf2692 100644 --- a/paymentsheet/src/test/java/com/stripe/android/paymentsheet/addresselement/InputAddressViewModelTest.kt +++ b/paymentsheet/src/test/java/com/stripe/android/paymentsheet/addresselement/InputAddressViewModelTest.kt @@ -79,7 +79,7 @@ class InputAddressViewModelTest { fun `autocomplete address passed is collected to start`() = runTest(UnconfinedTestDispatcher()) { val expectedAddress = AddressDetails(name = "skyler", address = PaymentSheet.Address(country = "US")) val flow = MutableStateFlow(expectedAddress) - whenever(navigator.getResultFlow(any())).thenReturn(flow) + whenever(navigator.getResultFlow(AddressDetails.KEY)).thenReturn(flow) val viewModel = createViewModel() assertThat(viewModel.collectedAddress.value).isEqualTo(expectedAddress) @@ -89,7 +89,7 @@ class InputAddressViewModelTest { fun `takes only fields in new address`() = runTest(UnconfinedTestDispatcher()) { val usAddress = AddressDetails(name = "skyler", address = PaymentSheet.Address(country = "US")) val flow = MutableStateFlow(usAddress) - whenever(navigator.getResultFlow(any())).thenReturn(flow) + whenever(navigator.getResultFlow(AddressDetails.KEY)).thenReturn(flow) val viewModel = createViewModel() assertThat(viewModel.collectedAddress.value).isEqualTo(usAddress)