From cffbfcb95709ffbbd5ac2517697862d50441abf9 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Fri, 6 May 2022 10:01:14 -0300 Subject: [PATCH] Hide receipts item if user has none. --- .../database/DonationReceiptDatabaseTest.kt | 37 +++++++++++++++++++ .../securesms/database/MmsHelper.kt | 5 ++- .../manage/ManageDonationsFragment.kt | 32 +++++++++------- .../manage/ManageDonationsState.kt | 1 + .../manage/ManageDonationsViewModel.kt | 10 +++++ .../database/DonationReceiptDatabase.kt | 10 +++++ 6 files changed, 80 insertions(+), 15 deletions(-) create mode 100644 app/src/androidTest/java/org/thoughtcrime/securesms/database/DonationReceiptDatabaseTest.kt diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/DonationReceiptDatabaseTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/DonationReceiptDatabaseTest.kt new file mode 100644 index 0000000000..da2a0a6c91 --- /dev/null +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/DonationReceiptDatabaseTest.kt @@ -0,0 +1,37 @@ +package org.thoughtcrime.securesms.database + +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test +import org.signal.core.util.money.FiatMoney +import org.thoughtcrime.securesms.database.model.DonationReceiptRecord +import java.math.BigDecimal +import java.util.Currency + +class DonationReceiptDatabaseTest { + + private val records = listOf( + DonationReceiptRecord.createForBoost(FiatMoney(BigDecimal.valueOf(100), Currency.getInstance("USD"))), + DonationReceiptRecord.createForBoost(FiatMoney(BigDecimal.valueOf(200), Currency.getInstance("USD"))) + ) + + @Test + fun givenNoReceipts_whenICheckHasReceipts_thenIExpectFalse() { + assertFalse(SignalDatabase.donationReceipts.hasReceipts()) + } + + @Test + fun givenOneReceipt_whenICheckHasReceipts_thenIExpectTrue() { + SignalDatabase.donationReceipts.addReceipt(records.first()) + assertTrue(SignalDatabase.donationReceipts.hasReceipts()) + } + + @Test + fun givenMultipleReceipts_whenICheckHasReceipts_thenIExpectTrue() { + records.forEach { + SignalDatabase.donationReceipts.addReceipt(it) + } + + assertTrue(SignalDatabase.donationReceipts.hasReceipts()) + } +} diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsHelper.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsHelper.kt index b566faa321..f8f741f2fb 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsHelper.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsHelper.kt @@ -39,12 +39,13 @@ object MmsHelper { emptyList(), emptyList(), emptySet(), - emptySet() + emptySet(), + null ) return insert( message = message, - threadId = threadId, + threadId = threadId ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsFragment.kt index 41f16bed26..fcda4c13f8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsFragment.kt @@ -98,31 +98,31 @@ class ManageDonationsFragment : DSLSettingsFragment(), ExpiredGiftSheet.Callback if (activeSubscription != null) { val subscription: Subscription? = state.availableSubscriptions.firstOrNull { activeSubscription.level == it.level } if (subscription != null) { - presentSubscriptionSettings(activeSubscription, subscription, state.getRedemptionState()) + presentSubscriptionSettings(state.hasReceipts, activeSubscription, subscription, state.getRedemptionState()) } else { customPref(IndeterminateLoadingCircle) } } else { - presentNoSubscriptionSettings() + presentNoSubscriptionSettings(state.hasReceipts) } } else if (state.transactionState == ManageDonationsState.TransactionState.NetworkFailure) { - presentNetworkFailureSettings(state.getRedemptionState()) + presentNetworkFailureSettings(state.hasReceipts, state.getRedemptionState()) } else { customPref(IndeterminateLoadingCircle) } } } - private fun DSLConfiguration.presentNetworkFailureSettings(redemptionState: ManageDonationsState.SubscriptionRedemptionState) { + private fun DSLConfiguration.presentNetworkFailureSettings(hasReceipts: Boolean, redemptionState: ManageDonationsState.SubscriptionRedemptionState) { if (SignalStore.donationsValues().isLikelyASustainer()) { - presentSubscriptionSettingsWithNetworkError(redemptionState) + presentSubscriptionSettingsWithNetworkError(hasReceipts, redemptionState) } else { - presentNoSubscriptionSettings() + presentNoSubscriptionSettings(hasReceipts) } } - private fun DSLConfiguration.presentSubscriptionSettingsWithNetworkError(redemptionState: ManageDonationsState.SubscriptionRedemptionState) { - presentSubscriptionSettingsWithState(redemptionState) { + private fun DSLConfiguration.presentSubscriptionSettingsWithNetworkError(hasReceipts: Boolean, redemptionState: ManageDonationsState.SubscriptionRedemptionState) { + presentSubscriptionSettingsWithState(hasReceipts, redemptionState) { customPref( NetworkFailure.Model( onRetryClick = { @@ -134,11 +134,12 @@ class ManageDonationsFragment : DSLSettingsFragment(), ExpiredGiftSheet.Callback } private fun DSLConfiguration.presentSubscriptionSettings( + hasReceipts: Boolean, activeSubscription: ActiveSubscription.Subscription, subscription: Subscription, redemptionState: ManageDonationsState.SubscriptionRedemptionState ) { - presentSubscriptionSettingsWithState(redemptionState) { + presentSubscriptionSettingsWithState(hasReceipts, redemptionState) { val activeCurrency = Currency.getInstance(activeSubscription.currency) val activeAmount = activeSubscription.amount.movePointLeft(activeCurrency.defaultFractionDigits) @@ -159,6 +160,7 @@ class ManageDonationsFragment : DSLSettingsFragment(), ExpiredGiftSheet.Callback } private fun DSLConfiguration.presentSubscriptionSettingsWithState( + hasReceipts: Boolean, redemptionState: ManageDonationsState.SubscriptionRedemptionState, subscriptionBlock: DSLConfiguration.() -> Unit ) { @@ -196,7 +198,9 @@ class ManageDonationsFragment : DSLSettingsFragment(), ExpiredGiftSheet.Callback sectionHeaderPref(R.string.ManageDonationsFragment__more) - presentDonationReceipts() + if (hasReceipts) { + presentDonationReceipts() + } externalLinkPref( title = DSLSettingsText.from(R.string.ManageDonationsFragment__subscription_faq), @@ -205,7 +209,7 @@ class ManageDonationsFragment : DSLSettingsFragment(), ExpiredGiftSheet.Callback ) } - private fun DSLConfiguration.presentNoSubscriptionSettings() { + private fun DSLConfiguration.presentNoSubscriptionSettings(hasReceipts: Boolean) { space(DimensionUnit.DP.toPixels(16f).toInt()) noPadTextPref( @@ -223,9 +227,11 @@ class ManageDonationsFragment : DSLSettingsFragment(), ExpiredGiftSheet.Callback presentOtherWaysToGive() - sectionHeaderPref(R.string.ManageDonationsFragment__receipts) + if (hasReceipts) { + sectionHeaderPref(R.string.ManageDonationsFragment__receipts) - presentDonationReceipts() + presentDonationReceipts() + } } private fun DSLConfiguration.presentOtherWaysToGive() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsState.kt index 1f4747fc85..d559f1b8d7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsState.kt @@ -8,6 +8,7 @@ data class ManageDonationsState( val featuredBadge: Badge? = null, val transactionState: TransactionState = TransactionState.Init, val availableSubscriptions: List = emptyList(), + val hasReceipts: Boolean = false, private val subscriptionRedemptionState: SubscriptionRedemptionState = SubscriptionRedemptionState.NONE ) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsViewModel.kt index a58d4aeeaf..6dc16fb348 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/manage/ManageDonationsViewModel.kt @@ -9,8 +9,10 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.kotlin.subscribeBy +import io.reactivex.rxjava3.schedulers.Schedulers import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.components.settings.app.subscription.SubscriptionsRepository +import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.jobmanager.JobTracker import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.subscription.LevelUpdate @@ -105,6 +107,14 @@ class ManageDonationsViewModel( Log.w(TAG, "Error retrieving subscriptions data", it) } ) + + disposables += Single.fromCallable { SignalDatabase.donationReceipts.hasReceipts() } + .subscribeOn(Schedulers.io()) + .subscribe { hasReceipts -> + store.update { + it.copy(hasReceipts = hasReceipts) + } + } } class Factory( diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/DonationReceiptDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/DonationReceiptDatabase.kt index 2bdb8cc2a7..9dc8f7361c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/DonationReceiptDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/DonationReceiptDatabase.kt @@ -6,6 +6,7 @@ import androidx.core.content.contentValuesOf import org.signal.core.util.CursorUtil import org.signal.core.util.SqlUtil import org.signal.core.util.money.FiatMoney +import org.signal.core.util.select import org.thoughtcrime.securesms.database.model.DonationReceiptRecord import java.math.BigDecimal import java.util.Currency @@ -39,6 +40,15 @@ class DonationReceiptDatabase(context: Context, databaseHelper: SignalDatabase) ) } + fun hasReceipts(): Boolean { + return readableDatabase.select("1") + .from(TABLE_NAME) + .where("") + .limit(1) + .run() + .use { it.moveToFirst() } + } + fun addReceipt(record: DonationReceiptRecord) { require(record.id == -1L)