From 5a537d3ac0e53fe9e914d967ccc1edd26f411ac4 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 15 Sep 2026 10:46:50 -0400 Subject: [PATCH] Add payment unavailable support article link. --- .../org/signal/registration/RegistrationNavigation.kt | 2 ++ .../signalloginpayment/SignalLoginPaymentScreen.kt | 2 +- .../SignalLoginPaymentScreenActions.kt | 3 +++ .../signalloginpayment/SignalLoginPaymentScreenEvents.kt | 3 +++ .../signalloginpayment/SignalLoginPaymentViewModel.kt | 4 ++++ .../SignalLoginPaymentViewModelTest.kt | 9 +++++++++ 6 files changed, 22 insertions(+), 1 deletion(-) diff --git a/feature/registration/src/main/java/org/signal/registration/RegistrationNavigation.kt b/feature/registration/src/main/java/org/signal/registration/RegistrationNavigation.kt index 11aa719df5..f1771618e5 100644 --- a/feature/registration/src/main/java/org/signal/registration/RegistrationNavigation.kt +++ b/feature/registration/src/main/java/org/signal/registration/RegistrationNavigation.kt @@ -743,6 +743,8 @@ private fun EntryProviderScope.navigationEntries( when (action) { SignalLoginPaymentScreenActions.OpenLearnMoreArticle -> openUrl(context, "https://support.signal.org/hc/articles/11197884108826") + SignalLoginPaymentScreenActions.OpenPaymentUnavailableArticle -> openUrl(context, "https://support.signal.org/hc/articles/11228705649690") + is SignalLoginPaymentScreenActions.LaunchPurchaseFlow -> { purchaseScope.launch { val result = if (activity != null) { diff --git a/feature/registration/src/main/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentScreen.kt b/feature/registration/src/main/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentScreen.kt index 76c928e296..e283702d1d 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentScreen.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentScreen.kt @@ -272,7 +272,7 @@ private fun PaymentUnavailableDialog( ) { val onDismiss = { onEvent(SignalLoginPaymentScreenEvents.PaymentUnavailableDialogDismissed) } val onMakeAvailable = { onEvent(SignalLoginPaymentScreenEvents.MakeGooglePlayServicesAvailableClicked) } - val onLearnMore = { onEvent(SignalLoginPaymentScreenEvents.LearnMoreClicked) } + val onLearnMore = { onEvent(SignalLoginPaymentScreenEvents.PaymentUnavailableLearnMoreClicked) } val dialogModifier = Modifier.testTag(TestTags.SIGNAL_LOGIN_PAYMENT_UNAVAILABLE_DIALOG) diff --git a/feature/registration/src/main/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentScreenActions.kt b/feature/registration/src/main/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentScreenActions.kt index ac7d92e5fd..5f2fc5c8aa 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentScreenActions.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentScreenActions.kt @@ -11,6 +11,9 @@ sealed interface SignalLoginPaymentScreenActions { /** Open the article explaining Signal Login. */ data object OpenLearnMoreArticle : SignalLoginPaymentScreenActions + /** Open the article explaining why Google Play is required to buy a Signal Login. */ + data object OpenPaymentUnavailableArticle : SignalLoginPaymentScreenActions + /** * Launch the Google Play purchase sheet. The UI layer owns the activity, launches [launcher], and reports the * outcome back as [SignalLoginPaymentScreenEvents.PurchaseFlowCompleted]. diff --git a/feature/registration/src/main/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentScreenEvents.kt index 5b2342c5ba..bf312e4c12 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentScreenEvents.kt @@ -20,6 +20,9 @@ sealed class SignalLoginPaymentScreenEvents { /** The user tapped the "learn more" link in the description. */ data object LearnMoreClicked : SignalLoginPaymentScreenEvents() + /** The user tapped "learn more" on the dialog explaining that Google Play cannot take a payment. */ + data object PaymentUnavailableLearnMoreClicked : SignalLoginPaymentScreenEvents() + /** The user selected one of the two options. */ data class OptionSelected(val option: SignalLoginPaymentState.Option) : SignalLoginPaymentScreenEvents() diff --git a/feature/registration/src/main/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentViewModel.kt b/feature/registration/src/main/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentViewModel.kt index ed1f1b248e..98bfc004d9 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentViewModel.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentViewModel.kt @@ -145,6 +145,10 @@ class SignalLoginPaymentViewModel( _actions.trySend(SignalLoginPaymentScreenActions.OpenLearnMoreArticle) } + is SignalLoginPaymentScreenEvents.PaymentUnavailableLearnMoreClicked -> { + _actions.trySend(SignalLoginPaymentScreenActions.OpenPaymentUnavailableArticle) + } + is SignalLoginPaymentScreenEvents.OptionSelected -> { if (event.option == SignalLoginPaymentState.Option.Purchase && !state.isPurchaseOptionEnabled) { Log.w(TAG, "[OptionSelected] Ignoring a purchase selection that cannot be acted on.") diff --git a/feature/registration/src/test/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentViewModelTest.kt b/feature/registration/src/test/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentViewModelTest.kt index 5be390e4ce..6f2f7ae361 100644 --- a/feature/registration/src/test/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentViewModelTest.kt +++ b/feature/registration/src/test/java/org/signal/registration/screens/signalloginpayment/SignalLoginPaymentViewModelTest.kt @@ -91,6 +91,15 @@ class SignalLoginPaymentViewModelTest { assertThat(actions).containsExactly(SignalLoginPaymentScreenActions.OpenLearnMoreArticle) } + @Test + fun `PaymentUnavailableLearnMoreClicked emits an action to open the payment unavailable article`() = runTest(testDispatcher) { + val actions = collectActions() + + viewModel.applyEvent(SignalLoginPaymentState(), SignalLoginPaymentScreenEvents.PaymentUnavailableLearnMoreClicked, parentEventEmitter) {} + + assertThat(actions).containsExactly(SignalLoginPaymentScreenActions.OpenPaymentUnavailableArticle) + } + @Test fun `Initialize loads the price from the billing library`() = runTest(testDispatcher) { coEvery { mockRepository.getSignalLoginPrice() } returns SignalLoginPriceResult.Available("$1.99")