1
1
package net.mullvad.mullvadvpn.usecase
2
2
3
3
import android.app.Activity
4
+ import kotlinx.coroutines.FlowPreview
4
5
import kotlinx.coroutines.flow.Flow
5
6
import kotlinx.coroutines.flow.MutableStateFlow
6
7
import kotlinx.coroutines.flow.asStateFlow
@@ -12,6 +13,7 @@ import net.mullvad.mullvadvpn.lib.payment.model.PaymentAvailability
12
13
import net.mullvad.mullvadvpn.lib.payment.model.ProductId
13
14
import net.mullvad.mullvadvpn.lib.payment.model.PurchaseResult
14
15
import net.mullvad.mullvadvpn.lib.payment.model.VerificationResult
16
+ import net.mullvad.mullvadvpn.util.delayAtLeast
15
17
import net.mullvad.mullvadvpn.util.retryWithExponentialBackOff
16
18
17
19
interface PaymentUseCase {
@@ -34,8 +36,18 @@ class PlayPaymentUseCase(private val paymentRepository: PaymentRepository) : Pay
34
36
override val paymentAvailability = _paymentAvailability .asStateFlow()
35
37
override val purchaseResult = _purchaseResult .asStateFlow()
36
38
39
+ @OptIn(FlowPreview ::class )
37
40
override suspend fun purchaseProduct (productId : ProductId , activityProvider : () -> Activity ) {
38
- paymentRepository.purchaseProduct(productId, activityProvider).collect(_purchaseResult )
41
+ paymentRepository
42
+ .purchaseProduct(productId, activityProvider)
43
+ .delayAtLeast {
44
+ if (purchaseResult.value.shouldDelayLoading()) {
45
+ MINIMUM_LOADING_DELAY_MS
46
+ } else {
47
+ 0
48
+ }
49
+ }
50
+ .collect(_purchaseResult )
39
51
}
40
52
41
53
override suspend fun queryPaymentAvailability () {
@@ -64,6 +76,13 @@ class PlayPaymentUseCase(private val paymentRepository: PaymentRepository) : Pay
64
76
}
65
77
}
66
78
}
79
+
80
+ private fun PurchaseResult?.shouldDelayLoading () =
81
+ this is PurchaseResult .FetchingProducts || this is PurchaseResult .VerificationStarted
82
+
83
+ companion object {
84
+ const val MINIMUM_LOADING_DELAY_MS = 500L
85
+ }
67
86
}
68
87
69
88
class EmptyPaymentUseCase : PaymentUseCase {
0 commit comments