summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2023-11-16 00:57:13 +0100
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2023-11-16 09:34:26 +0100
commit2a0c1b1e84d28fa8f3db3dda0c115059c678eb35 (patch)
tree07fd826f95ec50fb11ef6ae28fdf411f09b34826
parent81beb5e1d5aa729d9a0985c010c446ac87f54fe8 (diff)
downloadmullvadvpn-2a0c1b1e84d28fa8f3db3dda0c115059c678eb35.tar.xz
mullvadvpn-2a0c1b1e84d28fa8f3db3dda0c115059c678eb35.zip
Add PaymentUseCase
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/PaymentUseCase.kt74
1 files changed, 74 insertions, 0 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/PaymentUseCase.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/PaymentUseCase.kt
new file mode 100644
index 0000000000..151e2caec7
--- /dev/null
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/PaymentUseCase.kt
@@ -0,0 +1,74 @@
+package net.mullvad.mullvadvpn.usecase
+
+import android.app.Activity
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import net.mullvad.mullvadvpn.lib.payment.PaymentRepository
+import net.mullvad.mullvadvpn.lib.payment.model.PaymentAvailability
+import net.mullvad.mullvadvpn.lib.payment.model.ProductId
+import net.mullvad.mullvadvpn.lib.payment.model.PurchaseResult
+import net.mullvad.mullvadvpn.lib.payment.model.VerificationResult
+
+interface PaymentUseCase {
+ val paymentAvailability: Flow<PaymentAvailability?>
+ val purchaseResult: Flow<PurchaseResult?>
+
+ suspend fun purchaseProduct(productId: ProductId, activityProvider: () -> Activity)
+
+ suspend fun queryPaymentAvailability()
+
+ suspend fun resetPurchaseResult()
+
+ suspend fun verifyPurchases()
+}
+
+class PlayPaymentUseCase(private val paymentRepository: PaymentRepository) : PaymentUseCase {
+ private val _paymentAvailability = MutableStateFlow<PaymentAvailability?>(null)
+ private val _purchaseResult = MutableStateFlow<PurchaseResult?>(null)
+
+ override val paymentAvailability = _paymentAvailability.asStateFlow()
+ override val purchaseResult = _purchaseResult.asStateFlow()
+
+ override suspend fun purchaseProduct(productId: ProductId, activityProvider: () -> Activity) {
+ paymentRepository.purchaseProduct(productId, activityProvider).collect(_purchaseResult)
+ }
+
+ override suspend fun queryPaymentAvailability() {
+ paymentRepository.queryPaymentAvailability().collect(_paymentAvailability)
+ }
+
+ override suspend fun resetPurchaseResult() {
+ _purchaseResult.emit(null)
+ }
+
+ override suspend fun verifyPurchases() {
+ paymentRepository.verifyPurchases().collect {
+ if (it == VerificationResult.Success) {
+ // Update the payment availability after a successful verification.
+ queryPaymentAvailability()
+ }
+ }
+ }
+}
+
+class EmptyPaymentUseCase : PaymentUseCase {
+ override val paymentAvailability = MutableStateFlow(PaymentAvailability.ProductsUnavailable)
+ override val purchaseResult = MutableStateFlow<PurchaseResult?>(null)
+
+ override suspend fun purchaseProduct(productId: ProductId, activityProvider: () -> Activity) {
+ // No op
+ }
+
+ override suspend fun queryPaymentAvailability() {
+ // No op
+ }
+
+ override suspend fun resetPurchaseResult() {
+ // No op
+ }
+
+ override suspend fun verifyPurchases() {
+ // No op
+ }
+}