react-native-iap 15.4.0-rc.3 → 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.
Files changed (165) hide show
  1. package/README.md +23 -25
  2. package/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt +250 -168
  3. package/android/src/main/java/com/margelo/nitro/iap/ProductSerialization.kt +98 -0
  4. package/ios/HybridRnIap.swift +19 -1
  5. package/ios/RnIapHelper.swift +30 -2
  6. package/lib/module/hooks/useIAP.js +19 -3
  7. package/lib/module/hooks/useIAP.js.map +1 -1
  8. package/lib/module/index.js +104 -18
  9. package/lib/module/index.js.map +1 -1
  10. package/lib/module/index.kepler.js +3 -0
  11. package/lib/module/index.kepler.js.map +1 -1
  12. package/lib/module/types.js +67 -6
  13. package/lib/module/types.js.map +1 -1
  14. package/lib/module/utils/type-bridge.js +22 -3
  15. package/lib/module/utils/type-bridge.js.map +1 -1
  16. package/lib/module/vega-adapter.js +24 -2
  17. package/lib/module/vega-adapter.js.map +1 -1
  18. package/lib/typescript/src/hooks/useIAP.d.ts +25 -2
  19. package/lib/typescript/src/hooks/useIAP.d.ts.map +1 -1
  20. package/lib/typescript/src/index.d.ts +50 -10
  21. package/lib/typescript/src/index.d.ts.map +1 -1
  22. package/lib/typescript/src/index.kepler.d.ts +3 -0
  23. package/lib/typescript/src/index.kepler.d.ts.map +1 -1
  24. package/lib/typescript/src/specs/RnIap.nitro.d.ts +79 -9
  25. package/lib/typescript/src/specs/RnIap.nitro.d.ts.map +1 -1
  26. package/lib/typescript/src/types.d.ts +223 -35
  27. package/lib/typescript/src/types.d.ts.map +1 -1
  28. package/lib/typescript/src/utils/type-bridge.d.ts.map +1 -1
  29. package/lib/typescript/src/vega-adapter.d.ts.map +1 -1
  30. package/nitrogen/generated/android/NitroIap+autolinking.cmake +3 -0
  31. package/nitrogen/generated/android/c++/JBillingChoiceImageLayoutAndroid.hpp +61 -0
  32. package/nitrogen/generated/android/c++/JBillingChoiceScreenTypeAndroid.hpp +61 -0
  33. package/nitrogen/generated/android/c++/JBillingProgramAndroid.hpp +3 -0
  34. package/nitrogen/generated/android/c++/JDeveloperBillingLaunchModeAndroid.hpp +61 -0
  35. package/nitrogen/generated/android/c++/JDeveloperBillingOptionParamsAndroid.hpp +78 -0
  36. package/nitrogen/generated/android/c++/JDeveloperBillingTypeAndroid.hpp +61 -0
  37. package/nitrogen/generated/android/c++/JDeveloperProvidedBillingDetailsAndroid.hpp +45 -5
  38. package/nitrogen/generated/android/c++/JDeveloperProvidedBillingProductAndroid.hpp +72 -0
  39. package/nitrogen/generated/android/c++/JFunc_void_DeveloperProvidedBillingDetailsAndroid.hpp +10 -0
  40. package/nitrogen/generated/android/c++/JHybridRnIapSpec.cpp +118 -3
  41. package/nitrogen/generated/android/c++/JHybridRnIapSpec.hpp +4 -1
  42. package/nitrogen/generated/android/c++/JInAppMessageCategoryAndroid.hpp +58 -0
  43. package/nitrogen/generated/android/c++/JInAppMessageResponseCodeAndroid.hpp +58 -0
  44. package/nitrogen/generated/android/c++/JInitConnectionConfig.hpp +7 -1
  45. package/nitrogen/generated/android/c++/JNitroBillingChoiceInfoAndroid.hpp +66 -0
  46. package/nitrogen/generated/android/c++/JNitroBillingProgramAvailabilityResultAndroid.hpp +18 -3
  47. package/nitrogen/generated/android/c++/JNitroBillingProgramInformationDialogParamsAndroid.hpp +63 -0
  48. package/nitrogen/generated/android/c++/JNitroBillingResultAndroid.hpp +72 -0
  49. package/nitrogen/generated/android/c++/JNitroGetBillingChoiceInfoParamsAndroid.hpp +74 -0
  50. package/nitrogen/generated/android/c++/JNitroInAppMessageParamsAndroid.hpp +64 -0
  51. package/nitrogen/generated/android/c++/JNitroInAppMessageResultAndroid.hpp +68 -0
  52. package/nitrogen/generated/android/c++/JNitroLaunchExternalLinkParamsAndroid.hpp +10 -1
  53. package/nitrogen/generated/android/c++/JNitroOneTimePurchaseOfferDetail.hpp +5 -1
  54. package/nitrogen/generated/android/c++/JNitroProduct.hpp +13 -1
  55. package/nitrogen/generated/android/c++/JNitroPurchaseRequest.hpp +7 -0
  56. package/nitrogen/generated/android/c++/JNitroRequestPurchaseAndroid.hpp +16 -1
  57. package/nitrogen/generated/android/c++/JProductType.hpp +58 -0
  58. package/nitrogen/generated/android/c++/JSubResponseCodeAndroid.hpp +61 -0
  59. package/nitrogen/generated/android/c++/JVariant_NullType_Array_InAppMessageCategoryAndroid_.cpp +35 -0
  60. package/nitrogen/generated/android/c++/JVariant_NullType_Array_InAppMessageCategoryAndroid_.hpp +81 -0
  61. package/nitrogen/generated/android/c++/JVariant_NullType_DeveloperBillingOptionParamsAndroid.cpp +26 -0
  62. package/nitrogen/generated/android/c++/JVariant_NullType_DeveloperBillingOptionParamsAndroid.hpp +78 -0
  63. package/nitrogen/generated/android/c++/JVariant_NullType_InitConnectionConfig.hpp +2 -0
  64. package/nitrogen/generated/android/c++/JVariant_NullType_NitroInAppMessageParamsAndroid.cpp +26 -0
  65. package/nitrogen/generated/android/c++/JVariant_NullType_NitroInAppMessageParamsAndroid.hpp +76 -0
  66. package/nitrogen/generated/android/c++/JVariant_NullType_NitroRequestPurchaseAndroid.hpp +7 -0
  67. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/BillingChoiceImageLayoutAndroid.kt +24 -0
  68. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/BillingChoiceScreenTypeAndroid.kt +24 -0
  69. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/BillingProgramAndroid.kt +2 -1
  70. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperBillingLaunchModeAndroid.kt +24 -0
  71. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperBillingOptionParamsAndroid.kt +47 -0
  72. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperBillingTypeAndroid.kt +24 -0
  73. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperProvidedBillingDetailsAndroid.kt +13 -4
  74. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/DeveloperProvidedBillingProductAndroid.kt +44 -0
  75. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/HybridRnIapSpec.kt +13 -1
  76. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/InAppMessageCategoryAndroid.kt +23 -0
  77. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/InAppMessageResponseCodeAndroid.kt +23 -0
  78. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/InitConnectionConfig.kt +5 -2
  79. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingChoiceInfoAndroid.kt +41 -0
  80. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingProgramAvailabilityResultAndroid.kt +10 -4
  81. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingProgramInformationDialogParamsAndroid.kt +41 -0
  82. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroBillingResultAndroid.kt +44 -0
  83. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroGetBillingChoiceInfoParamsAndroid.kt +44 -0
  84. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroInAppMessageParamsAndroid.kt +38 -0
  85. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroInAppMessageResultAndroid.kt +41 -0
  86. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroLaunchExternalLinkParamsAndroid.kt +6 -3
  87. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroOneTimePurchaseOfferDetail.kt +5 -2
  88. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroProduct.kt +11 -2
  89. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroRequestPurchaseAndroid.kt +8 -2
  90. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/ProductType.kt +23 -0
  91. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/SubResponseCodeAndroid.kt +24 -0
  92. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_Array_InAppMessageCategoryAndroid_.kt +53 -0
  93. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_DeveloperBillingOptionParamsAndroid.kt +53 -0
  94. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/Variant_NullType_NitroInAppMessageParamsAndroid.kt +53 -0
  95. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.cpp +24 -0
  96. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.hpp +382 -0
  97. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Umbrella.hpp +48 -0
  98. package/nitrogen/generated/ios/c++/HybridRnIapSpecSwift.hpp +74 -2
  99. package/nitrogen/generated/ios/swift/BillingChoiceImageLayoutAndroid.swift +44 -0
  100. package/nitrogen/generated/ios/swift/BillingChoiceScreenTypeAndroid.swift +44 -0
  101. package/nitrogen/generated/ios/swift/BillingProgramAndroid.swift +4 -0
  102. package/nitrogen/generated/ios/swift/DeveloperBillingLaunchModeAndroid.swift +44 -0
  103. package/nitrogen/generated/ios/swift/DeveloperBillingOptionParamsAndroid.swift +114 -0
  104. package/nitrogen/generated/ios/swift/DeveloperBillingTypeAndroid.swift +44 -0
  105. package/nitrogen/generated/ios/swift/DeveloperProvidedBillingDetailsAndroid.swift +121 -4
  106. package/nitrogen/generated/ios/swift/DeveloperProvidedBillingProductAndroid.swift +71 -0
  107. package/nitrogen/generated/ios/swift/Func_void_NitroBillingChoiceInfoAndroid.swift +46 -0
  108. package/nitrogen/generated/ios/swift/Func_void_NitroBillingResultAndroid.swift +46 -0
  109. package/nitrogen/generated/ios/swift/Func_void_NitroInAppMessageResultAndroid.swift +46 -0
  110. package/nitrogen/generated/ios/swift/HybridRnIapSpec.swift +4 -1
  111. package/nitrogen/generated/ios/swift/HybridRnIapSpec_cxx.swift +78 -2
  112. package/nitrogen/generated/ios/swift/InAppMessageCategoryAndroid.swift +40 -0
  113. package/nitrogen/generated/ios/swift/InAppMessageResponseCodeAndroid.swift +40 -0
  114. package/nitrogen/generated/ios/swift/InitConnectionConfig.swift +12 -1
  115. package/nitrogen/generated/ios/swift/NitroBillingChoiceInfoAndroid.swift +66 -0
  116. package/nitrogen/generated/ios/swift/NitroBillingProgramAvailabilityResultAndroid.swift +50 -2
  117. package/nitrogen/generated/ios/swift/NitroBillingProgramInformationDialogParamsAndroid.swift +34 -0
  118. package/nitrogen/generated/ios/swift/NitroBillingResultAndroid.swift +77 -0
  119. package/nitrogen/generated/ios/swift/NitroGetBillingChoiceInfoParamsAndroid.swift +71 -0
  120. package/nitrogen/generated/ios/swift/NitroInAppMessageParamsAndroid.swift +67 -0
  121. package/nitrogen/generated/ios/swift/NitroInAppMessageResultAndroid.swift +66 -0
  122. package/nitrogen/generated/ios/swift/NitroLaunchExternalLinkParamsAndroid.swift +39 -2
  123. package/nitrogen/generated/ios/swift/NitroOneTimePurchaseOfferDetail.swift +39 -2
  124. package/nitrogen/generated/ios/swift/NitroProduct.swift +113 -2
  125. package/nitrogen/generated/ios/swift/NitroRequestPurchaseAndroid.swift +75 -1
  126. package/nitrogen/generated/ios/swift/ProductType.swift +40 -0
  127. package/nitrogen/generated/ios/swift/SubResponseCodeAndroid.swift +44 -0
  128. package/nitrogen/generated/ios/swift/Variant_NullType_DeveloperBillingOptionParamsAndroid.swift +18 -0
  129. package/nitrogen/generated/ios/swift/Variant_NullType_NitroInAppMessageParamsAndroid.swift +18 -0
  130. package/nitrogen/generated/ios/swift/Variant_NullType__InAppMessageCategoryAndroid_.swift +18 -0
  131. package/nitrogen/generated/shared/c++/BillingChoiceImageLayoutAndroid.hpp +80 -0
  132. package/nitrogen/generated/shared/c++/BillingChoiceScreenTypeAndroid.hpp +80 -0
  133. package/nitrogen/generated/shared/c++/BillingProgramAndroid.hpp +4 -0
  134. package/nitrogen/generated/shared/c++/DeveloperBillingLaunchModeAndroid.hpp +80 -0
  135. package/nitrogen/generated/shared/c++/DeveloperBillingOptionParamsAndroid.hpp +103 -0
  136. package/nitrogen/generated/shared/c++/DeveloperBillingTypeAndroid.hpp +80 -0
  137. package/nitrogen/generated/shared/c++/DeveloperProvidedBillingDetailsAndroid.hpp +24 -6
  138. package/nitrogen/generated/shared/c++/DeveloperProvidedBillingProductAndroid.hpp +96 -0
  139. package/nitrogen/generated/shared/c++/HybridRnIapSpec.cpp +3 -0
  140. package/nitrogen/generated/shared/c++/HybridRnIapSpec.hpp +25 -1
  141. package/nitrogen/generated/shared/c++/InAppMessageCategoryAndroid.hpp +76 -0
  142. package/nitrogen/generated/shared/c++/InAppMessageResponseCodeAndroid.hpp +76 -0
  143. package/nitrogen/generated/shared/c++/InitConnectionConfig.hpp +8 -1
  144. package/nitrogen/generated/shared/c++/NitroBillingChoiceInfoAndroid.hpp +90 -0
  145. package/nitrogen/generated/shared/c++/NitroBillingProgramAvailabilityResultAndroid.hpp +16 -2
  146. package/nitrogen/generated/shared/c++/NitroBillingProgramInformationDialogParamsAndroid.hpp +89 -0
  147. package/nitrogen/generated/shared/c++/NitroBillingResultAndroid.hpp +96 -0
  148. package/nitrogen/generated/shared/c++/NitroGetBillingChoiceInfoParamsAndroid.hpp +99 -0
  149. package/nitrogen/generated/shared/c++/NitroInAppMessageParamsAndroid.hpp +88 -0
  150. package/nitrogen/generated/shared/c++/NitroInAppMessageResultAndroid.hpp +92 -0
  151. package/nitrogen/generated/shared/c++/NitroLaunchExternalLinkParamsAndroid.hpp +9 -2
  152. package/nitrogen/generated/shared/c++/NitroOneTimePurchaseOfferDetail.hpp +5 -1
  153. package/nitrogen/generated/shared/c++/NitroProduct.hpp +13 -1
  154. package/nitrogen/generated/shared/c++/NitroRequestPurchaseAndroid.hpp +12 -1
  155. package/nitrogen/generated/shared/c++/ProductType.hpp +76 -0
  156. package/nitrogen/generated/shared/c++/SubResponseCodeAndroid.hpp +80 -0
  157. package/openiap-versions.json +3 -3
  158. package/package.json +1 -1
  159. package/src/hooks/useIAP.ts +63 -0
  160. package/src/index.kepler.ts +9 -0
  161. package/src/index.ts +223 -95
  162. package/src/specs/RnIap.nitro.ts +116 -8
  163. package/src/types.ts +238 -35
  164. package/src/utils/type-bridge.ts +26 -2
  165. 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 - 8.3.0+)
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("token" to details.externalTransactionToken)
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(android = androidProps)
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(android = androidProps)
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
- val array = JSONArray()
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
- val array = JSONArray()
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
- val array = JSONArray()
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?.map { otp ->
1048
- NitroOneTimePurchaseOfferDetail(
1049
- formattedPrice = otp.formattedPrice,
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 == ProductType.InApp) {
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
- isAvailable = result.isAvailable
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 createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid): Promise<NitroBillingProgramReportingDetailsAndroid> {
1703
+ override fun getBillingChoiceInfoAndroid(params: NitroGetBillingChoiceInfoParamsAndroid): Promise<NitroBillingChoiceInfoAndroid> {
1810
1704
  return Promise.async {
1811
- RnIapLog.payload("createBillingProgramReportingDetailsAndroid", mapOf("program" to program.name))
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(openIapProgram)
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