diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowFragment.kt index a490d61339..78580fde7a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowFragment.kt @@ -20,7 +20,6 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import kotlinx.coroutines.rx3.asFlowable import org.signal.core.util.getSerializableCompat -import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.backup.v2.MessageBackupTier import org.thoughtcrime.securesms.components.settings.app.subscription.donate.InAppPaymentCheckoutDelegate import org.thoughtcrime.securesms.compose.ComposeFragment @@ -81,17 +80,6 @@ class MessageBackupsFlowFragment : ComposeFragment(), InAppPaymentCheckoutDelega ) } - LaunchedEffect( - state.selectedMessageBackupTier, - state.selectedMessageBackupTierLabel, - state.availableBackupTypes - ) { - if (state.selectedMessageBackupTierLabel == null && state.selectedMessageBackupTier != null && state.availableBackupTypes.isNotEmpty()) { - val type = state.availableBackupTypes.firstOrNull { it.tier == state.selectedMessageBackupTier } ?: return@LaunchedEffect - viewModel.onMessageBackupTierUpdated(type.tier, getTypeLabel(type)) - } - } - Nav.Host( navController = navController, startDestination = state.startScreen.name @@ -133,7 +121,7 @@ class MessageBackupsFlowFragment : ComposeFragment(), InAppPaymentCheckoutDelega onMessageBackupsTierSelected = { tier -> val type = state.availableBackupTypes.first { it.tier == tier } - viewModel.onMessageBackupTierUpdated(tier, getTypeLabel(type)) + viewModel.onMessageBackupTierUpdated(tier) }, onNavigationClick = viewModel::goToPreviousStage, onReadMoreClicked = {}, @@ -164,13 +152,6 @@ class MessageBackupsFlowFragment : ComposeFragment(), InAppPaymentCheckoutDelega } } - private fun getTypeLabel(type: MessageBackupsType): String { - return when (type) { - is MessageBackupsType.Free -> requireContext().resources.getQuantityString(R.plurals.MessageBackupsTypeSelectionScreen__text_plus_d_days_of_media, type.mediaRetentionDays, type.mediaRetentionDays) - is MessageBackupsType.Paid -> requireContext().getString(R.string.MessageBackupsTypeSelectionScreen__text_plus_all_your_media) - } - } - override fun onUserLaunchedAnExternalApplication() = error("Not supported by this fragment.") override fun navigateToDonationPending(inAppPayment: InAppPaymentTable.InAppPayment) = error("Not supported by this fragment.") diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowState.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowState.kt index 96dd825735..844c761a41 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowState.kt @@ -12,7 +12,6 @@ import org.whispersystems.signalservice.api.backup.BackupKey data class MessageBackupsFlowState( val hasBackupSubscriberAvailable: Boolean = false, - val selectedMessageBackupTierLabel: String? = null, val selectedMessageBackupTier: MessageBackupTier? = SignalStore.backup.backupTier, val currentMessageBackupTier: MessageBackupTier? = SignalStore.backup.backupTier, val availableBackupTypes: List = emptyList(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowViewModel.kt index ad1adf818f..960e032f61 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsFlowViewModel.kt @@ -171,11 +171,10 @@ class MessageBackupsFlowViewModel( } } - fun onMessageBackupTierUpdated(messageBackupTier: MessageBackupTier, messageBackupTierLabel: String) { + fun onMessageBackupTierUpdated(messageBackupTier: MessageBackupTier) { internalStateFlow.update { it.copy( - selectedMessageBackupTier = messageBackupTier, - selectedMessageBackupTierLabel = messageBackupTierLabel + selectedMessageBackupTier = messageBackupTier ) } } @@ -207,7 +206,6 @@ class MessageBackupsFlowViewModel( endOfPeriod = null, inAppPaymentData = InAppPaymentData( badge = null, - label = state.selectedMessageBackupTierLabel!!, amount = paidFiat.toFiatValue(), level = SubscriptionsConfiguration.BACKUPS_LEVEL.toLong(), recipientId = Recipient.self().id.serialize(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowConfirmationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowConfirmationFragment.kt index a611ac1ab8..ec4292d250 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowConfirmationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowConfirmationFragment.kt @@ -115,7 +115,7 @@ class GiftFlowConfirmationFragment : val continueButton = requireView().findViewById(R.id.continue_button) continueButton.setOnClickListener { - lifecycleDisposable += viewModel.insertInAppPayment(requireContext()).subscribe { inAppPayment -> + lifecycleDisposable += viewModel.insertInAppPayment().subscribe { inAppPayment -> findNavController().safeNavigate( GiftFlowConfirmationFragmentDirections.actionGiftFlowConfirmationFragmentToGatewaySelectorBottomSheet( inAppPayment diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowRepository.kt index c0a672bc7f..dffc928405 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowRepository.kt @@ -1,11 +1,9 @@ package org.thoughtcrime.securesms.badges.gifts.flow -import android.content.Context import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.schedulers.Schedulers import org.signal.core.util.money.FiatMoney import org.signal.donations.InAppPaymentType -import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.badges.Badges import org.thoughtcrime.securesms.badges.models.Badge import org.thoughtcrime.securesms.components.settings.app.subscription.DonationSerializationHelper.toFiatValue @@ -25,7 +23,7 @@ import java.util.Locale */ class GiftFlowRepository { - fun insertInAppPayment(context: Context, giftSnapshot: GiftFlowState): Single { + fun insertInAppPayment(giftSnapshot: GiftFlowState): Single { return Single.fromCallable { SignalDatabase.inAppPayments.insert( type = InAppPaymentType.ONE_TIME_GIFT, @@ -34,7 +32,6 @@ class GiftFlowRepository { endOfPeriod = null, inAppPaymentData = InAppPaymentData( badge = Badges.toDatabaseBadge(giftSnapshot.giftBadge!!), - label = context.getString(R.string.preferences__one_time), amount = giftSnapshot.giftPrices[giftSnapshot.currency]!!.toFiatValue(), level = giftSnapshot.giftLevel!!, recipientId = giftSnapshot.recipient!!.id.serialize(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowViewModel.kt index 19e1aebb1e..fe7fb42777 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/gifts/flow/GiftFlowViewModel.kt @@ -1,6 +1,5 @@ package org.thoughtcrime.securesms.badges.gifts.flow -import android.content.Context import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers @@ -104,9 +103,9 @@ class GiftFlowViewModel( ) } - fun insertInAppPayment(context: Context): Single { + fun insertInAppPayment(): Single { val giftSnapshot = snapshot - return giftFlowRepository.insertInAppPayment(context, giftSnapshot) + return giftFlowRepository.insertInAppPayment(giftSnapshot) .doOnSuccess { inAppPayment -> store.update { it.copy(inAppPaymentId = inAppPayment.id) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/DonationsConfigurationExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/DonationsConfigurationExtensions.kt index 54f1f27265..09794929c2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/DonationsConfigurationExtensions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/DonationsConfigurationExtensions.kt @@ -24,7 +24,7 @@ private const val SEPA_DEBIT = "SEPA_DEBIT" * PAYPAL - PayPal * * @param level The subscription level to get amounts for - * @param paymentMethodAvailability Predicate object which checks whether different payment methods are availble. + * @param paymentMethodAvailability Predicate object which checks whether different payment methods are available. */ fun SubscriptionsConfiguration.getSubscriptionAmounts( level: Int, diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/InAppDonations.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/InAppDonations.kt index a1b6b4fe11..2f02bc3aee 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/InAppDonations.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/InAppDonations.kt @@ -1,7 +1,10 @@ package org.thoughtcrime.securesms.components.settings.app.subscription +import android.content.Context import org.signal.donations.InAppPaymentType import org.signal.donations.PaymentSourceType +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.database.model.InAppPaymentReceiptRecord import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.util.Environment @@ -100,4 +103,32 @@ object InAppDonations { fun isIDEALAvailbleForDonateToSignalType(inAppPaymentType: InAppPaymentType): Boolean { return inAppPaymentType != InAppPaymentType.ONE_TIME_GIFT && isIDEALAvailable() } + + /** + * Labels are utilized when displaying Google Play sheet and when displaying receipts. + */ + fun resolveLabel(context: Context, inAppPaymentType: InAppPaymentType, level: Long): String { + return when (inAppPaymentType) { + InAppPaymentType.UNKNOWN -> error("Unsupported type.") + InAppPaymentType.ONE_TIME_GIFT -> context.getString(R.string.DonationReceiptListFragment__donation_for_a_friend) + InAppPaymentType.ONE_TIME_DONATION -> context.getString(R.string.DonationReceiptListFragment__one_time) + InAppPaymentType.RECURRING_DONATION -> context.getString(R.string.InAppDonations__recurring_d, level) + InAppPaymentType.RECURRING_BACKUP -> error("Unsupported type.") + } + } + + /** + * Labels are utilized when displaying Google Play sheet and when displaying receipts. + */ + fun resolveLabel(context: Context, inAppPaymentReceiptRecord: InAppPaymentReceiptRecord): String { + val level = inAppPaymentReceiptRecord.subscriptionLevel + val type: InAppPaymentType = when (inAppPaymentReceiptRecord.type) { + InAppPaymentReceiptRecord.Type.RECURRING_BACKUP -> InAppPaymentType.RECURRING_BACKUP + InAppPaymentReceiptRecord.Type.RECURRING_DONATION -> InAppPaymentType.RECURRING_DONATION + InAppPaymentReceiptRecord.Type.ONE_TIME_DONATION -> InAppPaymentType.ONE_TIME_DONATION + InAppPaymentReceiptRecord.Type.ONE_TIME_GIFT -> InAppPaymentType.ONE_TIME_GIFT + } + + return resolveLabel(context, type, level.toLong()) + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/RecurringInAppPaymentRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/RecurringInAppPaymentRepository.kt index da0cf658b8..af08accd45 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/RecurringInAppPaymentRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/RecurringInAppPaymentRepository.kt @@ -80,7 +80,6 @@ object RecurringInAppPaymentRepository { Subscription( id = level.toString(), level = level, - name = levelConfig.name, badge = Badges.fromServiceBadge(levelConfig.badge), prices = config.getSubscriptionAmounts(level) ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalViewModel.kt index 1311bcf4aa..b37c98f02b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/DonateToSignalViewModel.kt @@ -206,7 +206,6 @@ class DonateToSignalViewModel( endOfPeriod = null, inAppPaymentData = InAppPaymentData( badge = snapshot.badge?.let { Badges.toDatabaseBadge(it) }, - label = snapshot.badge?.description ?: "", amount = amount.toFiatValue(), level = snapshot.level.toLong(), recipientId = Recipient.self().id.serialize(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/InAppPaymentCheckoutDelegate.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/InAppPaymentCheckoutDelegate.kt index 682bf49330..b683fbe97e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/InAppPaymentCheckoutDelegate.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/InAppPaymentCheckoutDelegate.kt @@ -160,7 +160,7 @@ class InAppPaymentCheckoutDelegate( viewModel.provideGatewayRequestForGooglePay(inAppPayment) inAppPaymentComponent.stripeRepository.requestTokenFromGooglePay( price = inAppPayment.data.amount!!.toFiatMoney(), - label = inAppPayment.data.label, + label = InAppDonations.resolveLabel(fragment.requireContext(), inAppPayment.type, inAppPayment.data.level), requestCode = InAppPaymentsRepository.getGooglePayRequestCode(inAppPayment.type) ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/stripe/Stripe3DSData.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/stripe/Stripe3DSData.kt index 33cc4dfeef..cad6a7734c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/stripe/Stripe3DSData.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/donate/stripe/Stripe3DSData.kt @@ -52,7 +52,6 @@ data class Stripe3DSData( InAppPaymentType.RECURRING_BACKUP -> ExternalLaunchTransactionState.GatewayRequest.InAppPaymentType.RECURRING_BACKUPS }, badge = inAppPayment.data.badge, - label = inAppPayment.data.label, price = inAppPayment.data.amount!!.amount, currencyCode = inAppPayment.data.amount.currencyCode, level = inAppPayment.data.level, @@ -92,7 +91,6 @@ data class Stripe3DSData( data = InAppPaymentData( paymentMethodType = PaymentSourceType.fromCode(proto.paymentSourceType).toPaymentMethodType(), badge = proto.gatewayRequest.badge, - label = proto.gatewayRequest.label, amount = FiatValue(amount = proto.gatewayRequest.price, currencyCode = proto.gatewayRequest.currencyCode), level = proto.gatewayRequest.level, recipientId = null, diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailFragment.kt index 7524181308..ed634f72d7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailFragment.kt @@ -8,6 +8,7 @@ import org.thoughtcrime.securesms.components.SignalProgressDialog import org.thoughtcrime.securesms.components.settings.DSLConfiguration import org.thoughtcrime.securesms.components.settings.DSLSettingsFragment import org.thoughtcrime.securesms.components.settings.DSLSettingsText +import org.thoughtcrime.securesms.components.settings.app.subscription.InAppDonations import org.thoughtcrime.securesms.components.settings.app.subscription.receipts.ReceiptImageRenderer import org.thoughtcrime.securesms.components.settings.configure import org.thoughtcrime.securesms.components.settings.models.SplashImage @@ -38,10 +39,9 @@ class DonationReceiptDetailFragment : DSLSettingsFragment(layoutId = R.layout.do viewModel.state.observe(viewLifecycleOwner) { state -> if (state.inAppPaymentReceiptRecord != null) { - adapter.submitList(getConfiguration(state.inAppPaymentReceiptRecord, state.subscriptionName).toMappingModelList()) - } + val subscriptionName = InAppDonations.resolveLabel(requireContext(), state.inAppPaymentReceiptRecord) + adapter.submitList(getConfiguration(state.inAppPaymentReceiptRecord, subscriptionName).toMappingModelList()) - if (state.inAppPaymentReceiptRecord != null && state.subscriptionName != null) { sharePngButton.isEnabled = true sharePngButton.setOnClickListener { progressDialog = SignalProgressDialog.show(requireContext()) @@ -49,7 +49,7 @@ class DonationReceiptDetailFragment : DSLSettingsFragment(layoutId = R.layout.do context = requireContext(), lifecycleOwner = viewLifecycleOwner, record = state.inAppPaymentReceiptRecord, - subscriptionName = state.subscriptionName, + subscriptionName = InAppDonations.resolveLabel(requireContext(), state.inAppPaymentReceiptRecord), callback = object : ReceiptImageRenderer.Callback { override fun onBitmapRendered() { progressDialog.dismiss() diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailRepository.kt index 86ce7fc1f8..db8a1277b8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailRepository.kt @@ -2,26 +2,10 @@ package org.thoughtcrime.securesms.components.settings.app.subscription.receipts import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.schedulers.Schedulers -import org.thoughtcrime.securesms.components.settings.app.subscription.getSubscriptionLevels import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.database.model.InAppPaymentReceiptRecord -import org.thoughtcrime.securesms.dependencies.AppDependencies -import java.util.Locale class DonationReceiptDetailRepository { - fun getSubscriptionLevelName(subscriptionLevel: Int): Single { - return Single - .fromCallable { - AppDependencies - .donationsService - .getDonationsConfiguration(Locale.getDefault()) - } - .flatMap { it.flattenResult() } - .map { it.getSubscriptionLevels()[subscriptionLevel] ?: throw Exception("Subscription level $subscriptionLevel not found") } - .map { it.name } - .subscribeOn(Schedulers.io()) - } - fun getDonationReceiptRecord(id: Long): Single { return Single.fromCallable { SignalDatabase.donationReceipts.getReceipt(id)!! diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailState.kt index 6acdfdcdf3..bf98f90f72 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailState.kt @@ -3,6 +3,5 @@ package org.thoughtcrime.securesms.components.settings.app.subscription.receipts import org.thoughtcrime.securesms.database.model.InAppPaymentReceiptRecord data class DonationReceiptDetailState( - val inAppPaymentReceiptRecord: InAppPaymentReceiptRecord? = null, - val subscriptionName: String? = null + val inAppPaymentReceiptRecord: InAppPaymentReceiptRecord? = null ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailViewModel.kt index 396b592db2..40f7e4ec30 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailViewModel.kt @@ -5,61 +5,32 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.disposables.CompositeDisposable -import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.kotlin.plusAssign import org.thoughtcrime.securesms.database.model.InAppPaymentReceiptRecord -import org.thoughtcrime.securesms.util.InternetConnectionObserver import org.thoughtcrime.securesms.util.livedata.Store class DonationReceiptDetailViewModel(id: Long, private val repository: DonationReceiptDetailRepository) : ViewModel() { private val store = Store(DonationReceiptDetailState()) private val disposables = CompositeDisposable() - private var networkDisposable: Disposable private val cachedRecord: Single = repository.getDonationReceiptRecord(id).cache() val state: LiveData = store.stateLiveData init { - networkDisposable = InternetConnectionObserver - .observe() - .distinctUntilChanged() - .subscribe { isConnected -> - if (isConnected) { - retry() - } - } - refresh() } - private fun retry() { - if (store.state.subscriptionName == null) { - refresh() - } - } - private fun refresh() { disposables.clear() disposables += cachedRecord.subscribe { record -> store.update { it.copy(inAppPaymentReceiptRecord = record) } } - - disposables += cachedRecord.flatMap { - if (it.subscriptionLevel > 0) { - repository.getSubscriptionLevelName(it.subscriptionLevel) - } else { - Single.just("") - } - }.subscribe { name -> - store.update { it.copy(subscriptionName = name) } - } } override fun onCleared() { disposables.clear() - networkDisposable.dispose() } class Factory(private val id: Long, private val repository: DonationReceiptDetailRepository) : ViewModelProvider.Factory { diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/InAppPaymentKeepAliveJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/InAppPaymentKeepAliveJob.kt index c41337f88c..1b72c8c527 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/InAppPaymentKeepAliveJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/InAppPaymentKeepAliveJob.kt @@ -221,23 +221,23 @@ class InAppPaymentKeepAliveJob private constructor( return null } - val (badge, label) = if (oldInAppPayment == null) { + val badge = if (oldInAppPayment == null) { info(type, "Old payment not found in database. Loading badge / label information from donations configuration.") val configuration = AppDependencies.donationsService.getDonationsConfiguration(Locale.getDefault()) if (configuration.result.isPresent) { val subscriptionConfig = configuration.result.get().levels[subscription.level] if (subscriptionConfig == null) { info(type, "Failed to load subscription configuration for level ${subscription.level} for type $type") - null to "" + null } else { - Badges.toDatabaseBadge(Badges.fromServiceBadge(subscriptionConfig.badge)) to subscriptionConfig.name + Badges.toDatabaseBadge(Badges.fromServiceBadge(subscriptionConfig.badge)) } } else { warn(TAG, "Failed to load configuration while processing $type") - null to "" + null } } else { - oldInAppPayment.data.badge to oldInAppPayment.data.label + oldInAppPayment.data.badge } info(type, "End of period has changed. Requesting receipt refresh. (old: $oldEndOfPeriod, new: $endOfCurrentPeriod)") @@ -260,7 +260,6 @@ class InAppPaymentKeepAliveJob private constructor( error = null, level = subscription.level.toLong(), cancellation = null, - label = label, recipientId = null, additionalMessage = null, redemption = InAppPaymentData.RedemptionState( diff --git a/app/src/main/java/org/thoughtcrime/securesms/subscription/Subscription.kt b/app/src/main/java/org/thoughtcrime/securesms/subscription/Subscription.kt index 4cfbb8e419..c95416b2ba 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/subscription/Subscription.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/subscription/Subscription.kt @@ -27,7 +27,6 @@ import java.util.Locale */ data class Subscription( val id: String, - val name: String, val badge: Badge, val prices: Set, val level: Int diff --git a/app/src/main/protowire/Database.proto b/app/src/main/protowire/Database.proto index d4ba3bd416..e0d15f9aa3 100644 --- a/app/src/main/protowire/Database.proto +++ b/app/src/main/protowire/Database.proto @@ -407,7 +407,7 @@ message InAppPaymentData { optional Error error = 3; // An error, if present. int64 level = 4; // The transaction "level" given to us by the server optional Cancellation cancellation = 5; // The transaction was cancelled. This notes why. - string label = 6; // Descriptive text about the token + reserved 6; // removed: Descriptive text about the token optional string recipientId = 7; // The target recipient the token is to be sent to (only used for gifts) optional string additionalMessage = 8; // The additional message to send the target recipient (only used for gifts) PaymentMethodType paymentMethodType = 9; // The method through which this in app payment was made @@ -484,7 +484,7 @@ message ExternalLaunchTransactionState { InAppPaymentType inAppPaymentType = 1; BadgeList.Badge badge = 2; - string label = 3; + reserved 3; // removed field label DecimalValue price = 4; string currencyCode = 5; int64 level = 6; diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0e68eea253..a7da983041 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5766,6 +5766,10 @@ Processing donation… Processing payment… + + + Recurring %1$d + Error processing payment diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/SubscriptionsConfiguration.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/SubscriptionsConfiguration.java index 9953f4c5a0..22919ec2c7 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/SubscriptionsConfiguration.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/SubscriptionsConfiguration.java @@ -76,16 +76,10 @@ public class SubscriptionsConfiguration { } public static class LevelConfiguration { - @JsonProperty("name") - private String name; @JsonProperty("badge") private SignalServiceProfile.Badge badge; - public String getName() { - return name; - } - public SignalServiceProfile.Badge getBadge() { return badge; }