react-native-iap 15.4.0-rc.2 → 15.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -25
- package/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt +250 -168
- package/android/src/main/java/com/margelo/nitro/iap/ProductSerialization.kt +98 -0
- package/ios/HybridRnIap.swift +19 -1
- package/ios/RnIapHelper.swift +30 -2
- package/lib/module/hooks/useIAP.js +19 -3
- package/lib/module/hooks/useIAP.js.map +1 -1
- package/lib/module/index.js +104 -18
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.kepler.js +3 -0
- package/lib/module/index.kepler.js.map +1 -1
- package/lib/module/types.js +67 -6
- package/lib/module/types.js.map +1 -1
- package/lib/module/utils/type-bridge.js +22 -3
- package/lib/module/utils/type-bridge.js.map +1 -1
- package/lib/module/vega-adapter.js +24 -2
- package/lib/module/vega-adapter.js.map +1 -1
- package/lib/typescript/src/hooks/useIAP.d.ts +25 -2
- package/lib/typescript/src/hooks/useIAP.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +50 -10
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/index.kepler.d.ts +3 -0
- package/lib/typescript/src/index.kepler.d.ts.map +1 -1
- package/lib/typescript/src/specs/RnIap.nitro.d.ts +79 -9
- package/lib/typescript/src/specs/RnIap.nitro.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +223 -35
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/utils/type-bridge.d.ts.map +1 -1
- package/lib/typescript/src/vega-adapter.d.ts.map +1 -1
- package/nitrogen/generated/android/NitroIap+autolinking.cmake +3 -0
- package/nitrogen/generated/android/c++/JBillingChoiceImageLayoutAndroid.hpp +61 -0
- package/nitrogen/generated/android/c++/JBillingChoiceScreenTypeAndroid.hpp +61 -0
- package/nitrogen/generated/android/c++/JBillingProgramAndroid.hpp +3 -0
- package/nitrogen/generated/android/c++/JDeveloperBillingLaunchModeAndroid.hpp +61 -0
- package/nitrogen/generated/android/c++/JDeveloperBillingOptionParamsAndroid.hpp +78 -0
- package/nitrogen/generated/android/c++/JDeveloperBillingTypeAndroid.hpp +61 -0
- package/nitrogen/generated/android/c++/JDeveloperProvidedBillingDetailsAndroid.hpp +45 -5
- package/nitrogen/generated/android/c++/JDeveloperProvidedBillingProductAndroid.hpp +72 -0
- package/nitrogen/generated/android/c++/JFunc_void_DeveloperProvidedBillingDetailsAndroid.hpp +10 -0
- package/nitrogen/generated/android/c++/JHybridRnIapSpec.cpp +118 -3
- package/nitrogen/generated/android/c++/JHybridRnIapSpec.hpp +4 -1
- package/nitrogen/generated/android/c++/JInAppMessageCategoryAndroid.hpp +58 -0
- package/nitrogen/generated/android/c++/JInAppMessageResponseCodeAndroid.hpp +58 -0
- package/nitrogen/generated/android/c++/JInitConnectionConfig.hpp +7 -1
- package/nitrogen/generated/android/c++/JNitroBillingChoiceInfoAndroid.hpp +66 -0
- package/nitrogen/generated/android/c++/JNitroBillingProgramAvailabilityResultAndroid.hpp +18 -3
- package/nitrogen/generated/android/c++/JNitroBillingProgramInformationDialogParamsAndroid.hpp +63 -0
- package/nitrogen/generated/android/c++/JNitroBillingResultAndroid.hpp +72 -0
- package/nitrogen/generated/android/c++/JNitroGetBillingChoiceInfoParamsAndroid.hpp +74 -0
- package/nitrogen/generated/android/c++/JNitroInAppMessageParamsAndroid.hpp +64 -0
- package/nitrogen/generated/android/c++/JNitroInAppMessageResultAndroid.hpp +68 -0
- package/nitrogen/generated/android/c++/JNitroLaunchExternalLinkParamsAndroid.hpp +10 -1
- package/nitrogen/generated/android/c++/JNitroOneTimePurchaseOfferDetail.hpp +5 -1
- package/nitrogen/generated/android/c++/JNitroProduct.hpp +13 -1
- package/nitrogen/generated/android/c++/JNitroPurchaseRequest.hpp +7 -0
- package/nitrogen/generated/android/c++/JNitroRequestPurchaseAndroid.hpp +16 -1
- package/nitrogen/generated/android/c++/JProductType.hpp +58 -0
- package/nitrogen/generated/android/c++/JSubResponseCodeAndroid.hpp +61 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Array_InAppMessageCategoryAndroid_.cpp +35 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Array_InAppMessageCategoryAndroid_.hpp +81 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DeveloperBillingOptionParamsAndroid.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_DeveloperBillingOptionParamsAndroid.hpp +78 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_InitConnectionConfig.hpp +2 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_NitroInAppMessageParamsAndroid.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_NitroInAppMessageParamsAndroid.hpp +76 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_NitroRequestPurchaseAndroid.hpp +7 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/BillingChoiceImageLayoutAndroid.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/BillingChoiceScreenTypeAndroid.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/BillingProgramAndroid.kt +2 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperBillingLaunchModeAndroid.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperBillingOptionParamsAndroid.kt +47 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperBillingTypeAndroid.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperProvidedBillingDetailsAndroid.kt +13 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperProvidedBillingProductAndroid.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/HybridRnIapSpec.kt +13 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/InAppMessageCategoryAndroid.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/InAppMessageResponseCodeAndroid.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/InitConnectionConfig.kt +5 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingChoiceInfoAndroid.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingProgramAvailabilityResultAndroid.kt +10 -4
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingProgramInformationDialogParamsAndroid.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingResultAndroid.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroGetBillingChoiceInfoParamsAndroid.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroInAppMessageParamsAndroid.kt +38 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroInAppMessageResultAndroid.kt +41 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroLaunchExternalLinkParamsAndroid.kt +6 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroOneTimePurchaseOfferDetail.kt +5 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroProduct.kt +11 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroRequestPurchaseAndroid.kt +8 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ProductType.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/SubResponseCodeAndroid.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_InAppMessageCategoryAndroid_.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_DeveloperBillingOptionParamsAndroid.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroInAppMessageParamsAndroid.kt +53 -0
- package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.cpp +24 -0
- package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.hpp +382 -0
- package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Umbrella.hpp +48 -0
- package/nitrogen/generated/ios/c++/HybridRnIapSpecSwift.hpp +74 -2
- package/nitrogen/generated/ios/swift/BillingChoiceImageLayoutAndroid.swift +44 -0
- package/nitrogen/generated/ios/swift/BillingChoiceScreenTypeAndroid.swift +44 -0
- package/nitrogen/generated/ios/swift/BillingProgramAndroid.swift +4 -0
- package/nitrogen/generated/ios/swift/DeveloperBillingLaunchModeAndroid.swift +44 -0
- package/nitrogen/generated/ios/swift/DeveloperBillingOptionParamsAndroid.swift +114 -0
- package/nitrogen/generated/ios/swift/DeveloperBillingTypeAndroid.swift +44 -0
- package/nitrogen/generated/ios/swift/DeveloperProvidedBillingDetailsAndroid.swift +121 -4
- package/nitrogen/generated/ios/swift/DeveloperProvidedBillingProductAndroid.swift +71 -0
- package/nitrogen/generated/ios/swift/Func_void_NitroBillingChoiceInfoAndroid.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_NitroBillingResultAndroid.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_NitroInAppMessageResultAndroid.swift +46 -0
- package/nitrogen/generated/ios/swift/HybridRnIapSpec.swift +4 -1
- package/nitrogen/generated/ios/swift/HybridRnIapSpec_cxx.swift +78 -2
- package/nitrogen/generated/ios/swift/InAppMessageCategoryAndroid.swift +40 -0
- package/nitrogen/generated/ios/swift/InAppMessageResponseCodeAndroid.swift +40 -0
- package/nitrogen/generated/ios/swift/InitConnectionConfig.swift +12 -1
- package/nitrogen/generated/ios/swift/NitroBillingChoiceInfoAndroid.swift +66 -0
- package/nitrogen/generated/ios/swift/NitroBillingProgramAvailabilityResultAndroid.swift +50 -2
- package/nitrogen/generated/ios/swift/NitroBillingProgramInformationDialogParamsAndroid.swift +34 -0
- package/nitrogen/generated/ios/swift/NitroBillingResultAndroid.swift +77 -0
- package/nitrogen/generated/ios/swift/NitroGetBillingChoiceInfoParamsAndroid.swift +71 -0
- package/nitrogen/generated/ios/swift/NitroInAppMessageParamsAndroid.swift +67 -0
- package/nitrogen/generated/ios/swift/NitroInAppMessageResultAndroid.swift +66 -0
- package/nitrogen/generated/ios/swift/NitroLaunchExternalLinkParamsAndroid.swift +39 -2
- package/nitrogen/generated/ios/swift/NitroOneTimePurchaseOfferDetail.swift +39 -2
- package/nitrogen/generated/ios/swift/NitroProduct.swift +113 -2
- package/nitrogen/generated/ios/swift/NitroRequestPurchaseAndroid.swift +75 -1
- package/nitrogen/generated/ios/swift/ProductType.swift +40 -0
- package/nitrogen/generated/ios/swift/SubResponseCodeAndroid.swift +44 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_DeveloperBillingOptionParamsAndroid.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_NitroInAppMessageParamsAndroid.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType__InAppMessageCategoryAndroid_.swift +18 -0
- package/nitrogen/generated/shared/c++/BillingChoiceImageLayoutAndroid.hpp +80 -0
- package/nitrogen/generated/shared/c++/BillingChoiceScreenTypeAndroid.hpp +80 -0
- package/nitrogen/generated/shared/c++/BillingProgramAndroid.hpp +4 -0
- package/nitrogen/generated/shared/c++/DeveloperBillingLaunchModeAndroid.hpp +80 -0
- package/nitrogen/generated/shared/c++/DeveloperBillingOptionParamsAndroid.hpp +103 -0
- package/nitrogen/generated/shared/c++/DeveloperBillingTypeAndroid.hpp +80 -0
- package/nitrogen/generated/shared/c++/DeveloperProvidedBillingDetailsAndroid.hpp +24 -6
- package/nitrogen/generated/shared/c++/DeveloperProvidedBillingProductAndroid.hpp +96 -0
- package/nitrogen/generated/shared/c++/HybridRnIapSpec.cpp +3 -0
- package/nitrogen/generated/shared/c++/HybridRnIapSpec.hpp +25 -1
- package/nitrogen/generated/shared/c++/InAppMessageCategoryAndroid.hpp +76 -0
- package/nitrogen/generated/shared/c++/InAppMessageResponseCodeAndroid.hpp +76 -0
- package/nitrogen/generated/shared/c++/InitConnectionConfig.hpp +8 -1
- package/nitrogen/generated/shared/c++/NitroBillingChoiceInfoAndroid.hpp +90 -0
- package/nitrogen/generated/shared/c++/NitroBillingProgramAvailabilityResultAndroid.hpp +16 -2
- package/nitrogen/generated/shared/c++/NitroBillingProgramInformationDialogParamsAndroid.hpp +89 -0
- package/nitrogen/generated/shared/c++/NitroBillingResultAndroid.hpp +96 -0
- package/nitrogen/generated/shared/c++/NitroGetBillingChoiceInfoParamsAndroid.hpp +99 -0
- package/nitrogen/generated/shared/c++/NitroInAppMessageParamsAndroid.hpp +88 -0
- package/nitrogen/generated/shared/c++/NitroInAppMessageResultAndroid.hpp +92 -0
- package/nitrogen/generated/shared/c++/NitroLaunchExternalLinkParamsAndroid.hpp +9 -2
- package/nitrogen/generated/shared/c++/NitroOneTimePurchaseOfferDetail.hpp +5 -1
- package/nitrogen/generated/shared/c++/NitroProduct.hpp +13 -1
- package/nitrogen/generated/shared/c++/NitroRequestPurchaseAndroid.hpp +12 -1
- package/nitrogen/generated/shared/c++/ProductType.hpp +76 -0
- package/nitrogen/generated/shared/c++/SubResponseCodeAndroid.hpp +80 -0
- package/openiap-versions.json +3 -3
- package/package.json +1 -1
- package/src/hooks/useIAP.ts +63 -0
- package/src/index.kepler.ts +9 -0
- package/src/index.ts +223 -95
- package/src/specs/RnIap.nitro.ts +116 -8
- package/src/types.ts +238 -35
- package/src/utils/type-bridge.ts +26 -2
- package/src/vega-adapter.ts +46 -11
|
@@ -18,7 +18,7 @@ import dev.hyo.openiap.ProductRequest
|
|
|
18
18
|
import dev.hyo.openiap.ProductSubscriptionAndroid
|
|
19
19
|
import dev.hyo.openiap.ProductSubscriptionAndroidOfferDetails
|
|
20
20
|
import dev.hyo.openiap.ProductCommon
|
|
21
|
-
import dev.hyo.openiap.ProductType
|
|
21
|
+
import dev.hyo.openiap.ProductType as OpenIapProductType
|
|
22
22
|
import dev.hyo.openiap.Purchase as OpenIapPurchase
|
|
23
23
|
import dev.hyo.openiap.PurchaseAndroid
|
|
24
24
|
import dev.hyo.openiap.RequestPurchaseAndroidProps
|
|
@@ -28,6 +28,7 @@ import dev.hyo.openiap.RequestPurchaseResultPurchase
|
|
|
28
28
|
import dev.hyo.openiap.RequestPurchaseResultPurchases
|
|
29
29
|
import dev.hyo.openiap.RequestSubscriptionAndroidProps
|
|
30
30
|
import dev.hyo.openiap.RequestSubscriptionPropsByPlatforms
|
|
31
|
+
import dev.hyo.openiap.SubResponseCodeAndroid as OpenIapSubResponseCodeAndroid
|
|
31
32
|
import dev.hyo.openiap.SubscriptionProductReplacementParamsAndroid as OpenIapSubscriptionProductReplacementParams
|
|
32
33
|
import dev.hyo.openiap.SubscriptionReplacementModeAndroid as OpenIapSubscriptionReplacementMode
|
|
33
34
|
import dev.hyo.openiap.VerifyPurchaseGoogleOptions
|
|
@@ -37,7 +38,17 @@ import dev.hyo.openiap.InitConnectionConfig as OpenIapInitConnectionConfig
|
|
|
37
38
|
import dev.hyo.openiap.listener.OpenIapPurchaseErrorListener
|
|
38
39
|
import dev.hyo.openiap.listener.OpenIapPurchaseUpdateListener
|
|
39
40
|
import dev.hyo.openiap.listener.OpenIapUserChoiceBillingListener
|
|
41
|
+
import dev.hyo.openiap.BillingChoiceImageLayoutAndroid as OpenIapBillingChoiceImageLayout
|
|
42
|
+
import dev.hyo.openiap.BillingChoiceScreenTypeAndroid as OpenIapBillingChoiceScreenType
|
|
43
|
+
import dev.hyo.openiap.BillingProgramInformationDialogParamsAndroid as OpenIapBillingProgramInformationDialogParams
|
|
40
44
|
import dev.hyo.openiap.BillingProgramAndroid as OpenIapBillingProgramAndroid
|
|
45
|
+
import dev.hyo.openiap.DeveloperBillingTypeAndroid as OpenIapDeveloperBillingType
|
|
46
|
+
import dev.hyo.openiap.DeveloperBillingLaunchModeAndroid as OpenIapDeveloperBillingLaunchMode
|
|
47
|
+
import dev.hyo.openiap.DeveloperBillingOptionParamsAndroid as OpenIapDeveloperBillingOptionParams
|
|
48
|
+
import dev.hyo.openiap.GetBillingChoiceInfoParamsAndroid as OpenIapGetBillingChoiceInfoParams
|
|
49
|
+
import dev.hyo.openiap.InAppMessageCategoryAndroid as OpenIapInAppMessageCategory
|
|
50
|
+
import dev.hyo.openiap.InAppMessageParamsAndroid as OpenIapInAppMessageParams
|
|
51
|
+
import dev.hyo.openiap.InAppMessageResponseCodeAndroid as OpenIapInAppMessageResponseCode
|
|
41
52
|
import dev.hyo.openiap.LaunchExternalLinkParamsAndroid as OpenIapLaunchExternalLinkParams
|
|
42
53
|
import dev.hyo.openiap.ExternalLinkLaunchModeAndroid as OpenIapExternalLinkLaunchMode
|
|
43
54
|
import dev.hyo.openiap.ExternalLinkTypeAndroid as OpenIapExternalLinkType
|
|
@@ -55,7 +66,7 @@ import org.json.JSONObject
|
|
|
55
66
|
* Custom exception for OpenIAP errors that only includes the error JSON without stack traces.
|
|
56
67
|
* This ensures clean error messages are passed to JavaScript without Java/Kotlin stack traces.
|
|
57
68
|
*/
|
|
58
|
-
class OpenIapException(private val errorJson: String) : Exception() {
|
|
69
|
+
class OpenIapException(private val errorJson: String, cause: Throwable? = null) : Exception(cause) {
|
|
59
70
|
override val message: String
|
|
60
71
|
get() = errorJson
|
|
61
72
|
|
|
@@ -201,15 +212,27 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
201
212
|
sendUserChoiceBilling(nitroDetails)
|
|
202
213
|
}.onFailure { RnIapLog.failure("userChoiceBillingListener", it) }
|
|
203
214
|
})
|
|
204
|
-
// Developer Provided Billing listener (External Payments
|
|
215
|
+
// Developer Provided Billing listener (External Payments 8.3.0+, Billing Choice 9.1.0+)
|
|
205
216
|
openIap.addDeveloperProvidedBillingListener(OpenIapDeveloperProvidedBillingListener { details ->
|
|
206
217
|
runCatching {
|
|
207
218
|
RnIapLog.result(
|
|
208
219
|
"developerProvidedBillingListener",
|
|
209
|
-
mapOf("
|
|
220
|
+
mapOf("productCount" to details.products.size)
|
|
210
221
|
)
|
|
211
222
|
val nitroDetails = DeveloperProvidedBillingDetailsAndroid(
|
|
212
|
-
externalTransactionToken = details.externalTransactionToken
|
|
223
|
+
externalTransactionToken = details.externalTransactionToken.wrapVariant(),
|
|
224
|
+
linkUri = details.linkUri.wrapVariant(),
|
|
225
|
+
originalExternalTransactionId = details.originalExternalTransactionId.wrapVariant(),
|
|
226
|
+
products = details.products.map { product ->
|
|
227
|
+
DeveloperProvidedBillingProductAndroid(
|
|
228
|
+
id = product.id,
|
|
229
|
+
offerToken = product.offerToken.wrapVariant(),
|
|
230
|
+
type = when (product.type) {
|
|
231
|
+
OpenIapProductType.InApp -> ProductType.IN_APP
|
|
232
|
+
OpenIapProductType.Subs -> ProductType.SUBS
|
|
233
|
+
}
|
|
234
|
+
)
|
|
235
|
+
}.toTypedArray()
|
|
213
236
|
)
|
|
214
237
|
sendDeveloperProvidedBilling(nitroDetails)
|
|
215
238
|
}.onFailure { RnIapLog.failure("developerProvidedBillingListener", it) }
|
|
@@ -255,6 +278,9 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
255
278
|
},
|
|
256
279
|
enableBillingProgramAndroid = configValue.enableBillingProgramAndroid?.let { program ->
|
|
257
280
|
mapBillingProgram(program)
|
|
281
|
+
},
|
|
282
|
+
billingChoiceScreenTypeAndroid = configValue.billingChoiceScreenTypeAndroid?.let { type ->
|
|
283
|
+
mapBillingChoiceScreenTypeToOpenIap(type)
|
|
258
284
|
}
|
|
259
285
|
)
|
|
260
286
|
}
|
|
@@ -478,6 +504,11 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
478
504
|
}
|
|
479
505
|
?: emptyList()
|
|
480
506
|
val normalizedOffers = subscriptionOffers.takeIf { it.isNotEmpty() }
|
|
507
|
+
val developerBillingOption =
|
|
508
|
+
(androidRequest.developerBillingOption as?
|
|
509
|
+
Variant_NullType_DeveloperBillingOptionParamsAndroid.Second)
|
|
510
|
+
?.value
|
|
511
|
+
?.let(::mapDeveloperBillingOption)
|
|
481
512
|
|
|
482
513
|
val requestProps = when (queryType) {
|
|
483
514
|
ProductQueryType.Subs -> {
|
|
@@ -495,6 +526,8 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
495
526
|
isOfferPersonalized = androidRequest.isOfferPersonalized.unwrapBool(),
|
|
496
527
|
obfuscatedAccountId = androidRequest.obfuscatedAccountId.unwrapString(),
|
|
497
528
|
obfuscatedProfileId = androidRequest.obfuscatedProfileId.unwrapString(),
|
|
529
|
+
developerBillingOption = developerBillingOption,
|
|
530
|
+
originalExternalTransactionId = androidRequest.originalExternalTransactionId.unwrapString(),
|
|
498
531
|
purchaseToken = androidRequest.purchaseToken.unwrapString(),
|
|
499
532
|
replacementMode = replacementMode,
|
|
500
533
|
skus = androidRequest.skus.toList(),
|
|
@@ -503,7 +536,7 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
503
536
|
)
|
|
504
537
|
RequestPurchaseProps(
|
|
505
538
|
request = RequestPurchaseProps.Request.Subscription(
|
|
506
|
-
RequestSubscriptionPropsByPlatforms(
|
|
539
|
+
RequestSubscriptionPropsByPlatforms(google = androidProps)
|
|
507
540
|
),
|
|
508
541
|
type = ProductQueryType.Subs
|
|
509
542
|
)
|
|
@@ -513,12 +546,13 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
513
546
|
isOfferPersonalized = androidRequest.isOfferPersonalized.unwrapBool(),
|
|
514
547
|
obfuscatedAccountId = androidRequest.obfuscatedAccountId.unwrapString(),
|
|
515
548
|
obfuscatedProfileId = androidRequest.obfuscatedProfileId.unwrapString(),
|
|
549
|
+
developerBillingOption = developerBillingOption,
|
|
516
550
|
offerToken = androidRequest.offerToken.unwrapString(),
|
|
517
551
|
skus = androidRequest.skus.toList()
|
|
518
552
|
)
|
|
519
553
|
RequestPurchaseProps(
|
|
520
554
|
request = RequestPurchaseProps.Request.Purchase(
|
|
521
|
-
RequestPurchasePropsByPlatforms(
|
|
555
|
+
RequestPurchasePropsByPlatforms(google = androidProps)
|
|
522
556
|
),
|
|
523
557
|
type = ProductQueryType.InApp
|
|
524
558
|
)
|
|
@@ -924,111 +958,21 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
924
958
|
}
|
|
925
959
|
|
|
926
960
|
private fun serializeSubscriptionOffers(offers: List<ProductSubscriptionAndroidOfferDetails>): String {
|
|
927
|
-
|
|
928
|
-
offers.forEach { offer ->
|
|
929
|
-
val offerJson = JSONObject()
|
|
930
|
-
offerJson.put("basePlanId", offer.basePlanId)
|
|
931
|
-
offerJson.put("offerId", offer.offerId)
|
|
932
|
-
offerJson.put("offerTags", JSONArray(offer.offerTags))
|
|
933
|
-
offerJson.put("offerToken", offer.offerToken)
|
|
934
|
-
|
|
935
|
-
val phasesArray = JSONArray()
|
|
936
|
-
offer.pricingPhases.pricingPhaseList.forEach { phase ->
|
|
937
|
-
val phaseJson = JSONObject()
|
|
938
|
-
phaseJson.put("billingCycleCount", phase.billingCycleCount)
|
|
939
|
-
phaseJson.put("billingPeriod", phase.billingPeriod)
|
|
940
|
-
phaseJson.put("formattedPrice", phase.formattedPrice)
|
|
941
|
-
phaseJson.put("priceAmountMicros", phase.priceAmountMicros)
|
|
942
|
-
phaseJson.put("priceCurrencyCode", phase.priceCurrencyCode)
|
|
943
|
-
phaseJson.put("recurrenceMode", phase.recurrenceMode)
|
|
944
|
-
phasesArray.put(phaseJson)
|
|
945
|
-
}
|
|
946
|
-
|
|
947
|
-
val pricingPhasesJson = JSONObject()
|
|
948
|
-
pricingPhasesJson.put("pricingPhaseList", phasesArray)
|
|
949
|
-
offerJson.put("pricingPhases", pricingPhasesJson)
|
|
950
|
-
|
|
951
|
-
array.put(offerJson)
|
|
952
|
-
}
|
|
953
|
-
return array.toString()
|
|
961
|
+
return JSONArray(legacySubscriptionOfferMaps(offers)).toString()
|
|
954
962
|
}
|
|
955
963
|
|
|
956
964
|
/**
|
|
957
965
|
* Serialize standardized SubscriptionOffer list to JSON string (OpenIAP 1.3.10+)
|
|
958
966
|
*/
|
|
959
967
|
private fun serializeStandardizedSubscriptionOffers(offers: List<dev.hyo.openiap.SubscriptionOffer>): String {
|
|
960
|
-
|
|
961
|
-
offers.forEach { offer ->
|
|
962
|
-
val offerJson = JSONObject()
|
|
963
|
-
offerJson.put("id", offer.id)
|
|
964
|
-
offerJson.put("displayPrice", offer.displayPrice)
|
|
965
|
-
offerJson.put("price", offer.price)
|
|
966
|
-
offerJson.put("type", offer.type.rawValue)
|
|
967
|
-
offer.currency?.let { offerJson.put("currency", it) }
|
|
968
|
-
offer.basePlanIdAndroid?.let { offerJson.put("basePlanIdAndroid", it) }
|
|
969
|
-
offer.offerTokenAndroid?.let { offerJson.put("offerTokenAndroid", it) }
|
|
970
|
-
offer.offerTagsAndroid?.let { offerJson.put("offerTagsAndroid", JSONArray(it)) }
|
|
971
|
-
offer.paymentMode?.let { offerJson.put("paymentMode", it.rawValue) }
|
|
972
|
-
offer.periodCount?.let { offerJson.put("periodCount", it) }
|
|
973
|
-
offer.numberOfPeriodsIOS?.let { offerJson.put("numberOfPeriodsIOS", it) }
|
|
974
|
-
offer.period?.let { period ->
|
|
975
|
-
val periodJson = JSONObject()
|
|
976
|
-
periodJson.put("unit", period.unit.rawValue)
|
|
977
|
-
periodJson.put("value", period.value)
|
|
978
|
-
offerJson.put("period", periodJson)
|
|
979
|
-
}
|
|
980
|
-
offer.pricingPhasesAndroid?.let { phases ->
|
|
981
|
-
val phasesJson = JSONObject()
|
|
982
|
-
val phaseList = JSONArray()
|
|
983
|
-
phases.pricingPhaseList.forEach { phase ->
|
|
984
|
-
val phaseJson = JSONObject()
|
|
985
|
-
phaseJson.put("billingCycleCount", phase.billingCycleCount)
|
|
986
|
-
phaseJson.put("billingPeriod", phase.billingPeriod)
|
|
987
|
-
phaseJson.put("formattedPrice", phase.formattedPrice)
|
|
988
|
-
phaseJson.put("priceAmountMicros", phase.priceAmountMicros)
|
|
989
|
-
phaseJson.put("priceCurrencyCode", phase.priceCurrencyCode)
|
|
990
|
-
phaseJson.put("recurrenceMode", phase.recurrenceMode)
|
|
991
|
-
phaseList.put(phaseJson)
|
|
992
|
-
}
|
|
993
|
-
phasesJson.put("pricingPhaseList", phaseList)
|
|
994
|
-
offerJson.put("pricingPhasesAndroid", phasesJson)
|
|
995
|
-
}
|
|
996
|
-
array.put(offerJson)
|
|
997
|
-
}
|
|
998
|
-
return array.toString()
|
|
968
|
+
return JSONArray(subscriptionOfferMaps(offers)).toString()
|
|
999
969
|
}
|
|
1000
970
|
|
|
1001
971
|
/**
|
|
1002
972
|
* Serialize standardized DiscountOffer list to JSON string (OpenIAP 1.3.10+)
|
|
1003
973
|
*/
|
|
1004
974
|
private fun serializeStandardizedDiscountOffers(offers: List<dev.hyo.openiap.DiscountOffer>): String {
|
|
1005
|
-
|
|
1006
|
-
offers.forEach { offer ->
|
|
1007
|
-
val offerJson = JSONObject()
|
|
1008
|
-
offerJson.put("currency", offer.currency)
|
|
1009
|
-
offerJson.put("displayPrice", offer.displayPrice)
|
|
1010
|
-
offerJson.put("price", offer.price)
|
|
1011
|
-
offer.id?.let { offerJson.put("id", it) }
|
|
1012
|
-
offer.offerTagsAndroid?.let { offerJson.put("offerTagsAndroid", JSONArray(it)) }
|
|
1013
|
-
offer.offerTokenAndroid?.let { offerJson.put("offerTokenAndroid", it) }
|
|
1014
|
-
offer.discountAmountMicrosAndroid?.let { offerJson.put("discountAmountMicrosAndroid", it) }
|
|
1015
|
-
offer.formattedDiscountAmountAndroid?.let { offerJson.put("formattedDiscountAmountAndroid", it) }
|
|
1016
|
-
offer.fullPriceMicrosAndroid?.let { offerJson.put("fullPriceMicrosAndroid", it) }
|
|
1017
|
-
offer.limitedQuantityInfoAndroid?.let { info ->
|
|
1018
|
-
val infoJson = JSONObject()
|
|
1019
|
-
infoJson.put("maximumQuantity", info.maximumQuantity)
|
|
1020
|
-
infoJson.put("remainingQuantity", info.remainingQuantity)
|
|
1021
|
-
offerJson.put("limitedQuantityInfoAndroid", infoJson)
|
|
1022
|
-
}
|
|
1023
|
-
offer.validTimeWindowAndroid?.let { window ->
|
|
1024
|
-
val windowJson = JSONObject()
|
|
1025
|
-
windowJson.put("startTimeMillis", window.startTimeMillis)
|
|
1026
|
-
windowJson.put("endTimeMillis", window.endTimeMillis)
|
|
1027
|
-
offerJson.put("validTimeWindowAndroid", windowJson)
|
|
1028
|
-
}
|
|
1029
|
-
array.put(offerJson)
|
|
1030
|
-
}
|
|
1031
|
-
return array.toString()
|
|
975
|
+
return JSONArray(discountOfferMaps(offers)).toString()
|
|
1032
976
|
}
|
|
1033
977
|
|
|
1034
978
|
private fun convertToNitroProduct(product: ProductCommon): NitroProduct {
|
|
@@ -1044,64 +988,9 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
1044
988
|
}
|
|
1045
989
|
|
|
1046
990
|
val subscriptionOffersJson = subscriptionOffers.takeIf { it.isNotEmpty() }?.let { serializeSubscriptionOffers(it) }
|
|
1047
|
-
val oneTimeOffersNitro = oneTimeOffers
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
priceAmountMicros = otp.priceAmountMicros,
|
|
1051
|
-
priceCurrencyCode = otp.priceCurrencyCode,
|
|
1052
|
-
offerId = otp.offerId.wrapVariant(),
|
|
1053
|
-
offerToken = otp.offerToken,
|
|
1054
|
-
offerTags = otp.offerTags.toTypedArray(),
|
|
1055
|
-
fullPriceMicros = otp.fullPriceMicros.wrapVariant(),
|
|
1056
|
-
discountDisplayInfo = otp.discountDisplayInfo?.let { discount ->
|
|
1057
|
-
Variant_NullType_NitroDiscountDisplayInfoAndroid.Second(
|
|
1058
|
-
NitroDiscountDisplayInfoAndroid(
|
|
1059
|
-
percentageDiscount = discount.percentageDiscount?.toDouble().wrapVariant(),
|
|
1060
|
-
discountAmount = discount.discountAmount?.let { amount ->
|
|
1061
|
-
Variant_NullType_NitroDiscountAmountAndroid.Second(
|
|
1062
|
-
NitroDiscountAmountAndroid(
|
|
1063
|
-
discountAmountMicros = amount.discountAmountMicros,
|
|
1064
|
-
formattedDiscountAmount = amount.formattedDiscountAmount
|
|
1065
|
-
)
|
|
1066
|
-
)
|
|
1067
|
-
}
|
|
1068
|
-
)
|
|
1069
|
-
)
|
|
1070
|
-
},
|
|
1071
|
-
validTimeWindow = otp.validTimeWindow?.let { window ->
|
|
1072
|
-
Variant_NullType_NitroValidTimeWindowAndroid.Second(
|
|
1073
|
-
NitroValidTimeWindowAndroid(
|
|
1074
|
-
startTimeMillis = window.startTimeMillis,
|
|
1075
|
-
endTimeMillis = window.endTimeMillis
|
|
1076
|
-
)
|
|
1077
|
-
)
|
|
1078
|
-
},
|
|
1079
|
-
limitedQuantityInfo = otp.limitedQuantityInfo?.let { info ->
|
|
1080
|
-
Variant_NullType_NitroLimitedQuantityInfoAndroid.Second(
|
|
1081
|
-
NitroLimitedQuantityInfoAndroid(
|
|
1082
|
-
maximumQuantity = info.maximumQuantity.toDouble(),
|
|
1083
|
-
remainingQuantity = info.remainingQuantity.toDouble()
|
|
1084
|
-
)
|
|
1085
|
-
)
|
|
1086
|
-
},
|
|
1087
|
-
preorderDetailsAndroid = otp.preorderDetailsAndroid?.let { preorder ->
|
|
1088
|
-
Variant_NullType_NitroPreorderDetailsAndroid.Second(
|
|
1089
|
-
NitroPreorderDetailsAndroid(
|
|
1090
|
-
preorderPresaleEndTimeMillis = preorder.preorderPresaleEndTimeMillis,
|
|
1091
|
-
preorderReleaseTimeMillis = preorder.preorderReleaseTimeMillis
|
|
1092
|
-
)
|
|
1093
|
-
)
|
|
1094
|
-
},
|
|
1095
|
-
rentalDetailsAndroid = otp.rentalDetailsAndroid?.let { rental ->
|
|
1096
|
-
Variant_NullType_NitroRentalDetailsAndroid.Second(
|
|
1097
|
-
NitroRentalDetailsAndroid(
|
|
1098
|
-
rentalExpirationPeriod = rental.rentalExpirationPeriod?.let { Variant_NullType_String.Second(it) },
|
|
1099
|
-
rentalPeriod = rental.rentalPeriod
|
|
1100
|
-
)
|
|
1101
|
-
)
|
|
1102
|
-
}
|
|
1103
|
-
)
|
|
1104
|
-
}?.toTypedArray()
|
|
991
|
+
val oneTimeOffersNitro = oneTimeOffers
|
|
992
|
+
?.map { it.toNitroOneTimePurchaseOfferDetail() }
|
|
993
|
+
?.toTypedArray()
|
|
1105
994
|
|
|
1106
995
|
var originalPriceAndroid: String? = null
|
|
1107
996
|
var originalPriceAmountMicrosAndroid: Double? = null
|
|
@@ -1111,7 +1000,7 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
1111
1000
|
var subscriptionPeriodAndroid: String? = null
|
|
1112
1001
|
var freeTrialPeriodAndroid: String? = null
|
|
1113
1002
|
|
|
1114
|
-
if (product.type ==
|
|
1003
|
+
if (product.type == OpenIapProductType.InApp) {
|
|
1115
1004
|
oneTimeOffers?.firstOrNull()?.let { otp ->
|
|
1116
1005
|
originalPriceAndroid = otp.formattedPrice
|
|
1117
1006
|
originalPriceAmountMicrosAndroid = otp.priceAmountMicros.toDoubleOrNull()
|
|
@@ -1177,6 +1066,7 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
1177
1066
|
id = product.id,
|
|
1178
1067
|
title = product.title,
|
|
1179
1068
|
description = product.description,
|
|
1069
|
+
debugDescription = product.nitroDebugDescription(),
|
|
1180
1070
|
type = product.type.rawValue,
|
|
1181
1071
|
displayName = product.displayName.wrapVariant(),
|
|
1182
1072
|
displayPrice = product.displayPrice,
|
|
@@ -1186,6 +1076,8 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
1186
1076
|
typeIOS = null,
|
|
1187
1077
|
isFamilyShareableIOS = null,
|
|
1188
1078
|
jsonRepresentationIOS = null,
|
|
1079
|
+
pricingTermsIOS = null,
|
|
1080
|
+
subscriptionInfoIOS = null,
|
|
1189
1081
|
discountsIOS = null,
|
|
1190
1082
|
subscriptionPeriodUnitIOS = null,
|
|
1191
1083
|
subscriptionPeriodNumberIOS = null,
|
|
@@ -1631,7 +1523,7 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
1631
1523
|
} catch (err: Throwable) {
|
|
1632
1524
|
RnIapLog.failure("checkAlternativeBillingAvailabilityAndroid", err)
|
|
1633
1525
|
val errorType = parseOpenIapError(err)
|
|
1634
|
-
throw OpenIapException(toErrorJson(errorType, debugMessage = err.message))
|
|
1526
|
+
throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err)
|
|
1635
1527
|
}
|
|
1636
1528
|
}
|
|
1637
1529
|
}
|
|
@@ -1653,7 +1545,7 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
1653
1545
|
} catch (err: Throwable) {
|
|
1654
1546
|
RnIapLog.failure("showAlternativeBillingDialogAndroid", err)
|
|
1655
1547
|
val errorType = parseOpenIapError(err)
|
|
1656
|
-
throw OpenIapException(toErrorJson(errorType, debugMessage = err.message))
|
|
1548
|
+
throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err)
|
|
1657
1549
|
}
|
|
1658
1550
|
}
|
|
1659
1551
|
}
|
|
@@ -1674,7 +1566,7 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
1674
1566
|
} catch (err: Throwable) {
|
|
1675
1567
|
RnIapLog.failure("createAlternativeBillingTokenAndroid", err)
|
|
1676
1568
|
val errorType = parseOpenIapError(err)
|
|
1677
|
-
throw OpenIapException(toErrorJson(errorType, debugMessage = err.message))
|
|
1569
|
+
throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err)
|
|
1678
1570
|
}
|
|
1679
1571
|
}
|
|
1680
1572
|
}
|
|
@@ -1794,25 +1686,66 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
1794
1686
|
val result = openIapStore.isBillingProgramAvailable(openIapProgram)
|
|
1795
1687
|
val nitroResult = NitroBillingProgramAvailabilityResultAndroid(
|
|
1796
1688
|
billingProgram = program,
|
|
1797
|
-
|
|
1689
|
+
choiceScreenType = result.choiceScreenType?.let { mapBillingChoiceScreenType(it) },
|
|
1690
|
+
isAvailable = result.isAvailable,
|
|
1691
|
+
isExternalLinkAvailable = result.isExternalLinkAvailable.wrapVariant()
|
|
1798
1692
|
)
|
|
1799
1693
|
RnIapLog.result("isBillingProgramAvailableAndroid", mapOf("isAvailable" to result.isAvailable))
|
|
1800
1694
|
nitroResult
|
|
1801
1695
|
} catch (err: Throwable) {
|
|
1802
1696
|
RnIapLog.failure("isBillingProgramAvailableAndroid", err)
|
|
1803
1697
|
val errorType = parseOpenIapError(err)
|
|
1804
|
-
throw OpenIapException(toErrorJson(errorType, debugMessage = err.message))
|
|
1698
|
+
throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err)
|
|
1805
1699
|
}
|
|
1806
1700
|
}
|
|
1807
1701
|
}
|
|
1808
1702
|
|
|
1809
|
-
override fun
|
|
1703
|
+
override fun getBillingChoiceInfoAndroid(params: NitroGetBillingChoiceInfoParamsAndroid): Promise<NitroBillingChoiceInfoAndroid> {
|
|
1810
1704
|
return Promise.async {
|
|
1811
|
-
RnIapLog.payload("
|
|
1705
|
+
RnIapLog.payload("getBillingChoiceInfoAndroid", mapOf(
|
|
1706
|
+
"billingProgram" to params.billingProgram.name,
|
|
1707
|
+
"playBillingChoiceImageLayout" to params.playBillingChoiceImageLayout.name,
|
|
1708
|
+
"userLocale" to params.userLocale.unwrapString()
|
|
1709
|
+
))
|
|
1710
|
+
try {
|
|
1711
|
+
ensureConnection()
|
|
1712
|
+
val result = openIapStore.getBillingChoiceInfo(
|
|
1713
|
+
OpenIapGetBillingChoiceInfoParams(
|
|
1714
|
+
billingProgram = mapBillingProgram(params.billingProgram),
|
|
1715
|
+
playBillingChoiceImageLayout = mapBillingChoiceImageLayout(params.playBillingChoiceImageLayout),
|
|
1716
|
+
userLocale = params.userLocale.unwrapString()
|
|
1717
|
+
)
|
|
1718
|
+
)
|
|
1719
|
+
val nitroResult = NitroBillingChoiceInfoAndroid(
|
|
1720
|
+
playBillingChoiceImageUrl = result.playBillingChoiceImageUrl,
|
|
1721
|
+
playBillingLoyaltyInfo = result.playBillingLoyaltyInfo.wrapVariant()
|
|
1722
|
+
)
|
|
1723
|
+
RnIapLog.result("getBillingChoiceInfoAndroid", mapOf("hasImageUrl" to result.playBillingChoiceImageUrl.isNotBlank()))
|
|
1724
|
+
nitroResult
|
|
1725
|
+
} catch (err: Throwable) {
|
|
1726
|
+
RnIapLog.failure("getBillingChoiceInfoAndroid", err)
|
|
1727
|
+
val errorType = parseOpenIapError(err)
|
|
1728
|
+
throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err)
|
|
1729
|
+
}
|
|
1730
|
+
}
|
|
1731
|
+
}
|
|
1732
|
+
|
|
1733
|
+
override fun createBillingProgramReportingDetailsAndroid(
|
|
1734
|
+
program: BillingProgramAndroid,
|
|
1735
|
+
developerBillingType: DeveloperBillingTypeAndroid?
|
|
1736
|
+
): Promise<NitroBillingProgramReportingDetailsAndroid> {
|
|
1737
|
+
return Promise.async {
|
|
1738
|
+
RnIapLog.payload(
|
|
1739
|
+
"createBillingProgramReportingDetailsAndroid",
|
|
1740
|
+
mapOf("program" to program.name, "developerBillingType" to developerBillingType?.name)
|
|
1741
|
+
)
|
|
1812
1742
|
try {
|
|
1813
1743
|
ensureConnection()
|
|
1814
1744
|
val openIapProgram = mapBillingProgram(program)
|
|
1815
|
-
val result = openIapStore.createBillingProgramReportingDetails(
|
|
1745
|
+
val result = openIapStore.createBillingProgramReportingDetails(
|
|
1746
|
+
openIapProgram,
|
|
1747
|
+
mapDeveloperBillingType(developerBillingType)
|
|
1748
|
+
)
|
|
1816
1749
|
val nitroResult = NitroBillingProgramReportingDetailsAndroid(
|
|
1817
1750
|
billingProgram = program,
|
|
1818
1751
|
externalTransactionToken = result.externalTransactionToken
|
|
@@ -1822,7 +1755,75 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
1822
1755
|
} catch (err: Throwable) {
|
|
1823
1756
|
RnIapLog.failure("createBillingProgramReportingDetailsAndroid", err)
|
|
1824
1757
|
val errorType = parseOpenIapError(err)
|
|
1825
|
-
throw OpenIapException(toErrorJson(errorType, debugMessage = err.message))
|
|
1758
|
+
throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err)
|
|
1759
|
+
}
|
|
1760
|
+
}
|
|
1761
|
+
}
|
|
1762
|
+
|
|
1763
|
+
override fun showBillingProgramInformationDialogAndroid(
|
|
1764
|
+
params: NitroBillingProgramInformationDialogParamsAndroid
|
|
1765
|
+
): Promise<NitroBillingResultAndroid> {
|
|
1766
|
+
return Promise.async {
|
|
1767
|
+
RnIapLog.payload("showBillingProgramInformationDialogAndroid", mapOf("program" to params.billingProgram.name))
|
|
1768
|
+
try {
|
|
1769
|
+
ensureConnection()
|
|
1770
|
+
val activity = withContext(Dispatchers.Main) {
|
|
1771
|
+
runCatching { context.currentActivity }.getOrNull()
|
|
1772
|
+
} ?: throw OpenIapException(toErrorJson(OpenIapError.DeveloperError(), debugMessage = "Activity not available"))
|
|
1773
|
+
val result = withContext(Dispatchers.Main) {
|
|
1774
|
+
openIapStore.showBillingProgramInformationDialog(
|
|
1775
|
+
activity,
|
|
1776
|
+
OpenIapBillingProgramInformationDialogParams(
|
|
1777
|
+
billingProgram = mapBillingProgram(params.billingProgram),
|
|
1778
|
+
externalTransactionToken = params.externalTransactionToken
|
|
1779
|
+
)
|
|
1780
|
+
)
|
|
1781
|
+
}
|
|
1782
|
+
RnIapLog.result("showBillingProgramInformationDialogAndroid", mapOf("responseCode" to result.responseCode))
|
|
1783
|
+
NitroBillingResultAndroid(
|
|
1784
|
+
responseCode = result.responseCode.toDouble(),
|
|
1785
|
+
debugMessage = result.debugMessage.wrapVariant(),
|
|
1786
|
+
subResponseCode = mapSubResponseCode(result.subResponseCode)
|
|
1787
|
+
)
|
|
1788
|
+
} catch (err: Throwable) {
|
|
1789
|
+
RnIapLog.failure("showBillingProgramInformationDialogAndroid", err)
|
|
1790
|
+
val errorType = parseOpenIapError(err)
|
|
1791
|
+
throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err)
|
|
1792
|
+
}
|
|
1793
|
+
}
|
|
1794
|
+
}
|
|
1795
|
+
|
|
1796
|
+
override fun showInAppMessagesAndroid(
|
|
1797
|
+
params: Variant_NullType_NitroInAppMessageParamsAndroid?
|
|
1798
|
+
): Promise<NitroInAppMessageResultAndroid> {
|
|
1799
|
+
return Promise.async {
|
|
1800
|
+
val messageParams = params?.asSecondOrNull()
|
|
1801
|
+
val categories = messageParams?.categories?.asSecondOrNull()
|
|
1802
|
+
RnIapLog.payload("showInAppMessagesAndroid", mapOf("categories" to categories?.map { it.name }))
|
|
1803
|
+
try {
|
|
1804
|
+
ensureConnection()
|
|
1805
|
+
val activity = withContext(Dispatchers.Main) {
|
|
1806
|
+
runCatching { context.currentActivity }.getOrNull()
|
|
1807
|
+
} ?: throw OpenIapException(toErrorJson(OpenIapError.DeveloperError(), debugMessage = "Activity not available"))
|
|
1808
|
+
val result = withContext(Dispatchers.Main) {
|
|
1809
|
+
openIapStore.showInAppMessages(
|
|
1810
|
+
activity,
|
|
1811
|
+
messageParams?.let {
|
|
1812
|
+
OpenIapInAppMessageParams(
|
|
1813
|
+
categories = categories?.map { category -> mapInAppMessageCategory(category) }
|
|
1814
|
+
)
|
|
1815
|
+
}
|
|
1816
|
+
)
|
|
1817
|
+
}
|
|
1818
|
+
RnIapLog.result("showInAppMessagesAndroid", mapOf("responseCode" to result.responseCode.name))
|
|
1819
|
+
NitroInAppMessageResultAndroid(
|
|
1820
|
+
responseCode = mapInAppMessageResponseCode(result.responseCode),
|
|
1821
|
+
purchaseToken = result.purchaseToken.wrapVariant()
|
|
1822
|
+
)
|
|
1823
|
+
} catch (err: Throwable) {
|
|
1824
|
+
RnIapLog.failure("showInAppMessagesAndroid", err)
|
|
1825
|
+
val errorType = parseOpenIapError(err)
|
|
1826
|
+
throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err)
|
|
1826
1827
|
}
|
|
1827
1828
|
}
|
|
1828
1829
|
}
|
|
@@ -1844,6 +1845,7 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
1844
1845
|
|
|
1845
1846
|
val openIapParams = OpenIapLaunchExternalLinkParams(
|
|
1846
1847
|
billingProgram = mapBillingProgram(params.billingProgram),
|
|
1848
|
+
externalTransactionToken = params.externalTransactionToken.unwrapString(),
|
|
1847
1849
|
launchMode = mapExternalLinkLaunchMode(params.launchMode),
|
|
1848
1850
|
linkType = mapExternalLinkType(params.linkType),
|
|
1849
1851
|
linkUri = params.linkUri
|
|
@@ -1870,6 +1872,86 @@ class HybridRnIap : HybridRnIapSpec() {
|
|
|
1870
1872
|
BillingProgramAndroid.EXTERNAL_OFFER -> OpenIapBillingProgramAndroid.ExternalOffer
|
|
1871
1873
|
BillingProgramAndroid.EXTERNAL_PAYMENTS -> OpenIapBillingProgramAndroid.ExternalPayments
|
|
1872
1874
|
BillingProgramAndroid.USER_CHOICE_BILLING -> OpenIapBillingProgramAndroid.UserChoiceBilling
|
|
1875
|
+
BillingProgramAndroid.BILLING_CHOICE -> OpenIapBillingProgramAndroid.BillingChoice
|
|
1876
|
+
}
|
|
1877
|
+
}
|
|
1878
|
+
|
|
1879
|
+
private fun mapBillingChoiceImageLayout(layout: BillingChoiceImageLayoutAndroid): OpenIapBillingChoiceImageLayout {
|
|
1880
|
+
return when (layout) {
|
|
1881
|
+
BillingChoiceImageLayoutAndroid.RECTANGULAR_FOUR_BY_ONE -> OpenIapBillingChoiceImageLayout.RectangularFourByOne
|
|
1882
|
+
BillingChoiceImageLayoutAndroid.RECTANGULAR_THREE_BY_ONE -> OpenIapBillingChoiceImageLayout.RectangularThreeByOne
|
|
1883
|
+
BillingChoiceImageLayoutAndroid.RECTANGULAR_TWO_BY_TWO -> OpenIapBillingChoiceImageLayout.RectangularTwoByTwo
|
|
1884
|
+
}
|
|
1885
|
+
}
|
|
1886
|
+
|
|
1887
|
+
private fun mapBillingChoiceScreenType(type: OpenIapBillingChoiceScreenType): BillingChoiceScreenTypeAndroid {
|
|
1888
|
+
return when (type) {
|
|
1889
|
+
OpenIapBillingChoiceScreenType.Unspecified -> BillingChoiceScreenTypeAndroid.UNSPECIFIED
|
|
1890
|
+
OpenIapBillingChoiceScreenType.DeveloperRendered -> BillingChoiceScreenTypeAndroid.DEVELOPER_RENDERED
|
|
1891
|
+
OpenIapBillingChoiceScreenType.GoogleRendered -> BillingChoiceScreenTypeAndroid.GOOGLE_RENDERED
|
|
1892
|
+
}
|
|
1893
|
+
}
|
|
1894
|
+
|
|
1895
|
+
private fun mapBillingChoiceScreenTypeToOpenIap(
|
|
1896
|
+
type: BillingChoiceScreenTypeAndroid
|
|
1897
|
+
): OpenIapBillingChoiceScreenType {
|
|
1898
|
+
return when (type) {
|
|
1899
|
+
BillingChoiceScreenTypeAndroid.UNSPECIFIED -> OpenIapBillingChoiceScreenType.Unspecified
|
|
1900
|
+
BillingChoiceScreenTypeAndroid.DEVELOPER_RENDERED -> OpenIapBillingChoiceScreenType.DeveloperRendered
|
|
1901
|
+
BillingChoiceScreenTypeAndroid.GOOGLE_RENDERED -> OpenIapBillingChoiceScreenType.GoogleRendered
|
|
1902
|
+
}
|
|
1903
|
+
}
|
|
1904
|
+
|
|
1905
|
+
private fun mapDeveloperBillingType(type: DeveloperBillingTypeAndroid?): OpenIapDeveloperBillingType? {
|
|
1906
|
+
return when (type) {
|
|
1907
|
+
null, DeveloperBillingTypeAndroid.DEVELOPER_BILLING_TYPE_UNSPECIFIED -> null
|
|
1908
|
+
DeveloperBillingTypeAndroid.IN_APP -> OpenIapDeveloperBillingType.InApp
|
|
1909
|
+
DeveloperBillingTypeAndroid.EXTERNAL_LINK -> OpenIapDeveloperBillingType.ExternalLink
|
|
1910
|
+
}
|
|
1911
|
+
}
|
|
1912
|
+
|
|
1913
|
+
private fun mapSubResponseCode(
|
|
1914
|
+
code: OpenIapSubResponseCodeAndroid?
|
|
1915
|
+
): SubResponseCodeAndroid? = when (code) {
|
|
1916
|
+
null -> null
|
|
1917
|
+
OpenIapSubResponseCodeAndroid.NoApplicableSubResponseCode ->
|
|
1918
|
+
SubResponseCodeAndroid.NO_APPLICABLE_SUB_RESPONSE_CODE
|
|
1919
|
+
OpenIapSubResponseCodeAndroid.PaymentDeclinedDueToInsufficientFunds ->
|
|
1920
|
+
SubResponseCodeAndroid.PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS
|
|
1921
|
+
OpenIapSubResponseCodeAndroid.UserIneligible ->
|
|
1922
|
+
SubResponseCodeAndroid.USER_INELIGIBLE
|
|
1923
|
+
}
|
|
1924
|
+
|
|
1925
|
+
private fun mapDeveloperBillingOption(
|
|
1926
|
+
option: DeveloperBillingOptionParamsAndroid
|
|
1927
|
+
): OpenIapDeveloperBillingOptionParams {
|
|
1928
|
+
val launchMode = when (option.launchMode) {
|
|
1929
|
+
null -> null
|
|
1930
|
+
DeveloperBillingLaunchModeAndroid.UNSPECIFIED -> OpenIapDeveloperBillingLaunchMode.Unspecified
|
|
1931
|
+
DeveloperBillingLaunchModeAndroid.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP ->
|
|
1932
|
+
OpenIapDeveloperBillingLaunchMode.LaunchInExternalBrowserOrApp
|
|
1933
|
+
DeveloperBillingLaunchModeAndroid.CALLER_WILL_LAUNCH_LINK ->
|
|
1934
|
+
OpenIapDeveloperBillingLaunchMode.CallerWillLaunchLink
|
|
1935
|
+
}
|
|
1936
|
+
return OpenIapDeveloperBillingOptionParams(
|
|
1937
|
+
billingProgram = mapBillingProgram(option.billingProgram),
|
|
1938
|
+
externalTransactionToken = option.externalTransactionToken.unwrapString(),
|
|
1939
|
+
launchMode = launchMode,
|
|
1940
|
+
linkUri = option.linkUri.unwrapString()
|
|
1941
|
+
)
|
|
1942
|
+
}
|
|
1943
|
+
|
|
1944
|
+
private fun mapInAppMessageCategory(category: InAppMessageCategoryAndroid): OpenIapInAppMessageCategory {
|
|
1945
|
+
return when (category) {
|
|
1946
|
+
InAppMessageCategoryAndroid.UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID -> OpenIapInAppMessageCategory.UnknownInAppMessageCategoryId
|
|
1947
|
+
InAppMessageCategoryAndroid.TRANSACTIONAL -> OpenIapInAppMessageCategory.Transactional
|
|
1948
|
+
}
|
|
1949
|
+
}
|
|
1950
|
+
|
|
1951
|
+
private fun mapInAppMessageResponseCode(code: OpenIapInAppMessageResponseCode): InAppMessageResponseCodeAndroid {
|
|
1952
|
+
return when (code) {
|
|
1953
|
+
OpenIapInAppMessageResponseCode.NoActionNeeded -> InAppMessageResponseCodeAndroid.NO_ACTION_NEEDED
|
|
1954
|
+
OpenIapInAppMessageResponseCode.SubscriptionStatusUpdated -> InAppMessageResponseCodeAndroid.SUBSCRIPTION_STATUS_UPDATED
|
|
1873
1955
|
}
|
|
1874
1956
|
}
|
|
1875
1957
|
|