From d23ef647d85f9987094184aa05dbcec9c2aa8254 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 19 Sep 2024 15:25:26 -0300 Subject: [PATCH] Hide paid tier on devices where the billing API is not available. --- .../securesms/backup/v2/BackupRepository.kt | 10 ++++---- .../java/org/signal/billing/BillingApiImpl.kt | 25 +++++++++++-------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt index 03be8caeb2..b3e5ca9018 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt @@ -883,10 +883,10 @@ object BackupRepository { } suspend fun getAvailableBackupsTypes(availableBackupTiers: List): List { - return availableBackupTiers.map { getBackupsType(it) } + return availableBackupTiers.mapNotNull { getBackupsType(it) } } - suspend fun getBackupsType(tier: MessageBackupTier): MessageBackupsType { + suspend fun getBackupsType(tier: MessageBackupTier): MessageBackupsType? { return when (tier) { MessageBackupTier.FREE -> getFreeType() MessageBackupTier.PAID -> getPaidType() @@ -901,12 +901,12 @@ object BackupRepository { ) } - private suspend fun getPaidType(): MessageBackupsType { + private suspend fun getPaidType(): MessageBackupsType? { val config = getSubscriptionsConfiguration() - val product = AppDependencies.billingApi.queryProduct() + val product = AppDependencies.billingApi.queryProduct() ?: return null return MessageBackupsType.Paid( - pricePerMonth = product!!.price, + pricePerMonth = product.price, storageAllowanceBytes = config.backupConfiguration.backupLevelConfigurationMap[SubscriptionsConfiguration.BACKUPS_LEVEL]!!.storageAllowanceBytes ) } diff --git a/billing/src/main/java/org/signal/billing/BillingApiImpl.kt b/billing/src/main/java/org/signal/billing/BillingApiImpl.kt index b58fccbd8e..c57994d8ba 100644 --- a/billing/src/main/java/org/signal/billing/BillingApiImpl.kt +++ b/billing/src/main/java/org/signal/billing/BillingApiImpl.kt @@ -163,19 +163,24 @@ internal class BillingApiImpl( } override suspend fun queryProduct(): BillingProduct? { - val products = queryProductsInternal() + try { + val products = queryProductsInternal() - val details: ProductDetails? = products.productDetailsList?.firstOrNull { it.productId == billingDependencies.getProductId() } - val pricing: ProductDetails.PricingPhase? = details?.subscriptionOfferDetails?.firstOrNull()?.pricingPhases?.pricingPhaseList?.firstOrNull() + val details: ProductDetails? = products.productDetailsList?.firstOrNull { it.productId == billingDependencies.getProductId() } + val pricing: ProductDetails.PricingPhase? = details?.subscriptionOfferDetails?.firstOrNull()?.pricingPhases?.pricingPhaseList?.firstOrNull() - if (pricing == null) { - Log.d(TAG, "No pricing available.") + if (pricing == null) { + Log.d(TAG, "No pricing available.") + return null + } + + return BillingProduct( + price = FiatMoney(BigDecimal.valueOf(pricing.priceAmountMicros, 6), Currency.getInstance(pricing.priceCurrencyCode)) + ) + } catch (e: BillingError) { + Log.w(TAG, "Failed to query product. Returning null. Error code: ${e.billingResponseCode}", e) return null } - - return BillingProduct( - price = FiatMoney(BigDecimal.valueOf(pricing.priceAmountMicros, 6), Currency.getInstance(pricing.priceCurrencyCode)) - ) } override suspend fun queryPurchases() { @@ -291,7 +296,7 @@ internal class BillingApiImpl( billingResponseCode = billingResult.responseCode ) trySend(State.Failure(billingError)) - cancel(CancellationException("Failed to connect to Google Play Billing", billingError)) + channel.close() } } })