diff --git a/config/detekt/baseline.xml b/config/detekt/baseline.xml
index a4a0a429..87bbe330 100644
--- a/config/detekt/baseline.xml
+++ b/config/detekt/baseline.xml
@@ -118,6 +118,8 @@
MaxLineLength:QonversionConfig.kt$QonversionConfig.Builder$*
MaxLineLength:QonversionError.kt$QonversionErrorCode$*
MaxLineLength:QonversionError.kt$QonversionErrorCode$RemoteConfigurationNotAvailable : QonversionErrorCode
+ MaxLineLength:QonversionInternal.kt$QonversionInternal$@Deprecated("Use the new purchase() method", replaceWith = ReplaceWith("purchase(context, TODO(\"pass product here\"), callback)"))
+ MaxLineLength:QonversionInternal.kt$QonversionInternal$@Deprecated("Use the new updatePurchase() method", replaceWith = ReplaceWith("updatePurchase(context, TODO(\"pass product here\"), TODO(\"pass purchase options here\"), callback)"))
MaxLineLength:QonversionRepositoryIntegrationTest.kt$QonversionRepositoryIntegrationTest$"""HTTP status code=400, data={"message":"Invalid access token received","code":10003,"status":400,"extra":[]}. """
MaxLineLength:QonversionRepositoryIntegrationTest.kt$QonversionRepositoryIntegrationTest$"lcbfeigohklhpdgmpildjabg.AO-J1OyV-EE2bKGqDcRCvqjZ2NI1uHDRuvonRn5RorP6LNsyK7yHK8FaFlXp6bjTEX3-4JvZKtbY_bpquKBfux09Mfkx05M9YGZsfsr5BJk74r719m77Oyo"
MaxLineLength:QonversionRepositoryIntegrationTest.kt$QonversionRepositoryIntegrationTest$"lgeigljfpmeoddkcebkcepjc.AO-J1Oy305qZj99jXTPEVBN8UZGoYAtjDLj4uTjRQvUFaG0vie-nr6VBlN0qnNDMU8eJR-sI7o3CwQyMOEHKl8eJsoQ86KSFzxKBR07PSpHLI_o7agXhNKY"
@@ -154,11 +156,13 @@
MaximumLineLength:com.qonversion.android.sdk.internal.OutagerIntegrationTest.kt:214
MaximumLineLength:com.qonversion.android.sdk.internal.OutagerIntegrationTest.kt:371
MaximumLineLength:com.qonversion.android.sdk.internal.OutagerIntegrationTest.kt:90
- MaximumLineLength:com.qonversion.android.sdk.internal.QProductCenterManager.kt:332
+ MaximumLineLength:com.qonversion.android.sdk.internal.QProductCenterManager.kt:333
MaximumLineLength:com.qonversion.android.sdk.internal.QProductCenterManagerTest.kt:152
MaximumLineLength:com.qonversion.android.sdk.internal.QProductCenterManagerTest.kt:153
MaximumLineLength:com.qonversion.android.sdk.internal.QRemoteConfigManager.kt:225
MaximumLineLength:com.qonversion.android.sdk.internal.QUserPropertiesManagerTest.kt:178
+ MaximumLineLength:com.qonversion.android.sdk.internal.QonversionInternal.kt:162
+ MaximumLineLength:com.qonversion.android.sdk.internal.QonversionInternal.kt:213
MaximumLineLength:com.qonversion.android.sdk.internal.QonversionRepositoryIntegrationTest.kt:287
MaximumLineLength:com.qonversion.android.sdk.internal.QonversionRepositoryIntegrationTest.kt:356
MaximumLineLength:com.qonversion.android.sdk.internal.QonversionRepositoryIntegrationTest.kt:878
@@ -243,7 +247,7 @@
ReturnCount:QExceptionManager.kt$QExceptionManager$private fun getContentOfCrashReport(filename: String): CrashRequest.ExceptionInfo?
ReturnCount:QProductCenterManager.kt$QProductCenterManager$@Synchronized private fun executeProductsBlocks(loadStoreProductsError: QonversionError? = null)
ReturnCount:QProductCenterManager.kt$QProductCenterManager$fun identify(identityId: String, callback: QonversionUserCallback? = null)
- ReturnCount:QProductCenterManager.kt$QProductCenterManager$private fun calculatePurchasePermissionsLocally( purchase: Purchase, purchaseCallback: QonversionEntitlementsCallback?, purchaseError: QonversionError )
+ ReturnCount:QProductCenterManager.kt$QProductCenterManager$private fun calculatePurchasePermissionsLocally( purchase: Purchase, purchaseCallback: QonversionPurchaseCallback?, purchaseError: QonversionError )
ReturnCount:ScreenPresenter.kt$ScreenPresenter$override fun shouldOverrideUrlLoading(url: String?): Boolean
SpacingAroundColon:com.qonversion.android.sdk.internal.requests.ProviderDataRequestTest.kt:45
SpacingAroundCurly:com.qonversion.android.sdk.automations.internal.QAutomationsManagerTest.kt:254
diff --git a/sdk/src/main/java/com/qonversion/android/sdk/internal/QProductCenterManager.kt b/sdk/src/main/java/com/qonversion/android/sdk/internal/QProductCenterManager.kt
index 30b3f08f..d7e32794 100644
--- a/sdk/src/main/java/com/qonversion/android/sdk/internal/QProductCenterManager.kt
+++ b/sdk/src/main/java/com/qonversion/android/sdk/internal/QProductCenterManager.kt
@@ -45,6 +45,7 @@ import com.qonversion.android.sdk.internal.services.QUserInfoService
import com.qonversion.android.sdk.internal.storage.LaunchResultCacheWrapper
import com.qonversion.android.sdk.internal.storage.PurchasesCache
import com.qonversion.android.sdk.listeners.QEntitlementsUpdateListener
+import com.qonversion.android.sdk.listeners.QonversionPurchaseCallback
import com.qonversion.android.sdk.listeners.QonversionUserCallback
import kotlin.math.min
import java.util.Date
@@ -79,7 +80,7 @@ internal class QProductCenterManager internal constructor(
private var productsCallbacks = mutableListOf()
private var entitlementCallbacks = mutableListOf()
- private var purchasingCallbacks = mutableMapOf()
+ private var purchasingCallbacks = mutableMapOf()
private var restoreCallbacks = mutableListOf()
private var processingPartnersIdentityId: String? = null
@@ -292,7 +293,7 @@ internal class QProductCenterManager internal constructor(
fun purchaseProduct(
context: Activity,
purchaseModel: PurchaseModelInternal,
- callback: QonversionEntitlementsCallback
+ callback: QonversionPurchaseCallback
) {
if (internalConfig.isAnalyticsMode) {
logger.warn(
@@ -318,7 +319,7 @@ internal class QProductCenterManager internal constructor(
private fun tryToPurchase(
context: Activity,
purchaseModel: PurchaseModelInternal,
- callback: QonversionEntitlementsCallback
+ callback: QonversionPurchaseCallback
) {
val products = launchResultCache.getActualProducts() ?: run {
callback.onError(launchError ?: QonversionError(QonversionErrorCode.LaunchError))
@@ -337,7 +338,7 @@ internal class QProductCenterManager internal constructor(
private fun processPurchase(
context: Activity,
purchaseModel: PurchaseModelInternalEnriched,
- callback: QonversionEntitlementsCallback
+ callback: QonversionPurchaseCallback
) {
if (purchaseModel.product.storeID == null) {
callback.onError(QonversionError(QonversionErrorCode.ProductNotFound))
@@ -477,7 +478,7 @@ internal class QProductCenterManager internal constructor(
private fun calculatePurchasePermissionsLocally(
purchase: Purchase,
- purchaseCallback: QonversionEntitlementsCallback?,
+ purchaseCallback: QonversionPurchaseCallback?,
purchaseError: QonversionError
) {
val products = launchResultCache.getActualProducts() ?: run {
@@ -505,11 +506,11 @@ internal class QProductCenterManager internal constructor(
purchasedProduct,
productPermissions
)
- purchaseCallback?.onSuccess(permissions.toEntitlementsMap())
+ purchaseCallback?.onSuccess(permissions.toEntitlementsMap(), purchase)
}
private fun failLocallyGrantingPurchasePermissionsWithError(
- callback: QonversionEntitlementsCallback?,
+ callback: QonversionPurchaseCallback?,
error: QonversionError
) {
launchResultCache.clearPermissionsCache()
@@ -999,7 +1000,7 @@ internal class QProductCenterManager internal constructor(
val entitlements = launchResult.permissions.toEntitlementsMap()
removePurchaseOptions(product?.storeID)
- purchaseCallback?.onSuccess(entitlements) ?: run {
+ purchaseCallback?.onSuccess(entitlements, purchase) ?: run {
internalConfig.entitlementsUpdateListener?.onEntitlementsUpdated(
entitlements
)
diff --git a/sdk/src/main/java/com/qonversion/android/sdk/internal/QonversionInternal.kt b/sdk/src/main/java/com/qonversion/android/sdk/internal/QonversionInternal.kt
index 9d7986f4..f79eaac7 100644
--- a/sdk/src/main/java/com/qonversion/android/sdk/internal/QonversionInternal.kt
+++ b/sdk/src/main/java/com/qonversion/android/sdk/internal/QonversionInternal.kt
@@ -5,6 +5,7 @@ import android.app.Application
import android.os.Handler
import android.os.Looper
import androidx.lifecycle.ProcessLifecycleOwner
+import com.android.billingclient.api.Purchase
import com.qonversion.android.sdk.Qonversion
import com.qonversion.android.sdk.automations.internal.QAutomationsManager
import com.qonversion.android.sdk.dto.QAttributionProvider
@@ -37,6 +38,7 @@ import com.qonversion.android.sdk.listeners.QonversionRemoteConfigCallback
import com.qonversion.android.sdk.listeners.QonversionEligibilityCallback
import com.qonversion.android.sdk.listeners.QonversionUserCallback
import com.qonversion.android.sdk.listeners.QEntitlementsUpdateListener
+import com.qonversion.android.sdk.listeners.QonversionPurchaseCallback
import com.qonversion.android.sdk.listeners.QonversionRemoteConfigListCallback
import com.qonversion.android.sdk.listeners.QonversionRemoteConfigurationAttachCallback
import com.qonversion.android.sdk.listeners.QonversionUserPropertiesCallback
@@ -157,6 +159,7 @@ internal class QonversionInternal(
})
}
+ @Deprecated("Use the new purchase() method", replaceWith = ReplaceWith("purchase(context, TODO(\"pass product here\"), callback)"))
override fun purchase(
context: Activity,
purchaseModel: QPurchaseModel,
@@ -165,7 +168,7 @@ internal class QonversionInternal(
productCenterManager.purchaseProduct(
context,
PurchaseModelInternal(purchaseModel),
- mainEntitlementsCallback(callback)
+ mainPurchaseCallback(callback)
)
}
@@ -178,7 +181,7 @@ internal class QonversionInternal(
productCenterManager.purchaseProduct(
context,
PurchaseModelInternal(product, options),
- mainEntitlementsCallback(callback)
+ mainPurchaseCallback(callback)
)
}
@@ -190,7 +193,7 @@ internal class QonversionInternal(
productCenterManager.purchaseProduct(
context,
PurchaseModelInternal(product),
- mainEntitlementsCallback(callback)
+ mainPurchaseCallback(callback)
)
}
@@ -203,10 +206,11 @@ internal class QonversionInternal(
productCenterManager.purchaseProduct(
context,
PurchaseModelInternal(product, options),
- mainEntitlementsCallback(callback)
+ mainPurchaseCallback(callback)
)
}
+ @Deprecated("Use the new updatePurchase() method", replaceWith = ReplaceWith("updatePurchase(context, TODO(\"pass product here\"), TODO(\"pass purchase options here\"), callback)"))
override fun updatePurchase(
context: Activity,
purchaseUpdateModel: QPurchaseUpdateModel,
@@ -215,7 +219,7 @@ internal class QonversionInternal(
productCenterManager.purchaseProduct(
context,
PurchaseModelInternal(purchaseUpdateModel),
- mainEntitlementsCallback(callback)
+ mainPurchaseCallback(callback)
)
}
@@ -395,6 +399,34 @@ internal class QonversionInternal(
postToMainThread { callback.onError(error) }
}
+ private fun mainPurchaseCallback(callback: QonversionEntitlementsCallback): QonversionPurchaseCallback {
+ val purchaseCallback = if (callback is QonversionPurchaseCallback) {
+ callback
+ } else {
+ object : QonversionPurchaseCallback {
+ override fun onSuccess(entitlements: Map) {
+ callback.onSuccess(entitlements)
+ }
+
+ override fun onError(error: QonversionError) {
+ callback.onError(error)
+ }
+ }
+ }
+
+ return object : QonversionPurchaseCallback {
+ override fun onSuccess(entitlements: Map, purchase: Purchase) {
+ postToMainThread { purchaseCallback.onSuccess(entitlements, purchase) }
+ }
+
+ override fun onSuccess(entitlements: Map) =
+ postToMainThread { purchaseCallback.onSuccess(entitlements) }
+
+ override fun onError(error: QonversionError) =
+ postToMainThread { purchaseCallback.onError(error) }
+ }
+ }
+
private fun mainUserCallback(callback: QonversionUserCallback): QonversionUserCallback =
object : QonversionUserCallback {
override fun onSuccess(user: QUser) =
diff --git a/sdk/src/main/java/com/qonversion/android/sdk/listeners/QonversionCallback.kt b/sdk/src/main/java/com/qonversion/android/sdk/listeners/QonversionCallback.kt
index 9520770d..628c8ea9 100644
--- a/sdk/src/main/java/com/qonversion/android/sdk/listeners/QonversionCallback.kt
+++ b/sdk/src/main/java/com/qonversion/android/sdk/listeners/QonversionCallback.kt
@@ -1,5 +1,6 @@
package com.qonversion.android.sdk.listeners
+import com.android.billingclient.api.Purchase
import com.qonversion.android.sdk.dto.entitlements.QEntitlement
import com.qonversion.android.sdk.dto.QRemoteConfig
import com.qonversion.android.sdk.dto.QRemoteConfigList
@@ -46,6 +47,10 @@ interface QonversionRemoteConfigurationAttachCallback {
fun onError(error: QonversionError)
}
+interface QonversionPurchaseCallback : QonversionEntitlementsCallback {
+ fun onSuccess(entitlements: Map, purchase: Purchase) = onSuccess(entitlements)
+}
+
interface QonversionEntitlementsCallback {
fun onSuccess(entitlements: Map)
fun onError(error: QonversionError)