From be9b949ae03b5d6a2f9758d730e8354accdff709 Mon Sep 17 00:00:00 2001 From: Cesar de la Vega Date: Mon, 27 Nov 2023 17:59:09 +0100 Subject: [PATCH 1/6] create PurchasesStateProvider --- .../revenuecat/purchases/BillingFactory.kt | 3 +++ .../revenuecat/purchases/PurchasesFactory.kt | 4 ++++ .../purchases/PurchasesOrchestrator.kt | 9 ++++----- .../purchases/PurchasesStateProvider.kt | 5 +++++ .../purchases/amazon/AmazonBilling.kt | 20 ++++++++++++++----- .../purchases/common/BillingAbstract.kt | 6 +++++- .../purchases/google/BillingWrapper.kt | 6 ++++-- .../revenuecat/purchases/BasePurchasesTest.kt | 2 ++ .../purchases/BillingFactoryTest.kt | 6 ++++-- .../purchases/amazon/AmazonBillingTest.kt | 7 +++++-- .../amazon/BillingFactoryAmazonTest.kt | 7 +++++-- .../purchases/google/BillingWrapperTest.kt | 11 +++++++++- .../google/usecase/BaseBillingUseCaseTest.kt | 11 +++++++++- .../SubscriberAttributesPurchasesTests.kt | 4 +++- 14 files changed, 79 insertions(+), 22 deletions(-) create mode 100644 purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateProvider.kt diff --git a/purchases/src/main/kotlin/com/revenuecat/purchases/BillingFactory.kt b/purchases/src/main/kotlin/com/revenuecat/purchases/BillingFactory.kt index 5ab30c164..5311e6227 100644 --- a/purchases/src/main/kotlin/com/revenuecat/purchases/BillingFactory.kt +++ b/purchases/src/main/kotlin/com/revenuecat/purchases/BillingFactory.kt @@ -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 { @@ -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) diff --git a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesFactory.kt b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesFactory.kt index df0847467..5a197df00 100644 --- a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesFactory.kt +++ b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesFactory.kt @@ -126,6 +126,8 @@ internal class PurchasesFactory( backendHelper, ) + val purchasesStateProvider = PurchasesStateProvider() + // Override used for integration tests. val billing: BillingAbstract = overrideBillingAbstract ?: BillingFactory.createBilling( store, @@ -134,6 +136,7 @@ internal class PurchasesFactory( cache, observerMode, diagnosticsTracker, + purchasesStateProvider, ) val subscriberAttributesPoster = SubscriberAttributesPoster(backendHelper) @@ -268,6 +271,7 @@ internal class PurchasesFactory( offeringsManager, createPaywallEventsManager(application, identityManager, eventsDispatcher, backend), paywallPresentedCache, + purchasesStateProvider, ) return Purchases(purchasesOrchestrator) diff --git a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesOrchestrator.kt b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesOrchestrator.kt index 5721a9533..829a2565c 100644 --- a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesOrchestrator.kt +++ b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesOrchestrator.kt @@ -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 set(value) { - field = value + stateProvider.purchasesState = value } var finishTransactions: Boolean diff --git a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateProvider.kt b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateProvider.kt new file mode 100644 index 000000000..9c84d8a6b --- /dev/null +++ b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateProvider.kt @@ -0,0 +1,5 @@ +package com.revenuecat.purchases + +internal data class PurchasesStateProvider( + var purchasesState: PurchasesState = PurchasesState(), +) diff --git a/purchases/src/main/kotlin/com/revenuecat/purchases/amazon/AmazonBilling.kt b/purchases/src/main/kotlin/com/revenuecat/purchases/amazon/AmazonBilling.kt index 00e6ab896..93363a391 100644 --- a/purchases/src/main/kotlin/com/revenuecat/purchases/amazon/AmazonBilling.kt +++ b/purchases/src/main/kotlin/com/revenuecat/purchases/amazon/AmazonBilling.kt @@ -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 @@ -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), @@ -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, @@ -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 diff --git a/purchases/src/main/kotlin/com/revenuecat/purchases/common/BillingAbstract.kt b/purchases/src/main/kotlin/com/revenuecat/purchases/common/BillingAbstract.kt index 65da09a56..ad8c323c1 100644 --- a/purchases/src/main/kotlin/com/revenuecat/purchases/common/BillingAbstract.kt +++ b/purchases/src/main/kotlin/com/revenuecat/purchases/common/BillingAbstract.kt @@ -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 @@ -13,7 +14,10 @@ import com.revenuecat.purchases.models.StoreTransaction internal typealias StoreProductsCallback = (List) -> Unit @SuppressWarnings("TooManyFunctions") -internal abstract class BillingAbstract { +internal abstract class BillingAbstract( + @get:Synchronized + protected val purchasesStateProvider: PurchasesStateProvider, +) { @get:Synchronized @set:Synchronized diff --git a/purchases/src/main/kotlin/com/revenuecat/purchases/google/BillingWrapper.kt b/purchases/src/main/kotlin/com/revenuecat/purchases/google/BillingWrapper.kt index f3b7851fe..4ec41f87a 100644 --- a/purchases/src/main/kotlin/com/revenuecat/purchases/google/BillingWrapper.kt +++ b/purchases/src/main/kotlin/com/revenuecat/purchases/google/BillingWrapper.kt @@ -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 @@ -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 @@ -523,7 +525,7 @@ internal class BillingWrapper( QueryPurchasesByTypeUseCaseParams( dateProvider, diagnosticsTrackerIfEnabled, - appInBackground = false, + appInBackground = purchasesStateProvider.purchasesState.appInBackground, productType = productType, ), onSuccess = { purchases -> diff --git a/purchases/src/test/java/com/revenuecat/purchases/BasePurchasesTest.kt b/purchases/src/test/java/com/revenuecat/purchases/BasePurchasesTest.kt index d4dc00d00..f925dfc33 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/BasePurchasesTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/BasePurchasesTest.kt @@ -70,6 +70,7 @@ internal open class BasePurchasesTest { internal val mockSyncPurchasesHelper = mockk() protected val mockOfferingsManager = mockk() internal val mockPaywallEventsManager = mockk() + private val purchasesStateProvider = PurchasesStateProvider() protected var capturedPurchasesUpdatedListener = slot() protected var capturedBillingWrapperStateListener = slot() @@ -407,6 +408,7 @@ internal open class BasePurchasesTest { offeringsManager = mockOfferingsManager, paywallEventsManager = mockPaywallEventsManager, paywallPresentedCache = paywallPresentedCache, + stateProvider = purchasesStateProvider, ) purchases = Purchases(purchasesOrchestrator) Purchases.sharedInstance = purchases diff --git a/purchases/src/test/java/com/revenuecat/purchases/BillingFactoryTest.kt b/purchases/src/test/java/com/revenuecat/purchases/BillingFactoryTest.kt index 26f1204f0..388bf01b4 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/BillingFactoryTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/BillingFactoryTest.kt @@ -25,7 +25,8 @@ class BillingFactoryTest { mockBackendHelper, mockCache, observerMode = false, - mockDiagnosticsTracker + mockDiagnosticsTracker, + PurchasesStateProvider() ) } @@ -41,7 +42,8 @@ class BillingFactoryTest { mockBackendHelper, mockCache, observerMode = false, - diagnosticsTrackerIfEnabled = null + diagnosticsTrackerIfEnabled = null, + PurchasesStateProvider() ) } } diff --git a/purchases/src/test/java/com/revenuecat/purchases/amazon/AmazonBillingTest.kt b/purchases/src/test/java/com/revenuecat/purchases/amazon/AmazonBillingTest.kt index ca0098fc3..c0c838004 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/amazon/AmazonBillingTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/amazon/AmazonBillingTest.kt @@ -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 @@ -70,7 +71,8 @@ class AmazonBillingTest { purchaseHandler = mockPurchaseHandler, purchaseUpdatesHandler = mockPurchaseUpdatesHandler, userDataHandler = mockUserDataHandler, - mainHandler = handler + mainHandler = handler, + stateProvider = PurchasesStateProvider() ) mockSetupFunctions() @@ -90,7 +92,8 @@ class AmazonBillingTest { productDataHandler = mockProductDataHandler, purchaseHandler = mockPurchaseHandler, purchaseUpdatesHandler = mockPurchaseUpdatesHandler, - userDataHandler = mockUserDataHandler + userDataHandler = mockUserDataHandler, + stateProvider = PurchasesStateProvider() ) mockSetupFunctions() diff --git a/purchases/src/test/java/com/revenuecat/purchases/amazon/BillingFactoryAmazonTest.kt b/purchases/src/test/java/com/revenuecat/purchases/amazon/BillingFactoryAmazonTest.kt index 290397a46..bbff0aa35 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/amazon/BillingFactoryAmazonTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/amazon/BillingFactoryAmazonTest.kt @@ -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 @@ -27,7 +28,8 @@ class BillingFactoryAmazonTest { mockBackendHelper, mockCache, observerMode = false, - mockDiagnosticsTracker + mockDiagnosticsTracker, + stateProvider = PurchasesStateProvider() ) } @@ -43,7 +45,8 @@ class BillingFactoryAmazonTest { mockBackendHelper, mockCache, observerMode = false, - diagnosticsTrackerIfEnabled = null + diagnosticsTrackerIfEnabled = null, + stateProvider = PurchasesStateProvider() ) } } diff --git a/purchases/src/test/java/com/revenuecat/purchases/google/BillingWrapperTest.kt b/purchases/src/test/java/com/revenuecat/purchases/google/BillingWrapperTest.kt index b6f2fa4af..da5dcbace 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/google/BillingWrapperTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/google/BillingWrapperTest.kt @@ -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 @@ -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() { @@ -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 diff --git a/purchases/src/test/java/com/revenuecat/purchases/google/usecase/BaseBillingUseCaseTest.kt b/purchases/src/test/java/com/revenuecat/purchases/google/usecase/BaseBillingUseCaseTest.kt index 0b6fecd8f..624dd2280 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/google/usecase/BaseBillingUseCaseTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/google/usecase/BaseBillingUseCaseTest.kt @@ -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 @@ -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() { @@ -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 diff --git a/purchases/src/testDefaults/kotlin/com/revenuecat/purchases/attributes/SubscriberAttributesPurchasesTests.kt b/purchases/src/testDefaults/kotlin/com/revenuecat/purchases/attributes/SubscriberAttributesPurchasesTests.kt index bc6fee8dd..e96cac930 100644 --- a/purchases/src/testDefaults/kotlin/com/revenuecat/purchases/attributes/SubscriberAttributesPurchasesTests.kt +++ b/purchases/src/testDefaults/kotlin/com/revenuecat/purchases/attributes/SubscriberAttributesPurchasesTests.kt @@ -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 @@ -98,7 +99,8 @@ class SubscriberAttributesPurchasesTests { syncPurchasesHelper = mockk(), offeringsManager = offeringsManagerMock, paywallEventsManager = null, - paywallPresentedCache = PaywallPresentedCache() + paywallPresentedCache = PaywallPresentedCache(), + stateProvider = PurchasesStateProvider() ) underTest = Purchases(purchasesOrchestrator) From 03a9e09de2eacd92aaa14507a21813c2764c6f22 Mon Sep 17 00:00:00 2001 From: Cesar de la Vega Date: Tue, 28 Nov 2023 17:12:14 +0100 Subject: [PATCH 2/6] synchronization change --- .../kotlin/com/revenuecat/purchases/PurchasesOrchestrator.kt | 3 --- .../kotlin/com/revenuecat/purchases/PurchasesStateProvider.kt | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesOrchestrator.kt b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesOrchestrator.kt index 829a2565c..f6de764e3 100644 --- a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesOrchestrator.kt +++ b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesOrchestrator.kt @@ -93,12 +93,9 @@ internal class PurchasesOrchestrator constructor( private val mainHandler: Handler? = Handler(Looper.getMainLooper()), ) : LifecycleDelegate, CustomActivityLifecycleHandler { - /** @suppress */ internal var state: PurchasesState - @Synchronized get() = stateProvider.purchasesState - @Synchronized set(value) { stateProvider.purchasesState = value } diff --git a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateProvider.kt b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateProvider.kt index 9c84d8a6b..20aef0e98 100644 --- a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateProvider.kt +++ b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateProvider.kt @@ -1,5 +1,8 @@ package com.revenuecat.purchases internal data class PurchasesStateProvider( + @get:Synchronized + @set:Synchronized + @Volatile var purchasesState: PurchasesState = PurchasesState(), ) From fa0ce74eedf622888caa90a22f83db10313265c5 Mon Sep 17 00:00:00 2001 From: Cesar de la Vega Date: Wed, 29 Nov 2023 16:40:06 +0100 Subject: [PATCH 3/6] Create PurchasesStateCache --- .../kotlin/com/revenuecat/purchases/PurchasesFactory.kt | 2 +- .../com/revenuecat/purchases/PurchasesOrchestrator.kt | 6 +++--- .../com/revenuecat/purchases/PurchasesStateCache.kt | 7 +++++++ .../com/revenuecat/purchases/PurchasesStateProvider.kt | 9 +++------ .../com/revenuecat/purchases/common/BillingAbstract.kt | 1 - .../java/com/revenuecat/purchases/BasePurchasesTest.kt | 4 ++-- .../java/com/revenuecat/purchases/BillingFactoryTest.kt | 4 ++-- .../com/revenuecat/purchases/amazon/AmazonBillingTest.kt | 5 +++-- .../purchases/amazon/BillingFactoryAmazonTest.kt | 5 +++-- .../revenuecat/purchases/google/BillingWrapperTest.kt | 3 ++- .../purchases/google/usecase/BaseBillingUseCaseTest.kt | 3 ++- .../attributes/SubscriberAttributesPurchasesTests.kt | 3 ++- 12 files changed, 30 insertions(+), 22 deletions(-) create mode 100644 purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateCache.kt diff --git a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesFactory.kt b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesFactory.kt index 5a197df00..12d8b6633 100644 --- a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesFactory.kt +++ b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesFactory.kt @@ -126,7 +126,7 @@ internal class PurchasesFactory( backendHelper, ) - val purchasesStateProvider = PurchasesStateProvider() + val purchasesStateProvider = PurchasesStateCache() // Override used for integration tests. val billing: BillingAbstract = overrideBillingAbstract ?: BillingFactory.createBilling( diff --git a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesOrchestrator.kt b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesOrchestrator.kt index f6de764e3..bd2f4003f 100644 --- a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesOrchestrator.kt +++ b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesOrchestrator.kt @@ -88,16 +88,16 @@ internal class PurchasesOrchestrator constructor( private val offeringsManager: OfferingsManager, private val paywallEventsManager: PaywallEventsManager?, private val paywallPresentedCache: PaywallPresentedCache, - private val stateProvider: PurchasesStateProvider, + private val purchasesStateCache: PurchasesStateCache, // This is nullable due to: https://github.com/RevenueCat/purchases-flutter/issues/408 private val mainHandler: Handler? = Handler(Looper.getMainLooper()), ) : LifecycleDelegate, CustomActivityLifecycleHandler { internal var state: PurchasesState - get() = stateProvider.purchasesState + get() = purchasesStateCache.purchasesState set(value) { - stateProvider.purchasesState = value + purchasesStateCache.purchasesState = value } var finishTransactions: Boolean diff --git a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateCache.kt b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateCache.kt new file mode 100644 index 000000000..ef231c1eb --- /dev/null +++ b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateCache.kt @@ -0,0 +1,7 @@ +package com.revenuecat.purchases + +internal data class PurchasesStateCache( + @get:Synchronized + @set:Synchronized + override var purchasesState: PurchasesState = PurchasesState(), +) : PurchasesStateProvider diff --git a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateProvider.kt b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateProvider.kt index 20aef0e98..1dea9aed1 100644 --- a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateProvider.kt +++ b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateProvider.kt @@ -1,8 +1,5 @@ package com.revenuecat.purchases -internal data class PurchasesStateProvider( - @get:Synchronized - @set:Synchronized - @Volatile - var purchasesState: PurchasesState = PurchasesState(), -) +internal interface PurchasesStateProvider { + val purchasesState: PurchasesState +} diff --git a/purchases/src/main/kotlin/com/revenuecat/purchases/common/BillingAbstract.kt b/purchases/src/main/kotlin/com/revenuecat/purchases/common/BillingAbstract.kt index ad8c323c1..02d1fe3b6 100644 --- a/purchases/src/main/kotlin/com/revenuecat/purchases/common/BillingAbstract.kt +++ b/purchases/src/main/kotlin/com/revenuecat/purchases/common/BillingAbstract.kt @@ -15,7 +15,6 @@ internal typealias StoreProductsCallback = (List) -> Unit @SuppressWarnings("TooManyFunctions") internal abstract class BillingAbstract( - @get:Synchronized protected val purchasesStateProvider: PurchasesStateProvider, ) { diff --git a/purchases/src/test/java/com/revenuecat/purchases/BasePurchasesTest.kt b/purchases/src/test/java/com/revenuecat/purchases/BasePurchasesTest.kt index f925dfc33..8b7f0a3e3 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/BasePurchasesTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/BasePurchasesTest.kt @@ -70,7 +70,7 @@ internal open class BasePurchasesTest { internal val mockSyncPurchasesHelper = mockk() protected val mockOfferingsManager = mockk() internal val mockPaywallEventsManager = mockk() - private val purchasesStateProvider = PurchasesStateProvider() + private val purchasesStateProvider = PurchasesStateCache() protected var capturedPurchasesUpdatedListener = slot() protected var capturedBillingWrapperStateListener = slot() @@ -408,7 +408,7 @@ internal open class BasePurchasesTest { offeringsManager = mockOfferingsManager, paywallEventsManager = mockPaywallEventsManager, paywallPresentedCache = paywallPresentedCache, - stateProvider = purchasesStateProvider, + purchasesStateCache = purchasesStateProvider, ) purchases = Purchases(purchasesOrchestrator) Purchases.sharedInstance = purchases diff --git a/purchases/src/test/java/com/revenuecat/purchases/BillingFactoryTest.kt b/purchases/src/test/java/com/revenuecat/purchases/BillingFactoryTest.kt index 388bf01b4..b816e9217 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/BillingFactoryTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/BillingFactoryTest.kt @@ -26,7 +26,7 @@ class BillingFactoryTest { mockCache, observerMode = false, mockDiagnosticsTracker, - PurchasesStateProvider() + PurchasesStateCache() ) } @@ -43,7 +43,7 @@ class BillingFactoryTest { mockCache, observerMode = false, diagnosticsTrackerIfEnabled = null, - PurchasesStateProvider() + PurchasesStateCache() ) } } diff --git a/purchases/src/test/java/com/revenuecat/purchases/amazon/AmazonBillingTest.kt b/purchases/src/test/java/com/revenuecat/purchases/amazon/AmazonBillingTest.kt index c0c838004..5c67ffa2a 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/amazon/AmazonBillingTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/amazon/AmazonBillingTest.kt @@ -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.PurchasesStateCache import com.revenuecat.purchases.PurchasesStateProvider import com.revenuecat.purchases.amazon.handler.ProductDataHandler import com.revenuecat.purchases.amazon.handler.PurchaseHandler @@ -72,7 +73,7 @@ class AmazonBillingTest { purchaseUpdatesHandler = mockPurchaseUpdatesHandler, userDataHandler = mockUserDataHandler, mainHandler = handler, - stateProvider = PurchasesStateProvider() + stateProvider = PurchasesStateCache() ) mockSetupFunctions() @@ -93,7 +94,7 @@ class AmazonBillingTest { purchaseHandler = mockPurchaseHandler, purchaseUpdatesHandler = mockPurchaseUpdatesHandler, userDataHandler = mockUserDataHandler, - stateProvider = PurchasesStateProvider() + stateProvider = PurchasesStateCache() ) mockSetupFunctions() diff --git a/purchases/src/test/java/com/revenuecat/purchases/amazon/BillingFactoryAmazonTest.kt b/purchases/src/test/java/com/revenuecat/purchases/amazon/BillingFactoryAmazonTest.kt index bbff0aa35..736bba900 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/amazon/BillingFactoryAmazonTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/amazon/BillingFactoryAmazonTest.kt @@ -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.PurchasesStateCache import com.revenuecat.purchases.PurchasesStateProvider import com.revenuecat.purchases.Store import com.revenuecat.purchases.common.BackendHelper @@ -29,7 +30,7 @@ class BillingFactoryAmazonTest { mockCache, observerMode = false, mockDiagnosticsTracker, - stateProvider = PurchasesStateProvider() + stateProvider = PurchasesStateCache() ) } @@ -46,7 +47,7 @@ class BillingFactoryAmazonTest { mockCache, observerMode = false, diagnosticsTrackerIfEnabled = null, - stateProvider = PurchasesStateProvider() + stateProvider = PurchasesStateCache() ) } } diff --git a/purchases/src/test/java/com/revenuecat/purchases/google/BillingWrapperTest.kt b/purchases/src/test/java/com/revenuecat/purchases/google/BillingWrapperTest.kt index da5dcbace..96caf8b20 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/google/BillingWrapperTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/google/BillingWrapperTest.kt @@ -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.PurchasesStateCache import com.revenuecat.purchases.PurchasesStateProvider import com.revenuecat.purchases.assertDebugLog import com.revenuecat.purchases.assertErrorLog @@ -111,7 +112,7 @@ class BillingWrapperTest { private val subsGoogleProductType = ProductType.SUBS.toGoogleProductType()!! private val inAppGoogleProductType = ProductType.INAPP.toGoogleProductType()!! - private val purchasesStateProvider = PurchasesStateProvider() + private val purchasesStateProvider = PurchasesStateCache() @Before fun setup() { diff --git a/purchases/src/test/java/com/revenuecat/purchases/google/usecase/BaseBillingUseCaseTest.kt b/purchases/src/test/java/com/revenuecat/purchases/google/usecase/BaseBillingUseCaseTest.kt index 624dd2280..ed3760300 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/google/usecase/BaseBillingUseCaseTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/google/usecase/BaseBillingUseCaseTest.kt @@ -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.PurchasesStateCache import com.revenuecat.purchases.PurchasesStateProvider import com.revenuecat.purchases.common.BillingAbstract import com.revenuecat.purchases.common.DateProvider @@ -46,7 +47,7 @@ internal open class BaseBillingUseCaseTest { private var onConnectedCalled: Boolean = false private var mockPurchasesListener: BillingAbstract.PurchasesUpdatedListener = mockk() - private val purchasesStateProvider = PurchasesStateProvider() + private val purchasesStateProvider = PurchasesStateCache() @Before open fun setup() { diff --git a/purchases/src/testDefaults/kotlin/com/revenuecat/purchases/attributes/SubscriberAttributesPurchasesTests.kt b/purchases/src/testDefaults/kotlin/com/revenuecat/purchases/attributes/SubscriberAttributesPurchasesTests.kt index e96cac930..52b7d2a0c 100644 --- a/purchases/src/testDefaults/kotlin/com/revenuecat/purchases/attributes/SubscriberAttributesPurchasesTests.kt +++ b/purchases/src/testDefaults/kotlin/com/revenuecat/purchases/attributes/SubscriberAttributesPurchasesTests.kt @@ -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.PurchasesStateCache import com.revenuecat.purchases.PurchasesStateProvider import com.revenuecat.purchases.Store import com.revenuecat.purchases.common.AppConfig @@ -100,7 +101,7 @@ class SubscriberAttributesPurchasesTests { offeringsManager = offeringsManagerMock, paywallEventsManager = null, paywallPresentedCache = PaywallPresentedCache(), - stateProvider = PurchasesStateProvider() + purchasesStateCache = PurchasesStateCache(), ) underTest = Purchases(purchasesOrchestrator) From aa144988aa4f5961dc1ab17f8244cd9b60d2d47f Mon Sep 17 00:00:00 2001 From: Cesar de la Vega Date: Wed, 29 Nov 2023 16:41:31 +0100 Subject: [PATCH 4/6] add val appInBackground --- .../kotlin/com/revenuecat/purchases/google/BillingWrapper.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/purchases/src/main/kotlin/com/revenuecat/purchases/google/BillingWrapper.kt b/purchases/src/main/kotlin/com/revenuecat/purchases/google/BillingWrapper.kt index 4ec41f87a..3546d851a 100644 --- a/purchases/src/main/kotlin/com/revenuecat/purchases/google/BillingWrapper.kt +++ b/purchases/src/main/kotlin/com/revenuecat/purchases/google/BillingWrapper.kt @@ -103,6 +103,9 @@ internal class BillingWrapper( @set:Synchronized private var reconnectionAlreadyScheduled = false + val appInBackground: Boolean + get() = purchasesStateProvider.purchasesState.appInBackground + class ClientFactory(private val context: Context) { @UiThread fun buildClient(listener: com.android.billingclient.api.PurchasesUpdatedListener): BillingClient { @@ -525,7 +528,7 @@ internal class BillingWrapper( QueryPurchasesByTypeUseCaseParams( dateProvider, diagnosticsTrackerIfEnabled, - appInBackground = purchasesStateProvider.purchasesState.appInBackground, + appInBackground = appInBackground, productType = productType, ), onSuccess = { purchases -> From 800bfbc1a24bc22c7942fc97f69f2ef13edd8477 Mon Sep 17 00:00:00 2001 From: Cesar de la Vega Date: Wed, 29 Nov 2023 16:44:37 +0100 Subject: [PATCH 5/6] move initialization to creation of purchases --- .../main/kotlin/com/revenuecat/purchases/PurchasesFactory.kt | 2 +- .../main/kotlin/com/revenuecat/purchases/PurchasesStateCache.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesFactory.kt b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesFactory.kt index 12d8b6633..dbd9b480f 100644 --- a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesFactory.kt +++ b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesFactory.kt @@ -126,7 +126,7 @@ internal class PurchasesFactory( backendHelper, ) - val purchasesStateProvider = PurchasesStateCache() + val purchasesStateProvider = PurchasesStateCache(PurchasesState()) // Override used for integration tests. val billing: BillingAbstract = overrideBillingAbstract ?: BillingFactory.createBilling( diff --git a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateCache.kt b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateCache.kt index ef231c1eb..dc3989d2e 100644 --- a/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateCache.kt +++ b/purchases/src/main/kotlin/com/revenuecat/purchases/PurchasesStateCache.kt @@ -3,5 +3,5 @@ package com.revenuecat.purchases internal data class PurchasesStateCache( @get:Synchronized @set:Synchronized - override var purchasesState: PurchasesState = PurchasesState(), + override var purchasesState: PurchasesState, ) : PurchasesStateProvider From 94c1ddb9a6244f536be81218bb01466dde5ee6f0 Mon Sep 17 00:00:00 2001 From: Cesar de la Vega Date: Wed, 29 Nov 2023 16:55:46 +0100 Subject: [PATCH 6/6] fix compilation --- .../test/java/com/revenuecat/purchases/BasePurchasesTest.kt | 2 +- .../test/java/com/revenuecat/purchases/BillingFactoryTest.kt | 4 ++-- .../com/revenuecat/purchases/amazon/AmazonBillingTest.kt | 5 +++-- .../revenuecat/purchases/amazon/BillingFactoryAmazonTest.kt | 5 +++-- .../com/revenuecat/purchases/google/BillingWrapperTest.kt | 3 ++- .../purchases/google/usecase/BaseBillingUseCaseTest.kt | 3 ++- .../attributes/SubscriberAttributesPurchasesTests.kt | 3 ++- 7 files changed, 15 insertions(+), 10 deletions(-) diff --git a/purchases/src/test/java/com/revenuecat/purchases/BasePurchasesTest.kt b/purchases/src/test/java/com/revenuecat/purchases/BasePurchasesTest.kt index 8b7f0a3e3..ddb8bf0d9 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/BasePurchasesTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/BasePurchasesTest.kt @@ -70,7 +70,7 @@ internal open class BasePurchasesTest { internal val mockSyncPurchasesHelper = mockk() protected val mockOfferingsManager = mockk() internal val mockPaywallEventsManager = mockk() - private val purchasesStateProvider = PurchasesStateCache() + private val purchasesStateProvider = PurchasesStateCache(PurchasesState()) protected var capturedPurchasesUpdatedListener = slot() protected var capturedBillingWrapperStateListener = slot() diff --git a/purchases/src/test/java/com/revenuecat/purchases/BillingFactoryTest.kt b/purchases/src/test/java/com/revenuecat/purchases/BillingFactoryTest.kt index b816e9217..237d066eb 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/BillingFactoryTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/BillingFactoryTest.kt @@ -26,7 +26,7 @@ class BillingFactoryTest { mockCache, observerMode = false, mockDiagnosticsTracker, - PurchasesStateCache() + PurchasesStateCache(PurchasesState()) ) } @@ -43,7 +43,7 @@ class BillingFactoryTest { mockCache, observerMode = false, diagnosticsTrackerIfEnabled = null, - PurchasesStateCache() + PurchasesStateCache(PurchasesState()) ) } } diff --git a/purchases/src/test/java/com/revenuecat/purchases/amazon/AmazonBillingTest.kt b/purchases/src/test/java/com/revenuecat/purchases/amazon/AmazonBillingTest.kt index 5c67ffa2a..01274c92e 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/amazon/AmazonBillingTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/amazon/AmazonBillingTest.kt @@ -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.PurchasesState import com.revenuecat.purchases.PurchasesStateCache import com.revenuecat.purchases.PurchasesStateProvider import com.revenuecat.purchases.amazon.handler.ProductDataHandler @@ -73,7 +74,7 @@ class AmazonBillingTest { purchaseUpdatesHandler = mockPurchaseUpdatesHandler, userDataHandler = mockUserDataHandler, mainHandler = handler, - stateProvider = PurchasesStateCache() + stateProvider = PurchasesStateCache(PurchasesState()) ) mockSetupFunctions() @@ -94,7 +95,7 @@ class AmazonBillingTest { purchaseHandler = mockPurchaseHandler, purchaseUpdatesHandler = mockPurchaseUpdatesHandler, userDataHandler = mockUserDataHandler, - stateProvider = PurchasesStateCache() + stateProvider = PurchasesStateCache(PurchasesState()) ) mockSetupFunctions() diff --git a/purchases/src/test/java/com/revenuecat/purchases/amazon/BillingFactoryAmazonTest.kt b/purchases/src/test/java/com/revenuecat/purchases/amazon/BillingFactoryAmazonTest.kt index 736bba900..0f3f5fe40 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/amazon/BillingFactoryAmazonTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/amazon/BillingFactoryAmazonTest.kt @@ -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.PurchasesState import com.revenuecat.purchases.PurchasesStateCache import com.revenuecat.purchases.PurchasesStateProvider import com.revenuecat.purchases.Store @@ -30,7 +31,7 @@ class BillingFactoryAmazonTest { mockCache, observerMode = false, mockDiagnosticsTracker, - stateProvider = PurchasesStateCache() + stateProvider = PurchasesStateCache(PurchasesState()) ) } @@ -47,7 +48,7 @@ class BillingFactoryAmazonTest { mockCache, observerMode = false, diagnosticsTrackerIfEnabled = null, - stateProvider = PurchasesStateCache() + stateProvider = PurchasesStateCache(PurchasesState()) ) } } diff --git a/purchases/src/test/java/com/revenuecat/purchases/google/BillingWrapperTest.kt b/purchases/src/test/java/com/revenuecat/purchases/google/BillingWrapperTest.kt index 96caf8b20..3753bcf48 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/google/BillingWrapperTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/google/BillingWrapperTest.kt @@ -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.PurchasesState import com.revenuecat.purchases.PurchasesStateCache import com.revenuecat.purchases.PurchasesStateProvider import com.revenuecat.purchases.assertDebugLog @@ -112,7 +113,7 @@ class BillingWrapperTest { private val subsGoogleProductType = ProductType.SUBS.toGoogleProductType()!! private val inAppGoogleProductType = ProductType.INAPP.toGoogleProductType()!! - private val purchasesStateProvider = PurchasesStateCache() + private val purchasesStateProvider = PurchasesStateCache(PurchasesState()) @Before fun setup() { diff --git a/purchases/src/test/java/com/revenuecat/purchases/google/usecase/BaseBillingUseCaseTest.kt b/purchases/src/test/java/com/revenuecat/purchases/google/usecase/BaseBillingUseCaseTest.kt index ed3760300..6c836f9c1 100644 --- a/purchases/src/test/java/com/revenuecat/purchases/google/usecase/BaseBillingUseCaseTest.kt +++ b/purchases/src/test/java/com/revenuecat/purchases/google/usecase/BaseBillingUseCaseTest.kt @@ -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.PurchasesState import com.revenuecat.purchases.PurchasesStateCache import com.revenuecat.purchases.PurchasesStateProvider import com.revenuecat.purchases.common.BillingAbstract @@ -47,7 +48,7 @@ internal open class BaseBillingUseCaseTest { private var onConnectedCalled: Boolean = false private var mockPurchasesListener: BillingAbstract.PurchasesUpdatedListener = mockk() - private val purchasesStateProvider = PurchasesStateCache() + private val purchasesStateProvider = PurchasesStateCache(PurchasesState()) @Before open fun setup() { diff --git a/purchases/src/testDefaults/kotlin/com/revenuecat/purchases/attributes/SubscriberAttributesPurchasesTests.kt b/purchases/src/testDefaults/kotlin/com/revenuecat/purchases/attributes/SubscriberAttributesPurchasesTests.kt index 52b7d2a0c..a40344dc0 100644 --- a/purchases/src/testDefaults/kotlin/com/revenuecat/purchases/attributes/SubscriberAttributesPurchasesTests.kt +++ b/purchases/src/testDefaults/kotlin/com/revenuecat/purchases/attributes/SubscriberAttributesPurchasesTests.kt @@ -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.PurchasesState import com.revenuecat.purchases.PurchasesStateCache import com.revenuecat.purchases.PurchasesStateProvider import com.revenuecat.purchases.Store @@ -101,7 +102,7 @@ class SubscriberAttributesPurchasesTests { offeringsManager = offeringsManagerMock, paywallEventsManager = null, paywallPresentedCache = PaywallPresentedCache(), - purchasesStateCache = PurchasesStateCache(), + purchasesStateCache = PurchasesStateCache(PurchasesState()), ) underTest = Purchases(purchasesOrchestrator)