Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create PurchasesStateProvider #1502

Merged
merged 6 commits into from
Nov 30, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,14 @@ internal object BillingFactory {
cache: DeviceCache,
observerMode: Boolean,
diagnosticsTrackerIfEnabled: DiagnosticsTracker?,
stateProvider: PurchasesStateProvider,
) = when (store) {
Store.PLAY_STORE -> BillingWrapper(
BillingWrapper.ClientFactory(application),
Handler(application.mainLooper),
cache,
diagnosticsTrackerIfEnabled,
stateProvider,
)
Store.AMAZON -> {
try {
Expand All @@ -34,6 +36,7 @@ internal object BillingFactory {
observerMode,
Handler(application.mainLooper),
backendHelper,
stateProvider,
)
} catch (e: NoClassDefFoundError) {
errorLog("Make sure purchases-amazon is added as dependency", e)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,8 @@ internal class PurchasesFactory(
backendHelper,
)

val purchasesStateProvider = PurchasesStateProvider()

// Override used for integration tests.
val billing: BillingAbstract = overrideBillingAbstract ?: BillingFactory.createBilling(
store,
Expand All @@ -134,6 +136,7 @@ internal class PurchasesFactory(
cache,
observerMode,
diagnosticsTracker,
purchasesStateProvider,
)

val subscriberAttributesPoster = SubscriberAttributesPoster(backendHelper)
Expand Down Expand Up @@ -268,6 +271,7 @@ internal class PurchasesFactory(
offeringsManager,
createPaywallEventsManager(application, identityManager, eventsDispatcher, backend),
paywallPresentedCache,
purchasesStateProvider,
)

return Purchases(purchasesOrchestrator)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,20 +88,19 @@ internal class PurchasesOrchestrator constructor(
private val offeringsManager: OfferingsManager,
private val paywallEventsManager: PaywallEventsManager?,
private val paywallPresentedCache: PaywallPresentedCache,
private val stateProvider: PurchasesStateProvider,
// This is nullable due to: https://github.com/RevenueCat/purchases-flutter/issues/408
private val mainHandler: Handler? = Handler(Looper.getMainLooper()),
) : LifecycleDelegate, CustomActivityLifecycleHandler {

/** @suppress */
@Suppress("RedundantGetter", "RedundantSetter")
@Volatile
internal var state = PurchasesState()
internal var state: PurchasesState
@Synchronized
get() = field
get() = stateProvider.purchasesState

@Synchronized
vegaro marked this conversation as resolved.
Show resolved Hide resolved
set(value) {
field = value
stateProvider.purchasesState = value
}

var finishTransactions: Boolean
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.revenuecat.purchases

internal data class PurchasesStateProvider(
var purchasesState: PurchasesState = PurchasesState(),
vegaro marked this conversation as resolved.
Show resolved Hide resolved
)
vegaro marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import com.revenuecat.purchases.PostReceiptInitiationSource
import com.revenuecat.purchases.PurchasesError
import com.revenuecat.purchases.PurchasesErrorCallback
import com.revenuecat.purchases.PurchasesErrorCode
import com.revenuecat.purchases.PurchasesStateProvider
import com.revenuecat.purchases.amazon.handler.ProductDataHandler
import com.revenuecat.purchases.amazon.handler.PurchaseHandler
import com.revenuecat.purchases.amazon.handler.PurchaseUpdatesHandler
Expand Down Expand Up @@ -50,13 +51,14 @@ import com.revenuecat.purchases.ProductType as RevenueCatProductType

private const val TERM_SKU_JSON_KEY = "termSku"

@SuppressWarnings("LongParameterList")
@SuppressWarnings("LongParameterList", "TooManyFunctions")
internal class AmazonBilling constructor(
private val applicationContext: Context,
private val amazonBackend: AmazonBackend,
private val cache: AmazonCache,
private val observerMode: Boolean,
private val mainHandler: Handler,
stateProvider: PurchasesStateProvider,
private val purchasingServiceProvider: PurchasingServiceProvider = DefaultPurchasingServiceProvider(),
private val productDataHandler: ProductDataResponseListener =
ProductDataHandler(purchasingServiceProvider, mainHandler),
Expand All @@ -67,7 +69,7 @@ internal class AmazonBilling constructor(
),
private val userDataHandler: UserDataResponseListener = UserDataHandler(purchasingServiceProvider, mainHandler),
private val dateProvider: DateProvider = DefaultDateProvider(),
) : BillingAbstract(),
) : BillingAbstract(stateProvider),
ProductDataResponseListener by productDataHandler,
PurchaseResponseListener by purchaseHandler,
PurchaseUpdatesResponseListener by purchaseUpdatesHandler,
Expand All @@ -81,9 +83,17 @@ internal class AmazonBilling constructor(
observerMode: Boolean,
mainHandler: Handler,
backendHelper: BackendHelper,
) : this(applicationContext, AmazonBackend(backendHelper), AmazonCache(cache), observerMode, mainHandler)

var connected = false
stateProvider: PurchasesStateProvider,
) : this(
applicationContext,
AmazonBackend(backendHelper),
AmazonCache(cache),
observerMode,
mainHandler,
stateProvider,
)

private var connected = false

override fun startConnection() {
if (checkObserverMode()) return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.revenuecat.purchases.PostReceiptInitiationSource
import com.revenuecat.purchases.ProductType
import com.revenuecat.purchases.PurchasesError
import com.revenuecat.purchases.PurchasesErrorCallback
import com.revenuecat.purchases.PurchasesStateProvider
import com.revenuecat.purchases.models.InAppMessageType
import com.revenuecat.purchases.models.PurchasingData
import com.revenuecat.purchases.models.StoreProduct
Expand All @@ -13,7 +14,10 @@ import com.revenuecat.purchases.models.StoreTransaction
internal typealias StoreProductsCallback = (List<StoreProduct>) -> Unit

@SuppressWarnings("TooManyFunctions")
internal abstract class BillingAbstract {
internal abstract class BillingAbstract(
@get:Synchronized
vegaro marked this conversation as resolved.
Show resolved Hide resolved
protected val purchasesStateProvider: PurchasesStateProvider,
) {

@get:Synchronized
@set:Synchronized
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import com.revenuecat.purchases.ProductType
import com.revenuecat.purchases.PurchasesError
import com.revenuecat.purchases.PurchasesErrorCallback
import com.revenuecat.purchases.PurchasesErrorCode
import com.revenuecat.purchases.PurchasesStateProvider
import com.revenuecat.purchases.common.BillingAbstract
import com.revenuecat.purchases.common.DateProvider
import com.revenuecat.purchases.common.DefaultDateProvider
Expand Down Expand Up @@ -81,8 +82,9 @@ internal class BillingWrapper(
private val deviceCache: DeviceCache,
@Suppress("unused")
private val diagnosticsTrackerIfEnabled: DiagnosticsTracker?,
purchasesStateProvider: PurchasesStateProvider,
private val dateProvider: DateProvider = DefaultDateProvider(),
) : BillingAbstract(), PurchasesUpdatedListener, BillingClientStateListener {
) : BillingAbstract(purchasesStateProvider), PurchasesUpdatedListener, BillingClientStateListener {

@get:Synchronized
@set:Synchronized
Expand Down Expand Up @@ -523,7 +525,7 @@ internal class BillingWrapper(
QueryPurchasesByTypeUseCaseParams(
dateProvider,
diagnosticsTrackerIfEnabled,
appInBackground = false,
appInBackground = purchasesStateProvider.purchasesState.appInBackground,
vegaro marked this conversation as resolved.
Show resolved Hide resolved
productType = productType,
),
onSuccess = { purchases ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ internal open class BasePurchasesTest {
internal val mockSyncPurchasesHelper = mockk<SyncPurchasesHelper>()
protected val mockOfferingsManager = mockk<OfferingsManager>()
internal val mockPaywallEventsManager = mockk<PaywallEventsManager>()
private val purchasesStateProvider = PurchasesStateProvider()

protected var capturedPurchasesUpdatedListener = slot<BillingAbstract.PurchasesUpdatedListener>()
protected var capturedBillingWrapperStateListener = slot<BillingAbstract.StateListener>()
Expand Down Expand Up @@ -407,6 +408,7 @@ internal open class BasePurchasesTest {
offeringsManager = mockOfferingsManager,
paywallEventsManager = mockPaywallEventsManager,
paywallPresentedCache = paywallPresentedCache,
stateProvider = purchasesStateProvider,
)
purchases = Purchases(purchasesOrchestrator)
Purchases.sharedInstance = purchases
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ class BillingFactoryTest {
mockBackendHelper,
mockCache,
observerMode = false,
mockDiagnosticsTracker
mockDiagnosticsTracker,
PurchasesStateProvider()
)
}

Expand All @@ -41,7 +42,8 @@ class BillingFactoryTest {
mockBackendHelper,
mockCache,
observerMode = false,
diagnosticsTrackerIfEnabled = null
diagnosticsTrackerIfEnabled = null,
PurchasesStateProvider()
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.revenuecat.purchases.PostReceiptInitiationSource
import com.revenuecat.purchases.PurchasesError
import com.revenuecat.purchases.PurchasesErrorCallback
import com.revenuecat.purchases.PurchasesErrorCode
import com.revenuecat.purchases.PurchasesStateProvider
import com.revenuecat.purchases.amazon.handler.ProductDataHandler
import com.revenuecat.purchases.amazon.handler.PurchaseHandler
import com.revenuecat.purchases.amazon.handler.PurchaseUpdatesHandler
Expand Down Expand Up @@ -70,7 +71,8 @@ class AmazonBillingTest {
purchaseHandler = mockPurchaseHandler,
purchaseUpdatesHandler = mockPurchaseUpdatesHandler,
userDataHandler = mockUserDataHandler,
mainHandler = handler
mainHandler = handler,
stateProvider = PurchasesStateProvider()
)

mockSetupFunctions()
Expand All @@ -90,7 +92,8 @@ class AmazonBillingTest {
productDataHandler = mockProductDataHandler,
purchaseHandler = mockPurchaseHandler,
purchaseUpdatesHandler = mockPurchaseUpdatesHandler,
userDataHandler = mockUserDataHandler
userDataHandler = mockUserDataHandler,
stateProvider = PurchasesStateProvider()
)

mockSetupFunctions()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.revenuecat.purchases.amazon
import android.app.Application
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.revenuecat.purchases.BillingFactory
import com.revenuecat.purchases.PurchasesStateProvider
import com.revenuecat.purchases.Store
import com.revenuecat.purchases.common.BackendHelper
import com.revenuecat.purchases.common.caching.DeviceCache
Expand All @@ -27,7 +28,8 @@ class BillingFactoryAmazonTest {
mockBackendHelper,
mockCache,
observerMode = false,
mockDiagnosticsTracker
mockDiagnosticsTracker,
stateProvider = PurchasesStateProvider()
)
}

Expand All @@ -43,7 +45,8 @@ class BillingFactoryAmazonTest {
mockBackendHelper,
mockCache,
observerMode = false,
diagnosticsTrackerIfEnabled = null
diagnosticsTrackerIfEnabled = null,
stateProvider = PurchasesStateProvider()
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import com.revenuecat.purchases.PostReceiptInitiationSource
import com.revenuecat.purchases.ProductType
import com.revenuecat.purchases.PurchasesError
import com.revenuecat.purchases.PurchasesErrorCode
import com.revenuecat.purchases.PurchasesStateProvider
import com.revenuecat.purchases.assertDebugLog
import com.revenuecat.purchases.assertErrorLog
import com.revenuecat.purchases.assertVerboseLog
Expand Down Expand Up @@ -110,6 +111,7 @@ class BillingWrapperTest {

private val subsGoogleProductType = ProductType.SUBS.toGoogleProductType()!!
private val inAppGoogleProductType = ProductType.INAPP.toGoogleProductType()!!
private val purchasesStateProvider = PurchasesStateProvider()

@Before
fun setup() {
Expand Down Expand Up @@ -153,7 +155,14 @@ class BillingWrapperTest {

mockDetailsList = listOf(mockProductDetails())

wrapper = BillingWrapper(mockClientFactory, handler, mockDeviceCache, mockDiagnosticsTracker, mockDateProvider)
wrapper = BillingWrapper(
mockClientFactory,
handler,
mockDeviceCache,
mockDiagnosticsTracker,
purchasesStateProvider,
mockDateProvider
)
wrapper.purchasesUpdatedListener = mockPurchasesListener
wrapper.startConnectionOnMainThread()
onConnectedCalled = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.android.billingclient.api.BillingClient
import com.android.billingclient.api.BillingClientStateListener
import com.android.billingclient.api.BillingResult
import com.android.billingclient.api.PurchasesUpdatedListener
import com.revenuecat.purchases.PurchasesStateProvider
import com.revenuecat.purchases.common.BillingAbstract
import com.revenuecat.purchases.common.DateProvider
import com.revenuecat.purchases.common.caching.DeviceCache
Expand Down Expand Up @@ -45,6 +46,7 @@ internal open class BaseBillingUseCaseTest {

private var onConnectedCalled: Boolean = false
private var mockPurchasesListener: BillingAbstract.PurchasesUpdatedListener = mockk()
private val purchasesStateProvider = PurchasesStateProvider()

@Before
open fun setup() {
Expand Down Expand Up @@ -75,7 +77,14 @@ internal open class BaseBillingUseCaseTest {
mockClient.isReady
} returns false andThen true

wrapper = BillingWrapper(mockClientFactory, handler, mockDeviceCache, mockDiagnosticsTracker, mockDateProvider)
wrapper = BillingWrapper(
mockClientFactory,
handler,
mockDeviceCache,
mockDiagnosticsTracker,
purchasesStateProvider,
mockDateProvider
)
wrapper.purchasesUpdatedListener = mockPurchasesListener
wrapper.startConnectionOnMainThread()
onConnectedCalled = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import com.revenuecat.purchases.PostReceiptHelper
import com.revenuecat.purchases.PostTransactionWithProductDetailsHelper
import com.revenuecat.purchases.Purchases
import com.revenuecat.purchases.PurchasesOrchestrator
import com.revenuecat.purchases.PurchasesStateProvider
import com.revenuecat.purchases.Store
import com.revenuecat.purchases.common.AppConfig
import com.revenuecat.purchases.common.Backend
Expand Down Expand Up @@ -98,7 +99,8 @@ class SubscriberAttributesPurchasesTests {
syncPurchasesHelper = mockk(),
offeringsManager = offeringsManagerMock,
paywallEventsManager = null,
paywallPresentedCache = PaywallPresentedCache()
paywallPresentedCache = PaywallPresentedCache(),
stateProvider = PurchasesStateProvider()
)

underTest = Purchases(purchasesOrchestrator)
Expand Down