Skip to content

Commit 3320845

Browse files
NickSxticlaude
andcommitted
refactor: remove QDeferredTransaction, use QPurchaseResult directly per review
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 0849c93 commit 3320845

File tree

8 files changed

+10
-141
lines changed

8 files changed

+10
-141
lines changed

sdk/src/main/java/com/qonversion/android/sdk/QonversionConfig.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ class QonversionConfig internal constructor(
2828
internal val application: Application,
2929
internal val primaryConfig: PrimaryConfig,
3030
internal val cacheConfig: CacheConfig,
31-
// Review feedback (Task 6): removed entitlementsUpdateListener from config.
32-
// The deprecated builder method now wraps it in an adapter stored as deferredPurchasesListener.
3331
internal val deferredPurchasesListener: QDeferredPurchasesListener? = null
3432
) {
3533

sdk/src/main/java/com/qonversion/android/sdk/dto/QDeferredTransaction.kt

Lines changed: 0 additions & 30 deletions
This file was deleted.

sdk/src/main/java/com/qonversion/android/sdk/internal/EntitlementsUpdateListenerAdapter.kt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.qonversion.android.sdk.internal
22

3-
import com.qonversion.android.sdk.dto.QDeferredTransaction
43
import com.qonversion.android.sdk.dto.QPurchaseResult
54
import com.qonversion.android.sdk.listeners.QDeferredPurchasesListener
65
import com.qonversion.android.sdk.listeners.QEntitlementsUpdateListener
@@ -19,10 +18,7 @@ internal class EntitlementsUpdateListenerAdapter(
1918
private val legacyListener: QEntitlementsUpdateListener
2019
) : QDeferredPurchasesListener {
2120

22-
override fun deferredPurchaseCompleted(
23-
transaction: QDeferredTransaction,
24-
purchaseResult: QPurchaseResult
25-
) {
21+
override fun deferredPurchaseCompleted(purchaseResult: QPurchaseResult) {
2622
legacyListener.onEntitlementsUpdated(purchaseResult.entitlements)
2723
}
2824
}

sdk/src/main/java/com/qonversion/android/sdk/internal/InternalConfig.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@ import com.qonversion.android.sdk.internal.provider.PrimaryConfigProvider
1111
import com.qonversion.android.sdk.internal.provider.UidProvider
1212
import com.qonversion.android.sdk.listeners.QDeferredPurchasesListener
1313

14-
// Review feedback (Task 6): removed entitlementsUpdateListener property.
15-
// InternalConfig now only holds deferredPurchasesListener. When the deprecated
16-
// setEntitlementsUpdateListener() is called, the legacy listener is wrapped in
17-
// EntitlementsUpdateListenerAdapter and stored as deferredPurchasesListener.
18-
// This eliminates duplicate listener storage and dual invocation logic.
1914
internal class InternalConfig(
2015
override var primaryConfig: PrimaryConfig,
2116
override val cacheConfig: CacheConfig,

sdk/src/main/java/com/qonversion/android/sdk/internal/QProductCenterManager.kt

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ import com.qonversion.android.sdk.internal.storage.LaunchResultCacheWrapper
4747
import com.qonversion.android.sdk.internal.storage.PurchasesCache
4848
import com.qonversion.android.sdk.listeners.QDeferredPurchasesListener
4949
import com.qonversion.android.sdk.listeners.QEntitlementsUpdateListener
50-
import com.qonversion.android.sdk.dto.QDeferredTransaction
51-
import com.qonversion.android.sdk.dto.QDeferredTransactionType
5250
import com.qonversion.android.sdk.listeners.QonversionUserCallback
5351
import com.qonversion.android.sdk.listeners.QonversionPurchaseCallback
5452
import com.qonversion.android.sdk.dto.QPurchaseResult
@@ -468,8 +466,6 @@ internal class QProductCenterManager internal constructor(
468466
callback.onSuccess(user)
469467
}
470468

471-
// Review feedback (Task 6): deprecated setter wraps legacy listener in adapter.
472-
// QProductCenterManager only works with deferredPurchasesListener internally.
473469
fun setEntitlementsUpdateListener(entitlementsUpdateListener: QEntitlementsUpdateListener) {
474470
internalConfig.deferredPurchasesListener = EntitlementsUpdateListenerAdapter(entitlementsUpdateListener)
475471
}
@@ -576,17 +572,7 @@ internal class QProductCenterManager internal constructor(
576572
if (callback != null) {
577573
callback.onResult(purchaseResult)
578574
} else {
579-
// Review feedback (Task 6): single listener invocation.
580-
// The adapter handles forwarding entitlements to legacy listeners.
581-
val deferredTransaction = QDeferredTransaction(
582-
productId = purchase.productId ?: "",
583-
transactionId = purchase.purchaseToken,
584-
originalTransactionId = purchase.orderId,
585-
type = QDeferredTransactionType.Unknown,
586-
value = 0.0,
587-
currency = null
588-
)
589-
internalConfig.deferredPurchasesListener?.deferredPurchaseCompleted(deferredTransaction, purchaseResult)
575+
internalConfig.deferredPurchasesListener?.deferredPurchaseCompleted(purchaseResult)
590576
}
591577
}
592578

@@ -1081,19 +1067,9 @@ internal class QProductCenterManager internal constructor(
10811067

10821068
removePurchaseOptions(product?.storeId)
10831069

1084-
// Review feedback (Task 6): single listener invocation.
1085-
// The adapter handles forwarding entitlements to legacy listeners.
10861070
if (purchaseCallback == null) {
1087-
val deferredTransaction = QDeferredTransaction(
1088-
productId = purchase.productId ?: "",
1089-
transactionId = purchase.purchaseToken,
1090-
originalTransactionId = purchase.orderId,
1091-
type = QDeferredTransactionType.Unknown,
1092-
value = 0.0,
1093-
currency = null
1094-
)
10951071
val purchaseResult = QPurchaseResult.success(entitlements, purchase)
1096-
internalConfig.deferredPurchasesListener?.deferredPurchaseCompleted(deferredTransaction, purchaseResult)
1072+
internalConfig.deferredPurchasesListener?.deferredPurchaseCompleted(purchaseResult)
10971073
} else {
10981074
purchaseCallback.onResult(QPurchaseResult.success(entitlements, purchase))
10991075
}
Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
package com.qonversion.android.sdk.listeners
22

3-
import com.qonversion.android.sdk.dto.QDeferredTransaction
43
import com.qonversion.android.sdk.dto.QPurchaseResult
54

65
/**
76
* The listener for deferred purchase completions.
87
*
98
* Deferred purchases happen when transactions require additional steps to complete,
109
* such as pending transactions on Google Play or purchases requiring additional access grants.
11-
* This listener provides full transaction details and the purchase result with entitlements.
10+
* This listener provides the purchase result with entitlements.
1211
*
1312
* It can be provided to the [QonversionConfig](com.qonversion.android.sdk.QonversionConfig)
1413
* via [QonversionConfig.Builder.setDeferredPurchasesListener](com.qonversion.android.sdk.QonversionConfig.Builder.setDeferredPurchasesListener)
@@ -20,12 +19,9 @@ interface QDeferredPurchasesListener {
2019
/**
2120
* Called when a deferred purchase completes.
2221
*
23-
* A deferred purchase is fundamentally a purchase, so the callback provides both
24-
* the transaction details and the full purchase result containing entitlements.
25-
*
26-
* @param transaction the completed deferred transaction with full details
27-
* including product ID, transaction ID, type, value, and currency.
2822
* @param purchaseResult the purchase result containing entitlements granted by this purchase.
23+
* It also contains the underlying Google Play [Purchase] object with
24+
* productId, purchaseToken, orderId, etc.
2925
*/
30-
fun deferredPurchaseCompleted(transaction: QDeferredTransaction, purchaseResult: QPurchaseResult)
26+
fun deferredPurchaseCompleted(purchaseResult: QPurchaseResult)
3127
}
Lines changed: 3 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.qonversion.android.sdk.internal
22

33
import android.os.Build
4-
import com.qonversion.android.sdk.dto.QDeferredTransaction
5-
import com.qonversion.android.sdk.dto.QDeferredTransactionType
64
import com.qonversion.android.sdk.dto.QPurchaseResult
75
import com.qonversion.android.sdk.dto.entitlements.QEntitlement
86
import com.qonversion.android.sdk.listeners.QDeferredPurchasesListener
@@ -26,7 +24,7 @@ internal class DeferredPurchasesListenerTest {
2624
clearAllMocks()
2725
}
2826

29-
// -- Adapter pattern tests (review feedback: Task 6) --
27+
// -- Adapter pattern tests --
3028

3129
@Test
3230
fun `adapter forwards entitlements from purchaseResult to legacy listener`() {
@@ -41,16 +39,7 @@ internal class DeferredPurchasesListenerTest {
4139
val purchaseResult = mockk<QPurchaseResult>()
4240
every { purchaseResult.entitlements } returns entitlements
4341

44-
val transaction = QDeferredTransaction(
45-
productId = "com.app.premium",
46-
transactionId = "token_123",
47-
originalTransactionId = "order_456",
48-
type = QDeferredTransactionType.Subscription,
49-
value = 9.99,
50-
currency = "USD"
51-
)
52-
53-
adapter.deferredPurchaseCompleted(transaction, purchaseResult)
42+
adapter.deferredPurchaseCompleted(purchaseResult)
5443

5544
verify(exactly = 1) { legacyListener.onEntitlementsUpdated(entitlements) }
5645
}
@@ -67,16 +56,7 @@ internal class DeferredPurchasesListenerTest {
6756
val purchaseResult = mockk<QPurchaseResult>()
6857
every { purchaseResult.entitlements } returns emptyMap()
6958

70-
val transaction = QDeferredTransaction(
71-
productId = "com.app.coins",
72-
transactionId = "token_456",
73-
originalTransactionId = null,
74-
type = QDeferredTransactionType.Consumable,
75-
value = 0.0,
76-
currency = null
77-
)
78-
79-
adapter.deferredPurchaseCompleted(transaction, purchaseResult)
59+
adapter.deferredPurchaseCompleted(purchaseResult)
8060

8161
verify(exactly = 1) { legacyListener.onEntitlementsUpdated(emptyMap()) }
8262
}
@@ -114,44 +94,4 @@ internal class DeferredPurchasesListenerTest {
11494

11595
assertNull(mockConfig.deferredPurchasesListener)
11696
}
117-
118-
// -- DeferredTransaction data class tests --
119-
120-
@Test
121-
fun `DeferredTransaction data class holds correct values`() {
122-
val transaction = QDeferredTransaction(
123-
productId = "com.app.premium",
124-
transactionId = "token_123",
125-
originalTransactionId = "order_456",
126-
type = QDeferredTransactionType.Subscription,
127-
value = 9.99,
128-
currency = "USD"
129-
)
130-
131-
assertEquals("com.app.premium", transaction.productId)
132-
assertEquals("token_123", transaction.transactionId)
133-
assertEquals("order_456", transaction.originalTransactionId)
134-
assertEquals(QDeferredTransactionType.Subscription, transaction.type)
135-
assertEquals(9.99, transaction.value, 0.001)
136-
assertEquals("USD", transaction.currency)
137-
}
138-
139-
@Test
140-
fun `DeferredTransaction with null optional fields`() {
141-
val transaction = QDeferredTransaction(
142-
productId = "com.app.consumable",
143-
transactionId = null,
144-
originalTransactionId = null,
145-
type = QDeferredTransactionType.Consumable,
146-
value = 0.0,
147-
currency = null
148-
)
149-
150-
assertEquals("com.app.consumable", transaction.productId)
151-
assertNull(transaction.transactionId)
152-
assertNull(transaction.originalTransactionId)
153-
assertEquals(QDeferredTransactionType.Consumable, transaction.type)
154-
assertEquals(0.0, transaction.value, 0.001)
155-
assertNull(transaction.currency)
156-
}
15797
}

sdk/src/test/java/com/qonversion/android/sdk/internal/InternalConfigTest.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ import org.junit.jupiter.api.BeforeEach
1313
import org.junit.jupiter.api.Nested
1414
import org.junit.jupiter.api.Test
1515

16-
// Review feedback (Task 6): updated tests to reflect removal of entitlementsUpdateListener
17-
// from InternalConfig. Only deferredPurchasesListener remains.
1816
internal class InternalConfigTest {
1917
private lateinit var internalConfig: InternalConfig
2018

0 commit comments

Comments
 (0)