@@ -5,6 +5,7 @@ import android.app.Application
5
5
import android.content.pm.PackageManager
6
6
import android.os.Build
7
7
import com.android.billingclient.api.Purchase
8
+ import com.qonversion.android.sdk.dto.QPurchaseOptions
8
9
import com.qonversion.android.sdk.dto.entitlements.QEntitlement
9
10
import com.qonversion.android.sdk.listeners.QonversionEligibilityCallback
10
11
import com.qonversion.android.sdk.dto.QonversionError
@@ -94,6 +95,10 @@ internal class QProductCenterManager internal constructor(
94
95
95
96
private var converter: PurchaseConverter = GooglePurchaseConverter ()
96
97
98
+ private val processingPurchaseOptions: MutableMap <String , QPurchaseOptions > by lazy {
99
+ purchasesCache.loadProcessingPurchasesOptions().toMutableMap()
100
+ }
101
+
97
102
@Volatile
98
103
lateinit var billingService: BillingService
99
104
@Synchronized set
@@ -324,7 +329,7 @@ internal class QProductCenterManager internal constructor(
324
329
callback.onError(QonversionError (QonversionErrorCode .ProductNotFound ))
325
330
return
326
331
}
327
- val oldProduct: QProduct ? = getProductForPurchase(purchaseModel.oldProductId, products)
332
+ val oldProduct: QProduct ? = purchaseModel.options?.oldProduct ? : getProductForPurchase(purchaseModel.oldProductId, products)
328
333
val purchaseModelEnriched = purchaseModel.enrich(product, oldProduct)
329
334
processPurchase(context, purchaseModelEnriched, callback)
330
335
}
@@ -349,9 +354,28 @@ internal class QProductCenterManager internal constructor(
349
354
}
350
355
351
356
purchasingCallbacks[purchaseModel.product.storeID] = callback
357
+
358
+ updatePurchaseOptions(purchaseModel.options, purchaseModel.product.storeID)
359
+
352
360
billingService.purchase(context, purchaseModel)
353
361
}
354
362
363
+ private fun updatePurchaseOptions (options : QPurchaseOptions ? , storeProductId : String? ) {
364
+ storeProductId?.let { productId ->
365
+ options?.let {
366
+ processingPurchaseOptions[productId] = it
367
+ } ? : run {
368
+ processingPurchaseOptions.remove(productId)
369
+ }
370
+
371
+ purchasesCache.saveProcessingPurchasesOptions(processingPurchaseOptions)
372
+ }
373
+ }
374
+
375
+ private fun removePurchaseOptions (productId : String? ) {
376
+ updatePurchaseOptions(null , productId)
377
+ }
378
+
355
379
private fun getProductForPurchase (
356
380
productId : String? ,
357
381
products : Map <String , QProduct >
@@ -651,7 +675,7 @@ internal class QProductCenterManager internal constructor(
651
675
652
676
processingPurchases = completedPurchases
653
677
654
- val purchasesInfo = converter.convertPurchases(completedPurchases)
678
+ val purchasesInfo = converter.convertPurchases(completedPurchases, processingPurchaseOptions )
655
679
656
680
val handledPurchasesCallback =
657
681
getWrappedPurchasesCallback(completedPurchases, callback)
@@ -673,6 +697,9 @@ internal class QProductCenterManager internal constructor(
673
697
return object : QonversionLaunchCallback {
674
698
override fun onSuccess (launchResult : QLaunchResult ) {
675
699
handledPurchasesCache.saveHandledPurchases(trackingPurchases)
700
+ trackingPurchases.forEach {
701
+ removePurchaseOptions(it.productId)
702
+ }
676
703
outerCallback?.onSuccess(launchResult)
677
704
}
678
705
@@ -959,7 +986,8 @@ internal class QProductCenterManager internal constructor(
959
986
val product: QProduct ? = launchResultCache.getActualProducts()?.values?.find {
960
987
it.storeID == purchase.productId
961
988
}
962
- val purchaseInfo = converter.convertPurchase(purchase)
989
+ val currentPurchaseOptions = processingPurchaseOptions[purchase.productId]
990
+ val purchaseInfo = converter.convertPurchase(purchase, currentPurchaseOptions)
963
991
repository.purchase(
964
992
installDate,
965
993
purchaseInfo,
@@ -970,6 +998,7 @@ internal class QProductCenterManager internal constructor(
970
998
971
999
val entitlements = launchResult.permissions.toEntitlementsMap()
972
1000
1001
+ removePurchaseOptions(product?.storeID)
973
1002
purchaseCallback?.onSuccess(entitlements) ? : run {
974
1003
internalConfig.entitlementsUpdateListener?.onEntitlementsUpdated(
975
1004
entitlements
@@ -981,6 +1010,8 @@ internal class QProductCenterManager internal constructor(
981
1010
override fun onError (error : QonversionError ) {
982
1011
storeFailedPurchaseIfNecessary(purchase, purchaseInfo, product)
983
1012
1013
+ removePurchaseOptions(product?.storeID)
1014
+
984
1015
if (shouldCalculatePermissionsLocally(error)) {
985
1016
calculatePurchasePermissionsLocally(
986
1017
purchase,
0 commit comments