From 999da80fb79e16229ddc7af145fd06b12ca58885 Mon Sep 17 00:00:00 2001 From: Hyo Date: Wed, 8 Jul 2026 16:07:14 +0900 Subject: [PATCH 01/14] feat(google): support Play Billing 9.1 Billing Choice --- knowledge/_claude-context/context.md | 164 +++++- knowledge/external/google-billing-api.md | 79 ++- knowledge/external/horizon-api.md | 31 +- knowledge/external/storekit2-api.md | 52 +- .../java/expo/modules/iap/ExpoIapModule.kt | 130 ++++- .../src/__mocks__/expo-modules-core.js | 3 + libraries/expo-iap/src/index.kepler.ts | 9 + .../src/modules/__tests__/android.test.ts | 85 ++- libraries/expo-iap/src/modules/android.ts | 92 +++- libraries/expo-iap/src/types.ts | 142 ++++- .../AndroidInappPurchasePlugin.kt | 106 +++- .../lib/flutter_inapp_purchase.dart | 155 +++++- .../flutter_inapp_purchase/lib/types.dart | 362 ++++++++++++- .../flutter_inapp_purchase_channel_test.dart | 161 +++++- .../godot-iap/addons/godot-iap/godot_iap.gd | 67 ++- libraries/godot-iap/addons/godot-iap/types.gd | 375 +++++++++++++- libraries/godot-iap/android/build.gradle.kts | 1 + .../godot-iap/android/settings.gradle.kts | 14 + .../main/java/dev/hyo/godotiap/GodotIap.kt | 165 +++++- .../screens/AlternativeBillingScreen.kt | 27 + libraries/kmp-iap/library/build.gradle.kts | 2 +- .../kmpiap/AmazonInAppPurchaseAndroid.kt | 22 +- .../kotlin/io/github/hyochan/kmpiap/Helper.kt | 1 + .../hyochan/kmpiap/InAppPurchaseAndroid.kt | 471 +++++++++++++++-- .../io/github/hyochan/kmpiap/openiap/Types.kt | 376 +++++++++++++- .../github/hyochan/kmpiap/InAppPurchaseIOS.kt | 17 +- .../dev/hyo/openiap/maui/OpenIapMauiModule.kt | 34 ++ libraries/maui-iap/src/Directory.Build.props | 16 +- .../Android/OpenIapAndroid.Resolvers.cs | 34 +- .../OpenIap.Maui/Platforms/iOS/OpenIapIOS.cs | 5 +- libraries/maui-iap/src/OpenIap.Maui/Types.cs | 373 +++++++++++++- .../java/com/margelo/nitro/iap/HybridRnIap.kt | 163 +++++- .../example/android/build.gradle | 2 +- .../react-native-iap/ios/HybridRnIap.swift | 20 +- .../src/__tests__/index.test.ts | 95 ++++ .../react-native-iap/src/index.kepler.ts | 9 + libraries/react-native-iap/src/index.ts | 128 ++++- .../react-native-iap/src/specs/RnIap.nitro.ts | 100 +++- libraries/react-native-iap/src/types.ts | 142 ++++- .../react-native-iap/src/vega-adapter.ts | 11 + packages/apple/CONVENTION.md | 38 ++ packages/apple/Sources/Models/Types.swift | 172 ++++++- packages/docs/public/llms-full.txt | 183 +++++-- packages/docs/public/llms.txt | 12 +- packages/docs/src/components/CodeBlock.tsx | 11 + .../docs/src/generated/version-metadata.json | 2 +- packages/docs/src/lib/searchData.ts | 32 +- .../docs/src/pages/docs/android-setup.tsx | 66 ++- ...ling-program-reporting-details-android.tsx | 54 +- .../enable-billing-program-android.tsx | 10 +- .../get-billing-choice-info-android.tsx | 201 ++++++++ .../is-billing-program-available-android.tsx | 27 +- ...ing-program-information-dialog-android.tsx | 180 +++++++ .../android/show-in-app-messages-android.tsx | 179 +++++++ packages/docs/src/pages/docs/apis/index.tsx | 39 ++ .../src/pages/docs/apis/init-connection.tsx | 9 +- packages/docs/src/pages/docs/index.tsx | 27 + .../docs/types/alternative-billing-types.tsx | 3 +- .../src/pages/docs/types/billing-programs.tsx | 485 +++++++++++++++++- .../docs/src/pages/docs/updates/releases.tsx | 221 ++++++++ packages/google/README.md | 6 +- packages/google/gradle.properties | 2 +- packages/google/openiap/build.gradle.kts | 4 +- .../java/dev/hyo/openiap/OpenIapModule.kt | 40 +- .../java/dev/hyo/openiap/OpenIapModule.kt | 61 ++- .../java/dev/hyo/openiap/OpenIapProtocol.kt | 26 +- .../src/main/java/dev/hyo/openiap/Types.kt | 376 +++++++++++++- .../dev/hyo/openiap/store/OpenIapStore.kt | 44 +- .../java/dev/hyo/openiap/OpenIapModule.kt | 408 +++++++++++++-- .../openiap/BillingChoiceAndroidTypesTest.kt | 54 ++ .../openiap/BillingLibraryClassPathTest.kt | 220 ++++++++ .../hyo/openiap/BillingProgramAndroidTest.kt | 3 + .../dev/hyo/openiap/QueryPurchasesRaceTest.kt | 15 + packages/gql/src/api-android.graphql | 41 +- packages/gql/src/generated/Types.cs | 373 +++++++++++++- packages/gql/src/generated/Types.kt | 376 +++++++++++++- packages/gql/src/generated/Types.swift | 172 ++++++- packages/gql/src/generated/types.dart | 362 ++++++++++++- packages/gql/src/generated/types.gd | 375 +++++++++++++- packages/gql/src/generated/types.ts | 142 ++++- packages/gql/src/type-android.graphql | 182 ++++++- scripts/audit-non-godot-parity.mjs | 18 + 82 files changed, 9055 insertions(+), 437 deletions(-) create mode 100644 packages/apple/CONVENTION.md create mode 100644 packages/docs/src/pages/docs/apis/android/get-billing-choice-info-android.tsx create mode 100644 packages/docs/src/pages/docs/apis/android/show-billing-program-information-dialog-android.tsx create mode 100644 packages/docs/src/pages/docs/apis/android/show-in-app-messages-android.tsx create mode 100644 packages/google/openiap/src/test/java/dev/hyo/openiap/BillingChoiceAndroidTypesTest.kt diff --git a/knowledge/_claude-context/context.md b/knowledge/_claude-context/context.md index 6a7217a74..a9c4d5d9d 100644 --- a/knowledge/_claude-context/context.md +++ b/knowledge/_claude-context/context.md @@ -1,7 +1,7 @@ # OpenIAP Project Context > **Auto-generated for Claude Code** -> Last updated: 2026-07-04T10:52:01.931Z +> Last updated: 2026-07-08T06:25:10.073Z > > Usage: `claude --context knowledge/_claude-context/context.md` @@ -2885,7 +2885,7 @@ await endConnection(); # Google Play Billing Library API Reference -> Reference documentation for Google Play Billing Library 8.x +> Reference documentation for Google Play Billing Library 9.x > Adapt all patterns to match OpenIAP internal conventions. ## Overview @@ -2901,8 +2901,15 @@ Google Play Billing Library enables in-app purchases and subscriptions on Androi | 8.2 | 2025-12-09 | Billing Programs API (external content links, external offers), deprecates old External Offers API | | 8.2.1 | 2025-12-15 | Bug fix for `isBillingProgramAvailableAsync()` and `createBillingProgramReportingDetailsAsync()` | | 8.3 | 2025-12-23 | External Payments program (Japan only), developer billing options | +| 9.0 | 2026-05-19 | Removes older deprecated APIs, reclassifies blocked Play Store activity errors, adds richer sub-response handling, target SDK 35 | +| 9.1 | 2026-06-18 | Billing Choice APIs: `getBillingChoiceInfoAsync()`, `showBillingProgramInformationDialog()`, choice-screen details | -**Current Version**: 8.3.0 (as of April 2026) +**Current Version**: 9.1.0 (as of July 2026) + +> **OpenIAP audit note**: `packages/google` is pinned to Play Billing 9.1.0. +> Billing Choice APIs are implemented only in the Play flavor; Horizon and +> Amazon variants keep unsupported/default behavior for APIs that do not exist +> in their store SDKs. ## Core Classes @@ -2913,7 +2920,11 @@ The main interface for communicating with Google Play Billing. ```kotlin val billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) - .enablePendingPurchases() + .enablePendingPurchases( + PendingPurchasesParams.newBuilder() + .enableOneTimeProducts() + .build() + ) // New in 8.0: Auto-reconnect on service disconnect .enableAutoServiceReconnection() .build() @@ -2930,7 +2941,8 @@ BillingClient.newBuilder(context) When enabled, the library automatically re-establishes the connection if an API call is made while disconnected. This reduces `SERVICE_DISCONNECTED` errors. -> **OpenIAP Note**: Auto-reconnection is **always enabled** internally since OpenIAP uses Billing Library 8.3.0+. No configuration needed. +> **OpenIAP Note**: Auto-reconnection is enabled internally when the Play +> Billing version exposes the API. No OpenIAP app-level configuration is needed. ### Connection Management @@ -3216,11 +3228,11 @@ billingClient.queryPurchasesAsync(params) { billingResult, purchases -> ```kotlin val result = billingClient.launchBillingFlow(activity, params) -when (result.subResponseCode) { - BillingResult.SUB_RESPONSE_CODE_INSUFFICIENT_FUNDS -> { +when (result.onPurchasesUpdatedSubResponseCode) { + BillingClient.OnPurchasesUpdatedSubResponseCode.PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS -> { // User's payment method has insufficient funds } - BillingResult.SUB_RESPONSE_CODE_USER_INELIGIBLE -> { + BillingClient.OnPurchasesUpdatedSubResponseCode.USER_INELIGIBLE -> { // User doesn't meet offer eligibility requirements } } @@ -3232,6 +3244,11 @@ when (result.subResponseCode) { | `USER_INELIGIBLE` | User doesn't meet subscription offer eligibility | | `NO_APPLICABLE_SUB_RESPONSE_CODE` | No specific sub-code applies | +PBL 9 makes sub-response-code handling part of the migration checklist. It also +changes blocked Play Store app cases from generic `ERROR` to +`BILLING_UNAVAILABLE`, with a debug message explaining that Play Store is +blocked. + ## Subscription Product Replacement (8.1+) Product-level replacement parameters for subscription upgrades/downgrades: @@ -3270,10 +3287,15 @@ Billing Library 8.3 (December 2025) added support for the External Payments prog // During BillingClient setup val billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) - .enablePendingPurchases() + .enablePendingPurchases( + PendingPurchasesParams.newBuilder() + .enableOneTimeProducts() + .build() + ) .enableAutoServiceReconnection() - .enableDeveloperBillingOption( - DeveloperBillingOptionParams.newBuilder() + .enableBillingProgram( + EnableBillingProgramParams.newBuilder() + .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS) .setDeveloperProvidedBillingListener(developerBillingListener) .build() ) @@ -3295,7 +3317,12 @@ val developerBillingListener = DeveloperProvidedBillingListener { ```kotlin val params = BillingFlowParams.newBuilder() .setProductDetailsParamsList(listOf(productDetailsParams)) - .setBillingOption(BillingOption.EXTERNAL_PAYMENTS) // 8.3+ + .enableDeveloperBillingOption( + DeveloperBillingOptionParams.newBuilder() + .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS) + .setDeveloperProvidedBillingDetails(developerProvidedBillingDetails) + .build() + ) .build() billingClient.launchBillingFlow(activity, params) @@ -3312,15 +3339,41 @@ billingClient.launchBillingFlow(activity, params) > **OpenIAP Note**: Exposed through the Android-specific `AlternativeBilling*` surface in OpenIAP. Enrolment with Google Play's External Payments program is required; availability is currently restricted to Japan. The Horizon flavor does NOT implement this. +## Billing Choice (9.1+) + +Billing Library 9.1 adds APIs for markets and programs where Google Play shows +the user a billing choice screen. + +| API / Type | Purpose | +|------------|---------| +| `BillingClient.getBillingChoiceInfoAsync()` | Fetches billing choices available to the current user | +| `BillingChoiceInfo` | Contains choice-screen data, including image URLs and loyalty details | +| `GetBillingChoiceInfoParams` | Configures the billing-choice info request | +| `BillingClient.showBillingProgramInformationDialog()` | Shows an information dialog for a billing program | +| `BillingProgramInformationDialogParams` | Configures the information dialog | +| `ChoiceScreenType` | Selects the choice-screen type | + +> **OpenIAP gap**: No GraphQL/OpenIAP surface exists yet for Billing Choice +> info or billing-program information dialogs. Add schema types and Play-flavor +> implementations before advertising PBL 9.1 Billing Choice support. + +## PBL 9 Migration Guardrails + +- Replace removed APIs: `SkuDetails`, `SkuDetailsParams`, `SkuDetailsResponseListener`, `BillingClient.SkuType`, `querySkuDetailsAsync()`, no-argument `enablePendingPurchases()`, and string `queryPurchasesAsync()`. +- Use `ProductDetails`, `QueryProductDetailsParams`, `BillingClient.ProductType`, parameterized `enablePendingPurchases(PendingPurchasesParams)`, and `queryPurchasesAsync(QueryPurchasesParams, ...)`. +- Handle `DeveloperProvidedBillingDetails.getLinkUri()` as nullable. +- Keep Horizon shared code on the Billing 7.0-compatible API subset; put PBL 8/9 code in Play-only sources or behind reflection. + ## Best Practices 1. **Always acknowledge purchases** within 3 days or they will be refunded 2. **Verify purchases server-side** using Google Play Developer API 3. **Handle pending purchases** for payment methods that require additional steps -4. **Auto-reconnect is enabled by default** in OpenIAP (8.0+) +4. **Auto-reconnect is enabled by default** in OpenIAP when available (8.0+) 5. **Check product status codes** (8.0+) to understand why products weren't fetched 6. **Check isSuspended** (8.1+) before granting entitlements -7. **Cache product details** to avoid repeated queries +7. **Handle Billing Choice separately** before claiming PBL 9.1 feature coverage +8. **Cache product details** to avoid repeated queries --- @@ -3343,18 +3396,33 @@ Meta Horizon provides IAP functionality for Quest VR applications. There are two | Library | Version | Compatible With | |---------|---------|-----------------| -| horizon-billing-compatibility | **1.1.1** (latest) | Google Play Billing **7.0** API | -| Google Play Billing (Play flavor) | **8.3.0** (latest) | N/A | +| horizon-billing-compatibility | **2.0.0** (latest) | Google Play Billing **7.0** API | +| Google Play Billing (upstream latest) | **9.1.0** | N/A | +| Google Play Billing (OpenIAP Play flavor) | **9.1.0** | N/A | | react-native-iap | v14+ | Billing 7.0+, RN 0.79+, Kotlin 2.0+ | | expo-iap | latest | Billing 7.0+, Kotlin 2.0+ | -**CRITICAL**: Horizon Billing Compatibility SDK implements Google Play Billing **7.0** API surface, NOT 8.x. +**CRITICAL**: Horizon Billing Compatibility SDK implements Google Play Billing **7.0** API surface, NOT 8.x or 9.x. When writing shared code for both Play and Horizon flavors: -- Use only APIs that exist in **both** Billing 7.0 and 8.x -- Horizon SDK does NOT support Billing 8.x features like auto-reconnect, product status codes, or `includeSuspended` +- Use only APIs that exist in **both** Billing 7.0 and the Play-flavor Billing version +- Horizon SDK does NOT support Billing 8.x/9.x features like auto-reconnect, product status codes, `includeSuspended`, or Billing Choice - OpenIAP handles this automatically with flavor-specific implementations +### Latest Horizon Billing Release + +Meta released Horizon Billing Compatibility Library **2.0.0** on 2026-01-06. +The release notes call out a fix for querying subscription purchases with a +single billing plan and dependencies on Horizon Platform SDK Kotlin +`iap-kotlin` 0.2.0 and `core-kotlin` 0.2.0. + +> **OpenIAP gap**: `packages/google` is still pinned to +> `horizon-billing-compatibility` 1.1.1. Upgrading to 2.0.0 should be tested +> separately with `:openiap:compileHorizonDebugKotlin` and +> subscription-purchase restore coverage. Play Billing 9.1.0 features remain +> Play-flavor-only because Horizon compatibility still targets the Billing 7.0 +> API surface. + ### APIs Available in Both (Safe to use in shared code) - `BillingClient.Builder`, `BillingClient.newBuilder()` @@ -3376,6 +3444,12 @@ When writing shared code for both Play and Horizon flavors: - Billing Programs API (`isBillingProgramAvailableAsync`, etc.) (8.2+) - External Payments / Developer Billing Options (8.3+) +### APIs Only in Billing 9.x (DO NOT use in shared code) + +- Billing Choice information APIs (`getBillingChoiceInfoAsync`, `BillingChoiceInfo`, `ChoiceScreenType`) +- Billing-program information dialog APIs (`showBillingProgramInformationDialog`) +- PBL 9 migration assumptions around APIs removed from the Billing 7.0 surface + ## Billing Compatibility SDK For apps already using Google Play Billing Library, the Horizon Billing Compatibility SDK provides a minimal migration path. @@ -4024,7 +4098,7 @@ export default withIAPContext(Store); This document provides external API reference for Apple's StoreKit 2 framework. -## iOS 18+ Features +## iOS 18+ / 26+ Features | Feature | iOS Version | Description | |---------|-------------|-------------| @@ -4043,6 +4117,11 @@ This document provides external API reference for Apple's StoreKit 2 framework. | JWS promotional offers | WWDC 2025 | New `promotionalOffer` purchase option with JWS format | | `introductoryOfferEligibility` | WWDC 2025 | Set eligibility via purchase option | | `SubscriptionStatus` by Transaction ID | WWDC 2025 | `status(for: transactionID:)` | +| Monthly subscriptions with a 12-month commitment | iOS 26.4 / 26.5 SDK | Monthly billing option for annual auto-renewable subscriptions | +| Group purchases and volume purchasing | WWDC 2026 | Multi-seat auto-renewable subscriptions through StoreKit 2 and Apple Business / School Manager | +| Retention Messaging | WWDC 2026 | Cancellation-flow messaging and offers, including real-time server decisioning | +| Retention offer type | WWDC 2026 | Signed transaction / renewal info can report offer type `5` for retention offers | +| Offer codes for all IAP types | 2026 | Offer codes expand beyond auto-renewable subscriptions; IAP promo-code creation ends March 26, 2026 | ### WWDC 2025 Updates @@ -4051,6 +4130,14 @@ This document provides external API reference for Apple's StoreKit 2 framework. - **Introductory offer eligibility**: Override eligibility check with `introductoryOfferEligibility` purchase option. - Both new purchase options are back-deployed to iOS 15. +### WWDC 2026 Updates + +- **Monthly subscriptions with a 12-month commitment**: iOS 26.5 SDK adds a monthly billing plan for one-year auto-renewable subscriptions. Customers can subscribe on iOS, iPadOS, macOS, tvOS, and visionOS 26.4+. +- **Group purchases and volume purchasing**: Auto-renewable subscriptions using StoreKit 2 can be sold to groups and organizations. In-app group purchases pass a requested seat count into the StoreKit purchase flow; Apple Business Manager and Apple School Manager handle volume purchasing. +- **Volume pricing**: App Store Connect can configure up to five seat-count price bands for larger subscription purchases. +- **Retention Messaging**: App Store Connect can show cancellation-flow retention messages and offers. Real-time Retention Messaging adds a server-to-server decision point and supports a switch-plan view for monthly subscriptions with a 12-month commitment. +- **Offer-code expansion**: Offer codes now support consumables, non-consumables, non-renewing subscriptions, and broader auto-renewable subscription scenarios. Starting March 26, 2026, App Store Connect no longer creates new promo codes for In-App Purchases. + ## appAccountToken A UUID that associates a purchase with a user account in your system. This property allows you to correlate App Store transactions with users in your backend. @@ -4332,6 +4419,43 @@ if let advancedInfo = product.advancedCommerceInfo { } ``` +## Monthly Subscriptions With 12-Month Commitment (iOS 26.4+) + +This billing plan lets customers pay monthly while committing to an annual +auto-renewable subscription. Apps need to compile with the iOS 26.5 SDK to +merchandise the plan, and customers can purchase on Apple platforms running +26.4 or later. + +```swift +let result = try await product.purchase(options: [ + .billingPlanType(.monthly) +]) +``` + +> **OpenIAP Note**: The schema represents this with +> `SubscriptionBillingPlanTypeIOS` and `RequestSubscriptionIOSProps.billingPlanType`. + +## Group Purchases and Volume Purchasing (WWDC 2026) + +StoreKit 2 auto-renewable subscriptions can be sold to multiple seats for +groups or organizations. Volume purchasing is handled by Apple Business Manager +and Apple School Manager. For in-app group purchases, the app starts a StoreKit +purchase with the requested seat count, then Apple can manage invitation links +and seat assignment unless the app integrates custom group management. + +> **OpenIAP gap**: No public OpenIAP request field exists yet for group-purchase +> seat count or StoreKit group-management identifiers. + +## Retention Messaging (WWDC 2026) + +Retention Messaging lets App Store Connect present messages and optional offers +when a subscriber is about to cancel. Real-time Retention Messaging can call a +server endpoint so the developer can choose the message, offer, or switch-plan +view at cancellation time. + +Signed transaction and renewal information can include a retention offer as +offer type `5`. + ## StoreKit Message API (iOS 18+) Listen for App Store–generated messages (billing issues, win-back offers, price increases, generic). diff --git a/knowledge/external/google-billing-api.md b/knowledge/external/google-billing-api.md index e5a9b386e..8555d423f 100644 --- a/knowledge/external/google-billing-api.md +++ b/knowledge/external/google-billing-api.md @@ -1,6 +1,6 @@ # Google Play Billing Library API Reference -> Reference documentation for Google Play Billing Library 8.x +> Reference documentation for Google Play Billing Library 9.x > Adapt all patterns to match OpenIAP internal conventions. ## Overview @@ -16,8 +16,15 @@ Google Play Billing Library enables in-app purchases and subscriptions on Androi | 8.2 | 2025-12-09 | Billing Programs API (external content links, external offers), deprecates old External Offers API | | 8.2.1 | 2025-12-15 | Bug fix for `isBillingProgramAvailableAsync()` and `createBillingProgramReportingDetailsAsync()` | | 8.3 | 2025-12-23 | External Payments program (Japan only), developer billing options | +| 9.0 | 2026-05-19 | Removes older deprecated APIs, reclassifies blocked Play Store activity errors, adds richer sub-response handling, target SDK 35 | +| 9.1 | 2026-06-18 | Billing Choice APIs: `getBillingChoiceInfoAsync()`, `showBillingProgramInformationDialog()`, choice-screen details | -**Current Version**: 8.3.0 (as of April 2026) +**Current Version**: 9.1.0 (as of July 2026) + +> **OpenIAP audit note**: `packages/google` is pinned to Play Billing 9.1.0. +> Billing Choice APIs are implemented only in the Play flavor; Horizon and +> Amazon variants keep unsupported/default behavior for APIs that do not exist +> in their store SDKs. ## Core Classes @@ -28,7 +35,11 @@ The main interface for communicating with Google Play Billing. ```kotlin val billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) - .enablePendingPurchases() + .enablePendingPurchases( + PendingPurchasesParams.newBuilder() + .enableOneTimeProducts() + .build() + ) // New in 8.0: Auto-reconnect on service disconnect .enableAutoServiceReconnection() .build() @@ -45,7 +56,8 @@ BillingClient.newBuilder(context) When enabled, the library automatically re-establishes the connection if an API call is made while disconnected. This reduces `SERVICE_DISCONNECTED` errors. -> **OpenIAP Note**: Auto-reconnection is **always enabled** internally since OpenIAP uses Billing Library 8.3.0+. No configuration needed. +> **OpenIAP Note**: Auto-reconnection is enabled internally when the Play +> Billing version exposes the API. No OpenIAP app-level configuration is needed. ### Connection Management @@ -331,11 +343,11 @@ billingClient.queryPurchasesAsync(params) { billingResult, purchases -> ```kotlin val result = billingClient.launchBillingFlow(activity, params) -when (result.subResponseCode) { - BillingResult.SUB_RESPONSE_CODE_INSUFFICIENT_FUNDS -> { +when (result.onPurchasesUpdatedSubResponseCode) { + BillingClient.OnPurchasesUpdatedSubResponseCode.PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS -> { // User's payment method has insufficient funds } - BillingResult.SUB_RESPONSE_CODE_USER_INELIGIBLE -> { + BillingClient.OnPurchasesUpdatedSubResponseCode.USER_INELIGIBLE -> { // User doesn't meet offer eligibility requirements } } @@ -347,6 +359,11 @@ when (result.subResponseCode) { | `USER_INELIGIBLE` | User doesn't meet subscription offer eligibility | | `NO_APPLICABLE_SUB_RESPONSE_CODE` | No specific sub-code applies | +PBL 9 makes sub-response-code handling part of the migration checklist. It also +changes blocked Play Store app cases from generic `ERROR` to +`BILLING_UNAVAILABLE`, with a debug message explaining that Play Store is +blocked. + ## Subscription Product Replacement (8.1+) Product-level replacement parameters for subscription upgrades/downgrades: @@ -385,10 +402,15 @@ Billing Library 8.3 (December 2025) added support for the External Payments prog // During BillingClient setup val billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) - .enablePendingPurchases() + .enablePendingPurchases( + PendingPurchasesParams.newBuilder() + .enableOneTimeProducts() + .build() + ) .enableAutoServiceReconnection() - .enableDeveloperBillingOption( - DeveloperBillingOptionParams.newBuilder() + .enableBillingProgram( + EnableBillingProgramParams.newBuilder() + .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS) .setDeveloperProvidedBillingListener(developerBillingListener) .build() ) @@ -410,7 +432,12 @@ val developerBillingListener = DeveloperProvidedBillingListener { ```kotlin val params = BillingFlowParams.newBuilder() .setProductDetailsParamsList(listOf(productDetailsParams)) - .setBillingOption(BillingOption.EXTERNAL_PAYMENTS) // 8.3+ + .enableDeveloperBillingOption( + DeveloperBillingOptionParams.newBuilder() + .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS) + .setDeveloperProvidedBillingDetails(developerProvidedBillingDetails) + .build() + ) .build() billingClient.launchBillingFlow(activity, params) @@ -427,12 +454,38 @@ billingClient.launchBillingFlow(activity, params) > **OpenIAP Note**: Exposed through the Android-specific `AlternativeBilling*` surface in OpenIAP. Enrolment with Google Play's External Payments program is required; availability is currently restricted to Japan. The Horizon flavor does NOT implement this. +## Billing Choice (9.1+) + +Billing Library 9.1 adds APIs for markets and programs where Google Play shows +the user a billing choice screen. + +| API / Type | Purpose | +|------------|---------| +| `BillingClient.getBillingChoiceInfoAsync()` | Fetches billing choices available to the current user | +| `BillingChoiceInfo` | Contains choice-screen data, including image URLs and loyalty details | +| `GetBillingChoiceInfoParams` | Configures the billing-choice info request | +| `BillingClient.showBillingProgramInformationDialog()` | Shows an information dialog for a billing program | +| `BillingProgramInformationDialogParams` | Configures the information dialog | +| `ChoiceScreenType` | Selects the choice-screen type | + +> **OpenIAP gap**: No GraphQL/OpenIAP surface exists yet for Billing Choice +> info or billing-program information dialogs. Add schema types and Play-flavor +> implementations before advertising PBL 9.1 Billing Choice support. + +## PBL 9 Migration Guardrails + +- Replace removed APIs: `SkuDetails`, `SkuDetailsParams`, `SkuDetailsResponseListener`, `BillingClient.SkuType`, `querySkuDetailsAsync()`, no-argument `enablePendingPurchases()`, and string `queryPurchasesAsync()`. +- Use `ProductDetails`, `QueryProductDetailsParams`, `BillingClient.ProductType`, parameterized `enablePendingPurchases(PendingPurchasesParams)`, and `queryPurchasesAsync(QueryPurchasesParams, ...)`. +- Handle `DeveloperProvidedBillingDetails.getLinkUri()` as nullable. +- Keep Horizon shared code on the Billing 7.0-compatible API subset; put PBL 8/9 code in Play-only sources or behind reflection. + ## Best Practices 1. **Always acknowledge purchases** within 3 days or they will be refunded 2. **Verify purchases server-side** using Google Play Developer API 3. **Handle pending purchases** for payment methods that require additional steps -4. **Auto-reconnect is enabled by default** in OpenIAP (8.0+) +4. **Auto-reconnect is enabled by default** in OpenIAP when available (8.0+) 5. **Check product status codes** (8.0+) to understand why products weren't fetched 6. **Check isSuspended** (8.1+) before granting entitlements -7. **Cache product details** to avoid repeated queries +7. **Handle Billing Choice separately** before claiming PBL 9.1 feature coverage +8. **Cache product details** to avoid repeated queries diff --git a/knowledge/external/horizon-api.md b/knowledge/external/horizon-api.md index 309e8d538..628d2dfe2 100644 --- a/knowledge/external/horizon-api.md +++ b/knowledge/external/horizon-api.md @@ -14,18 +14,33 @@ Meta Horizon provides IAP functionality for Quest VR applications. There are two | Library | Version | Compatible With | |---------|---------|-----------------| -| horizon-billing-compatibility | **1.1.1** (latest) | Google Play Billing **7.0** API | -| Google Play Billing (Play flavor) | **8.3.0** (latest) | N/A | +| horizon-billing-compatibility | **2.0.0** (latest) | Google Play Billing **7.0** API | +| Google Play Billing (upstream latest) | **9.1.0** | N/A | +| Google Play Billing (OpenIAP Play flavor) | **9.1.0** | N/A | | react-native-iap | v14+ | Billing 7.0+, RN 0.79+, Kotlin 2.0+ | | expo-iap | latest | Billing 7.0+, Kotlin 2.0+ | -**CRITICAL**: Horizon Billing Compatibility SDK implements Google Play Billing **7.0** API surface, NOT 8.x. +**CRITICAL**: Horizon Billing Compatibility SDK implements Google Play Billing **7.0** API surface, NOT 8.x or 9.x. When writing shared code for both Play and Horizon flavors: -- Use only APIs that exist in **both** Billing 7.0 and 8.x -- Horizon SDK does NOT support Billing 8.x features like auto-reconnect, product status codes, or `includeSuspended` +- Use only APIs that exist in **both** Billing 7.0 and the Play-flavor Billing version +- Horizon SDK does NOT support Billing 8.x/9.x features like auto-reconnect, product status codes, `includeSuspended`, or Billing Choice - OpenIAP handles this automatically with flavor-specific implementations +### Latest Horizon Billing Release + +Meta released Horizon Billing Compatibility Library **2.0.0** on 2026-01-06. +The release notes call out a fix for querying subscription purchases with a +single billing plan and dependencies on Horizon Platform SDK Kotlin +`iap-kotlin` 0.2.0 and `core-kotlin` 0.2.0. + +> **OpenIAP gap**: `packages/google` is still pinned to +> `horizon-billing-compatibility` 1.1.1. Upgrading to 2.0.0 should be tested +> separately with `:openiap:compileHorizonDebugKotlin` and +> subscription-purchase restore coverage. Play Billing 9.1.0 features remain +> Play-flavor-only because Horizon compatibility still targets the Billing 7.0 +> API surface. + ### APIs Available in Both (Safe to use in shared code) - `BillingClient.Builder`, `BillingClient.newBuilder()` @@ -47,6 +62,12 @@ When writing shared code for both Play and Horizon flavors: - Billing Programs API (`isBillingProgramAvailableAsync`, etc.) (8.2+) - External Payments / Developer Billing Options (8.3+) +### APIs Only in Billing 9.x (DO NOT use in shared code) + +- Billing Choice information APIs (`getBillingChoiceInfoAsync`, `BillingChoiceInfo`, `ChoiceScreenType`) +- Billing-program information dialog APIs (`showBillingProgramInformationDialog`) +- PBL 9 migration assumptions around APIs removed from the Billing 7.0 surface + ## Billing Compatibility SDK For apps already using Google Play Billing Library, the Horizon Billing Compatibility SDK provides a minimal migration path. diff --git a/knowledge/external/storekit2-api.md b/knowledge/external/storekit2-api.md index 19adf86b0..4687fd700 100644 --- a/knowledge/external/storekit2-api.md +++ b/knowledge/external/storekit2-api.md @@ -2,7 +2,7 @@ This document provides external API reference for Apple's StoreKit 2 framework. -## iOS 18+ Features +## iOS 18+ / 26+ Features | Feature | iOS Version | Description | |---------|-------------|-------------| @@ -21,6 +21,11 @@ This document provides external API reference for Apple's StoreKit 2 framework. | JWS promotional offers | WWDC 2025 | New `promotionalOffer` purchase option with JWS format | | `introductoryOfferEligibility` | WWDC 2025 | Set eligibility via purchase option | | `SubscriptionStatus` by Transaction ID | WWDC 2025 | `status(for: transactionID:)` | +| Monthly subscriptions with a 12-month commitment | iOS 26.4 / 26.5 SDK | Monthly billing option for annual auto-renewable subscriptions | +| Group purchases and volume purchasing | WWDC 2026 | Multi-seat auto-renewable subscriptions through StoreKit 2 and Apple Business / School Manager | +| Retention Messaging | WWDC 2026 | Cancellation-flow messaging and offers, including real-time server decisioning | +| Retention offer type | WWDC 2026 | Signed transaction / renewal info can report offer type `5` for retention offers | +| Offer codes for all IAP types | 2026 | Offer codes expand beyond auto-renewable subscriptions; IAP promo-code creation ends March 26, 2026 | ### WWDC 2025 Updates @@ -29,6 +34,14 @@ This document provides external API reference for Apple's StoreKit 2 framework. - **Introductory offer eligibility**: Override eligibility check with `introductoryOfferEligibility` purchase option. - Both new purchase options are back-deployed to iOS 15. +### WWDC 2026 Updates + +- **Monthly subscriptions with a 12-month commitment**: iOS 26.5 SDK adds a monthly billing plan for one-year auto-renewable subscriptions. Customers can subscribe on iOS, iPadOS, macOS, tvOS, and visionOS 26.4+. +- **Group purchases and volume purchasing**: Auto-renewable subscriptions using StoreKit 2 can be sold to groups and organizations. In-app group purchases pass a requested seat count into the StoreKit purchase flow; Apple Business Manager and Apple School Manager handle volume purchasing. +- **Volume pricing**: App Store Connect can configure up to five seat-count price bands for larger subscription purchases. +- **Retention Messaging**: App Store Connect can show cancellation-flow retention messages and offers. Real-time Retention Messaging adds a server-to-server decision point and supports a switch-plan view for monthly subscriptions with a 12-month commitment. +- **Offer-code expansion**: Offer codes now support consumables, non-consumables, non-renewing subscriptions, and broader auto-renewable subscription scenarios. Starting March 26, 2026, App Store Connect no longer creates new promo codes for In-App Purchases. + ## appAccountToken A UUID that associates a purchase with a user account in your system. This property allows you to correlate App Store transactions with users in your backend. @@ -310,6 +323,43 @@ if let advancedInfo = product.advancedCommerceInfo { } ``` +## Monthly Subscriptions With 12-Month Commitment (iOS 26.4+) + +This billing plan lets customers pay monthly while committing to an annual +auto-renewable subscription. Apps need to compile with the iOS 26.5 SDK to +merchandise the plan, and customers can purchase on Apple platforms running +26.4 or later. + +```swift +let result = try await product.purchase(options: [ + .billingPlanType(.monthly) +]) +``` + +> **OpenIAP Note**: The schema represents this with +> `SubscriptionBillingPlanTypeIOS` and `RequestSubscriptionIOSProps.billingPlanType`. + +## Group Purchases and Volume Purchasing (WWDC 2026) + +StoreKit 2 auto-renewable subscriptions can be sold to multiple seats for +groups or organizations. Volume purchasing is handled by Apple Business Manager +and Apple School Manager. For in-app group purchases, the app starts a StoreKit +purchase with the requested seat count, then Apple can manage invitation links +and seat assignment unless the app integrates custom group management. + +> **OpenIAP gap**: No public OpenIAP request field exists yet for group-purchase +> seat count or StoreKit group-management identifiers. + +## Retention Messaging (WWDC 2026) + +Retention Messaging lets App Store Connect present messages and optional offers +when a subscriber is about to cancel. Real-time Retention Messaging can call a +server endpoint so the developer can choose the message, offer, or switch-plan +view at cancellation time. + +Signed transaction and renewal information can include a retention offer as +offer type `5`. + ## StoreKit Message API (iOS 18+) Listen for App Store–generated messages (billing issues, win-back offers, price increases, generic). diff --git a/libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapModule.kt b/libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapModule.kt index 4639a0f27..4e3816d16 100644 --- a/libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapModule.kt +++ b/libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapModule.kt @@ -36,9 +36,15 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import java.util.concurrent.ConcurrentLinkedQueue import java.util.concurrent.atomic.AtomicBoolean +import dev.hyo.openiap.BillingChoiceImageLayoutAndroid as OpenIapBillingChoiceImageLayout +import dev.hyo.openiap.BillingProgramInformationDialogParamsAndroid as OpenIapBillingProgramInformationDialogParams import dev.hyo.openiap.BillingProgramAndroid as OpenIapBillingProgram +import dev.hyo.openiap.DeveloperBillingTypeAndroid as OpenIapDeveloperBillingType import dev.hyo.openiap.ExternalLinkLaunchModeAndroid as OpenIapExternalLinkLaunchMode import dev.hyo.openiap.ExternalLinkTypeAndroid as OpenIapExternalLinkType +import dev.hyo.openiap.GetBillingChoiceInfoParamsAndroid as OpenIapGetBillingChoiceInfoParams +import dev.hyo.openiap.InAppMessageCategoryAndroid as OpenIapInAppMessageCategory +import dev.hyo.openiap.InAppMessageParamsAndroid as OpenIapInAppMessageParams import dev.hyo.openiap.LaunchExternalLinkParamsAndroid as OpenIapLaunchExternalLinkParams class ExpoIapModule : Module() { @@ -569,8 +575,10 @@ class ExpoIapModule : Module() { val result = openIapStore.isBillingProgramAvailable(openIapProgram) val response = mapOf( - "billingProgram" to program, + "billingProgram" to result.billingProgram.toJson(), + "choiceScreenType" to result.choiceScreenType?.toJson(), "isAvailable" to result.isAvailable, + "isExternalLinkAvailable" to result.isExternalLinkAvailable, ) ExpoIapLog.result("isBillingProgramAvailableAndroid", response) promise.resolve(response) @@ -581,12 +589,41 @@ class ExpoIapModule : Module() { } } - AsyncFunction("createBillingProgramReportingDetailsAndroid") { program: String, promise: Promise -> - ExpoIapLog.payload("createBillingProgramReportingDetailsAndroid", mapOf("program" to program)) + AsyncFunction("getBillingChoiceInfoAndroid") { params: Map, promise: Promise -> + ExpoIapLog.payload("getBillingChoiceInfoAndroid", params) + scope.launch { + try { + val request = + OpenIapGetBillingChoiceInfoParams( + billingProgram = mapBillingProgram(params["billingProgram"] as? String ?: "billing-choice"), + playBillingChoiceImageLayout = mapBillingChoiceImageLayout( + params["playBillingChoiceImageLayout"] as? String ?: "rectangular-four-by-one", + ), + userLocale = params["userLocale"] as? String, + ) + val result = openIapStore.getBillingChoiceInfo(request) + ExpoIapLog.result("getBillingChoiceInfoAndroid", mapOf("hasImageUrl" to result.playBillingChoiceImageUrl.isNotBlank())) + promise.resolve(result.toJson()) + } catch (e: Exception) { + ExpoIapLog.failure("getBillingChoiceInfoAndroid", e) + promise.reject(OpenIapError.ServiceUnavailable.CODE, e.message, e) + } + } + } + + AsyncFunction("createBillingProgramReportingDetailsAndroid") { program: String, developerBillingType: String?, promise: Promise -> + ExpoIapLog.payload( + "createBillingProgramReportingDetailsAndroid", + mapOf("program" to program, "developerBillingType" to developerBillingType), + ) scope.launch { try { val openIapProgram = mapBillingProgram(program) - val result = openIapStore.createBillingProgramReportingDetails(openIapProgram) + val result = + openIapStore.createBillingProgramReportingDetails( + openIapProgram, + mapDeveloperBillingType(developerBillingType), + ) val response = mapOf( "billingProgram" to program, @@ -604,6 +641,69 @@ class ExpoIapModule : Module() { } } + AsyncFunction("showBillingProgramInformationDialogAndroid") { params: Map, promise: Promise -> + ExpoIapLog.payload("showBillingProgramInformationDialogAndroid", params) + scope.launch { + try { + val activity = + runCatching { currentActivity } + .onFailure { + ExpoIapLog.failure("showBillingProgramInformationDialogAndroid activity", it) + }.getOrNull() ?: run { + promise.reject(OpenIapError.ServiceUnavailable.CODE, "Activity not available", null) + return@launch + } + val token = params["externalTransactionToken"] as? String + if (token.isNullOrBlank()) { + promise.reject(OpenIapError.DeveloperError.CODE, "`externalTransactionToken` is a required parameter.", null) + return@launch + } + val result = + openIapStore.showBillingProgramInformationDialog( + activity, + OpenIapBillingProgramInformationDialogParams( + billingProgram = mapBillingProgram(params["billingProgram"] as? String ?: "billing-choice"), + externalTransactionToken = token, + ), + ) + ExpoIapLog.result("showBillingProgramInformationDialogAndroid", result.toJson()) + promise.resolve(result.toJson()) + } catch (e: Exception) { + ExpoIapLog.failure("showBillingProgramInformationDialogAndroid", e) + promise.reject(OpenIapError.ServiceUnavailable.CODE, e.message, e) + } + } + } + + AsyncFunction("showInAppMessagesAndroid") { params: Map?, promise: Promise -> + ExpoIapLog.payload("showInAppMessagesAndroid", params ?: emptyMap()) + scope.launch { + try { + val activity = + runCatching { currentActivity } + .onFailure { + ExpoIapLog.failure("showInAppMessagesAndroid activity", it) + }.getOrNull() ?: run { + promise.reject(OpenIapError.ServiceUnavailable.CODE, "Activity not available", null) + return@launch + } + val categories = + (params?.get("categories") as? List<*>) + ?.mapNotNull { (it as? String)?.let(::mapInAppMessageCategory) } + val result = + openIapStore.showInAppMessages( + activity, + OpenIapInAppMessageParams(categories = categories), + ) + ExpoIapLog.result("showInAppMessagesAndroid", result.toJson()) + promise.resolve(result.toJson()) + } catch (e: Exception) { + ExpoIapLog.failure("showInAppMessagesAndroid", e) + promise.reject(OpenIapError.ServiceUnavailable.CODE, e.message, e) + } + } + } + AsyncFunction("launchExternalLinkAndroid") { params: Map, promise: Promise -> ExpoIapLog.payload("launchExternalLinkAndroid", params) scope.launch { @@ -666,9 +766,31 @@ class ExpoIapModule : Module() { "external-content-link" -> OpenIapBillingProgram.ExternalContentLink "external-payments" -> OpenIapBillingProgram.ExternalPayments "user-choice-billing" -> OpenIapBillingProgram.UserChoiceBilling + "billing-choice" -> OpenIapBillingProgram.BillingChoice else -> OpenIapBillingProgram.Unspecified } + private fun mapBillingChoiceImageLayout(layout: String): OpenIapBillingChoiceImageLayout = + when (layout) { + "rectangular-three-by-one" -> OpenIapBillingChoiceImageLayout.RectangularThreeByOne + "rectangular-two-by-two" -> OpenIapBillingChoiceImageLayout.RectangularTwoByTwo + else -> OpenIapBillingChoiceImageLayout.RectangularFourByOne + } + + private fun mapDeveloperBillingType(type: String?): OpenIapDeveloperBillingType? = + when (type) { + "in-app" -> OpenIapDeveloperBillingType.InApp + "external-link" -> OpenIapDeveloperBillingType.ExternalLink + else -> null + } + + private fun mapInAppMessageCategory(category: String): OpenIapInAppMessageCategory? = + when (category) { + "unknown-in-app-message-category-id" -> OpenIapInAppMessageCategory.UnknownInAppMessageCategoryId + "transactional" -> OpenIapInAppMessageCategory.Transactional + else -> null + } + private fun mapExternalLinkLaunchMode(mode: String): OpenIapExternalLinkLaunchMode = when (mode) { "launch-in-external-browser-or-app" -> OpenIapExternalLinkLaunchMode.LaunchInExternalBrowserOrApp diff --git a/libraries/expo-iap/src/__mocks__/expo-modules-core.js b/libraries/expo-iap/src/__mocks__/expo-modules-core.js index 18e7737f5..564c14aae 100644 --- a/libraries/expo-iap/src/__mocks__/expo-modules-core.js +++ b/libraries/expo-iap/src/__mocks__/expo-modules-core.js @@ -50,8 +50,11 @@ const mockNativeModule = { createAlternativeBillingTokenAndroid: jest.fn(), // Billing Programs API (8.2.0+) isBillingProgramAvailableAndroid: jest.fn(), + getBillingChoiceInfoAndroid: jest.fn(), launchExternalLinkAndroid: jest.fn(), createBillingProgramReportingDetailsAndroid: jest.fn(), + showBillingProgramInformationDialogAndroid: jest.fn(), + showInAppMessagesAndroid: jest.fn(), addListener: jest.fn(), removeListener: jest.fn(), removeListeners: jest.fn(), diff --git a/libraries/expo-iap/src/index.kepler.ts b/libraries/expo-iap/src/index.kepler.ts index 3b4834e4d..a3c4e2f2d 100644 --- a/libraries/expo-iap/src/index.kepler.ts +++ b/libraries/expo-iap/src/index.kepler.ts @@ -272,9 +272,18 @@ export const createAlternativeBillingTokenAndroid: MutationField< export const isBillingProgramAvailableAndroid: MutationField< 'isBillingProgramAvailableAndroid' > = async () => unsupported('isBillingProgramAvailableAndroid'); +export const getBillingChoiceInfoAndroid: QueryField< + 'getBillingChoiceInfoAndroid' +> = async () => unsupported('getBillingChoiceInfoAndroid'); export const launchExternalLinkAndroid: MutationField< 'launchExternalLinkAndroid' > = async () => unsupported('launchExternalLinkAndroid'); export const createBillingProgramReportingDetailsAndroid: MutationField< 'createBillingProgramReportingDetailsAndroid' > = async () => unsupported('createBillingProgramReportingDetailsAndroid'); +export const showBillingProgramInformationDialogAndroid: MutationField< + 'showBillingProgramInformationDialogAndroid' +> = async () => unsupported('showBillingProgramInformationDialogAndroid'); +export const showInAppMessagesAndroid: MutationField< + 'showInAppMessagesAndroid' +> = async () => unsupported('showInAppMessagesAndroid'); diff --git a/libraries/expo-iap/src/modules/__tests__/android.test.ts b/libraries/expo-iap/src/modules/__tests__/android.test.ts index 10b4df0a4..1719ed43f 100644 --- a/libraries/expo-iap/src/modules/__tests__/android.test.ts +++ b/libraries/expo-iap/src/modules/__tests__/android.test.ts @@ -21,8 +21,11 @@ import { acknowledgePurchaseAndroid, openRedeemOfferCodeAndroid, isBillingProgramAvailableAndroid, + getBillingChoiceInfoAndroid, launchExternalLinkAndroid, createBillingProgramReportingDetailsAndroid, + showBillingProgramInformationDialogAndroid, + showInAppMessagesAndroid, } from '../android'; /* eslint-enable import/first */ @@ -273,6 +276,26 @@ describe('Android Module Functions', () => { }); }); + describe('getBillingChoiceInfoAndroid', () => { + it('applies Billing Choice defaults', async () => { + const mockResult = { + playBillingChoiceImageUrl: 'https://play.google.com/image.png', + playBillingLoyaltyInfo: null, + }; + (ExpoIapModule.getBillingChoiceInfoAndroid as jest.Mock) + .mockResolvedValue(mockResult); + + const result = await getBillingChoiceInfoAndroid({}); + + expect(ExpoIapModule.getBillingChoiceInfoAndroid).toHaveBeenCalledWith({ + billingProgram: 'billing-choice', + playBillingChoiceImageLayout: 'rectangular-four-by-one', + userLocale: null, + }); + expect(result).toEqual(mockResult); + }); + }); + describe('launchExternalLinkAndroid', () => { it('delegates to native module with valid params', async () => { ( @@ -381,7 +404,7 @@ describe('Android Module Functions', () => { expect( ExpoIapModule.createBillingProgramReportingDetailsAndroid, - ).toHaveBeenCalledWith('external-offer'); + ).toHaveBeenCalledWith('external-offer', null); expect(result).toEqual(mockResult); expect(result.externalTransactionToken).toBe('token-abc-123-xyz'); }); @@ -401,10 +424,30 @@ describe('Android Module Functions', () => { expect( ExpoIapModule.createBillingProgramReportingDetailsAndroid, - ).toHaveBeenCalledWith('external-content-link'); + ).toHaveBeenCalledWith('external-content-link', null); expect(result.billingProgram).toBe('external-content-link'); }); + it('passes developerBillingType for Billing Choice', async () => { + const mockResult = { + billingProgram: 'billing-choice', + externalTransactionToken: 'choice-token', + }; + ( + ExpoIapModule.createBillingProgramReportingDetailsAndroid as jest.Mock + ).mockResolvedValue(mockResult); + + const result = await createBillingProgramReportingDetailsAndroid( + 'billing-choice', + 'external-link', + ); + + expect( + ExpoIapModule.createBillingProgramReportingDetailsAndroid, + ).toHaveBeenCalledWith('billing-choice', 'external-link'); + expect(result).toEqual(mockResult); + }); + it('propagates errors from native module', async () => { const error = new Error('Failed to create reporting details'); ( @@ -416,5 +459,43 @@ describe('Android Module Functions', () => { ).rejects.toThrow('Failed to create reporting details'); }); }); + + describe('showBillingProgramInformationDialogAndroid', () => { + it('applies Billing Choice default program', async () => { + const mockResult = {responseCode: 0, debugMessage: null}; + ( + ExpoIapModule.showBillingProgramInformationDialogAndroid as jest.Mock + ).mockResolvedValue(mockResult); + + const result = await showBillingProgramInformationDialogAndroid({ + externalTransactionToken: 'choice-token', + }); + + expect( + ExpoIapModule.showBillingProgramInformationDialogAndroid, + ).toHaveBeenCalledWith({ + billingProgram: 'billing-choice', + externalTransactionToken: 'choice-token', + }); + expect(result).toEqual(mockResult); + }); + }); + + describe('showInAppMessagesAndroid', () => { + it('delegates optional message categories', async () => { + const mockResult = {responseCode: 'no-action-needed'}; + (ExpoIapModule.showInAppMessagesAndroid as jest.Mock) + .mockResolvedValue(mockResult); + + const result = await showInAppMessagesAndroid({ + categories: ['transactional'], + }); + + expect(ExpoIapModule.showInAppMessagesAndroid).toHaveBeenCalledWith({ + categories: ['transactional'], + }); + expect(result).toEqual(mockResult); + }); + }); }); }); diff --git a/libraries/expo-iap/src/modules/android.ts b/libraries/expo-iap/src/modules/android.ts index d67f12f5d..4a24d49ec 100644 --- a/libraries/expo-iap/src/modules/android.ts +++ b/libraries/expo-iap/src/modules/android.ts @@ -6,8 +6,18 @@ import ExpoIapModule from '../ExpoIapModule'; // Types import type { + BillingChoiceInfoAndroid, + BillingProgramAndroid, + BillingProgramInformationDialogParamsAndroid, + BillingProgramReportingDetailsAndroid, + BillingResultAndroid, DeepLinkOptions, + DeveloperBillingTypeAndroid, + GetBillingChoiceInfoParamsAndroid, + InAppMessageParamsAndroid, + InAppMessageResultAndroid, MutationField, + QueryField, VerifyPurchaseResultAndroid, } from '../types'; @@ -317,6 +327,28 @@ export const isBillingProgramAvailableAndroid: MutationField< return ExpoIapModule.isBillingProgramAvailableAndroid(program); }; +/** + * Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. + * Available in Google Play Billing Library 9.1.0+. + * + * @param params - Billing Choice info request parameters + * @returns Promise resolving to Play Billing Choice display information + * + * @see {@link https://openiap.dev/docs/apis/android/get-billing-choice-info-android} + */ +export const getBillingChoiceInfoAndroid: QueryField< + 'getBillingChoiceInfoAndroid' +> = async ( + params: GetBillingChoiceInfoParamsAndroid, +): Promise => { + return ExpoIapModule.getBillingChoiceInfoAndroid({ + billingProgram: params.billingProgram ?? 'billing-choice', + playBillingChoiceImageLayout: + params.playBillingChoiceImageLayout ?? 'rectangular-four-by-one', + userLocale: params.userLocale ?? null, + }); +}; + /** * Launch an external link for the specified billing program (Android only). * Available in Google Play Billing Library 8.2.0+. @@ -361,8 +393,60 @@ export const launchExternalLinkAndroid: MutationField< * * @see {@link https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android} */ -export const createBillingProgramReportingDetailsAndroid: MutationField< - 'createBillingProgramReportingDetailsAndroid' -> = async (program) => { - return ExpoIapModule.createBillingProgramReportingDetailsAndroid(program); +export const createBillingProgramReportingDetailsAndroid = async ( + programOrArgs: + | BillingProgramAndroid + | { + program: BillingProgramAndroid; + developerBillingType?: DeveloperBillingTypeAndroid | null; + }, + developerBillingType?: DeveloperBillingTypeAndroid | null, +): Promise => { + const program = + typeof programOrArgs === 'string' ? programOrArgs : programOrArgs.program; + const resolvedDeveloperBillingType = + typeof programOrArgs === 'string' + ? developerBillingType + : (programOrArgs.developerBillingType ?? developerBillingType); + return ExpoIapModule.createBillingProgramReportingDetailsAndroid( + program, + resolvedDeveloperBillingType ?? null, + ); +}; + +/** + * Show Google's information dialog for a Billing Choice external transaction. + * Available in Google Play Billing Library 9.1.0+. + * + * @param params - Dialog parameters with the external transaction token + * @returns Promise resolving to BillingResult + * + * @see {@link https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android} + */ +export const showBillingProgramInformationDialogAndroid: MutationField< + 'showBillingProgramInformationDialogAndroid' +> = async ( + params: BillingProgramInformationDialogParamsAndroid, +): Promise => { + return ExpoIapModule.showBillingProgramInformationDialogAndroid({ + billingProgram: params.billingProgram ?? 'billing-choice', + externalTransactionToken: params.externalTransactionToken, + }); +}; + +/** + * Show Play Billing in-app messages, such as transactional subscription updates. + * Available in Google Play Billing Library 4.1.0+. + * + * @param params - Optional in-app message categories + * @returns Promise resolving to in-app message result + * + * @see {@link https://openiap.dev/docs/apis/android/show-in-app-messages-android} + */ +export const showInAppMessagesAndroid: MutationField< + 'showInAppMessagesAndroid' +> = async ( + params?: InAppMessageParamsAndroid | null, +): Promise => { + return ExpoIapModule.showInAppMessagesAndroid(params ?? null); }; diff --git a/libraries/expo-iap/src/types.ts b/libraries/expo-iap/src/types.ts index 6d2d9b825..6c2b36866 100644 --- a/libraries/expo-iap/src/types.ts +++ b/libraries/expo-iap/src/types.ts @@ -118,10 +118,34 @@ export interface AppTransaction { } /** - * Billing program types for external content links, external offers, and external payments (Android) - * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0 + * Play Billing choice image layout (Android) + * Available in Google Play Billing Library 9.1.0+ */ -export type BillingProgramAndroid = 'unspecified' | 'user-choice-billing' | 'external-content-link' | 'external-offer' | 'external-payments'; +export type BillingChoiceImageLayoutAndroid = 'rectangular-four-by-one' | 'rectangular-three-by-one' | 'rectangular-two-by-two'; + +/** + * Display information for developer-rendered Billing Choice screens (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +export interface BillingChoiceInfoAndroid { + /** URL for the Play Billing choice image matching the requested layout. */ + playBillingChoiceImageUrl: string; + /** Play Loyalty information for the user. */ + playBillingLoyaltyInfo?: (string | null); +} + +/** + * Choice screen renderer for Billing Choice availability (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +export type BillingChoiceScreenTypeAndroid = 'unspecified' | 'developer-rendered' | 'google-rendered'; + +/** + * Billing program types for Google Play Billing Programs (Android) + * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, + * BILLING_CHOICE added in 9.1.0. + */ +export type BillingProgramAndroid = 'unspecified' | 'user-choice-billing' | 'external-content-link' | 'external-offer' | 'external-payments' | 'billing-choice'; /** * Result of checking billing program availability (Android) @@ -130,8 +154,26 @@ export type BillingProgramAndroid = 'unspecified' | 'user-choice-billing' | 'ext export interface BillingProgramAvailabilityResultAndroid { /** The billing program that was checked */ billingProgram: BillingProgramAndroid; + /** Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. */ + choiceScreenType?: (BillingChoiceScreenTypeAndroid | null); /** Whether the billing program is available for the user */ isAvailable: boolean; + /** + * Whether external-link payment is available for Billing Choice. + * Populated only for available BILLING_CHOICE results. + */ + isExternalLinkAvailable?: (boolean | null); +} + +/** + * Parameters for showing a billing program information dialog (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +export interface BillingProgramInformationDialogParamsAndroid { + /** Billing program. Currently only BILLING_CHOICE is supported. */ + billingProgram?: BillingProgramAndroid; + /** External transaction token returned by the Billing Choice reporting-details flow. */ + externalTransactionToken: string; } /** @@ -193,6 +235,12 @@ export interface DeveloperBillingOptionParamsAndroid { linkUri: string; } +/** + * Developer-provided billing destination type for Billing Program reporting details (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +export type DeveloperBillingTypeAndroid = 'developer-billing-type-unspecified' | 'in-app' | 'external-link'; + /** * Details provided when user selects developer billing option (Android) * Received via DeveloperProvidedBillingListener callback @@ -507,6 +555,19 @@ export interface ExternalPurchaseNoticeResultIOS { export type FetchProductsResult = ProductOrSubscription[] | Product[] | ProductSubscription[] | null; +/** + * Parameters for fetching Billing Choice display information (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +export interface GetBillingChoiceInfoParamsAndroid { + /** Billing program. Currently only BILLING_CHOICE is supported. */ + billingProgram?: BillingProgramAndroid; + /** Desired Play Billing choice image layout. */ + playBillingChoiceImageLayout?: BillingChoiceImageLayoutAndroid; + /** BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. */ + userLocale?: (string | null); +} + export type IapEvent = 'purchase-updated' | 'purchase-error' | 'promoted-product-ios' | 'user-choice-billing-android' | 'developer-provided-billing-android' | 'subscription-billing-issue'; export type IapPlatform = 'ios' | 'android'; @@ -516,6 +577,38 @@ export type IapStore = 'unknown' | 'apple' | 'google' | 'horizon' | 'amazon'; /** Unified purchase states from IAPKit verification response. */ export type IapkitPurchaseState = 'entitled' | 'pending-acknowledgment' | 'pending' | 'canceled' | 'expired' | 'ready-to-consume' | 'consumed' | 'unknown' | 'inauthentic'; +/** + * High-level in-app message category (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +export type InAppMessageCategoryAndroid = 'unknown-in-app-message-category-id' | 'transactional'; + +/** + * Parameters for showing Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +export interface InAppMessageParamsAndroid { + /** In-app message categories to show. Defaults to transactional messages. */ + categories?: (InAppMessageCategoryAndroid[] | null); +} + +/** + * Response code from Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +export type InAppMessageResponseCodeAndroid = 'no-action-needed' | 'subscription-status-updated'; + +/** + * Result from showing Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +export interface InAppMessageResultAndroid { + /** Purchase token returned when a subscription status changed. */ + purchaseToken?: (string | null); + /** Response code for the in-app messaging flow. */ + responseCode: InAppMessageResponseCodeAndroid; +} + /** Connection initialization configuration */ export interface InitConnectionConfig { /** @@ -597,7 +690,6 @@ export interface Mutation { beginRefundRequestIOS?: Promise<(string | null)>; /** * Check whether alternative billing is available for the user. Step 1 of the alternative billing flow. - * * Returns true if available, false otherwise. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/check-alternative-billing-availability-android @@ -617,7 +709,6 @@ export interface Mutation { * Create a reporting token for an alternative billing flow. Step 3 of the alternative billing flow. * Must be called AFTER successful payment in your payment system. * Token must be reported to Google Play backend within 24 hours. - * * Returns token string, or null if creation failed. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-alternative-billing-token-android @@ -626,7 +717,6 @@ export interface Mutation { /** * Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). * Replaces the deprecated createExternalOfferReportingDetailsAsync API. - * * Returns external transaction token needed for reporting external transactions. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android @@ -655,7 +745,6 @@ export interface Mutation { /** * Check whether a billing program (e.g., External Payments) is available for the current user. * Replaces the deprecated isExternalOfferAvailableAsync API. - * * Available in Google Play Billing Library 8.2.0+. * Returns availability result with isAvailable flag. * Throws OpenIapError.NotPrepared if billing client not ready. @@ -665,7 +754,6 @@ export interface Mutation { /** * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). * Replaces the deprecated showExternalOfferInformationDialog API. - * * Shows Play Store dialog and optionally launches external URL. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/launch-external-link-android @@ -711,12 +799,18 @@ export interface Mutation { /** * Display Google's alternative billing information dialog. Step 2 of the alternative billing flow. * Must be called BEFORE processing payment in your payment system. - * * Returns true if user accepted, false if user canceled. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android */ showAlternativeBillingDialogAndroid: Promise; + /** + * Show Google's information dialog for a Billing Choice external transaction. + * Available in Google Play Billing Library 9.1.0+. + * Throws OpenIapError.NotPrepared if billing client not ready. + * See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android + */ + showBillingProgramInformationDialogAndroid: Promise; /** * Present the disclosure sheet required before linking out via ExternalPurchaseCustomLink (iOS 18.1+). * Call this after a deliberate customer interaction before linking out to external purchases. @@ -724,6 +818,14 @@ export interface Mutation { * See: https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios */ showExternalPurchaseCustomLinkNoticeIOS: Promise; + /** + * Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. + * Available in Google Play Billing Library 4.1.0+. + * Returns a response code and, when the subscription status changes, the related purchase token. + * Throws OpenIapError.NotPrepared if billing client not ready. + * See: https://openiap.dev/docs/apis/android/show-in-app-messages-android + */ + showInAppMessagesAndroid: Promise; /** * Present the manage-subscriptions sheet and return changed purchases (iOS 15+). * See: https://openiap.dev/docs/apis/ios/show-manage-subscriptions-ios @@ -766,7 +868,11 @@ export type MutationBeginRefundRequestIosArgs = string; export type MutationConsumePurchaseAndroidArgs = string; -export type MutationCreateBillingProgramReportingDetailsAndroidArgs = BillingProgramAndroid; +export interface MutationCreateBillingProgramReportingDetailsAndroidArgs { + developerBillingType?: (DeveloperBillingTypeAndroid | null); + program: BillingProgramAndroid; +} + export type MutationDeepLinkToSubscriptionsArgs = (DeepLinkOptions | null) | undefined; @@ -801,8 +907,12 @@ export type MutationRequestPurchaseArgs = }; +export type MutationShowBillingProgramInformationDialogAndroidArgs = BillingProgramInformationDialogParamsAndroid; + export type MutationShowExternalPurchaseCustomLinkNoticeIosArgs = ExternalPurchaseCustomLinkNoticeTypeIOS; +export type MutationShowInAppMessagesAndroidArgs = (InAppMessageParamsAndroid | null) | undefined; + export type MutationValidateReceiptArgs = VerifyPurchaseProps; export type MutationVerifyPurchaseArgs = VerifyPurchaseProps; @@ -1359,6 +1469,13 @@ export interface Query { * See: https://openiap.dev/docs/apis/get-available-purchases */ getAvailablePurchases: Promise; + /** + * Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. + * Available in Google Play Billing Library 9.1.0+. + * Throws OpenIapError.NotPrepared if billing client is not ready. + * See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android + */ + getBillingChoiceInfoAndroid: Promise; /** * Fetch a token for Apple's External Purchase Server reporting API (iOS 18.1+). * Use this token to report transactions made through ExternalPurchaseCustomLink. @@ -1447,6 +1564,8 @@ export type QueryGetActiveSubscriptionsArgs = (string[] | null) | undefined; export type QueryGetAvailablePurchasesArgs = (PurchaseOptions | null) | undefined; +export type QueryGetBillingChoiceInfoAndroidArgs = GetBillingChoiceInfoParamsAndroid; + export type QueryGetExternalPurchaseCustomLinkTokenIosArgs = ExternalPurchaseCustomLinkTokenTypeIOS; export type QueryGetTransactionJwsIosArgs = string; @@ -2235,6 +2354,7 @@ export type QueryArgsMap = { getAllTransactionsIOS: never; getAppTransactionIOS: never; getAvailablePurchases: QueryGetAvailablePurchasesArgs; + getBillingChoiceInfoAndroid: QueryGetBillingChoiceInfoAndroidArgs; getExternalPurchaseCustomLinkTokenIOS: QueryGetExternalPurchaseCustomLinkTokenIosArgs; getPendingTransactionsIOS: never; getPromotedProductIOS: never; @@ -2285,7 +2405,9 @@ export type MutationArgsMap = { requestPurchaseOnPromotedProductIOS: never; restorePurchases: never; showAlternativeBillingDialogAndroid: never; + showBillingProgramInformationDialogAndroid: MutationShowBillingProgramInformationDialogAndroidArgs; showExternalPurchaseCustomLinkNoticeIOS: MutationShowExternalPurchaseCustomLinkNoticeIosArgs; + showInAppMessagesAndroid: MutationShowInAppMessagesAndroidArgs; showManageSubscriptionsIOS: never; syncIOS: never; validateReceipt: MutationValidateReceiptArgs; diff --git a/libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt b/libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt index 7d916b9a2..bd9015fa6 100644 --- a/libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt +++ b/libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt @@ -8,16 +8,22 @@ import android.os.Bundle import android.os.Handler import android.os.Looper import dev.hyo.openiap.AndroidSubscriptionOfferInput +import dev.hyo.openiap.BillingChoiceImageLayoutAndroid +import dev.hyo.openiap.BillingProgramInformationDialogParamsAndroid import dev.hyo.openiap.BillingProgramAndroid import dev.hyo.openiap.DeepLinkOptions import dev.hyo.openiap.DeveloperBillingLaunchModeAndroid import dev.hyo.openiap.DeveloperBillingOptionParamsAndroid +import dev.hyo.openiap.DeveloperBillingTypeAndroid import dev.hyo.openiap.ExternalLinkLaunchModeAndroid import dev.hyo.openiap.ExternalLinkTypeAndroid import dev.hyo.openiap.FetchProductsResult import dev.hyo.openiap.FetchProductsResultAll import dev.hyo.openiap.FetchProductsResultProducts import dev.hyo.openiap.FetchProductsResultSubscriptions +import dev.hyo.openiap.GetBillingChoiceInfoParamsAndroid +import dev.hyo.openiap.InAppMessageCategoryAndroid +import dev.hyo.openiap.InAppMessageParamsAndroid import dev.hyo.openiap.InitConnectionConfig import dev.hyo.openiap.LaunchExternalLinkParamsAndroid import dev.hyo.openiap.OpenIapError @@ -783,7 +789,36 @@ class AndroidInappPurchasePlugin internal constructor() : MethodCallHandler, Act val result = iap.isBillingProgramAvailable(program) val response = JSONObject().apply { put("billingProgram", result.billingProgram.toJson()) + put("choiceScreenType", result.choiceScreenType?.toJson()) put("isAvailable", result.isAvailable) + put("isExternalLinkAvailable", result.isExternalLinkAvailable) + } + safe.success(response.toString()) + } catch (e: Exception) { + safe.error(OpenIapError.BillingError.CODE, OpenIapError.BillingError.MESSAGE, e.message) + } + } + } + "getBillingChoiceInfoAndroid" -> { + val programStr = call.argument("billingProgram") + val imageLayoutStr = call.argument("playBillingChoiceImageLayout") + val userLocale = call.argument("userLocale") + scope.launch { + try { + val iap = openIap + if (iap == null) { + safe.error(OpenIapError.NotPrepared.CODE, OpenIapError.NotPrepared.MESSAGE, "IAP module not initialized.") + return@launch + } + val params = GetBillingChoiceInfoParamsAndroid( + billingProgram = BillingProgramAndroid.fromJson(programStr ?: "billing-choice"), + playBillingChoiceImageLayout = BillingChoiceImageLayoutAndroid.fromJson(imageLayoutStr ?: "rectangular-four-by-one"), + userLocale = userLocale + ) + val result = iap.getBillingChoiceInfo(params) + val response = JSONObject().apply { + put("playBillingChoiceImageUrl", result.playBillingChoiceImageUrl) + put("playBillingLoyaltyInfo", result.playBillingLoyaltyInfo) } safe.success(response.toString()) } catch (e: Exception) { @@ -793,6 +828,7 @@ class AndroidInappPurchasePlugin internal constructor() : MethodCallHandler, Act } "createBillingProgramReportingDetailsAndroid" -> { val programStr = call.argument("program") + val developerBillingTypeStr = call.argument("developerBillingType") scope.launch { try { val iap = openIap @@ -801,7 +837,10 @@ class AndroidInappPurchasePlugin internal constructor() : MethodCallHandler, Act return@launch } val program = BillingProgramAndroid.fromJson(programStr ?: "unspecified") - val result = iap.createBillingProgramReportingDetails(program) + val developerBillingType = developerBillingTypeStr?.let { + DeveloperBillingTypeAndroid.fromJson(it) + } + val result = iap.createBillingProgramReportingDetails(program, developerBillingType) val response = JSONObject().apply { put("billingProgram", result.billingProgram.toJson()) put("externalTransactionToken", result.externalTransactionToken) @@ -812,6 +851,71 @@ class AndroidInappPurchasePlugin internal constructor() : MethodCallHandler, Act } } } + "showBillingProgramInformationDialogAndroid" -> { + val programStr = call.argument("billingProgram") + val token = call.argument("externalTransactionToken") + scope.launch { + try { + val iap = openIap + if (iap == null) { + safe.error(OpenIapError.NotPrepared.CODE, OpenIapError.NotPrepared.MESSAGE, "IAP module not initialized.") + return@launch + } + val act = activity + if (act == null) { + safe.error(OpenIapError.BillingError.CODE, OpenIapError.BillingError.MESSAGE, "Activity not available") + return@launch + } + if (token.isNullOrBlank()) { + safe.error(OpenIapError.DeveloperError.CODE, "externalTransactionToken is required for showBillingProgramInformationDialogAndroid", null) + return@launch + } + val result = iap.showBillingProgramInformationDialog( + act, + BillingProgramInformationDialogParamsAndroid( + billingProgram = BillingProgramAndroid.fromJson(programStr ?: "billing-choice"), + externalTransactionToken = token + ) + ) + val response = JSONObject().apply { + put("responseCode", result.responseCode) + put("debugMessage", result.debugMessage) + put("subResponseCode", result.subResponseCode?.toJson()) + } + safe.success(response.toString()) + } catch (e: Exception) { + safe.error(OpenIapError.BillingError.CODE, OpenIapError.BillingError.MESSAGE, e.message) + } + } + } + "showInAppMessagesAndroid" -> { + val categories = call.argument?>("categories") + scope.launch { + try { + val iap = openIap + if (iap == null) { + safe.error(OpenIapError.NotPrepared.CODE, OpenIapError.NotPrepared.MESSAGE, "IAP module not initialized.") + return@launch + } + val act = activity + if (act == null) { + safe.error(OpenIapError.BillingError.CODE, OpenIapError.BillingError.MESSAGE, "Activity not available") + return@launch + } + val params = InAppMessageParamsAndroid( + categories = categories?.map { InAppMessageCategoryAndroid.fromJson(it) } + ) + val result = iap.showInAppMessages(act, params) + val response = JSONObject().apply { + put("responseCode", result.responseCode.toJson()) + put("purchaseToken", result.purchaseToken) + } + safe.success(response.toString()) + } catch (e: Exception) { + safe.error(OpenIapError.BillingError.CODE, OpenIapError.BillingError.MESSAGE, e.message) + } + } + } "launchExternalLinkAndroid" -> { val programStr = call.argument("billingProgram") val launchModeStr = call.argument("launchMode") diff --git a/libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart b/libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart index 4fdec26e4..c8dac504c 100644 --- a/libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart +++ b/libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart @@ -2545,8 +2545,9 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android Future createBillingProgramReportingDetailsAndroid( - gentype.BillingProgramAndroid program, - ) async { + gentype.BillingProgramAndroid program, { + gentype.DeveloperBillingTypeAndroid? developerBillingType, + }) async { if (!_platform.isAndroid) { throw PurchaseError( code: gentype.ErrorCode.IapNotAvailable, @@ -2557,7 +2558,10 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { try { final result = await _channel.invokeMethod( 'createBillingProgramReportingDetailsAndroid', - {'program': program.toJson()}, + { + 'program': program.toJson(), + 'developerBillingType': developerBillingType?.toJson(), + }, ); if (result != null) { final json = jsonDecode(result) as Map; @@ -2573,6 +2577,100 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { } } + /// Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens (Play Billing 9.1.0+). + /// + /// See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android + Future getBillingChoiceInfoAndroid( + gentype.GetBillingChoiceInfoParamsAndroid params, + ) async { + if (!_platform.isAndroid) { + throw PurchaseError( + code: gentype.ErrorCode.IapNotAvailable, + message: 'getBillingChoiceInfoAndroid only available on Android', + ); + } + try { + final result = await _channel.invokeMethod( + 'getBillingChoiceInfoAndroid', + params.toJson(), + ); + if (result != null) { + final json = jsonDecode(result) as Map; + return gentype.BillingChoiceInfoAndroid.fromJson(json); + } + throw PurchaseError( + code: gentype.ErrorCode.Unknown, + message: 'Failed to get Billing Choice info', + ); + } catch (error) { + debugPrint('getBillingChoiceInfoAndroid error: $error'); + rethrow; + } + } + + /// Show Google's information dialog for a Billing Choice external transaction (Play Billing 9.1.0+). + /// + /// See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android + Future + showBillingProgramInformationDialogAndroid( + gentype.BillingProgramInformationDialogParamsAndroid params, + ) async { + if (!_platform.isAndroid) { + throw PurchaseError( + code: gentype.ErrorCode.IapNotAvailable, + message: + 'showBillingProgramInformationDialogAndroid only available on Android', + ); + } + try { + final result = await _channel.invokeMethod( + 'showBillingProgramInformationDialogAndroid', + params.toJson(), + ); + if (result != null) { + final json = jsonDecode(result) as Map; + return gentype.BillingResultAndroid.fromJson(json); + } + throw PurchaseError( + code: gentype.ErrorCode.Unknown, + message: 'Failed to show Billing Choice information dialog', + ); + } catch (error) { + debugPrint('showBillingProgramInformationDialogAndroid error: $error'); + rethrow; + } + } + + /// Show Play Billing in-app messages such as transactional subscription updates. + /// + /// See: https://openiap.dev/docs/apis/android/show-in-app-messages-android + Future showInAppMessagesAndroid([ + gentype.InAppMessageParamsAndroid? params, + ]) async { + if (!_platform.isAndroid) { + throw PurchaseError( + code: gentype.ErrorCode.IapNotAvailable, + message: 'showInAppMessagesAndroid only available on Android', + ); + } + try { + final result = await _channel.invokeMethod( + 'showInAppMessagesAndroid', + params?.toJson(), + ); + if (result != null) { + final json = jsonDecode(result) as Map; + return gentype.InAppMessageResultAndroid.fromJson(json); + } + return const gentype.InAppMessageResultAndroid( + responseCode: gentype.InAppMessageResponseCodeAndroid.NoActionNeeded, + ); + } catch (error) { + debugPrint('showInAppMessagesAndroid error: $error'); + rethrow; + } + } + /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). /// /// See: https://openiap.dev/docs/apis/android/launch-external-link-android @@ -2818,6 +2916,7 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { getStorefront: getStorefront, getStorefrontIOS: getStorefrontIOS, getTransactionJwsIOS: getTransactionJwsIOS, + getBillingChoiceInfoAndroid: _getBillingChoiceInfoAndroidHandler, hasActiveSubscriptions: hasActiveSubscriptions, isEligibleForExternalPurchaseCustomLinkIOS: isEligibleForExternalPurchaseCustomLinkIOS, @@ -2844,13 +2943,58 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { ), ); + gentype.QueryGetBillingChoiceInfoAndroidHandler + get _getBillingChoiceInfoAndroidHandler => ({ + required gentype.BillingProgramAndroid billingProgram, + required gentype.BillingChoiceImageLayoutAndroid + playBillingChoiceImageLayout, + String? userLocale, + }) => + getBillingChoiceInfoAndroid( + gentype.GetBillingChoiceInfoParamsAndroid( + billingProgram: billingProgram, + playBillingChoiceImageLayout: playBillingChoiceImageLayout, + userLocale: userLocale, + ), + ); + + gentype.MutationCreateBillingProgramReportingDetailsAndroidHandler + get _createBillingProgramReportingDetailsAndroidHandler => ({ + required gentype.BillingProgramAndroid program, + gentype.DeveloperBillingTypeAndroid? developerBillingType, + }) => + createBillingProgramReportingDetailsAndroid( + program, + developerBillingType: developerBillingType, + ); + + gentype.MutationShowBillingProgramInformationDialogAndroidHandler + get _showBillingProgramInformationDialogAndroidHandler => ({ + required gentype.BillingProgramAndroid billingProgram, + required String externalTransactionToken, + }) => + showBillingProgramInformationDialogAndroid( + gentype.BillingProgramInformationDialogParamsAndroid( + billingProgram: billingProgram, + externalTransactionToken: externalTransactionToken, + ), + ); + + gentype.MutationShowInAppMessagesAndroidHandler + get _showInAppMessagesAndroidHandler => ({ + List? categories, + }) => + showInAppMessagesAndroid( + gentype.InAppMessageParamsAndroid(categories: categories), + ); + // ignore: deprecated_member_use_from_same_package gentype.MutationHandlers get mutationHandlers => gentype.MutationHandlers( acknowledgePurchaseAndroid: acknowledgePurchaseAndroid, beginRefundRequestIOS: beginRefundRequestIOS, consumePurchaseAndroid: consumePurchaseAndroid, createBillingProgramReportingDetailsAndroid: - createBillingProgramReportingDetailsAndroid, + _createBillingProgramReportingDetailsAndroidHandler, deepLinkToSubscriptions: deepLinkToSubscriptions, endConnection: endConnection, finishTransaction: finishTransaction, @@ -2863,6 +3007,9 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { // ignore: deprecated_member_use_from_same_package requestPurchaseOnPromotedProductIOS, restorePurchases: restorePurchases, + showBillingProgramInformationDialogAndroid: + _showBillingProgramInformationDialogAndroidHandler, + showInAppMessagesAndroid: _showInAppMessagesAndroidHandler, showManageSubscriptionsIOS: showManageSubscriptionsIOS, syncIOS: syncIOS, validateReceipt: validateReceipt, diff --git a/libraries/flutter_inapp_purchase/lib/types.dart b/libraries/flutter_inapp_purchase/lib/types.dart index 1b9bf3fb5..5d7a2dbc8 100644 --- a/libraries/flutter_inapp_purchase/lib/types.dart +++ b/libraries/flutter_inapp_purchase/lib/types.dart @@ -44,8 +44,67 @@ enum AlternativeBillingModeAndroid { String toJson() => value; } -/// Billing program types for external content links, external offers, and external payments (Android) -/// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0 +/// Play Billing choice image layout (Android) +/// Available in Google Play Billing Library 9.1.0+ +enum BillingChoiceImageLayoutAndroid { + /// Rectangular image with a 4:1 aspect ratio. + RectangularFourByOne('rectangular-four-by-one'), + /// Rectangular image with a 3:1 aspect ratio. + RectangularThreeByOne('rectangular-three-by-one'), + /// Rectangular image with a 2:2 aspect ratio. + RectangularTwoByTwo('rectangular-two-by-two'); + + const BillingChoiceImageLayoutAndroid(this.value); + final String value; + + factory BillingChoiceImageLayoutAndroid.fromJson(String value) { + final normalized = value.toLowerCase().replaceAll('_', '-'); + switch (normalized) { + case 'rectangular-four-by-one': + return BillingChoiceImageLayoutAndroid.RectangularFourByOne; + case 'rectangular-three-by-one': + return BillingChoiceImageLayoutAndroid.RectangularThreeByOne; + case 'rectangular-two-by-two': + return BillingChoiceImageLayoutAndroid.RectangularTwoByTwo; + } + throw ArgumentError('Unknown BillingChoiceImageLayoutAndroid value: $value'); + } + + String toJson() => value; +} + +/// Choice screen renderer for Billing Choice availability (Android) +/// Available in Google Play Billing Library 9.1.0+ +enum BillingChoiceScreenTypeAndroid { + /// Unspecified choice screen type. + Unspecified('unspecified'), + /// Choice screen is rendered by the developer app. + DeveloperRendered('developer-rendered'), + /// Choice screen is rendered by Google Play. + GoogleRendered('google-rendered'); + + const BillingChoiceScreenTypeAndroid(this.value); + final String value; + + factory BillingChoiceScreenTypeAndroid.fromJson(String value) { + final normalized = value.toLowerCase().replaceAll('_', '-'); + switch (normalized) { + case 'unspecified': + return BillingChoiceScreenTypeAndroid.Unspecified; + case 'developer-rendered': + return BillingChoiceScreenTypeAndroid.DeveloperRendered; + case 'google-rendered': + return BillingChoiceScreenTypeAndroid.GoogleRendered; + } + throw ArgumentError('Unknown BillingChoiceScreenTypeAndroid value: $value'); + } + + String toJson() => value; +} + +/// Billing program types for Google Play Billing Programs (Android) +/// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, +/// BILLING_CHOICE added in 9.1.0. enum BillingProgramAndroid { /// Unspecified billing program. Do not use. Unspecified('unspecified'), @@ -65,7 +124,11 @@ enum BillingProgramAndroid { /// Allows presenting a side-by-side choice between Google Play Billing and developer's external payment option. /// Users can choose to complete the purchase on the developer's website. /// Available in Google Play Billing Library 8.3.0+ - ExternalPayments('external-payments'); + ExternalPayments('external-payments'), + /// Billing Choice program. + /// Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. + /// Available in Google Play Billing Library 9.1.0+ + BillingChoice('billing-choice'); const BillingProgramAndroid(this.value); final String value; @@ -83,6 +146,8 @@ enum BillingProgramAndroid { return BillingProgramAndroid.ExternalOffer; case 'external-payments': return BillingProgramAndroid.ExternalPayments; + case 'billing-choice': + return BillingProgramAndroid.BillingChoice; } throw ArgumentError('Unknown BillingProgramAndroid value: $value'); } @@ -122,6 +187,35 @@ enum DeveloperBillingLaunchModeAndroid { String toJson() => value; } +/// Developer-provided billing destination type for Billing Program reporting details (Android) +/// Available in Google Play Billing Library 9.1.0+ +enum DeveloperBillingTypeAndroid { + /// Unspecified developer billing type. Do not use. + DeveloperBillingTypeUnspecified('developer-billing-type-unspecified'), + /// Developer-provided billing via native in-app experience. + InApp('in-app'), + /// Developer-provided billing via external link or embedded web browsing. + ExternalLink('external-link'); + + const DeveloperBillingTypeAndroid(this.value); + final String value; + + factory DeveloperBillingTypeAndroid.fromJson(String value) { + final normalized = value.toLowerCase().replaceAll('_', '-'); + switch (normalized) { + case 'developer-billing-type-unspecified': + return DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified; + case 'in-app': + return DeveloperBillingTypeAndroid.InApp; + case 'external-link': + return DeveloperBillingTypeAndroid.ExternalLink; + } + throw ArgumentError('Unknown DeveloperBillingTypeAndroid value: $value'); + } + + String toJson() => value; +} + /// Discount offer type enumeration. /// Categorizes the type of discount or promotional offer. enum DiscountOfferType { @@ -560,6 +654,56 @@ enum IapStore { String toJson() => value; } +/// High-level in-app message category (Android) +/// Available in Google Play Billing Library 4.1.0+ +enum InAppMessageCategoryAndroid { + /// Unknown in-app message category. + UnknownInAppMessageCategoryId('unknown-in-app-message-category-id'), + /// Transactional billing messages, such as payment issues or pending price-change confirmations. + Transactional('transactional'); + + const InAppMessageCategoryAndroid(this.value); + final String value; + + factory InAppMessageCategoryAndroid.fromJson(String value) { + final normalized = value.toLowerCase().replaceAll('_', '-'); + switch (normalized) { + case 'unknown-in-app-message-category-id': + return InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId; + case 'transactional': + return InAppMessageCategoryAndroid.Transactional; + } + throw ArgumentError('Unknown InAppMessageCategoryAndroid value: $value'); + } + + String toJson() => value; +} + +/// Response code from Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +enum InAppMessageResponseCodeAndroid { + /// Flow finished and no developer action is needed. + NoActionNeeded('no-action-needed'), + /// Subscription status changed and the purchase token should be checked. + SubscriptionStatusUpdated('subscription-status-updated'); + + const InAppMessageResponseCodeAndroid(this.value); + final String value; + + factory InAppMessageResponseCodeAndroid.fromJson(String value) { + final normalized = value.toLowerCase().replaceAll('_', '-'); + switch (normalized) { + case 'no-action-needed': + return InAppMessageResponseCodeAndroid.NoActionNeeded; + case 'subscription-status-updated': + return InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated; + } + throw ArgumentError('Unknown InAppMessageResponseCodeAndroid value: $value'); + } + + String toJson() => value; +} + /// Payment mode for subscription offers. /// Determines how the user pays during the offer period. enum PaymentMode { @@ -1527,23 +1671,61 @@ class AppTransaction { } } +/// Display information for developer-rendered Billing Choice screens (Android) +/// Available in Google Play Billing Library 9.1.0+ +class BillingChoiceInfoAndroid { + const BillingChoiceInfoAndroid({ + required this.playBillingChoiceImageUrl, + this.playBillingLoyaltyInfo, + }); + + /// URL for the Play Billing choice image matching the requested layout. + final String playBillingChoiceImageUrl; + /// Play Loyalty information for the user. + final String? playBillingLoyaltyInfo; + + factory BillingChoiceInfoAndroid.fromJson(Map json) { + return BillingChoiceInfoAndroid( + playBillingChoiceImageUrl: json['playBillingChoiceImageUrl'] as String, + playBillingLoyaltyInfo: json['playBillingLoyaltyInfo'] as String?, + ); + } + + Map toJson() { + return { + '__typename': 'BillingChoiceInfoAndroid', + 'playBillingChoiceImageUrl': playBillingChoiceImageUrl, + 'playBillingLoyaltyInfo': playBillingLoyaltyInfo, + }; + } +} + /// Result of checking billing program availability (Android) /// Available in Google Play Billing Library 8.2.0+ class BillingProgramAvailabilityResultAndroid { const BillingProgramAvailabilityResultAndroid({ required this.billingProgram, + this.choiceScreenType, required this.isAvailable, + this.isExternalLinkAvailable, }); /// The billing program that was checked final BillingProgramAndroid billingProgram; + /// Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + final BillingChoiceScreenTypeAndroid? choiceScreenType; /// Whether the billing program is available for the user final bool isAvailable; + /// Whether external-link payment is available for Billing Choice. + /// Populated only for available BILLING_CHOICE results. + final bool? isExternalLinkAvailable; factory BillingProgramAvailabilityResultAndroid.fromJson(Map json) { return BillingProgramAvailabilityResultAndroid( billingProgram: BillingProgramAndroid.fromJson(json['billingProgram'] as String), + choiceScreenType: json['choiceScreenType'] != null ? BillingChoiceScreenTypeAndroid.fromJson(json['choiceScreenType'] as String) : null, isAvailable: json['isAvailable'] as bool, + isExternalLinkAvailable: json['isExternalLinkAvailable'] as bool?, ); } @@ -1551,7 +1733,9 @@ class BillingProgramAvailabilityResultAndroid { return { '__typename': 'BillingProgramAvailabilityResultAndroid', 'billingProgram': billingProgram.toJson(), + 'choiceScreenType': choiceScreenType?.toJson(), 'isAvailable': isAvailable, + 'isExternalLinkAvailable': isExternalLinkAvailable, }; } } @@ -2141,6 +2325,35 @@ class FetchProductsResultSubscriptions extends FetchProductsResult { final List? value; } +/// Result from showing Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +class InAppMessageResultAndroid { + const InAppMessageResultAndroid({ + this.purchaseToken, + required this.responseCode, + }); + + /// Purchase token returned when a subscription status changed. + final String? purchaseToken; + /// Response code for the in-app messaging flow. + final InAppMessageResponseCodeAndroid responseCode; + + factory InAppMessageResultAndroid.fromJson(Map json) { + return InAppMessageResultAndroid( + purchaseToken: json['purchaseToken'] as String?, + responseCode: InAppMessageResponseCodeAndroid.fromJson(json['responseCode'] as String), + ); + } + + Map toJson() { + return { + '__typename': 'InAppMessageResultAndroid', + 'purchaseToken': purchaseToken, + 'responseCode': responseCode.toJson(), + }; + } +} + /// Installment plan details for subscription offers (Android) /// Contains information about the installment plan commitment. /// Available in Google Play Billing Library 7.0+ @@ -4292,6 +4505,34 @@ class AndroidSubscriptionOfferInput { } } +/// Parameters for showing a billing program information dialog (Android) +/// Available in Google Play Billing Library 9.1.0+ +class BillingProgramInformationDialogParamsAndroid { + const BillingProgramInformationDialogParamsAndroid({ + required this.billingProgram, + required this.externalTransactionToken, + }); + + /// Billing program. Currently only BILLING_CHOICE is supported. + final BillingProgramAndroid billingProgram; + /// External transaction token returned by the Billing Choice reporting-details flow. + final String externalTransactionToken; + + factory BillingProgramInformationDialogParamsAndroid.fromJson(Map json) { + return BillingProgramInformationDialogParamsAndroid( + billingProgram: BillingProgramAndroid.fromJson(json['billingProgram'] as String), + externalTransactionToken: json['externalTransactionToken'] as String, + ); + } + + Map toJson() { + return { + 'billingProgram': billingProgram.toJson(), + 'externalTransactionToken': externalTransactionToken, + }; + } +} + class DeepLinkOptions { const DeepLinkOptions({ this.packageNameAndroid, @@ -4393,6 +4634,62 @@ class DiscountOfferInputIOS { } } +/// Parameters for fetching Billing Choice display information (Android) +/// Available in Google Play Billing Library 9.1.0+ +class GetBillingChoiceInfoParamsAndroid { + const GetBillingChoiceInfoParamsAndroid({ + required this.billingProgram, + required this.playBillingChoiceImageLayout, + this.userLocale, + }); + + /// Billing program. Currently only BILLING_CHOICE is supported. + final BillingProgramAndroid billingProgram; + /// Desired Play Billing choice image layout. + final BillingChoiceImageLayoutAndroid playBillingChoiceImageLayout; + /// BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. + final String? userLocale; + + factory GetBillingChoiceInfoParamsAndroid.fromJson(Map json) { + return GetBillingChoiceInfoParamsAndroid( + billingProgram: BillingProgramAndroid.fromJson(json['billingProgram'] as String), + playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid.fromJson(json['playBillingChoiceImageLayout'] as String), + userLocale: json['userLocale'] as String?, + ); + } + + Map toJson() { + return { + 'billingProgram': billingProgram.toJson(), + 'playBillingChoiceImageLayout': playBillingChoiceImageLayout.toJson(), + 'userLocale': userLocale, + }; + } +} + +/// Parameters for showing Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +class InAppMessageParamsAndroid { + const InAppMessageParamsAndroid({ + this.categories, + }); + + /// In-app message categories to show. Defaults to transactional messages. + final List? categories; + + factory InAppMessageParamsAndroid.fromJson(Map json) { + return InAppMessageParamsAndroid( + categories: (json['categories'] as List?) == null ? null : (json['categories'] as List?)!.map((e) => InAppMessageCategoryAndroid.fromJson(e as String)).toList(), + ); + } + + Map toJson() { + return { + 'categories': categories == null ? null : categories!.map((e) => e.toJson()).toList(), + }; + } +} + /// Connection initialization configuration class InitConnectionConfig { const InitConnectionConfig({ @@ -5496,7 +5793,6 @@ abstract class MutationResolver { /// See: https://openiap.dev/docs/apis/ios/begin-refund-request-ios Future beginRefundRequestIOS(String sku); /// Check whether alternative billing is available for the user. Step 1 of the alternative billing flow. - /// /// Returns true if available, false otherwise. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/check-alternative-billing-availability-android @@ -5510,18 +5806,19 @@ abstract class MutationResolver { /// Create a reporting token for an alternative billing flow. Step 3 of the alternative billing flow. /// Must be called AFTER successful payment in your payment system. /// Token must be reported to Google Play backend within 24 hours. - /// /// Returns token string, or null if creation failed. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-alternative-billing-token-android Future createAlternativeBillingTokenAndroid(); /// Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). /// Replaces the deprecated createExternalOfferReportingDetailsAsync API. - /// /// Returns external transaction token needed for reporting external transactions. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android - Future createBillingProgramReportingDetailsAndroid(BillingProgramAndroid program); + Future createBillingProgramReportingDetailsAndroid({ + required BillingProgramAndroid program, + DeveloperBillingTypeAndroid? developerBillingType, + }); /// Open the platform's subscription management UI. /// See: https://openiap.dev/docs/apis/deep-link-to-subscriptions Future deepLinkToSubscriptions({ @@ -5545,7 +5842,6 @@ abstract class MutationResolver { }); /// Check whether a billing program (e.g., External Payments) is available for the current user. /// Replaces the deprecated isExternalOfferAvailableAsync API. - /// /// Available in Google Play Billing Library 8.2.0+. /// Returns availability result with isAvailable flag. /// Throws OpenIapError.NotPrepared if billing client not ready. @@ -5553,7 +5849,6 @@ abstract class MutationResolver { Future isBillingProgramAvailableAndroid(BillingProgramAndroid program); /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). /// Replaces the deprecated showExternalOfferInformationDialog API. - /// /// Shows Play Store dialog and optionally launches external URL. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/launch-external-link-android @@ -5589,16 +5884,31 @@ abstract class MutationResolver { Future restorePurchases(); /// Display Google's alternative billing information dialog. Step 2 of the alternative billing flow. /// Must be called BEFORE processing payment in your payment system. - /// /// Returns true if user accepted, false if user canceled. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android Future showAlternativeBillingDialogAndroid(); + /// Show Google's information dialog for a Billing Choice external transaction. + /// Available in Google Play Billing Library 9.1.0+. + /// Throws OpenIapError.NotPrepared if billing client not ready. + /// See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android + Future showBillingProgramInformationDialogAndroid({ + required BillingProgramAndroid billingProgram, + required String externalTransactionToken, + }); /// Present the disclosure sheet required before linking out via ExternalPurchaseCustomLink (iOS 18.1+). /// Call this after a deliberate customer interaction before linking out to external purchases. /// Reference: https://developer.apple.com/documentation/storekit/externalpurchasecustomlink/shownotice(type:) /// See: https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios Future showExternalPurchaseCustomLinkNoticeIOS(ExternalPurchaseCustomLinkNoticeTypeIOS noticeType); + /// Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. + /// Available in Google Play Billing Library 4.1.0+. + /// Returns a response code and, when the subscription status changes, the related purchase token. + /// Throws OpenIapError.NotPrepared if billing client not ready. + /// See: https://openiap.dev/docs/apis/android/show-in-app-messages-android + Future showInAppMessagesAndroid({ + List? categories, + }); /// Present the manage-subscriptions sheet and return changed purchases (iOS 15+). /// See: https://openiap.dev/docs/apis/ios/show-manage-subscriptions-ios Future> showManageSubscriptionsIOS(); @@ -5667,6 +5977,15 @@ abstract class QueryResolver { bool? includeSuspendedAndroid, bool? onlyIncludeActiveItemsIOS, }); + /// Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. + /// Available in Google Play Billing Library 9.1.0+. + /// Throws OpenIapError.NotPrepared if billing client is not ready. + /// See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android + Future getBillingChoiceInfoAndroid({ + required BillingProgramAndroid billingProgram, + required BillingChoiceImageLayoutAndroid playBillingChoiceImageLayout, + String? userLocale, + }); /// Fetch a token for Apple's External Purchase Server reporting API (iOS 18.1+). /// Use this token to report transactions made through ExternalPurchaseCustomLink. /// Reference: https://developer.apple.com/documentation/storekit/externalpurchasecustomlink/token(for:) @@ -5765,7 +6084,10 @@ typedef MutationCheckAlternativeBillingAvailabilityAndroidHandler = Future typedef MutationClearTransactionIOSHandler = Future Function(); typedef MutationConsumePurchaseAndroidHandler = Future Function(String purchaseToken); typedef MutationCreateAlternativeBillingTokenAndroidHandler = Future Function(); -typedef MutationCreateBillingProgramReportingDetailsAndroidHandler = Future Function(BillingProgramAndroid program); +typedef MutationCreateBillingProgramReportingDetailsAndroidHandler = Future Function({ + required BillingProgramAndroid program, + DeveloperBillingTypeAndroid? developerBillingType, +}); typedef MutationDeepLinkToSubscriptionsHandler = Future Function({ String? packageNameAndroid, String? skuAndroid, @@ -5793,7 +6115,14 @@ typedef MutationRequestPurchaseHandler = Future Function typedef MutationRequestPurchaseOnPromotedProductIOSHandler = Future Function(); typedef MutationRestorePurchasesHandler = Future Function(); typedef MutationShowAlternativeBillingDialogAndroidHandler = Future Function(); +typedef MutationShowBillingProgramInformationDialogAndroidHandler = Future Function({ + required BillingProgramAndroid billingProgram, + required String externalTransactionToken, +}); typedef MutationShowExternalPurchaseCustomLinkNoticeIOSHandler = Future Function(ExternalPurchaseCustomLinkNoticeTypeIOS noticeType); +typedef MutationShowInAppMessagesAndroidHandler = Future Function({ + List? categories, +}); typedef MutationShowManageSubscriptionsIOSHandler = Future> Function(); typedef MutationSyncIOSHandler = Future Function(); typedef MutationValidateReceiptHandler = Future Function({ @@ -5833,7 +6162,9 @@ class MutationHandlers { this.requestPurchaseOnPromotedProductIOS, this.restorePurchases, this.showAlternativeBillingDialogAndroid, + this.showBillingProgramInformationDialogAndroid, this.showExternalPurchaseCustomLinkNoticeIOS, + this.showInAppMessagesAndroid, this.showManageSubscriptionsIOS, this.syncIOS, this.validateReceipt, @@ -5861,7 +6192,9 @@ class MutationHandlers { final MutationRequestPurchaseOnPromotedProductIOSHandler? requestPurchaseOnPromotedProductIOS; final MutationRestorePurchasesHandler? restorePurchases; final MutationShowAlternativeBillingDialogAndroidHandler? showAlternativeBillingDialogAndroid; + final MutationShowBillingProgramInformationDialogAndroidHandler? showBillingProgramInformationDialogAndroid; final MutationShowExternalPurchaseCustomLinkNoticeIOSHandler? showExternalPurchaseCustomLinkNoticeIOS; + final MutationShowInAppMessagesAndroidHandler? showInAppMessagesAndroid; final MutationShowManageSubscriptionsIOSHandler? showManageSubscriptionsIOS; final MutationSyncIOSHandler? syncIOS; final MutationValidateReceiptHandler? validateReceipt; @@ -5885,6 +6218,11 @@ typedef QueryGetAvailablePurchasesHandler = Future> Function({ bool? includeSuspendedAndroid, bool? onlyIncludeActiveItemsIOS, }); +typedef QueryGetBillingChoiceInfoAndroidHandler = Future Function({ + required BillingProgramAndroid billingProgram, + required BillingChoiceImageLayoutAndroid playBillingChoiceImageLayout, + String? userLocale, +}); typedef QueryGetExternalPurchaseCustomLinkTokenIOSHandler = Future Function(ExternalPurchaseCustomLinkTokenTypeIOS tokenType); typedef QueryGetPendingTransactionsIOSHandler = Future> Function(); typedef QueryGetPromotedProductIOSHandler = Future Function(); @@ -5913,6 +6251,7 @@ class QueryHandlers { this.getAllTransactionsIOS, this.getAppTransactionIOS, this.getAvailablePurchases, + this.getBillingChoiceInfoAndroid, this.getExternalPurchaseCustomLinkTokenIOS, this.getPendingTransactionsIOS, this.getPromotedProductIOS, @@ -5936,6 +6275,7 @@ class QueryHandlers { final QueryGetAllTransactionsIOSHandler? getAllTransactionsIOS; final QueryGetAppTransactionIOSHandler? getAppTransactionIOS; final QueryGetAvailablePurchasesHandler? getAvailablePurchases; + final QueryGetBillingChoiceInfoAndroidHandler? getBillingChoiceInfoAndroid; final QueryGetExternalPurchaseCustomLinkTokenIOSHandler? getExternalPurchaseCustomLinkTokenIOS; final QueryGetPendingTransactionsIOSHandler? getPendingTransactionsIOS; final QueryGetPromotedProductIOSHandler? getPromotedProductIOS; diff --git a/libraries/flutter_inapp_purchase/test/flutter_inapp_purchase_channel_test.dart b/libraries/flutter_inapp_purchase/test/flutter_inapp_purchase_channel_test.dart index 59a09eaaf..6685d6b42 100644 --- a/libraries/flutter_inapp_purchase/test/flutter_inapp_purchase_channel_test.dart +++ b/libraries/flutter_inapp_purchase/test/flutter_inapp_purchase_channel_test.dart @@ -83,10 +83,169 @@ void main() { (MethodCall call) => call.method == 'createBillingProgramReportingDetailsAndroid', ); - expect(call.arguments, {'program': 'external-offer'}); + expect(call.arguments, { + 'program': 'external-offer', + 'developerBillingType': null, + }); }, ); + test( + 'createBillingProgramReportingDetailsAndroid passes developerBillingType', + () async { + final calls = []; + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(channel, (MethodCall call) async { + calls.add(call); + if (call.method == 'createBillingProgramReportingDetailsAndroid') { + return jsonEncode({ + 'billingProgram': 'billing-choice', + 'externalTransactionToken': 'choice-token-123', + }); + } + return null; + }); + + final iap = FlutterInappPurchase.private( + FakePlatform(operatingSystem: 'android'), + ); + + final result = await iap.createBillingProgramReportingDetailsAndroid( + types.BillingProgramAndroid.BillingChoice, + developerBillingType: types.DeveloperBillingTypeAndroid.ExternalLink, + ); + + expect( + result.billingProgram, types.BillingProgramAndroid.BillingChoice); + + final call = calls.singleWhere( + (MethodCall call) => + call.method == 'createBillingProgramReportingDetailsAndroid', + ); + expect(call.arguments, { + 'program': 'billing-choice', + 'developerBillingType': 'external-link', + }); + }, + ); + + test('getBillingChoiceInfoAndroid returns parsed display info', () async { + final calls = []; + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(channel, (MethodCall call) async { + calls.add(call); + if (call.method == 'getBillingChoiceInfoAndroid') { + return jsonEncode({ + 'playBillingChoiceImageUrl': 'https://play.google.com/image.png', + 'playBillingLoyaltyInfo': 'Gold member', + }); + } + return null; + }); + + final iap = FlutterInappPurchase.private( + FakePlatform(operatingSystem: 'android'), + ); + + final result = await iap.getBillingChoiceInfoAndroid( + const types.GetBillingChoiceInfoParamsAndroid( + billingProgram: types.BillingProgramAndroid.BillingChoice, + playBillingChoiceImageLayout: + types.BillingChoiceImageLayoutAndroid.RectangularFourByOne, + userLocale: 'en-US', + ), + ); + + expect(result.playBillingChoiceImageUrl, + 'https://play.google.com/image.png'); + expect(result.playBillingLoyaltyInfo, 'Gold member'); + + final call = calls.singleWhere( + (MethodCall call) => call.method == 'getBillingChoiceInfoAndroid', + ); + expect(call.arguments, { + 'billingProgram': 'billing-choice', + 'playBillingChoiceImageLayout': 'rectangular-four-by-one', + 'userLocale': 'en-US', + }); + }); + + test('showBillingProgramInformationDialogAndroid returns billing result', + () async { + final calls = []; + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(channel, (MethodCall call) async { + calls.add(call); + if (call.method == 'showBillingProgramInformationDialogAndroid') { + return jsonEncode({ + 'responseCode': 0, + 'debugMessage': null, + }); + } + return null; + }); + + final iap = FlutterInappPurchase.private( + FakePlatform(operatingSystem: 'android'), + ); + + final result = await iap.showBillingProgramInformationDialogAndroid( + const types.BillingProgramInformationDialogParamsAndroid( + billingProgram: types.BillingProgramAndroid.BillingChoice, + externalTransactionToken: 'choice-token', + ), + ); + + expect(result.responseCode, 0); + final call = calls.singleWhere( + (MethodCall call) => + call.method == 'showBillingProgramInformationDialogAndroid', + ); + expect(call.arguments, { + 'billingProgram': 'billing-choice', + 'externalTransactionToken': 'choice-token', + }); + }); + + test('showInAppMessagesAndroid returns response code', () async { + final calls = []; + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(channel, (MethodCall call) async { + calls.add(call); + if (call.method == 'showInAppMessagesAndroid') { + return jsonEncode({ + 'responseCode': 'subscription-status-updated', + 'purchaseToken': 'purchase-token', + }); + } + return null; + }); + + final iap = FlutterInappPurchase.private( + FakePlatform(operatingSystem: 'android'), + ); + + final result = await iap.showInAppMessagesAndroid( + const types.InAppMessageParamsAndroid( + categories: [ + types.InAppMessageCategoryAndroid.Transactional, + ], + ), + ); + + expect( + result.responseCode, + types.InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated, + ); + expect(result.purchaseToken, 'purchase-token'); + final call = calls.singleWhere( + (MethodCall call) => call.method == 'showInAppMessagesAndroid', + ); + expect(call.arguments, { + 'categories': ['transactional'], + }); + }); + test( 'initConnection passes enableBillingProgramAndroid to native channel', () async { diff --git a/libraries/godot-iap/addons/godot-iap/godot_iap.gd b/libraries/godot-iap/addons/godot-iap/godot_iap.gd index 7f1fe43e0..18e1992fc 100644 --- a/libraries/godot-iap/addons/godot-iap/godot_iap.gd +++ b/libraries/godot-iap/addons/godot-iap/godot_iap.gd @@ -1342,7 +1342,7 @@ func create_alternative_billing_token_android() -> Variant: ## See: https://openiap.dev/docs/apis/android/is-billing-program-available-android func is_billing_program_available_android(billing_program) -> Variant: if _native_plugin and _platform == "Android": - var result_json = _native_plugin.call("isBillingProgramAvailableAndroid", billing_program) + var result_json = _native_plugin.call("isBillingProgramAvailableAndroid", _billing_program_to_raw(billing_program)) var result = JSON.parse_string(result_json) if result is Dictionary: return Types.BillingProgramAvailabilityResultAndroid.from_dict(result) @@ -1351,6 +1351,30 @@ func is_billing_program_available_android(billing_program) -> Variant: default_result.billing_program = billing_program return default_result +func _billing_program_to_raw(billing_program) -> Variant: + if typeof(billing_program) == TYPE_INT and Types.BILLING_PROGRAM_ANDROID_VALUES.has(billing_program): + return Types.BILLING_PROGRAM_ANDROID_VALUES[billing_program] + return billing_program + +func _developer_billing_type_to_raw(developer_billing_type) -> Variant: + if typeof(developer_billing_type) == TYPE_INT and Types.DEVELOPER_BILLING_TYPE_ANDROID_VALUES.has(developer_billing_type): + return Types.DEVELOPER_BILLING_TYPE_ANDROID_VALUES[developer_billing_type] + return developer_billing_type + +## Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens (Android 9.1.0+). +## @param params: Types.GetBillingChoiceInfoParamsAndroid - Billing Choice info parameters +## @return Types.BillingChoiceInfoAndroid +## +## See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android +func get_billing_choice_info_android(params) -> Variant: + if _native_plugin and _platform == "Android": + var params_json = JSON.stringify(params.to_dict()) + var result_json = _native_plugin.call("getBillingChoiceInfoAndroid", params_json) + var result = JSON.parse_string(result_json) + if result is Dictionary: + return Types.BillingChoiceInfoAndroid.from_dict(result) + return Types.BillingChoiceInfoAndroid.new() + ## Launch external link (Android 8.2.0+). ## @param params: Types.LaunchExternalLinkParamsAndroid - external link parameters ## @return Types.VoidResult @@ -1369,12 +1393,20 @@ func launch_external_link_android(params) -> Variant: ## Create billing program reporting details (Android 8.2.0+). ## @param billing_program: Types.BillingProgramAndroid - billing program enum value +## @param developer_billing_type: Types.DeveloperBillingTypeAndroid or null ## @return Types.BillingProgramReportingDetailsAndroid ## ## See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android -func create_billing_program_reporting_details_android(billing_program) -> Variant: +func create_billing_program_reporting_details_android(billing_program, developer_billing_type = null) -> Variant: if _native_plugin and _platform == "Android": - var result_json = _native_plugin.call("createBillingProgramReportingDetailsAndroid", billing_program) + var result_json: String + if developer_billing_type == null: + result_json = _native_plugin.call("createBillingProgramReportingDetailsAndroid", _billing_program_to_raw(billing_program)) + else: + result_json = _native_plugin.call("createBillingProgramReportingDetailsAndroidWithType", JSON.stringify({ + "billingProgram": _billing_program_to_raw(billing_program), + "developerBillingType": _developer_billing_type_to_raw(developer_billing_type) + })) var result = JSON.parse_string(result_json) if result is Dictionary: return Types.BillingProgramReportingDetailsAndroid.from_dict(result) @@ -1382,6 +1414,35 @@ func create_billing_program_reporting_details_android(billing_program) -> Varian default_result.billing_program = billing_program return default_result +## Show Google's information dialog for a Billing Choice external transaction (Android 9.1.0+). +## @param params: Types.BillingProgramInformationDialogParamsAndroid +## @return Types.BillingResultAndroid +## +## See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android +func show_billing_program_information_dialog_android(params) -> Variant: + if _native_plugin and _platform == "Android": + var result_json = _native_plugin.call("showBillingProgramInformationDialogAndroid", JSON.stringify(params.to_dict())) + var result = JSON.parse_string(result_json) + if result is Dictionary: + return Types.BillingResultAndroid.from_dict(result) + return Types.BillingResultAndroid.new() + +## Show Play Billing in-app messages (Android). +## @param params: Types.InAppMessageParamsAndroid or null +## @return Types.InAppMessageResultAndroid +## +## See: https://openiap.dev/docs/apis/android/show-in-app-messages-android +func show_in_app_messages_android(params = null) -> Variant: + if _native_plugin and _platform == "Android": + var params_dict = params.to_dict() if params != null and params is Object and params.has_method("to_dict") else {} + var result_json = _native_plugin.call("showInAppMessagesAndroid", JSON.stringify(params_dict)) + var result = JSON.parse_string(result_json) + if result is Dictionary: + return Types.InAppMessageResultAndroid.from_dict(result) + var default_result = Types.InAppMessageResultAndroid.new() + default_result.response_code = Types.InAppMessageResponseCodeAndroid.NO_ACTION_NEEDED + return default_result + ## Get the package name (Android only). ## @return String - Android package name func get_package_name_android() -> String: diff --git a/libraries/godot-iap/addons/godot-iap/types.gd b/libraries/godot-iap/addons/godot-iap/types.gd index f36b8f261..3910cb9d8 100644 --- a/libraries/godot-iap/addons/godot-iap/types.gd +++ b/libraries/godot-iap/addons/godot-iap/types.gd @@ -21,7 +21,27 @@ enum AlternativeBillingModeAndroid { ALTERNATIVE_ONLY = 2, } -## Billing program types for external content links, external offers, and external payments (Android) Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0 +## Play Billing choice image layout (Android) Available in Google Play Billing Library 9.1.0+ +enum BillingChoiceImageLayoutAndroid { + ## Rectangular image with a 4:1 aspect ratio. + RECTANGULAR_FOUR_BY_ONE = 0, + ## Rectangular image with a 3:1 aspect ratio. + RECTANGULAR_THREE_BY_ONE = 1, + ## Rectangular image with a 2:2 aspect ratio. + RECTANGULAR_TWO_BY_TWO = 2, +} + +## Choice screen renderer for Billing Choice availability (Android) Available in Google Play Billing Library 9.1.0+ +enum BillingChoiceScreenTypeAndroid { + ## Unspecified choice screen type. + UNSPECIFIED = 0, + ## Choice screen is rendered by the developer app. + DEVELOPER_RENDERED = 1, + ## Choice screen is rendered by Google Play. + GOOGLE_RENDERED = 2, +} + +## Billing program types for Google Play Billing Programs (Android) Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, BILLING_CHOICE added in 9.1.0. enum BillingProgramAndroid { ## Unspecified billing program. Do not use. UNSPECIFIED = 0, @@ -33,6 +53,8 @@ enum BillingProgramAndroid { EXTERNAL_OFFER = 3, ## External Payments program (Japan only). Allows presenting a side-by-side choice between Google Play Billing and developer's external payment option. Users can choose to complete the purchase on the developer's website. Available in Google Play Billing Library 8.3.0+ EXTERNAL_PAYMENTS = 4, + ## Billing Choice program. Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. Available in Google Play Billing Library 9.1.0+ + BILLING_CHOICE = 5, } ## Launch mode for developer billing option (Android) Determines how the external payment URL is launched Available in Google Play Billing Library 8.3.0+ @@ -45,6 +67,16 @@ enum DeveloperBillingLaunchModeAndroid { CALLER_WILL_LAUNCH_LINK = 2, } +## Developer-provided billing destination type for Billing Program reporting details (Android) Available in Google Play Billing Library 9.1.0+ +enum DeveloperBillingTypeAndroid { + ## Unspecified developer billing type. Do not use. + DEVELOPER_BILLING_TYPE_UNSPECIFIED = 0, + ## Developer-provided billing via native in-app experience. + IN_APP = 1, + ## Developer-provided billing via external link or embedded web browsing. + EXTERNAL_LINK = 2, +} + ## Discount offer type enumeration. Categorizes the type of discount or promotional offer. enum DiscountOfferType { ## Introductory offer for new subscribers (first-time purchase discount) @@ -185,6 +217,22 @@ enum IapStore { AMAZON = 4, } +## High-level in-app message category (Android) Available in Google Play Billing Library 4.1.0+ +enum InAppMessageCategoryAndroid { + ## Unknown in-app message category. + UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID = 0, + ## Transactional billing messages, such as payment issues or pending price-change confirmations. + TRANSACTIONAL = 1, +} + +## Response code from Play billing in-app messages (Android) Available in Google Play Billing Library 4.1.0+ +enum InAppMessageResponseCodeAndroid { + ## Flow finished and no developer action is needed. + NO_ACTION_NEEDED = 0, + ## Subscription status changed and the purchase token should be checked. + SUBSCRIPTION_STATUS_UPDATED = 1, +} + ## Payment mode for subscription offers. Determines how the user pays during the offer period. enum PaymentMode { ## Free trial period - no charge during offer @@ -684,12 +732,38 @@ class AppTransaction: dict["originalPlatform"] = original_platform return dict +## Display information for developer-rendered Billing Choice screens (Android) Available in Google Play Billing Library 9.1.0+ +class BillingChoiceInfoAndroid: + ## URL for the Play Billing choice image matching the requested layout. + var play_billing_choice_image_url: String = "" + ## Play Loyalty information for the user. + var play_billing_loyalty_info: Variant = null + + static func from_dict(data: Dictionary) -> BillingChoiceInfoAndroid: + var obj = BillingChoiceInfoAndroid.new() + if data.has("playBillingChoiceImageUrl") and data["playBillingChoiceImageUrl"] != null: + obj.play_billing_choice_image_url = data["playBillingChoiceImageUrl"] + if data.has("playBillingLoyaltyInfo") and data["playBillingLoyaltyInfo"] != null: + obj.play_billing_loyalty_info = data["playBillingLoyaltyInfo"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + dict["playBillingChoiceImageUrl"] = play_billing_choice_image_url + if play_billing_loyalty_info != null: + dict["playBillingLoyaltyInfo"] = play_billing_loyalty_info + return dict + ## Result of checking billing program availability (Android) Available in Google Play Billing Library 8.2.0+ class BillingProgramAvailabilityResultAndroid: ## Whether the billing program is available for the user var is_available: bool = false ## The billing program that was checked var billing_program: BillingProgramAndroid + ## Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + var choice_screen_type: BillingChoiceScreenTypeAndroid + ## Whether external-link payment is available for Billing Choice. + var is_external_link_available: Variant = null static func from_dict(data: Dictionary) -> BillingProgramAvailabilityResultAndroid: var obj = BillingProgramAvailabilityResultAndroid.new() @@ -701,6 +775,14 @@ class BillingProgramAvailabilityResultAndroid: obj.billing_program = BILLING_PROGRAM_ANDROID_FROM_STRING[enum_str] else: obj.billing_program = enum_str + if data.has("choiceScreenType") and data["choiceScreenType"] != null: + var enum_str = data["choiceScreenType"] + if enum_str is String and BILLING_CHOICE_SCREEN_TYPE_ANDROID_FROM_STRING.has(enum_str): + obj.choice_screen_type = BILLING_CHOICE_SCREEN_TYPE_ANDROID_FROM_STRING[enum_str] + else: + obj.choice_screen_type = enum_str + if data.has("isExternalLinkAvailable") and data["isExternalLinkAvailable"] != null: + obj.is_external_link_available = data["isExternalLinkAvailable"] return obj func to_dict() -> Dictionary: @@ -710,6 +792,12 @@ class BillingProgramAvailabilityResultAndroid: dict["billingProgram"] = BILLING_PROGRAM_ANDROID_VALUES[billing_program] else: dict["billingProgram"] = billing_program + if BILLING_CHOICE_SCREEN_TYPE_ANDROID_VALUES.has(choice_screen_type): + dict["choiceScreenType"] = BILLING_CHOICE_SCREEN_TYPE_ANDROID_VALUES[choice_screen_type] + else: + dict["choiceScreenType"] = choice_screen_type + if is_external_link_available != null: + dict["isExternalLinkAvailable"] = is_external_link_available return dict ## Reporting details for transactions made outside of Google Play Billing (Android) Contains the external transaction token needed for reporting Available in Google Play Billing Library 8.2.0+ @@ -1216,6 +1304,35 @@ class ExternalPurchaseNoticeResultIOS: dict["externalPurchaseToken"] = external_purchase_token return dict +## Result from showing Play billing in-app messages (Android) Available in Google Play Billing Library 4.1.0+ +class InAppMessageResultAndroid: + ## Response code for the in-app messaging flow. + var response_code: InAppMessageResponseCodeAndroid + ## Purchase token returned when a subscription status changed. + var purchase_token: Variant = null + + static func from_dict(data: Dictionary) -> InAppMessageResultAndroid: + var obj = InAppMessageResultAndroid.new() + if data.has("responseCode") and data["responseCode"] != null: + var enum_str = data["responseCode"] + if enum_str is String and IN_APP_MESSAGE_RESPONSE_CODE_ANDROID_FROM_STRING.has(enum_str): + obj.response_code = IN_APP_MESSAGE_RESPONSE_CODE_ANDROID_FROM_STRING[enum_str] + else: + obj.response_code = enum_str + if data.has("purchaseToken") and data["purchaseToken"] != null: + obj.purchase_token = data["purchaseToken"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + if IN_APP_MESSAGE_RESPONSE_CODE_ANDROID_VALUES.has(response_code): + dict["responseCode"] = IN_APP_MESSAGE_RESPONSE_CODE_ANDROID_VALUES[response_code] + else: + dict["responseCode"] = response_code + if purchase_token != null: + dict["purchaseToken"] = purchase_token + return dict + ## Installment plan details for subscription offers (Android) Contains information about the installment plan commitment. Available in Google Play Billing Library 7.0+ class InstallmentPlanDetailsAndroid: ## Committed payments count after a user signs up for this subscription plan. @@ -3836,6 +3953,36 @@ class AndroidSubscriptionOfferInput: dict["offerToken"] = offer_token return dict +## Parameters for showing a billing program information dialog (Android) Available in Google Play Billing Library 9.1.0+ +class BillingProgramInformationDialogParamsAndroid: + ## Billing program. Currently only BILLING_CHOICE is supported. + var billing_program: BillingProgramAndroid + ## External transaction token returned by the Billing Choice reporting-details flow. + var external_transaction_token: String = "" + + static func from_dict(data: Dictionary) -> BillingProgramInformationDialogParamsAndroid: + var obj = BillingProgramInformationDialogParamsAndroid.new() + if data.has("billingProgram") and data["billingProgram"] != null: + var enum_str = data["billingProgram"] + if enum_str is String and BILLING_PROGRAM_ANDROID_FROM_STRING.has(enum_str): + obj.billing_program = BILLING_PROGRAM_ANDROID_FROM_STRING[enum_str] + else: + obj.billing_program = enum_str + if data.has("externalTransactionToken") and data["externalTransactionToken"] != null: + obj.external_transaction_token = data["externalTransactionToken"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + if billing_program != null: + if BILLING_PROGRAM_ANDROID_VALUES.has(billing_program): + dict["billingProgram"] = BILLING_PROGRAM_ANDROID_VALUES[billing_program] + else: + dict["billingProgram"] = billing_program + if external_transaction_token != null: + dict["externalTransactionToken"] = external_transaction_token + return dict + class DeepLinkOptions: ## Android SKU to open (required on Android) var sku_android: Variant = null @@ -3941,6 +4088,66 @@ class DiscountOfferInputIOS: dict["timestamp"] = timestamp return dict +## Parameters for fetching Billing Choice display information (Android) Available in Google Play Billing Library 9.1.0+ +class GetBillingChoiceInfoParamsAndroid: + ## Billing program. Currently only BILLING_CHOICE is supported. + var billing_program: BillingProgramAndroid + ## Desired Play Billing choice image layout. + var play_billing_choice_image_layout: BillingChoiceImageLayoutAndroid + ## BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. + var user_locale: Variant = null + + static func from_dict(data: Dictionary) -> GetBillingChoiceInfoParamsAndroid: + var obj = GetBillingChoiceInfoParamsAndroid.new() + if data.has("billingProgram") and data["billingProgram"] != null: + var enum_str = data["billingProgram"] + if enum_str is String and BILLING_PROGRAM_ANDROID_FROM_STRING.has(enum_str): + obj.billing_program = BILLING_PROGRAM_ANDROID_FROM_STRING[enum_str] + else: + obj.billing_program = enum_str + if data.has("playBillingChoiceImageLayout") and data["playBillingChoiceImageLayout"] != null: + var enum_str = data["playBillingChoiceImageLayout"] + if enum_str is String and BILLING_CHOICE_IMAGE_LAYOUT_ANDROID_FROM_STRING.has(enum_str): + obj.play_billing_choice_image_layout = BILLING_CHOICE_IMAGE_LAYOUT_ANDROID_FROM_STRING[enum_str] + else: + obj.play_billing_choice_image_layout = enum_str + if data.has("userLocale") and data["userLocale"] != null: + obj.user_locale = data["userLocale"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + if billing_program != null: + if BILLING_PROGRAM_ANDROID_VALUES.has(billing_program): + dict["billingProgram"] = BILLING_PROGRAM_ANDROID_VALUES[billing_program] + else: + dict["billingProgram"] = billing_program + if play_billing_choice_image_layout != null: + if BILLING_CHOICE_IMAGE_LAYOUT_ANDROID_VALUES.has(play_billing_choice_image_layout): + dict["playBillingChoiceImageLayout"] = BILLING_CHOICE_IMAGE_LAYOUT_ANDROID_VALUES[play_billing_choice_image_layout] + else: + dict["playBillingChoiceImageLayout"] = play_billing_choice_image_layout + if user_locale != null: + dict["userLocale"] = user_locale + return dict + +## Parameters for showing Play billing in-app messages (Android) Available in Google Play Billing Library 4.1.0+ +class InAppMessageParamsAndroid: + ## In-app message categories to show. Defaults to transactional messages. + var categories: Array[InAppMessageCategoryAndroid] = [] + + static func from_dict(data: Dictionary) -> InAppMessageParamsAndroid: + var obj = InAppMessageParamsAndroid.new() + if data.has("categories") and data["categories"] != null: + obj.categories = data["categories"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + if categories != null: + dict["categories"] = categories + return dict + ## Connection initialization configuration class InitConnectionConfig: ## Alternative billing mode for Android @@ -5023,12 +5230,25 @@ const ALTERNATIVE_BILLING_MODE_ANDROID_VALUES = { AlternativeBillingModeAndroid.ALTERNATIVE_ONLY: "alternative-only" } +const BILLING_CHOICE_IMAGE_LAYOUT_ANDROID_VALUES = { + BillingChoiceImageLayoutAndroid.RECTANGULAR_FOUR_BY_ONE: "rectangular-four-by-one", + BillingChoiceImageLayoutAndroid.RECTANGULAR_THREE_BY_ONE: "rectangular-three-by-one", + BillingChoiceImageLayoutAndroid.RECTANGULAR_TWO_BY_TWO: "rectangular-two-by-two" +} + +const BILLING_CHOICE_SCREEN_TYPE_ANDROID_VALUES = { + BillingChoiceScreenTypeAndroid.UNSPECIFIED: "unspecified", + BillingChoiceScreenTypeAndroid.DEVELOPER_RENDERED: "developer-rendered", + BillingChoiceScreenTypeAndroid.GOOGLE_RENDERED: "google-rendered" +} + const BILLING_PROGRAM_ANDROID_VALUES = { BillingProgramAndroid.UNSPECIFIED: "unspecified", BillingProgramAndroid.USER_CHOICE_BILLING: "user-choice-billing", BillingProgramAndroid.EXTERNAL_CONTENT_LINK: "external-content-link", BillingProgramAndroid.EXTERNAL_OFFER: "external-offer", - BillingProgramAndroid.EXTERNAL_PAYMENTS: "external-payments" + BillingProgramAndroid.EXTERNAL_PAYMENTS: "external-payments", + BillingProgramAndroid.BILLING_CHOICE: "billing-choice" } const DEVELOPER_BILLING_LAUNCH_MODE_ANDROID_VALUES = { @@ -5037,6 +5257,12 @@ const DEVELOPER_BILLING_LAUNCH_MODE_ANDROID_VALUES = { DeveloperBillingLaunchModeAndroid.CALLER_WILL_LAUNCH_LINK: "caller-will-launch-link" } +const DEVELOPER_BILLING_TYPE_ANDROID_VALUES = { + DeveloperBillingTypeAndroid.DEVELOPER_BILLING_TYPE_UNSPECIFIED: "developer-billing-type-unspecified", + DeveloperBillingTypeAndroid.IN_APP: "in-app", + DeveloperBillingTypeAndroid.EXTERNAL_LINK: "external-link" +} + const DISCOUNT_OFFER_TYPE_VALUES = { DiscountOfferType.INTRODUCTORY: "introductory", DiscountOfferType.PROMOTIONAL: "promotional", @@ -5145,6 +5371,16 @@ const IAP_STORE_VALUES = { IapStore.AMAZON: "amazon" } +const IN_APP_MESSAGE_CATEGORY_ANDROID_VALUES = { + InAppMessageCategoryAndroid.UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID: "unknown-in-app-message-category-id", + InAppMessageCategoryAndroid.TRANSACTIONAL: "transactional" +} + +const IN_APP_MESSAGE_RESPONSE_CODE_ANDROID_VALUES = { + InAppMessageResponseCodeAndroid.NO_ACTION_NEEDED: "no-action-needed", + InAppMessageResponseCodeAndroid.SUBSCRIPTION_STATUS_UPDATED: "subscription-status-updated" +} + const PAYMENT_MODE_VALUES = { PaymentMode.FREE_TRIAL: "free-trial", PaymentMode.PAY_AS_YOU_GO: "pay-as-you-go", @@ -5299,12 +5535,25 @@ const ALTERNATIVE_BILLING_MODE_ANDROID_FROM_STRING = { "alternative-only": AlternativeBillingModeAndroid.ALTERNATIVE_ONLY } +const BILLING_CHOICE_IMAGE_LAYOUT_ANDROID_FROM_STRING = { + "rectangular-four-by-one": BillingChoiceImageLayoutAndroid.RECTANGULAR_FOUR_BY_ONE, + "rectangular-three-by-one": BillingChoiceImageLayoutAndroid.RECTANGULAR_THREE_BY_ONE, + "rectangular-two-by-two": BillingChoiceImageLayoutAndroid.RECTANGULAR_TWO_BY_TWO +} + +const BILLING_CHOICE_SCREEN_TYPE_ANDROID_FROM_STRING = { + "unspecified": BillingChoiceScreenTypeAndroid.UNSPECIFIED, + "developer-rendered": BillingChoiceScreenTypeAndroid.DEVELOPER_RENDERED, + "google-rendered": BillingChoiceScreenTypeAndroid.GOOGLE_RENDERED +} + const BILLING_PROGRAM_ANDROID_FROM_STRING = { "unspecified": BillingProgramAndroid.UNSPECIFIED, "user-choice-billing": BillingProgramAndroid.USER_CHOICE_BILLING, "external-content-link": BillingProgramAndroid.EXTERNAL_CONTENT_LINK, "external-offer": BillingProgramAndroid.EXTERNAL_OFFER, - "external-payments": BillingProgramAndroid.EXTERNAL_PAYMENTS + "external-payments": BillingProgramAndroid.EXTERNAL_PAYMENTS, + "billing-choice": BillingProgramAndroid.BILLING_CHOICE } const DEVELOPER_BILLING_LAUNCH_MODE_ANDROID_FROM_STRING = { @@ -5313,6 +5562,12 @@ const DEVELOPER_BILLING_LAUNCH_MODE_ANDROID_FROM_STRING = { "caller-will-launch-link": DeveloperBillingLaunchModeAndroid.CALLER_WILL_LAUNCH_LINK } +const DEVELOPER_BILLING_TYPE_ANDROID_FROM_STRING = { + "developer-billing-type-unspecified": DeveloperBillingTypeAndroid.DEVELOPER_BILLING_TYPE_UNSPECIFIED, + "in-app": DeveloperBillingTypeAndroid.IN_APP, + "external-link": DeveloperBillingTypeAndroid.EXTERNAL_LINK +} + const DISCOUNT_OFFER_TYPE_FROM_STRING = { "introductory": DiscountOfferType.INTRODUCTORY, "promotional": DiscountOfferType.PROMOTIONAL, @@ -5421,6 +5676,16 @@ const IAP_STORE_FROM_STRING = { "amazon": IapStore.AMAZON } +const IN_APP_MESSAGE_CATEGORY_ANDROID_FROM_STRING = { + "unknown-in-app-message-category-id": InAppMessageCategoryAndroid.UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID, + "transactional": InAppMessageCategoryAndroid.TRANSACTIONAL +} + +const IN_APP_MESSAGE_RESPONSE_CODE_ANDROID_FROM_STRING = { + "no-action-needed": InAppMessageResponseCodeAndroid.NO_ACTION_NEEDED, + "subscription-status-updated": InAppMessageResponseCodeAndroid.SUBSCRIPTION_STATUS_UPDATED +} + const PAYMENT_MODE_FROM_STRING = { "free-trial": PaymentMode.FREE_TRIAL, "pay-as-you-go": PaymentMode.PAY_AS_YOU_GO, @@ -5917,6 +6182,26 @@ class Query: const return_type = "VerifyPurchaseResultIOS" const is_array = false + ## Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. + class getBillingChoiceInfoAndroidField: + const name = "getBillingChoiceInfoAndroid" + const snake_name = "get_billing_choice_info_android" + class Args: + var params: GetBillingChoiceInfoParamsAndroid + + static func from_dict(data: Dictionary) -> Args: + var obj = Args.new() + if data.has("params") and data["params"] != null: + obj.params = data["params"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + dict["params"] = params + return dict + const return_type = "BillingChoiceInfoAndroid" + const is_array = false + # ============================================================================ # Mutation Types @@ -6315,6 +6600,7 @@ class Mutation: const snake_name = "create_billing_program_reporting_details_android" class Args: var program: BillingProgramAndroid + var developer_billing_type: DeveloperBillingTypeAndroid static func from_dict(data: Dictionary) -> Args: var obj = Args.new() @@ -6324,6 +6610,12 @@ class Mutation: obj.program = BILLING_PROGRAM_ANDROID_FROM_STRING[enum_str] else: obj.program = enum_str + if data.has("developerBillingType") and data["developerBillingType"] != null: + var enum_str = data["developerBillingType"] + if enum_str is String and DEVELOPER_BILLING_TYPE_ANDROID_FROM_STRING.has(enum_str): + obj.developer_billing_type = DEVELOPER_BILLING_TYPE_ANDROID_FROM_STRING[enum_str] + else: + obj.developer_billing_type = enum_str return obj func to_dict() -> Dictionary: @@ -6332,6 +6624,10 @@ class Mutation: dict["program"] = BILLING_PROGRAM_ANDROID_VALUES[program] else: dict["program"] = program + if DEVELOPER_BILLING_TYPE_ANDROID_VALUES.has(developer_billing_type): + dict["developerBillingType"] = DEVELOPER_BILLING_TYPE_ANDROID_VALUES[developer_billing_type] + else: + dict["developerBillingType"] = developer_billing_type return dict const return_type = "BillingProgramReportingDetailsAndroid" const is_array = false @@ -6356,6 +6652,46 @@ class Mutation: const return_type = "Boolean" const is_array = false + ## Show Google's information dialog for a Billing Choice external transaction. + class showBillingProgramInformationDialogAndroidField: + const name = "showBillingProgramInformationDialogAndroid" + const snake_name = "show_billing_program_information_dialog_android" + class Args: + var params: BillingProgramInformationDialogParamsAndroid + + static func from_dict(data: Dictionary) -> Args: + var obj = Args.new() + if data.has("params") and data["params"] != null: + obj.params = data["params"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + dict["params"] = params + return dict + const return_type = "BillingResultAndroid" + const is_array = false + + ## Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. + class showInAppMessagesAndroidField: + const name = "showInAppMessagesAndroid" + const snake_name = "show_in_app_messages_android" + class Args: + var params: InAppMessageParamsAndroid + + static func from_dict(data: Dictionary) -> Args: + var obj = Args.new() + if data.has("params") and data["params"] != null: + obj.params = data["params"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + dict["params"] = params + return dict + const return_type = "InAppMessageResultAndroid" + const is_array = false + # ============================================================================ # API Wrapper Functions @@ -6484,6 +6820,16 @@ static func validate_receipt_ios_args(options: VerifyPurchaseProps) -> Dictionar args["options"] = options return args +## Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. +static func get_billing_choice_info_android_args(params: GetBillingChoiceInfoParamsAndroid) -> Dictionary: + var args = {} + if params != null: + if params.has_method("to_dict"): + args["params"] = params.to_dict() + else: + args["params"] = params + return args + # Mutation API helpers ## Initialize the store connection. Call before any IAP API. @@ -6638,9 +6984,10 @@ static func is_billing_program_available_android_args(program: BillingProgramAnd return args ## Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). -static func create_billing_program_reporting_details_android_args(program: BillingProgramAndroid) -> Dictionary: +static func create_billing_program_reporting_details_android_args(program: BillingProgramAndroid, developer_billing_type: DeveloperBillingTypeAndroid) -> Dictionary: var args = {} args["program"] = program + args["developerBillingType"] = developer_billing_type return args ## Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). @@ -6652,3 +6999,23 @@ static func launch_external_link_android_args(params: LaunchExternalLinkParamsAn else: args["params"] = params return args + +## Show Google's information dialog for a Billing Choice external transaction. +static func show_billing_program_information_dialog_android_args(params: BillingProgramInformationDialogParamsAndroid) -> Dictionary: + var args = {} + if params != null: + if params.has_method("to_dict"): + args["params"] = params.to_dict() + else: + args["params"] = params + return args + +## Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. +static func show_in_app_messages_android_args(params: InAppMessageParamsAndroid) -> Dictionary: + var args = {} + if params != null: + if params.has_method("to_dict"): + args["params"] = params.to_dict() + else: + args["params"] = params + return args diff --git a/libraries/godot-iap/android/build.gradle.kts b/libraries/godot-iap/android/build.gradle.kts index af9ab10b1..88f7f9620 100644 --- a/libraries/godot-iap/android/build.gradle.kts +++ b/libraries/godot-iap/android/build.gradle.kts @@ -54,6 +54,7 @@ android { defaultConfig { minSdk = googleMinSdk + missingDimensionStrategy("platform", "play") manifestPlaceholders["godotPluginName"] = pluginName manifestPlaceholders["godotPluginPackageName"] = pluginPackageName diff --git a/libraries/godot-iap/android/settings.gradle.kts b/libraries/godot-iap/android/settings.gradle.kts index 836bcfc58..2c0df53eb 100644 --- a/libraries/godot-iap/android/settings.gradle.kts +++ b/libraries/godot-iap/android/settings.gradle.kts @@ -35,11 +35,25 @@ pluginManagement { "org.jetbrains.kotlin.android", "kotlinVersion", ) + id("org.jetbrains.kotlin.plugin.compose") version googlePluginVersion( + "org.jetbrains.kotlin.plugin.compose", + "kotlinVersion", + ) + id("com.vanniktech.maven.publish") version googlePluginVersion( + "com.vanniktech.maven.publish", + "vanniktechMavenPublishVersion", + ) } } rootProject.name = "godot-iap" +val localOpenIapProject = file("../../../packages/google/openiap") +if (localOpenIapProject.exists()) { + include(":openiap") + project(":openiap").projectDir = localOpenIapProject +} + dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { diff --git a/libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIap.kt b/libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIap.kt index 170d7c0e5..0b970136b 100644 --- a/libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIap.kt +++ b/libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIap.kt @@ -18,6 +18,7 @@ import org.godotengine.godot.plugin.UsedByGodot import org.json.JSONArray import org.json.JSONObject import dev.hyo.openiap.BillingProgramAndroid as OpenIapBillingProgram +import dev.hyo.openiap.DeveloperBillingTypeAndroid as OpenIapDeveloperBillingType import dev.hyo.openiap.ExternalLinkLaunchModeAndroid as OpenIapExternalLinkLaunchMode import dev.hyo.openiap.ExternalLinkTypeAndroid as OpenIapExternalLinkType import dev.hyo.openiap.LaunchExternalLinkParamsAndroid as OpenIapLaunchExternalLinkParams @@ -677,7 +678,9 @@ class GodotIap(godot: Godot) : GodotPlugin(godot) { JSONObject().apply { put("success", true) put("isAvailable", result.isAvailable) - put("billingProgram", billingProgram) + put("billingProgram", result.billingProgram.toJson()) + put("choiceScreenType", result.choiceScreenType?.toJson()) + put("isExternalLinkAvailable", result.isExternalLinkAvailable) }.toString() } catch (e: Exception) { GodotIapLog.failure("isBillingProgramAvailableAndroid", e) @@ -690,6 +693,44 @@ class GodotIap(godot: Godot) : GodotPlugin(godot) { } } + @UsedByGodot + fun getBillingChoiceInfoAndroid(paramsJson: String): String { + GodotIapLog.payload("getBillingChoiceInfoAndroid", paramsJson) + + if (!isInitialized) { + return JSONObject().apply { + put("success", false) + put("error", "Not initialized") + }.toString() + } + + return runBlocking { + try { + val json = JSONObject(paramsJson) + val params = GetBillingChoiceInfoParamsAndroid( + billingProgram = mapBillingProgram(json.optString("billingProgram", "billing-choice")), + playBillingChoiceImageLayout = BillingChoiceImageLayoutAndroid.fromJson( + json.optString("playBillingChoiceImageLayout", "rectangular-four-by-one") + ), + userLocale = json.optString("userLocale", "").takeIf { it.isNotBlank() } + ) + val result = store.getBillingChoiceInfo(params) + GodotIapLog.result("getBillingChoiceInfoAndroid", "image url received") + JSONObject().apply { + put("success", true) + put("playBillingChoiceImageUrl", result.playBillingChoiceImageUrl) + put("playBillingLoyaltyInfo", result.playBillingLoyaltyInfo) + }.toString() + } catch (e: Exception) { + GodotIapLog.failure("getBillingChoiceInfoAndroid", e) + JSONObject().apply { + put("success", false) + put("error", e.message) + }.toString() + } + } + } + @UsedByGodot fun launchExternalLinkAndroid(paramsJson: String): String { GodotIapLog.payload("launchExternalLinkAndroid", paramsJson) @@ -741,6 +782,30 @@ class GodotIap(godot: Godot) : GodotPlugin(godot) { @UsedByGodot fun createBillingProgramReportingDetailsAndroid(billingProgram: String): String { + return createBillingProgramReportingDetailsAndroidInternal(billingProgram, null) + } + + @UsedByGodot + fun createBillingProgramReportingDetailsAndroidWithType(paramsJson: String): String { + GodotIapLog.payload("createBillingProgramReportingDetailsAndroidWithType", paramsJson) + return try { + val json = JSONObject(paramsJson) + createBillingProgramReportingDetailsAndroidInternal( + json.optString("billingProgram", "unspecified"), + json.optString("developerBillingType", "").takeIf { it.isNotBlank() } + ) + } catch (e: Exception) { + JSONObject().apply { + put("success", false) + put("error", e.message) + }.toString() + } + } + + private fun createBillingProgramReportingDetailsAndroidInternal( + billingProgram: String, + developerBillingType: String? + ): String { GodotIapLog.payload("createBillingProgramReportingDetailsAndroid", billingProgram) if (!isInitialized) { @@ -753,7 +818,10 @@ class GodotIap(godot: Godot) : GodotPlugin(godot) { return runBlocking { try { val program = mapBillingProgram(billingProgram) - val result = store.createBillingProgramReportingDetails(program) + val result = store.createBillingProgramReportingDetails( + program, + developerBillingType?.let { OpenIapDeveloperBillingType.fromJson(it) } + ) GodotIapLog.result("createBillingProgramReportingDetailsAndroid", "token generated") JSONObject().apply { put("success", true) @@ -770,6 +838,98 @@ class GodotIap(godot: Godot) : GodotPlugin(godot) { } } + @UsedByGodot + fun showBillingProgramInformationDialogAndroid(paramsJson: String): String { + GodotIapLog.payload("showBillingProgramInformationDialogAndroid", paramsJson) + + if (!isInitialized) { + return JSONObject().apply { + put("success", false) + put("error", "Not initialized") + }.toString() + } + + val activity = activity ?: run { + return JSONObject().apply { + put("success", false) + put("error", "Activity not available") + }.toString() + } + + return runBlocking { + try { + val json = JSONObject(paramsJson) + val token = json.optString("externalTransactionToken", "") + val result = store.showBillingProgramInformationDialog( + activity, + BillingProgramInformationDialogParamsAndroid( + billingProgram = mapBillingProgram(json.optString("billingProgram", "billing-choice")), + externalTransactionToken = token + ) + ) + JSONObject().apply { + put("success", true) + put("responseCode", result.responseCode) + put("debugMessage", result.debugMessage) + put("subResponseCode", result.subResponseCode?.toJson()) + }.toString() + } catch (e: Exception) { + GodotIapLog.failure("showBillingProgramInformationDialogAndroid", e) + JSONObject().apply { + put("success", false) + put("error", e.message) + }.toString() + } + } + } + + @UsedByGodot + fun showInAppMessagesAndroid(paramsJson: String): String { + GodotIapLog.payload("showInAppMessagesAndroid", paramsJson) + + if (!isInitialized) { + return JSONObject().apply { + put("success", false) + put("error", "Not initialized") + }.toString() + } + + val activity = activity ?: run { + return JSONObject().apply { + put("success", false) + put("error", "Activity not available") + }.toString() + } + + return runBlocking { + try { + val json = JSONObject(paramsJson.ifBlank { "{}" }) + val categoriesJson = json.optJSONArray("categories") + val categories = categoriesJson?.let { array -> + (0 until array.length()).mapNotNull { index -> + array.optString(index, "").takeIf { it.isNotBlank() } + ?.let { InAppMessageCategoryAndroid.fromJson(it) } + } + } + val result = store.showInAppMessages( + activity, + InAppMessageParamsAndroid(categories = categories) + ) + JSONObject().apply { + put("success", true) + put("responseCode", result.responseCode.toJson()) + put("purchaseToken", result.purchaseToken) + }.toString() + } catch (e: Exception) { + GodotIapLog.failure("showInAppMessagesAndroid", e) + JSONObject().apply { + put("success", false) + put("error", e.message) + }.toString() + } + } + } + // ========================================== // Storefront & Deep Link // ========================================== @@ -1008,6 +1168,7 @@ class GodotIap(godot: Godot) : GodotPlugin(godot) { "external-content-link" -> OpenIapBillingProgram.ExternalContentLink "external-payments" -> OpenIapBillingProgram.ExternalPayments "user-choice-billing" -> OpenIapBillingProgram.UserChoiceBilling + "billing-choice" -> OpenIapBillingProgram.BillingChoice else -> OpenIapBillingProgram.Unspecified } diff --git a/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AlternativeBillingScreen.kt b/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AlternativeBillingScreen.kt index 1ab2480dd..0b342f602 100644 --- a/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AlternativeBillingScreen.kt +++ b/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AlternativeBillingScreen.kt @@ -179,6 +179,7 @@ fun AlternativeBillingScreen(navController: NavController) { purchaseResult = "✅ Reconnected with ${ when (program) { BillingProgramAndroid.UserChoiceBilling -> "User Choice Billing" + BillingProgramAndroid.BillingChoice -> "Billing Choice" BillingProgramAndroid.ExternalOffer -> "External Offer" BillingProgramAndroid.ExternalPayments -> "External Payments (Japan)" BillingProgramAndroid.ExternalContentLink -> "External Content Link" @@ -365,6 +366,7 @@ fun AlternativeBillingScreen(navController: NavController) { } else if (currentPlatform == "Android") { when (billingProgram) { BillingProgramAndroid.UserChoiceBilling -> handleAndroidUserChoiceBilling(product) + BillingProgramAndroid.BillingChoice, BillingProgramAndroid.ExternalOffer, BillingProgramAndroid.ExternalPayments, BillingProgramAndroid.ExternalContentLink -> handleAndroidBillingPrograms(product) @@ -533,6 +535,7 @@ fun AlternativeBillingScreen(navController: NavController) { isProcessing -> "Processing..." currentPlatform == "iOS" -> "🛒 Buy (External URL)" billingProgram == BillingProgramAndroid.UserChoiceBilling -> "🛒 Buy (User Choice)" + billingProgram == BillingProgramAndroid.BillingChoice -> "🛒 Buy (Billing Choice)" billingProgram == BillingProgramAndroid.ExternalOffer -> "🛒 Buy (External Offer)" billingProgram == BillingProgramAndroid.ExternalPayments -> "🛒 Buy (External Payments)" billingProgram == BillingProgramAndroid.ExternalContentLink -> "🛒 Buy (External Link)" @@ -588,6 +591,17 @@ fun AlternativeBillingScreen(navController: NavController) { } ) Spacer(modifier = Modifier.height(8.dp)) + ModeSelectorOption( + title = "Billing Choice (9.1.0+)", + description = "Use Google or developer-rendered billing choice screens.", + isSelected = billingProgram == BillingProgramAndroid.BillingChoice, + onClick = { + billingProgram = BillingProgramAndroid.BillingChoice + showModeSelector = false + reconnectWithProgram(BillingProgramAndroid.BillingChoice) + } + ) + Spacer(modifier = Modifier.height(8.dp)) ModeSelectorOption( title = "External Offer (8.2.0+)", description = "Launch an external offer and create reporting details.", @@ -683,6 +697,13 @@ private fun InfoCard(platform: String, billingProgram: BillingProgramAndroid) { • If Google Play: onPurchaseUpdated • If alternative: userChoiceBillingListener """.trimIndent() + BillingProgramAndroid.BillingChoice -> """ + • Billing Choice (9.1.0+) + • Get Google/developer-rendered choice metadata + • Show the required program information dialog + • Request reporting details with billing type + • Show Play billing in-app messages + """.trimIndent() BillingProgramAndroid.ExternalOffer -> """ • External Offer Mode (8.2.0+) • Users CANNOT use Google Play billing @@ -718,6 +739,11 @@ private fun InfoCard(platform: String, billingProgram: BillingProgramAndroid) { ⚠️ Requires approval from Google ⚠️ Must report tokens within 24 hours """.trimIndent() + BillingProgramAndroid.BillingChoice -> """ + ⚠️ Billing Library 9.1.0+ required + ⚠️ Requires Billing Choice enrollment + ⚠️ Availability depends on region and product + """.trimIndent() BillingProgramAndroid.ExternalOffer -> """ ⚠️ Billing Library 8.2.0+ required ⚠️ Requires approval from Google @@ -780,6 +806,7 @@ private fun ModeSelectorCard( Text( text = when (billingProgram) { BillingProgramAndroid.UserChoiceBilling -> "User Choice Billing (7.0+)" + BillingProgramAndroid.BillingChoice -> "Billing Choice (9.1.0+)" BillingProgramAndroid.ExternalOffer -> "External Offer (8.2.0+)" BillingProgramAndroid.ExternalPayments -> "External Payments (8.3.0+, Japan)" BillingProgramAndroid.ExternalContentLink -> "External Content Link (8.2.0+)" diff --git a/libraries/kmp-iap/library/build.gradle.kts b/libraries/kmp-iap/library/build.gradle.kts index a6cc54cf2..5adce7c10 100644 --- a/libraries/kmp-iap/library/build.gradle.kts +++ b/libraries/kmp-iap/library/build.gradle.kts @@ -339,7 +339,7 @@ android { } dependencies { - val playBillingVersion = "8.3.0" + val playBillingVersion = "9.1.0" add("playImplementation", "io.github.hyochan.openiap:openiap-google:$googleVersion") add("horizonImplementation", "io.github.hyochan.openiap:openiap-google-horizon:$googleVersion") add("amazonImplementation", "io.github.hyochan.openiap:openiap-google-amazon:$googleVersion") diff --git a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/AmazonInAppPurchaseAndroid.kt b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/AmazonInAppPurchaseAndroid.kt index 61c9d0a40..0b3d63943 100644 --- a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/AmazonInAppPurchaseAndroid.kt +++ b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/AmazonInAppPurchaseAndroid.kt @@ -16,8 +16,12 @@ import io.github.hyochan.kmpiap.openiap.ActiveSubscription import io.github.hyochan.kmpiap.openiap.AppTransaction import io.github.hyochan.kmpiap.openiap.BillingProgramAndroid import io.github.hyochan.kmpiap.openiap.BillingProgramAvailabilityResultAndroid +import io.github.hyochan.kmpiap.openiap.BillingChoiceInfoAndroid +import io.github.hyochan.kmpiap.openiap.BillingProgramInformationDialogParamsAndroid import io.github.hyochan.kmpiap.openiap.BillingProgramReportingDetailsAndroid +import io.github.hyochan.kmpiap.openiap.BillingResultAndroid import io.github.hyochan.kmpiap.openiap.DeepLinkOptions +import io.github.hyochan.kmpiap.openiap.DeveloperBillingTypeAndroid import io.github.hyochan.kmpiap.openiap.DeveloperProvidedBillingDetailsAndroid import io.github.hyochan.kmpiap.openiap.ErrorCode import io.github.hyochan.kmpiap.openiap.ExternalPurchaseCustomLinkNoticeResultIOS @@ -31,6 +35,10 @@ import io.github.hyochan.kmpiap.openiap.FetchProductsResultAll import io.github.hyochan.kmpiap.openiap.FetchProductsResultProducts import io.github.hyochan.kmpiap.openiap.FetchProductsResultSubscriptions import io.github.hyochan.kmpiap.openiap.InitConnectionConfig +import io.github.hyochan.kmpiap.openiap.GetBillingChoiceInfoParamsAndroid +import io.github.hyochan.kmpiap.openiap.InAppMessageParamsAndroid +import io.github.hyochan.kmpiap.openiap.InAppMessageResponseCodeAndroid +import io.github.hyochan.kmpiap.openiap.InAppMessageResultAndroid import io.github.hyochan.kmpiap.openiap.LaunchExternalLinkParamsAndroid import io.github.hyochan.kmpiap.openiap.Product import io.github.hyochan.kmpiap.openiap.ProductOrSubscription @@ -197,9 +205,21 @@ internal class AmazonInAppPurchaseAndroid( override suspend fun isBillingProgramAvailableAndroid(program: BillingProgramAndroid): BillingProgramAvailabilityResultAndroid = BillingProgramAvailabilityResultAndroid(billingProgram = program, isAvailable = false) - override suspend fun createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid): BillingProgramReportingDetailsAndroid = + override suspend fun getBillingChoiceInfoAndroid(params: GetBillingChoiceInfoParamsAndroid): BillingChoiceInfoAndroid = + failUnsupported("Amazon Appstore does not support Google Play Billing Choice.") + + override suspend fun createBillingProgramReportingDetailsAndroid( + program: BillingProgramAndroid, + developerBillingType: DeveloperBillingTypeAndroid? + ): BillingProgramReportingDetailsAndroid = failUnsupported("Amazon Appstore does not support Google Play billing programs.") + override suspend fun showBillingProgramInformationDialogAndroid(params: BillingProgramInformationDialogParamsAndroid): BillingResultAndroid = + failUnsupported("Amazon Appstore does not support Google Play Billing Choice.") + + override suspend fun showInAppMessagesAndroid(params: InAppMessageParamsAndroid?): InAppMessageResultAndroid = + InAppMessageResultAndroid(responseCode = InAppMessageResponseCodeAndroid.NoActionNeeded) + override suspend fun launchExternalLinkAndroid(params: LaunchExternalLinkParamsAndroid): Boolean = false override suspend fun checkAlternativeBillingAvailabilityAndroid(): Boolean = false override suspend fun showAlternativeBillingDialogAndroid(): Boolean = false diff --git a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/Helper.kt b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/Helper.kt index 4ce86137c..e9c0f25b9 100644 --- a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/Helper.kt +++ b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/Helper.kt @@ -701,6 +701,7 @@ internal fun BillingProgramAndroid.toOpenIapProgram(): OpenIapBillingProgram = w BillingProgramAndroid.ExternalContentLink -> OpenIapBillingProgram.ExternalContentLink BillingProgramAndroid.ExternalOffer -> OpenIapBillingProgram.ExternalOffer BillingProgramAndroid.ExternalPayments -> OpenIapBillingProgram.ExternalPayments + BillingProgramAndroid.BillingChoice -> OpenIapBillingProgram.BillingChoice BillingProgramAndroid.UserChoiceBilling -> OpenIapBillingProgram.UserChoiceBilling } diff --git a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt index f89bd048c..6e60d2cb8 100644 --- a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt +++ b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt @@ -86,14 +86,25 @@ import io.github.hyochan.kmpiap.openiap.PurchaseVerificationProvider import io.github.hyochan.kmpiap.openiap.RequestVerifyPurchaseWithIapkitResult import io.github.hyochan.kmpiap.openiap.IapStore import io.github.hyochan.kmpiap.openiap.IapkitPurchaseState +import io.github.hyochan.kmpiap.openiap.BillingChoiceImageLayoutAndroid +import io.github.hyochan.kmpiap.openiap.BillingChoiceInfoAndroid +import io.github.hyochan.kmpiap.openiap.BillingChoiceScreenTypeAndroid import io.github.hyochan.kmpiap.openiap.BillingProgramAndroid import io.github.hyochan.kmpiap.openiap.BillingProgramAvailabilityResultAndroid +import io.github.hyochan.kmpiap.openiap.BillingProgramInformationDialogParamsAndroid import io.github.hyochan.kmpiap.openiap.BillingProgramReportingDetailsAndroid +import io.github.hyochan.kmpiap.openiap.BillingResultAndroid import io.github.hyochan.kmpiap.openiap.DeveloperBillingLaunchModeAndroid import io.github.hyochan.kmpiap.openiap.DeveloperBillingOptionParamsAndroid +import io.github.hyochan.kmpiap.openiap.DeveloperBillingTypeAndroid import io.github.hyochan.kmpiap.openiap.DeveloperProvidedBillingDetailsAndroid import io.github.hyochan.kmpiap.openiap.ExternalLinkLaunchModeAndroid import io.github.hyochan.kmpiap.openiap.ExternalLinkTypeAndroid +import io.github.hyochan.kmpiap.openiap.GetBillingChoiceInfoParamsAndroid +import io.github.hyochan.kmpiap.openiap.InAppMessageCategoryAndroid +import io.github.hyochan.kmpiap.openiap.InAppMessageParamsAndroid +import io.github.hyochan.kmpiap.openiap.InAppMessageResponseCodeAndroid +import io.github.hyochan.kmpiap.openiap.InAppMessageResultAndroid import io.github.hyochan.kmpiap.openiap.LaunchExternalLinkParamsAndroid import io.github.hyochan.kmpiap.openiap.SubscriptionProductReplacementParamsAndroid import io.github.hyochan.kmpiap.openiap.SubscriptionReplacementModeAndroid @@ -261,10 +272,10 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife } } - // Enable billing program from config (8.2.0+, EXTERNAL_PAYMENTS requires 8.3.0+) + // Enable billing program from config (8.2.0+, EXTERNAL_PAYMENTS requires 8.3.0+, BILLING_CHOICE requires 9.1.0+) config?.enableBillingProgramAndroid?.let { program -> - if (program == BillingProgramAndroid.ExternalPayments) { - enableExternalPaymentsProgram(builder) + if (program == BillingProgramAndroid.ExternalPayments || program == BillingProgramAndroid.BillingChoice) { + enableDeveloperProvidedBillingProgram(builder, program) } else { enableBillingProgram(builder, program) } @@ -1104,6 +1115,65 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife // --------------------------------------------------------------------- // Android specific overrides // --------------------------------------------------------------------- + private fun billingProgramConstant(program: BillingProgramAndroid, operation: String): Int = + when (program) { + BillingProgramAndroid.ExternalContentLink -> 1 + BillingProgramAndroid.UserChoiceBilling -> 2 + BillingProgramAndroid.ExternalOffer -> 3 + BillingProgramAndroid.ExternalPayments -> 4 + BillingProgramAndroid.BillingChoice -> 5 + BillingProgramAndroid.Unspecified -> throw PurchaseException( + PurchaseError( + code = ErrorCode.DeveloperError, + message = "Cannot $operation with UNSPECIFIED program" + ) + ) + } + + private fun billingChoiceImageLayout(layout: BillingChoiceImageLayoutAndroid): String = + when (layout) { + BillingChoiceImageLayoutAndroid.RectangularFourByOne -> "RECTANGULAR_FOUR_BY_ONE" + BillingChoiceImageLayoutAndroid.RectangularThreeByOne -> "RECTANGULAR_THREE_BY_ONE" + BillingChoiceImageLayoutAndroid.RectangularTwoByTwo -> "RECTANGULAR_TWO_BY_TWO" + } + + private fun developerBillingTypeConstant( + program: BillingProgramAndroid, + developerBillingType: DeveloperBillingTypeAndroid? + ): Int? = + when (developerBillingType) { + DeveloperBillingTypeAndroid.InApp -> 1 + DeveloperBillingTypeAndroid.ExternalLink -> 2 + DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified, null -> + if (program == BillingProgramAndroid.BillingChoice) 1 else null + } + + private fun billingChoiceScreenTypeFromConstant(value: Int?): BillingChoiceScreenTypeAndroid? = + when (value) { + 1 -> BillingChoiceScreenTypeAndroid.DeveloperRendered + 2 -> BillingChoiceScreenTypeAndroid.GoogleRendered + 0 -> BillingChoiceScreenTypeAndroid.Unspecified + else -> null + } + + private fun inAppMessageCategoryConstant(category: InAppMessageCategoryAndroid): Int = + when (category) { + InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId -> 0 + InAppMessageCategoryAndroid.Transactional -> 2 + } + + private fun inAppMessageResponseCodeFromConstant(value: Int?): InAppMessageResponseCodeAndroid = + when (value) { + 1 -> InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated + else -> InAppMessageResponseCodeAndroid.NoActionNeeded + } + + private fun BillingResult.toBillingResultAndroid(): BillingResultAndroid = + BillingResultAndroid( + responseCode = responseCode, + debugMessage = debugMessage + ) + /** * Acknowledge a non-consumable purchase. Required within 3 days or Google auto-refunds. * @@ -1664,19 +1734,7 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife ) ) - // Convert our enum to BillingClient.BillingProgram constant - val billingProgramConstant = when (program) { - BillingProgramAndroid.UserChoiceBilling -> 2 // USER_CHOICE_BILLING (7.0+) - BillingProgramAndroid.ExternalContentLink -> 1 // EXTERNAL_CONTENT_LINK - BillingProgramAndroid.ExternalOffer -> 3 // EXTERNAL_OFFER - BillingProgramAndroid.ExternalPayments -> 4 // EXTERNAL_PAYMENTS (8.3.0+) - BillingProgramAndroid.Unspecified -> throw PurchaseException( - PurchaseError( - code = ErrorCode.DeveloperError, - message = "Cannot check availability for UNSPECIFIED program" - ) - ) - } + val billingProgramConstant = billingProgramConstant(program, "check availability") return suspendCancellableCoroutine { continuation -> try { @@ -1689,10 +1747,33 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife if (method.name == "onBillingProgramAvailabilityResponse") { val result = args?.get(0) as? BillingResult val isAvailable = result?.responseCode == BillingClient.BillingResponseCode.OK + val availabilityDetails = args?.getOrNull(1) + val choiceDetails = + if (program == BillingProgramAndroid.BillingChoice) { + runCatching { + availabilityDetails?.javaClass + ?.getMethod("getBillingChoiceAvailabilityDetails") + ?.invoke(availabilityDetails) + }.getOrNull() + } else { + null + } + val choiceScreenType = runCatching { + choiceDetails?.javaClass + ?.getMethod("getChoiceScreenType") + ?.invoke(choiceDetails) as? Int + }.getOrNull() + val isExternalLinkAvailable = runCatching { + choiceDetails?.javaClass + ?.getMethod("isExternalLinkAvailable") + ?.invoke(choiceDetails) as? Boolean + }.getOrNull() if (continuation.isActive) { continuation.resume(BillingProgramAvailabilityResultAndroid( billingProgram = program, - isAvailable = isAvailable + choiceScreenType = billingChoiceScreenTypeFromConstant(choiceScreenType), + isAvailable = isAvailable, + isExternalLinkAvailable = isExternalLinkAvailable )) } } @@ -1733,7 +1814,8 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife * @see https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ override suspend fun createBillingProgramReportingDetailsAndroid( - program: BillingProgramAndroid + program: BillingProgramAndroid, + developerBillingType: DeveloperBillingTypeAndroid? ): BillingProgramReportingDetailsAndroid { val client = billingClient ?: throw PurchaseException( PurchaseError( @@ -1742,21 +1824,20 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife ) ) - val billingProgramConstant = when (program) { - BillingProgramAndroid.UserChoiceBilling -> 2 - BillingProgramAndroid.ExternalContentLink -> 1 - BillingProgramAndroid.ExternalOffer -> 3 - BillingProgramAndroid.ExternalPayments -> 4 - BillingProgramAndroid.Unspecified -> throw PurchaseException( - PurchaseError( - code = ErrorCode.DeveloperError, - message = "Cannot create reporting details for UNSPECIFIED program" - ) - ) - } + val billingProgramConstant = billingProgramConstant(program, "create reporting details") return suspendCancellableCoroutine { continuation -> try { + val paramsClass = Class.forName("com.android.billingclient.api.BillingProgramReportingDetailsParams") + val builderClass = Class.forName("com.android.billingclient.api.BillingProgramReportingDetailsParams\$Builder") + val builder = paramsClass.getMethod("newBuilder").invoke(null) + builderClass.getMethod("setBillingProgram", Int::class.javaPrimitiveType) + .invoke(builder, billingProgramConstant) + developerBillingTypeConstant(program, developerBillingType)?.let { typeConstant -> + builderClass.getMethod("setDeveloperBillingType", Int::class.javaPrimitiveType) + .invoke(builder, typeConstant) + } + val requestParams = builderClass.getMethod("build").invoke(builder) val listenerClass = Class.forName("com.android.billingclient.api.BillingProgramReportingDetailsListener") val listener = java.lang.reflect.Proxy.newProxyInstance( listenerClass.classLoader, @@ -1808,10 +1889,10 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife val method = client.javaClass.getMethod( "createBillingProgramReportingDetailsAsync", - Int::class.javaPrimitiveType, + paramsClass, listenerClass ) - method.invoke(client, billingProgramConstant, listener) + method.invoke(client, requestParams, listener) } catch (e: NoSuchMethodException) { if (continuation.isActive) { continuation.resumeWithException(PurchaseException( @@ -1834,6 +1915,303 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife } } + override suspend fun getBillingChoiceInfoAndroid( + params: GetBillingChoiceInfoParamsAndroid + ): BillingChoiceInfoAndroid { + val client = billingClient ?: throw PurchaseException( + PurchaseError( + code = ErrorCode.NotPrepared, + message = "BillingClient not initialized" + ) + ) + val program = if (params.billingProgram == BillingProgramAndroid.Unspecified) { + BillingProgramAndroid.BillingChoice + } else { + params.billingProgram + } + if (program != BillingProgramAndroid.BillingChoice) { + throw PurchaseException( + PurchaseError( + code = ErrorCode.DeveloperError, + message = "getBillingChoiceInfoAndroid only supports BillingChoice" + ) + ) + } + + return suspendCancellableCoroutine { continuation -> + try { + val paramsClass = Class.forName("com.android.billingclient.api.GetBillingChoiceInfoParams") + val builderClass = Class.forName("com.android.billingclient.api.GetBillingChoiceInfoParams\$Builder") + val builder = paramsClass.getMethod("newBuilder").invoke(null) + builderClass.getMethod("setBillingProgram", Int::class.javaPrimitiveType) + .invoke(builder, billingProgramConstant(program, "get Billing Choice info")) + builderClass.getMethod("setPlayBillingChoiceImageLayout", String::class.java) + .invoke(builder, billingChoiceImageLayout(params.playBillingChoiceImageLayout)) + params.userLocale?.takeIf { it.isNotBlank() }?.let { languageTag -> + builderClass.getMethod("setUserLocale", java.util.Locale::class.java) + .invoke(builder, java.util.Locale.forLanguageTag(languageTag)) + } + val requestParams = builderClass.getMethod("build").invoke(builder) + val listenerClass = Class.forName("com.android.billingclient.api.BillingChoiceInfoResponseListener") + val listener = java.lang.reflect.Proxy.newProxyInstance( + listenerClass.classLoader, + arrayOf(listenerClass) + ) { _, method, args -> + if (method.name == "onBillingChoiceInfoResponse") { + val result = args?.get(0) as? BillingResult + val choiceInfo = args?.getOrNull(1) + if (result?.responseCode == BillingClient.BillingResponseCode.OK && choiceInfo != null) { + val imageUrl = choiceInfo.javaClass + .getMethod("getPlayBillingChoiceImageUrl") + .invoke(choiceInfo) as? String + val loyaltyInfo = choiceInfo.javaClass + .getMethod("getPlayBillingLoyaltyInfo") + .invoke(choiceInfo) as? String + if (imageUrl.isNullOrBlank()) { + if (continuation.isActive) { + continuation.resumeWithException(PurchaseException( + PurchaseError( + code = ErrorCode.Unknown, + message = "Missing Play Billing choice image URL" + ) + )) + } + } else if (continuation.isActive) { + continuation.resume(BillingChoiceInfoAndroid( + playBillingChoiceImageUrl = imageUrl, + playBillingLoyaltyInfo = loyaltyInfo + )) + } + } else if (continuation.isActive) { + continuation.resumeWithException(PurchaseException( + PurchaseError( + code = ErrorCode.Unknown, + message = "Billing Choice info failed: ${result?.debugMessage}" + ) + )) + } + } + null + } + client.javaClass.getMethod("getBillingChoiceInfoAsync", paramsClass, listenerClass) + .invoke(client, requestParams, listener) + } catch (e: NoSuchMethodException) { + if (continuation.isActive) { + continuation.resumeWithException(PurchaseException( + PurchaseError( + code = ErrorCode.FeatureNotSupported, + message = "getBillingChoiceInfoAsync requires Billing Library 9.1.0+" + ) + )) + } + } catch (e: ClassNotFoundException) { + if (continuation.isActive) { + continuation.resumeWithException(PurchaseException( + PurchaseError( + code = ErrorCode.FeatureNotSupported, + message = "GetBillingChoiceInfoParams requires Billing Library 9.1.0+" + ) + )) + } + } catch (e: Exception) { + if (continuation.isActive) { + continuation.resumeWithException(PurchaseException( + PurchaseError( + code = ErrorCode.Unknown, + message = "Failed to get Billing Choice info: ${e.message}" + ) + )) + } + } + } + } + + override suspend fun showBillingProgramInformationDialogAndroid( + params: BillingProgramInformationDialogParamsAndroid + ): BillingResultAndroid { + val client = billingClient ?: throw PurchaseException( + PurchaseError( + code = ErrorCode.NotPrepared, + message = "BillingClient not initialized" + ) + ) + val activity = currentActivity ?: throw PurchaseException( + PurchaseError( + code = ErrorCode.NotPrepared, + message = "Activity not available" + ) + ) + val program = if (params.billingProgram == BillingProgramAndroid.Unspecified) { + BillingProgramAndroid.BillingChoice + } else { + params.billingProgram + } + if (program != BillingProgramAndroid.BillingChoice) { + throw PurchaseException( + PurchaseError( + code = ErrorCode.DeveloperError, + message = "showBillingProgramInformationDialogAndroid only supports BillingChoice" + ) + ) + } + + return suspendCancellableCoroutine { continuation -> + try { + val paramsClass = Class.forName("com.android.billingclient.api.BillingProgramInformationDialogParams") + val builderClass = Class.forName("com.android.billingclient.api.BillingProgramInformationDialogParams\$Builder") + val builder = paramsClass.getMethod("newBuilder").invoke(null) + builderClass.getMethod("setBillingProgram", Int::class.javaPrimitiveType) + .invoke(builder, billingProgramConstant(program, "show Billing Choice information dialog")) + builderClass.getMethod("setExternalTransactionToken", String::class.java) + .invoke(builder, params.externalTransactionToken) + val requestParams = builderClass.getMethod("build").invoke(builder) + val listenerClass = Class.forName("com.android.billingclient.api.BillingProgramInformationDialogListener") + val listener = java.lang.reflect.Proxy.newProxyInstance( + listenerClass.classLoader, + arrayOf(listenerClass) + ) { _, method, args -> + if (method.name == "onBillingProgramInformationDialogResponse") { + val result = args?.get(0) as? BillingResult + if (continuation.isActive) { + continuation.resume( + result?.toBillingResultAndroid() + ?: BillingResultAndroid(responseCode = BillingClient.BillingResponseCode.ERROR) + ) + } + } + null + } + client.javaClass.getMethod( + "showBillingProgramInformationDialog", + Activity::class.java, + paramsClass, + listenerClass + ).invoke(client, activity, requestParams, listener) + } catch (e: NoSuchMethodException) { + if (continuation.isActive) { + continuation.resumeWithException(PurchaseException( + PurchaseError( + code = ErrorCode.FeatureNotSupported, + message = "showBillingProgramInformationDialog requires Billing Library 9.1.0+" + ) + )) + } + } catch (e: ClassNotFoundException) { + if (continuation.isActive) { + continuation.resumeWithException(PurchaseException( + PurchaseError( + code = ErrorCode.FeatureNotSupported, + message = "BillingProgramInformationDialogParams requires Billing Library 9.1.0+" + ) + )) + } + } catch (e: Exception) { + if (continuation.isActive) { + continuation.resumeWithException(PurchaseException( + PurchaseError( + code = ErrorCode.Unknown, + message = "Failed to show Billing Choice information dialog: ${e.message}" + ) + )) + } + } + } + } + + override suspend fun showInAppMessagesAndroid(params: InAppMessageParamsAndroid?): InAppMessageResultAndroid { + val client = billingClient ?: throw PurchaseException( + PurchaseError( + code = ErrorCode.NotPrepared, + message = "BillingClient not initialized" + ) + ) + val activity = currentActivity ?: throw PurchaseException( + PurchaseError( + code = ErrorCode.NotPrepared, + message = "Activity not available" + ) + ) + + return suspendCancellableCoroutine { continuation -> + try { + val paramsClass = Class.forName("com.android.billingclient.api.InAppMessageParams") + val builderClass = Class.forName("com.android.billingclient.api.InAppMessageParams\$Builder") + val builder = builderClass.getConstructor().newInstance() + val categories = params?.categories?.takeIf { it.isNotEmpty() } + ?: listOf(InAppMessageCategoryAndroid.Transactional) + for (category in categories) { + builderClass.getMethod("addInAppMessageCategoryToShow", Int::class.javaPrimitiveType) + .invoke(builder, inAppMessageCategoryConstant(category)) + } + val requestParams = builderClass.getMethod("build").invoke(builder) + val listenerClass = Class.forName("com.android.billingclient.api.InAppMessageResponseListener") + val listener = java.lang.reflect.Proxy.newProxyInstance( + listenerClass.classLoader, + arrayOf(listenerClass) + ) { _, method, args -> + if (method.name == "onInAppMessageResponse") { + val result = args?.get(0) + val responseCode = runCatching { + result?.javaClass?.getMethod("getResponseCode")?.invoke(result) as? Int + }.getOrNull() + val purchaseToken = runCatching { + result?.javaClass?.getMethod("getPurchaseToken")?.invoke(result) as? String + }.getOrNull() + if (continuation.isActive) { + continuation.resume(InAppMessageResultAndroid( + responseCode = inAppMessageResponseCodeFromConstant(responseCode), + purchaseToken = purchaseToken + )) + } + } + null + } + val submitResult = client.javaClass.getMethod( + "showInAppMessages", + Activity::class.java, + paramsClass, + listenerClass + ).invoke(client, activity, requestParams, listener) as? BillingResult + if (submitResult != null && + submitResult.responseCode != BillingClient.BillingResponseCode.OK && + continuation.isActive + ) { + continuation.resume(InAppMessageResultAndroid( + responseCode = InAppMessageResponseCodeAndroid.NoActionNeeded, + purchaseToken = null + )) + } + } catch (e: NoSuchMethodException) { + if (continuation.isActive) { + continuation.resumeWithException(PurchaseException( + PurchaseError( + code = ErrorCode.FeatureNotSupported, + message = "showInAppMessages requires Billing Library 4.1.0+" + ) + )) + } + } catch (e: ClassNotFoundException) { + if (continuation.isActive) { + continuation.resumeWithException(PurchaseException( + PurchaseError( + code = ErrorCode.FeatureNotSupported, + message = "InAppMessageParams requires Billing Library 4.1.0+" + ) + )) + } + } catch (e: Exception) { + if (continuation.isActive) { + continuation.resumeWithException(PurchaseException( + PurchaseError( + code = ErrorCode.Unknown, + message = "Failed to show in-app messages: ${e.message}" + ) + )) + } + } + } + } + /** * Launch an external content/offer link (Play Billing 8.2.0+). * @@ -1855,18 +2233,7 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife ) // Convert enums to BillingClient constants - val billingProgramConstant = when (params.billingProgram) { - BillingProgramAndroid.UserChoiceBilling -> 2 - BillingProgramAndroid.ExternalContentLink -> 1 - BillingProgramAndroid.ExternalOffer -> 3 - BillingProgramAndroid.ExternalPayments -> 4 - BillingProgramAndroid.Unspecified -> throw PurchaseException( - PurchaseError( - code = ErrorCode.DeveloperError, - message = "Cannot launch with UNSPECIFIED program" - ) - ) - } + val billingProgramConstant = billingProgramConstant(params.billingProgram, "launch") val launchModeConstant = when (params.launchMode) { ExternalLinkLaunchModeAndroid.LaunchInExternalBrowserOrApp -> 1 @@ -2005,18 +2372,20 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife * This sets up the DeveloperProvidedBillingListener to receive callbacks * when the user selects developer billing in the external payments flow. */ - private fun enableExternalPaymentsProgram(builder: BillingClient.Builder) { + private fun enableDeveloperProvidedBillingProgram( + builder: BillingClient.Builder, + program: BillingProgramAndroid + ) { try { // Get the EnableBillingProgramParams class val enableParamsClass = Class.forName("com.android.billingclient.api.EnableBillingProgramParams") val enableParamsBuilderClass = Class.forName("com.android.billingclient.api.EnableBillingProgramParams\$Builder") - // Create EnableBillingProgramParams for EXTERNAL_PAYMENTS (constant value 4) val newBuilderMethod = enableParamsClass.getMethod("newBuilder") val enableParamsBuilder = newBuilderMethod.invoke(null) val setBillingProgramMethod = enableParamsBuilderClass.getMethod("setBillingProgram", Int::class.javaPrimitiveType) - setBillingProgramMethod.invoke(enableParamsBuilder, 4) // EXTERNAL_PAYMENTS = 4 + setBillingProgramMethod.invoke(enableParamsBuilder, billingProgramConstant(program, "enable billing program")) // Create the DeveloperProvidedBillingListener proxy val listenerClass = Class.forName("com.android.billingclient.api.DeveloperProvidedBillingListener") @@ -2057,11 +2426,11 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife enableMethod.invoke(builder, enableParams) } catch (e: NoSuchMethodException) { - logWarning("External Payments requires Billing Library 8.3.0+") + logWarning("$program requires Billing Library support for developer-provided billing programs") } catch (e: ClassNotFoundException) { - logWarning("External Payments requires Billing Library 8.3.0+") + logWarning("$program requires Billing Library support for developer-provided billing programs") } catch (e: Exception) { - logError("Failed to enable External Payments program: ${e.message}", e) + logError("Failed to enable $program program: ${e.message}", e) } } @@ -2085,6 +2454,7 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife } BillingProgramAndroid.ExternalContentLink -> 1 BillingProgramAndroid.ExternalOffer -> 3 + BillingProgramAndroid.BillingChoice -> 5 BillingProgramAndroid.ExternalPayments -> { logWarning("ExternalPayments should use enableExternalPaymentsProgram()") return @@ -2122,6 +2492,7 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife val billingProgramConstant = when (option.billingProgram) { BillingProgramAndroid.UserChoiceBilling -> 2 BillingProgramAndroid.ExternalPayments -> 4 + BillingProgramAndroid.BillingChoice -> 5 BillingProgramAndroid.ExternalContentLink -> 1 BillingProgramAndroid.ExternalOffer -> 3 BillingProgramAndroid.Unspecified -> 0 diff --git a/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt b/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt index 538203070..d31318ed0 100644 --- a/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt +++ b/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt @@ -50,8 +50,75 @@ public enum class AlternativeBillingModeAndroid(val rawValue: String) { } /** - * Billing program types for external content links, external offers, and external payments (Android) - * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0 + * Play Billing choice image layout (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public enum class BillingChoiceImageLayoutAndroid(val rawValue: String) { + /** + * Rectangular image with a 4:1 aspect ratio. + */ + RectangularFourByOne("rectangular-four-by-one"), + /** + * Rectangular image with a 3:1 aspect ratio. + */ + RectangularThreeByOne("rectangular-three-by-one"), + /** + * Rectangular image with a 2:2 aspect ratio. + */ + RectangularTwoByTwo("rectangular-two-by-two"); + + companion object { + fun fromJson(value: String): BillingChoiceImageLayoutAndroid = when (value) { + "rectangular-four-by-one" -> BillingChoiceImageLayoutAndroid.RectangularFourByOne + "RECTANGULAR_FOUR_BY_ONE" -> BillingChoiceImageLayoutAndroid.RectangularFourByOne + "rectangular-three-by-one" -> BillingChoiceImageLayoutAndroid.RectangularThreeByOne + "RECTANGULAR_THREE_BY_ONE" -> BillingChoiceImageLayoutAndroid.RectangularThreeByOne + "rectangular-two-by-two" -> BillingChoiceImageLayoutAndroid.RectangularTwoByTwo + "RECTANGULAR_TWO_BY_TWO" -> BillingChoiceImageLayoutAndroid.RectangularTwoByTwo + else -> throw IllegalArgumentException("Unknown BillingChoiceImageLayoutAndroid value: $value") + } + } + + fun toJson(): String = rawValue +} + +/** + * Choice screen renderer for Billing Choice availability (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public enum class BillingChoiceScreenTypeAndroid(val rawValue: String) { + /** + * Unspecified choice screen type. + */ + Unspecified("unspecified"), + /** + * Choice screen is rendered by the developer app. + */ + DeveloperRendered("developer-rendered"), + /** + * Choice screen is rendered by Google Play. + */ + GoogleRendered("google-rendered"); + + companion object { + fun fromJson(value: String): BillingChoiceScreenTypeAndroid = when (value) { + "unspecified" -> BillingChoiceScreenTypeAndroid.Unspecified + "UNSPECIFIED" -> BillingChoiceScreenTypeAndroid.Unspecified + "developer-rendered" -> BillingChoiceScreenTypeAndroid.DeveloperRendered + "DEVELOPER_RENDERED" -> BillingChoiceScreenTypeAndroid.DeveloperRendered + "google-rendered" -> BillingChoiceScreenTypeAndroid.GoogleRendered + "GOOGLE_RENDERED" -> BillingChoiceScreenTypeAndroid.GoogleRendered + else -> throw IllegalArgumentException("Unknown BillingChoiceScreenTypeAndroid value: $value") + } + } + + fun toJson(): String = rawValue +} + +/** + * Billing program types for Google Play Billing Programs (Android) + * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, + * BILLING_CHOICE added in 9.1.0. */ public enum class BillingProgramAndroid(val rawValue: String) { /** @@ -82,7 +149,13 @@ public enum class BillingProgramAndroid(val rawValue: String) { * Users can choose to complete the purchase on the developer's website. * Available in Google Play Billing Library 8.3.0+ */ - ExternalPayments("external-payments"); + ExternalPayments("external-payments"), + /** + * Billing Choice program. + * Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. + * Available in Google Play Billing Library 9.1.0+ + */ + BillingChoice("billing-choice"); companion object { fun fromJson(value: String): BillingProgramAndroid = when (value) { @@ -96,6 +169,8 @@ public enum class BillingProgramAndroid(val rawValue: String) { "EXTERNAL_OFFER" -> BillingProgramAndroid.ExternalOffer "external-payments" -> BillingProgramAndroid.ExternalPayments "EXTERNAL_PAYMENTS" -> BillingProgramAndroid.ExternalPayments + "billing-choice" -> BillingProgramAndroid.BillingChoice + "BILLING_CHOICE" -> BillingProgramAndroid.BillingChoice else -> throw IllegalArgumentException("Unknown BillingProgramAndroid value: $value") } } @@ -139,6 +214,39 @@ public enum class DeveloperBillingLaunchModeAndroid(val rawValue: String) { fun toJson(): String = rawValue } +/** + * Developer-provided billing destination type for Billing Program reporting details (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public enum class DeveloperBillingTypeAndroid(val rawValue: String) { + /** + * Unspecified developer billing type. Do not use. + */ + DeveloperBillingTypeUnspecified("developer-billing-type-unspecified"), + /** + * Developer-provided billing via native in-app experience. + */ + InApp("in-app"), + /** + * Developer-provided billing via external link or embedded web browsing. + */ + ExternalLink("external-link"); + + companion object { + fun fromJson(value: String): DeveloperBillingTypeAndroid = when (value) { + "developer-billing-type-unspecified" -> DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified + "DEVELOPER_BILLING_TYPE_UNSPECIFIED" -> DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified + "in-app" -> DeveloperBillingTypeAndroid.InApp + "IN_APP" -> DeveloperBillingTypeAndroid.InApp + "external-link" -> DeveloperBillingTypeAndroid.ExternalLink + "EXTERNAL_LINK" -> DeveloperBillingTypeAndroid.ExternalLink + else -> throw IllegalArgumentException("Unknown DeveloperBillingTypeAndroid value: $value") + } + } + + fun toJson(): String = rawValue +} + /** * Discount offer type enumeration. * Categorizes the type of discount or promotional offer. @@ -656,6 +764,60 @@ public enum class IapStore(val rawValue: String) { fun toJson(): String = rawValue } +/** + * High-level in-app message category (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +public enum class InAppMessageCategoryAndroid(val rawValue: String) { + /** + * Unknown in-app message category. + */ + UnknownInAppMessageCategoryId("unknown-in-app-message-category-id"), + /** + * Transactional billing messages, such as payment issues or pending price-change confirmations. + */ + Transactional("transactional"); + + companion object { + fun fromJson(value: String): InAppMessageCategoryAndroid = when (value) { + "unknown-in-app-message-category-id" -> InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId + "UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID" -> InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId + "transactional" -> InAppMessageCategoryAndroid.Transactional + "TRANSACTIONAL" -> InAppMessageCategoryAndroid.Transactional + else -> throw IllegalArgumentException("Unknown InAppMessageCategoryAndroid value: $value") + } + } + + fun toJson(): String = rawValue +} + +/** + * Response code from Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +public enum class InAppMessageResponseCodeAndroid(val rawValue: String) { + /** + * Flow finished and no developer action is needed. + */ + NoActionNeeded("no-action-needed"), + /** + * Subscription status changed and the purchase token should be checked. + */ + SubscriptionStatusUpdated("subscription-status-updated"); + + companion object { + fun fromJson(value: String): InAppMessageResponseCodeAndroid = when (value) { + "no-action-needed" -> InAppMessageResponseCodeAndroid.NoActionNeeded + "NO_ACTION_NEEDED" -> InAppMessageResponseCodeAndroid.NoActionNeeded + "subscription-status-updated" -> InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated + "SUBSCRIPTION_STATUS_UPDATED" -> InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated + else -> throw IllegalArgumentException("Unknown InAppMessageResponseCodeAndroid value: $value") + } + } + + fun toJson(): String = rawValue +} + /** * Payment mode for subscription offers. * Determines how the user pays during the offer period. @@ -1704,6 +1866,37 @@ public data class AppTransaction( ) } +/** + * Display information for developer-rendered Billing Choice screens (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public data class BillingChoiceInfoAndroid( + /** + * URL for the Play Billing choice image matching the requested layout. + */ + val playBillingChoiceImageUrl: String, + /** + * Play Loyalty information for the user. + */ + val playBillingLoyaltyInfo: String? = null +) { + + companion object { + fun fromJson(json: Map): BillingChoiceInfoAndroid { + return BillingChoiceInfoAndroid( + playBillingChoiceImageUrl = json["playBillingChoiceImageUrl"] as? String ?: "", + playBillingLoyaltyInfo = json["playBillingLoyaltyInfo"] as? String, + ) + } + } + + fun toJson(): Map = mapOf( + "__typename" to "BillingChoiceInfoAndroid", + "playBillingChoiceImageUrl" to playBillingChoiceImageUrl, + "playBillingLoyaltyInfo" to playBillingLoyaltyInfo, + ) +} + /** * Result of checking billing program availability (Android) * Available in Google Play Billing Library 8.2.0+ @@ -1713,17 +1906,28 @@ public data class BillingProgramAvailabilityResultAndroid( * The billing program that was checked */ val billingProgram: BillingProgramAndroid, + /** + * Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + */ + val choiceScreenType: BillingChoiceScreenTypeAndroid? = null, /** * Whether the billing program is available for the user */ - val isAvailable: Boolean + val isAvailable: Boolean, + /** + * Whether external-link payment is available for Billing Choice. + * Populated only for available BILLING_CHOICE results. + */ + val isExternalLinkAvailable: Boolean? = null ) { companion object { fun fromJson(json: Map): BillingProgramAvailabilityResultAndroid { return BillingProgramAvailabilityResultAndroid( billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified, + choiceScreenType = (json["choiceScreenType"] as? String)?.let { BillingChoiceScreenTypeAndroid.fromJson(it) }, isAvailable = json["isAvailable"] as? Boolean ?: false, + isExternalLinkAvailable = json["isExternalLinkAvailable"] as? Boolean, ) } } @@ -1731,7 +1935,9 @@ public data class BillingProgramAvailabilityResultAndroid( fun toJson(): Map = mapOf( "__typename" to "BillingProgramAvailabilityResultAndroid", "billingProgram" to billingProgram.toJson(), + "choiceScreenType" to choiceScreenType?.toJson(), "isAvailable" to isAvailable, + "isExternalLinkAvailable" to isExternalLinkAvailable, ) } @@ -2338,6 +2544,37 @@ public data class FetchProductsResultProducts(val value: List?) : Fetch public data class FetchProductsResultSubscriptions(val value: List?) : FetchProductsResult +/** + * Result from showing Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +public data class InAppMessageResultAndroid( + /** + * Purchase token returned when a subscription status changed. + */ + val purchaseToken: String? = null, + /** + * Response code for the in-app messaging flow. + */ + val responseCode: InAppMessageResponseCodeAndroid +) { + + companion object { + fun fromJson(json: Map): InAppMessageResultAndroid { + return InAppMessageResultAndroid( + purchaseToken = json["purchaseToken"] as? String, + responseCode = (json["responseCode"] as? String)?.let { InAppMessageResponseCodeAndroid.fromJson(it) } ?: InAppMessageResponseCodeAndroid.NoActionNeeded, + ) + } + } + + fun toJson(): Map = mapOf( + "__typename" to "InAppMessageResultAndroid", + "purchaseToken" to purchaseToken, + "responseCode" to responseCode.toJson(), + ) +} + /** * Installment plan details for subscription offers (Android) * Contains information about the installment plan commitment. @@ -4322,6 +4559,38 @@ public data class AndroidSubscriptionOfferInput( ) } +/** + * Parameters for showing a billing program information dialog (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public data class BillingProgramInformationDialogParamsAndroid( + /** + * Billing program. Currently only BILLING_CHOICE is supported. + */ + val billingProgram: BillingProgramAndroid, + /** + * External transaction token returned by the Billing Choice reporting-details flow. + */ + val externalTransactionToken: String +) { + companion object { + fun fromJson(json: Map): BillingProgramInformationDialogParamsAndroid? { + val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified + val externalTransactionToken = json["externalTransactionToken"] as? String + if (externalTransactionToken == null) return null + return BillingProgramInformationDialogParamsAndroid( + billingProgram = billingProgram, + externalTransactionToken = externalTransactionToken, + ) + } + } + + fun toJson(): Map = mapOf( + "billingProgram" to billingProgram.toJson(), + "externalTransactionToken" to externalTransactionToken, + ) +} + public data class DeepLinkOptions( /** * Android package name to target (required on Android) @@ -4436,6 +4705,67 @@ public data class DiscountOfferInputIOS( ) } +/** + * Parameters for fetching Billing Choice display information (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public data class GetBillingChoiceInfoParamsAndroid( + /** + * Billing program. Currently only BILLING_CHOICE is supported. + */ + val billingProgram: BillingProgramAndroid, + /** + * Desired Play Billing choice image layout. + */ + val playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid, + /** + * BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. + */ + val userLocale: String? = null +) { + companion object { + fun fromJson(json: Map): GetBillingChoiceInfoParamsAndroid? { + val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified + val playBillingChoiceImageLayout = (json["playBillingChoiceImageLayout"] as? String)?.let { BillingChoiceImageLayoutAndroid.fromJson(it) } ?: BillingChoiceImageLayoutAndroid.RectangularFourByOne + val userLocale = json["userLocale"] as? String + return GetBillingChoiceInfoParamsAndroid( + billingProgram = billingProgram, + playBillingChoiceImageLayout = playBillingChoiceImageLayout, + userLocale = userLocale, + ) + } + } + + fun toJson(): Map = mapOf( + "billingProgram" to billingProgram.toJson(), + "playBillingChoiceImageLayout" to playBillingChoiceImageLayout.toJson(), + "userLocale" to userLocale, + ) +} + +/** + * Parameters for showing Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +public data class InAppMessageParamsAndroid( + /** + * In-app message categories to show. Defaults to transactional messages. + */ + val categories: List? = null +) { + companion object { + fun fromJson(json: Map): InAppMessageParamsAndroid { + return InAppMessageParamsAndroid( + categories = (json["categories"] as? List<*>)?.mapNotNull { (it as? String)?.let { InAppMessageCategoryAndroid.fromJson(it) } ?: InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId }, + ) + } + } + + fun toJson(): Map = mapOf( + "categories" to categories?.map { it.toJson() }, + ) +} + /** * Connection initialization configuration */ @@ -5533,7 +5863,6 @@ public interface MutationResolver { suspend fun beginRefundRequestIOS(sku: String): String? /** * Check whether alternative billing is available for the user. Step 1 of the alternative billing flow. - * * Returns true if available, false otherwise. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/check-alternative-billing-availability-android @@ -5553,7 +5882,6 @@ public interface MutationResolver { * Create a reporting token for an alternative billing flow. Step 3 of the alternative billing flow. * Must be called AFTER successful payment in your payment system. * Token must be reported to Google Play backend within 24 hours. - * * Returns token string, or null if creation failed. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-alternative-billing-token-android @@ -5562,12 +5890,11 @@ public interface MutationResolver { /** * Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). * Replaces the deprecated createExternalOfferReportingDetailsAsync API. - * * Returns external transaction token needed for reporting external transactions. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ - suspend fun createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid): BillingProgramReportingDetailsAndroid + suspend fun createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid, developerBillingType: DeveloperBillingTypeAndroid? = null): BillingProgramReportingDetailsAndroid /** * Open the platform's subscription management UI. * See: https://openiap.dev/docs/apis/deep-link-to-subscriptions @@ -5591,7 +5918,6 @@ public interface MutationResolver { /** * Check whether a billing program (e.g., External Payments) is available for the current user. * Replaces the deprecated isExternalOfferAvailableAsync API. - * * Available in Google Play Billing Library 8.2.0+. * Returns availability result with isAvailable flag. * Throws OpenIapError.NotPrepared if billing client not ready. @@ -5601,7 +5927,6 @@ public interface MutationResolver { /** * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). * Replaces the deprecated showExternalOfferInformationDialog API. - * * Shows Play Store dialog and optionally launches external URL. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/launch-external-link-android @@ -5646,12 +5971,18 @@ public interface MutationResolver { /** * Display Google's alternative billing information dialog. Step 2 of the alternative billing flow. * Must be called BEFORE processing payment in your payment system. - * * Returns true if user accepted, false if user canceled. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android */ suspend fun showAlternativeBillingDialogAndroid(): Boolean + /** + * Show Google's information dialog for a Billing Choice external transaction. + * Available in Google Play Billing Library 9.1.0+. + * Throws OpenIapError.NotPrepared if billing client not ready. + * See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android + */ + suspend fun showBillingProgramInformationDialogAndroid(params: BillingProgramInformationDialogParamsAndroid): BillingResultAndroid /** * Present the disclosure sheet required before linking out via ExternalPurchaseCustomLink (iOS 18.1+). * Call this after a deliberate customer interaction before linking out to external purchases. @@ -5659,6 +5990,14 @@ public interface MutationResolver { * See: https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios */ suspend fun showExternalPurchaseCustomLinkNoticeIOS(noticeType: ExternalPurchaseCustomLinkNoticeTypeIOS): ExternalPurchaseCustomLinkNoticeResultIOS + /** + * Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. + * Available in Google Play Billing Library 4.1.0+. + * Returns a response code and, when the subscription status changes, the related purchase token. + * Throws OpenIapError.NotPrepared if billing client not ready. + * See: https://openiap.dev/docs/apis/android/show-in-app-messages-android + */ + suspend fun showInAppMessagesAndroid(params: InAppMessageParamsAndroid? = null): InAppMessageResultAndroid /** * Present the manage-subscriptions sheet and return changed purchases (iOS 15+). * See: https://openiap.dev/docs/apis/ios/show-manage-subscriptions-ios @@ -5735,6 +6074,13 @@ public interface QueryResolver { * See: https://openiap.dev/docs/apis/get-available-purchases */ suspend fun getAvailablePurchases(options: PurchaseOptions? = null): List + /** + * Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. + * Available in Google Play Billing Library 9.1.0+. + * Throws OpenIapError.NotPrepared if billing client is not ready. + * See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android + */ + suspend fun getBillingChoiceInfoAndroid(params: GetBillingChoiceInfoParamsAndroid): BillingChoiceInfoAndroid /** * Fetch a token for Apple's External Purchase Server reporting API (iOS 18.1+). * Use this token to report transactions made through ExternalPurchaseCustomLink. @@ -5869,7 +6215,7 @@ public typealias MutationCheckAlternativeBillingAvailabilityAndroidHandler = sus public typealias MutationClearTransactionIOSHandler = suspend () -> Boolean public typealias MutationConsumePurchaseAndroidHandler = suspend (purchaseToken: String) -> Boolean public typealias MutationCreateAlternativeBillingTokenAndroidHandler = suspend () -> String? -public typealias MutationCreateBillingProgramReportingDetailsAndroidHandler = suspend (program: BillingProgramAndroid) -> BillingProgramReportingDetailsAndroid +public typealias MutationCreateBillingProgramReportingDetailsAndroidHandler = suspend (program: BillingProgramAndroid, developerBillingType: DeveloperBillingTypeAndroid?) -> BillingProgramReportingDetailsAndroid public typealias MutationDeepLinkToSubscriptionsHandler = suspend (options: DeepLinkOptions?) -> Unit public typealias MutationEndConnectionHandler = suspend () -> Boolean public typealias MutationFinishTransactionHandler = suspend (purchase: PurchaseInput, isConsumable: Boolean?) -> Unit @@ -5883,7 +6229,9 @@ public typealias MutationRequestPurchaseHandler = suspend (params: RequestPurcha public typealias MutationRequestPurchaseOnPromotedProductIOSHandler = suspend () -> Boolean public typealias MutationRestorePurchasesHandler = suspend () -> Unit public typealias MutationShowAlternativeBillingDialogAndroidHandler = suspend () -> Boolean +public typealias MutationShowBillingProgramInformationDialogAndroidHandler = suspend (params: BillingProgramInformationDialogParamsAndroid) -> BillingResultAndroid public typealias MutationShowExternalPurchaseCustomLinkNoticeIOSHandler = suspend (noticeType: ExternalPurchaseCustomLinkNoticeTypeIOS) -> ExternalPurchaseCustomLinkNoticeResultIOS +public typealias MutationShowInAppMessagesAndroidHandler = suspend (params: InAppMessageParamsAndroid?) -> InAppMessageResultAndroid public typealias MutationShowManageSubscriptionsIOSHandler = suspend () -> List public typealias MutationSyncIOSHandler = suspend () -> Boolean public typealias MutationValidateReceiptHandler = suspend (options: VerifyPurchaseProps) -> VerifyPurchaseResult @@ -5911,7 +6259,9 @@ public data class MutationHandlers( val requestPurchaseOnPromotedProductIOS: MutationRequestPurchaseOnPromotedProductIOSHandler? = null, val restorePurchases: MutationRestorePurchasesHandler? = null, val showAlternativeBillingDialogAndroid: MutationShowAlternativeBillingDialogAndroidHandler? = null, + val showBillingProgramInformationDialogAndroid: MutationShowBillingProgramInformationDialogAndroidHandler? = null, val showExternalPurchaseCustomLinkNoticeIOS: MutationShowExternalPurchaseCustomLinkNoticeIOSHandler? = null, + val showInAppMessagesAndroid: MutationShowInAppMessagesAndroidHandler? = null, val showManageSubscriptionsIOS: MutationShowManageSubscriptionsIOSHandler? = null, val syncIOS: MutationSyncIOSHandler? = null, val validateReceipt: MutationValidateReceiptHandler? = null, @@ -5928,6 +6278,7 @@ public typealias QueryGetActiveSubscriptionsHandler = suspend (subscriptionIds: public typealias QueryGetAllTransactionsIOSHandler = suspend () -> List public typealias QueryGetAppTransactionIOSHandler = suspend () -> AppTransaction? public typealias QueryGetAvailablePurchasesHandler = suspend (options: PurchaseOptions?) -> List +public typealias QueryGetBillingChoiceInfoAndroidHandler = suspend (params: GetBillingChoiceInfoParamsAndroid) -> BillingChoiceInfoAndroid public typealias QueryGetExternalPurchaseCustomLinkTokenIOSHandler = suspend (tokenType: ExternalPurchaseCustomLinkTokenTypeIOS) -> ExternalPurchaseCustomLinkTokenResultIOS public typealias QueryGetPendingTransactionsIOSHandler = suspend () -> List public typealias QueryGetPromotedProductIOSHandler = suspend () -> ProductIOS? @@ -5951,6 +6302,7 @@ public data class QueryHandlers( val getAllTransactionsIOS: QueryGetAllTransactionsIOSHandler? = null, val getAppTransactionIOS: QueryGetAppTransactionIOSHandler? = null, val getAvailablePurchases: QueryGetAvailablePurchasesHandler? = null, + val getBillingChoiceInfoAndroid: QueryGetBillingChoiceInfoAndroidHandler? = null, val getExternalPurchaseCustomLinkTokenIOS: QueryGetExternalPurchaseCustomLinkTokenIOSHandler? = null, val getPendingTransactionsIOS: QueryGetPendingTransactionsIOSHandler? = null, val getPromotedProductIOS: QueryGetPromotedProductIOSHandler? = null, diff --git a/libraries/kmp-iap/library/src/iosMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseIOS.kt b/libraries/kmp-iap/library/src/iosMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseIOS.kt index 9f6cb81a4..de13a2eb2 100644 --- a/libraries/kmp-iap/library/src/iosMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseIOS.kt +++ b/libraries/kmp-iap/library/src/iosMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseIOS.kt @@ -1657,10 +1657,25 @@ internal class InAppPurchaseIOS : KmpInAppPurchase { * * @see https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ - override suspend fun createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid): BillingProgramReportingDetailsAndroid { + override suspend fun getBillingChoiceInfoAndroid(params: GetBillingChoiceInfoParamsAndroid): BillingChoiceInfoAndroid { + throw UnsupportedOperationException("getBillingChoiceInfoAndroid is only available on Android") + } + + override suspend fun createBillingProgramReportingDetailsAndroid( + program: BillingProgramAndroid, + developerBillingType: DeveloperBillingTypeAndroid? + ): BillingProgramReportingDetailsAndroid { throw UnsupportedOperationException("createBillingProgramReportingDetailsAndroid is only available on Android") } + override suspend fun showBillingProgramInformationDialogAndroid(params: BillingProgramInformationDialogParamsAndroid): BillingResultAndroid { + throw UnsupportedOperationException("showBillingProgramInformationDialogAndroid is only available on Android") + } + + override suspend fun showInAppMessagesAndroid(params: InAppMessageParamsAndroid?): InAppMessageResultAndroid { + throw UnsupportedOperationException("showInAppMessagesAndroid is only available on Android") + } + /** * Launch an external content/offer link (Play Billing 8.2.0+). * diff --git a/libraries/maui-iap/android/openiap/src/main/java/dev/hyo/openiap/maui/OpenIapMauiModule.kt b/libraries/maui-iap/android/openiap/src/main/java/dev/hyo/openiap/maui/OpenIapMauiModule.kt index 38c5c013b..363b2957d 100644 --- a/libraries/maui-iap/android/openiap/src/main/java/dev/hyo/openiap/maui/OpenIapMauiModule.kt +++ b/libraries/maui-iap/android/openiap/src/main/java/dev/hyo/openiap/maui/OpenIapMauiModule.kt @@ -6,13 +6,17 @@ import android.app.Activity import android.content.Context import com.google.gson.Gson import dev.hyo.openiap.AlternativeBillingMode +import dev.hyo.openiap.BillingProgramInformationDialogParamsAndroid import dev.hyo.openiap.BillingProgramAndroid import dev.hyo.openiap.DeepLinkOptions +import dev.hyo.openiap.DeveloperBillingTypeAndroid import dev.hyo.openiap.FetchProductsResult import dev.hyo.openiap.FetchProductsResultAll import dev.hyo.openiap.FetchProductsResultProducts import dev.hyo.openiap.FetchProductsResultSubscriptions import dev.hyo.openiap.InitConnectionConfig +import dev.hyo.openiap.GetBillingChoiceInfoParamsAndroid +import dev.hyo.openiap.InAppMessageParamsAndroid import dev.hyo.openiap.LaunchExternalLinkParamsAndroid import dev.hyo.openiap.OpenIapError import dev.hyo.openiap.OpenIapModule @@ -217,11 +221,41 @@ class OpenIapMauiModule(context: Context) { gson.toJson(module.isBillingProgramAvailable(program).toJson()) } + fun getBillingChoiceInfoAndroid(paramsJson: String, callback: ResultCallback) = run(callback) { + val params = GetBillingChoiceInfoParamsAndroid.fromJson(parseMap(paramsJson)) + ?: throw badInput("GetBillingChoiceInfoParamsAndroid") + gson.toJson(module.getBillingChoiceInfo(params).toJson()) + } + fun createBillingProgramReportingDetailsAndroid(programJson: String, callback: ResultCallback) = run(callback) { val program = parseProgram(programJson) gson.toJson(module.createBillingProgramReportingDetails(program).toJson()) } + fun createBillingProgramReportingDetailsAndroidWithType( + programJson: String, + developerBillingTypeJson: String?, + callback: ResultCallback + ) = run(callback) { + val program = parseProgram(programJson) + val developerBillingType = + developerBillingTypeJson?.let { DeveloperBillingTypeAndroid.fromJson(it) } + gson.toJson(module.createBillingProgramReportingDetails(program, developerBillingType).toJson()) + } + + fun showBillingProgramInformationDialogAndroid(paramsJson: String, callback: ResultCallback) = run(callback) { + val params = BillingProgramInformationDialogParamsAndroid.fromJson(parseMap(paramsJson)) + ?: throw badInput("BillingProgramInformationDialogParamsAndroid") + val activity = currentActivityOrThrow("showBillingProgramInformationDialogAndroid") + gson.toJson(module.showBillingProgramInformationDialog(activity, params).toJson()) + } + + fun showInAppMessagesAndroid(paramsJson: String?, callback: ResultCallback) = run(callback) { + val params = paramsJson?.let { InAppMessageParamsAndroid.fromJson(parseMap(it)) } + val activity = currentActivityOrThrow("showInAppMessagesAndroid") + gson.toJson(module.showInAppMessages(activity, params).toJson()) + } + fun launchExternalLinkAndroid(paramsJson: String, callback: ResultCallback) = run(callback) { val params = LaunchExternalLinkParamsAndroid.fromJson(parseMap(paramsJson)) ?: throw badInput("LaunchExternalLinkParamsAndroid") diff --git a/libraries/maui-iap/src/Directory.Build.props b/libraries/maui-iap/src/Directory.Build.props index faefd256f..e89076802 100644 --- a/libraries/maui-iap/src/Directory.Build.props +++ b/libraries/maui-iap/src/Directory.Build.props @@ -1,18 +1,18 @@ - 8.3.0 + 9.1.0 3.0.8 77.0.1 1.1.1 2.10.1 - 8.3.0.2 + 9.1.0.1 2.14.0 - 1.12.4.1 - 1.8.9.2 - 2.10.0.2 - 1.4.0.2 - 2.3.10.1 - 1.10.2.3 + 1.13.0.1 + 1.8.9.4 + 2.11.0.1 + 1.5.0.1 + 2.4.0.1 + 1.11.0.1 diff --git a/libraries/maui-iap/src/OpenIap.Maui/Platforms/Android/OpenIapAndroid.Resolvers.cs b/libraries/maui-iap/src/OpenIap.Maui/Platforms/Android/OpenIapAndroid.Resolvers.cs index 7d4654ed9..e6de0fa21 100644 --- a/libraries/maui-iap/src/OpenIap.Maui/Platforms/Android/OpenIapAndroid.Resolvers.cs +++ b/libraries/maui-iap/src/OpenIap.Maui/Platforms/Android/OpenIapAndroid.Resolvers.cs @@ -119,14 +119,44 @@ public async Task IsBillingProgramAvail ?? throw OpenIapErrorMapper.Wrap(ErrorCode.Unknown, "Empty isBillingProgramAvailable result"); } - public async Task CreateBillingProgramReportingDetailsAndroidAsync(BillingProgramAndroid program) + public async Task GetBillingChoiceInfoAndroidAsync(GetBillingChoiceInfoParamsAndroid @params) + { + var json = JsonSerializer.Serialize(@params, JsonOptions.Default); + var result = await Invoke(cb => _module.GetBillingChoiceInfoAndroid(json, cb)); + return JsonSerializer.Deserialize(result, JsonOptions.Default) + ?? throw OpenIapErrorMapper.Wrap(ErrorCode.Unknown, "Empty getBillingChoiceInfo result"); + } + + public async Task CreateBillingProgramReportingDetailsAndroidAsync( + BillingProgramAndroid program, + DeveloperBillingTypeAndroid? developerBillingType = null) { var json = JsonSerializer.Serialize(program, JsonOptions.Default); - var result = await Invoke(cb => _module.CreateBillingProgramReportingDetailsAndroid(json, cb)); + var result = developerBillingType is null + ? await Invoke(cb => _module.CreateBillingProgramReportingDetailsAndroid(json, cb)) + : await Invoke(cb => _module.CreateBillingProgramReportingDetailsAndroidWithType(json, developerBillingType.Value.ToJson(), cb)); return JsonSerializer.Deserialize(result, JsonOptions.Default) ?? throw OpenIapErrorMapper.Wrap(ErrorCode.Unknown, "Empty createBillingProgramReportingDetails result"); } + public async Task ShowBillingProgramInformationDialogAndroidAsync(BillingProgramInformationDialogParamsAndroid @params) + { + RefreshCurrentActivity(); + var json = JsonSerializer.Serialize(@params, JsonOptions.Default); + var result = await Invoke(cb => _module.ShowBillingProgramInformationDialogAndroid(json, cb)); + return JsonSerializer.Deserialize(result, JsonOptions.Default) + ?? throw OpenIapErrorMapper.Wrap(ErrorCode.Unknown, "Empty showBillingProgramInformationDialog result"); + } + + public async Task ShowInAppMessagesAndroidAsync(InAppMessageParamsAndroid? @params = null) + { + RefreshCurrentActivity(); + var json = @params is null ? null : JsonSerializer.Serialize(@params, JsonOptions.Default); + var result = await Invoke(cb => _module.ShowInAppMessagesAndroid(json, cb)); + return JsonSerializer.Deserialize(result, JsonOptions.Default) + ?? throw OpenIapErrorMapper.Wrap(ErrorCode.Unknown, "Empty showInAppMessages result"); + } + public Task LaunchExternalLinkAndroidAsync(LaunchExternalLinkParamsAndroid @params) { RefreshCurrentActivity(); diff --git a/libraries/maui-iap/src/OpenIap.Maui/Platforms/iOS/OpenIapIOS.cs b/libraries/maui-iap/src/OpenIap.Maui/Platforms/iOS/OpenIapIOS.cs index ddd239bb8..c6b7d26e0 100644 --- a/libraries/maui-iap/src/OpenIap.Maui/Platforms/iOS/OpenIapIOS.cs +++ b/libraries/maui-iap/src/OpenIap.Maui/Platforms/iOS/OpenIapIOS.cs @@ -432,7 +432,10 @@ public Task ShowExternalPurchaseCusto public Task CreateAlternativeBillingTokenAndroidAsync() => Task.FromResult(null); public Task ShowAlternativeBillingDialogAndroidAsync() => Task.FromResult(false); public Task IsBillingProgramAvailableAndroidAsync(BillingProgramAndroid program) => NotSupportedAndroid("isBillingProgramAvailableAndroid"); - public Task CreateBillingProgramReportingDetailsAndroidAsync(BillingProgramAndroid program) => NotSupportedAndroid("createBillingProgramReportingDetailsAndroid"); + public Task GetBillingChoiceInfoAndroidAsync(GetBillingChoiceInfoParamsAndroid @params) => NotSupportedAndroid("getBillingChoiceInfoAndroid"); + public Task CreateBillingProgramReportingDetailsAndroidAsync(BillingProgramAndroid program, DeveloperBillingTypeAndroid? developerBillingType = null) => NotSupportedAndroid("createBillingProgramReportingDetailsAndroid"); + public Task ShowBillingProgramInformationDialogAndroidAsync(BillingProgramInformationDialogParamsAndroid @params) => NotSupportedAndroid("showBillingProgramInformationDialogAndroid"); + public Task ShowInAppMessagesAndroidAsync(InAppMessageParamsAndroid? @params = null) => NotSupportedAndroid("showInAppMessagesAndroid"); public Task LaunchExternalLinkAndroidAsync(LaunchExternalLinkParamsAndroid @params) => Task.FromResult(false); // ==================================================================== diff --git a/libraries/maui-iap/src/OpenIap.Maui/Types.cs b/libraries/maui-iap/src/OpenIap.Maui/Types.cs index d35ad4222..e04ac493d 100644 --- a/libraries/maui-iap/src/OpenIap.Maui/Types.cs +++ b/libraries/maui-iap/src/OpenIap.Maui/Types.cs @@ -78,8 +78,119 @@ public static class AlternativeBillingModeAndroidExtensions public static AlternativeBillingModeAndroid FromJson(string value) => AlternativeBillingModeAndroidJsonConverter.FromRawString(value); } -/// Billing program types for external content links, external offers, and external payments (Android) -/// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0 +/// Play Billing choice image layout (Android) +/// Available in Google Play Billing Library 9.1.0+ +[JsonConverter(typeof(BillingChoiceImageLayoutAndroidJsonConverter))] +public enum BillingChoiceImageLayoutAndroid +{ + /// Rectangular image with a 4:1 aspect ratio. + RectangularFourByOne, + /// Rectangular image with a 3:1 aspect ratio. + RectangularThreeByOne, + /// Rectangular image with a 2:2 aspect ratio. + RectangularTwoByTwo +} + +public sealed class BillingChoiceImageLayoutAndroidJsonConverter : JsonConverter +{ + private static readonly Dictionary _fromString = new() + { + ["rectangular-four-by-one"] = BillingChoiceImageLayoutAndroid.RectangularFourByOne, + ["RECTANGULAR_FOUR_BY_ONE"] = BillingChoiceImageLayoutAndroid.RectangularFourByOne, + ["rectangular-three-by-one"] = BillingChoiceImageLayoutAndroid.RectangularThreeByOne, + ["RECTANGULAR_THREE_BY_ONE"] = BillingChoiceImageLayoutAndroid.RectangularThreeByOne, + ["rectangular-two-by-two"] = BillingChoiceImageLayoutAndroid.RectangularTwoByTwo, + ["RECTANGULAR_TWO_BY_TWO"] = BillingChoiceImageLayoutAndroid.RectangularTwoByTwo, + }; + + private static readonly Dictionary _toString = new() + { + [BillingChoiceImageLayoutAndroid.RectangularFourByOne] = "rectangular-four-by-one", + [BillingChoiceImageLayoutAndroid.RectangularThreeByOne] = "rectangular-three-by-one", + [BillingChoiceImageLayoutAndroid.RectangularTwoByTwo] = "rectangular-two-by-two", + }; + + public override BillingChoiceImageLayoutAndroid Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var raw = reader.GetString(); + if (raw is not null && _fromString.TryGetValue(raw, out var value)) return value; + throw new JsonException($"Unknown BillingChoiceImageLayoutAndroid value: {raw}"); + } + + public override void Write(Utf8JsonWriter writer, BillingChoiceImageLayoutAndroid value, JsonSerializerOptions options) + { + writer.WriteStringValue(_toString[value]); + } + + internal static string ToRawString(BillingChoiceImageLayoutAndroid value) => _toString[value]; + internal static BillingChoiceImageLayoutAndroid FromRawString(string value) => + _fromString.TryGetValue(value, out var v) ? v : throw new ArgumentException($"Unknown BillingChoiceImageLayoutAndroid value: {value}"); +} + +public static class BillingChoiceImageLayoutAndroidExtensions +{ + public static string ToJson(this BillingChoiceImageLayoutAndroid value) => BillingChoiceImageLayoutAndroidJsonConverter.ToRawString(value); + public static BillingChoiceImageLayoutAndroid FromJson(string value) => BillingChoiceImageLayoutAndroidJsonConverter.FromRawString(value); +} + +/// Choice screen renderer for Billing Choice availability (Android) +/// Available in Google Play Billing Library 9.1.0+ +[JsonConverter(typeof(BillingChoiceScreenTypeAndroidJsonConverter))] +public enum BillingChoiceScreenTypeAndroid +{ + /// Unspecified choice screen type. + Unspecified, + /// Choice screen is rendered by the developer app. + DeveloperRendered, + /// Choice screen is rendered by Google Play. + GoogleRendered +} + +public sealed class BillingChoiceScreenTypeAndroidJsonConverter : JsonConverter +{ + private static readonly Dictionary _fromString = new() + { + ["unspecified"] = BillingChoiceScreenTypeAndroid.Unspecified, + ["UNSPECIFIED"] = BillingChoiceScreenTypeAndroid.Unspecified, + ["developer-rendered"] = BillingChoiceScreenTypeAndroid.DeveloperRendered, + ["DEVELOPER_RENDERED"] = BillingChoiceScreenTypeAndroid.DeveloperRendered, + ["google-rendered"] = BillingChoiceScreenTypeAndroid.GoogleRendered, + ["GOOGLE_RENDERED"] = BillingChoiceScreenTypeAndroid.GoogleRendered, + }; + + private static readonly Dictionary _toString = new() + { + [BillingChoiceScreenTypeAndroid.Unspecified] = "unspecified", + [BillingChoiceScreenTypeAndroid.DeveloperRendered] = "developer-rendered", + [BillingChoiceScreenTypeAndroid.GoogleRendered] = "google-rendered", + }; + + public override BillingChoiceScreenTypeAndroid Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var raw = reader.GetString(); + if (raw is not null && _fromString.TryGetValue(raw, out var value)) return value; + throw new JsonException($"Unknown BillingChoiceScreenTypeAndroid value: {raw}"); + } + + public override void Write(Utf8JsonWriter writer, BillingChoiceScreenTypeAndroid value, JsonSerializerOptions options) + { + writer.WriteStringValue(_toString[value]); + } + + internal static string ToRawString(BillingChoiceScreenTypeAndroid value) => _toString[value]; + internal static BillingChoiceScreenTypeAndroid FromRawString(string value) => + _fromString.TryGetValue(value, out var v) ? v : throw new ArgumentException($"Unknown BillingChoiceScreenTypeAndroid value: {value}"); +} + +public static class BillingChoiceScreenTypeAndroidExtensions +{ + public static string ToJson(this BillingChoiceScreenTypeAndroid value) => BillingChoiceScreenTypeAndroidJsonConverter.ToRawString(value); + public static BillingChoiceScreenTypeAndroid FromJson(string value) => BillingChoiceScreenTypeAndroidJsonConverter.FromRawString(value); +} + +/// Billing program types for Google Play Billing Programs (Android) +/// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, +/// BILLING_CHOICE added in 9.1.0. [JsonConverter(typeof(BillingProgramAndroidJsonConverter))] public enum BillingProgramAndroid { @@ -101,7 +212,11 @@ public enum BillingProgramAndroid /// Allows presenting a side-by-side choice between Google Play Billing and developer's external payment option. /// Users can choose to complete the purchase on the developer's website. /// Available in Google Play Billing Library 8.3.0+ - ExternalPayments + ExternalPayments, + /// Billing Choice program. + /// Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. + /// Available in Google Play Billing Library 9.1.0+ + BillingChoice } public sealed class BillingProgramAndroidJsonConverter : JsonConverter @@ -118,6 +233,8 @@ public sealed class BillingProgramAndroidJsonConverter : JsonConverter _toString = new() @@ -127,6 +244,7 @@ public sealed class BillingProgramAndroidJsonConverter : JsonConverter DeveloperBillingLaunchModeAndroidJsonConverter.FromRawString(value); } +/// Developer-provided billing destination type for Billing Program reporting details (Android) +/// Available in Google Play Billing Library 9.1.0+ +[JsonConverter(typeof(DeveloperBillingTypeAndroidJsonConverter))] +public enum DeveloperBillingTypeAndroid +{ + /// Unspecified developer billing type. Do not use. + DeveloperBillingTypeUnspecified, + /// Developer-provided billing via native in-app experience. + InApp, + /// Developer-provided billing via external link or embedded web browsing. + ExternalLink +} + +public sealed class DeveloperBillingTypeAndroidJsonConverter : JsonConverter +{ + private static readonly Dictionary _fromString = new() + { + ["developer-billing-type-unspecified"] = DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified, + ["DEVELOPER_BILLING_TYPE_UNSPECIFIED"] = DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified, + ["in-app"] = DeveloperBillingTypeAndroid.InApp, + ["IN_APP"] = DeveloperBillingTypeAndroid.InApp, + ["external-link"] = DeveloperBillingTypeAndroid.ExternalLink, + ["EXTERNAL_LINK"] = DeveloperBillingTypeAndroid.ExternalLink, + }; + + private static readonly Dictionary _toString = new() + { + [DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified] = "developer-billing-type-unspecified", + [DeveloperBillingTypeAndroid.InApp] = "in-app", + [DeveloperBillingTypeAndroid.ExternalLink] = "external-link", + }; + + public override DeveloperBillingTypeAndroid Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var raw = reader.GetString(); + if (raw is not null && _fromString.TryGetValue(raw, out var value)) return value; + throw new JsonException($"Unknown DeveloperBillingTypeAndroid value: {raw}"); + } + + public override void Write(Utf8JsonWriter writer, DeveloperBillingTypeAndroid value, JsonSerializerOptions options) + { + writer.WriteStringValue(_toString[value]); + } + + internal static string ToRawString(DeveloperBillingTypeAndroid value) => _toString[value]; + internal static DeveloperBillingTypeAndroid FromRawString(string value) => + _fromString.TryGetValue(value, out var v) ? v : throw new ArgumentException($"Unknown DeveloperBillingTypeAndroid value: {value}"); +} + +public static class DeveloperBillingTypeAndroidExtensions +{ + public static string ToJson(this DeveloperBillingTypeAndroid value) => DeveloperBillingTypeAndroidJsonConverter.ToRawString(value); + public static DeveloperBillingTypeAndroid FromJson(string value) => DeveloperBillingTypeAndroidJsonConverter.FromRawString(value); +} + /// Discount offer type enumeration. /// Categorizes the type of discount or promotional offer. [JsonConverter(typeof(DiscountOfferTypeJsonConverter))] @@ -1035,6 +1208,106 @@ public static class IapStoreExtensions public static IapStore FromJson(string value) => IapStoreJsonConverter.FromRawString(value); } +/// High-level in-app message category (Android) +/// Available in Google Play Billing Library 4.1.0+ +[JsonConverter(typeof(InAppMessageCategoryAndroidJsonConverter))] +public enum InAppMessageCategoryAndroid +{ + /// Unknown in-app message category. + UnknownInAppMessageCategoryId, + /// Transactional billing messages, such as payment issues or pending price-change confirmations. + Transactional +} + +public sealed class InAppMessageCategoryAndroidJsonConverter : JsonConverter +{ + private static readonly Dictionary _fromString = new() + { + ["unknown-in-app-message-category-id"] = InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId, + ["UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID"] = InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId, + ["transactional"] = InAppMessageCategoryAndroid.Transactional, + ["TRANSACTIONAL"] = InAppMessageCategoryAndroid.Transactional, + }; + + private static readonly Dictionary _toString = new() + { + [InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId] = "unknown-in-app-message-category-id", + [InAppMessageCategoryAndroid.Transactional] = "transactional", + }; + + public override InAppMessageCategoryAndroid Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var raw = reader.GetString(); + if (raw is not null && _fromString.TryGetValue(raw, out var value)) return value; + throw new JsonException($"Unknown InAppMessageCategoryAndroid value: {raw}"); + } + + public override void Write(Utf8JsonWriter writer, InAppMessageCategoryAndroid value, JsonSerializerOptions options) + { + writer.WriteStringValue(_toString[value]); + } + + internal static string ToRawString(InAppMessageCategoryAndroid value) => _toString[value]; + internal static InAppMessageCategoryAndroid FromRawString(string value) => + _fromString.TryGetValue(value, out var v) ? v : throw new ArgumentException($"Unknown InAppMessageCategoryAndroid value: {value}"); +} + +public static class InAppMessageCategoryAndroidExtensions +{ + public static string ToJson(this InAppMessageCategoryAndroid value) => InAppMessageCategoryAndroidJsonConverter.ToRawString(value); + public static InAppMessageCategoryAndroid FromJson(string value) => InAppMessageCategoryAndroidJsonConverter.FromRawString(value); +} + +/// Response code from Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +[JsonConverter(typeof(InAppMessageResponseCodeAndroidJsonConverter))] +public enum InAppMessageResponseCodeAndroid +{ + /// Flow finished and no developer action is needed. + NoActionNeeded, + /// Subscription status changed and the purchase token should be checked. + SubscriptionStatusUpdated +} + +public sealed class InAppMessageResponseCodeAndroidJsonConverter : JsonConverter +{ + private static readonly Dictionary _fromString = new() + { + ["no-action-needed"] = InAppMessageResponseCodeAndroid.NoActionNeeded, + ["NO_ACTION_NEEDED"] = InAppMessageResponseCodeAndroid.NoActionNeeded, + ["subscription-status-updated"] = InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated, + ["SUBSCRIPTION_STATUS_UPDATED"] = InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated, + }; + + private static readonly Dictionary _toString = new() + { + [InAppMessageResponseCodeAndroid.NoActionNeeded] = "no-action-needed", + [InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated] = "subscription-status-updated", + }; + + public override InAppMessageResponseCodeAndroid Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var raw = reader.GetString(); + if (raw is not null && _fromString.TryGetValue(raw, out var value)) return value; + throw new JsonException($"Unknown InAppMessageResponseCodeAndroid value: {raw}"); + } + + public override void Write(Utf8JsonWriter writer, InAppMessageResponseCodeAndroid value, JsonSerializerOptions options) + { + writer.WriteStringValue(_toString[value]); + } + + internal static string ToRawString(InAppMessageResponseCodeAndroid value) => _toString[value]; + internal static InAppMessageResponseCodeAndroid FromRawString(string value) => + _fromString.TryGetValue(value, out var v) ? v : throw new ArgumentException($"Unknown InAppMessageResponseCodeAndroid value: {value}"); +} + +public static class InAppMessageResponseCodeAndroidExtensions +{ + public static string ToJson(this InAppMessageResponseCodeAndroid value) => InAppMessageResponseCodeAndroidJsonConverter.ToRawString(value); + public static InAppMessageResponseCodeAndroid FromJson(string value) => InAppMessageResponseCodeAndroidJsonConverter.FromRawString(value); +} + /// Payment mode for subscription offers. /// Determines how the user pays during the offer period. [JsonConverter(typeof(PaymentModeJsonConverter))] @@ -2479,6 +2752,18 @@ public sealed record AppTransaction public required double SignedDate { get; init; } } +/// Display information for developer-rendered Billing Choice screens (Android) +/// Available in Google Play Billing Library 9.1.0+ +public sealed record BillingChoiceInfoAndroid +{ + /// URL for the Play Billing choice image matching the requested layout. + [JsonPropertyName("playBillingChoiceImageUrl")] + public required string PlayBillingChoiceImageUrl { get; init; } + /// Play Loyalty information for the user. + [JsonPropertyName("playBillingLoyaltyInfo")] + public string? PlayBillingLoyaltyInfo { get; init; } +} + /// Result of checking billing program availability (Android) /// Available in Google Play Billing Library 8.2.0+ public sealed record BillingProgramAvailabilityResultAndroid @@ -2486,9 +2771,16 @@ public sealed record BillingProgramAvailabilityResultAndroid /// The billing program that was checked [JsonPropertyName("billingProgram")] public required BillingProgramAndroid BillingProgram { get; init; } + /// Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + [JsonPropertyName("choiceScreenType")] + public BillingChoiceScreenTypeAndroid? ChoiceScreenType { get; init; } /// Whether the billing program is available for the user [JsonPropertyName("isAvailable")] public required bool IsAvailable { get; init; } + /// Whether external-link payment is available for Billing Choice. + /// Populated only for available BILLING_CHOICE results. + [JsonPropertyName("isExternalLinkAvailable")] + public bool? IsExternalLinkAvailable { get; init; } } /// Reporting details for transactions made outside of Google Play Billing (Android) @@ -2764,6 +3056,18 @@ public sealed record FetchProductsResultProducts(IReadOnlyList? Value) public sealed record FetchProductsResultSubscriptions(IReadOnlyList? Value) : FetchProductsResult; +/// Result from showing Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +public sealed record InAppMessageResultAndroid +{ + /// Purchase token returned when a subscription status changed. + [JsonPropertyName("purchaseToken")] + public string? PurchaseToken { get; init; } + /// Response code for the in-app messaging flow. + [JsonPropertyName("responseCode")] + public required InAppMessageResponseCodeAndroid ResponseCode { get; init; } +} + /// Installment plan details for subscription offers (Android) /// Contains information about the installment plan commitment. /// Available in Google Play Billing Library 7.0+ @@ -3774,6 +4078,18 @@ public sealed record AndroidSubscriptionOfferInput public required string OfferToken { get; init; } } +/// Parameters for showing a billing program information dialog (Android) +/// Available in Google Play Billing Library 9.1.0+ +public sealed record BillingProgramInformationDialogParamsAndroid +{ + /// Billing program. Currently only BILLING_CHOICE is supported. + [JsonPropertyName("billingProgram")] + public required BillingProgramAndroid BillingProgram { get; init; } + /// External transaction token returned by the Billing Choice reporting-details flow. + [JsonPropertyName("externalTransactionToken")] + public required string ExternalTransactionToken { get; init; } +} + public sealed record DeepLinkOptions { /// Android SKU to open (required on Android) @@ -3819,6 +4135,30 @@ public sealed record DiscountOfferInputIOS public required double Timestamp { get; init; } } +/// Parameters for fetching Billing Choice display information (Android) +/// Available in Google Play Billing Library 9.1.0+ +public sealed record GetBillingChoiceInfoParamsAndroid +{ + /// Billing program. Currently only BILLING_CHOICE is supported. + [JsonPropertyName("billingProgram")] + public required BillingProgramAndroid BillingProgram { get; init; } + /// Desired Play Billing choice image layout. + [JsonPropertyName("playBillingChoiceImageLayout")] + public required BillingChoiceImageLayoutAndroid PlayBillingChoiceImageLayout { get; init; } + /// BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. + [JsonPropertyName("userLocale")] + public string? UserLocale { get; init; } +} + +/// Parameters for showing Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +public sealed record InAppMessageParamsAndroid +{ + /// In-app message categories to show. Defaults to transactional messages. + [JsonPropertyName("categories")] + public IReadOnlyList? Categories { get; init; } +} + /// Connection initialization configuration public sealed record InitConnectionConfig { @@ -4270,7 +4610,6 @@ public interface MutationResolver Task BeginRefundRequestIOSAsync(string sku); /// Check whether alternative billing is available for the user. Step 1 of the alternative billing flow. - /// /// Returns true if available, false otherwise. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/check-alternative-billing-availability-android @@ -4287,7 +4626,6 @@ public interface MutationResolver /// Create a reporting token for an alternative billing flow. Step 3 of the alternative billing flow. /// Must be called AFTER successful payment in your payment system. /// Token must be reported to Google Play backend within 24 hours. - /// /// Returns token string, or null if creation failed. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-alternative-billing-token-android @@ -4295,11 +4633,10 @@ public interface MutationResolver /// Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). /// Replaces the deprecated createExternalOfferReportingDetailsAsync API. - /// /// Returns external transaction token needed for reporting external transactions. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android - Task CreateBillingProgramReportingDetailsAndroidAsync(BillingProgramAndroid program); + Task CreateBillingProgramReportingDetailsAndroidAsync(BillingProgramAndroid program, DeveloperBillingTypeAndroid? developerBillingType = null); /// Open the platform's subscription management UI. /// See: https://openiap.dev/docs/apis/deep-link-to-subscriptions @@ -4319,7 +4656,6 @@ public interface MutationResolver /// Check whether a billing program (e.g., External Payments) is available for the current user. /// Replaces the deprecated isExternalOfferAvailableAsync API. - /// /// Available in Google Play Billing Library 8.2.0+. /// Returns availability result with isAvailable flag. /// Throws OpenIapError.NotPrepared if billing client not ready. @@ -4328,7 +4664,6 @@ public interface MutationResolver /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). /// Replaces the deprecated showExternalOfferInformationDialog API. - /// /// Shows Play Store dialog and optionally launches external URL. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/launch-external-link-android @@ -4366,18 +4701,30 @@ public interface MutationResolver /// Display Google's alternative billing information dialog. Step 2 of the alternative billing flow. /// Must be called BEFORE processing payment in your payment system. - /// /// Returns true if user accepted, false if user canceled. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android Task ShowAlternativeBillingDialogAndroidAsync(); + /// Show Google's information dialog for a Billing Choice external transaction. + /// Available in Google Play Billing Library 9.1.0+. + /// Throws OpenIapError.NotPrepared if billing client not ready. + /// See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android + Task ShowBillingProgramInformationDialogAndroidAsync(BillingProgramInformationDialogParamsAndroid @params); + /// Present the disclosure sheet required before linking out via ExternalPurchaseCustomLink (iOS 18.1+). /// Call this after a deliberate customer interaction before linking out to external purchases. /// Reference: https://developer.apple.com/documentation/storekit/externalpurchasecustomlink/shownotice(type:) /// See: https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios Task ShowExternalPurchaseCustomLinkNoticeIOSAsync(ExternalPurchaseCustomLinkNoticeTypeIOS noticeType); + /// Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. + /// Available in Google Play Billing Library 4.1.0+. + /// Returns a response code and, when the subscription status changes, the related purchase token. + /// Throws OpenIapError.NotPrepared if billing client not ready. + /// See: https://openiap.dev/docs/apis/android/show-in-app-messages-android + Task ShowInAppMessagesAndroidAsync(InAppMessageParamsAndroid? @params = null); + /// Present the manage-subscriptions sheet and return changed purchases (iOS 15+). /// See: https://openiap.dev/docs/apis/ios/show-manage-subscriptions-ios Task> ShowManageSubscriptionsIOSAsync(); @@ -4440,6 +4787,12 @@ public interface QueryResolver /// See: https://openiap.dev/docs/apis/get-available-purchases Task> GetAvailablePurchasesAsync(PurchaseOptions? options = null); + /// Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. + /// Available in Google Play Billing Library 9.1.0+. + /// Throws OpenIapError.NotPrepared if billing client is not ready. + /// See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android + Task GetBillingChoiceInfoAndroidAsync(GetBillingChoiceInfoParamsAndroid @params); + /// Fetch a token for Apple's External Purchase Server reporting API (iOS 18.1+). /// Use this token to report transactions made through ExternalPurchaseCustomLink. /// Reference: https://developer.apple.com/documentation/storekit/externalpurchasecustomlink/token(for:) diff --git a/libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt b/libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt index 67b117aae..6d22cfbce 100644 --- a/libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt +++ b/libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt @@ -37,7 +37,15 @@ import dev.hyo.openiap.InitConnectionConfig as OpenIapInitConnectionConfig import dev.hyo.openiap.listener.OpenIapPurchaseErrorListener import dev.hyo.openiap.listener.OpenIapPurchaseUpdateListener import dev.hyo.openiap.listener.OpenIapUserChoiceBillingListener +import dev.hyo.openiap.BillingChoiceImageLayoutAndroid as OpenIapBillingChoiceImageLayout +import dev.hyo.openiap.BillingChoiceScreenTypeAndroid as OpenIapBillingChoiceScreenType +import dev.hyo.openiap.BillingProgramInformationDialogParamsAndroid as OpenIapBillingProgramInformationDialogParams import dev.hyo.openiap.BillingProgramAndroid as OpenIapBillingProgramAndroid +import dev.hyo.openiap.DeveloperBillingTypeAndroid as OpenIapDeveloperBillingType +import dev.hyo.openiap.GetBillingChoiceInfoParamsAndroid as OpenIapGetBillingChoiceInfoParams +import dev.hyo.openiap.InAppMessageCategoryAndroid as OpenIapInAppMessageCategory +import dev.hyo.openiap.InAppMessageParamsAndroid as OpenIapInAppMessageParams +import dev.hyo.openiap.InAppMessageResponseCodeAndroid as OpenIapInAppMessageResponseCode import dev.hyo.openiap.LaunchExternalLinkParamsAndroid as OpenIapLaunchExternalLinkParams import dev.hyo.openiap.ExternalLinkLaunchModeAndroid as OpenIapExternalLinkLaunchMode import dev.hyo.openiap.ExternalLinkTypeAndroid as OpenIapExternalLinkType @@ -1652,7 +1660,9 @@ class HybridRnIap : HybridRnIapSpec() { val result = openIapStore.isBillingProgramAvailable(openIapProgram) val nitroResult = NitroBillingProgramAvailabilityResultAndroid( billingProgram = program, - isAvailable = result.isAvailable + choiceScreenType = result.choiceScreenType?.let { mapBillingChoiceScreenType(it) }, + isAvailable = result.isAvailable, + isExternalLinkAvailable = result.isExternalLinkAvailable.wrapVariant() ) RnIapLog.result("isBillingProgramAvailableAndroid", mapOf("isAvailable" to result.isAvailable)) nitroResult @@ -1664,13 +1674,52 @@ class HybridRnIap : HybridRnIapSpec() { } } - override fun createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid): Promise { + override fun getBillingChoiceInfoAndroid(params: NitroGetBillingChoiceInfoParamsAndroid): Promise { return Promise.async { - RnIapLog.payload("createBillingProgramReportingDetailsAndroid", mapOf("program" to program.name)) + RnIapLog.payload("getBillingChoiceInfoAndroid", mapOf( + "billingProgram" to params.billingProgram.name, + "playBillingChoiceImageLayout" to params.playBillingChoiceImageLayout.name, + "userLocale" to params.userLocale.unwrapString() + )) + try { + ensureConnection() + val result = openIapStore.getBillingChoiceInfo( + OpenIapGetBillingChoiceInfoParams( + billingProgram = mapBillingProgram(params.billingProgram), + playBillingChoiceImageLayout = mapBillingChoiceImageLayout(params.playBillingChoiceImageLayout), + userLocale = params.userLocale.unwrapString() + ) + ) + val nitroResult = NitroBillingChoiceInfoAndroid( + playBillingChoiceImageUrl = result.playBillingChoiceImageUrl, + playBillingLoyaltyInfo = result.playBillingLoyaltyInfo.wrapVariant() + ) + RnIapLog.result("getBillingChoiceInfoAndroid", mapOf("hasImageUrl" to result.playBillingChoiceImageUrl.isNotBlank())) + nitroResult + } catch (err: Throwable) { + RnIapLog.failure("getBillingChoiceInfoAndroid", err) + val errorType = parseOpenIapError(err) + throw OpenIapException(toErrorJson(errorType, debugMessage = err.message)) + } + } + } + + override fun createBillingProgramReportingDetailsAndroid( + program: BillingProgramAndroid, + developerBillingType: DeveloperBillingTypeAndroid? + ): Promise { + return Promise.async { + RnIapLog.payload( + "createBillingProgramReportingDetailsAndroid", + mapOf("program" to program.name, "developerBillingType" to developerBillingType?.name) + ) try { ensureConnection() val openIapProgram = mapBillingProgram(program) - val result = openIapStore.createBillingProgramReportingDetails(openIapProgram) + val result = openIapStore.createBillingProgramReportingDetails( + openIapProgram, + mapDeveloperBillingType(developerBillingType) + ) val nitroResult = NitroBillingProgramReportingDetailsAndroid( billingProgram = program, externalTransactionToken = result.externalTransactionToken @@ -1685,6 +1734,73 @@ class HybridRnIap : HybridRnIapSpec() { } } + override fun showBillingProgramInformationDialogAndroid( + params: NitroBillingProgramInformationDialogParamsAndroid + ): Promise { + return Promise.async { + RnIapLog.payload("showBillingProgramInformationDialogAndroid", mapOf("program" to params.billingProgram.name)) + try { + ensureConnection() + val activity = withContext(Dispatchers.Main) { + runCatching { context.currentActivity }.getOrNull() + } ?: throw OpenIapException(toErrorJson(OpenIapError.DeveloperError(), debugMessage = "Activity not available")) + val result = withContext(Dispatchers.Main) { + openIapStore.showBillingProgramInformationDialog( + activity, + OpenIapBillingProgramInformationDialogParams( + billingProgram = mapBillingProgram(params.billingProgram), + externalTransactionToken = params.externalTransactionToken + ) + ) + } + RnIapLog.result("showBillingProgramInformationDialogAndroid", mapOf("responseCode" to result.responseCode)) + NitroBillingResultAndroid( + responseCode = result.responseCode.toDouble(), + debugMessage = result.debugMessage.wrapVariant() + ) + } catch (err: Throwable) { + RnIapLog.failure("showBillingProgramInformationDialogAndroid", err) + val errorType = parseOpenIapError(err) + throw OpenIapException(toErrorJson(errorType, debugMessage = err.message)) + } + } + } + + override fun showInAppMessagesAndroid( + params: Variant_NullType_NitroInAppMessageParamsAndroid? + ): Promise { + return Promise.async { + val messageParams = params?.asSecondOrNull() + val categories = messageParams?.categories?.asSecondOrNull() + RnIapLog.payload("showInAppMessagesAndroid", mapOf("categories" to categories?.map { it.name })) + try { + ensureConnection() + val activity = withContext(Dispatchers.Main) { + runCatching { context.currentActivity }.getOrNull() + } ?: throw OpenIapException(toErrorJson(OpenIapError.DeveloperError(), debugMessage = "Activity not available")) + val result = withContext(Dispatchers.Main) { + openIapStore.showInAppMessages( + activity, + messageParams?.let { + OpenIapInAppMessageParams( + categories = categories?.map { category -> mapInAppMessageCategory(category) } + ) + } + ) + } + RnIapLog.result("showInAppMessagesAndroid", mapOf("responseCode" to result.responseCode.name)) + NitroInAppMessageResultAndroid( + responseCode = mapInAppMessageResponseCode(result.responseCode), + purchaseToken = result.purchaseToken.wrapVariant() + ) + } catch (err: Throwable) { + RnIapLog.failure("showInAppMessagesAndroid", err) + val errorType = parseOpenIapError(err) + throw OpenIapException(toErrorJson(errorType, debugMessage = err.message)) + } + } + } + override fun launchExternalLinkAndroid(params: NitroLaunchExternalLinkParamsAndroid): Promise { return Promise.async { RnIapLog.payload("launchExternalLinkAndroid", mapOf( @@ -1728,6 +1844,45 @@ class HybridRnIap : HybridRnIapSpec() { BillingProgramAndroid.EXTERNAL_OFFER -> OpenIapBillingProgramAndroid.ExternalOffer BillingProgramAndroid.EXTERNAL_PAYMENTS -> OpenIapBillingProgramAndroid.ExternalPayments BillingProgramAndroid.USER_CHOICE_BILLING -> OpenIapBillingProgramAndroid.UserChoiceBilling + BillingProgramAndroid.BILLING_CHOICE -> OpenIapBillingProgramAndroid.BillingChoice + } + } + + private fun mapBillingChoiceImageLayout(layout: BillingChoiceImageLayoutAndroid): OpenIapBillingChoiceImageLayout { + return when (layout) { + BillingChoiceImageLayoutAndroid.RECTANGULAR_FOUR_BY_ONE -> OpenIapBillingChoiceImageLayout.RectangularFourByOne + BillingChoiceImageLayoutAndroid.RECTANGULAR_THREE_BY_ONE -> OpenIapBillingChoiceImageLayout.RectangularThreeByOne + BillingChoiceImageLayoutAndroid.RECTANGULAR_TWO_BY_TWO -> OpenIapBillingChoiceImageLayout.RectangularTwoByTwo + } + } + + private fun mapBillingChoiceScreenType(type: OpenIapBillingChoiceScreenType): BillingChoiceScreenTypeAndroid { + return when (type) { + OpenIapBillingChoiceScreenType.Unspecified -> BillingChoiceScreenTypeAndroid.UNSPECIFIED + OpenIapBillingChoiceScreenType.DeveloperRendered -> BillingChoiceScreenTypeAndroid.DEVELOPER_RENDERED + OpenIapBillingChoiceScreenType.GoogleRendered -> BillingChoiceScreenTypeAndroid.GOOGLE_RENDERED + } + } + + private fun mapDeveloperBillingType(type: DeveloperBillingTypeAndroid?): OpenIapDeveloperBillingType? { + return when (type) { + null, DeveloperBillingTypeAndroid.DEVELOPER_BILLING_TYPE_UNSPECIFIED -> null + DeveloperBillingTypeAndroid.IN_APP -> OpenIapDeveloperBillingType.InApp + DeveloperBillingTypeAndroid.EXTERNAL_LINK -> OpenIapDeveloperBillingType.ExternalLink + } + } + + private fun mapInAppMessageCategory(category: InAppMessageCategoryAndroid): OpenIapInAppMessageCategory { + return when (category) { + InAppMessageCategoryAndroid.UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID -> OpenIapInAppMessageCategory.UnknownInAppMessageCategoryId + InAppMessageCategoryAndroid.TRANSACTIONAL -> OpenIapInAppMessageCategory.Transactional + } + } + + private fun mapInAppMessageResponseCode(code: OpenIapInAppMessageResponseCode): InAppMessageResponseCodeAndroid { + return when (code) { + OpenIapInAppMessageResponseCode.NoActionNeeded -> InAppMessageResponseCodeAndroid.NO_ACTION_NEEDED + OpenIapInAppMessageResponseCode.SubscriptionStatusUpdated -> InAppMessageResponseCodeAndroid.SUBSCRIPTION_STATUS_UPDATED } } diff --git a/libraries/react-native-iap/example/android/build.gradle b/libraries/react-native-iap/example/android/build.gradle index 577f81784..0b91154db 100644 --- a/libraries/react-native-iap/example/android/build.gradle +++ b/libraries/react-native-iap/example/android/build.gradle @@ -14,7 +14,7 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle") classpath("com.facebook.react:react-native-gradle-plugin") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") } } diff --git a/libraries/react-native-iap/ios/HybridRnIap.swift b/libraries/react-native-iap/ios/HybridRnIap.swift index 489da92cc..0e603ebe9 100644 --- a/libraries/react-native-iap/ios/HybridRnIap.swift +++ b/libraries/react-native-iap/ios/HybridRnIap.swift @@ -1385,12 +1385,30 @@ class HybridRnIap: HybridRnIapSpec { } } - func createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid) throws -> Promise { + func getBillingChoiceInfoAndroid(params: NitroGetBillingChoiceInfoParamsAndroid) throws -> Promise { + return Promise.async { + throw OpenIapException.make(code: .featureNotSupported, message: "Billing Choice API is Android-only") + } + } + + func createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid, developerBillingType: DeveloperBillingTypeAndroid?) throws -> Promise { return Promise.async { throw OpenIapException.make(code: .featureNotSupported, message: "Billing Programs API is Android-only") } } + func showBillingProgramInformationDialogAndroid(params: NitroBillingProgramInformationDialogParamsAndroid) throws -> Promise { + return Promise.async { + throw OpenIapException.make(code: .featureNotSupported, message: "Billing Choice API is Android-only") + } + } + + func showInAppMessagesAndroid(params: NitroInAppMessageParamsAndroid?) throws -> Promise { + return Promise.async { + throw OpenIapException.make(code: .featureNotSupported, message: "In-app messages are Android-only") + } + } + func launchExternalLinkAndroid(params: NitroLaunchExternalLinkParamsAndroid) throws -> Promise { return Promise.async { throw OpenIapException.make(code: .featureNotSupported, message: "Billing Programs API is Android-only") diff --git a/libraries/react-native-iap/src/__tests__/index.test.ts b/libraries/react-native-iap/src/__tests__/index.test.ts index 38ffd1131..c1a902311 100644 --- a/libraries/react-native-iap/src/__tests__/index.test.ts +++ b/libraries/react-native-iap/src/__tests__/index.test.ts @@ -57,10 +57,22 @@ const mockIap: any = { billingProgram: 'external-offer', isAvailable: true, })), + getBillingChoiceInfoAndroid: jest.fn(async () => ({ + playBillingChoiceImageUrl: 'https://play.google.com/billing-choice.png', + playBillingLoyaltyInfo: null, + })), createBillingProgramReportingDetailsAndroid: jest.fn(async () => ({ billingProgram: 'external-offer', externalTransactionToken: 'mock-token-123', })), + showBillingProgramInformationDialogAndroid: jest.fn(async () => ({ + responseCode: 0, + debugMessage: null, + })), + showInAppMessagesAndroid: jest.fn(async () => ({ + responseCode: 'no-action-needed', + purchaseToken: null, + })), launchExternalLinkAndroid: jest.fn(async () => true), }; @@ -2057,6 +2069,14 @@ describe('Public API (src/index.ts)', () => { ); }); + it('should support billing-choice program (9.1.0+)', () => { + (Platform as any).OS = 'android'; + IAP.enableBillingProgramAndroid('billing-choice'); + expect(mockIap.enableBillingProgramAndroid).toHaveBeenCalledWith( + 'billing-choice', + ); + }); + it('should warn and return early on non-Android', () => { (Platform as any).OS = 'ios'; IAP.enableBillingProgramAndroid('external-offer'); @@ -2152,6 +2172,29 @@ describe('Public API (src/index.ts)', () => { }); }); + describe('getBillingChoiceInfoAndroid', () => { + it('should request Billing Choice info with defaults on Android', async () => { + (Platform as any).OS = 'android'; + const result = await IAP.getBillingChoiceInfoAndroid({}); + + expect(mockIap.getBillingChoiceInfoAndroid).toHaveBeenCalledWith({ + billingProgram: 'billing-choice', + playBillingChoiceImageLayout: 'rectangular-four-by-one', + userLocale: null, + }); + expect(result.playBillingChoiceImageUrl).toBe( + 'https://play.google.com/billing-choice.png', + ); + }); + + it('should throw on non-Android', async () => { + (Platform as any).OS = 'ios'; + await expect(IAP.getBillingChoiceInfoAndroid({})).rejects.toThrow( + 'Billing Choice API is only supported on Android', + ); + }); + }); + describe('createBillingProgramReportingDetailsAndroid', () => { it('should return reporting details with token on Android', async () => { (Platform as any).OS = 'android'; @@ -2208,6 +2251,58 @@ describe('Public API (src/index.ts)', () => { expect(result.billingProgram).toBe('external-content-link'); expect(result.externalTransactionToken).toBe('content-token-456'); }); + + it('should pass developerBillingType for Billing Choice reporting details', async () => { + (Platform as any).OS = 'android'; + mockIap.createBillingProgramReportingDetailsAndroid.mockResolvedValueOnce( + { + billingProgram: 'billing-choice', + externalTransactionToken: 'choice-token-789', + }, + ); + + const result = await IAP.createBillingProgramReportingDetailsAndroid( + 'billing-choice', + 'external-link', + ); + + expect( + mockIap.createBillingProgramReportingDetailsAndroid, + ).toHaveBeenCalledWith('billing-choice', 'external-link'); + expect(result.billingProgram).toBe('billing-choice'); + }); + }); + + describe('showBillingProgramInformationDialogAndroid', () => { + it('should show Billing Choice information dialog with default program', async () => { + (Platform as any).OS = 'android'; + const result = + await IAP.showBillingProgramInformationDialogAndroid({ + externalTransactionToken: 'choice-token-123', + }); + + expect( + mockIap.showBillingProgramInformationDialogAndroid, + ).toHaveBeenCalledWith({ + billingProgram: 'billing-choice', + externalTransactionToken: 'choice-token-123', + }); + expect(result.responseCode).toBe(0); + }); + }); + + describe('showInAppMessagesAndroid', () => { + it('should delegate to native in-app messages method', async () => { + (Platform as any).OS = 'android'; + const result = await IAP.showInAppMessagesAndroid({ + categories: ['transactional'], + }); + + expect(mockIap.showInAppMessagesAndroid).toHaveBeenCalledWith({ + categories: ['transactional'], + }); + expect(result.responseCode).toBe('no-action-needed'); + }); }); describe('launchExternalLinkAndroid', () => { diff --git a/libraries/react-native-iap/src/index.kepler.ts b/libraries/react-native-iap/src/index.kepler.ts index 9e02e91ea..2f5c8d62e 100644 --- a/libraries/react-native-iap/src/index.kepler.ts +++ b/libraries/react-native-iap/src/index.kepler.ts @@ -293,12 +293,21 @@ export const createAlternativeBillingTokenAndroid: MutationField< export const isBillingProgramAvailableAndroid: MutationField< 'isBillingProgramAvailableAndroid' > = async () => unsupported('isBillingProgramAvailableAndroid'); +export const getBillingChoiceInfoAndroid: QueryField< + 'getBillingChoiceInfoAndroid' +> = async () => unsupported('getBillingChoiceInfoAndroid'); export const launchExternalLinkAndroid: MutationField< 'launchExternalLinkAndroid' > = async () => unsupported('launchExternalLinkAndroid'); export const createBillingProgramReportingDetailsAndroid: MutationField< 'createBillingProgramReportingDetailsAndroid' > = async () => unsupported('createBillingProgramReportingDetailsAndroid'); +export const showBillingProgramInformationDialogAndroid: MutationField< + 'showBillingProgramInformationDialogAndroid' +> = async () => unsupported('showBillingProgramInformationDialogAndroid'); +export const showInAppMessagesAndroid: MutationField< + 'showInAppMessagesAndroid' +> = async () => unsupported('showInAppMessagesAndroid'); export const userChoiceBillingListenerAndroid = (): EventSubscription => ({ remove: () => {}, }); diff --git a/libraries/react-native-iap/src/index.ts b/libraries/react-native-iap/src/index.ts index 2079d129d..fcae23a36 100644 --- a/libraries/react-native-iap/src/index.ts +++ b/libraries/react-native-iap/src/index.ts @@ -73,7 +73,17 @@ import {getVegaIapModule, isVegaOS} from './vega'; // Note: BillingProgramAndroid, ExternalLinkLaunchModeAndroid, and ExternalLinkTypeAndroid // are exported from './types' (auto-generated from openiap-gql). // Import them here for use in this file's interfaces and functions. -import type {BillingProgramAndroid} from './types'; +import type { + BillingChoiceInfoAndroid, + BillingProgramAndroid, + BillingProgramInformationDialogParamsAndroid, + BillingProgramReportingDetailsAndroid, + BillingResultAndroid, + DeveloperBillingTypeAndroid, + GetBillingChoiceInfoParamsAndroid, + InAppMessageParamsAndroid, + InAppMessageResultAndroid, +} from './types'; // Export all types export type { @@ -2925,7 +2935,9 @@ export const isBillingProgramAvailableAndroid: MutationField< const result = await IAP.instance.isBillingProgramAvailableAndroid(program); return { billingProgram: result.billingProgram as unknown as BillingProgramAndroid, + choiceScreenType: result.choiceScreenType, isAvailable: result.isAvailable, + isExternalLinkAvailable: result.isExternalLinkAvailable, }; } catch (error) { RnIapConsole.error('Failed to check billing program availability:', error); @@ -2933,6 +2945,37 @@ export const isBillingProgramAvailableAndroid: MutationField< } }; +/** + * Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens (Android only). + * + * @param params - Billing Choice info request parameters + * @returns Promise with Play-hosted image URL and optional loyalty information + * @platform Android + * @since Google Play Billing Library 9.1.0+ + * + * @see {@link https://openiap.dev/docs/apis/android/get-billing-choice-info-android} + */ +export const getBillingChoiceInfoAndroid: QueryField< + 'getBillingChoiceInfoAndroid' +> = async ( + params: GetBillingChoiceInfoParamsAndroid, +): Promise => { + if (Platform.OS !== 'android') { + throw new Error('Billing Choice API is only supported on Android'); + } + try { + return await IAP.instance.getBillingChoiceInfoAndroid({ + billingProgram: params.billingProgram ?? 'billing-choice', + playBillingChoiceImageLayout: + params.playBillingChoiceImageLayout ?? 'rectangular-four-by-one', + userLocale: params.userLocale ?? null, + }); + } catch (error) { + RnIapConsole.error('Failed to get Billing Choice info:', error); + throw error; + } +}; + /** * Create billing program reporting details for external transactions (Android only). * Used to get the external transaction token needed for reporting to Google. @@ -2954,15 +2997,32 @@ export const isBillingProgramAvailableAndroid: MutationField< * * @see {@link https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android} */ -export const createBillingProgramReportingDetailsAndroid: MutationField< - 'createBillingProgramReportingDetailsAndroid' -> = async (program) => { +export const createBillingProgramReportingDetailsAndroid = async ( + programOrArgs: + | BillingProgramAndroid + | { + program: BillingProgramAndroid; + developerBillingType?: DeveloperBillingTypeAndroid | null; + }, + developerBillingType?: DeveloperBillingTypeAndroid | null, +): Promise => { if (Platform.OS !== 'android') { throw new Error('Billing Programs API is only supported on Android'); } try { + const program = + typeof programOrArgs === 'string' ? programOrArgs : programOrArgs.program; + const resolvedDeveloperBillingType = + typeof programOrArgs === 'string' + ? developerBillingType + : (programOrArgs.developerBillingType ?? developerBillingType); const result = - await IAP.instance.createBillingProgramReportingDetailsAndroid(program); + resolvedDeveloperBillingType == null + ? await IAP.instance.createBillingProgramReportingDetailsAndroid(program) + : await IAP.instance.createBillingProgramReportingDetailsAndroid( + program, + resolvedDeveloperBillingType, + ); return { billingProgram: result.billingProgram as unknown as BillingProgramAndroid, externalTransactionToken: result.externalTransactionToken, @@ -2976,6 +3036,64 @@ export const createBillingProgramReportingDetailsAndroid: MutationField< } }; +/** + * Show Google's information dialog for a Billing Choice external transaction (Android only). + * + * @param params - Dialog parameters with the external transaction token + * @returns Promise with BillingResult + * @platform Android + * @since Google Play Billing Library 9.1.0+ + * + * @see {@link https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android} + */ +export const showBillingProgramInformationDialogAndroid: MutationField< + 'showBillingProgramInformationDialogAndroid' +> = async ( + params: BillingProgramInformationDialogParamsAndroid, +): Promise => { + if (Platform.OS !== 'android') { + throw new Error('Billing Choice API is only supported on Android'); + } + try { + return await IAP.instance.showBillingProgramInformationDialogAndroid({ + billingProgram: params.billingProgram ?? 'billing-choice', + externalTransactionToken: params.externalTransactionToken, + }); + } catch (error) { + RnIapConsole.error( + 'Failed to show Billing Choice information dialog:', + error, + ); + throw error; + } +}; + +/** + * Show Play Billing in-app messages, such as transactional subscription updates (Android only). + * + * @param params - Optional in-app message categories + * @returns Promise with in-app message result + * @platform Android + * @since Google Play Billing Library 4.1.0+ + * + * @see {@link https://openiap.dev/docs/apis/android/show-in-app-messages-android} + */ +export const showInAppMessagesAndroid: MutationField< + 'showInAppMessagesAndroid' +> = async ( + params?: InAppMessageParamsAndroid | null, +): Promise => { + if (Platform.OS !== 'android') { + throw new Error('In-app messages are only supported on Android'); + } + try { + return await IAP.instance.showInAppMessagesAndroid(params ?? null); + } catch (error) { + RnIapConsole.error('Failed to show in-app messages:', error); + throw error; + } +}; + /** * Launch external link for external offers or app download (Android only). * diff --git a/libraries/react-native-iap/src/specs/RnIap.nitro.ts b/libraries/react-native-iap/src/specs/RnIap.nitro.ts index 005425b07..678c7eda2 100644 --- a/libraries/react-native-iap/src/specs/RnIap.nitro.ts +++ b/libraries/react-native-iap/src/specs/RnIap.nitro.ts @@ -96,13 +96,38 @@ export type PurchaseVerificationProvider = 'iapkit' | 'none'; // Billing Programs API (Android) // GQL type exists but defined locally for Nitro codegen consistency -// Android 8.2.0+, 8.3.0+ for external-payments, 7.0+ for user-choice-billing +// Android 8.2.0+, 8.3.0+ for external-payments, 9.1.0+ for billing-choice, +// 7.0+ for user-choice-billing export type BillingProgramAndroid = | 'unspecified' | 'external-content-link' | 'external-offer' | 'external-payments' - | 'user-choice-billing'; + | 'user-choice-billing' + | 'billing-choice'; + +export type BillingChoiceImageLayoutAndroid = + | 'rectangular-four-by-one' + | 'rectangular-three-by-one' + | 'rectangular-two-by-two'; + +export type BillingChoiceScreenTypeAndroid = + | 'unspecified' + | 'developer-rendered' + | 'google-rendered'; + +export type DeveloperBillingTypeAndroid = + | 'developer-billing-type-unspecified' + | 'in-app' + | 'external-link'; + +export type InAppMessageCategoryAndroid = + | 'unknown-in-app-message-category-id' + | 'transactional'; + +export type InAppMessageResponseCodeAndroid = + | 'no-action-needed' + | 'subscription-status-updated'; // Developer Billing Launch Mode (Android 8.3.0+) // Defined locally for Nitro codegen @@ -308,6 +333,21 @@ export interface NitroLaunchExternalLinkParamsAndroid { linkUri: string; } +export interface NitroGetBillingChoiceInfoParamsAndroid { + billingProgram: BillingProgramAndroid; + playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid; + userLocale?: string | null; +} + +export interface NitroBillingProgramInformationDialogParamsAndroid { + billingProgram: BillingProgramAndroid; + externalTransactionToken: string; +} + +export interface NitroInAppMessageParamsAndroid { + categories?: InAppMessageCategoryAndroid[] | null; +} + // ╔══════════════════════════════════════════════════════════════════════════╗ // ║ TYPES ║ // ╚══════════════════════════════════════════════════════════════════════════╝ @@ -344,6 +384,21 @@ export interface NitroPurchaseResult { purchaseToken?: string; } +export interface NitroBillingResultAndroid { + responseCode: number; + debugMessage?: string | null; +} + +export interface NitroBillingChoiceInfoAndroid { + playBillingChoiceImageUrl: string; + playBillingLoyaltyInfo?: string | null; +} + +export interface NitroInAppMessageResultAndroid { + responseCode: InAppMessageResponseCodeAndroid; + purchaseToken?: string | null; +} + export interface NitroReceiptValidationResultIOS { isValid: boolean; receiptData: string; @@ -428,8 +483,12 @@ export interface NitroVerifyPurchaseWithProviderResult { export interface NitroBillingProgramAvailabilityResultAndroid { /** The billing program that was checked */ billingProgram: BillingProgramAndroid; + /** Billing Choice screen renderer. Populated only for available Billing Choice results. */ + choiceScreenType?: BillingChoiceScreenTypeAndroid | null; /** Whether the billing program is available for the user */ isAvailable: boolean; + /** Whether external-link payment is available for Billing Choice. */ + isExternalLinkAvailable?: boolean | null; } /** @@ -1165,6 +1224,18 @@ export interface RnIap extends HybridObject<{ios: 'swift'; android: 'kotlin'}> { program: BillingProgramAndroid, ): Promise; + /** + * Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. + * + * @param params - Billing Choice info request parameters + * @returns Promise with the Play-hosted image URL and optional loyalty info + * @platform Android + * @since Billing Library 9.1.0+ + */ + getBillingChoiceInfoAndroid( + params: NitroGetBillingChoiceInfoParamsAndroid, + ): Promise; + /** * Create billing program reporting details for external transactions (Android only). * Used to get the external transaction token needed for reporting to Google. @@ -1176,8 +1247,33 @@ export interface RnIap extends HybridObject<{ios: 'swift'; android: 'kotlin'}> { */ createBillingProgramReportingDetailsAndroid( program: BillingProgramAndroid, + developerBillingType?: DeveloperBillingTypeAndroid | null, ): Promise; + /** + * Show the Play-provided Billing Choice information dialog. + * + * @param params - Billing Choice dialog parameters + * @returns Promise with BillingResult + * @platform Android + * @since Billing Library 9.1.0+ + */ + showBillingProgramInformationDialogAndroid( + params: NitroBillingProgramInformationDialogParamsAndroid, + ): Promise; + + /** + * Show Play Billing in-app messages, such as transactional subscription updates. + * + * @param params - Optional in-app message categories + * @returns Promise with in-app message result + * @platform Android + * @since Billing Library 4.1.0+ + */ + showInAppMessagesAndroid( + params?: NitroInAppMessageParamsAndroid | null, + ): Promise; + /** * Launch external link for external offers or app download (Android only). * diff --git a/libraries/react-native-iap/src/types.ts b/libraries/react-native-iap/src/types.ts index 6d2d9b825..6c2b36866 100644 --- a/libraries/react-native-iap/src/types.ts +++ b/libraries/react-native-iap/src/types.ts @@ -118,10 +118,34 @@ export interface AppTransaction { } /** - * Billing program types for external content links, external offers, and external payments (Android) - * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0 + * Play Billing choice image layout (Android) + * Available in Google Play Billing Library 9.1.0+ */ -export type BillingProgramAndroid = 'unspecified' | 'user-choice-billing' | 'external-content-link' | 'external-offer' | 'external-payments'; +export type BillingChoiceImageLayoutAndroid = 'rectangular-four-by-one' | 'rectangular-three-by-one' | 'rectangular-two-by-two'; + +/** + * Display information for developer-rendered Billing Choice screens (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +export interface BillingChoiceInfoAndroid { + /** URL for the Play Billing choice image matching the requested layout. */ + playBillingChoiceImageUrl: string; + /** Play Loyalty information for the user. */ + playBillingLoyaltyInfo?: (string | null); +} + +/** + * Choice screen renderer for Billing Choice availability (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +export type BillingChoiceScreenTypeAndroid = 'unspecified' | 'developer-rendered' | 'google-rendered'; + +/** + * Billing program types for Google Play Billing Programs (Android) + * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, + * BILLING_CHOICE added in 9.1.0. + */ +export type BillingProgramAndroid = 'unspecified' | 'user-choice-billing' | 'external-content-link' | 'external-offer' | 'external-payments' | 'billing-choice'; /** * Result of checking billing program availability (Android) @@ -130,8 +154,26 @@ export type BillingProgramAndroid = 'unspecified' | 'user-choice-billing' | 'ext export interface BillingProgramAvailabilityResultAndroid { /** The billing program that was checked */ billingProgram: BillingProgramAndroid; + /** Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. */ + choiceScreenType?: (BillingChoiceScreenTypeAndroid | null); /** Whether the billing program is available for the user */ isAvailable: boolean; + /** + * Whether external-link payment is available for Billing Choice. + * Populated only for available BILLING_CHOICE results. + */ + isExternalLinkAvailable?: (boolean | null); +} + +/** + * Parameters for showing a billing program information dialog (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +export interface BillingProgramInformationDialogParamsAndroid { + /** Billing program. Currently only BILLING_CHOICE is supported. */ + billingProgram?: BillingProgramAndroid; + /** External transaction token returned by the Billing Choice reporting-details flow. */ + externalTransactionToken: string; } /** @@ -193,6 +235,12 @@ export interface DeveloperBillingOptionParamsAndroid { linkUri: string; } +/** + * Developer-provided billing destination type for Billing Program reporting details (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +export type DeveloperBillingTypeAndroid = 'developer-billing-type-unspecified' | 'in-app' | 'external-link'; + /** * Details provided when user selects developer billing option (Android) * Received via DeveloperProvidedBillingListener callback @@ -507,6 +555,19 @@ export interface ExternalPurchaseNoticeResultIOS { export type FetchProductsResult = ProductOrSubscription[] | Product[] | ProductSubscription[] | null; +/** + * Parameters for fetching Billing Choice display information (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +export interface GetBillingChoiceInfoParamsAndroid { + /** Billing program. Currently only BILLING_CHOICE is supported. */ + billingProgram?: BillingProgramAndroid; + /** Desired Play Billing choice image layout. */ + playBillingChoiceImageLayout?: BillingChoiceImageLayoutAndroid; + /** BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. */ + userLocale?: (string | null); +} + export type IapEvent = 'purchase-updated' | 'purchase-error' | 'promoted-product-ios' | 'user-choice-billing-android' | 'developer-provided-billing-android' | 'subscription-billing-issue'; export type IapPlatform = 'ios' | 'android'; @@ -516,6 +577,38 @@ export type IapStore = 'unknown' | 'apple' | 'google' | 'horizon' | 'amazon'; /** Unified purchase states from IAPKit verification response. */ export type IapkitPurchaseState = 'entitled' | 'pending-acknowledgment' | 'pending' | 'canceled' | 'expired' | 'ready-to-consume' | 'consumed' | 'unknown' | 'inauthentic'; +/** + * High-level in-app message category (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +export type InAppMessageCategoryAndroid = 'unknown-in-app-message-category-id' | 'transactional'; + +/** + * Parameters for showing Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +export interface InAppMessageParamsAndroid { + /** In-app message categories to show. Defaults to transactional messages. */ + categories?: (InAppMessageCategoryAndroid[] | null); +} + +/** + * Response code from Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +export type InAppMessageResponseCodeAndroid = 'no-action-needed' | 'subscription-status-updated'; + +/** + * Result from showing Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +export interface InAppMessageResultAndroid { + /** Purchase token returned when a subscription status changed. */ + purchaseToken?: (string | null); + /** Response code for the in-app messaging flow. */ + responseCode: InAppMessageResponseCodeAndroid; +} + /** Connection initialization configuration */ export interface InitConnectionConfig { /** @@ -597,7 +690,6 @@ export interface Mutation { beginRefundRequestIOS?: Promise<(string | null)>; /** * Check whether alternative billing is available for the user. Step 1 of the alternative billing flow. - * * Returns true if available, false otherwise. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/check-alternative-billing-availability-android @@ -617,7 +709,6 @@ export interface Mutation { * Create a reporting token for an alternative billing flow. Step 3 of the alternative billing flow. * Must be called AFTER successful payment in your payment system. * Token must be reported to Google Play backend within 24 hours. - * * Returns token string, or null if creation failed. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-alternative-billing-token-android @@ -626,7 +717,6 @@ export interface Mutation { /** * Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). * Replaces the deprecated createExternalOfferReportingDetailsAsync API. - * * Returns external transaction token needed for reporting external transactions. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android @@ -655,7 +745,6 @@ export interface Mutation { /** * Check whether a billing program (e.g., External Payments) is available for the current user. * Replaces the deprecated isExternalOfferAvailableAsync API. - * * Available in Google Play Billing Library 8.2.0+. * Returns availability result with isAvailable flag. * Throws OpenIapError.NotPrepared if billing client not ready. @@ -665,7 +754,6 @@ export interface Mutation { /** * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). * Replaces the deprecated showExternalOfferInformationDialog API. - * * Shows Play Store dialog and optionally launches external URL. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/launch-external-link-android @@ -711,12 +799,18 @@ export interface Mutation { /** * Display Google's alternative billing information dialog. Step 2 of the alternative billing flow. * Must be called BEFORE processing payment in your payment system. - * * Returns true if user accepted, false if user canceled. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android */ showAlternativeBillingDialogAndroid: Promise; + /** + * Show Google's information dialog for a Billing Choice external transaction. + * Available in Google Play Billing Library 9.1.0+. + * Throws OpenIapError.NotPrepared if billing client not ready. + * See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android + */ + showBillingProgramInformationDialogAndroid: Promise; /** * Present the disclosure sheet required before linking out via ExternalPurchaseCustomLink (iOS 18.1+). * Call this after a deliberate customer interaction before linking out to external purchases. @@ -724,6 +818,14 @@ export interface Mutation { * See: https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios */ showExternalPurchaseCustomLinkNoticeIOS: Promise; + /** + * Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. + * Available in Google Play Billing Library 4.1.0+. + * Returns a response code and, when the subscription status changes, the related purchase token. + * Throws OpenIapError.NotPrepared if billing client not ready. + * See: https://openiap.dev/docs/apis/android/show-in-app-messages-android + */ + showInAppMessagesAndroid: Promise; /** * Present the manage-subscriptions sheet and return changed purchases (iOS 15+). * See: https://openiap.dev/docs/apis/ios/show-manage-subscriptions-ios @@ -766,7 +868,11 @@ export type MutationBeginRefundRequestIosArgs = string; export type MutationConsumePurchaseAndroidArgs = string; -export type MutationCreateBillingProgramReportingDetailsAndroidArgs = BillingProgramAndroid; +export interface MutationCreateBillingProgramReportingDetailsAndroidArgs { + developerBillingType?: (DeveloperBillingTypeAndroid | null); + program: BillingProgramAndroid; +} + export type MutationDeepLinkToSubscriptionsArgs = (DeepLinkOptions | null) | undefined; @@ -801,8 +907,12 @@ export type MutationRequestPurchaseArgs = }; +export type MutationShowBillingProgramInformationDialogAndroidArgs = BillingProgramInformationDialogParamsAndroid; + export type MutationShowExternalPurchaseCustomLinkNoticeIosArgs = ExternalPurchaseCustomLinkNoticeTypeIOS; +export type MutationShowInAppMessagesAndroidArgs = (InAppMessageParamsAndroid | null) | undefined; + export type MutationValidateReceiptArgs = VerifyPurchaseProps; export type MutationVerifyPurchaseArgs = VerifyPurchaseProps; @@ -1359,6 +1469,13 @@ export interface Query { * See: https://openiap.dev/docs/apis/get-available-purchases */ getAvailablePurchases: Promise; + /** + * Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. + * Available in Google Play Billing Library 9.1.0+. + * Throws OpenIapError.NotPrepared if billing client is not ready. + * See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android + */ + getBillingChoiceInfoAndroid: Promise; /** * Fetch a token for Apple's External Purchase Server reporting API (iOS 18.1+). * Use this token to report transactions made through ExternalPurchaseCustomLink. @@ -1447,6 +1564,8 @@ export type QueryGetActiveSubscriptionsArgs = (string[] | null) | undefined; export type QueryGetAvailablePurchasesArgs = (PurchaseOptions | null) | undefined; +export type QueryGetBillingChoiceInfoAndroidArgs = GetBillingChoiceInfoParamsAndroid; + export type QueryGetExternalPurchaseCustomLinkTokenIosArgs = ExternalPurchaseCustomLinkTokenTypeIOS; export type QueryGetTransactionJwsIosArgs = string; @@ -2235,6 +2354,7 @@ export type QueryArgsMap = { getAllTransactionsIOS: never; getAppTransactionIOS: never; getAvailablePurchases: QueryGetAvailablePurchasesArgs; + getBillingChoiceInfoAndroid: QueryGetBillingChoiceInfoAndroidArgs; getExternalPurchaseCustomLinkTokenIOS: QueryGetExternalPurchaseCustomLinkTokenIosArgs; getPendingTransactionsIOS: never; getPromotedProductIOS: never; @@ -2285,7 +2405,9 @@ export type MutationArgsMap = { requestPurchaseOnPromotedProductIOS: never; restorePurchases: never; showAlternativeBillingDialogAndroid: never; + showBillingProgramInformationDialogAndroid: MutationShowBillingProgramInformationDialogAndroidArgs; showExternalPurchaseCustomLinkNoticeIOS: MutationShowExternalPurchaseCustomLinkNoticeIosArgs; + showInAppMessagesAndroid: MutationShowInAppMessagesAndroidArgs; showManageSubscriptionsIOS: never; syncIOS: never; validateReceipt: MutationValidateReceiptArgs; diff --git a/libraries/react-native-iap/src/vega-adapter.ts b/libraries/react-native-iap/src/vega-adapter.ts index 843849f1e..9a6d2c83e 100644 --- a/libraries/react-native-iap/src/vega-adapter.ts +++ b/libraries/react-native-iap/src/vega-adapter.ts @@ -1469,11 +1469,22 @@ export function createVegaIapModule(service: VegaPurchasingService): RnIap { async isBillingProgramAvailableAndroid(): Promise { return throwUnsupportedFeature('isBillingProgramAvailableAndroid'); }, + async getBillingChoiceInfoAndroid(): Promise { + return throwUnsupportedFeature('getBillingChoiceInfoAndroid'); + }, async createBillingProgramReportingDetailsAndroid(): Promise { return throwUnsupportedFeature( 'createBillingProgramReportingDetailsAndroid', ); }, + async showBillingProgramInformationDialogAndroid(): Promise { + return throwUnsupportedFeature( + 'showBillingProgramInformationDialogAndroid', + ); + }, + async showInAppMessagesAndroid(): Promise { + return throwUnsupportedFeature('showInAppMessagesAndroid'); + }, async launchExternalLinkAndroid(): Promise { return throwUnsupportedFeature('launchExternalLinkAndroid'); }, diff --git a/packages/apple/CONVENTION.md b/packages/apple/CONVENTION.md new file mode 100644 index 000000000..b6dd5562e --- /dev/null +++ b/packages/apple/CONVENTION.md @@ -0,0 +1,38 @@ +# Apple Package Conventions + +This file captures package-local rules for `packages/apple`. The root +`AGENTS.md` and `knowledge/internal/` files remain the source of truth. + +## Naming + +- iOS-specific public APIs must end with `IOS`. +- Cross-platform APIs must not add a platform suffix. +- Keep Swift acronyms in repo style: `OpenIAP` for the package name, but + `OpenIapModule`, `OpenIapStore`, and `Iap*` when the acronym appears at the + beginning or middle of a symbol. + +## Generated Types + +- Do not edit `Sources/Models/Types.swift` directly. +- Change GraphQL schema in `packages/gql/src`, run generation, then sync the + generated output through the documented monorepo scripts. + +## Public API Changes + +- When `Sources/OpenIapModule.swift` adds or changes a public async API, update + `Sources/OpenIapModule+ObjC.swift` in the same change. +- Keep `Sources/OpenIapProtocol.swift`, `OpenIapModule`, `OpenIapStore`, and + generated handler wiring consistent for any exposed operation. +- Prefer StoreKit 2 async/await APIs and put conversion logic in + `Sources/Helpers/StoreKitTypesBridge.swift` rather than duplicating mapping + code in call sites. + +## Verification + +Run these checks after Apple package changes: + +```bash +cd packages/apple +swift build +swift test --filter OpenIapTests +``` diff --git a/packages/apple/Sources/Models/Types.swift b/packages/apple/Sources/Models/Types.swift index 656556304..952083007 100644 --- a/packages/apple/Sources/Models/Types.swift +++ b/packages/apple/Sources/Models/Types.swift @@ -24,8 +24,31 @@ public enum AlternativeBillingModeAndroid: String, Codable, CaseIterable { case alternativeOnly = "alternative-only" } -/// Billing program types for external content links, external offers, and external payments (Android) -/// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0 +/// Play Billing choice image layout (Android) +/// Available in Google Play Billing Library 9.1.0+ +public enum BillingChoiceImageLayoutAndroid: String, Codable, CaseIterable { + /// Rectangular image with a 4:1 aspect ratio. + case rectangularFourByOne = "rectangular-four-by-one" + /// Rectangular image with a 3:1 aspect ratio. + case rectangularThreeByOne = "rectangular-three-by-one" + /// Rectangular image with a 2:2 aspect ratio. + case rectangularTwoByTwo = "rectangular-two-by-two" +} + +/// Choice screen renderer for Billing Choice availability (Android) +/// Available in Google Play Billing Library 9.1.0+ +public enum BillingChoiceScreenTypeAndroid: String, Codable, CaseIterable { + /// Unspecified choice screen type. + case unspecified = "unspecified" + /// Choice screen is rendered by the developer app. + case developerRendered = "developer-rendered" + /// Choice screen is rendered by Google Play. + case googleRendered = "google-rendered" +} + +/// Billing program types for Google Play Billing Programs (Android) +/// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, +/// BILLING_CHOICE added in 9.1.0. public enum BillingProgramAndroid: String, Codable, CaseIterable { /// Unspecified billing program. Do not use. case unspecified = "unspecified" @@ -46,6 +69,10 @@ public enum BillingProgramAndroid: String, Codable, CaseIterable { /// Users can choose to complete the purchase on the developer's website. /// Available in Google Play Billing Library 8.3.0+ case externalPayments = "external-payments" + /// Billing Choice program. + /// Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. + /// Available in Google Play Billing Library 9.1.0+ + case billingChoice = "billing-choice" } /// Launch mode for developer billing option (Android) @@ -62,6 +89,17 @@ public enum DeveloperBillingLaunchModeAndroid: String, Codable, CaseIterable { case callerWillLaunchLink = "caller-will-launch-link" } +/// Developer-provided billing destination type for Billing Program reporting details (Android) +/// Available in Google Play Billing Library 9.1.0+ +public enum DeveloperBillingTypeAndroid: String, Codable, CaseIterable { + /// Unspecified developer billing type. Do not use. + case developerBillingTypeUnspecified = "developer-billing-type-unspecified" + /// Developer-provided billing via native in-app experience. + case inApp = "in-app" + /// Developer-provided billing via external link or embedded web browsing. + case externalLink = "external-link" +} + /// Discount offer type enumeration. /// Categorizes the type of discount or promotional offer. public enum DiscountOfferType: String, Codable, CaseIterable { @@ -306,6 +344,24 @@ public enum IapStore: String, Codable, CaseIterable { case amazon = "amazon" } +/// High-level in-app message category (Android) +/// Available in Google Play Billing Library 4.1.0+ +public enum InAppMessageCategoryAndroid: String, Codable, CaseIterable { + /// Unknown in-app message category. + case unknownInAppMessageCategoryId = "unknown-in-app-message-category-id" + /// Transactional billing messages, such as payment issues or pending price-change confirmations. + case transactional = "transactional" +} + +/// Response code from Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +public enum InAppMessageResponseCodeAndroid: String, Codable, CaseIterable { + /// Flow finished and no developer action is needed. + case noActionNeeded = "no-action-needed" + /// Subscription status changed and the purchase token should be checked. + case subscriptionStatusUpdated = "subscription-status-updated" +} + /// Payment mode for subscription offers. /// Determines how the user pays during the offer period. public enum PaymentMode: String, Codable, CaseIterable { @@ -667,13 +723,27 @@ public struct AppTransaction: Codable { public var signedDate: Double } +/// Display information for developer-rendered Billing Choice screens (Android) +/// Available in Google Play Billing Library 9.1.0+ +public struct BillingChoiceInfoAndroid: Codable { + /// URL for the Play Billing choice image matching the requested layout. + public var playBillingChoiceImageUrl: String + /// Play Loyalty information for the user. + public var playBillingLoyaltyInfo: String? = nil +} + /// Result of checking billing program availability (Android) /// Available in Google Play Billing Library 8.2.0+ public struct BillingProgramAvailabilityResultAndroid: Codable { /// The billing program that was checked public var billingProgram: BillingProgramAndroid + /// Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + public var choiceScreenType: BillingChoiceScreenTypeAndroid? = nil /// Whether the billing program is available for the user public var isAvailable: Bool + /// Whether external-link payment is available for Billing Choice. + /// Populated only for available BILLING_CHOICE results. + public var isExternalLinkAvailable: Bool? = nil } /// Reporting details for transactions made outside of Google Play Billing (Android) @@ -879,6 +949,15 @@ public enum FetchProductsResult { case subscriptions([ProductSubscription]?) } +/// Result from showing Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +public struct InAppMessageResultAndroid: Codable { + /// Purchase token returned when a subscription status changed. + public var purchaseToken: String? = nil + /// Response code for the in-app messaging flow. + public var responseCode: InAppMessageResponseCodeAndroid +} + /// Installment plan details for subscription offers (Android) /// Contains information about the installment plan commitment. /// Available in Google Play Billing Library 7.0+ @@ -1549,6 +1628,23 @@ public struct AndroidSubscriptionOfferInput: Codable { } } +/// Parameters for showing a billing program information dialog (Android) +/// Available in Google Play Billing Library 9.1.0+ +public struct BillingProgramInformationDialogParamsAndroid: Codable { + /// Billing program. Currently only BILLING_CHOICE is supported. + public var billingProgram: BillingProgramAndroid + /// External transaction token returned by the Billing Choice reporting-details flow. + public var externalTransactionToken: String + + public init( + billingProgram: BillingProgramAndroid, + externalTransactionToken: String + ) { + self.billingProgram = billingProgram + self.externalTransactionToken = externalTransactionToken + } +} + public struct DeepLinkOptions: Codable { /// Android package name to target (required on Android) public var packageNameAndroid: String? @@ -1637,6 +1733,40 @@ public struct DiscountOfferInputIOS: Codable { } } +/// Parameters for fetching Billing Choice display information (Android) +/// Available in Google Play Billing Library 9.1.0+ +public struct GetBillingChoiceInfoParamsAndroid: Codable { + /// Billing program. Currently only BILLING_CHOICE is supported. + public var billingProgram: BillingProgramAndroid + /// Desired Play Billing choice image layout. + public var playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid + /// BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. + public var userLocale: String? + + public init( + billingProgram: BillingProgramAndroid, + playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid, + userLocale: String? = nil + ) { + self.billingProgram = billingProgram + self.playBillingChoiceImageLayout = playBillingChoiceImageLayout + self.userLocale = userLocale + } +} + +/// Parameters for showing Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +public struct InAppMessageParamsAndroid: Codable { + /// In-app message categories to show. Defaults to transactional messages. + public var categories: [InAppMessageCategoryAndroid]? + + public init( + categories: [InAppMessageCategoryAndroid]? = nil + ) { + self.categories = categories + } +} + /// Connection initialization configuration public struct InitConnectionConfig: Codable { /// Alternative billing mode for Android @@ -2597,7 +2727,6 @@ public protocol MutationResolver { /// See: https://openiap.dev/docs/apis/ios/begin-refund-request-ios func beginRefundRequestIOS(_ sku: String) async throws -> String? /// Check whether alternative billing is available for the user. Step 1 of the alternative billing flow. - /// /// Returns true if available, false otherwise. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/check-alternative-billing-availability-android @@ -2611,18 +2740,16 @@ public protocol MutationResolver { /// Create a reporting token for an alternative billing flow. Step 3 of the alternative billing flow. /// Must be called AFTER successful payment in your payment system. /// Token must be reported to Google Play backend within 24 hours. - /// /// Returns token string, or null if creation failed. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-alternative-billing-token-android func createAlternativeBillingTokenAndroid() async throws -> String? /// Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). /// Replaces the deprecated createExternalOfferReportingDetailsAsync API. - /// /// Returns external transaction token needed for reporting external transactions. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android - func createBillingProgramReportingDetailsAndroid(_ program: BillingProgramAndroid) async throws -> BillingProgramReportingDetailsAndroid + func createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid, developerBillingType: DeveloperBillingTypeAndroid?) async throws -> BillingProgramReportingDetailsAndroid /// Open the platform's subscription management UI. /// See: https://openiap.dev/docs/apis/deep-link-to-subscriptions func deepLinkToSubscriptions(_ options: DeepLinkOptions?) async throws -> Void @@ -2637,7 +2764,6 @@ public protocol MutationResolver { func initConnection(_ config: InitConnectionConfig?) async throws -> Bool /// Check whether a billing program (e.g., External Payments) is available for the current user. /// Replaces the deprecated isExternalOfferAvailableAsync API. - /// /// Available in Google Play Billing Library 8.2.0+. /// Returns availability result with isAvailable flag. /// Throws OpenIapError.NotPrepared if billing client not ready. @@ -2645,7 +2771,6 @@ public protocol MutationResolver { func isBillingProgramAvailableAndroid(_ program: BillingProgramAndroid) async throws -> BillingProgramAvailabilityResultAndroid /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). /// Replaces the deprecated showExternalOfferInformationDialog API. - /// /// Shows Play Store dialog and optionally launches external URL. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/launch-external-link-android @@ -2676,16 +2801,26 @@ public protocol MutationResolver { func restorePurchases() async throws -> Void /// Display Google's alternative billing information dialog. Step 2 of the alternative billing flow. /// Must be called BEFORE processing payment in your payment system. - /// /// Returns true if user accepted, false if user canceled. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android func showAlternativeBillingDialogAndroid() async throws -> Bool + /// Show Google's information dialog for a Billing Choice external transaction. + /// Available in Google Play Billing Library 9.1.0+. + /// Throws OpenIapError.NotPrepared if billing client not ready. + /// See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android + func showBillingProgramInformationDialogAndroid(_ params: BillingProgramInformationDialogParamsAndroid) async throws -> BillingResultAndroid /// Present the disclosure sheet required before linking out via ExternalPurchaseCustomLink (iOS 18.1+). /// Call this after a deliberate customer interaction before linking out to external purchases. /// Reference: https://developer.apple.com/documentation/storekit/externalpurchasecustomlink/shownotice(type:) /// See: https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios func showExternalPurchaseCustomLinkNoticeIOS(_ noticeType: ExternalPurchaseCustomLinkNoticeTypeIOS) async throws -> ExternalPurchaseCustomLinkNoticeResultIOS + /// Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. + /// Available in Google Play Billing Library 4.1.0+. + /// Returns a response code and, when the subscription status changes, the related purchase token. + /// Throws OpenIapError.NotPrepared if billing client not ready. + /// See: https://openiap.dev/docs/apis/android/show-in-app-messages-android + func showInAppMessagesAndroid(_ params: InAppMessageParamsAndroid?) async throws -> InAppMessageResultAndroid /// Present the manage-subscriptions sheet and return changed purchases (iOS 15+). /// See: https://openiap.dev/docs/apis/ios/show-manage-subscriptions-ios func showManageSubscriptionsIOS() async throws -> [PurchaseIOS] @@ -2736,6 +2871,11 @@ public protocol QueryResolver { /// List active purchases for the current user. /// See: https://openiap.dev/docs/apis/get-available-purchases func getAvailablePurchases(_ options: PurchaseOptions?) async throws -> [Purchase] + /// Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. + /// Available in Google Play Billing Library 9.1.0+. + /// Throws OpenIapError.NotPrepared if billing client is not ready. + /// See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android + func getBillingChoiceInfoAndroid(_ params: GetBillingChoiceInfoParamsAndroid) async throws -> BillingChoiceInfoAndroid /// Fetch a token for Apple's External Purchase Server reporting API (iOS 18.1+). /// Use this token to report transactions made through ExternalPurchaseCustomLink. /// Reference: https://developer.apple.com/documentation/storekit/externalpurchasecustomlink/token(for:) @@ -2828,7 +2968,7 @@ public typealias MutationCheckAlternativeBillingAvailabilityAndroidHandler = () public typealias MutationClearTransactionIOSHandler = () async throws -> Bool public typealias MutationConsumePurchaseAndroidHandler = (_ purchaseToken: String) async throws -> Bool public typealias MutationCreateAlternativeBillingTokenAndroidHandler = () async throws -> String? -public typealias MutationCreateBillingProgramReportingDetailsAndroidHandler = (_ program: BillingProgramAndroid) async throws -> BillingProgramReportingDetailsAndroid +public typealias MutationCreateBillingProgramReportingDetailsAndroidHandler = (_ program: BillingProgramAndroid, _ developerBillingType: DeveloperBillingTypeAndroid?) async throws -> BillingProgramReportingDetailsAndroid public typealias MutationDeepLinkToSubscriptionsHandler = (_ options: DeepLinkOptions?) async throws -> Void public typealias MutationEndConnectionHandler = () async throws -> Bool public typealias MutationFinishTransactionHandler = (_ purchase: PurchaseInput, _ isConsumable: Bool?) async throws -> Void @@ -2842,7 +2982,9 @@ public typealias MutationRequestPurchaseHandler = (_ params: RequestPurchaseProp public typealias MutationRequestPurchaseOnPromotedProductIOSHandler = () async throws -> Bool public typealias MutationRestorePurchasesHandler = () async throws -> Void public typealias MutationShowAlternativeBillingDialogAndroidHandler = () async throws -> Bool +public typealias MutationShowBillingProgramInformationDialogAndroidHandler = (_ params: BillingProgramInformationDialogParamsAndroid) async throws -> BillingResultAndroid public typealias MutationShowExternalPurchaseCustomLinkNoticeIOSHandler = (_ noticeType: ExternalPurchaseCustomLinkNoticeTypeIOS) async throws -> ExternalPurchaseCustomLinkNoticeResultIOS +public typealias MutationShowInAppMessagesAndroidHandler = (_ params: InAppMessageParamsAndroid?) async throws -> InAppMessageResultAndroid public typealias MutationShowManageSubscriptionsIOSHandler = () async throws -> [PurchaseIOS] public typealias MutationSyncIOSHandler = () async throws -> Bool public typealias MutationValidateReceiptHandler = (_ options: VerifyPurchaseProps) async throws -> VerifyPurchaseResult @@ -2870,7 +3012,9 @@ public struct MutationHandlers { public var requestPurchaseOnPromotedProductIOS: MutationRequestPurchaseOnPromotedProductIOSHandler? public var restorePurchases: MutationRestorePurchasesHandler? public var showAlternativeBillingDialogAndroid: MutationShowAlternativeBillingDialogAndroidHandler? + public var showBillingProgramInformationDialogAndroid: MutationShowBillingProgramInformationDialogAndroidHandler? public var showExternalPurchaseCustomLinkNoticeIOS: MutationShowExternalPurchaseCustomLinkNoticeIOSHandler? + public var showInAppMessagesAndroid: MutationShowInAppMessagesAndroidHandler? public var showManageSubscriptionsIOS: MutationShowManageSubscriptionsIOSHandler? public var syncIOS: MutationSyncIOSHandler? public var validateReceipt: MutationValidateReceiptHandler? @@ -2898,7 +3042,9 @@ public struct MutationHandlers { requestPurchaseOnPromotedProductIOS: MutationRequestPurchaseOnPromotedProductIOSHandler? = nil, restorePurchases: MutationRestorePurchasesHandler? = nil, showAlternativeBillingDialogAndroid: MutationShowAlternativeBillingDialogAndroidHandler? = nil, + showBillingProgramInformationDialogAndroid: MutationShowBillingProgramInformationDialogAndroidHandler? = nil, showExternalPurchaseCustomLinkNoticeIOS: MutationShowExternalPurchaseCustomLinkNoticeIOSHandler? = nil, + showInAppMessagesAndroid: MutationShowInAppMessagesAndroidHandler? = nil, showManageSubscriptionsIOS: MutationShowManageSubscriptionsIOSHandler? = nil, syncIOS: MutationSyncIOSHandler? = nil, validateReceipt: MutationValidateReceiptHandler? = nil, @@ -2925,7 +3071,9 @@ public struct MutationHandlers { self.requestPurchaseOnPromotedProductIOS = requestPurchaseOnPromotedProductIOS self.restorePurchases = restorePurchases self.showAlternativeBillingDialogAndroid = showAlternativeBillingDialogAndroid + self.showBillingProgramInformationDialogAndroid = showBillingProgramInformationDialogAndroid self.showExternalPurchaseCustomLinkNoticeIOS = showExternalPurchaseCustomLinkNoticeIOS + self.showInAppMessagesAndroid = showInAppMessagesAndroid self.showManageSubscriptionsIOS = showManageSubscriptionsIOS self.syncIOS = syncIOS self.validateReceipt = validateReceipt @@ -2943,6 +3091,7 @@ public typealias QueryGetActiveSubscriptionsHandler = (_ subscriptionIds: [Strin public typealias QueryGetAllTransactionsIOSHandler = () async throws -> [PurchaseIOS] public typealias QueryGetAppTransactionIOSHandler = () async throws -> AppTransaction? public typealias QueryGetAvailablePurchasesHandler = (_ options: PurchaseOptions?) async throws -> [Purchase] +public typealias QueryGetBillingChoiceInfoAndroidHandler = (_ params: GetBillingChoiceInfoParamsAndroid) async throws -> BillingChoiceInfoAndroid public typealias QueryGetExternalPurchaseCustomLinkTokenIOSHandler = (_ tokenType: ExternalPurchaseCustomLinkTokenTypeIOS) async throws -> ExternalPurchaseCustomLinkTokenResultIOS public typealias QueryGetPendingTransactionsIOSHandler = () async throws -> [PurchaseIOS] public typealias QueryGetPromotedProductIOSHandler = () async throws -> ProductIOS? @@ -2966,6 +3115,7 @@ public struct QueryHandlers { public var getAllTransactionsIOS: QueryGetAllTransactionsIOSHandler? public var getAppTransactionIOS: QueryGetAppTransactionIOSHandler? public var getAvailablePurchases: QueryGetAvailablePurchasesHandler? + public var getBillingChoiceInfoAndroid: QueryGetBillingChoiceInfoAndroidHandler? public var getExternalPurchaseCustomLinkTokenIOS: QueryGetExternalPurchaseCustomLinkTokenIOSHandler? public var getPendingTransactionsIOS: QueryGetPendingTransactionsIOSHandler? public var getPromotedProductIOS: QueryGetPromotedProductIOSHandler? @@ -2989,6 +3139,7 @@ public struct QueryHandlers { getAllTransactionsIOS: QueryGetAllTransactionsIOSHandler? = nil, getAppTransactionIOS: QueryGetAppTransactionIOSHandler? = nil, getAvailablePurchases: QueryGetAvailablePurchasesHandler? = nil, + getBillingChoiceInfoAndroid: QueryGetBillingChoiceInfoAndroidHandler? = nil, getExternalPurchaseCustomLinkTokenIOS: QueryGetExternalPurchaseCustomLinkTokenIOSHandler? = nil, getPendingTransactionsIOS: QueryGetPendingTransactionsIOSHandler? = nil, getPromotedProductIOS: QueryGetPromotedProductIOSHandler? = nil, @@ -3011,6 +3162,7 @@ public struct QueryHandlers { self.getAllTransactionsIOS = getAllTransactionsIOS self.getAppTransactionIOS = getAppTransactionIOS self.getAvailablePurchases = getAvailablePurchases + self.getBillingChoiceInfoAndroid = getBillingChoiceInfoAndroid self.getExternalPurchaseCustomLinkTokenIOS = getExternalPurchaseCustomLinkTokenIOS self.getPendingTransactionsIOS = getPendingTransactionsIOS self.getPromotedProductIOS = getPromotedProductIOS diff --git a/packages/docs/public/llms-full.txt b/packages/docs/public/llms-full.txt index 60dd2f42d..f59e4091c 100644 --- a/packages/docs/public/llms-full.txt +++ b/packages/docs/public/llms-full.txt @@ -3,7 +3,7 @@ > OpenIAP: Unified in-app purchase specification for iOS & Android > Documentation: https://openiap.dev > Quick Reference: https://openiap.dev/llms.txt -> Generated: 2026-07-04T10:52:01.940Z +> Generated: 2026-07-08T06:25:10.082Z ## Table of Contents 1. Installation @@ -31,10 +31,10 @@ cd ios && pod install ### Swift (iOS/macOS) ```swift // Swift Package Manager -.package(url: "https://github.com/hyodotdev/openiap.git", from: "2.2.4") +.package(url: "https://github.com/hyodotdev/openiap.git", from: "2.2.5-rc.1") // CocoaPods -pod 'openiap', '~> 2.2.4' +pod 'openiap', '~> 2.2.5-rc.1' ``` ### Kotlin (Android) @@ -55,13 +55,13 @@ flutter pub add flutter_inapp_purchase ``` ### Godot -Download `godot-iap-2.4.0-rc.1.zip` from GitHub Releases, extract it to +Download `godot-iap-2.4.0-rc.3.zip` from GitHub Releases, extract it to `addons/godot-iap/`, then enable the plugin in Project Settings. ### Kotlin Multiplatform ```kotlin dependencies { - implementation("io.github.hyochan:kmp-iap:2.4.0-rc.1") + implementation("io.github.hyochan:kmp-iap:2.4.0-rc.3") } ``` @@ -73,7 +73,7 @@ https://central.sonatype.com/artifact/io.github.hyochan/kmp-iap dotnet add package OpenIap.Maui ``` -Current NuGet package version: 1.2.0-rc.1 +Current NuGet package version: 1.2.1-rc.2 Requires .NET 9 or .NET 10, the MAUI workload, iOS 15.0+, and Android API 24+. @@ -191,9 +191,7 @@ Canonical setup docs live under `/docs/setup/store`: Onside. In Expo config plugin options, use `modules.amazon.vegaOS=true`. Bare React Native Vega targets provide their own `manifest.toml`, Kepler package metadata, and runtime - dependencies. Check the Vega SDK release notes for the current supported - React Native for Vega version before choosing Kepler package versions: - https://developer.amazon.com/docs/vega/0.23/vega-release-notes.html + dependencies. `modules.amazon.fireOS` and `modules.amazon.vegaOS` can both be enabled when an app produces separate Fire OS and Vega OS artifacts. Required values: Vega `manifest.toml` package id, title, interactive @@ -231,10 +229,7 @@ uses direct Gradle flavor selection for Fire OS and a separate Kepler target for Vega. Install `@amazon-devices/keplerscript-appstore-iap-lib` and let `react-native-iap` / `expo-iap` select the `kepler` adapter at runtime, similar to how Onside -is selected at the runtime integration layer. Check the Vega SDK release notes -for the current supported React Native for Vega version before choosing Kepler -package versions: -https://developer.amazon.com/docs/vega/0.23/vega-release-notes.html +is selected at the runtime integration layer. --- @@ -689,7 +684,7 @@ await endConnection(); # Google Play Billing Library API Reference -> Reference documentation for Google Play Billing Library 8.x +> Reference documentation for Google Play Billing Library 9.x > Adapt all patterns to match OpenIAP internal conventions. ## Overview @@ -705,8 +700,15 @@ Google Play Billing Library enables in-app purchases and subscriptions on Androi | 8.2 | 2025-12-09 | Billing Programs API (external content links, external offers), deprecates old External Offers API | | 8.2.1 | 2025-12-15 | Bug fix for `isBillingProgramAvailableAsync()` and `createBillingProgramReportingDetailsAsync()` | | 8.3 | 2025-12-23 | External Payments program (Japan only), developer billing options | +| 9.0 | 2026-05-19 | Removes older deprecated APIs, reclassifies blocked Play Store activity errors, adds richer sub-response handling, target SDK 35 | +| 9.1 | 2026-06-18 | Billing Choice APIs: `getBillingChoiceInfoAsync()`, `showBillingProgramInformationDialog()`, choice-screen details | -**Current Version**: 8.3.0 (as of April 2026) +**Current Version**: 9.1.0 (as of July 2026) + +> **OpenIAP audit note**: `packages/google` is pinned to Play Billing 9.1.0. +> Billing Choice APIs are implemented only in the Play flavor; Horizon and +> Amazon variants keep unsupported/default behavior for APIs that do not exist +> in their store SDKs. ## Core Classes @@ -717,7 +719,11 @@ The main interface for communicating with Google Play Billing. ```kotlin val billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) - .enablePendingPurchases() + .enablePendingPurchases( + PendingPurchasesParams.newBuilder() + .enableOneTimeProducts() + .build() + ) // New in 8.0: Auto-reconnect on service disconnect .enableAutoServiceReconnection() .build() @@ -734,7 +740,8 @@ BillingClient.newBuilder(context) When enabled, the library automatically re-establishes the connection if an API call is made while disconnected. This reduces `SERVICE_DISCONNECTED` errors. -> **OpenIAP Note**: Auto-reconnection is **always enabled** internally since OpenIAP uses Billing Library 8.3.0+. No configuration needed. +> **OpenIAP Note**: Auto-reconnection is enabled internally when the Play +> Billing version exposes the API. No OpenIAP app-level configuration is needed. ### Connection Management @@ -1020,11 +1027,11 @@ billingClient.queryPurchasesAsync(params) { billingResult, purchases -> ```kotlin val result = billingClient.launchBillingFlow(activity, params) -when (result.subResponseCode) { - BillingResult.SUB_RESPONSE_CODE_INSUFFICIENT_FUNDS -> { +when (result.onPurchasesUpdatedSubResponseCode) { + BillingClient.OnPurchasesUpdatedSubResponseCode.PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS -> { // User's payment method has insufficient funds } - BillingResult.SUB_RESPONSE_CODE_USER_INELIGIBLE -> { + BillingClient.OnPurchasesUpdatedSubResponseCode.USER_INELIGIBLE -> { // User doesn't meet offer eligibility requirements } } @@ -1036,6 +1043,11 @@ when (result.subResponseCode) { | `USER_INELIGIBLE` | User doesn't meet subscription offer eligibility | | `NO_APPLICABLE_SUB_RESPONSE_CODE` | No specific sub-code applies | +PBL 9 makes sub-response-code handling part of the migration checklist. It also +changes blocked Play Store app cases from generic `ERROR` to +`BILLING_UNAVAILABLE`, with a debug message explaining that Play Store is +blocked. + ## Subscription Product Replacement (8.1+) Product-level replacement parameters for subscription upgrades/downgrades: @@ -1074,10 +1086,15 @@ Billing Library 8.3 (December 2025) added support for the External Payments prog // During BillingClient setup val billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) - .enablePendingPurchases() + .enablePendingPurchases( + PendingPurchasesParams.newBuilder() + .enableOneTimeProducts() + .build() + ) .enableAutoServiceReconnection() - .enableDeveloperBillingOption( - DeveloperBillingOptionParams.newBuilder() + .enableBillingProgram( + EnableBillingProgramParams.newBuilder() + .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS) .setDeveloperProvidedBillingListener(developerBillingListener) .build() ) @@ -1099,7 +1116,12 @@ val developerBillingListener = DeveloperProvidedBillingListener { ```kotlin val params = BillingFlowParams.newBuilder() .setProductDetailsParamsList(listOf(productDetailsParams)) - .setBillingOption(BillingOption.EXTERNAL_PAYMENTS) // 8.3+ + .enableDeveloperBillingOption( + DeveloperBillingOptionParams.newBuilder() + .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS) + .setDeveloperProvidedBillingDetails(developerProvidedBillingDetails) + .build() + ) .build() billingClient.launchBillingFlow(activity, params) @@ -1116,15 +1138,41 @@ billingClient.launchBillingFlow(activity, params) > **OpenIAP Note**: Exposed through the Android-specific `AlternativeBilling*` surface in OpenIAP. Enrolment with Google Play's External Payments program is required; availability is currently restricted to Japan. The Horizon flavor does NOT implement this. +## Billing Choice (9.1+) + +Billing Library 9.1 adds APIs for markets and programs where Google Play shows +the user a billing choice screen. + +| API / Type | Purpose | +|------------|---------| +| `BillingClient.getBillingChoiceInfoAsync()` | Fetches billing choices available to the current user | +| `BillingChoiceInfo` | Contains choice-screen data, including image URLs and loyalty details | +| `GetBillingChoiceInfoParams` | Configures the billing-choice info request | +| `BillingClient.showBillingProgramInformationDialog()` | Shows an information dialog for a billing program | +| `BillingProgramInformationDialogParams` | Configures the information dialog | +| `ChoiceScreenType` | Selects the choice-screen type | + +> **OpenIAP gap**: No GraphQL/OpenIAP surface exists yet for Billing Choice +> info or billing-program information dialogs. Add schema types and Play-flavor +> implementations before advertising PBL 9.1 Billing Choice support. + +## PBL 9 Migration Guardrails + +- Replace removed APIs: `SkuDetails`, `SkuDetailsParams`, `SkuDetailsResponseListener`, `BillingClient.SkuType`, `querySkuDetailsAsync()`, no-argument `enablePendingPurchases()`, and string `queryPurchasesAsync()`. +- Use `ProductDetails`, `QueryProductDetailsParams`, `BillingClient.ProductType`, parameterized `enablePendingPurchases(PendingPurchasesParams)`, and `queryPurchasesAsync(QueryPurchasesParams, ...)`. +- Handle `DeveloperProvidedBillingDetails.getLinkUri()` as nullable. +- Keep Horizon shared code on the Billing 7.0-compatible API subset; put PBL 8/9 code in Play-only sources or behind reflection. + ## Best Practices 1. **Always acknowledge purchases** within 3 days or they will be refunded 2. **Verify purchases server-side** using Google Play Developer API 3. **Handle pending purchases** for payment methods that require additional steps -4. **Auto-reconnect is enabled by default** in OpenIAP (8.0+) +4. **Auto-reconnect is enabled by default** in OpenIAP when available (8.0+) 5. **Check product status codes** (8.0+) to understand why products weren't fetched 6. **Check isSuspended** (8.1+) before granting entitlements -7. **Cache product details** to avoid repeated queries +7. **Handle Billing Choice separately** before claiming PBL 9.1 feature coverage +8. **Cache product details** to avoid repeated queries --- @@ -1145,18 +1193,33 @@ Meta Horizon provides IAP functionality for Quest VR applications. There are two | Library | Version | Compatible With | |---------|---------|-----------------| -| horizon-billing-compatibility | **1.1.1** (latest) | Google Play Billing **7.0** API | -| Google Play Billing (Play flavor) | **8.3.0** (latest) | N/A | +| horizon-billing-compatibility | **2.0.0** (latest) | Google Play Billing **7.0** API | +| Google Play Billing (upstream latest) | **9.1.0** | N/A | +| Google Play Billing (OpenIAP Play flavor) | **9.1.0** | N/A | | react-native-iap | v14+ | Billing 7.0+, RN 0.79+, Kotlin 2.0+ | | expo-iap | latest | Billing 7.0+, Kotlin 2.0+ | -**CRITICAL**: Horizon Billing Compatibility SDK implements Google Play Billing **7.0** API surface, NOT 8.x. +**CRITICAL**: Horizon Billing Compatibility SDK implements Google Play Billing **7.0** API surface, NOT 8.x or 9.x. When writing shared code for both Play and Horizon flavors: -- Use only APIs that exist in **both** Billing 7.0 and 8.x -- Horizon SDK does NOT support Billing 8.x features like auto-reconnect, product status codes, or `includeSuspended` +- Use only APIs that exist in **both** Billing 7.0 and the Play-flavor Billing version +- Horizon SDK does NOT support Billing 8.x/9.x features like auto-reconnect, product status codes, `includeSuspended`, or Billing Choice - OpenIAP handles this automatically with flavor-specific implementations +### Latest Horizon Billing Release + +Meta released Horizon Billing Compatibility Library **2.0.0** on 2026-01-06. +The release notes call out a fix for querying subscription purchases with a +single billing plan and dependencies on Horizon Platform SDK Kotlin +`iap-kotlin` 0.2.0 and `core-kotlin` 0.2.0. + +> **OpenIAP gap**: `packages/google` is still pinned to +> `horizon-billing-compatibility` 1.1.1. Upgrading to 2.0.0 should be tested +> separately with `:openiap:compileHorizonDebugKotlin` and +> subscription-purchase restore coverage. Play Billing 9.1.0 features remain +> Play-flavor-only because Horizon compatibility still targets the Billing 7.0 +> API surface. + ### APIs Available in Both (Safe to use in shared code) - `BillingClient.Builder`, `BillingClient.newBuilder()` @@ -1178,6 +1241,12 @@ When writing shared code for both Play and Horizon flavors: - Billing Programs API (`isBillingProgramAvailableAsync`, etc.) (8.2+) - External Payments / Developer Billing Options (8.3+) +### APIs Only in Billing 9.x (DO NOT use in shared code) + +- Billing Choice information APIs (`getBillingChoiceInfoAsync`, `BillingChoiceInfo`, `ChoiceScreenType`) +- Billing-program information dialog APIs (`showBillingProgramInformationDialog`) +- PBL 9 migration assumptions around APIs removed from the Billing 7.0 surface + ## Billing Compatibility SDK For apps already using Google Play Billing Library, the Horizon Billing Compatibility SDK provides a minimal migration path. @@ -1822,7 +1891,7 @@ export default withIAPContext(Store); This document provides external API reference for Apple's StoreKit 2 framework. -## iOS 18+ Features +## iOS 18+ / 26+ Features | Feature | iOS Version | Description | |---------|-------------|-------------| @@ -1841,6 +1910,11 @@ This document provides external API reference for Apple's StoreKit 2 framework. | JWS promotional offers | WWDC 2025 | New `promotionalOffer` purchase option with JWS format | | `introductoryOfferEligibility` | WWDC 2025 | Set eligibility via purchase option | | `SubscriptionStatus` by Transaction ID | WWDC 2025 | `status(for: transactionID:)` | +| Monthly subscriptions with a 12-month commitment | iOS 26.4 / 26.5 SDK | Monthly billing option for annual auto-renewable subscriptions | +| Group purchases and volume purchasing | WWDC 2026 | Multi-seat auto-renewable subscriptions through StoreKit 2 and Apple Business / School Manager | +| Retention Messaging | WWDC 2026 | Cancellation-flow messaging and offers, including real-time server decisioning | +| Retention offer type | WWDC 2026 | Signed transaction / renewal info can report offer type `5` for retention offers | +| Offer codes for all IAP types | 2026 | Offer codes expand beyond auto-renewable subscriptions; IAP promo-code creation ends March 26, 2026 | ### WWDC 2025 Updates @@ -1849,6 +1923,14 @@ This document provides external API reference for Apple's StoreKit 2 framework. - **Introductory offer eligibility**: Override eligibility check with `introductoryOfferEligibility` purchase option. - Both new purchase options are back-deployed to iOS 15. +### WWDC 2026 Updates + +- **Monthly subscriptions with a 12-month commitment**: iOS 26.5 SDK adds a monthly billing plan for one-year auto-renewable subscriptions. Customers can subscribe on iOS, iPadOS, macOS, tvOS, and visionOS 26.4+. +- **Group purchases and volume purchasing**: Auto-renewable subscriptions using StoreKit 2 can be sold to groups and organizations. In-app group purchases pass a requested seat count into the StoreKit purchase flow; Apple Business Manager and Apple School Manager handle volume purchasing. +- **Volume pricing**: App Store Connect can configure up to five seat-count price bands for larger subscription purchases. +- **Retention Messaging**: App Store Connect can show cancellation-flow retention messages and offers. Real-time Retention Messaging adds a server-to-server decision point and supports a switch-plan view for monthly subscriptions with a 12-month commitment. +- **Offer-code expansion**: Offer codes now support consumables, non-consumables, non-renewing subscriptions, and broader auto-renewable subscription scenarios. Starting March 26, 2026, App Store Connect no longer creates new promo codes for In-App Purchases. + ## appAccountToken A UUID that associates a purchase with a user account in your system. This property allows you to correlate App Store transactions with users in your backend. @@ -2130,6 +2212,43 @@ if let advancedInfo = product.advancedCommerceInfo { } ``` +## Monthly Subscriptions With 12-Month Commitment (iOS 26.4+) + +This billing plan lets customers pay monthly while committing to an annual +auto-renewable subscription. Apps need to compile with the iOS 26.5 SDK to +merchandise the plan, and customers can purchase on Apple platforms running +26.4 or later. + +```swift +let result = try await product.purchase(options: [ + .billingPlanType(.monthly) +]) +``` + +> **OpenIAP Note**: The schema represents this with +> `SubscriptionBillingPlanTypeIOS` and `RequestSubscriptionIOSProps.billingPlanType`. + +## Group Purchases and Volume Purchasing (WWDC 2026) + +StoreKit 2 auto-renewable subscriptions can be sold to multiple seats for +groups or organizations. Volume purchasing is handled by Apple Business Manager +and Apple School Manager. For in-app group purchases, the app starts a StoreKit +purchase with the requested seat count, then Apple can manage invitation links +and seat assignment unless the app integrates custom group management. + +> **OpenIAP gap**: No public OpenIAP request field exists yet for group-purchase +> seat count or StoreKit group-management identifiers. + +## Retention Messaging (WWDC 2026) + +Retention Messaging lets App Store Connect present messages and optional offers +when a subscriber is about to cancel. Real-time Retention Messaging can call a +server endpoint so the developer can choose the message, offer, or switch-plan +view at cancellation time. + +Signed transaction and renewal information can include a retention offer as +offer type `5`. + ## StoreKit Message API (iOS 18+) Listen for App Store–generated messages (billing issues, win-back offers, price increases, generic). diff --git a/packages/docs/public/llms.txt b/packages/docs/public/llms.txt index f4e5f4542..4d2324059 100644 --- a/packages/docs/public/llms.txt +++ b/packages/docs/public/llms.txt @@ -3,7 +3,7 @@ > OpenIAP: Unified in-app purchase specification for iOS & Android > Documentation: https://openiap.dev > Full Reference: https://openiap.dev/llms-full.txt -> Generated: 2026-07-04T10:52:01.940Z +> Generated: 2026-07-08T06:25:10.082Z ## Installation @@ -19,7 +19,7 @@ npm install react-native-iap ### Native ```swift // Swift Package Manager -.package(url: "https://github.com/hyodotdev/openiap.git", from: "2.2.4") +.package(url: "https://github.com/hyodotdev/openiap.git", from: "2.2.5-rc.1") ``` ```kotlin @@ -36,20 +36,20 @@ flutter pub add flutter_inapp_purchase ```gdscript # Godot -# Install godot-iap 2.4.0-rc.1 to addons/godot-iap and enable the plugin +# Install godot-iap 2.4.0-rc.3 to addons/godot-iap and enable the plugin ``` ```kotlin // Kotlin Multiplatform -implementation("io.github.hyochan:kmp-iap:2.4.0-rc.1") +implementation("io.github.hyochan:kmp-iap:2.4.0-rc.3") ``` ```xml - + ``` -Current NuGet package version: 1.2.0-rc.1 +Current NuGet package version: 1.2.1-rc.2 ## Framework Libraries diff --git a/packages/docs/src/components/CodeBlock.tsx b/packages/docs/src/components/CodeBlock.tsx index 43ce47c87..b8544f56f 100644 --- a/packages/docs/src/components/CodeBlock.tsx +++ b/packages/docs/src/components/CodeBlock.tsx @@ -30,9 +30,15 @@ const TYPE_LINKS: Record = { ActiveSubscription: '/docs/types/active-subscription', AlternativeBillingModeAndroid: '/docs/types/alternative-billing-types', AlternativeBillingTypes: '/docs/types/alternative-billing-types', + BillingChoiceImageLayoutAndroid: '/docs/types/billing-programs', + BillingChoiceInfoAndroid: '/docs/types/billing-programs', + BillingChoiceScreenTypeAndroid: '/docs/types/billing-programs', BillingProgramAndroid: '/docs/types/billing-programs', BillingProgramAvailabilityResultAndroid: '/docs/types/billing-programs', + BillingProgramInformationDialogParamsAndroid: '/docs/types/billing-programs', BillingProgramReportingDetailsAndroid: '/docs/types/billing-programs', + BillingResultAndroid: '/docs/types/billing-programs', + DeveloperBillingTypeAndroid: '/docs/types/billing-programs', DeepLinkOptions: '/docs/types#common', DiscountOffer: '/docs/types/discount-offer', ExternalPurchaseLinkResultIOS: '/docs/types/external-purchase-link', @@ -46,6 +52,11 @@ const TYPE_LINKS: Record = { FetchProductsResult: '/docs/types/product-request', InitConnectionConfig: '/docs/types/alternative-billing-types#init-connection-config', + GetBillingChoiceInfoParamsAndroid: '/docs/types/billing-programs', + InAppMessageCategoryAndroid: '/docs/types/billing-programs', + InAppMessageParamsAndroid: '/docs/types/billing-programs', + InAppMessageResponseCodeAndroid: '/docs/types/billing-programs', + InAppMessageResultAndroid: '/docs/types/billing-programs', LaunchExternalLinkParamsAndroid: '/docs/types/billing-programs', Product: '/docs/types/product', ProductAndroid: '/docs/types/product', diff --git a/packages/docs/src/generated/version-metadata.json b/packages/docs/src/generated/version-metadata.json index 520c82c04..378c160d9 100644 --- a/packages/docs/src/generated/version-metadata.json +++ b/packages/docs/src/generated/version-metadata.json @@ -9,7 +9,7 @@ "mauiPackageVersion": "1.2.1-rc.2", "googleCompileSdk": "35", "googleMinSdk": "23", - "googlePlayBillingVersion": "8.3.0", + "googlePlayBillingVersion": "9.1.0", "kmpCompileSdk": "35", "kmpMinSdk": "24", "kmpTargetSdk": "35" diff --git a/packages/docs/src/lib/searchData.ts b/packages/docs/src/lib/searchData.ts index 5de3132ac..96253cd76 100644 --- a/packages/docs/src/lib/searchData.ts +++ b/packages/docs/src/lib/searchData.ts @@ -457,6 +457,16 @@ export const apiData: ApiItem[] = [ returns: 'BillingProgramAvailabilityResultAndroid!', path: '/docs/apis/android/is-billing-program-available-android', }, + { + id: 'get-billing-choice-info-android', + title: 'getBillingChoiceInfoAndroid', + category: 'Android Specific', + description: + 'Fetch Play Billing Choice display assets for developer-rendered choice screens', + parameters: 'params: GetBillingChoiceInfoParamsAndroid!', + returns: 'BillingChoiceInfoAndroid!', + path: '/docs/apis/android/get-billing-choice-info-android', + }, { id: 'launch-external-link-android', title: 'launchExternalLinkAndroid', @@ -477,6 +487,26 @@ export const apiData: ApiItem[] = [ returns: 'BillingProgramReportingDetailsAndroid!', path: '/docs/apis/android/create-billing-program-reporting-details-android', }, + { + id: 'show-billing-program-information-dialog-android', + title: 'showBillingProgramInformationDialogAndroid', + category: 'Android Specific', + description: + 'Show Google Play Billing Choice information dialog for Google-rendered Billing Choice flows', + parameters: 'params: BillingProgramInformationDialogParamsAndroid!', + returns: 'BillingResultAndroid!', + path: '/docs/apis/android/show-billing-program-information-dialog-android', + }, + { + id: 'show-in-app-messages-android', + title: 'showInAppMessagesAndroid', + category: 'Android Specific', + description: + 'Show Google Play billing in-app messages and return subscription status updates when applicable', + parameters: 'params: InAppMessageParamsAndroid', + returns: 'InAppMessageResultAndroid!', + path: '/docs/apis/android/show-in-app-messages-android', + }, // Debugging & Logging (moved to Features) { @@ -822,7 +852,7 @@ export const apiData: ApiItem[] = [ title: 'Billing Programs', category: 'Types', description: - 'Android Billing Programs API (Play Billing 8.2.0+): BillingProgramAndroid, ExternalLink launch modes, Developer Provided Billing parameters', + 'Android Billing Programs API (Play Billing 8.2.0+ and Billing Choice 9.1.0+): BillingProgramAndroid, ExternalLink launch modes, Billing Choice, and Developer Provided Billing parameters', path: '/docs/types/billing-programs', }, diff --git a/packages/docs/src/pages/docs/android-setup.tsx b/packages/docs/src/pages/docs/android-setup.tsx index 5af1a5af0..d5179b60e 100644 --- a/packages/docs/src/pages/docs/android-setup.tsx +++ b/packages/docs/src/pages/docs/android-setup.tsx @@ -1,14 +1,14 @@ import SEO from '../../components/SEO'; -import { OPENIAP_VERSIONS } from '../../lib/versioning'; +import { GOOGLE_PLAY_BILLING, OPENIAP_VERSIONS } from '../../lib/versioning'; function AndroidSetup() { return (

Android Setup Guide

@@ -212,9 +212,10 @@ function AndroidSetup() {

The OpenIAP Android core library (openiap-google) requires minSdk 23 (Android 6.0) with Google Play - Billing 8.x. Each framework library may require a higher minimum — - check the framework-specific setup page for - the exact value. + Billing {GOOGLE_PLAY_BILLING.version}. Each framework library may + require a higher minimum — check the{' '} + framework-specific setup page for the exact + value.

@@ -437,6 +438,59 @@ dependencies { fraud and ensure purchase validity.

+

+ Billing Choice and Billing Programs + + # + +

+

+ OpenIAP's Android core uses Google Play Billing{' '} + {GOOGLE_PLAY_BILLING.version}. Billing Choice is exposed through the + Billing Programs API with{' '} + BillingProgramAndroid.BillingChoice in native Kotlin and{' '} + 'billing-choice' in TypeScript. +

+ +

Subscription Management diff --git a/packages/docs/src/pages/docs/apis/android/create-billing-program-reporting-details-android.tsx b/packages/docs/src/pages/docs/apis/android/create-billing-program-reporting-details-android.tsx index b7e768001..458e77543 100644 --- a/packages/docs/src/pages/docs/apis/android/create-billing-program-reporting-details-android.tsx +++ b/packages/docs/src/pages/docs/apis/android/create-billing-program-reporting-details-android.tsx @@ -27,10 +27,12 @@ function CreateBillingProgramReportingDetailsAndroid() {

Wraps{' '} - BillingClient.createBillingProgramReportingDetailsAsync(BillingProgram) + BillingClient.createBillingProgramReportingDetailsAsync(...) {' '} — returns the external transaction token to report a Developer-Provided - Billing transaction. Play Billing 8.3.0+. See the{' '} + Billing transaction. Play Billing 8.3.0+; the optional developer billing + type parameter is available for Billing Choice in Play Billing 9.1.0+. + See the{' '} ), kmp: ( {`suspend fun createBillingProgramReportingDetailsAndroid( - program: BillingProgramAndroid + program: BillingProgramAndroid, + developerBillingType: DeveloperBillingTypeAndroid? = null ): BillingProgramReportingDetailsAndroid`} ), typescript: ( {`createBillingProgramReportingDetailsAndroid( - program: BillingProgramAndroid + program: BillingProgramAndroid, + developerBillingType?: DeveloperBillingTypeAndroid | null ): Promise`} ), dart: ( {`Future createBillingProgramReportingDetailsAndroid( BillingProgramAndroid program, + {DeveloperBillingTypeAndroid? developerBillingType} );`} ), csharp: ( {`// Returns BillingProgramReportingDetailsAndroid with externalTransactionToken // Token must be reported to Google Play backend within 24 hours // Throws OpenIapError.NotPrepared if billing client not ready -Task CreateBillingProgramReportingDetailsAndroidAsync(BillingProgramAndroid program);`} +Task CreateBillingProgramReportingDetailsAndroidAsync( + BillingProgramAndroid program, + DeveloperBillingTypeAndroid? developerBillingType = null +);`} ), gdscript: ( {`func create_billing_program_reporting_details_android( - program: int + program: int, + developer_billing_type = null ) -> BillingProgramReportingDetailsAndroid`} ), }} @@ -97,6 +107,19 @@ Task CreateBillingProgramReportingDetails {' '} — Billing program identifier. +

  • + developerBillingType{' '} + + (optional,{' '} + + DeveloperBillingTypeAndroid + + ) + {' '} + — Billing Choice reporting destination. Use 'in-app' for + native in-app developer billing, or 'external-link' when + the developer billing option uses a link. +
  • @@ -116,20 +139,6 @@ Task CreateBillingProgramReportingDetails {' '} — Token to send to Google's reporting API. Required for compliance. -
  • - responseCode{' '} - - (number?) - {' '} - — Raw Play Billing response code (when Play returned one). -
  • -
  • - debugMessage{' '} - - (string?) - {' '} - — Optional debug message from Play. -
  • Example

    @@ -152,7 +161,8 @@ import { createBillingProgramReportingDetailsAndroid } from 'expo-iap'; if (Platform.OS === 'android') { const details = await createBillingProgramReportingDetailsAndroid( - 'external-offer', + 'billing-choice', + 'in-app', ); }`} ), diff --git a/packages/docs/src/pages/docs/apis/android/enable-billing-program-android.tsx b/packages/docs/src/pages/docs/apis/android/enable-billing-program-android.tsx index 5a6085aff..9ff8fe0d5 100644 --- a/packages/docs/src/pages/docs/apis/android/enable-billing-program-android.tsx +++ b/packages/docs/src/pages/docs/apis/android/enable-billing-program-android.tsx @@ -21,8 +21,8 @@ function EnableBillingProgramAndroid() { enableBillingProgramAndroid

    - Enables a billing program for Android (Billing Library 8.2.0+). Pass it - as the{' '} + Enables a billing program for Android (Billing Library 8.2.0+; Billing + Choice requires 9.1.0+). Pass it as the{' '} enableBillingProgramAndroid {' '} @@ -37,7 +37,8 @@ function EnableBillingProgramAndroid() { Sets enableBillingProgramAndroid on{' '} InitConnectionConfig; under the hood it configures{' '} BillingClient.Builder.enableBillingPrograms(...) (Play - Billing 8.2.0+). See the{' '} + Billing 8.2.0+). Use 'billing-choice' for Play Billing + 9.1.0 Billing Choice. See the{' '} + +

    + Android{' '} + getBillingChoiceInfoAndroid +

    +

    + Fetches Google Play Billing Choice display information for + developer-rendered choice screens. Play Billing 9.1.0+. +

    +

    + Wraps BillingClient.getBillingChoiceInfoAsync(...). Call + this when{' '} + + isBillingProgramAvailableAndroid('billing-choice') + {' '} + returns choiceScreenType: 'developer-rendered'. +

    + +

    Signature

    + + {{ + kotlin: ( + {`suspend fun getBillingChoiceInfo( + params: GetBillingChoiceInfoParamsAndroid +): BillingChoiceInfoAndroid`} + ), + kmp: ( + {`suspend fun getBillingChoiceInfoAndroid( + params: GetBillingChoiceInfoParamsAndroid +): BillingChoiceInfoAndroid`} + ), + typescript: ( + {`getBillingChoiceInfoAndroid( + params: GetBillingChoiceInfoParamsAndroid +): Promise`} + ), + dart: ( + {`Future getBillingChoiceInfoAndroid( + GetBillingChoiceInfoParamsAndroid params, +);`} + ), + csharp: ( + {`Task GetBillingChoiceInfoAndroidAsync( + GetBillingChoiceInfoParamsAndroid @params +);`} + ), + gdscript: ( + {`func get_billing_choice_info_android( + params: GetBillingChoiceInfoParamsAndroid +) -> BillingChoiceInfoAndroid`} + ), + }} + + + + Parameters + +

    + Pass one{' '} + + GetBillingChoiceInfoParamsAndroid + + : +

    +
      +
    • + billingProgram{' '} + + (optional,{' '} + + BillingProgramAndroid + + ) + {' '} + - defaults to 'billing-choice'. +
    • +
    • + playBillingChoiceImageLayout{' '} + + (optional,{' '} + + BillingChoiceImageLayoutAndroid + + ) + {' '} + - defaults to 'rectangular-four-by-one'. +
    • +
    • + userLocale{' '} + + (optional, string | null) + {' '} + - BCP 47 locale tag. Omit it to use the user's default locale. +
    • +
    + + + Returns + +

    + + Promise<BillingChoiceInfoAndroid> + {' '} + with: +

    +
      +
    • + playBillingChoiceImageUrl{' '} + + (string) + {' '} + - Google Play image URL for the requested layout. +
    • +
    • + playBillingLoyaltyInfo{' '} + + (string | null) + {' '} + - Optional Play loyalty text for the user. +
    • +
    + +

    Example

    + + {{ + kotlin: ( + {`val info = openIapStore.getBillingChoiceInfo( + GetBillingChoiceInfoParamsAndroid( + billingProgram = BillingProgramAndroid.BillingChoice, + playBillingChoiceImageLayout = BillingChoiceImageLayoutAndroid.RectangularFourByOne + ) +)`} + ), + kmp: ( + {`val info = kmpIAP.getBillingChoiceInfoAndroid( + GetBillingChoiceInfoParamsAndroid( + billingProgram = BillingProgramAndroid.BillingChoice, + playBillingChoiceImageLayout = BillingChoiceImageLayoutAndroid.RectangularFourByOne + ) +)`} + ), + typescript: ( + {`import { getBillingChoiceInfoAndroid } from 'expo-iap'; + +if (Platform.OS === 'android') { + const info = await getBillingChoiceInfoAndroid({ + billingProgram: 'billing-choice', + playBillingChoiceImageLayout: 'rectangular-four-by-one', + }); +}`} + ), + dart: ( + {`if (Platform.isAndroid) { + final info = await FlutterInappPurchase.instance.getBillingChoiceInfoAndroid( + GetBillingChoiceInfoParamsAndroid( + billingProgram: BillingProgramAndroid.BillingChoice, + playBillingChoiceImageLayout: + BillingChoiceImageLayoutAndroid.RectangularFourByOne, + ), + ); +}`} + ), + csharp: ( + {`var info = await ((QueryResolver)OpenIapClient.Instance).GetBillingChoiceInfoAndroidAsync( + new GetBillingChoiceInfoParamsAndroid + { + BillingProgram = BillingProgramAndroid.BillingChoice, + PlayBillingChoiceImageLayout = BillingChoiceImageLayoutAndroid.RectangularFourByOne, + });`} + ), + gdscript: ( + {`if iap.get_platform() == "Android": + var params = GetBillingChoiceInfoParamsAndroid.new() + params.billing_program = BillingProgramAndroid.BILLING_CHOICE + params.play_billing_choice_image_layout = BillingChoiceImageLayoutAndroid.RECTANGULAR_FOUR_BY_ONE + var info = await iap.get_billing_choice_info_android(params)`} + ), + }} + +
    + ); +} + +export default GetBillingChoiceInfoAndroid; diff --git a/packages/docs/src/pages/docs/apis/android/is-billing-program-available-android.tsx b/packages/docs/src/pages/docs/apis/android/is-billing-program-available-android.tsx index c272a2180..84c50cb61 100644 --- a/packages/docs/src/pages/docs/apis/android/is-billing-program-available-android.tsx +++ b/packages/docs/src/pages/docs/apis/android/is-billing-program-available-android.tsx @@ -30,7 +30,7 @@ function IsBillingProgramAvailableAndroid() { BillingClient.isBillingProgramAvailableAsync(BillingProgram) {' '} — replaces isExternalOfferAvailableAsync. Play Billing - 8.2.0+. See the{' '} + 8.2.0+; Billing Choice-specific fields require 9.1.0+. See the{' '} IsBillingProgramAvailableAndroidAs {' '} — Whether the billing program is available for this user/device. +
  • + choiceScreenType{' '} + + ( + + BillingChoiceScreenTypeAndroid + + | null) + {' '} + — Populated only for available 'billing-choice' results. +
  • +
  • + isExternalLinkAvailable{' '} + + (boolean | null) + {' '} + — Whether external-link developer billing is available for Billing + Choice. +
  • Example

    @@ -144,7 +163,11 @@ val result = kmpIAP.isBillingProgramAvailableAndroid( import { isBillingProgramAvailableAndroid } from 'expo-iap'; if (Platform.OS === 'android') { - const result = await isBillingProgramAvailableAndroid('external-offer'); + const result = await isBillingProgramAvailableAndroid('billing-choice'); + + if (result.choiceScreenType === 'developer-rendered') { + // Render your choice screen with getBillingChoiceInfoAndroid(). + } }`} ), dart: ( diff --git a/packages/docs/src/pages/docs/apis/android/show-billing-program-information-dialog-android.tsx b/packages/docs/src/pages/docs/apis/android/show-billing-program-information-dialog-android.tsx new file mode 100644 index 000000000..886cd901f --- /dev/null +++ b/packages/docs/src/pages/docs/apis/android/show-billing-program-information-dialog-android.tsx @@ -0,0 +1,180 @@ +import { Link } from 'react-router-dom'; +import AnchorLink from '../../../../components/AnchorLink'; +import CodeBlock from '../../../../components/CodeBlock'; +import LanguageTabs from '../../../../components/LanguageTabs'; +import SEO from '../../../../components/SEO'; +import { useScrollToHash } from '../../../../hooks/useScrollToHash'; + +function ShowBillingProgramInformationDialogAndroid() { + useScrollToHash(); + + return ( +
    + +

    + Android{' '} + showBillingProgramInformationDialogAndroid +

    +

    + Shows Google's billing program information dialog for Billing Choice. + Play Billing 9.1.0+. +

    +

    + Wraps{' '} + BillingClient.showBillingProgramInformationDialog(...). Use + this after obtaining a Billing Choice reporting token when Google + renders the Billing Choice screen. +

    + +

    Signature

    + + {{ + kotlin: ( + {`suspend fun showBillingProgramInformationDialog( + activity: Activity, + params: BillingProgramInformationDialogParamsAndroid +): BillingResultAndroid`} + ), + kmp: ( + {`suspend fun showBillingProgramInformationDialogAndroid( + params: BillingProgramInformationDialogParamsAndroid +): BillingResultAndroid`} + ), + typescript: ( + {`showBillingProgramInformationDialogAndroid( + params: BillingProgramInformationDialogParamsAndroid +): Promise`} + ), + dart: ( + {`Future showBillingProgramInformationDialogAndroid( + BillingProgramInformationDialogParamsAndroid params, +);`} + ), + csharp: ( + {`Task ShowBillingProgramInformationDialogAndroidAsync( + BillingProgramInformationDialogParamsAndroid @params +);`} + ), + gdscript: ( + {`func show_billing_program_information_dialog_android( + params: BillingProgramInformationDialogParamsAndroid +) -> BillingResultAndroid`} + ), + }} + + + + Parameters + +

    + Pass one{' '} + + BillingProgramInformationDialogParamsAndroid + + : +

    +
      +
    • + billingProgram{' '} + + (optional,{' '} + + BillingProgramAndroid + + ) + {' '} + - defaults to 'billing-choice'. +
    • +
    • + externalTransactionToken{' '} + + (required, string) + {' '} + - token from{' '} + + createBillingProgramReportingDetailsAndroid() + + . +
    • +
    + + + Returns + +

    + + Promise<BillingResultAndroid> + {' '} + with responseCode, optional debugMessage, and + optional subResponseCode. +

    + +

    Example

    + + {{ + kotlin: ( + {`val result = openIapStore.showBillingProgramInformationDialog( + activity, + BillingProgramInformationDialogParamsAndroid( + billingProgram = BillingProgramAndroid.BillingChoice, + externalTransactionToken = reportingDetails.externalTransactionToken + ) +)`} + ), + kmp: ( + {`val result = kmpIAP.showBillingProgramInformationDialogAndroid( + BillingProgramInformationDialogParamsAndroid( + billingProgram = BillingProgramAndroid.BillingChoice, + externalTransactionToken = reportingDetails.externalTransactionToken + ) +)`} + ), + typescript: ( + {`import { showBillingProgramInformationDialogAndroid } from 'expo-iap'; + +if (Platform.OS === 'android') { + const result = await showBillingProgramInformationDialogAndroid({ + billingProgram: 'billing-choice', + externalTransactionToken: reportingDetails.externalTransactionToken, + }); +}`} + ), + dart: ( + {`if (Platform.isAndroid) { + final result = await FlutterInappPurchase.instance + .showBillingProgramInformationDialogAndroid( + BillingProgramInformationDialogParamsAndroid( + billingProgram: BillingProgramAndroid.BillingChoice, + externalTransactionToken: reportingDetails.externalTransactionToken, + ), + ); +}`} + ), + csharp: ( + {`var result = await ((MutationResolver)OpenIapClient.Instance) + .ShowBillingProgramInformationDialogAndroidAsync( + new BillingProgramInformationDialogParamsAndroid + { + BillingProgram = BillingProgramAndroid.BillingChoice, + ExternalTransactionToken = reportingDetails.ExternalTransactionToken, + });`} + ), + gdscript: ( + {`if iap.get_platform() == "Android": + var params = BillingProgramInformationDialogParamsAndroid.new() + params.billing_program = BillingProgramAndroid.BILLING_CHOICE + params.external_transaction_token = reporting_details.external_transaction_token + var result = await iap.show_billing_program_information_dialog_android(params)`} + ), + }} + +
    + ); +} + +export default ShowBillingProgramInformationDialogAndroid; diff --git a/packages/docs/src/pages/docs/apis/android/show-in-app-messages-android.tsx b/packages/docs/src/pages/docs/apis/android/show-in-app-messages-android.tsx new file mode 100644 index 000000000..00ce97cfc --- /dev/null +++ b/packages/docs/src/pages/docs/apis/android/show-in-app-messages-android.tsx @@ -0,0 +1,179 @@ +import { Link } from 'react-router-dom'; +import AnchorLink from '../../../../components/AnchorLink'; +import CodeBlock from '../../../../components/CodeBlock'; +import LanguageTabs from '../../../../components/LanguageTabs'; +import SEO from '../../../../components/SEO'; +import { useScrollToHash } from '../../../../hooks/useScrollToHash'; + +function ShowInAppMessagesAndroid() { + useScrollToHash(); + + return ( +
    + +

    + Android{' '} + showInAppMessagesAndroid +

    +

    + Shows Google Play billing in-app messages, such as transactional + subscription updates. Play Billing 4.1.0+. +

    +

    + Wraps BillingClient.showInAppMessages(...). If the result + is 'subscription-status-updated', use the returned{' '} + purchaseToken to refresh the affected subscription state. +

    + +

    Signature

    + + {{ + kotlin: ( + {`suspend fun showInAppMessages( + activity: Activity, + params: InAppMessageParamsAndroid? = null +): InAppMessageResultAndroid`} + ), + kmp: ( + {`suspend fun showInAppMessagesAndroid( + params: InAppMessageParamsAndroid? = null +): InAppMessageResultAndroid`} + ), + typescript: ( + {`showInAppMessagesAndroid( + params?: InAppMessageParamsAndroid | null +): Promise`} + ), + dart: ( + {`Future showInAppMessagesAndroid([ + InAppMessageParamsAndroid? params, +]);`} + ), + csharp: ( + {`Task ShowInAppMessagesAndroidAsync( + InAppMessageParamsAndroid? @params = null +);`} + ), + gdscript: ( + {`func show_in_app_messages_android( + params: InAppMessageParamsAndroid = null +) -> InAppMessageResultAndroid`} + ), + }} + + + + Parameters + +

    + Optional{' '} + + InAppMessageParamsAndroid + + : +

    +
      +
    • + categories{' '} + + (optional,{' '} + + InAppMessageCategoryAndroid[] | null + + ) + {' '} + - defaults to 'transactional' messages. +
    • +
    + + + Returns + +

    + + Promise<InAppMessageResultAndroid> + {' '} + with: +

    +
      +
    • + responseCode{' '} + + ( + + InAppMessageResponseCodeAndroid + + ) + {' '} + - result of the in-app message flow. +
    • +
    • + purchaseToken{' '} + + (string | null) + {' '} + - present when a subscription status changed. +
    • +
    + +

    Example

    + + {{ + kotlin: ( + {`val result = openIapStore.showInAppMessages( + activity, + InAppMessageParamsAndroid( + categories = listOf(InAppMessageCategoryAndroid.Transactional) + ) +)`} + ), + kmp: ( + {`val result = kmpIAP.showInAppMessagesAndroid( + InAppMessageParamsAndroid( + categories = listOf(InAppMessageCategoryAndroid.Transactional) + ) +)`} + ), + typescript: ( + {`import { showInAppMessagesAndroid } from 'expo-iap'; + +if (Platform.OS === 'android') { + const result = await showInAppMessagesAndroid({ + categories: ['transactional'], + }); +}`} + ), + dart: ( + {`if (Platform.isAndroid) { + final result = await FlutterInappPurchase.instance.showInAppMessagesAndroid( + InAppMessageParamsAndroid( + categories: [InAppMessageCategoryAndroid.Transactional], + ), + ); +}`} + ), + csharp: ( + {`var result = await ((MutationResolver)OpenIapClient.Instance) + .ShowInAppMessagesAndroidAsync(new InAppMessageParamsAndroid + { + Categories = new[] { InAppMessageCategoryAndroid.Transactional }, + });`} + ), + gdscript: ( + {`if iap.get_platform() == "Android": + var params = InAppMessageParamsAndroid.new() + params.categories = [InAppMessageCategoryAndroid.TRANSACTIONAL] + var result = await iap.show_in_app_messages_android(params)`} + ), + }} + +
    + ); +} + +export default ShowInAppMessagesAndroid; diff --git a/packages/docs/src/pages/docs/apis/index.tsx b/packages/docs/src/pages/docs/apis/index.tsx index 54c07ac97..7874da07f 100644 --- a/packages/docs/src/pages/docs/apis/index.tsx +++ b/packages/docs/src/pages/docs/apis/index.tsx @@ -71,10 +71,16 @@ const LEGACY_ANCHOR_REDIRECTS: Record = { '/docs/apis/android/enable-billing-program-android', 'is-billing-program-available-android': '/docs/apis/android/is-billing-program-available-android', + 'get-billing-choice-info-android': + '/docs/apis/android/get-billing-choice-info-android', 'launch-external-link-android': '/docs/apis/android/launch-external-link-android', 'create-billing-program-reporting-details-android': '/docs/apis/android/create-billing-program-reporting-details-android', + 'show-billing-program-information-dialog-android': + '/docs/apis/android/show-billing-program-information-dialog-android', + 'show-in-app-messages-android': + '/docs/apis/android/show-in-app-messages-android', // Validation/Refund/Debugging moved to Features 'verify-purchase': '/docs/features/validation#verify-purchase', 'verify-purchase-with-provider': @@ -706,6 +712,17 @@ function APIsIndex() { available for the current user. + + + + getBillingChoiceInfoAndroid + + + + Fetch Play Billing Choice assets for developer-rendered choice + screens (Play Billing 9.1.0+). + + @@ -728,6 +745,28 @@ function APIsIndex() { Developer-Provided Billing transaction (Play Billing 8.3.0+). + + + + showBillingProgramInformationDialogAndroid + + + + Show Google's Billing Choice information dialog (Play Billing + 9.1.0+). + + + + + + showInAppMessagesAndroid + + + + Show Play billing in-app messages and return subscription status + updates when applicable. + + diff --git a/packages/docs/src/pages/docs/apis/init-connection.tsx b/packages/docs/src/pages/docs/apis/init-connection.tsx index 10659b6af..a4ac716c9 100644 --- a/packages/docs/src/pages/docs/apis/init-connection.tsx +++ b/packages/docs/src/pages/docs/apis/init-connection.tsx @@ -105,10 +105,11 @@ function InitConnection() { ) {' '} - — Android. Enable a Play Billing 8.2.0+ program ( - EXTERNAL_CONTENT_LINK / EXTERNAL_OFFER) at - connection time. EXTERNAL_PAYMENTS is gated to Billing - 8.3.0+ (Japan only). + — Android. Enable a Play Billing program at + connection time. EXTERNAL_CONTENT_LINK and{' '} + EXTERNAL_OFFER require Billing 8.2.0+;{' '} + EXTERNAL_PAYMENTS requires Billing 8.3.0+ (Japan only); + BILLING_CHOICE requires Billing 9.1.0+. diff --git a/packages/docs/src/pages/docs/index.tsx b/packages/docs/src/pages/docs/index.tsx index d07f8375d..d15cfa040 100644 --- a/packages/docs/src/pages/docs/index.tsx +++ b/packages/docs/src/pages/docs/index.tsx @@ -91,8 +91,11 @@ import APIsShowAlternativeBillingDialogAndroid from './apis/android/show-alterna import APIsCreateAlternativeBillingTokenAndroid from './apis/android/create-alternative-billing-token-android'; import APIsEnableBillingProgramAndroid from './apis/android/enable-billing-program-android'; import APIsIsBillingProgramAvailableAndroid from './apis/android/is-billing-program-available-android'; +import APIsGetBillingChoiceInfoAndroid from './apis/android/get-billing-choice-info-android'; import APIsLaunchExternalLinkAndroid from './apis/android/launch-external-link-android'; import APIsCreateBillingProgramReportingDetailsAndroid from './apis/android/create-billing-program-reporting-details-android'; +import APIsShowBillingProgramInformationDialogAndroid from './apis/android/show-billing-program-information-dialog-android'; +import APIsShowInAppMessagesAndroid from './apis/android/show-in-app-messages-android'; import Events from './events'; import Webhooks from './webhooks'; import KitBackend from './kit-backend'; @@ -682,6 +685,10 @@ function Docs() { to: '/docs/apis/android/is-billing-program-available-android', label: 'isBillingProgramAvailableAndroid', }, + { + to: '/docs/apis/android/get-billing-choice-info-android', + label: 'getBillingChoiceInfoAndroid', + }, { to: '/docs/apis/android/launch-external-link-android', label: 'launchExternalLinkAndroid', @@ -690,6 +697,14 @@ function Docs() { to: '/docs/apis/android/create-billing-program-reporting-details-android', label: 'createBillingProgramReportingDetailsAndroid', }, + { + to: '/docs/apis/android/show-billing-program-information-dialog-android', + label: 'showBillingProgramInformationDialogAndroid', + }, + { + to: '/docs/apis/android/show-in-app-messages-android', + label: 'showInAppMessagesAndroid', + }, ], }, ]} @@ -1284,6 +1299,10 @@ function Docs() { path="apis/android/is-billing-program-available-android" element={} /> + } + /> } @@ -1292,6 +1311,14 @@ function Docs() { path="apis/android/create-billing-program-reporting-details-android" element={} /> + } + /> + } + /> } diff --git a/packages/docs/src/pages/docs/types/alternative-billing-types.tsx b/packages/docs/src/pages/docs/types/alternative-billing-types.tsx index ae9b348f1..206c5589e 100644 --- a/packages/docs/src/pages/docs/types/alternative-billing-types.tsx +++ b/packages/docs/src/pages/docs/types/alternative-billing-types.tsx @@ -157,7 +157,8 @@ function AlternativeBillingTypes() { during connection. Use USER_CHOICE_BILLING for user choice, EXTERNAL_OFFER for alternative only, or{' '} EXTERNAL_PAYMENTS for Japan external payments - (8.3.0+). + (8.3.0+). Use BILLING_CHOICE for Billing Choice + (9.1.0+). diff --git a/packages/docs/src/pages/docs/types/billing-programs.tsx b/packages/docs/src/pages/docs/types/billing-programs.tsx index 297c46ec3..e69b6c5e7 100644 --- a/packages/docs/src/pages/docs/types/billing-programs.tsx +++ b/packages/docs/src/pages/docs/types/billing-programs.tsx @@ -24,11 +24,11 @@ function BillingPrograms() {

    Google Play Billing Library 8.2.0+ introduces the Billing Programs API, which provides a more structured approach to external offers and - content links. Version 8.3.0 adds External Payments for Japan. + content links. Version 8.3.0 adds External Payments for Japan, and + 9.1.0 adds Billing Choice.

    - Identifiers for Play Billing 8.2.0+ programs (External Payments, - etc.). Android only ( + Identifiers for Play Billing programs. Android only ( 8.3.0 release notes + {' · '} + + 9.1.0 release notes +

    @@ -120,6 +128,16 @@ function BillingPrograms() { 8.3.0+ + + + BILLING_CHOICE + + + Present Google Play Billing alongside an alternative in-app + billing system or external web link + + 9.1.0+ + @@ -162,6 +180,75 @@ function BillingPrograms() { The billing program that was checked + + + choiceScreenType + + + + BillingChoiceScreenTypeAndroid + + | null + + + Billing Choice renderer. Present only for available{' '} + BILLING_CHOICE checks. + + + + + isExternalLinkAvailable + + + boolean | null + + + Whether external-link developer billing is available for Billing + Choice. + + + + + + + BillingChoiceScreenTypeAndroid + +

    How the Billing Choice screen should be rendered (9.1.0+):

    + + + + + + + + + + + + + + + + + + + +
    NameSummary
    + UNSPECIFIED + Unspecified renderer.
    + DEVELOPER_RENDERED + + The app renders the Billing Choice screen using{' '} + + getBillingChoiceInfoAndroid() + + . +
    + GOOGLE_RENDERED + + Google Play renders the Billing Choice screen and information + dialog. +
    @@ -210,6 +297,259 @@ function BillingPrograms() { + + DeveloperBillingTypeAndroid + +

    + Developer billing destination type used when creating Billing Choice + reporting details (9.1.0+): +

    + + + + + + + + + + + + + + + + + + + + + +
    NameSummary
    + DEVELOPER_BILLING_TYPE_UNSPECIFIED + Unspecified type. Do not use.
    + IN_APP + Developer-provided billing inside the app.
    + EXTERNAL_LINK + Developer-provided billing via an external link.
    + + + BillingResultAndroid + +

    Billing operation result returned by Billing Choice dialogs:

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeSummary
    + responseCode + + number + Play Billing response code.
    + debugMessage + + string | null + Optional Play Billing debug message.
    + subResponseCode + + SubResponseCodeAndroid | null + Optional granular response code.
    + + + BillingChoiceImageLayoutAndroid + +

    Image layout requested for developer-rendered Billing Choice:

    + + + + + + + + + + + + + + + + + + + + + +
    NameSummary
    + RECTANGULAR_FOUR_BY_ONE + Rectangular image with a 4:1 aspect ratio.
    + RECTANGULAR_THREE_BY_ONE + Rectangular image with a 3:1 aspect ratio.
    + RECTANGULAR_TWO_BY_TWO + Rectangular image with a 2:2 aspect ratio.
    + + + GetBillingChoiceInfoParamsAndroid + +

    + Parameters for{' '} + + getBillingChoiceInfoAndroid() + + : +

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeSummary
    + billingProgram + + + BillingProgramAndroid + + + Billing program. Defaults to BILLING_CHOICE. +
    + playBillingChoiceImageLayout + + + BillingChoiceImageLayoutAndroid + + + Requested image layout. Defaults to{' '} + RECTANGULAR_FOUR_BY_ONE. +
    + userLocale + + string | null + Optional BCP 47 locale tag.
    + + + BillingChoiceInfoAndroid + +

    + Display information for developer-rendered Billing Choice screens: +

    + + + + + + + + + + + + + + + + + + + + +
    NameTypeSummary
    + playBillingChoiceImageUrl + + string + Play Billing image URL for the requested layout.
    + playBillingLoyaltyInfo + + string | null + Optional Play loyalty information for the user.
    + + + BillingProgramInformationDialogParamsAndroid + +

    + Parameters for{' '} + + showBillingProgramInformationDialogAndroid() + + : +

    + + + + + + + + + + + + + + + + + + + + +
    NameTypeSummary
    + billingProgram + + + BillingProgramAndroid + + + Billing program. Defaults to BILLING_CHOICE. +
    + externalTransactionToken + + string + Billing Choice reporting token.
    + LaunchExternalLinkParamsAndroid @@ -353,7 +693,7 @@ function BillingPrograms() {

    Parameters for configuring developer billing option in purchase flow - (8.3.0+): + (8.3.0+; Billing Choice also uses this shape in 9.1.0+):

    @@ -374,7 +714,8 @@ function BillingPrograms() { @@ -459,6 +800,140 @@ function BillingPrograms() {
    - The billing program (usually EXTERNAL_PAYMENTS) + The billing program (usually EXTERNAL_PAYMENTS or{' '} + BILLING_CHOICE)
    + + InAppMessageCategoryAndroid + +

    In-app billing message categories:

    + + + + + + + + + + + + + + + + + +
    NameSummary
    + UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID + Unknown category. Do not use.
    + TRANSACTIONAL + + Transactional billing messages, such as subscription status + changes. +
    + + + InAppMessageParamsAndroid + +

    + Parameters for{' '} + + showInAppMessagesAndroid() + + : +

    + + + + + + + + + + + + + + + +
    NameTypeSummary
    + categories + + + InAppMessageCategoryAndroid[] + + | null + + Categories to show. Defaults to TRANSACTIONAL. +
    + + + InAppMessageResponseCodeAndroid + +

    Result code returned by Play billing in-app messages:

    + + + + + + + + + + + + + + + + + +
    NameSummary
    + NO_ACTION_NEEDED + Flow finished and no developer action is needed.
    + SUBSCRIPTION_STATUS_UPDATED + + Subscription status changed; refresh the purchase referenced by + the returned token. +
    + + + InAppMessageResultAndroid + +

    Result of showing Play billing in-app messages:

    + + + + + + + + + + + + + + + + + + + + +
    NameTypeSummary
    + responseCode + + + InAppMessageResponseCodeAndroid + + Flow result.
    + purchaseToken + + string | null + + Purchase token returned when a subscription status changed. +
    + Usage Example diff --git a/packages/docs/src/pages/docs/updates/releases.tsx b/packages/docs/src/pages/docs/updates/releases.tsx index 6c51e6e6a..3678b23d7 100644 --- a/packages/docs/src/pages/docs/updates/releases.tsx +++ b/packages/docs/src/pages/docs/updates/releases.tsx @@ -26,6 +26,227 @@ function Releases() { useScrollToHash(); const allNotes: Note[] = [ + // July 8, 2026 — Play Billing 9.1.0 Billing Choice support + { + id: 'play-billing-9-1-billing-choice-2026-07-08', + date: new Date('2026-07-08'), + element: ( +
    + + July 8, 2026 — Play Billing 9.1.0 Billing Choice support + + +

    + Ships Google Play Billing Library 9.1.0 support across Android + implementations. The OpenIAP spec adds BILLING_CHOICE{' '} + plus Billing Choice display, dialog, reporting, and in-app message + types; framework packages expose the same Android APIs while Apple + remains behavior-compatible with the existing StoreKit surface. +

    + +
      +
    • + Billing Choice —{' '} + BillingProgramAndroid.BILLING_CHOICE is available in + the Billing Programs API. Availability now reports{' '} + choiceScreenType and{' '} + isExternalLinkAvailable when Play returns Billing + Choice details. +
    • +
    • + New Android APIs —{' '} + + getBillingChoiceInfoAndroid + + ,{' '} + + showBillingProgramInformationDialogAndroid + + , and{' '} + + showInAppMessagesAndroid + {' '} + are wired through native Android, React Native, Expo, Flutter, + KMP, Godot, and MAUI. +
    • +
    • + Reporting details —{' '} + createBillingProgramReportingDetailsAndroid now + accepts an optional developerBillingType so Billing + Choice flows can distinguish in-app developer billing from + external-link developer billing. +
    • +
    • + Framework parity — generated types and wrapper + APIs are synced for React Native, Expo, Flutter, KMP, Godot, and + MAUI; Android non-Play variants return unsupported/default results + where Google Play Billing APIs are unavailable. +
    • +
    + + +
    + ), + }, + // July 3, 2026 — Amazon config plugin option shape { id: 'amazon-config-plugin-option-shape-2026-07-03', diff --git a/packages/google/README.md b/packages/google/README.md index 09c92b894..410fb7ad2 100644 --- a/packages/google/README.md +++ b/packages/google/README.md @@ -14,7 +14,7 @@ [![CI](https://github.com/hyodotdev/openiap/actions/workflows/ci.yml/badge.svg)](https://github.com/hyodotdev/openiap/actions/workflows/ci.yml) [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) -Modern Android Kotlin library for in-app purchases using Google Play Billing Library v8. +Modern Android Kotlin library for in-app purchases using Google Play Billing Library v9. ## Documentation @@ -22,7 +22,7 @@ Visit [**openiap.dev**](https://openiap.dev) for complete documentation, API ref ## Features -- Google Play Billing v8 +- Google Play Billing v9 - Kotlin Coroutines - Type-safe API with sealed classes - Real-time purchase events @@ -33,7 +33,7 @@ Visit [**openiap.dev**](https://openiap.dev) for complete documentation, API ref - **Minimum SDK**: 23 (Android 6.0) - **Compile SDK**: 35 -- **Google Play Billing**: v8.3.0 +- **Google Play Billing**: v9.1.0 - **Kotlin**: 2.2.0+ ## Installation diff --git a/packages/google/gradle.properties b/packages/google/gradle.properties index 4af10984f..ca84c4f7f 100644 --- a/packages/google/gradle.properties +++ b/packages/google/gradle.properties @@ -18,7 +18,7 @@ android.nonTransitiveRClass=true # Library Info OPENIAP_GROUP_ID=io.github.hyochan.openiap OPENIAP_ARTIFACT_ID=openiap-google -OPENIAP_DESCRIPTION=OpenIAP Android library using Google Play Billing v8 +OPENIAP_DESCRIPTION=OpenIAP Android library using Google Play Billing v9 # Publishing POM_URL=https://github.com/hyodotdev/openiap/tree/main/packages/google diff --git a/packages/google/openiap/build.gradle.kts b/packages/google/openiap/build.gradle.kts index 8a0d00727..fafc69fc9 100644 --- a/packages/google/openiap/build.gradle.kts +++ b/packages/google/openiap/build.gradle.kts @@ -126,7 +126,7 @@ kotlin { } dependencies { - val playBillingVersion = "8.3.0" + val playBillingVersion = "9.1.0" val coroutinesVersion = "1.9.0" val horizonPlatformVersion = "77.0.1" val horizonBillingCompatibilityVersion = "1.1.1" @@ -139,7 +139,7 @@ dependencies { // - Horizon flavor uses Meta Horizon Billing Compatibility Library // Play flavor: Google Play Billing API (compile + runtime) - // Version 8.3.0 adds External Payments Program support (Japan only) + // Version 9.1.0 adds Billing Choice and keeps 8.3.0 External Payments support. add("playCompileOnly", "com.android.billingclient:billing-ktx:$playBillingVersion") add("playApi", "com.android.billingclient:billing-ktx:$playBillingVersion") diff --git a/packages/google/openiap/src/amazon/java/dev/hyo/openiap/OpenIapModule.kt b/packages/google/openiap/src/amazon/java/dev/hyo/openiap/OpenIapModule.kt index ca7ffea8a..c1742fa90 100644 --- a/packages/google/openiap/src/amazon/java/dev/hyo/openiap/OpenIapModule.kt +++ b/packages/google/openiap/src/amazon/java/dev/hyo/openiap/OpenIapModule.kt @@ -540,6 +540,9 @@ class OpenIapModule( fetchProducts = fetchProducts, getActiveSubscriptions = getActiveSubscriptions, getAvailablePurchases = getAvailablePurchases, + getBillingChoiceInfoAndroid = { params -> + getBillingChoiceInfo(params) + }, getStorefront = { getStorefront() }, getStorefrontIOS = { getStorefront() }, hasActiveSubscriptions = hasActiveSubscriptions @@ -551,8 +554,8 @@ class OpenIapModule( checkAlternativeBillingAvailabilityAndroid = { checkAlternativeBillingAvailability() }, consumePurchaseAndroid = consumePurchaseAndroid, createAlternativeBillingTokenAndroid = { createAlternativeBillingReportingToken() }, - createBillingProgramReportingDetailsAndroid = { program -> - createBillingProgramReportingDetails(program) + createBillingProgramReportingDetailsAndroid = { program, developerBillingType -> + createBillingProgramReportingDetails(program, developerBillingType) }, deepLinkToSubscriptions = deepLinkToSubscriptions, endConnection = endConnection, @@ -571,6 +574,16 @@ class OpenIapModule( ?: throw OpenIapError.MissingCurrentActivity showAlternativeBillingInformationDialog(activity) }, + showBillingProgramInformationDialogAndroid = { params -> + val activity = currentActivityRef?.get() + ?: throw OpenIapError.MissingCurrentActivity + showBillingProgramInformationDialog(activity, params) + }, + showInAppMessagesAndroid = { params -> + val activity = currentActivityRef?.get() + ?: throw OpenIapError.MissingCurrentActivity + showInAppMessages(activity, params) + }, validateReceipt = validateReceipt, verifyPurchase = verifyPurchase, verifyPurchaseWithProvider = verifyPurchaseWithProvider @@ -641,7 +654,8 @@ class OpenIapModule( ) override suspend fun createBillingProgramReportingDetails( - program: BillingProgramAndroid + program: BillingProgramAndroid, + developerBillingType: DeveloperBillingTypeAndroid? ): BillingProgramReportingDetailsAndroid { throw OpenIapError.FeatureNotSupported("Amazon Appstore does not support Google Play billing programs") } @@ -651,6 +665,26 @@ class OpenIapModule( params: LaunchExternalLinkParamsAndroid ): Boolean = false + override suspend fun getBillingChoiceInfo(params: GetBillingChoiceInfoParamsAndroid): BillingChoiceInfoAndroid { + throw OpenIapError.FeatureNotSupported("Amazon Appstore does not support Google Play Billing Choice") + } + + override suspend fun showBillingProgramInformationDialog( + activity: Activity, + params: BillingProgramInformationDialogParamsAndroid + ): BillingResultAndroid = BillingResultAndroid( + responseCode = 2, + debugMessage = "Amazon Appstore does not support Google Play Billing Choice" + ) + + override suspend fun showInAppMessages( + activity: Activity, + params: InAppMessageParamsAndroid? + ): InAppMessageResultAndroid = InAppMessageResultAndroid( + responseCode = InAppMessageResponseCodeAndroid.NoActionNeeded, + purchaseToken = null + ) + override fun onUserDataResponse(userDataResponse: UserDataResponse) { updateStorefront(userDataResponse.userData) completeOrCache( diff --git a/packages/google/openiap/src/horizon/java/dev/hyo/openiap/OpenIapModule.kt b/packages/google/openiap/src/horizon/java/dev/hyo/openiap/OpenIapModule.kt index fa98f2206..4e223aa3c 100644 --- a/packages/google/openiap/src/horizon/java/dev/hyo/openiap/OpenIapModule.kt +++ b/packages/google/openiap/src/horizon/java/dev/hyo/openiap/OpenIapModule.kt @@ -769,6 +769,9 @@ class OpenIapModule( fetchProducts = fetchProducts, getActiveSubscriptions = getActiveSubscriptions, getAvailablePurchases = getAvailablePurchases, + getBillingChoiceInfoAndroid = { params -> + getBillingChoiceInfo(params) + }, getStorefront = { getStorefront() }, getStorefrontIOS = { getStorefront() }, hasActiveSubscriptions = hasActiveSubscriptions @@ -784,8 +787,8 @@ class OpenIapModule( createAlternativeBillingTokenAndroid = { createAlternativeBillingReportingToken() }, - createBillingProgramReportingDetailsAndroid = { program -> - createBillingProgramReportingDetails(program) + createBillingProgramReportingDetailsAndroid = { program, developerBillingType -> + createBillingProgramReportingDetails(program, developerBillingType) }, deepLinkToSubscriptions = deepLinkToSubscriptions, endConnection = endConnection, @@ -804,6 +807,28 @@ class OpenIapModule( val activity = currentActivityRef?.get() ?: fallbackActivity if (activity == null) false else showAlternativeBillingInformationDialog(activity) }, + showBillingProgramInformationDialogAndroid = { params -> + val activity = currentActivityRef?.get() ?: fallbackActivity + if (activity == null) { + BillingResultAndroid( + responseCode = 5, + debugMessage = "Missing current activity" + ) + } else { + showBillingProgramInformationDialog(activity, params) + } + }, + showInAppMessagesAndroid = { params -> + val activity = currentActivityRef?.get() ?: fallbackActivity + if (activity == null) { + InAppMessageResultAndroid( + responseCode = InAppMessageResponseCodeAndroid.NoActionNeeded, + purchaseToken = null + ) + } else { + showInAppMessages(activity, params) + } + }, validateReceipt = validateReceipt, verifyPurchase = verifyPurchase, verifyPurchaseWithProvider = verifyPurchaseWithProvider @@ -1162,7 +1187,10 @@ class OpenIapModule( ) } - override suspend fun createBillingProgramReportingDetails(program: BillingProgramAndroid): BillingProgramReportingDetailsAndroid { + override suspend fun createBillingProgramReportingDetails( + program: BillingProgramAndroid, + developerBillingType: DeveloperBillingTypeAndroid? + ): BillingProgramReportingDetailsAndroid { // No-op: Billing Programs is a Google Play 8.2.0+ feature, not supported on Meta Horizon OpenIapLog.w("createBillingProgramReportingDetails is not supported on Meta Horizon (no-op)", TAG) return BillingProgramReportingDetailsAndroid( @@ -1176,4 +1204,31 @@ class OpenIapModule( OpenIapLog.w("launchExternalLink is not supported on Meta Horizon (no-op)", TAG) return false } + + override suspend fun getBillingChoiceInfo(params: GetBillingChoiceInfoParamsAndroid): BillingChoiceInfoAndroid { + OpenIapLog.w("getBillingChoiceInfo is not supported on Meta Horizon", TAG) + throw OpenIapError.FeatureNotSupported("Meta Horizon does not support Google Play Billing Choice") + } + + override suspend fun showBillingProgramInformationDialog( + activity: Activity, + params: BillingProgramInformationDialogParamsAndroid + ): BillingResultAndroid { + OpenIapLog.w("showBillingProgramInformationDialog is not supported on Meta Horizon", TAG) + return BillingResultAndroid( + responseCode = 2, + debugMessage = "Meta Horizon does not support Google Play Billing Choice" + ) + } + + override suspend fun showInAppMessages( + activity: Activity, + params: InAppMessageParamsAndroid? + ): InAppMessageResultAndroid { + OpenIapLog.w("showInAppMessages is not supported on Meta Horizon", TAG) + return InAppMessageResultAndroid( + responseCode = InAppMessageResponseCodeAndroid.NoActionNeeded, + purchaseToken = null + ) + } } diff --git a/packages/google/openiap/src/main/java/dev/hyo/openiap/OpenIapProtocol.kt b/packages/google/openiap/src/main/java/dev/hyo/openiap/OpenIapProtocol.kt index ba0d7dea5..a29b075aa 100644 --- a/packages/google/openiap/src/main/java/dev/hyo/openiap/OpenIapProtocol.kt +++ b/packages/google/openiap/src/main/java/dev/hyo/openiap/OpenIapProtocol.kt @@ -98,7 +98,10 @@ interface OpenIapProtocol { * @param program The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) * @return Reporting details containing the external transaction token */ - suspend fun createBillingProgramReportingDetails(program: BillingProgramAndroid): BillingProgramReportingDetailsAndroid + suspend fun createBillingProgramReportingDetails( + program: BillingProgramAndroid, + developerBillingType: DeveloperBillingTypeAndroid? = null + ): BillingProgramReportingDetailsAndroid /** * Launch an external link for external offer or app download. @@ -109,4 +112,25 @@ interface OpenIapProtocol { * @return true if launch was successful, false otherwise */ suspend fun launchExternalLink(activity: Activity, params: LaunchExternalLinkParamsAndroid): Boolean + + /** + * Fetch Play Billing choice display assets for developer-rendered Billing Choice. + */ + suspend fun getBillingChoiceInfo(params: GetBillingChoiceInfoParamsAndroid): BillingChoiceInfoAndroid + + /** + * Show the Billing Choice information dialog for an external transaction. + */ + suspend fun showBillingProgramInformationDialog( + activity: Activity, + params: BillingProgramInformationDialogParamsAndroid + ): BillingResultAndroid + + /** + * Show Play billing in-app messages such as payment issues or price-change confirmations. + */ + suspend fun showInAppMessages( + activity: Activity, + params: InAppMessageParamsAndroid? = null + ): InAppMessageResultAndroid } diff --git a/packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt b/packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt index b653e26d8..660e25790 100644 --- a/packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt +++ b/packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt @@ -49,8 +49,75 @@ public enum class AlternativeBillingModeAndroid(val rawValue: String) { } /** - * Billing program types for external content links, external offers, and external payments (Android) - * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0 + * Play Billing choice image layout (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public enum class BillingChoiceImageLayoutAndroid(val rawValue: String) { + /** + * Rectangular image with a 4:1 aspect ratio. + */ + RectangularFourByOne("rectangular-four-by-one"), + /** + * Rectangular image with a 3:1 aspect ratio. + */ + RectangularThreeByOne("rectangular-three-by-one"), + /** + * Rectangular image with a 2:2 aspect ratio. + */ + RectangularTwoByTwo("rectangular-two-by-two"); + + companion object { + fun fromJson(value: String): BillingChoiceImageLayoutAndroid = when (value) { + "rectangular-four-by-one" -> BillingChoiceImageLayoutAndroid.RectangularFourByOne + "RectangularFourByOne" -> BillingChoiceImageLayoutAndroid.RectangularFourByOne + "rectangular-three-by-one" -> BillingChoiceImageLayoutAndroid.RectangularThreeByOne + "RectangularThreeByOne" -> BillingChoiceImageLayoutAndroid.RectangularThreeByOne + "rectangular-two-by-two" -> BillingChoiceImageLayoutAndroid.RectangularTwoByTwo + "RectangularTwoByTwo" -> BillingChoiceImageLayoutAndroid.RectangularTwoByTwo + else -> throw IllegalArgumentException("Unknown BillingChoiceImageLayoutAndroid value: $value") + } + } + + fun toJson(): String = rawValue +} + +/** + * Choice screen renderer for Billing Choice availability (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public enum class BillingChoiceScreenTypeAndroid(val rawValue: String) { + /** + * Unspecified choice screen type. + */ + Unspecified("unspecified"), + /** + * Choice screen is rendered by the developer app. + */ + DeveloperRendered("developer-rendered"), + /** + * Choice screen is rendered by Google Play. + */ + GoogleRendered("google-rendered"); + + companion object { + fun fromJson(value: String): BillingChoiceScreenTypeAndroid = when (value) { + "unspecified" -> BillingChoiceScreenTypeAndroid.Unspecified + "Unspecified" -> BillingChoiceScreenTypeAndroid.Unspecified + "developer-rendered" -> BillingChoiceScreenTypeAndroid.DeveloperRendered + "DeveloperRendered" -> BillingChoiceScreenTypeAndroid.DeveloperRendered + "google-rendered" -> BillingChoiceScreenTypeAndroid.GoogleRendered + "GoogleRendered" -> BillingChoiceScreenTypeAndroid.GoogleRendered + else -> throw IllegalArgumentException("Unknown BillingChoiceScreenTypeAndroid value: $value") + } + } + + fun toJson(): String = rawValue +} + +/** + * Billing program types for Google Play Billing Programs (Android) + * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, + * BILLING_CHOICE added in 9.1.0. */ public enum class BillingProgramAndroid(val rawValue: String) { /** @@ -81,7 +148,13 @@ public enum class BillingProgramAndroid(val rawValue: String) { * Users can choose to complete the purchase on the developer's website. * Available in Google Play Billing Library 8.3.0+ */ - ExternalPayments("external-payments"); + ExternalPayments("external-payments"), + /** + * Billing Choice program. + * Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. + * Available in Google Play Billing Library 9.1.0+ + */ + BillingChoice("billing-choice"); companion object { fun fromJson(value: String): BillingProgramAndroid = when (value) { @@ -95,6 +168,8 @@ public enum class BillingProgramAndroid(val rawValue: String) { "ExternalOffer" -> BillingProgramAndroid.ExternalOffer "external-payments" -> BillingProgramAndroid.ExternalPayments "ExternalPayments" -> BillingProgramAndroid.ExternalPayments + "billing-choice" -> BillingProgramAndroid.BillingChoice + "BillingChoice" -> BillingProgramAndroid.BillingChoice else -> throw IllegalArgumentException("Unknown BillingProgramAndroid value: $value") } } @@ -138,6 +213,39 @@ public enum class DeveloperBillingLaunchModeAndroid(val rawValue: String) { fun toJson(): String = rawValue } +/** + * Developer-provided billing destination type for Billing Program reporting details (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public enum class DeveloperBillingTypeAndroid(val rawValue: String) { + /** + * Unspecified developer billing type. Do not use. + */ + DeveloperBillingTypeUnspecified("developer-billing-type-unspecified"), + /** + * Developer-provided billing via native in-app experience. + */ + InApp("in-app"), + /** + * Developer-provided billing via external link or embedded web browsing. + */ + ExternalLink("external-link"); + + companion object { + fun fromJson(value: String): DeveloperBillingTypeAndroid = when (value) { + "developer-billing-type-unspecified" -> DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified + "DeveloperBillingTypeUnspecified" -> DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified + "in-app" -> DeveloperBillingTypeAndroid.InApp + "InApp" -> DeveloperBillingTypeAndroid.InApp + "external-link" -> DeveloperBillingTypeAndroid.ExternalLink + "ExternalLink" -> DeveloperBillingTypeAndroid.ExternalLink + else -> throw IllegalArgumentException("Unknown DeveloperBillingTypeAndroid value: $value") + } + } + + fun toJson(): String = rawValue +} + /** * Discount offer type enumeration. * Categorizes the type of discount or promotional offer. @@ -598,6 +706,60 @@ public enum class IapStore(val rawValue: String) { fun toJson(): String = rawValue } +/** + * High-level in-app message category (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +public enum class InAppMessageCategoryAndroid(val rawValue: String) { + /** + * Unknown in-app message category. + */ + UnknownInAppMessageCategoryId("unknown-in-app-message-category-id"), + /** + * Transactional billing messages, such as payment issues or pending price-change confirmations. + */ + Transactional("transactional"); + + companion object { + fun fromJson(value: String): InAppMessageCategoryAndroid = when (value) { + "unknown-in-app-message-category-id" -> InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId + "UnknownInAppMessageCategoryId" -> InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId + "transactional" -> InAppMessageCategoryAndroid.Transactional + "Transactional" -> InAppMessageCategoryAndroid.Transactional + else -> throw IllegalArgumentException("Unknown InAppMessageCategoryAndroid value: $value") + } + } + + fun toJson(): String = rawValue +} + +/** + * Response code from Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +public enum class InAppMessageResponseCodeAndroid(val rawValue: String) { + /** + * Flow finished and no developer action is needed. + */ + NoActionNeeded("no-action-needed"), + /** + * Subscription status changed and the purchase token should be checked. + */ + SubscriptionStatusUpdated("subscription-status-updated"); + + companion object { + fun fromJson(value: String): InAppMessageResponseCodeAndroid = when (value) { + "no-action-needed" -> InAppMessageResponseCodeAndroid.NoActionNeeded + "NoActionNeeded" -> InAppMessageResponseCodeAndroid.NoActionNeeded + "subscription-status-updated" -> InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated + "SubscriptionStatusUpdated" -> InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated + else -> throw IllegalArgumentException("Unknown InAppMessageResponseCodeAndroid value: $value") + } + } + + fun toJson(): String = rawValue +} + /** * Payment mode for subscription offers. * Determines how the user pays during the offer period. @@ -1579,6 +1741,37 @@ public data class AppTransaction( ) } +/** + * Display information for developer-rendered Billing Choice screens (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public data class BillingChoiceInfoAndroid( + /** + * URL for the Play Billing choice image matching the requested layout. + */ + val playBillingChoiceImageUrl: String, + /** + * Play Loyalty information for the user. + */ + val playBillingLoyaltyInfo: String? = null +) { + + companion object { + fun fromJson(json: Map): BillingChoiceInfoAndroid { + return BillingChoiceInfoAndroid( + playBillingChoiceImageUrl = json["playBillingChoiceImageUrl"] as? String ?: "", + playBillingLoyaltyInfo = json["playBillingLoyaltyInfo"] as? String, + ) + } + } + + fun toJson(): Map = mapOf( + "__typename" to "BillingChoiceInfoAndroid", + "playBillingChoiceImageUrl" to playBillingChoiceImageUrl, + "playBillingLoyaltyInfo" to playBillingLoyaltyInfo, + ) +} + /** * Result of checking billing program availability (Android) * Available in Google Play Billing Library 8.2.0+ @@ -1588,17 +1781,28 @@ public data class BillingProgramAvailabilityResultAndroid( * The billing program that was checked */ val billingProgram: BillingProgramAndroid, + /** + * Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + */ + val choiceScreenType: BillingChoiceScreenTypeAndroid? = null, /** * Whether the billing program is available for the user */ - val isAvailable: Boolean + val isAvailable: Boolean, + /** + * Whether external-link payment is available for Billing Choice. + * Populated only for available BILLING_CHOICE results. + */ + val isExternalLinkAvailable: Boolean? = null ) { companion object { fun fromJson(json: Map): BillingProgramAvailabilityResultAndroid { return BillingProgramAvailabilityResultAndroid( billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified, + choiceScreenType = (json["choiceScreenType"] as? String)?.let { BillingChoiceScreenTypeAndroid.fromJson(it) }, isAvailable = json["isAvailable"] as? Boolean ?: false, + isExternalLinkAvailable = json["isExternalLinkAvailable"] as? Boolean, ) } } @@ -1606,7 +1810,9 @@ public data class BillingProgramAvailabilityResultAndroid( fun toJson(): Map = mapOf( "__typename" to "BillingProgramAvailabilityResultAndroid", "billingProgram" to billingProgram.toJson(), + "choiceScreenType" to choiceScreenType?.toJson(), "isAvailable" to isAvailable, + "isExternalLinkAvailable" to isExternalLinkAvailable, ) } @@ -2213,6 +2419,37 @@ public data class FetchProductsResultProducts(val value: List?) : Fetch public data class FetchProductsResultSubscriptions(val value: List?) : FetchProductsResult +/** + * Result from showing Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +public data class InAppMessageResultAndroid( + /** + * Purchase token returned when a subscription status changed. + */ + val purchaseToken: String? = null, + /** + * Response code for the in-app messaging flow. + */ + val responseCode: InAppMessageResponseCodeAndroid +) { + + companion object { + fun fromJson(json: Map): InAppMessageResultAndroid { + return InAppMessageResultAndroid( + purchaseToken = json["purchaseToken"] as? String, + responseCode = (json["responseCode"] as? String)?.let { InAppMessageResponseCodeAndroid.fromJson(it) } ?: InAppMessageResponseCodeAndroid.NoActionNeeded, + ) + } + } + + fun toJson(): Map = mapOf( + "__typename" to "InAppMessageResultAndroid", + "purchaseToken" to purchaseToken, + "responseCode" to responseCode.toJson(), + ) +} + /** * Installment plan details for subscription offers (Android) * Contains information about the installment plan commitment. @@ -4197,6 +4434,38 @@ public data class AndroidSubscriptionOfferInput( ) } +/** + * Parameters for showing a billing program information dialog (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public data class BillingProgramInformationDialogParamsAndroid( + /** + * Billing program. Currently only BILLING_CHOICE is supported. + */ + val billingProgram: BillingProgramAndroid, + /** + * External transaction token returned by the Billing Choice reporting-details flow. + */ + val externalTransactionToken: String +) { + companion object { + fun fromJson(json: Map): BillingProgramInformationDialogParamsAndroid? { + val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified + val externalTransactionToken = json["externalTransactionToken"] as? String + if (externalTransactionToken == null) return null + return BillingProgramInformationDialogParamsAndroid( + billingProgram = billingProgram, + externalTransactionToken = externalTransactionToken, + ) + } + } + + fun toJson(): Map = mapOf( + "billingProgram" to billingProgram.toJson(), + "externalTransactionToken" to externalTransactionToken, + ) +} + public data class DeepLinkOptions( /** * Android package name to target (required on Android) @@ -4311,6 +4580,67 @@ public data class DiscountOfferInputIOS( ) } +/** + * Parameters for fetching Billing Choice display information (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public data class GetBillingChoiceInfoParamsAndroid( + /** + * Billing program. Currently only BILLING_CHOICE is supported. + */ + val billingProgram: BillingProgramAndroid, + /** + * Desired Play Billing choice image layout. + */ + val playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid, + /** + * BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. + */ + val userLocale: String? = null +) { + companion object { + fun fromJson(json: Map): GetBillingChoiceInfoParamsAndroid? { + val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified + val playBillingChoiceImageLayout = (json["playBillingChoiceImageLayout"] as? String)?.let { BillingChoiceImageLayoutAndroid.fromJson(it) } ?: BillingChoiceImageLayoutAndroid.RectangularFourByOne + val userLocale = json["userLocale"] as? String + return GetBillingChoiceInfoParamsAndroid( + billingProgram = billingProgram, + playBillingChoiceImageLayout = playBillingChoiceImageLayout, + userLocale = userLocale, + ) + } + } + + fun toJson(): Map = mapOf( + "billingProgram" to billingProgram.toJson(), + "playBillingChoiceImageLayout" to playBillingChoiceImageLayout.toJson(), + "userLocale" to userLocale, + ) +} + +/** + * Parameters for showing Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +public data class InAppMessageParamsAndroid( + /** + * In-app message categories to show. Defaults to transactional messages. + */ + val categories: List? = null +) { + companion object { + fun fromJson(json: Map): InAppMessageParamsAndroid { + return InAppMessageParamsAndroid( + categories = (json["categories"] as? List<*>)?.mapNotNull { (it as? String)?.let { InAppMessageCategoryAndroid.fromJson(it) } ?: InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId }, + ) + } + } + + fun toJson(): Map = mapOf( + "categories" to categories?.map { it.toJson() }, + ) +} + /** * Connection initialization configuration */ @@ -5408,7 +5738,6 @@ public interface MutationResolver { suspend fun beginRefundRequestIOS(sku: String): String? /** * Check whether alternative billing is available for the user. Step 1 of the alternative billing flow. - * * Returns true if available, false otherwise. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/check-alternative-billing-availability-android @@ -5428,7 +5757,6 @@ public interface MutationResolver { * Create a reporting token for an alternative billing flow. Step 3 of the alternative billing flow. * Must be called AFTER successful payment in your payment system. * Token must be reported to Google Play backend within 24 hours. - * * Returns token string, or null if creation failed. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-alternative-billing-token-android @@ -5437,12 +5765,11 @@ public interface MutationResolver { /** * Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). * Replaces the deprecated createExternalOfferReportingDetailsAsync API. - * * Returns external transaction token needed for reporting external transactions. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ - suspend fun createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid): BillingProgramReportingDetailsAndroid + suspend fun createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid, developerBillingType: DeveloperBillingTypeAndroid? = null): BillingProgramReportingDetailsAndroid /** * Open the platform's subscription management UI. * See: https://openiap.dev/docs/apis/deep-link-to-subscriptions @@ -5466,7 +5793,6 @@ public interface MutationResolver { /** * Check whether a billing program (e.g., External Payments) is available for the current user. * Replaces the deprecated isExternalOfferAvailableAsync API. - * * Available in Google Play Billing Library 8.2.0+. * Returns availability result with isAvailable flag. * Throws OpenIapError.NotPrepared if billing client not ready. @@ -5476,7 +5802,6 @@ public interface MutationResolver { /** * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). * Replaces the deprecated showExternalOfferInformationDialog API. - * * Shows Play Store dialog and optionally launches external URL. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/launch-external-link-android @@ -5521,12 +5846,18 @@ public interface MutationResolver { /** * Display Google's alternative billing information dialog. Step 2 of the alternative billing flow. * Must be called BEFORE processing payment in your payment system. - * * Returns true if user accepted, false if user canceled. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android */ suspend fun showAlternativeBillingDialogAndroid(): Boolean + /** + * Show Google's information dialog for a Billing Choice external transaction. + * Available in Google Play Billing Library 9.1.0+. + * Throws OpenIapError.NotPrepared if billing client not ready. + * See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android + */ + suspend fun showBillingProgramInformationDialogAndroid(params: BillingProgramInformationDialogParamsAndroid): BillingResultAndroid /** * Present the disclosure sheet required before linking out via ExternalPurchaseCustomLink (iOS 18.1+). * Call this after a deliberate customer interaction before linking out to external purchases. @@ -5534,6 +5865,14 @@ public interface MutationResolver { * See: https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios */ suspend fun showExternalPurchaseCustomLinkNoticeIOS(noticeType: ExternalPurchaseCustomLinkNoticeTypeIOS): ExternalPurchaseCustomLinkNoticeResultIOS + /** + * Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. + * Available in Google Play Billing Library 4.1.0+. + * Returns a response code and, when the subscription status changes, the related purchase token. + * Throws OpenIapError.NotPrepared if billing client not ready. + * See: https://openiap.dev/docs/apis/android/show-in-app-messages-android + */ + suspend fun showInAppMessagesAndroid(params: InAppMessageParamsAndroid? = null): InAppMessageResultAndroid /** * Present the manage-subscriptions sheet and return changed purchases (iOS 15+). * See: https://openiap.dev/docs/apis/ios/show-manage-subscriptions-ios @@ -5610,6 +5949,13 @@ public interface QueryResolver { * See: https://openiap.dev/docs/apis/get-available-purchases */ suspend fun getAvailablePurchases(options: PurchaseOptions? = null): List + /** + * Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. + * Available in Google Play Billing Library 9.1.0+. + * Throws OpenIapError.NotPrepared if billing client is not ready. + * See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android + */ + suspend fun getBillingChoiceInfoAndroid(params: GetBillingChoiceInfoParamsAndroid): BillingChoiceInfoAndroid /** * Fetch a token for Apple's External Purchase Server reporting API (iOS 18.1+). * Use this token to report transactions made through ExternalPurchaseCustomLink. @@ -5744,7 +6090,7 @@ public typealias MutationCheckAlternativeBillingAvailabilityAndroidHandler = sus public typealias MutationClearTransactionIOSHandler = suspend () -> Boolean public typealias MutationConsumePurchaseAndroidHandler = suspend (purchaseToken: String) -> Boolean public typealias MutationCreateAlternativeBillingTokenAndroidHandler = suspend () -> String? -public typealias MutationCreateBillingProgramReportingDetailsAndroidHandler = suspend (program: BillingProgramAndroid) -> BillingProgramReportingDetailsAndroid +public typealias MutationCreateBillingProgramReportingDetailsAndroidHandler = suspend (program: BillingProgramAndroid, developerBillingType: DeveloperBillingTypeAndroid?) -> BillingProgramReportingDetailsAndroid public typealias MutationDeepLinkToSubscriptionsHandler = suspend (options: DeepLinkOptions?) -> Unit public typealias MutationEndConnectionHandler = suspend () -> Boolean public typealias MutationFinishTransactionHandler = suspend (purchase: PurchaseInput, isConsumable: Boolean?) -> Unit @@ -5758,7 +6104,9 @@ public typealias MutationRequestPurchaseHandler = suspend (params: RequestPurcha public typealias MutationRequestPurchaseOnPromotedProductIOSHandler = suspend () -> Boolean public typealias MutationRestorePurchasesHandler = suspend () -> Unit public typealias MutationShowAlternativeBillingDialogAndroidHandler = suspend () -> Boolean +public typealias MutationShowBillingProgramInformationDialogAndroidHandler = suspend (params: BillingProgramInformationDialogParamsAndroid) -> BillingResultAndroid public typealias MutationShowExternalPurchaseCustomLinkNoticeIOSHandler = suspend (noticeType: ExternalPurchaseCustomLinkNoticeTypeIOS) -> ExternalPurchaseCustomLinkNoticeResultIOS +public typealias MutationShowInAppMessagesAndroidHandler = suspend (params: InAppMessageParamsAndroid?) -> InAppMessageResultAndroid public typealias MutationShowManageSubscriptionsIOSHandler = suspend () -> List public typealias MutationSyncIOSHandler = suspend () -> Boolean public typealias MutationValidateReceiptHandler = suspend (options: VerifyPurchaseProps) -> VerifyPurchaseResult @@ -5786,7 +6134,9 @@ public data class MutationHandlers( val requestPurchaseOnPromotedProductIOS: MutationRequestPurchaseOnPromotedProductIOSHandler? = null, val restorePurchases: MutationRestorePurchasesHandler? = null, val showAlternativeBillingDialogAndroid: MutationShowAlternativeBillingDialogAndroidHandler? = null, + val showBillingProgramInformationDialogAndroid: MutationShowBillingProgramInformationDialogAndroidHandler? = null, val showExternalPurchaseCustomLinkNoticeIOS: MutationShowExternalPurchaseCustomLinkNoticeIOSHandler? = null, + val showInAppMessagesAndroid: MutationShowInAppMessagesAndroidHandler? = null, val showManageSubscriptionsIOS: MutationShowManageSubscriptionsIOSHandler? = null, val syncIOS: MutationSyncIOSHandler? = null, val validateReceipt: MutationValidateReceiptHandler? = null, @@ -5803,6 +6153,7 @@ public typealias QueryGetActiveSubscriptionsHandler = suspend (subscriptionIds: public typealias QueryGetAllTransactionsIOSHandler = suspend () -> List public typealias QueryGetAppTransactionIOSHandler = suspend () -> AppTransaction? public typealias QueryGetAvailablePurchasesHandler = suspend (options: PurchaseOptions?) -> List +public typealias QueryGetBillingChoiceInfoAndroidHandler = suspend (params: GetBillingChoiceInfoParamsAndroid) -> BillingChoiceInfoAndroid public typealias QueryGetExternalPurchaseCustomLinkTokenIOSHandler = suspend (tokenType: ExternalPurchaseCustomLinkTokenTypeIOS) -> ExternalPurchaseCustomLinkTokenResultIOS public typealias QueryGetPendingTransactionsIOSHandler = suspend () -> List public typealias QueryGetPromotedProductIOSHandler = suspend () -> ProductIOS? @@ -5826,6 +6177,7 @@ public data class QueryHandlers( val getAllTransactionsIOS: QueryGetAllTransactionsIOSHandler? = null, val getAppTransactionIOS: QueryGetAppTransactionIOSHandler? = null, val getAvailablePurchases: QueryGetAvailablePurchasesHandler? = null, + val getBillingChoiceInfoAndroid: QueryGetBillingChoiceInfoAndroidHandler? = null, val getExternalPurchaseCustomLinkTokenIOS: QueryGetExternalPurchaseCustomLinkTokenIOSHandler? = null, val getPendingTransactionsIOS: QueryGetPendingTransactionsIOSHandler? = null, val getPromotedProductIOS: QueryGetPromotedProductIOSHandler? = null, diff --git a/packages/google/openiap/src/main/java/dev/hyo/openiap/store/OpenIapStore.kt b/packages/google/openiap/src/main/java/dev/hyo/openiap/store/OpenIapStore.kt index ec23bfbeb..dc01405f7 100644 --- a/packages/google/openiap/src/main/java/dev/hyo/openiap/store/OpenIapStore.kt +++ b/packages/google/openiap/src/main/java/dev/hyo/openiap/store/OpenIapStore.kt @@ -35,7 +35,14 @@ import dev.hyo.openiap.MutationInitConnectionHandler import dev.hyo.openiap.MutationEndConnectionHandler import dev.hyo.openiap.BillingProgramAndroid import dev.hyo.openiap.BillingProgramAvailabilityResultAndroid +import dev.hyo.openiap.BillingProgramInformationDialogParamsAndroid import dev.hyo.openiap.BillingProgramReportingDetailsAndroid +import dev.hyo.openiap.BillingChoiceInfoAndroid +import dev.hyo.openiap.BillingResultAndroid +import dev.hyo.openiap.DeveloperBillingTypeAndroid +import dev.hyo.openiap.GetBillingChoiceInfoParamsAndroid +import dev.hyo.openiap.InAppMessageParamsAndroid +import dev.hyo.openiap.InAppMessageResultAndroid import dev.hyo.openiap.LaunchExternalLinkParamsAndroid import android.app.Activity import android.content.Context @@ -550,8 +557,11 @@ class OpenIapStore(private val module: OpenIapProtocol) { * * @see https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ - suspend fun createBillingProgramReportingDetails(program: BillingProgramAndroid): BillingProgramReportingDetailsAndroid = - module.createBillingProgramReportingDetails(program) + suspend fun createBillingProgramReportingDetails( + program: BillingProgramAndroid, + developerBillingType: DeveloperBillingTypeAndroid? = null + ): BillingProgramReportingDetailsAndroid = + module.createBillingProgramReportingDetails(program, developerBillingType) /** * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). @@ -561,6 +571,36 @@ class OpenIapStore(private val module: OpenIapProtocol) { suspend fun launchExternalLink(activity: Activity, params: LaunchExternalLinkParamsAndroid): Boolean = module.launchExternalLink(activity, params) + /** + * Fetch Billing Choice display assets for developer-rendered choice screens (Play Billing 9.1.0+). + * + * @see https://openiap.dev/docs/apis/android/get-billing-choice-info-android + */ + suspend fun getBillingChoiceInfo(params: GetBillingChoiceInfoParamsAndroid): BillingChoiceInfoAndroid = + module.getBillingChoiceInfo(params) + + /** + * Show the Billing Choice information dialog for an external transaction (Play Billing 9.1.0+). + * + * @see https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android + */ + suspend fun showBillingProgramInformationDialog( + activity: Activity, + params: BillingProgramInformationDialogParamsAndroid + ): BillingResultAndroid = + module.showBillingProgramInformationDialog(activity, params) + + /** + * Show Play billing in-app messages such as payment issues or price-change confirmations. + * + * @see https://openiap.dev/docs/apis/android/show-in-app-messages-android + */ + suspend fun showInAppMessages( + activity: Activity, + params: InAppMessageParamsAndroid? = null + ): InAppMessageResultAndroid = + module.showInAppMessages(activity, params) + /** * Enable a billing program for external content links or external offers (8.2.0+). * This should be called BEFORE initConnection to configure the BillingClient. diff --git a/packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt b/packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt index 2c5411979..2b0a728bd 100644 --- a/packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt +++ b/packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt @@ -83,6 +83,7 @@ import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext import java.lang.ref.WeakReference +import java.util.Locale import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicReference @@ -190,6 +191,63 @@ class OpenIapModule( .setDebugMessage(message) .build() + private fun BillingResult.toOpenIapBillingResult(): BillingResultAndroid = + BillingResultAndroid( + responseCode = responseCode, + debugMessage = debugMessage + ) + + private fun billingProgramToConstant(program: BillingProgramAndroid): Int = when (program) { + BillingProgramAndroid.ExternalContentLink -> 1 + BillingProgramAndroid.ExternalOffer -> 3 + BillingProgramAndroid.ExternalPayments -> 4 + BillingProgramAndroid.BillingChoice -> 5 + BillingProgramAndroid.UserChoiceBilling -> + throw IllegalArgumentException("USER_CHOICE_BILLING uses AlternativeBillingMode, not BillingProgram API") + BillingProgramAndroid.Unspecified -> + throw IllegalArgumentException("Cannot use UNSPECIFIED billing program") + } + + private fun billingChoiceProgramOrDefault(program: BillingProgramAndroid): BillingProgramAndroid = + if (program == BillingProgramAndroid.Unspecified) { + BillingProgramAndroid.BillingChoice + } else { + program + } + + private fun billingChoiceImageLayoutConstant(layout: BillingChoiceImageLayoutAndroid): String = when (layout) { + BillingChoiceImageLayoutAndroid.RectangularFourByOne -> "RECTANGULAR_FOUR_BY_ONE" + BillingChoiceImageLayoutAndroid.RectangularThreeByOne -> "RECTANGULAR_THREE_BY_ONE" + BillingChoiceImageLayoutAndroid.RectangularTwoByTwo -> "RECTANGULAR_TWO_BY_TWO" + } + + private fun developerBillingTypeConstant( + program: BillingProgramAndroid, + developerBillingType: DeveloperBillingTypeAndroid? + ): Int? = when (developerBillingType) { + DeveloperBillingTypeAndroid.InApp -> 1 + DeveloperBillingTypeAndroid.ExternalLink -> 2 + DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified, null -> + if (program == BillingProgramAndroid.BillingChoice) 1 else null + } + + private fun billingChoiceScreenTypeFromConstant(value: Int?): BillingChoiceScreenTypeAndroid? = when (value) { + 0 -> BillingChoiceScreenTypeAndroid.Unspecified + 1 -> BillingChoiceScreenTypeAndroid.DeveloperRendered + 2 -> BillingChoiceScreenTypeAndroid.GoogleRendered + else -> null + } + + private fun inAppMessageCategoryToConstant(category: InAppMessageCategoryAndroid): Int = when (category) { + InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId -> 0 + InAppMessageCategoryAndroid.Transactional -> 2 + } + + private fun inAppMessageResponseCodeFromConstant(value: Int?): InAppMessageResponseCodeAndroid = when (value) { + 1 -> InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated + else -> InAppMessageResponseCodeAndroid.NoActionNeeded + } + // Billing programs enabled via enableBillingProgram (8.2.0+, EXTERNAL_PAYMENTS in 8.3.0+) private val enabledBillingPrograms = mutableSetOf() @@ -607,14 +665,7 @@ class OpenIapModule( OpenIapLog.d("Checking billing program availability for: $program", TAG) - // Convert our enum to BillingClient.BillingProgram constant - val billingProgramConstant = when (program) { - BillingProgramAndroid.ExternalContentLink -> 1 // EXTERNAL_CONTENT_LINK - BillingProgramAndroid.ExternalOffer -> 3 // EXTERNAL_OFFER - BillingProgramAndroid.ExternalPayments -> 4 // EXTERNAL_PAYMENTS (8.3.0+) - BillingProgramAndroid.UserChoiceBilling -> throw IllegalArgumentException("USER_CHOICE_BILLING uses AlternativeBillingMode, not BillingProgram API") - BillingProgramAndroid.Unspecified -> throw IllegalArgumentException("Cannot check availability for UNSPECIFIED program") - } + val billingProgramConstant = billingProgramToConstant(program) suspendCancellableCoroutine { continuation -> val resumer = continuation.resumeGuard() @@ -630,9 +681,32 @@ class OpenIapModule( OpenIapLog.d("Billing program availability result: ${result?.responseCode} - ${result?.debugMessage}", TAG) val isAvailable = result?.responseCode == BillingClient.BillingResponseCode.OK + val availabilityDetails = args?.getOrNull(1) + val billingChoiceDetails = if (program == BillingProgramAndroid.BillingChoice && isAvailable) { + runCatching { + availabilityDetails?.javaClass + ?.getMethod("getBillingChoiceAvailabilityDetails") + ?.invoke(availabilityDetails) + }.getOrNull() + } else { + null + } + val choiceScreenType = runCatching { + val value = billingChoiceDetails?.javaClass + ?.getMethod("getChoiceScreenType") + ?.invoke(billingChoiceDetails) as? Int + billingChoiceScreenTypeFromConstant(value) + }.getOrNull() + val isExternalLinkAvailable = runCatching { + billingChoiceDetails?.javaClass + ?.getMethod("isExternalLinkAvailable") + ?.invoke(billingChoiceDetails) as? Boolean + }.getOrNull() resumer.resume(BillingProgramAvailabilityResultAndroid( - billingProgram = program, - isAvailable = isAvailable + billingProgram = program, + isAvailable = isAvailable, + choiceScreenType = choiceScreenType, + isExternalLinkAvailable = isExternalLinkAvailable )) } null @@ -647,14 +721,14 @@ class OpenIapModule( } catch (e: NoSuchMethodException) { OpenIapLog.e("isBillingProgramAvailableAsync not found. Requires Billing Library 8.2.0+", e, TAG) resumer.resume(BillingProgramAvailabilityResultAndroid( - billingProgram = program, - isAvailable = false + billingProgram = program, + isAvailable = false )) } catch (e: Exception) { OpenIapLog.e("Failed to check billing program availability: ${e.message}", e, TAG) resumer.resume(BillingProgramAvailabilityResultAndroid( - billingProgram = program, - isAvailable = false + billingProgram = program, + isAvailable = false )) } } @@ -669,19 +743,17 @@ class OpenIapModule( * @param program The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) * @return Reporting details containing the external transaction token */ - override suspend fun createBillingProgramReportingDetails(program: BillingProgramAndroid): BillingProgramReportingDetailsAndroid = withContext(Dispatchers.IO) { + override suspend fun createBillingProgramReportingDetails( + program: BillingProgramAndroid, + developerBillingType: DeveloperBillingTypeAndroid? + ): BillingProgramReportingDetailsAndroid = withContext(Dispatchers.IO) { val client = billingClient ?: throw OpenIapError.NotPrepared if (!client.isReady) throw OpenIapError.NotPrepared OpenIapLog.d("Creating billing program reporting details for: $program", TAG) - val billingProgramConstant = when (program) { - BillingProgramAndroid.ExternalContentLink -> 1 - BillingProgramAndroid.ExternalOffer -> 3 - BillingProgramAndroid.ExternalPayments -> 4 // EXTERNAL_PAYMENTS (8.3.0+) - BillingProgramAndroid.UserChoiceBilling -> throw IllegalArgumentException("USER_CHOICE_BILLING uses AlternativeBillingMode, not BillingProgram API") - BillingProgramAndroid.Unspecified -> throw IllegalArgumentException("Cannot create reporting details for UNSPECIFIED program") - } + val billingProgramConstant = billingProgramToConstant(program) + val developerBillingTypeConstant = developerBillingTypeConstant(program, developerBillingType) suspendCancellableCoroutine { continuation -> val resumer = continuation.resumeGuard() @@ -739,6 +811,19 @@ class OpenIapModule( val setBillingProgramMethod = paramsBuilderClass.getMethod("setBillingProgram", Int::class.javaPrimitiveType) setBillingProgramMethod.invoke(paramsBuilder, billingProgramConstant) + developerBillingTypeConstant?.let { typeConstant -> + try { + val setDeveloperBillingTypeMethod = paramsBuilderClass.getMethod( + "setDeveloperBillingType", + Int::class.javaPrimitiveType + ) + setDeveloperBillingTypeMethod.invoke(paramsBuilder, typeConstant) + } catch (e: NoSuchMethodException) { + OpenIapLog.e("setDeveloperBillingType not found. Requires Billing Library 9.1.0+", e, TAG) + throw OpenIapError.FeatureNotSupported() + } + } + // Build the params val buildMethod = paramsBuilderClass.getMethod("build") val reportingParams = buildMethod.invoke(paramsBuilder) @@ -756,6 +841,8 @@ class OpenIapModule( } catch (e: ClassNotFoundException) { OpenIapLog.e("BillingProgramReportingDetailsParams not found. Requires Billing Library 8.3.0+", e, TAG) throw OpenIapError.FeatureNotSupported() + } catch (e: OpenIapError) { + throw e } catch (e: Exception) { OpenIapLog.e("Failed to create billing program reporting details: ${e.message}", e, TAG) throw OpenIapError.PurchaseFailed(e.message ?: e.javaClass.simpleName) @@ -777,14 +864,7 @@ class OpenIapModule( OpenIapLog.d("Launching external link: program=${params.billingProgram}, launchMode=${params.launchMode}, linkType=${params.linkType}", TAG) - // Convert enums to BillingClient constants - val billingProgramConstant = when (params.billingProgram) { - BillingProgramAndroid.ExternalContentLink -> 1 - BillingProgramAndroid.ExternalOffer -> 3 - BillingProgramAndroid.ExternalPayments -> 4 // EXTERNAL_PAYMENTS (8.3.0+) - BillingProgramAndroid.UserChoiceBilling -> throw IllegalArgumentException("USER_CHOICE_BILLING does not use external links") - BillingProgramAndroid.Unspecified -> throw IllegalArgumentException("Cannot launch with UNSPECIFIED program") - } + val billingProgramConstant = billingProgramToConstant(params.billingProgram) val launchModeConstant = when (params.launchMode) { ExternalLinkLaunchModeAndroid.LaunchInExternalBrowserOrApp -> 1 @@ -862,6 +942,215 @@ class OpenIapModule( } } + /** + * Fetch Billing Choice display information for developer-rendered choice screens (9.1.0+). + */ + override suspend fun getBillingChoiceInfo(params: GetBillingChoiceInfoParamsAndroid): BillingChoiceInfoAndroid = withContext(Dispatchers.IO) { + val client = billingClient ?: throw OpenIapError.NotPrepared + if (!client.isReady) throw OpenIapError.NotPrepared + + val program = billingChoiceProgramOrDefault(params.billingProgram) + val billingProgramConstant = billingProgramToConstant(program) + if (program != BillingProgramAndroid.BillingChoice) { + throw IllegalArgumentException("getBillingChoiceInfo only supports BILLING_CHOICE") + } + + suspendCancellableCoroutine { continuation -> + val resumer = continuation.resumeGuard() + try { + val paramsClass = Class.forName("com.android.billingclient.api.GetBillingChoiceInfoParams") + val builderClass = Class.forName("com.android.billingclient.api.GetBillingChoiceInfoParams\$Builder") + + val builder = paramsClass.getMethod("newBuilder").invoke(null) + builderClass.getMethod("setBillingProgram", Int::class.javaPrimitiveType) + .invoke(builder, billingProgramConstant) + builderClass.getMethod("setPlayBillingChoiceImageLayout", String::class.java) + .invoke(builder, billingChoiceImageLayoutConstant(params.playBillingChoiceImageLayout)) + params.userLocale?.takeIf { it.isNotBlank() }?.let { languageTag -> + builderClass.getMethod("setUserLocale", Locale::class.java) + .invoke(builder, Locale.forLanguageTag(languageTag)) + } + + val requestParams = builderClass.getMethod("build").invoke(builder) + val listenerClass = Class.forName("com.android.billingclient.api.BillingChoiceInfoResponseListener") + val listener = java.lang.reflect.Proxy.newProxyInstance( + listenerClass.classLoader, + arrayOf(listenerClass) + ) { _, method, args -> + if (method.name == "onBillingChoiceInfoResponse") { + val result = args?.get(0) as? BillingResult + val choiceInfo = args?.getOrNull(1) + if (result?.responseCode == BillingClient.BillingResponseCode.OK && choiceInfo != null) { + val imageUrl = choiceInfo.javaClass + .getMethod("getPlayBillingChoiceImageUrl") + .invoke(choiceInfo) as? String + val loyaltyInfo = choiceInfo.javaClass + .getMethod("getPlayBillingLoyaltyInfo") + .invoke(choiceInfo) as? String + + if (imageUrl.isNullOrBlank()) { + resumer.resumeWithException(OpenIapError.PurchaseFailed("Missing Play Billing choice image URL")) + } else { + resumer.resume(BillingChoiceInfoAndroid( + playBillingChoiceImageUrl = imageUrl, + playBillingLoyaltyInfo = loyaltyInfo + )) + } + } else { + resumer.resumeWithException(OpenIapError.PurchaseFailed(result?.debugMessage)) + } + } + null + } + + client.javaClass.getMethod("getBillingChoiceInfoAsync", paramsClass, listenerClass) + .invoke(client, requestParams, listener) + } catch (e: NoSuchMethodException) { + OpenIapLog.e("getBillingChoiceInfoAsync not found. Requires Billing Library 9.1.0+", e, TAG) + resumer.resumeWithException(OpenIapError.FeatureNotSupported()) + } catch (e: ClassNotFoundException) { + OpenIapLog.e("GetBillingChoiceInfoParams not found. Requires Billing Library 9.1.0+", e, TAG) + resumer.resumeWithException(OpenIapError.FeatureNotSupported()) + } catch (e: Exception) { + OpenIapLog.e("Failed to get Billing Choice info: ${e.message}", e, TAG) + resumer.resumeWithException(OpenIapError.PurchaseFailed(e.message ?: e.javaClass.simpleName)) + } + } + } + + /** + * Show Billing Choice information dialog for an external transaction token (9.1.0+). + */ + override suspend fun showBillingProgramInformationDialog( + activity: Activity, + params: BillingProgramInformationDialogParamsAndroid + ): BillingResultAndroid = withContext(Dispatchers.IO) { + val client = billingClient ?: throw OpenIapError.NotPrepared + if (!client.isReady) throw OpenIapError.NotPrepared + + val program = billingChoiceProgramOrDefault(params.billingProgram) + val billingProgramConstant = billingProgramToConstant(program) + if (program != BillingProgramAndroid.BillingChoice) { + throw IllegalArgumentException("showBillingProgramInformationDialog only supports BILLING_CHOICE") + } + + suspendCancellableCoroutine { continuation -> + val resumer = continuation.resumeGuard() + try { + val paramsClass = Class.forName("com.android.billingclient.api.BillingProgramInformationDialogParams") + val builderClass = Class.forName("com.android.billingclient.api.BillingProgramInformationDialogParams\$Builder") + val builder = paramsClass.getMethod("newBuilder").invoke(null) + + builderClass.getMethod("setBillingProgram", Int::class.javaPrimitiveType) + .invoke(builder, billingProgramConstant) + builderClass.getMethod("setExternalTransactionToken", String::class.java) + .invoke(builder, params.externalTransactionToken) + + val requestParams = builderClass.getMethod("build").invoke(builder) + val listenerClass = Class.forName("com.android.billingclient.api.BillingProgramInformationDialogListener") + val listener = java.lang.reflect.Proxy.newProxyInstance( + listenerClass.classLoader, + arrayOf(listenerClass) + ) { _, method, args -> + if (method.name == "onBillingProgramInformationDialogResponse") { + val result = (args?.get(0) as? BillingResult) + ?: billingResultError("Missing Billing Program information dialog result") + resumer.resume(result.toOpenIapBillingResult()) + } + null + } + + client.javaClass.getMethod( + "showBillingProgramInformationDialog", + Activity::class.java, + paramsClass, + listenerClass + ).invoke(client, activity, requestParams, listener) + } catch (e: NoSuchMethodException) { + OpenIapLog.e("showBillingProgramInformationDialog not found. Requires Billing Library 9.1.0+", e, TAG) + resumer.resumeWithException(OpenIapError.FeatureNotSupported()) + } catch (e: ClassNotFoundException) { + OpenIapLog.e("BillingProgramInformationDialogParams not found. Requires Billing Library 9.1.0+", e, TAG) + resumer.resumeWithException(OpenIapError.FeatureNotSupported()) + } catch (e: Exception) { + OpenIapLog.e("Failed to show Billing Program information dialog: ${e.message}", e, TAG) + resumer.resumeWithException(OpenIapError.PurchaseFailed(e.message ?: e.javaClass.simpleName)) + } + } + } + + /** + * Show Play billing in-app messages, such as payment issues or price-change confirmations. + */ + override suspend fun showInAppMessages( + activity: Activity, + params: InAppMessageParamsAndroid? + ): InAppMessageResultAndroid = withContext(Dispatchers.IO) { + val client = billingClient ?: throw OpenIapError.NotPrepared + if (!client.isReady) throw OpenIapError.NotPrepared + + suspendCancellableCoroutine { continuation -> + val resumer = continuation.resumeGuard() + try { + val paramsClass = Class.forName("com.android.billingclient.api.InAppMessageParams") + val builderClass = Class.forName("com.android.billingclient.api.InAppMessageParams\$Builder") + val builder = builderClass.getConstructor().newInstance() + val categories = params?.categories?.takeIf { it.isNotEmpty() } + ?: listOf(InAppMessageCategoryAndroid.Transactional) + + for (category in categories) { + builderClass.getMethod("addInAppMessageCategoryToShow", Int::class.javaPrimitiveType) + .invoke(builder, inAppMessageCategoryToConstant(category)) + } + + val requestParams = builderClass.getMethod("build").invoke(builder) + val listenerClass = Class.forName("com.android.billingclient.api.InAppMessageResponseListener") + val listener = java.lang.reflect.Proxy.newProxyInstance( + listenerClass.classLoader, + arrayOf(listenerClass) + ) { _, method, args -> + if (method.name == "onInAppMessageResponse") { + val result = args?.get(0) + val responseCode = runCatching { + result?.javaClass?.getMethod("getResponseCode")?.invoke(result) as? Int + }.getOrNull() + val purchaseToken = runCatching { + result?.javaClass?.getMethod("getPurchaseToken")?.invoke(result) as? String + }.getOrNull() + resumer.resume(InAppMessageResultAndroid( + responseCode = inAppMessageResponseCodeFromConstant(responseCode), + purchaseToken = purchaseToken + )) + } + null + } + + val submitResult = client.javaClass.getMethod( + "showInAppMessages", + Activity::class.java, + paramsClass, + listenerClass + ).invoke(client, activity, requestParams, listener) as? BillingResult + + if (submitResult != null && submitResult.responseCode != BillingClient.BillingResponseCode.OK) { + resumer.resume(InAppMessageResultAndroid( + responseCode = InAppMessageResponseCodeAndroid.NoActionNeeded, + purchaseToken = null + )) + } + } catch (e: NoSuchMethodException) { + OpenIapLog.e("showInAppMessages not found. Requires Billing Library 4.1.0+", e, TAG) + resumer.resumeWithException(OpenIapError.FeatureNotSupported()) + } catch (e: ClassNotFoundException) { + OpenIapLog.e("InAppMessageParams not found. Requires Billing Library 4.1.0+", e, TAG) + resumer.resumeWithException(OpenIapError.FeatureNotSupported()) + } catch (e: Exception) { + OpenIapLog.e("Failed to show in-app messages: ${e.message}", e, TAG) + resumer.resumeWithException(OpenIapError.PurchaseFailed(e.message ?: e.javaClass.simpleName)) + } + } + } + /** * Enable a billing program for external content links or external offers (8.2.0+) * This should be called before initConnection to configure the BillingClient. @@ -1458,6 +1747,9 @@ class OpenIapModule( fetchProducts = fetchProducts, getActiveSubscriptions = getActiveSubscriptions, getAvailablePurchases = getAvailablePurchases, + getBillingChoiceInfoAndroid = { params -> + getBillingChoiceInfo(params) + }, getStorefront = { getStorefront() }, getStorefrontIOS = { getStorefront() }, hasActiveSubscriptions = hasActiveSubscriptions @@ -1473,8 +1765,8 @@ class OpenIapModule( createAlternativeBillingTokenAndroid = { createAlternativeBillingReportingToken() }, - createBillingProgramReportingDetailsAndroid = { program -> - createBillingProgramReportingDetails(program) + createBillingProgramReportingDetailsAndroid = { program, developerBillingType -> + createBillingProgramReportingDetails(program, developerBillingType) }, deepLinkToSubscriptions = deepLinkToSubscriptions, endConnection = endConnection, @@ -1495,6 +1787,16 @@ class OpenIapModule( ?: throw OpenIapError.MissingCurrentActivity showAlternativeBillingInformationDialog(activity) }, + showBillingProgramInformationDialogAndroid = { params -> + val activity = currentActivityRef?.get() ?: fallbackActivity + ?: throw OpenIapError.MissingCurrentActivity + showBillingProgramInformationDialog(activity, params) + }, + showInAppMessagesAndroid = { params -> + val activity = currentActivityRef?.get() ?: fallbackActivity + ?: throw OpenIapError.MissingCurrentActivity + showInAppMessages(activity, params) + }, validateReceipt = validateReceipt, verifyPurchase = verifyPurchase, verifyPurchaseWithProvider = verifyPurchaseWithProvider @@ -1814,22 +2116,20 @@ class OpenIapModule( } val programConstant = when (program) { - BillingProgramAndroid.ExternalContentLink -> 1 - BillingProgramAndroid.ExternalOffer -> 3 - BillingProgramAndroid.ExternalPayments -> 4 // EXTERNAL_PAYMENTS (8.3.0+) BillingProgramAndroid.UserChoiceBilling -> continue // Already handled above BillingProgramAndroid.Unspecified -> continue + else -> billingProgramToConstant(program) } - // For EXTERNAL_PAYMENTS, we need to use EnableBillingProgramParams with DeveloperProvidedBillingListener - if (program == BillingProgramAndroid.ExternalPayments) { + // EXTERNAL_PAYMENTS and BILLING_CHOICE can return developer-provided billing selections. + if (program == BillingProgramAndroid.ExternalPayments || program == BillingProgramAndroid.BillingChoice) { try { - enableExternalPaymentsProgram(builder) - OpenIapLog.d("✓ External Payments program enabled (8.3.0+)", TAG) + enableBillingProgramWithDeveloperListener(builder, program, programConstant) + OpenIapLog.d("✓ Billing program enabled with developer listener: $program", TAG) } catch (e: NoSuchMethodException) { - OpenIapLog.w("✗ EXTERNAL_PAYMENTS not found. Requires Billing Library 8.3.0+", TAG) + OpenIapLog.w("✗ EnableBillingProgramParams not found for $program", TAG) } catch (e: Exception) { - OpenIapLog.w("✗ Failed to enable EXTERNAL_PAYMENTS: ${e.message}", TAG) + OpenIapLog.w("✗ Failed to enable billing program $program: ${e.message}", TAG) } } else { // For other programs, use the simpler enableBillingProgram method @@ -1980,13 +2280,17 @@ class OpenIapModule( } /** - * Enable EXTERNAL_PAYMENTS billing program with DeveloperProvidedBillingListener. - * This is the new API in Billing Library 8.3.0 for external payments (Japan only). + * Enable a billing program with DeveloperProvidedBillingListener. + * Used by EXTERNAL_PAYMENTS (8.3.0+) and BILLING_CHOICE (9.1.0+). * * @param builder The BillingClient.Builder to configure */ - private fun enableExternalPaymentsProgram(builder: BillingClient.Builder) { - OpenIapLog.d("=== EXTERNAL PAYMENTS INITIALIZATION (8.3.0+) ===", TAG) + private fun enableBillingProgramWithDeveloperListener( + builder: BillingClient.Builder, + program: BillingProgramAndroid, + programConstant: Int + ) { + OpenIapLog.d("=== BILLING PROGRAM INITIALIZATION WITH DEVELOPER LISTENER: $program ===", TAG) // Create DeveloperProvidedBillingListener via reflection val listenerClass = Class.forName("com.android.billingclient.api.DeveloperProvidedBillingListener") @@ -2052,9 +2356,8 @@ class OpenIapModule( val newBuilderMethod = enableParamsClass.getMethod("newBuilder") val enableBuilder = newBuilderMethod.invoke(null) - // Set billing program to EXTERNAL_PAYMENTS (constant = 4) val setBillingProgramMethod = enableParamsBuilderClass.getMethod("setBillingProgram", Int::class.javaPrimitiveType) - setBillingProgramMethod.invoke(enableBuilder, 4) // EXTERNAL_PAYMENTS + setBillingProgramMethod.invoke(enableBuilder, programConstant) // Set developer provided billing listener val setListenerMethod = enableParamsBuilderClass.getMethod("setDeveloperProvidedBillingListener", listenerClass) @@ -2069,7 +2372,7 @@ class OpenIapModule( enableMethod.invoke(builder, enableParams) OpenIapLog.d("✓ DeveloperProvidedBillingListener registered", TAG) - OpenIapLog.d("=== END EXTERNAL PAYMENTS INITIALIZATION ===", TAG) + OpenIapLog.d("=== END BILLING PROGRAM INITIALIZATION WITH DEVELOPER LISTENER ===", TAG) } /** @@ -2086,14 +2389,7 @@ class OpenIapModule( try { OpenIapLog.d("Applying DeveloperBillingOption: program=${params.billingProgram}, launchMode=${params.launchMode}, uri=${params.linkUri}", TAG) - // Convert enums to constants - val billingProgramConstant = when (params.billingProgram) { - BillingProgramAndroid.ExternalPayments -> 4 - BillingProgramAndroid.ExternalContentLink -> 1 - BillingProgramAndroid.ExternalOffer -> 3 - BillingProgramAndroid.UserChoiceBilling -> throw IllegalArgumentException("USER_CHOICE_BILLING does not use DeveloperBillingOption") - BillingProgramAndroid.Unspecified -> throw IllegalArgumentException("Cannot use UNSPECIFIED billing program") - } + val billingProgramConstant = billingProgramToConstant(params.billingProgram) val launchModeConstant = when (params.launchMode) { DeveloperBillingLaunchModeAndroid.LaunchInExternalBrowserOrApp -> 1 diff --git a/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingChoiceAndroidTypesTest.kt b/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingChoiceAndroidTypesTest.kt new file mode 100644 index 000000000..d53109b25 --- /dev/null +++ b/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingChoiceAndroidTypesTest.kt @@ -0,0 +1,54 @@ +package dev.hyo.openiap + +import org.junit.Assert.assertEquals +import org.junit.Test + +class BillingChoiceAndroidTypesTest { + @Test + fun `Billing Choice image layout serializes correctly`() { + assertEquals( + BillingChoiceImageLayoutAndroid.RectangularFourByOne, + BillingChoiceImageLayoutAndroid.fromJson("rectangular-four-by-one") + ) + assertEquals( + "rectangular-two-by-two", + BillingChoiceImageLayoutAndroid.RectangularTwoByTwo.toJson() + ) + } + + @Test + fun `Billing Choice screen type serializes correctly`() { + assertEquals( + BillingChoiceScreenTypeAndroid.DeveloperRendered, + BillingChoiceScreenTypeAndroid.fromJson("developer-rendered") + ) + assertEquals( + "google-rendered", + BillingChoiceScreenTypeAndroid.GoogleRendered.toJson() + ) + } + + @Test + fun `Developer billing type serializes correctly`() { + assertEquals( + DeveloperBillingTypeAndroid.InApp, + DeveloperBillingTypeAndroid.fromJson("in-app") + ) + assertEquals( + "external-link", + DeveloperBillingTypeAndroid.ExternalLink.toJson() + ) + } + + @Test + fun `in-app message enums serialize correctly`() { + assertEquals( + InAppMessageCategoryAndroid.Transactional, + InAppMessageCategoryAndroid.fromJson("transactional") + ) + assertEquals( + InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated, + InAppMessageResponseCodeAndroid.fromJson("subscription-status-updated") + ) + } +} diff --git a/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingLibraryClassPathTest.kt b/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingLibraryClassPathTest.kt index 7059bda19..1daf9482d 100644 --- a/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingLibraryClassPathTest.kt +++ b/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingLibraryClassPathTest.kt @@ -4,6 +4,7 @@ import org.junit.Assert.assertNotNull import org.junit.Assert.assertTrue import org.junit.Assert.fail import org.junit.Test +import java.util.Locale /** * Tests to verify that reflection-based class paths used in OpenIapModule @@ -240,6 +241,26 @@ class BillingLibraryClassPathTest { ) } + @Test + fun `BillingProgramAvailabilityDetails exposes Billing Choice details`() { + assertClassHasMethod( + "com.android.billingclient.api.BillingProgramAvailabilityDetails", + "getBillingChoiceAvailabilityDetails" + ) + assertClassHasMethod( + "com.android.billingclient.api.BillingProgramAvailabilityDetails\$BillingChoiceAvailabilityDetails", + "getChoiceScreenType" + ) + assertClassHasMethod( + "com.android.billingclient.api.BillingProgramAvailabilityDetails\$BillingChoiceAvailabilityDetails", + "isExternalLinkAvailable" + ) + assertClassExists( + "com.android.billingclient.api.BillingProgramAvailabilityDetails\$BillingChoiceAvailabilityDetails\$ChoiceScreenType", + "9.1.0+" + ) + } + // ============================================================================ // MARK: - BillingProgramReportingDetailsListener (Billing Library 8.3.0+) // Used in: OpenIapModule.createBillingProgramReportingDetails() @@ -300,6 +321,23 @@ class BillingLibraryClassPathTest { ) } + @Test + fun `BillingProgramReportingDetailsParams Builder has setDeveloperBillingType method`() { + assertClassHasMethod( + "com.android.billingclient.api.BillingProgramReportingDetailsParams\$Builder", + "setDeveloperBillingType", + Int::class.javaPrimitiveType!! + ) + } + + @Test + fun `BillingProgramReportingDetailsParams DeveloperBillingType annotation exists`() { + assertClassExists( + "com.android.billingclient.api.BillingProgramReportingDetailsParams\$DeveloperBillingType", + "9.1.0+" + ) + } + @Test fun `BillingProgramReportingDetailsParams Builder has build method`() { assertClassHasMethod( @@ -403,6 +441,121 @@ class BillingLibraryClassPathTest { ) } + // ============================================================================ + // MARK: - Billing Choice info and information dialog (Billing Library 9.1.0+) + // Used in: OpenIapModule.getBillingChoiceInfo() and showBillingProgramInformationDialog() + // ============================================================================ + + @Test + fun `GetBillingChoiceInfoParams class path and builder methods exist`() { + assertClassExists("com.android.billingclient.api.GetBillingChoiceInfoParams", "9.1.0+") + assertClassExists("com.android.billingclient.api.GetBillingChoiceInfoParams\$Builder", "9.1.0+") + assertClassExists("com.android.billingclient.api.GetBillingChoiceInfoParams\$ImageLayout", "9.1.0+") + assertClassHasMethod("com.android.billingclient.api.GetBillingChoiceInfoParams", "newBuilder") + assertClassHasMethod( + "com.android.billingclient.api.GetBillingChoiceInfoParams\$Builder", + "setBillingProgram", + Int::class.javaPrimitiveType!! + ) + assertClassHasMethod( + "com.android.billingclient.api.GetBillingChoiceInfoParams\$Builder", + "setPlayBillingChoiceImageLayout", + String::class.java + ) + assertClassHasMethod( + "com.android.billingclient.api.GetBillingChoiceInfoParams\$Builder", + "setUserLocale", + Locale::class.java + ) + assertClassHasMethod("com.android.billingclient.api.GetBillingChoiceInfoParams\$Builder", "build") + } + + @Test + fun `BillingChoiceInfo and listener methods exist`() { + assertClassHasMethod( + "com.android.billingclient.api.BillingChoiceInfo", + "getPlayBillingChoiceImageUrl" + ) + assertClassHasMethod( + "com.android.billingclient.api.BillingChoiceInfo", + "getPlayBillingLoyaltyInfo" + ) + + val listenerClass = Class.forName("com.android.billingclient.api.BillingChoiceInfoResponseListener") + val methods = listenerClass.declaredMethods.filter { it.name == "onBillingChoiceInfoResponse" } + assertTrue( + "onBillingChoiceInfoResponse method should exist", + methods.isNotEmpty() + ) + assertTrue( + "onBillingChoiceInfoResponse should have 2 parameters", + methods.first().parameterTypes.size == 2 + ) + } + + @Test + fun `BillingProgramInformationDialogParams class path and builder methods exist`() { + assertClassExists("com.android.billingclient.api.BillingProgramInformationDialogParams", "9.1.0+") + assertClassExists("com.android.billingclient.api.BillingProgramInformationDialogParams\$Builder", "9.1.0+") + assertClassHasMethod("com.android.billingclient.api.BillingProgramInformationDialogParams", "newBuilder") + assertClassHasMethod( + "com.android.billingclient.api.BillingProgramInformationDialogParams\$Builder", + "setBillingProgram", + Int::class.javaPrimitiveType!! + ) + assertClassHasMethod( + "com.android.billingclient.api.BillingProgramInformationDialogParams\$Builder", + "setExternalTransactionToken", + String::class.java + ) + assertClassHasMethod("com.android.billingclient.api.BillingProgramInformationDialogParams\$Builder", "build") + } + + @Test + fun `BillingProgramInformationDialogListener callback exists`() { + assertClassHasMethod( + "com.android.billingclient.api.BillingProgramInformationDialogListener", + "onBillingProgramInformationDialogResponse", + com.android.billingclient.api.BillingResult::class.java + ) + } + + // ============================================================================ + // MARK: - In-app messages (Billing Library 4.1.0+) + // Used in: OpenIapModule.showInAppMessages() + // ============================================================================ + + @Test + fun `InAppMessageParams class path and builder methods exist`() { + assertClassExists("com.android.billingclient.api.InAppMessageParams", "4.1.0+") + assertClassExists("com.android.billingclient.api.InAppMessageParams\$Builder", "4.1.0+") + assertClassHasMethod( + "com.android.billingclient.api.InAppMessageParams\$Builder", + "addInAppMessageCategoryToShow", + Int::class.javaPrimitiveType!! + ) + assertClassHasMethod( + "com.android.billingclient.api.InAppMessageParams\$Builder", + "addAllInAppMessageCategoriesToShow" + ) + assertClassHasMethod("com.android.billingclient.api.InAppMessageParams\$Builder", "build") + } + + @Test + fun `InAppMessageResponseListener and result methods exist`() { + assertClassHasMethod( + "com.android.billingclient.api.InAppMessageResponseListener", + "onInAppMessageResponse", + com.android.billingclient.api.InAppMessageResult::class.java + ) + assertClassHasMethod("com.android.billingclient.api.InAppMessageResult", "getResponseCode") + assertClassHasMethod("com.android.billingclient.api.InAppMessageResult", "getPurchaseToken") + assertClassExists( + "com.android.billingclient.api.InAppMessageResult\$InAppMessageResponseCode", + "4.1.0+" + ) + } + // ============================================================================ // MARK: - UserChoiceBillingListener (Billing Library 5.0+) // Used in: OpenIapModule alternative billing mode USER_CHOICE @@ -696,6 +849,73 @@ class BillingLibraryClassPathTest { } } + @Test + fun `BillingClient has getBillingChoiceInfoAsync method`() { + val clientClassName = "com.android.billingclient.api.BillingClient" + val paramsClassName = "com.android.billingclient.api.GetBillingChoiceInfoParams" + val listenerClassName = "com.android.billingclient.api.BillingChoiceInfoResponseListener" + + try { + val clientClass = Class.forName(clientClassName) + val paramsClass = Class.forName(paramsClassName) + val listenerClass = Class.forName(listenerClassName) + val method = clientClass.getMethod("getBillingChoiceInfoAsync", paramsClass, listenerClass) + assertNotNull("getBillingChoiceInfoAsync method should exist", method) + } catch (e: ClassNotFoundException) { + fail("Class not found: ${e.message}") + } catch (e: NoSuchMethodException) { + fail("getBillingChoiceInfoAsync(GetBillingChoiceInfoParams, Listener) not found. Requires Billing Library 9.1.0+") + } + } + + @Test + fun `BillingClient has showBillingProgramInformationDialog method`() { + val clientClassName = "com.android.billingclient.api.BillingClient" + val paramsClassName = "com.android.billingclient.api.BillingProgramInformationDialogParams" + val listenerClassName = "com.android.billingclient.api.BillingProgramInformationDialogListener" + + try { + val clientClass = Class.forName(clientClassName) + val paramsClass = Class.forName(paramsClassName) + val listenerClass = Class.forName(listenerClassName) + val method = clientClass.getMethod( + "showBillingProgramInformationDialog", + android.app.Activity::class.java, + paramsClass, + listenerClass + ) + assertNotNull("showBillingProgramInformationDialog method should exist", method) + } catch (e: ClassNotFoundException) { + fail("Class not found: ${e.message}") + } catch (e: NoSuchMethodException) { + fail("showBillingProgramInformationDialog method not found. Requires Billing Library 9.1.0+") + } + } + + @Test + fun `BillingClient has showInAppMessages method`() { + val clientClassName = "com.android.billingclient.api.BillingClient" + val paramsClassName = "com.android.billingclient.api.InAppMessageParams" + val listenerClassName = "com.android.billingclient.api.InAppMessageResponseListener" + + try { + val clientClass = Class.forName(clientClassName) + val paramsClass = Class.forName(paramsClassName) + val listenerClass = Class.forName(listenerClassName) + val method = clientClass.getMethod( + "showInAppMessages", + android.app.Activity::class.java, + paramsClass, + listenerClass + ) + assertNotNull("showInAppMessages method should exist", method) + } catch (e: ClassNotFoundException) { + fail("Class not found: ${e.message}") + } catch (e: NoSuchMethodException) { + fail("showInAppMessages method not found. Requires Billing Library 4.1.0+") + } + } + @Test fun `BillingClient has launchExternalLink method`() { val clientClassName = "com.android.billingclient.api.BillingClient" diff --git a/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingProgramAndroidTest.kt b/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingProgramAndroidTest.kt index b0e9a1c14..b9b31014b 100644 --- a/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingProgramAndroidTest.kt +++ b/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingProgramAndroidTest.kt @@ -13,6 +13,7 @@ class BillingProgramAndroidTest { assertEquals(BillingProgramAndroid.ExternalContentLink, BillingProgramAndroid.fromJson("external-content-link")) assertEquals(BillingProgramAndroid.ExternalOffer, BillingProgramAndroid.fromJson("external-offer")) assertEquals(BillingProgramAndroid.ExternalPayments, BillingProgramAndroid.fromJson("external-payments")) + assertEquals(BillingProgramAndroid.BillingChoice, BillingProgramAndroid.fromJson("billing-choice")) } @Test @@ -22,6 +23,7 @@ class BillingProgramAndroidTest { assertEquals(BillingProgramAndroid.ExternalContentLink, BillingProgramAndroid.fromJson("ExternalContentLink")) assertEquals(BillingProgramAndroid.ExternalOffer, BillingProgramAndroid.fromJson("ExternalOffer")) assertEquals(BillingProgramAndroid.ExternalPayments, BillingProgramAndroid.fromJson("ExternalPayments")) + assertEquals(BillingProgramAndroid.BillingChoice, BillingProgramAndroid.fromJson("BillingChoice")) } @Test @@ -38,6 +40,7 @@ class BillingProgramAndroidTest { assertEquals("external-content-link", BillingProgramAndroid.ExternalContentLink.toJson()) assertEquals("external-offer", BillingProgramAndroid.ExternalOffer.toJson()) assertEquals("external-payments", BillingProgramAndroid.ExternalPayments.toJson()) + assertEquals("billing-choice", BillingProgramAndroid.BillingChoice.toJson()) } @Test diff --git a/packages/google/openiap/src/testPlay/java/dev/hyo/openiap/QueryPurchasesRaceTest.kt b/packages/google/openiap/src/testPlay/java/dev/hyo/openiap/QueryPurchasesRaceTest.kt index 87c329ee7..525e6e2c2 100644 --- a/packages/google/openiap/src/testPlay/java/dev/hyo/openiap/QueryPurchasesRaceTest.kt +++ b/packages/google/openiap/src/testPlay/java/dev/hyo/openiap/QueryPurchasesRaceTest.kt @@ -13,6 +13,8 @@ import com.android.billingclient.api.BillingClientStateListener import com.android.billingclient.api.BillingConfigResponseListener import com.android.billingclient.api.BillingFlowParams import com.android.billingclient.api.BillingProgramAvailabilityListener +import com.android.billingclient.api.BillingProgramInformationDialogListener +import com.android.billingclient.api.BillingProgramInformationDialogParams import com.android.billingclient.api.BillingProgramReportingDetailsListener import com.android.billingclient.api.BillingProgramReportingDetailsParams import com.android.billingclient.api.BillingResult @@ -21,7 +23,9 @@ import com.android.billingclient.api.ConsumeResponseListener import com.android.billingclient.api.ExternalOfferAvailabilityListener import com.android.billingclient.api.ExternalOfferInformationDialogListener import com.android.billingclient.api.ExternalOfferReportingDetailsListener +import com.android.billingclient.api.GetBillingChoiceInfoParams import com.android.billingclient.api.GetBillingConfigParams +import com.android.billingclient.api.BillingChoiceInfoResponseListener import com.android.billingclient.api.InAppMessageParams import com.android.billingclient.api.InAppMessageResponseListener import com.android.billingclient.api.LaunchExternalLinkParams @@ -318,6 +322,12 @@ class QueryPurchasesRaceTest { listener: InAppMessageResponseListener ): BillingResult = unsupported() + override fun showBillingProgramInformationDialog( + activity: Activity, + params: BillingProgramInformationDialogParams, + listener: BillingProgramInformationDialogListener + ) = unsupportedUnit() + override fun acknowledgePurchase( params: AcknowledgePurchaseParams, listener: AcknowledgePurchaseResponseListener @@ -348,6 +358,11 @@ class QueryPurchasesRaceTest { listener: BillingConfigResponseListener ) = unsupportedUnit() + override fun getBillingChoiceInfoAsync( + params: GetBillingChoiceInfoParams, + listener: BillingChoiceInfoResponseListener + ) = unsupportedUnit() + override fun isAlternativeBillingOnlyAvailableAsync( listener: AlternativeBillingOnlyAvailabilityListener ) = unsupportedUnit() diff --git a/packages/gql/src/api-android.graphql b/packages/gql/src/api-android.graphql index a83a04d92..df71a2402 100644 --- a/packages/gql/src/api-android.graphql +++ b/packages/gql/src/api-android.graphql @@ -1,5 +1,16 @@ # Android-specific API operations +extend type Query { + """ + Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. + Available in Google Play Billing Library 9.1.0+. + Throws OpenIapError.NotPrepared if billing client is not ready. + See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android + """ + # Future + getBillingChoiceInfoAndroid(params: GetBillingChoiceInfoParamsAndroid!): BillingChoiceInfoAndroid! +} + extend type Mutation { """ Acknowledge a non-consumable purchase. Required within 3 days or Google auto-refunds. @@ -17,7 +28,6 @@ extend type Mutation { # Alternative Billing APIs """ Check whether alternative billing is available for the user. Step 1 of the alternative billing flow. - Returns true if available, false otherwise. Throws OpenIapError.NotPrepared if billing client not ready. See: https://openiap.dev/docs/apis/android/check-alternative-billing-availability-android @@ -27,7 +37,6 @@ extend type Mutation { """ Display Google's alternative billing information dialog. Step 2 of the alternative billing flow. Must be called BEFORE processing payment in your payment system. - Returns true if user accepted, false if user canceled. Throws OpenIapError.NotPrepared if billing client not ready. See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android @@ -38,7 +47,6 @@ extend type Mutation { Create a reporting token for an alternative billing flow. Step 3 of the alternative billing flow. Must be called AFTER successful payment in your payment system. Token must be reported to Google Play backend within 24 hours. - Returns token string, or null if creation failed. Throws OpenIapError.NotPrepared if billing client not ready. See: https://openiap.dev/docs/apis/android/create-alternative-billing-token-android @@ -50,7 +58,6 @@ extend type Mutation { """ Check whether a billing program (e.g., External Payments) is available for the current user. Replaces the deprecated isExternalOfferAvailableAsync API. - Available in Google Play Billing Library 8.2.0+. Returns availability result with isAvailable flag. Throws OpenIapError.NotPrepared if billing client not ready. @@ -62,22 +69,42 @@ extend type Mutation { """ Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). Replaces the deprecated createExternalOfferReportingDetailsAsync API. - Returns external transaction token needed for reporting external transactions. Throws OpenIapError.NotPrepared if billing client not ready. See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android """ # Future - createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid!): BillingProgramReportingDetailsAndroid! + createBillingProgramReportingDetailsAndroid( + program: BillingProgramAndroid! + developerBillingType: DeveloperBillingTypeAndroid + ): BillingProgramReportingDetailsAndroid! """ Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). Replaces the deprecated showExternalOfferInformationDialog API. - Shows Play Store dialog and optionally launches external URL. Throws OpenIapError.NotPrepared if billing client not ready. See: https://openiap.dev/docs/apis/android/launch-external-link-android """ # Future launchExternalLinkAndroid(params: LaunchExternalLinkParamsAndroid!): Boolean! + + """ + Show Google's information dialog for a Billing Choice external transaction. + Available in Google Play Billing Library 9.1.0+. + Throws OpenIapError.NotPrepared if billing client not ready. + See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android + """ + # Future + showBillingProgramInformationDialogAndroid(params: BillingProgramInformationDialogParamsAndroid!): BillingResultAndroid! + + """ + Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. + Available in Google Play Billing Library 4.1.0+. + Returns a response code and, when the subscription status changes, the related purchase token. + Throws OpenIapError.NotPrepared if billing client not ready. + See: https://openiap.dev/docs/apis/android/show-in-app-messages-android + """ + # Future + showInAppMessagesAndroid(params: InAppMessageParamsAndroid): InAppMessageResultAndroid! } diff --git a/packages/gql/src/generated/Types.cs b/packages/gql/src/generated/Types.cs index d35ad4222..e04ac493d 100644 --- a/packages/gql/src/generated/Types.cs +++ b/packages/gql/src/generated/Types.cs @@ -78,8 +78,119 @@ public static class AlternativeBillingModeAndroidExtensions public static AlternativeBillingModeAndroid FromJson(string value) => AlternativeBillingModeAndroidJsonConverter.FromRawString(value); } -/// Billing program types for external content links, external offers, and external payments (Android) -/// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0 +/// Play Billing choice image layout (Android) +/// Available in Google Play Billing Library 9.1.0+ +[JsonConverter(typeof(BillingChoiceImageLayoutAndroidJsonConverter))] +public enum BillingChoiceImageLayoutAndroid +{ + /// Rectangular image with a 4:1 aspect ratio. + RectangularFourByOne, + /// Rectangular image with a 3:1 aspect ratio. + RectangularThreeByOne, + /// Rectangular image with a 2:2 aspect ratio. + RectangularTwoByTwo +} + +public sealed class BillingChoiceImageLayoutAndroidJsonConverter : JsonConverter +{ + private static readonly Dictionary _fromString = new() + { + ["rectangular-four-by-one"] = BillingChoiceImageLayoutAndroid.RectangularFourByOne, + ["RECTANGULAR_FOUR_BY_ONE"] = BillingChoiceImageLayoutAndroid.RectangularFourByOne, + ["rectangular-three-by-one"] = BillingChoiceImageLayoutAndroid.RectangularThreeByOne, + ["RECTANGULAR_THREE_BY_ONE"] = BillingChoiceImageLayoutAndroid.RectangularThreeByOne, + ["rectangular-two-by-two"] = BillingChoiceImageLayoutAndroid.RectangularTwoByTwo, + ["RECTANGULAR_TWO_BY_TWO"] = BillingChoiceImageLayoutAndroid.RectangularTwoByTwo, + }; + + private static readonly Dictionary _toString = new() + { + [BillingChoiceImageLayoutAndroid.RectangularFourByOne] = "rectangular-four-by-one", + [BillingChoiceImageLayoutAndroid.RectangularThreeByOne] = "rectangular-three-by-one", + [BillingChoiceImageLayoutAndroid.RectangularTwoByTwo] = "rectangular-two-by-two", + }; + + public override BillingChoiceImageLayoutAndroid Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var raw = reader.GetString(); + if (raw is not null && _fromString.TryGetValue(raw, out var value)) return value; + throw new JsonException($"Unknown BillingChoiceImageLayoutAndroid value: {raw}"); + } + + public override void Write(Utf8JsonWriter writer, BillingChoiceImageLayoutAndroid value, JsonSerializerOptions options) + { + writer.WriteStringValue(_toString[value]); + } + + internal static string ToRawString(BillingChoiceImageLayoutAndroid value) => _toString[value]; + internal static BillingChoiceImageLayoutAndroid FromRawString(string value) => + _fromString.TryGetValue(value, out var v) ? v : throw new ArgumentException($"Unknown BillingChoiceImageLayoutAndroid value: {value}"); +} + +public static class BillingChoiceImageLayoutAndroidExtensions +{ + public static string ToJson(this BillingChoiceImageLayoutAndroid value) => BillingChoiceImageLayoutAndroidJsonConverter.ToRawString(value); + public static BillingChoiceImageLayoutAndroid FromJson(string value) => BillingChoiceImageLayoutAndroidJsonConverter.FromRawString(value); +} + +/// Choice screen renderer for Billing Choice availability (Android) +/// Available in Google Play Billing Library 9.1.0+ +[JsonConverter(typeof(BillingChoiceScreenTypeAndroidJsonConverter))] +public enum BillingChoiceScreenTypeAndroid +{ + /// Unspecified choice screen type. + Unspecified, + /// Choice screen is rendered by the developer app. + DeveloperRendered, + /// Choice screen is rendered by Google Play. + GoogleRendered +} + +public sealed class BillingChoiceScreenTypeAndroidJsonConverter : JsonConverter +{ + private static readonly Dictionary _fromString = new() + { + ["unspecified"] = BillingChoiceScreenTypeAndroid.Unspecified, + ["UNSPECIFIED"] = BillingChoiceScreenTypeAndroid.Unspecified, + ["developer-rendered"] = BillingChoiceScreenTypeAndroid.DeveloperRendered, + ["DEVELOPER_RENDERED"] = BillingChoiceScreenTypeAndroid.DeveloperRendered, + ["google-rendered"] = BillingChoiceScreenTypeAndroid.GoogleRendered, + ["GOOGLE_RENDERED"] = BillingChoiceScreenTypeAndroid.GoogleRendered, + }; + + private static readonly Dictionary _toString = new() + { + [BillingChoiceScreenTypeAndroid.Unspecified] = "unspecified", + [BillingChoiceScreenTypeAndroid.DeveloperRendered] = "developer-rendered", + [BillingChoiceScreenTypeAndroid.GoogleRendered] = "google-rendered", + }; + + public override BillingChoiceScreenTypeAndroid Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var raw = reader.GetString(); + if (raw is not null && _fromString.TryGetValue(raw, out var value)) return value; + throw new JsonException($"Unknown BillingChoiceScreenTypeAndroid value: {raw}"); + } + + public override void Write(Utf8JsonWriter writer, BillingChoiceScreenTypeAndroid value, JsonSerializerOptions options) + { + writer.WriteStringValue(_toString[value]); + } + + internal static string ToRawString(BillingChoiceScreenTypeAndroid value) => _toString[value]; + internal static BillingChoiceScreenTypeAndroid FromRawString(string value) => + _fromString.TryGetValue(value, out var v) ? v : throw new ArgumentException($"Unknown BillingChoiceScreenTypeAndroid value: {value}"); +} + +public static class BillingChoiceScreenTypeAndroidExtensions +{ + public static string ToJson(this BillingChoiceScreenTypeAndroid value) => BillingChoiceScreenTypeAndroidJsonConverter.ToRawString(value); + public static BillingChoiceScreenTypeAndroid FromJson(string value) => BillingChoiceScreenTypeAndroidJsonConverter.FromRawString(value); +} + +/// Billing program types for Google Play Billing Programs (Android) +/// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, +/// BILLING_CHOICE added in 9.1.0. [JsonConverter(typeof(BillingProgramAndroidJsonConverter))] public enum BillingProgramAndroid { @@ -101,7 +212,11 @@ public enum BillingProgramAndroid /// Allows presenting a side-by-side choice between Google Play Billing and developer's external payment option. /// Users can choose to complete the purchase on the developer's website. /// Available in Google Play Billing Library 8.3.0+ - ExternalPayments + ExternalPayments, + /// Billing Choice program. + /// Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. + /// Available in Google Play Billing Library 9.1.0+ + BillingChoice } public sealed class BillingProgramAndroidJsonConverter : JsonConverter @@ -118,6 +233,8 @@ public sealed class BillingProgramAndroidJsonConverter : JsonConverter _toString = new() @@ -127,6 +244,7 @@ public sealed class BillingProgramAndroidJsonConverter : JsonConverter DeveloperBillingLaunchModeAndroidJsonConverter.FromRawString(value); } +/// Developer-provided billing destination type for Billing Program reporting details (Android) +/// Available in Google Play Billing Library 9.1.0+ +[JsonConverter(typeof(DeveloperBillingTypeAndroidJsonConverter))] +public enum DeveloperBillingTypeAndroid +{ + /// Unspecified developer billing type. Do not use. + DeveloperBillingTypeUnspecified, + /// Developer-provided billing via native in-app experience. + InApp, + /// Developer-provided billing via external link or embedded web browsing. + ExternalLink +} + +public sealed class DeveloperBillingTypeAndroidJsonConverter : JsonConverter +{ + private static readonly Dictionary _fromString = new() + { + ["developer-billing-type-unspecified"] = DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified, + ["DEVELOPER_BILLING_TYPE_UNSPECIFIED"] = DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified, + ["in-app"] = DeveloperBillingTypeAndroid.InApp, + ["IN_APP"] = DeveloperBillingTypeAndroid.InApp, + ["external-link"] = DeveloperBillingTypeAndroid.ExternalLink, + ["EXTERNAL_LINK"] = DeveloperBillingTypeAndroid.ExternalLink, + }; + + private static readonly Dictionary _toString = new() + { + [DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified] = "developer-billing-type-unspecified", + [DeveloperBillingTypeAndroid.InApp] = "in-app", + [DeveloperBillingTypeAndroid.ExternalLink] = "external-link", + }; + + public override DeveloperBillingTypeAndroid Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var raw = reader.GetString(); + if (raw is not null && _fromString.TryGetValue(raw, out var value)) return value; + throw new JsonException($"Unknown DeveloperBillingTypeAndroid value: {raw}"); + } + + public override void Write(Utf8JsonWriter writer, DeveloperBillingTypeAndroid value, JsonSerializerOptions options) + { + writer.WriteStringValue(_toString[value]); + } + + internal static string ToRawString(DeveloperBillingTypeAndroid value) => _toString[value]; + internal static DeveloperBillingTypeAndroid FromRawString(string value) => + _fromString.TryGetValue(value, out var v) ? v : throw new ArgumentException($"Unknown DeveloperBillingTypeAndroid value: {value}"); +} + +public static class DeveloperBillingTypeAndroidExtensions +{ + public static string ToJson(this DeveloperBillingTypeAndroid value) => DeveloperBillingTypeAndroidJsonConverter.ToRawString(value); + public static DeveloperBillingTypeAndroid FromJson(string value) => DeveloperBillingTypeAndroidJsonConverter.FromRawString(value); +} + /// Discount offer type enumeration. /// Categorizes the type of discount or promotional offer. [JsonConverter(typeof(DiscountOfferTypeJsonConverter))] @@ -1035,6 +1208,106 @@ public static class IapStoreExtensions public static IapStore FromJson(string value) => IapStoreJsonConverter.FromRawString(value); } +/// High-level in-app message category (Android) +/// Available in Google Play Billing Library 4.1.0+ +[JsonConverter(typeof(InAppMessageCategoryAndroidJsonConverter))] +public enum InAppMessageCategoryAndroid +{ + /// Unknown in-app message category. + UnknownInAppMessageCategoryId, + /// Transactional billing messages, such as payment issues or pending price-change confirmations. + Transactional +} + +public sealed class InAppMessageCategoryAndroidJsonConverter : JsonConverter +{ + private static readonly Dictionary _fromString = new() + { + ["unknown-in-app-message-category-id"] = InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId, + ["UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID"] = InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId, + ["transactional"] = InAppMessageCategoryAndroid.Transactional, + ["TRANSACTIONAL"] = InAppMessageCategoryAndroid.Transactional, + }; + + private static readonly Dictionary _toString = new() + { + [InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId] = "unknown-in-app-message-category-id", + [InAppMessageCategoryAndroid.Transactional] = "transactional", + }; + + public override InAppMessageCategoryAndroid Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var raw = reader.GetString(); + if (raw is not null && _fromString.TryGetValue(raw, out var value)) return value; + throw new JsonException($"Unknown InAppMessageCategoryAndroid value: {raw}"); + } + + public override void Write(Utf8JsonWriter writer, InAppMessageCategoryAndroid value, JsonSerializerOptions options) + { + writer.WriteStringValue(_toString[value]); + } + + internal static string ToRawString(InAppMessageCategoryAndroid value) => _toString[value]; + internal static InAppMessageCategoryAndroid FromRawString(string value) => + _fromString.TryGetValue(value, out var v) ? v : throw new ArgumentException($"Unknown InAppMessageCategoryAndroid value: {value}"); +} + +public static class InAppMessageCategoryAndroidExtensions +{ + public static string ToJson(this InAppMessageCategoryAndroid value) => InAppMessageCategoryAndroidJsonConverter.ToRawString(value); + public static InAppMessageCategoryAndroid FromJson(string value) => InAppMessageCategoryAndroidJsonConverter.FromRawString(value); +} + +/// Response code from Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +[JsonConverter(typeof(InAppMessageResponseCodeAndroidJsonConverter))] +public enum InAppMessageResponseCodeAndroid +{ + /// Flow finished and no developer action is needed. + NoActionNeeded, + /// Subscription status changed and the purchase token should be checked. + SubscriptionStatusUpdated +} + +public sealed class InAppMessageResponseCodeAndroidJsonConverter : JsonConverter +{ + private static readonly Dictionary _fromString = new() + { + ["no-action-needed"] = InAppMessageResponseCodeAndroid.NoActionNeeded, + ["NO_ACTION_NEEDED"] = InAppMessageResponseCodeAndroid.NoActionNeeded, + ["subscription-status-updated"] = InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated, + ["SUBSCRIPTION_STATUS_UPDATED"] = InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated, + }; + + private static readonly Dictionary _toString = new() + { + [InAppMessageResponseCodeAndroid.NoActionNeeded] = "no-action-needed", + [InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated] = "subscription-status-updated", + }; + + public override InAppMessageResponseCodeAndroid Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var raw = reader.GetString(); + if (raw is not null && _fromString.TryGetValue(raw, out var value)) return value; + throw new JsonException($"Unknown InAppMessageResponseCodeAndroid value: {raw}"); + } + + public override void Write(Utf8JsonWriter writer, InAppMessageResponseCodeAndroid value, JsonSerializerOptions options) + { + writer.WriteStringValue(_toString[value]); + } + + internal static string ToRawString(InAppMessageResponseCodeAndroid value) => _toString[value]; + internal static InAppMessageResponseCodeAndroid FromRawString(string value) => + _fromString.TryGetValue(value, out var v) ? v : throw new ArgumentException($"Unknown InAppMessageResponseCodeAndroid value: {value}"); +} + +public static class InAppMessageResponseCodeAndroidExtensions +{ + public static string ToJson(this InAppMessageResponseCodeAndroid value) => InAppMessageResponseCodeAndroidJsonConverter.ToRawString(value); + public static InAppMessageResponseCodeAndroid FromJson(string value) => InAppMessageResponseCodeAndroidJsonConverter.FromRawString(value); +} + /// Payment mode for subscription offers. /// Determines how the user pays during the offer period. [JsonConverter(typeof(PaymentModeJsonConverter))] @@ -2479,6 +2752,18 @@ public sealed record AppTransaction public required double SignedDate { get; init; } } +/// Display information for developer-rendered Billing Choice screens (Android) +/// Available in Google Play Billing Library 9.1.0+ +public sealed record BillingChoiceInfoAndroid +{ + /// URL for the Play Billing choice image matching the requested layout. + [JsonPropertyName("playBillingChoiceImageUrl")] + public required string PlayBillingChoiceImageUrl { get; init; } + /// Play Loyalty information for the user. + [JsonPropertyName("playBillingLoyaltyInfo")] + public string? PlayBillingLoyaltyInfo { get; init; } +} + /// Result of checking billing program availability (Android) /// Available in Google Play Billing Library 8.2.0+ public sealed record BillingProgramAvailabilityResultAndroid @@ -2486,9 +2771,16 @@ public sealed record BillingProgramAvailabilityResultAndroid /// The billing program that was checked [JsonPropertyName("billingProgram")] public required BillingProgramAndroid BillingProgram { get; init; } + /// Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + [JsonPropertyName("choiceScreenType")] + public BillingChoiceScreenTypeAndroid? ChoiceScreenType { get; init; } /// Whether the billing program is available for the user [JsonPropertyName("isAvailable")] public required bool IsAvailable { get; init; } + /// Whether external-link payment is available for Billing Choice. + /// Populated only for available BILLING_CHOICE results. + [JsonPropertyName("isExternalLinkAvailable")] + public bool? IsExternalLinkAvailable { get; init; } } /// Reporting details for transactions made outside of Google Play Billing (Android) @@ -2764,6 +3056,18 @@ public sealed record FetchProductsResultProducts(IReadOnlyList? Value) public sealed record FetchProductsResultSubscriptions(IReadOnlyList? Value) : FetchProductsResult; +/// Result from showing Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +public sealed record InAppMessageResultAndroid +{ + /// Purchase token returned when a subscription status changed. + [JsonPropertyName("purchaseToken")] + public string? PurchaseToken { get; init; } + /// Response code for the in-app messaging flow. + [JsonPropertyName("responseCode")] + public required InAppMessageResponseCodeAndroid ResponseCode { get; init; } +} + /// Installment plan details for subscription offers (Android) /// Contains information about the installment plan commitment. /// Available in Google Play Billing Library 7.0+ @@ -3774,6 +4078,18 @@ public sealed record AndroidSubscriptionOfferInput public required string OfferToken { get; init; } } +/// Parameters for showing a billing program information dialog (Android) +/// Available in Google Play Billing Library 9.1.0+ +public sealed record BillingProgramInformationDialogParamsAndroid +{ + /// Billing program. Currently only BILLING_CHOICE is supported. + [JsonPropertyName("billingProgram")] + public required BillingProgramAndroid BillingProgram { get; init; } + /// External transaction token returned by the Billing Choice reporting-details flow. + [JsonPropertyName("externalTransactionToken")] + public required string ExternalTransactionToken { get; init; } +} + public sealed record DeepLinkOptions { /// Android SKU to open (required on Android) @@ -3819,6 +4135,30 @@ public sealed record DiscountOfferInputIOS public required double Timestamp { get; init; } } +/// Parameters for fetching Billing Choice display information (Android) +/// Available in Google Play Billing Library 9.1.0+ +public sealed record GetBillingChoiceInfoParamsAndroid +{ + /// Billing program. Currently only BILLING_CHOICE is supported. + [JsonPropertyName("billingProgram")] + public required BillingProgramAndroid BillingProgram { get; init; } + /// Desired Play Billing choice image layout. + [JsonPropertyName("playBillingChoiceImageLayout")] + public required BillingChoiceImageLayoutAndroid PlayBillingChoiceImageLayout { get; init; } + /// BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. + [JsonPropertyName("userLocale")] + public string? UserLocale { get; init; } +} + +/// Parameters for showing Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +public sealed record InAppMessageParamsAndroid +{ + /// In-app message categories to show. Defaults to transactional messages. + [JsonPropertyName("categories")] + public IReadOnlyList? Categories { get; init; } +} + /// Connection initialization configuration public sealed record InitConnectionConfig { @@ -4270,7 +4610,6 @@ public interface MutationResolver Task BeginRefundRequestIOSAsync(string sku); /// Check whether alternative billing is available for the user. Step 1 of the alternative billing flow. - /// /// Returns true if available, false otherwise. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/check-alternative-billing-availability-android @@ -4287,7 +4626,6 @@ public interface MutationResolver /// Create a reporting token for an alternative billing flow. Step 3 of the alternative billing flow. /// Must be called AFTER successful payment in your payment system. /// Token must be reported to Google Play backend within 24 hours. - /// /// Returns token string, or null if creation failed. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-alternative-billing-token-android @@ -4295,11 +4633,10 @@ public interface MutationResolver /// Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). /// Replaces the deprecated createExternalOfferReportingDetailsAsync API. - /// /// Returns external transaction token needed for reporting external transactions. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android - Task CreateBillingProgramReportingDetailsAndroidAsync(BillingProgramAndroid program); + Task CreateBillingProgramReportingDetailsAndroidAsync(BillingProgramAndroid program, DeveloperBillingTypeAndroid? developerBillingType = null); /// Open the platform's subscription management UI. /// See: https://openiap.dev/docs/apis/deep-link-to-subscriptions @@ -4319,7 +4656,6 @@ public interface MutationResolver /// Check whether a billing program (e.g., External Payments) is available for the current user. /// Replaces the deprecated isExternalOfferAvailableAsync API. - /// /// Available in Google Play Billing Library 8.2.0+. /// Returns availability result with isAvailable flag. /// Throws OpenIapError.NotPrepared if billing client not ready. @@ -4328,7 +4664,6 @@ public interface MutationResolver /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). /// Replaces the deprecated showExternalOfferInformationDialog API. - /// /// Shows Play Store dialog and optionally launches external URL. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/launch-external-link-android @@ -4366,18 +4701,30 @@ public interface MutationResolver /// Display Google's alternative billing information dialog. Step 2 of the alternative billing flow. /// Must be called BEFORE processing payment in your payment system. - /// /// Returns true if user accepted, false if user canceled. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android Task ShowAlternativeBillingDialogAndroidAsync(); + /// Show Google's information dialog for a Billing Choice external transaction. + /// Available in Google Play Billing Library 9.1.0+. + /// Throws OpenIapError.NotPrepared if billing client not ready. + /// See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android + Task ShowBillingProgramInformationDialogAndroidAsync(BillingProgramInformationDialogParamsAndroid @params); + /// Present the disclosure sheet required before linking out via ExternalPurchaseCustomLink (iOS 18.1+). /// Call this after a deliberate customer interaction before linking out to external purchases. /// Reference: https://developer.apple.com/documentation/storekit/externalpurchasecustomlink/shownotice(type:) /// See: https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios Task ShowExternalPurchaseCustomLinkNoticeIOSAsync(ExternalPurchaseCustomLinkNoticeTypeIOS noticeType); + /// Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. + /// Available in Google Play Billing Library 4.1.0+. + /// Returns a response code and, when the subscription status changes, the related purchase token. + /// Throws OpenIapError.NotPrepared if billing client not ready. + /// See: https://openiap.dev/docs/apis/android/show-in-app-messages-android + Task ShowInAppMessagesAndroidAsync(InAppMessageParamsAndroid? @params = null); + /// Present the manage-subscriptions sheet and return changed purchases (iOS 15+). /// See: https://openiap.dev/docs/apis/ios/show-manage-subscriptions-ios Task> ShowManageSubscriptionsIOSAsync(); @@ -4440,6 +4787,12 @@ public interface QueryResolver /// See: https://openiap.dev/docs/apis/get-available-purchases Task> GetAvailablePurchasesAsync(PurchaseOptions? options = null); + /// Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. + /// Available in Google Play Billing Library 9.1.0+. + /// Throws OpenIapError.NotPrepared if billing client is not ready. + /// See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android + Task GetBillingChoiceInfoAndroidAsync(GetBillingChoiceInfoParamsAndroid @params); + /// Fetch a token for Apple's External Purchase Server reporting API (iOS 18.1+). /// Use this token to report transactions made through ExternalPurchaseCustomLink. /// Reference: https://developer.apple.com/documentation/storekit/externalpurchasecustomlink/token(for:) diff --git a/packages/gql/src/generated/Types.kt b/packages/gql/src/generated/Types.kt index 7cf7a7309..2ea3ef089 100644 --- a/packages/gql/src/generated/Types.kt +++ b/packages/gql/src/generated/Types.kt @@ -48,8 +48,75 @@ public enum class AlternativeBillingModeAndroid(val rawValue: String) { } /** - * Billing program types for external content links, external offers, and external payments (Android) - * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0 + * Play Billing choice image layout (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public enum class BillingChoiceImageLayoutAndroid(val rawValue: String) { + /** + * Rectangular image with a 4:1 aspect ratio. + */ + RectangularFourByOne("rectangular-four-by-one"), + /** + * Rectangular image with a 3:1 aspect ratio. + */ + RectangularThreeByOne("rectangular-three-by-one"), + /** + * Rectangular image with a 2:2 aspect ratio. + */ + RectangularTwoByTwo("rectangular-two-by-two") + + companion object { + fun fromJson(value: String): BillingChoiceImageLayoutAndroid = when (value) { + "rectangular-four-by-one" -> BillingChoiceImageLayoutAndroid.RectangularFourByOne + "RECTANGULAR_FOUR_BY_ONE" -> BillingChoiceImageLayoutAndroid.RectangularFourByOne + "rectangular-three-by-one" -> BillingChoiceImageLayoutAndroid.RectangularThreeByOne + "RECTANGULAR_THREE_BY_ONE" -> BillingChoiceImageLayoutAndroid.RectangularThreeByOne + "rectangular-two-by-two" -> BillingChoiceImageLayoutAndroid.RectangularTwoByTwo + "RECTANGULAR_TWO_BY_TWO" -> BillingChoiceImageLayoutAndroid.RectangularTwoByTwo + else -> throw IllegalArgumentException("Unknown BillingChoiceImageLayoutAndroid value: $value") + } + } + + fun toJson(): String = rawValue +} + +/** + * Choice screen renderer for Billing Choice availability (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public enum class BillingChoiceScreenTypeAndroid(val rawValue: String) { + /** + * Unspecified choice screen type. + */ + Unspecified("unspecified"), + /** + * Choice screen is rendered by the developer app. + */ + DeveloperRendered("developer-rendered"), + /** + * Choice screen is rendered by Google Play. + */ + GoogleRendered("google-rendered") + + companion object { + fun fromJson(value: String): BillingChoiceScreenTypeAndroid = when (value) { + "unspecified" -> BillingChoiceScreenTypeAndroid.Unspecified + "UNSPECIFIED" -> BillingChoiceScreenTypeAndroid.Unspecified + "developer-rendered" -> BillingChoiceScreenTypeAndroid.DeveloperRendered + "DEVELOPER_RENDERED" -> BillingChoiceScreenTypeAndroid.DeveloperRendered + "google-rendered" -> BillingChoiceScreenTypeAndroid.GoogleRendered + "GOOGLE_RENDERED" -> BillingChoiceScreenTypeAndroid.GoogleRendered + else -> throw IllegalArgumentException("Unknown BillingChoiceScreenTypeAndroid value: $value") + } + } + + fun toJson(): String = rawValue +} + +/** + * Billing program types for Google Play Billing Programs (Android) + * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, + * BILLING_CHOICE added in 9.1.0. */ public enum class BillingProgramAndroid(val rawValue: String) { /** @@ -80,7 +147,13 @@ public enum class BillingProgramAndroid(val rawValue: String) { * Users can choose to complete the purchase on the developer's website. * Available in Google Play Billing Library 8.3.0+ */ - ExternalPayments("external-payments") + ExternalPayments("external-payments"), + /** + * Billing Choice program. + * Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. + * Available in Google Play Billing Library 9.1.0+ + */ + BillingChoice("billing-choice") companion object { fun fromJson(value: String): BillingProgramAndroid = when (value) { @@ -94,6 +167,8 @@ public enum class BillingProgramAndroid(val rawValue: String) { "EXTERNAL_OFFER" -> BillingProgramAndroid.ExternalOffer "external-payments" -> BillingProgramAndroid.ExternalPayments "EXTERNAL_PAYMENTS" -> BillingProgramAndroid.ExternalPayments + "billing-choice" -> BillingProgramAndroid.BillingChoice + "BILLING_CHOICE" -> BillingProgramAndroid.BillingChoice else -> throw IllegalArgumentException("Unknown BillingProgramAndroid value: $value") } } @@ -137,6 +212,39 @@ public enum class DeveloperBillingLaunchModeAndroid(val rawValue: String) { fun toJson(): String = rawValue } +/** + * Developer-provided billing destination type for Billing Program reporting details (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public enum class DeveloperBillingTypeAndroid(val rawValue: String) { + /** + * Unspecified developer billing type. Do not use. + */ + DeveloperBillingTypeUnspecified("developer-billing-type-unspecified"), + /** + * Developer-provided billing via native in-app experience. + */ + InApp("in-app"), + /** + * Developer-provided billing via external link or embedded web browsing. + */ + ExternalLink("external-link") + + companion object { + fun fromJson(value: String): DeveloperBillingTypeAndroid = when (value) { + "developer-billing-type-unspecified" -> DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified + "DEVELOPER_BILLING_TYPE_UNSPECIFIED" -> DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified + "in-app" -> DeveloperBillingTypeAndroid.InApp + "IN_APP" -> DeveloperBillingTypeAndroid.InApp + "external-link" -> DeveloperBillingTypeAndroid.ExternalLink + "EXTERNAL_LINK" -> DeveloperBillingTypeAndroid.ExternalLink + else -> throw IllegalArgumentException("Unknown DeveloperBillingTypeAndroid value: $value") + } + } + + fun toJson(): String = rawValue +} + /** * Discount offer type enumeration. * Categorizes the type of discount or promotional offer. @@ -654,6 +762,60 @@ public enum class IapStore(val rawValue: String) { fun toJson(): String = rawValue } +/** + * High-level in-app message category (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +public enum class InAppMessageCategoryAndroid(val rawValue: String) { + /** + * Unknown in-app message category. + */ + UnknownInAppMessageCategoryId("unknown-in-app-message-category-id"), + /** + * Transactional billing messages, such as payment issues or pending price-change confirmations. + */ + Transactional("transactional") + + companion object { + fun fromJson(value: String): InAppMessageCategoryAndroid = when (value) { + "unknown-in-app-message-category-id" -> InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId + "UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID" -> InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId + "transactional" -> InAppMessageCategoryAndroid.Transactional + "TRANSACTIONAL" -> InAppMessageCategoryAndroid.Transactional + else -> throw IllegalArgumentException("Unknown InAppMessageCategoryAndroid value: $value") + } + } + + fun toJson(): String = rawValue +} + +/** + * Response code from Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +public enum class InAppMessageResponseCodeAndroid(val rawValue: String) { + /** + * Flow finished and no developer action is needed. + */ + NoActionNeeded("no-action-needed"), + /** + * Subscription status changed and the purchase token should be checked. + */ + SubscriptionStatusUpdated("subscription-status-updated") + + companion object { + fun fromJson(value: String): InAppMessageResponseCodeAndroid = when (value) { + "no-action-needed" -> InAppMessageResponseCodeAndroid.NoActionNeeded + "NO_ACTION_NEEDED" -> InAppMessageResponseCodeAndroid.NoActionNeeded + "subscription-status-updated" -> InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated + "SUBSCRIPTION_STATUS_UPDATED" -> InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated + else -> throw IllegalArgumentException("Unknown InAppMessageResponseCodeAndroid value: $value") + } + } + + fun toJson(): String = rawValue +} + /** * Payment mode for subscription offers. * Determines how the user pays during the offer period. @@ -1702,6 +1864,37 @@ public data class AppTransaction( ) } +/** + * Display information for developer-rendered Billing Choice screens (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public data class BillingChoiceInfoAndroid( + /** + * URL for the Play Billing choice image matching the requested layout. + */ + val playBillingChoiceImageUrl: String, + /** + * Play Loyalty information for the user. + */ + val playBillingLoyaltyInfo: String? = null +) { + + companion object { + fun fromJson(json: Map): BillingChoiceInfoAndroid { + return BillingChoiceInfoAndroid( + playBillingChoiceImageUrl = json["playBillingChoiceImageUrl"] as? String ?: "", + playBillingLoyaltyInfo = json["playBillingLoyaltyInfo"] as? String, + ) + } + } + + fun toJson(): Map = mapOf( + "__typename" to "BillingChoiceInfoAndroid", + "playBillingChoiceImageUrl" to playBillingChoiceImageUrl, + "playBillingLoyaltyInfo" to playBillingLoyaltyInfo, + ) +} + /** * Result of checking billing program availability (Android) * Available in Google Play Billing Library 8.2.0+ @@ -1711,17 +1904,28 @@ public data class BillingProgramAvailabilityResultAndroid( * The billing program that was checked */ val billingProgram: BillingProgramAndroid, + /** + * Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + */ + val choiceScreenType: BillingChoiceScreenTypeAndroid? = null, /** * Whether the billing program is available for the user */ - val isAvailable: Boolean + val isAvailable: Boolean, + /** + * Whether external-link payment is available for Billing Choice. + * Populated only for available BILLING_CHOICE results. + */ + val isExternalLinkAvailable: Boolean? = null ) { companion object { fun fromJson(json: Map): BillingProgramAvailabilityResultAndroid { return BillingProgramAvailabilityResultAndroid( billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified, + choiceScreenType = (json["choiceScreenType"] as? String)?.let { BillingChoiceScreenTypeAndroid.fromJson(it) }, isAvailable = json["isAvailable"] as? Boolean ?: false, + isExternalLinkAvailable = json["isExternalLinkAvailable"] as? Boolean, ) } } @@ -1729,7 +1933,9 @@ public data class BillingProgramAvailabilityResultAndroid( fun toJson(): Map = mapOf( "__typename" to "BillingProgramAvailabilityResultAndroid", "billingProgram" to billingProgram.toJson(), + "choiceScreenType" to choiceScreenType?.toJson(), "isAvailable" to isAvailable, + "isExternalLinkAvailable" to isExternalLinkAvailable, ) } @@ -2336,6 +2542,37 @@ public data class FetchProductsResultProducts(val value: List?) : Fetch public data class FetchProductsResultSubscriptions(val value: List?) : FetchProductsResult +/** + * Result from showing Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +public data class InAppMessageResultAndroid( + /** + * Purchase token returned when a subscription status changed. + */ + val purchaseToken: String? = null, + /** + * Response code for the in-app messaging flow. + */ + val responseCode: InAppMessageResponseCodeAndroid +) { + + companion object { + fun fromJson(json: Map): InAppMessageResultAndroid { + return InAppMessageResultAndroid( + purchaseToken = json["purchaseToken"] as? String, + responseCode = (json["responseCode"] as? String)?.let { InAppMessageResponseCodeAndroid.fromJson(it) } ?: InAppMessageResponseCodeAndroid.NoActionNeeded, + ) + } + } + + fun toJson(): Map = mapOf( + "__typename" to "InAppMessageResultAndroid", + "purchaseToken" to purchaseToken, + "responseCode" to responseCode.toJson(), + ) +} + /** * Installment plan details for subscription offers (Android) * Contains information about the installment plan commitment. @@ -4320,6 +4557,38 @@ public data class AndroidSubscriptionOfferInput( ) } +/** + * Parameters for showing a billing program information dialog (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public data class BillingProgramInformationDialogParamsAndroid( + /** + * Billing program. Currently only BILLING_CHOICE is supported. + */ + val billingProgram: BillingProgramAndroid, + /** + * External transaction token returned by the Billing Choice reporting-details flow. + */ + val externalTransactionToken: String +) { + companion object { + fun fromJson(json: Map): BillingProgramInformationDialogParamsAndroid? { + val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified + val externalTransactionToken = json["externalTransactionToken"] as? String + if (externalTransactionToken == null) return null + return BillingProgramInformationDialogParamsAndroid( + billingProgram = billingProgram, + externalTransactionToken = externalTransactionToken, + ) + } + } + + fun toJson(): Map = mapOf( + "billingProgram" to billingProgram.toJson(), + "externalTransactionToken" to externalTransactionToken, + ) +} + public data class DeepLinkOptions( /** * Android package name to target (required on Android) @@ -4434,6 +4703,67 @@ public data class DiscountOfferInputIOS( ) } +/** + * Parameters for fetching Billing Choice display information (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +public data class GetBillingChoiceInfoParamsAndroid( + /** + * Billing program. Currently only BILLING_CHOICE is supported. + */ + val billingProgram: BillingProgramAndroid, + /** + * Desired Play Billing choice image layout. + */ + val playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid, + /** + * BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. + */ + val userLocale: String? = null +) { + companion object { + fun fromJson(json: Map): GetBillingChoiceInfoParamsAndroid? { + val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified + val playBillingChoiceImageLayout = (json["playBillingChoiceImageLayout"] as? String)?.let { BillingChoiceImageLayoutAndroid.fromJson(it) } ?: BillingChoiceImageLayoutAndroid.RectangularFourByOne + val userLocale = json["userLocale"] as? String + return GetBillingChoiceInfoParamsAndroid( + billingProgram = billingProgram, + playBillingChoiceImageLayout = playBillingChoiceImageLayout, + userLocale = userLocale, + ) + } + } + + fun toJson(): Map = mapOf( + "billingProgram" to billingProgram.toJson(), + "playBillingChoiceImageLayout" to playBillingChoiceImageLayout.toJson(), + "userLocale" to userLocale, + ) +} + +/** + * Parameters for showing Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +public data class InAppMessageParamsAndroid( + /** + * In-app message categories to show. Defaults to transactional messages. + */ + val categories: List? = null +) { + companion object { + fun fromJson(json: Map): InAppMessageParamsAndroid { + return InAppMessageParamsAndroid( + categories = (json["categories"] as? List<*>)?.mapNotNull { (it as? String)?.let { InAppMessageCategoryAndroid.fromJson(it) } ?: InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId }, + ) + } + } + + fun toJson(): Map = mapOf( + "categories" to categories?.map { it.toJson() }, + ) +} + /** * Connection initialization configuration */ @@ -5531,7 +5861,6 @@ public interface MutationResolver { suspend fun beginRefundRequestIOS(sku: String): String? /** * Check whether alternative billing is available for the user. Step 1 of the alternative billing flow. - * * Returns true if available, false otherwise. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/check-alternative-billing-availability-android @@ -5551,7 +5880,6 @@ public interface MutationResolver { * Create a reporting token for an alternative billing flow. Step 3 of the alternative billing flow. * Must be called AFTER successful payment in your payment system. * Token must be reported to Google Play backend within 24 hours. - * * Returns token string, or null if creation failed. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-alternative-billing-token-android @@ -5560,12 +5888,11 @@ public interface MutationResolver { /** * Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). * Replaces the deprecated createExternalOfferReportingDetailsAsync API. - * * Returns external transaction token needed for reporting external transactions. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ - suspend fun createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid): BillingProgramReportingDetailsAndroid + suspend fun createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid, developerBillingType: DeveloperBillingTypeAndroid? = null): BillingProgramReportingDetailsAndroid /** * Open the platform's subscription management UI. * See: https://openiap.dev/docs/apis/deep-link-to-subscriptions @@ -5589,7 +5916,6 @@ public interface MutationResolver { /** * Check whether a billing program (e.g., External Payments) is available for the current user. * Replaces the deprecated isExternalOfferAvailableAsync API. - * * Available in Google Play Billing Library 8.2.0+. * Returns availability result with isAvailable flag. * Throws OpenIapError.NotPrepared if billing client not ready. @@ -5599,7 +5925,6 @@ public interface MutationResolver { /** * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). * Replaces the deprecated showExternalOfferInformationDialog API. - * * Shows Play Store dialog and optionally launches external URL. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/launch-external-link-android @@ -5644,12 +5969,18 @@ public interface MutationResolver { /** * Display Google's alternative billing information dialog. Step 2 of the alternative billing flow. * Must be called BEFORE processing payment in your payment system. - * * Returns true if user accepted, false if user canceled. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android */ suspend fun showAlternativeBillingDialogAndroid(): Boolean + /** + * Show Google's information dialog for a Billing Choice external transaction. + * Available in Google Play Billing Library 9.1.0+. + * Throws OpenIapError.NotPrepared if billing client not ready. + * See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android + */ + suspend fun showBillingProgramInformationDialogAndroid(params: BillingProgramInformationDialogParamsAndroid): BillingResultAndroid /** * Present the disclosure sheet required before linking out via ExternalPurchaseCustomLink (iOS 18.1+). * Call this after a deliberate customer interaction before linking out to external purchases. @@ -5657,6 +5988,14 @@ public interface MutationResolver { * See: https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios */ suspend fun showExternalPurchaseCustomLinkNoticeIOS(noticeType: ExternalPurchaseCustomLinkNoticeTypeIOS): ExternalPurchaseCustomLinkNoticeResultIOS + /** + * Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. + * Available in Google Play Billing Library 4.1.0+. + * Returns a response code and, when the subscription status changes, the related purchase token. + * Throws OpenIapError.NotPrepared if billing client not ready. + * See: https://openiap.dev/docs/apis/android/show-in-app-messages-android + */ + suspend fun showInAppMessagesAndroid(params: InAppMessageParamsAndroid? = null): InAppMessageResultAndroid /** * Present the manage-subscriptions sheet and return changed purchases (iOS 15+). * See: https://openiap.dev/docs/apis/ios/show-manage-subscriptions-ios @@ -5733,6 +6072,13 @@ public interface QueryResolver { * See: https://openiap.dev/docs/apis/get-available-purchases */ suspend fun getAvailablePurchases(options: PurchaseOptions? = null): List + /** + * Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. + * Available in Google Play Billing Library 9.1.0+. + * Throws OpenIapError.NotPrepared if billing client is not ready. + * See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android + */ + suspend fun getBillingChoiceInfoAndroid(params: GetBillingChoiceInfoParamsAndroid): BillingChoiceInfoAndroid /** * Fetch a token for Apple's External Purchase Server reporting API (iOS 18.1+). * Use this token to report transactions made through ExternalPurchaseCustomLink. @@ -5867,7 +6213,7 @@ public typealias MutationCheckAlternativeBillingAvailabilityAndroidHandler = sus public typealias MutationClearTransactionIOSHandler = suspend () -> Boolean public typealias MutationConsumePurchaseAndroidHandler = suspend (purchaseToken: String) -> Boolean public typealias MutationCreateAlternativeBillingTokenAndroidHandler = suspend () -> String? -public typealias MutationCreateBillingProgramReportingDetailsAndroidHandler = suspend (program: BillingProgramAndroid) -> BillingProgramReportingDetailsAndroid +public typealias MutationCreateBillingProgramReportingDetailsAndroidHandler = suspend (program: BillingProgramAndroid, developerBillingType: DeveloperBillingTypeAndroid?) -> BillingProgramReportingDetailsAndroid public typealias MutationDeepLinkToSubscriptionsHandler = suspend (options: DeepLinkOptions?) -> Unit public typealias MutationEndConnectionHandler = suspend () -> Boolean public typealias MutationFinishTransactionHandler = suspend (purchase: PurchaseInput, isConsumable: Boolean?) -> Unit @@ -5881,7 +6227,9 @@ public typealias MutationRequestPurchaseHandler = suspend (params: RequestPurcha public typealias MutationRequestPurchaseOnPromotedProductIOSHandler = suspend () -> Boolean public typealias MutationRestorePurchasesHandler = suspend () -> Unit public typealias MutationShowAlternativeBillingDialogAndroidHandler = suspend () -> Boolean +public typealias MutationShowBillingProgramInformationDialogAndroidHandler = suspend (params: BillingProgramInformationDialogParamsAndroid) -> BillingResultAndroid public typealias MutationShowExternalPurchaseCustomLinkNoticeIOSHandler = suspend (noticeType: ExternalPurchaseCustomLinkNoticeTypeIOS) -> ExternalPurchaseCustomLinkNoticeResultIOS +public typealias MutationShowInAppMessagesAndroidHandler = suspend (params: InAppMessageParamsAndroid?) -> InAppMessageResultAndroid public typealias MutationShowManageSubscriptionsIOSHandler = suspend () -> List public typealias MutationSyncIOSHandler = suspend () -> Boolean public typealias MutationValidateReceiptHandler = suspend (options: VerifyPurchaseProps) -> VerifyPurchaseResult @@ -5909,7 +6257,9 @@ public data class MutationHandlers( val requestPurchaseOnPromotedProductIOS: MutationRequestPurchaseOnPromotedProductIOSHandler? = null, val restorePurchases: MutationRestorePurchasesHandler? = null, val showAlternativeBillingDialogAndroid: MutationShowAlternativeBillingDialogAndroidHandler? = null, + val showBillingProgramInformationDialogAndroid: MutationShowBillingProgramInformationDialogAndroidHandler? = null, val showExternalPurchaseCustomLinkNoticeIOS: MutationShowExternalPurchaseCustomLinkNoticeIOSHandler? = null, + val showInAppMessagesAndroid: MutationShowInAppMessagesAndroidHandler? = null, val showManageSubscriptionsIOS: MutationShowManageSubscriptionsIOSHandler? = null, val syncIOS: MutationSyncIOSHandler? = null, val validateReceipt: MutationValidateReceiptHandler? = null, @@ -5926,6 +6276,7 @@ public typealias QueryGetActiveSubscriptionsHandler = suspend (subscriptionIds: public typealias QueryGetAllTransactionsIOSHandler = suspend () -> List public typealias QueryGetAppTransactionIOSHandler = suspend () -> AppTransaction? public typealias QueryGetAvailablePurchasesHandler = suspend (options: PurchaseOptions?) -> List +public typealias QueryGetBillingChoiceInfoAndroidHandler = suspend (params: GetBillingChoiceInfoParamsAndroid) -> BillingChoiceInfoAndroid public typealias QueryGetExternalPurchaseCustomLinkTokenIOSHandler = suspend (tokenType: ExternalPurchaseCustomLinkTokenTypeIOS) -> ExternalPurchaseCustomLinkTokenResultIOS public typealias QueryGetPendingTransactionsIOSHandler = suspend () -> List public typealias QueryGetPromotedProductIOSHandler = suspend () -> ProductIOS? @@ -5949,6 +6300,7 @@ public data class QueryHandlers( val getAllTransactionsIOS: QueryGetAllTransactionsIOSHandler? = null, val getAppTransactionIOS: QueryGetAppTransactionIOSHandler? = null, val getAvailablePurchases: QueryGetAvailablePurchasesHandler? = null, + val getBillingChoiceInfoAndroid: QueryGetBillingChoiceInfoAndroidHandler? = null, val getExternalPurchaseCustomLinkTokenIOS: QueryGetExternalPurchaseCustomLinkTokenIOSHandler? = null, val getPendingTransactionsIOS: QueryGetPendingTransactionsIOSHandler? = null, val getPromotedProductIOS: QueryGetPromotedProductIOSHandler? = null, diff --git a/packages/gql/src/generated/Types.swift b/packages/gql/src/generated/Types.swift index 656556304..952083007 100644 --- a/packages/gql/src/generated/Types.swift +++ b/packages/gql/src/generated/Types.swift @@ -24,8 +24,31 @@ public enum AlternativeBillingModeAndroid: String, Codable, CaseIterable { case alternativeOnly = "alternative-only" } -/// Billing program types for external content links, external offers, and external payments (Android) -/// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0 +/// Play Billing choice image layout (Android) +/// Available in Google Play Billing Library 9.1.0+ +public enum BillingChoiceImageLayoutAndroid: String, Codable, CaseIterable { + /// Rectangular image with a 4:1 aspect ratio. + case rectangularFourByOne = "rectangular-four-by-one" + /// Rectangular image with a 3:1 aspect ratio. + case rectangularThreeByOne = "rectangular-three-by-one" + /// Rectangular image with a 2:2 aspect ratio. + case rectangularTwoByTwo = "rectangular-two-by-two" +} + +/// Choice screen renderer for Billing Choice availability (Android) +/// Available in Google Play Billing Library 9.1.0+ +public enum BillingChoiceScreenTypeAndroid: String, Codable, CaseIterable { + /// Unspecified choice screen type. + case unspecified = "unspecified" + /// Choice screen is rendered by the developer app. + case developerRendered = "developer-rendered" + /// Choice screen is rendered by Google Play. + case googleRendered = "google-rendered" +} + +/// Billing program types for Google Play Billing Programs (Android) +/// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, +/// BILLING_CHOICE added in 9.1.0. public enum BillingProgramAndroid: String, Codable, CaseIterable { /// Unspecified billing program. Do not use. case unspecified = "unspecified" @@ -46,6 +69,10 @@ public enum BillingProgramAndroid: String, Codable, CaseIterable { /// Users can choose to complete the purchase on the developer's website. /// Available in Google Play Billing Library 8.3.0+ case externalPayments = "external-payments" + /// Billing Choice program. + /// Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. + /// Available in Google Play Billing Library 9.1.0+ + case billingChoice = "billing-choice" } /// Launch mode for developer billing option (Android) @@ -62,6 +89,17 @@ public enum DeveloperBillingLaunchModeAndroid: String, Codable, CaseIterable { case callerWillLaunchLink = "caller-will-launch-link" } +/// Developer-provided billing destination type for Billing Program reporting details (Android) +/// Available in Google Play Billing Library 9.1.0+ +public enum DeveloperBillingTypeAndroid: String, Codable, CaseIterable { + /// Unspecified developer billing type. Do not use. + case developerBillingTypeUnspecified = "developer-billing-type-unspecified" + /// Developer-provided billing via native in-app experience. + case inApp = "in-app" + /// Developer-provided billing via external link or embedded web browsing. + case externalLink = "external-link" +} + /// Discount offer type enumeration. /// Categorizes the type of discount or promotional offer. public enum DiscountOfferType: String, Codable, CaseIterable { @@ -306,6 +344,24 @@ public enum IapStore: String, Codable, CaseIterable { case amazon = "amazon" } +/// High-level in-app message category (Android) +/// Available in Google Play Billing Library 4.1.0+ +public enum InAppMessageCategoryAndroid: String, Codable, CaseIterable { + /// Unknown in-app message category. + case unknownInAppMessageCategoryId = "unknown-in-app-message-category-id" + /// Transactional billing messages, such as payment issues or pending price-change confirmations. + case transactional = "transactional" +} + +/// Response code from Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +public enum InAppMessageResponseCodeAndroid: String, Codable, CaseIterable { + /// Flow finished and no developer action is needed. + case noActionNeeded = "no-action-needed" + /// Subscription status changed and the purchase token should be checked. + case subscriptionStatusUpdated = "subscription-status-updated" +} + /// Payment mode for subscription offers. /// Determines how the user pays during the offer period. public enum PaymentMode: String, Codable, CaseIterable { @@ -667,13 +723,27 @@ public struct AppTransaction: Codable { public var signedDate: Double } +/// Display information for developer-rendered Billing Choice screens (Android) +/// Available in Google Play Billing Library 9.1.0+ +public struct BillingChoiceInfoAndroid: Codable { + /// URL for the Play Billing choice image matching the requested layout. + public var playBillingChoiceImageUrl: String + /// Play Loyalty information for the user. + public var playBillingLoyaltyInfo: String? = nil +} + /// Result of checking billing program availability (Android) /// Available in Google Play Billing Library 8.2.0+ public struct BillingProgramAvailabilityResultAndroid: Codable { /// The billing program that was checked public var billingProgram: BillingProgramAndroid + /// Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + public var choiceScreenType: BillingChoiceScreenTypeAndroid? = nil /// Whether the billing program is available for the user public var isAvailable: Bool + /// Whether external-link payment is available for Billing Choice. + /// Populated only for available BILLING_CHOICE results. + public var isExternalLinkAvailable: Bool? = nil } /// Reporting details for transactions made outside of Google Play Billing (Android) @@ -879,6 +949,15 @@ public enum FetchProductsResult { case subscriptions([ProductSubscription]?) } +/// Result from showing Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +public struct InAppMessageResultAndroid: Codable { + /// Purchase token returned when a subscription status changed. + public var purchaseToken: String? = nil + /// Response code for the in-app messaging flow. + public var responseCode: InAppMessageResponseCodeAndroid +} + /// Installment plan details for subscription offers (Android) /// Contains information about the installment plan commitment. /// Available in Google Play Billing Library 7.0+ @@ -1549,6 +1628,23 @@ public struct AndroidSubscriptionOfferInput: Codable { } } +/// Parameters for showing a billing program information dialog (Android) +/// Available in Google Play Billing Library 9.1.0+ +public struct BillingProgramInformationDialogParamsAndroid: Codable { + /// Billing program. Currently only BILLING_CHOICE is supported. + public var billingProgram: BillingProgramAndroid + /// External transaction token returned by the Billing Choice reporting-details flow. + public var externalTransactionToken: String + + public init( + billingProgram: BillingProgramAndroid, + externalTransactionToken: String + ) { + self.billingProgram = billingProgram + self.externalTransactionToken = externalTransactionToken + } +} + public struct DeepLinkOptions: Codable { /// Android package name to target (required on Android) public var packageNameAndroid: String? @@ -1637,6 +1733,40 @@ public struct DiscountOfferInputIOS: Codable { } } +/// Parameters for fetching Billing Choice display information (Android) +/// Available in Google Play Billing Library 9.1.0+ +public struct GetBillingChoiceInfoParamsAndroid: Codable { + /// Billing program. Currently only BILLING_CHOICE is supported. + public var billingProgram: BillingProgramAndroid + /// Desired Play Billing choice image layout. + public var playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid + /// BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. + public var userLocale: String? + + public init( + billingProgram: BillingProgramAndroid, + playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid, + userLocale: String? = nil + ) { + self.billingProgram = billingProgram + self.playBillingChoiceImageLayout = playBillingChoiceImageLayout + self.userLocale = userLocale + } +} + +/// Parameters for showing Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +public struct InAppMessageParamsAndroid: Codable { + /// In-app message categories to show. Defaults to transactional messages. + public var categories: [InAppMessageCategoryAndroid]? + + public init( + categories: [InAppMessageCategoryAndroid]? = nil + ) { + self.categories = categories + } +} + /// Connection initialization configuration public struct InitConnectionConfig: Codable { /// Alternative billing mode for Android @@ -2597,7 +2727,6 @@ public protocol MutationResolver { /// See: https://openiap.dev/docs/apis/ios/begin-refund-request-ios func beginRefundRequestIOS(_ sku: String) async throws -> String? /// Check whether alternative billing is available for the user. Step 1 of the alternative billing flow. - /// /// Returns true if available, false otherwise. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/check-alternative-billing-availability-android @@ -2611,18 +2740,16 @@ public protocol MutationResolver { /// Create a reporting token for an alternative billing flow. Step 3 of the alternative billing flow. /// Must be called AFTER successful payment in your payment system. /// Token must be reported to Google Play backend within 24 hours. - /// /// Returns token string, or null if creation failed. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-alternative-billing-token-android func createAlternativeBillingTokenAndroid() async throws -> String? /// Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). /// Replaces the deprecated createExternalOfferReportingDetailsAsync API. - /// /// Returns external transaction token needed for reporting external transactions. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android - func createBillingProgramReportingDetailsAndroid(_ program: BillingProgramAndroid) async throws -> BillingProgramReportingDetailsAndroid + func createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid, developerBillingType: DeveloperBillingTypeAndroid?) async throws -> BillingProgramReportingDetailsAndroid /// Open the platform's subscription management UI. /// See: https://openiap.dev/docs/apis/deep-link-to-subscriptions func deepLinkToSubscriptions(_ options: DeepLinkOptions?) async throws -> Void @@ -2637,7 +2764,6 @@ public protocol MutationResolver { func initConnection(_ config: InitConnectionConfig?) async throws -> Bool /// Check whether a billing program (e.g., External Payments) is available for the current user. /// Replaces the deprecated isExternalOfferAvailableAsync API. - /// /// Available in Google Play Billing Library 8.2.0+. /// Returns availability result with isAvailable flag. /// Throws OpenIapError.NotPrepared if billing client not ready. @@ -2645,7 +2771,6 @@ public protocol MutationResolver { func isBillingProgramAvailableAndroid(_ program: BillingProgramAndroid) async throws -> BillingProgramAvailabilityResultAndroid /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). /// Replaces the deprecated showExternalOfferInformationDialog API. - /// /// Shows Play Store dialog and optionally launches external URL. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/launch-external-link-android @@ -2676,16 +2801,26 @@ public protocol MutationResolver { func restorePurchases() async throws -> Void /// Display Google's alternative billing information dialog. Step 2 of the alternative billing flow. /// Must be called BEFORE processing payment in your payment system. - /// /// Returns true if user accepted, false if user canceled. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android func showAlternativeBillingDialogAndroid() async throws -> Bool + /// Show Google's information dialog for a Billing Choice external transaction. + /// Available in Google Play Billing Library 9.1.0+. + /// Throws OpenIapError.NotPrepared if billing client not ready. + /// See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android + func showBillingProgramInformationDialogAndroid(_ params: BillingProgramInformationDialogParamsAndroid) async throws -> BillingResultAndroid /// Present the disclosure sheet required before linking out via ExternalPurchaseCustomLink (iOS 18.1+). /// Call this after a deliberate customer interaction before linking out to external purchases. /// Reference: https://developer.apple.com/documentation/storekit/externalpurchasecustomlink/shownotice(type:) /// See: https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios func showExternalPurchaseCustomLinkNoticeIOS(_ noticeType: ExternalPurchaseCustomLinkNoticeTypeIOS) async throws -> ExternalPurchaseCustomLinkNoticeResultIOS + /// Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. + /// Available in Google Play Billing Library 4.1.0+. + /// Returns a response code and, when the subscription status changes, the related purchase token. + /// Throws OpenIapError.NotPrepared if billing client not ready. + /// See: https://openiap.dev/docs/apis/android/show-in-app-messages-android + func showInAppMessagesAndroid(_ params: InAppMessageParamsAndroid?) async throws -> InAppMessageResultAndroid /// Present the manage-subscriptions sheet and return changed purchases (iOS 15+). /// See: https://openiap.dev/docs/apis/ios/show-manage-subscriptions-ios func showManageSubscriptionsIOS() async throws -> [PurchaseIOS] @@ -2736,6 +2871,11 @@ public protocol QueryResolver { /// List active purchases for the current user. /// See: https://openiap.dev/docs/apis/get-available-purchases func getAvailablePurchases(_ options: PurchaseOptions?) async throws -> [Purchase] + /// Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. + /// Available in Google Play Billing Library 9.1.0+. + /// Throws OpenIapError.NotPrepared if billing client is not ready. + /// See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android + func getBillingChoiceInfoAndroid(_ params: GetBillingChoiceInfoParamsAndroid) async throws -> BillingChoiceInfoAndroid /// Fetch a token for Apple's External Purchase Server reporting API (iOS 18.1+). /// Use this token to report transactions made through ExternalPurchaseCustomLink. /// Reference: https://developer.apple.com/documentation/storekit/externalpurchasecustomlink/token(for:) @@ -2828,7 +2968,7 @@ public typealias MutationCheckAlternativeBillingAvailabilityAndroidHandler = () public typealias MutationClearTransactionIOSHandler = () async throws -> Bool public typealias MutationConsumePurchaseAndroidHandler = (_ purchaseToken: String) async throws -> Bool public typealias MutationCreateAlternativeBillingTokenAndroidHandler = () async throws -> String? -public typealias MutationCreateBillingProgramReportingDetailsAndroidHandler = (_ program: BillingProgramAndroid) async throws -> BillingProgramReportingDetailsAndroid +public typealias MutationCreateBillingProgramReportingDetailsAndroidHandler = (_ program: BillingProgramAndroid, _ developerBillingType: DeveloperBillingTypeAndroid?) async throws -> BillingProgramReportingDetailsAndroid public typealias MutationDeepLinkToSubscriptionsHandler = (_ options: DeepLinkOptions?) async throws -> Void public typealias MutationEndConnectionHandler = () async throws -> Bool public typealias MutationFinishTransactionHandler = (_ purchase: PurchaseInput, _ isConsumable: Bool?) async throws -> Void @@ -2842,7 +2982,9 @@ public typealias MutationRequestPurchaseHandler = (_ params: RequestPurchaseProp public typealias MutationRequestPurchaseOnPromotedProductIOSHandler = () async throws -> Bool public typealias MutationRestorePurchasesHandler = () async throws -> Void public typealias MutationShowAlternativeBillingDialogAndroidHandler = () async throws -> Bool +public typealias MutationShowBillingProgramInformationDialogAndroidHandler = (_ params: BillingProgramInformationDialogParamsAndroid) async throws -> BillingResultAndroid public typealias MutationShowExternalPurchaseCustomLinkNoticeIOSHandler = (_ noticeType: ExternalPurchaseCustomLinkNoticeTypeIOS) async throws -> ExternalPurchaseCustomLinkNoticeResultIOS +public typealias MutationShowInAppMessagesAndroidHandler = (_ params: InAppMessageParamsAndroid?) async throws -> InAppMessageResultAndroid public typealias MutationShowManageSubscriptionsIOSHandler = () async throws -> [PurchaseIOS] public typealias MutationSyncIOSHandler = () async throws -> Bool public typealias MutationValidateReceiptHandler = (_ options: VerifyPurchaseProps) async throws -> VerifyPurchaseResult @@ -2870,7 +3012,9 @@ public struct MutationHandlers { public var requestPurchaseOnPromotedProductIOS: MutationRequestPurchaseOnPromotedProductIOSHandler? public var restorePurchases: MutationRestorePurchasesHandler? public var showAlternativeBillingDialogAndroid: MutationShowAlternativeBillingDialogAndroidHandler? + public var showBillingProgramInformationDialogAndroid: MutationShowBillingProgramInformationDialogAndroidHandler? public var showExternalPurchaseCustomLinkNoticeIOS: MutationShowExternalPurchaseCustomLinkNoticeIOSHandler? + public var showInAppMessagesAndroid: MutationShowInAppMessagesAndroidHandler? public var showManageSubscriptionsIOS: MutationShowManageSubscriptionsIOSHandler? public var syncIOS: MutationSyncIOSHandler? public var validateReceipt: MutationValidateReceiptHandler? @@ -2898,7 +3042,9 @@ public struct MutationHandlers { requestPurchaseOnPromotedProductIOS: MutationRequestPurchaseOnPromotedProductIOSHandler? = nil, restorePurchases: MutationRestorePurchasesHandler? = nil, showAlternativeBillingDialogAndroid: MutationShowAlternativeBillingDialogAndroidHandler? = nil, + showBillingProgramInformationDialogAndroid: MutationShowBillingProgramInformationDialogAndroidHandler? = nil, showExternalPurchaseCustomLinkNoticeIOS: MutationShowExternalPurchaseCustomLinkNoticeIOSHandler? = nil, + showInAppMessagesAndroid: MutationShowInAppMessagesAndroidHandler? = nil, showManageSubscriptionsIOS: MutationShowManageSubscriptionsIOSHandler? = nil, syncIOS: MutationSyncIOSHandler? = nil, validateReceipt: MutationValidateReceiptHandler? = nil, @@ -2925,7 +3071,9 @@ public struct MutationHandlers { self.requestPurchaseOnPromotedProductIOS = requestPurchaseOnPromotedProductIOS self.restorePurchases = restorePurchases self.showAlternativeBillingDialogAndroid = showAlternativeBillingDialogAndroid + self.showBillingProgramInformationDialogAndroid = showBillingProgramInformationDialogAndroid self.showExternalPurchaseCustomLinkNoticeIOS = showExternalPurchaseCustomLinkNoticeIOS + self.showInAppMessagesAndroid = showInAppMessagesAndroid self.showManageSubscriptionsIOS = showManageSubscriptionsIOS self.syncIOS = syncIOS self.validateReceipt = validateReceipt @@ -2943,6 +3091,7 @@ public typealias QueryGetActiveSubscriptionsHandler = (_ subscriptionIds: [Strin public typealias QueryGetAllTransactionsIOSHandler = () async throws -> [PurchaseIOS] public typealias QueryGetAppTransactionIOSHandler = () async throws -> AppTransaction? public typealias QueryGetAvailablePurchasesHandler = (_ options: PurchaseOptions?) async throws -> [Purchase] +public typealias QueryGetBillingChoiceInfoAndroidHandler = (_ params: GetBillingChoiceInfoParamsAndroid) async throws -> BillingChoiceInfoAndroid public typealias QueryGetExternalPurchaseCustomLinkTokenIOSHandler = (_ tokenType: ExternalPurchaseCustomLinkTokenTypeIOS) async throws -> ExternalPurchaseCustomLinkTokenResultIOS public typealias QueryGetPendingTransactionsIOSHandler = () async throws -> [PurchaseIOS] public typealias QueryGetPromotedProductIOSHandler = () async throws -> ProductIOS? @@ -2966,6 +3115,7 @@ public struct QueryHandlers { public var getAllTransactionsIOS: QueryGetAllTransactionsIOSHandler? public var getAppTransactionIOS: QueryGetAppTransactionIOSHandler? public var getAvailablePurchases: QueryGetAvailablePurchasesHandler? + public var getBillingChoiceInfoAndroid: QueryGetBillingChoiceInfoAndroidHandler? public var getExternalPurchaseCustomLinkTokenIOS: QueryGetExternalPurchaseCustomLinkTokenIOSHandler? public var getPendingTransactionsIOS: QueryGetPendingTransactionsIOSHandler? public var getPromotedProductIOS: QueryGetPromotedProductIOSHandler? @@ -2989,6 +3139,7 @@ public struct QueryHandlers { getAllTransactionsIOS: QueryGetAllTransactionsIOSHandler? = nil, getAppTransactionIOS: QueryGetAppTransactionIOSHandler? = nil, getAvailablePurchases: QueryGetAvailablePurchasesHandler? = nil, + getBillingChoiceInfoAndroid: QueryGetBillingChoiceInfoAndroidHandler? = nil, getExternalPurchaseCustomLinkTokenIOS: QueryGetExternalPurchaseCustomLinkTokenIOSHandler? = nil, getPendingTransactionsIOS: QueryGetPendingTransactionsIOSHandler? = nil, getPromotedProductIOS: QueryGetPromotedProductIOSHandler? = nil, @@ -3011,6 +3162,7 @@ public struct QueryHandlers { self.getAllTransactionsIOS = getAllTransactionsIOS self.getAppTransactionIOS = getAppTransactionIOS self.getAvailablePurchases = getAvailablePurchases + self.getBillingChoiceInfoAndroid = getBillingChoiceInfoAndroid self.getExternalPurchaseCustomLinkTokenIOS = getExternalPurchaseCustomLinkTokenIOS self.getPendingTransactionsIOS = getPendingTransactionsIOS self.getPromotedProductIOS = getPromotedProductIOS diff --git a/packages/gql/src/generated/types.dart b/packages/gql/src/generated/types.dart index 1b9bf3fb5..5d7a2dbc8 100644 --- a/packages/gql/src/generated/types.dart +++ b/packages/gql/src/generated/types.dart @@ -44,8 +44,67 @@ enum AlternativeBillingModeAndroid { String toJson() => value; } -/// Billing program types for external content links, external offers, and external payments (Android) -/// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0 +/// Play Billing choice image layout (Android) +/// Available in Google Play Billing Library 9.1.0+ +enum BillingChoiceImageLayoutAndroid { + /// Rectangular image with a 4:1 aspect ratio. + RectangularFourByOne('rectangular-four-by-one'), + /// Rectangular image with a 3:1 aspect ratio. + RectangularThreeByOne('rectangular-three-by-one'), + /// Rectangular image with a 2:2 aspect ratio. + RectangularTwoByTwo('rectangular-two-by-two'); + + const BillingChoiceImageLayoutAndroid(this.value); + final String value; + + factory BillingChoiceImageLayoutAndroid.fromJson(String value) { + final normalized = value.toLowerCase().replaceAll('_', '-'); + switch (normalized) { + case 'rectangular-four-by-one': + return BillingChoiceImageLayoutAndroid.RectangularFourByOne; + case 'rectangular-three-by-one': + return BillingChoiceImageLayoutAndroid.RectangularThreeByOne; + case 'rectangular-two-by-two': + return BillingChoiceImageLayoutAndroid.RectangularTwoByTwo; + } + throw ArgumentError('Unknown BillingChoiceImageLayoutAndroid value: $value'); + } + + String toJson() => value; +} + +/// Choice screen renderer for Billing Choice availability (Android) +/// Available in Google Play Billing Library 9.1.0+ +enum BillingChoiceScreenTypeAndroid { + /// Unspecified choice screen type. + Unspecified('unspecified'), + /// Choice screen is rendered by the developer app. + DeveloperRendered('developer-rendered'), + /// Choice screen is rendered by Google Play. + GoogleRendered('google-rendered'); + + const BillingChoiceScreenTypeAndroid(this.value); + final String value; + + factory BillingChoiceScreenTypeAndroid.fromJson(String value) { + final normalized = value.toLowerCase().replaceAll('_', '-'); + switch (normalized) { + case 'unspecified': + return BillingChoiceScreenTypeAndroid.Unspecified; + case 'developer-rendered': + return BillingChoiceScreenTypeAndroid.DeveloperRendered; + case 'google-rendered': + return BillingChoiceScreenTypeAndroid.GoogleRendered; + } + throw ArgumentError('Unknown BillingChoiceScreenTypeAndroid value: $value'); + } + + String toJson() => value; +} + +/// Billing program types for Google Play Billing Programs (Android) +/// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, +/// BILLING_CHOICE added in 9.1.0. enum BillingProgramAndroid { /// Unspecified billing program. Do not use. Unspecified('unspecified'), @@ -65,7 +124,11 @@ enum BillingProgramAndroid { /// Allows presenting a side-by-side choice between Google Play Billing and developer's external payment option. /// Users can choose to complete the purchase on the developer's website. /// Available in Google Play Billing Library 8.3.0+ - ExternalPayments('external-payments'); + ExternalPayments('external-payments'), + /// Billing Choice program. + /// Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. + /// Available in Google Play Billing Library 9.1.0+ + BillingChoice('billing-choice'); const BillingProgramAndroid(this.value); final String value; @@ -83,6 +146,8 @@ enum BillingProgramAndroid { return BillingProgramAndroid.ExternalOffer; case 'external-payments': return BillingProgramAndroid.ExternalPayments; + case 'billing-choice': + return BillingProgramAndroid.BillingChoice; } throw ArgumentError('Unknown BillingProgramAndroid value: $value'); } @@ -122,6 +187,35 @@ enum DeveloperBillingLaunchModeAndroid { String toJson() => value; } +/// Developer-provided billing destination type for Billing Program reporting details (Android) +/// Available in Google Play Billing Library 9.1.0+ +enum DeveloperBillingTypeAndroid { + /// Unspecified developer billing type. Do not use. + DeveloperBillingTypeUnspecified('developer-billing-type-unspecified'), + /// Developer-provided billing via native in-app experience. + InApp('in-app'), + /// Developer-provided billing via external link or embedded web browsing. + ExternalLink('external-link'); + + const DeveloperBillingTypeAndroid(this.value); + final String value; + + factory DeveloperBillingTypeAndroid.fromJson(String value) { + final normalized = value.toLowerCase().replaceAll('_', '-'); + switch (normalized) { + case 'developer-billing-type-unspecified': + return DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified; + case 'in-app': + return DeveloperBillingTypeAndroid.InApp; + case 'external-link': + return DeveloperBillingTypeAndroid.ExternalLink; + } + throw ArgumentError('Unknown DeveloperBillingTypeAndroid value: $value'); + } + + String toJson() => value; +} + /// Discount offer type enumeration. /// Categorizes the type of discount or promotional offer. enum DiscountOfferType { @@ -560,6 +654,56 @@ enum IapStore { String toJson() => value; } +/// High-level in-app message category (Android) +/// Available in Google Play Billing Library 4.1.0+ +enum InAppMessageCategoryAndroid { + /// Unknown in-app message category. + UnknownInAppMessageCategoryId('unknown-in-app-message-category-id'), + /// Transactional billing messages, such as payment issues or pending price-change confirmations. + Transactional('transactional'); + + const InAppMessageCategoryAndroid(this.value); + final String value; + + factory InAppMessageCategoryAndroid.fromJson(String value) { + final normalized = value.toLowerCase().replaceAll('_', '-'); + switch (normalized) { + case 'unknown-in-app-message-category-id': + return InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId; + case 'transactional': + return InAppMessageCategoryAndroid.Transactional; + } + throw ArgumentError('Unknown InAppMessageCategoryAndroid value: $value'); + } + + String toJson() => value; +} + +/// Response code from Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +enum InAppMessageResponseCodeAndroid { + /// Flow finished and no developer action is needed. + NoActionNeeded('no-action-needed'), + /// Subscription status changed and the purchase token should be checked. + SubscriptionStatusUpdated('subscription-status-updated'); + + const InAppMessageResponseCodeAndroid(this.value); + final String value; + + factory InAppMessageResponseCodeAndroid.fromJson(String value) { + final normalized = value.toLowerCase().replaceAll('_', '-'); + switch (normalized) { + case 'no-action-needed': + return InAppMessageResponseCodeAndroid.NoActionNeeded; + case 'subscription-status-updated': + return InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated; + } + throw ArgumentError('Unknown InAppMessageResponseCodeAndroid value: $value'); + } + + String toJson() => value; +} + /// Payment mode for subscription offers. /// Determines how the user pays during the offer period. enum PaymentMode { @@ -1527,23 +1671,61 @@ class AppTransaction { } } +/// Display information for developer-rendered Billing Choice screens (Android) +/// Available in Google Play Billing Library 9.1.0+ +class BillingChoiceInfoAndroid { + const BillingChoiceInfoAndroid({ + required this.playBillingChoiceImageUrl, + this.playBillingLoyaltyInfo, + }); + + /// URL for the Play Billing choice image matching the requested layout. + final String playBillingChoiceImageUrl; + /// Play Loyalty information for the user. + final String? playBillingLoyaltyInfo; + + factory BillingChoiceInfoAndroid.fromJson(Map json) { + return BillingChoiceInfoAndroid( + playBillingChoiceImageUrl: json['playBillingChoiceImageUrl'] as String, + playBillingLoyaltyInfo: json['playBillingLoyaltyInfo'] as String?, + ); + } + + Map toJson() { + return { + '__typename': 'BillingChoiceInfoAndroid', + 'playBillingChoiceImageUrl': playBillingChoiceImageUrl, + 'playBillingLoyaltyInfo': playBillingLoyaltyInfo, + }; + } +} + /// Result of checking billing program availability (Android) /// Available in Google Play Billing Library 8.2.0+ class BillingProgramAvailabilityResultAndroid { const BillingProgramAvailabilityResultAndroid({ required this.billingProgram, + this.choiceScreenType, required this.isAvailable, + this.isExternalLinkAvailable, }); /// The billing program that was checked final BillingProgramAndroid billingProgram; + /// Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + final BillingChoiceScreenTypeAndroid? choiceScreenType; /// Whether the billing program is available for the user final bool isAvailable; + /// Whether external-link payment is available for Billing Choice. + /// Populated only for available BILLING_CHOICE results. + final bool? isExternalLinkAvailable; factory BillingProgramAvailabilityResultAndroid.fromJson(Map json) { return BillingProgramAvailabilityResultAndroid( billingProgram: BillingProgramAndroid.fromJson(json['billingProgram'] as String), + choiceScreenType: json['choiceScreenType'] != null ? BillingChoiceScreenTypeAndroid.fromJson(json['choiceScreenType'] as String) : null, isAvailable: json['isAvailable'] as bool, + isExternalLinkAvailable: json['isExternalLinkAvailable'] as bool?, ); } @@ -1551,7 +1733,9 @@ class BillingProgramAvailabilityResultAndroid { return { '__typename': 'BillingProgramAvailabilityResultAndroid', 'billingProgram': billingProgram.toJson(), + 'choiceScreenType': choiceScreenType?.toJson(), 'isAvailable': isAvailable, + 'isExternalLinkAvailable': isExternalLinkAvailable, }; } } @@ -2141,6 +2325,35 @@ class FetchProductsResultSubscriptions extends FetchProductsResult { final List? value; } +/// Result from showing Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +class InAppMessageResultAndroid { + const InAppMessageResultAndroid({ + this.purchaseToken, + required this.responseCode, + }); + + /// Purchase token returned when a subscription status changed. + final String? purchaseToken; + /// Response code for the in-app messaging flow. + final InAppMessageResponseCodeAndroid responseCode; + + factory InAppMessageResultAndroid.fromJson(Map json) { + return InAppMessageResultAndroid( + purchaseToken: json['purchaseToken'] as String?, + responseCode: InAppMessageResponseCodeAndroid.fromJson(json['responseCode'] as String), + ); + } + + Map toJson() { + return { + '__typename': 'InAppMessageResultAndroid', + 'purchaseToken': purchaseToken, + 'responseCode': responseCode.toJson(), + }; + } +} + /// Installment plan details for subscription offers (Android) /// Contains information about the installment plan commitment. /// Available in Google Play Billing Library 7.0+ @@ -4292,6 +4505,34 @@ class AndroidSubscriptionOfferInput { } } +/// Parameters for showing a billing program information dialog (Android) +/// Available in Google Play Billing Library 9.1.0+ +class BillingProgramInformationDialogParamsAndroid { + const BillingProgramInformationDialogParamsAndroid({ + required this.billingProgram, + required this.externalTransactionToken, + }); + + /// Billing program. Currently only BILLING_CHOICE is supported. + final BillingProgramAndroid billingProgram; + /// External transaction token returned by the Billing Choice reporting-details flow. + final String externalTransactionToken; + + factory BillingProgramInformationDialogParamsAndroid.fromJson(Map json) { + return BillingProgramInformationDialogParamsAndroid( + billingProgram: BillingProgramAndroid.fromJson(json['billingProgram'] as String), + externalTransactionToken: json['externalTransactionToken'] as String, + ); + } + + Map toJson() { + return { + 'billingProgram': billingProgram.toJson(), + 'externalTransactionToken': externalTransactionToken, + }; + } +} + class DeepLinkOptions { const DeepLinkOptions({ this.packageNameAndroid, @@ -4393,6 +4634,62 @@ class DiscountOfferInputIOS { } } +/// Parameters for fetching Billing Choice display information (Android) +/// Available in Google Play Billing Library 9.1.0+ +class GetBillingChoiceInfoParamsAndroid { + const GetBillingChoiceInfoParamsAndroid({ + required this.billingProgram, + required this.playBillingChoiceImageLayout, + this.userLocale, + }); + + /// Billing program. Currently only BILLING_CHOICE is supported. + final BillingProgramAndroid billingProgram; + /// Desired Play Billing choice image layout. + final BillingChoiceImageLayoutAndroid playBillingChoiceImageLayout; + /// BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. + final String? userLocale; + + factory GetBillingChoiceInfoParamsAndroid.fromJson(Map json) { + return GetBillingChoiceInfoParamsAndroid( + billingProgram: BillingProgramAndroid.fromJson(json['billingProgram'] as String), + playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid.fromJson(json['playBillingChoiceImageLayout'] as String), + userLocale: json['userLocale'] as String?, + ); + } + + Map toJson() { + return { + 'billingProgram': billingProgram.toJson(), + 'playBillingChoiceImageLayout': playBillingChoiceImageLayout.toJson(), + 'userLocale': userLocale, + }; + } +} + +/// Parameters for showing Play billing in-app messages (Android) +/// Available in Google Play Billing Library 4.1.0+ +class InAppMessageParamsAndroid { + const InAppMessageParamsAndroid({ + this.categories, + }); + + /// In-app message categories to show. Defaults to transactional messages. + final List? categories; + + factory InAppMessageParamsAndroid.fromJson(Map json) { + return InAppMessageParamsAndroid( + categories: (json['categories'] as List?) == null ? null : (json['categories'] as List?)!.map((e) => InAppMessageCategoryAndroid.fromJson(e as String)).toList(), + ); + } + + Map toJson() { + return { + 'categories': categories == null ? null : categories!.map((e) => e.toJson()).toList(), + }; + } +} + /// Connection initialization configuration class InitConnectionConfig { const InitConnectionConfig({ @@ -5496,7 +5793,6 @@ abstract class MutationResolver { /// See: https://openiap.dev/docs/apis/ios/begin-refund-request-ios Future beginRefundRequestIOS(String sku); /// Check whether alternative billing is available for the user. Step 1 of the alternative billing flow. - /// /// Returns true if available, false otherwise. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/check-alternative-billing-availability-android @@ -5510,18 +5806,19 @@ abstract class MutationResolver { /// Create a reporting token for an alternative billing flow. Step 3 of the alternative billing flow. /// Must be called AFTER successful payment in your payment system. /// Token must be reported to Google Play backend within 24 hours. - /// /// Returns token string, or null if creation failed. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-alternative-billing-token-android Future createAlternativeBillingTokenAndroid(); /// Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). /// Replaces the deprecated createExternalOfferReportingDetailsAsync API. - /// /// Returns external transaction token needed for reporting external transactions. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android - Future createBillingProgramReportingDetailsAndroid(BillingProgramAndroid program); + Future createBillingProgramReportingDetailsAndroid({ + required BillingProgramAndroid program, + DeveloperBillingTypeAndroid? developerBillingType, + }); /// Open the platform's subscription management UI. /// See: https://openiap.dev/docs/apis/deep-link-to-subscriptions Future deepLinkToSubscriptions({ @@ -5545,7 +5842,6 @@ abstract class MutationResolver { }); /// Check whether a billing program (e.g., External Payments) is available for the current user. /// Replaces the deprecated isExternalOfferAvailableAsync API. - /// /// Available in Google Play Billing Library 8.2.0+. /// Returns availability result with isAvailable flag. /// Throws OpenIapError.NotPrepared if billing client not ready. @@ -5553,7 +5849,6 @@ abstract class MutationResolver { Future isBillingProgramAvailableAndroid(BillingProgramAndroid program); /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). /// Replaces the deprecated showExternalOfferInformationDialog API. - /// /// Shows Play Store dialog and optionally launches external URL. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/launch-external-link-android @@ -5589,16 +5884,31 @@ abstract class MutationResolver { Future restorePurchases(); /// Display Google's alternative billing information dialog. Step 2 of the alternative billing flow. /// Must be called BEFORE processing payment in your payment system. - /// /// Returns true if user accepted, false if user canceled. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android Future showAlternativeBillingDialogAndroid(); + /// Show Google's information dialog for a Billing Choice external transaction. + /// Available in Google Play Billing Library 9.1.0+. + /// Throws OpenIapError.NotPrepared if billing client not ready. + /// See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android + Future showBillingProgramInformationDialogAndroid({ + required BillingProgramAndroid billingProgram, + required String externalTransactionToken, + }); /// Present the disclosure sheet required before linking out via ExternalPurchaseCustomLink (iOS 18.1+). /// Call this after a deliberate customer interaction before linking out to external purchases. /// Reference: https://developer.apple.com/documentation/storekit/externalpurchasecustomlink/shownotice(type:) /// See: https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios Future showExternalPurchaseCustomLinkNoticeIOS(ExternalPurchaseCustomLinkNoticeTypeIOS noticeType); + /// Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. + /// Available in Google Play Billing Library 4.1.0+. + /// Returns a response code and, when the subscription status changes, the related purchase token. + /// Throws OpenIapError.NotPrepared if billing client not ready. + /// See: https://openiap.dev/docs/apis/android/show-in-app-messages-android + Future showInAppMessagesAndroid({ + List? categories, + }); /// Present the manage-subscriptions sheet and return changed purchases (iOS 15+). /// See: https://openiap.dev/docs/apis/ios/show-manage-subscriptions-ios Future> showManageSubscriptionsIOS(); @@ -5667,6 +5977,15 @@ abstract class QueryResolver { bool? includeSuspendedAndroid, bool? onlyIncludeActiveItemsIOS, }); + /// Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. + /// Available in Google Play Billing Library 9.1.0+. + /// Throws OpenIapError.NotPrepared if billing client is not ready. + /// See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android + Future getBillingChoiceInfoAndroid({ + required BillingProgramAndroid billingProgram, + required BillingChoiceImageLayoutAndroid playBillingChoiceImageLayout, + String? userLocale, + }); /// Fetch a token for Apple's External Purchase Server reporting API (iOS 18.1+). /// Use this token to report transactions made through ExternalPurchaseCustomLink. /// Reference: https://developer.apple.com/documentation/storekit/externalpurchasecustomlink/token(for:) @@ -5765,7 +6084,10 @@ typedef MutationCheckAlternativeBillingAvailabilityAndroidHandler = Future typedef MutationClearTransactionIOSHandler = Future Function(); typedef MutationConsumePurchaseAndroidHandler = Future Function(String purchaseToken); typedef MutationCreateAlternativeBillingTokenAndroidHandler = Future Function(); -typedef MutationCreateBillingProgramReportingDetailsAndroidHandler = Future Function(BillingProgramAndroid program); +typedef MutationCreateBillingProgramReportingDetailsAndroidHandler = Future Function({ + required BillingProgramAndroid program, + DeveloperBillingTypeAndroid? developerBillingType, +}); typedef MutationDeepLinkToSubscriptionsHandler = Future Function({ String? packageNameAndroid, String? skuAndroid, @@ -5793,7 +6115,14 @@ typedef MutationRequestPurchaseHandler = Future Function typedef MutationRequestPurchaseOnPromotedProductIOSHandler = Future Function(); typedef MutationRestorePurchasesHandler = Future Function(); typedef MutationShowAlternativeBillingDialogAndroidHandler = Future Function(); +typedef MutationShowBillingProgramInformationDialogAndroidHandler = Future Function({ + required BillingProgramAndroid billingProgram, + required String externalTransactionToken, +}); typedef MutationShowExternalPurchaseCustomLinkNoticeIOSHandler = Future Function(ExternalPurchaseCustomLinkNoticeTypeIOS noticeType); +typedef MutationShowInAppMessagesAndroidHandler = Future Function({ + List? categories, +}); typedef MutationShowManageSubscriptionsIOSHandler = Future> Function(); typedef MutationSyncIOSHandler = Future Function(); typedef MutationValidateReceiptHandler = Future Function({ @@ -5833,7 +6162,9 @@ class MutationHandlers { this.requestPurchaseOnPromotedProductIOS, this.restorePurchases, this.showAlternativeBillingDialogAndroid, + this.showBillingProgramInformationDialogAndroid, this.showExternalPurchaseCustomLinkNoticeIOS, + this.showInAppMessagesAndroid, this.showManageSubscriptionsIOS, this.syncIOS, this.validateReceipt, @@ -5861,7 +6192,9 @@ class MutationHandlers { final MutationRequestPurchaseOnPromotedProductIOSHandler? requestPurchaseOnPromotedProductIOS; final MutationRestorePurchasesHandler? restorePurchases; final MutationShowAlternativeBillingDialogAndroidHandler? showAlternativeBillingDialogAndroid; + final MutationShowBillingProgramInformationDialogAndroidHandler? showBillingProgramInformationDialogAndroid; final MutationShowExternalPurchaseCustomLinkNoticeIOSHandler? showExternalPurchaseCustomLinkNoticeIOS; + final MutationShowInAppMessagesAndroidHandler? showInAppMessagesAndroid; final MutationShowManageSubscriptionsIOSHandler? showManageSubscriptionsIOS; final MutationSyncIOSHandler? syncIOS; final MutationValidateReceiptHandler? validateReceipt; @@ -5885,6 +6218,11 @@ typedef QueryGetAvailablePurchasesHandler = Future> Function({ bool? includeSuspendedAndroid, bool? onlyIncludeActiveItemsIOS, }); +typedef QueryGetBillingChoiceInfoAndroidHandler = Future Function({ + required BillingProgramAndroid billingProgram, + required BillingChoiceImageLayoutAndroid playBillingChoiceImageLayout, + String? userLocale, +}); typedef QueryGetExternalPurchaseCustomLinkTokenIOSHandler = Future Function(ExternalPurchaseCustomLinkTokenTypeIOS tokenType); typedef QueryGetPendingTransactionsIOSHandler = Future> Function(); typedef QueryGetPromotedProductIOSHandler = Future Function(); @@ -5913,6 +6251,7 @@ class QueryHandlers { this.getAllTransactionsIOS, this.getAppTransactionIOS, this.getAvailablePurchases, + this.getBillingChoiceInfoAndroid, this.getExternalPurchaseCustomLinkTokenIOS, this.getPendingTransactionsIOS, this.getPromotedProductIOS, @@ -5936,6 +6275,7 @@ class QueryHandlers { final QueryGetAllTransactionsIOSHandler? getAllTransactionsIOS; final QueryGetAppTransactionIOSHandler? getAppTransactionIOS; final QueryGetAvailablePurchasesHandler? getAvailablePurchases; + final QueryGetBillingChoiceInfoAndroidHandler? getBillingChoiceInfoAndroid; final QueryGetExternalPurchaseCustomLinkTokenIOSHandler? getExternalPurchaseCustomLinkTokenIOS; final QueryGetPendingTransactionsIOSHandler? getPendingTransactionsIOS; final QueryGetPromotedProductIOSHandler? getPromotedProductIOS; diff --git a/packages/gql/src/generated/types.gd b/packages/gql/src/generated/types.gd index f36b8f261..3910cb9d8 100644 --- a/packages/gql/src/generated/types.gd +++ b/packages/gql/src/generated/types.gd @@ -21,7 +21,27 @@ enum AlternativeBillingModeAndroid { ALTERNATIVE_ONLY = 2, } -## Billing program types for external content links, external offers, and external payments (Android) Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0 +## Play Billing choice image layout (Android) Available in Google Play Billing Library 9.1.0+ +enum BillingChoiceImageLayoutAndroid { + ## Rectangular image with a 4:1 aspect ratio. + RECTANGULAR_FOUR_BY_ONE = 0, + ## Rectangular image with a 3:1 aspect ratio. + RECTANGULAR_THREE_BY_ONE = 1, + ## Rectangular image with a 2:2 aspect ratio. + RECTANGULAR_TWO_BY_TWO = 2, +} + +## Choice screen renderer for Billing Choice availability (Android) Available in Google Play Billing Library 9.1.0+ +enum BillingChoiceScreenTypeAndroid { + ## Unspecified choice screen type. + UNSPECIFIED = 0, + ## Choice screen is rendered by the developer app. + DEVELOPER_RENDERED = 1, + ## Choice screen is rendered by Google Play. + GOOGLE_RENDERED = 2, +} + +## Billing program types for Google Play Billing Programs (Android) Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, BILLING_CHOICE added in 9.1.0. enum BillingProgramAndroid { ## Unspecified billing program. Do not use. UNSPECIFIED = 0, @@ -33,6 +53,8 @@ enum BillingProgramAndroid { EXTERNAL_OFFER = 3, ## External Payments program (Japan only). Allows presenting a side-by-side choice between Google Play Billing and developer's external payment option. Users can choose to complete the purchase on the developer's website. Available in Google Play Billing Library 8.3.0+ EXTERNAL_PAYMENTS = 4, + ## Billing Choice program. Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. Available in Google Play Billing Library 9.1.0+ + BILLING_CHOICE = 5, } ## Launch mode for developer billing option (Android) Determines how the external payment URL is launched Available in Google Play Billing Library 8.3.0+ @@ -45,6 +67,16 @@ enum DeveloperBillingLaunchModeAndroid { CALLER_WILL_LAUNCH_LINK = 2, } +## Developer-provided billing destination type for Billing Program reporting details (Android) Available in Google Play Billing Library 9.1.0+ +enum DeveloperBillingTypeAndroid { + ## Unspecified developer billing type. Do not use. + DEVELOPER_BILLING_TYPE_UNSPECIFIED = 0, + ## Developer-provided billing via native in-app experience. + IN_APP = 1, + ## Developer-provided billing via external link or embedded web browsing. + EXTERNAL_LINK = 2, +} + ## Discount offer type enumeration. Categorizes the type of discount or promotional offer. enum DiscountOfferType { ## Introductory offer for new subscribers (first-time purchase discount) @@ -185,6 +217,22 @@ enum IapStore { AMAZON = 4, } +## High-level in-app message category (Android) Available in Google Play Billing Library 4.1.0+ +enum InAppMessageCategoryAndroid { + ## Unknown in-app message category. + UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID = 0, + ## Transactional billing messages, such as payment issues or pending price-change confirmations. + TRANSACTIONAL = 1, +} + +## Response code from Play billing in-app messages (Android) Available in Google Play Billing Library 4.1.0+ +enum InAppMessageResponseCodeAndroid { + ## Flow finished and no developer action is needed. + NO_ACTION_NEEDED = 0, + ## Subscription status changed and the purchase token should be checked. + SUBSCRIPTION_STATUS_UPDATED = 1, +} + ## Payment mode for subscription offers. Determines how the user pays during the offer period. enum PaymentMode { ## Free trial period - no charge during offer @@ -684,12 +732,38 @@ class AppTransaction: dict["originalPlatform"] = original_platform return dict +## Display information for developer-rendered Billing Choice screens (Android) Available in Google Play Billing Library 9.1.0+ +class BillingChoiceInfoAndroid: + ## URL for the Play Billing choice image matching the requested layout. + var play_billing_choice_image_url: String = "" + ## Play Loyalty information for the user. + var play_billing_loyalty_info: Variant = null + + static func from_dict(data: Dictionary) -> BillingChoiceInfoAndroid: + var obj = BillingChoiceInfoAndroid.new() + if data.has("playBillingChoiceImageUrl") and data["playBillingChoiceImageUrl"] != null: + obj.play_billing_choice_image_url = data["playBillingChoiceImageUrl"] + if data.has("playBillingLoyaltyInfo") and data["playBillingLoyaltyInfo"] != null: + obj.play_billing_loyalty_info = data["playBillingLoyaltyInfo"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + dict["playBillingChoiceImageUrl"] = play_billing_choice_image_url + if play_billing_loyalty_info != null: + dict["playBillingLoyaltyInfo"] = play_billing_loyalty_info + return dict + ## Result of checking billing program availability (Android) Available in Google Play Billing Library 8.2.0+ class BillingProgramAvailabilityResultAndroid: ## Whether the billing program is available for the user var is_available: bool = false ## The billing program that was checked var billing_program: BillingProgramAndroid + ## Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + var choice_screen_type: BillingChoiceScreenTypeAndroid + ## Whether external-link payment is available for Billing Choice. + var is_external_link_available: Variant = null static func from_dict(data: Dictionary) -> BillingProgramAvailabilityResultAndroid: var obj = BillingProgramAvailabilityResultAndroid.new() @@ -701,6 +775,14 @@ class BillingProgramAvailabilityResultAndroid: obj.billing_program = BILLING_PROGRAM_ANDROID_FROM_STRING[enum_str] else: obj.billing_program = enum_str + if data.has("choiceScreenType") and data["choiceScreenType"] != null: + var enum_str = data["choiceScreenType"] + if enum_str is String and BILLING_CHOICE_SCREEN_TYPE_ANDROID_FROM_STRING.has(enum_str): + obj.choice_screen_type = BILLING_CHOICE_SCREEN_TYPE_ANDROID_FROM_STRING[enum_str] + else: + obj.choice_screen_type = enum_str + if data.has("isExternalLinkAvailable") and data["isExternalLinkAvailable"] != null: + obj.is_external_link_available = data["isExternalLinkAvailable"] return obj func to_dict() -> Dictionary: @@ -710,6 +792,12 @@ class BillingProgramAvailabilityResultAndroid: dict["billingProgram"] = BILLING_PROGRAM_ANDROID_VALUES[billing_program] else: dict["billingProgram"] = billing_program + if BILLING_CHOICE_SCREEN_TYPE_ANDROID_VALUES.has(choice_screen_type): + dict["choiceScreenType"] = BILLING_CHOICE_SCREEN_TYPE_ANDROID_VALUES[choice_screen_type] + else: + dict["choiceScreenType"] = choice_screen_type + if is_external_link_available != null: + dict["isExternalLinkAvailable"] = is_external_link_available return dict ## Reporting details for transactions made outside of Google Play Billing (Android) Contains the external transaction token needed for reporting Available in Google Play Billing Library 8.2.0+ @@ -1216,6 +1304,35 @@ class ExternalPurchaseNoticeResultIOS: dict["externalPurchaseToken"] = external_purchase_token return dict +## Result from showing Play billing in-app messages (Android) Available in Google Play Billing Library 4.1.0+ +class InAppMessageResultAndroid: + ## Response code for the in-app messaging flow. + var response_code: InAppMessageResponseCodeAndroid + ## Purchase token returned when a subscription status changed. + var purchase_token: Variant = null + + static func from_dict(data: Dictionary) -> InAppMessageResultAndroid: + var obj = InAppMessageResultAndroid.new() + if data.has("responseCode") and data["responseCode"] != null: + var enum_str = data["responseCode"] + if enum_str is String and IN_APP_MESSAGE_RESPONSE_CODE_ANDROID_FROM_STRING.has(enum_str): + obj.response_code = IN_APP_MESSAGE_RESPONSE_CODE_ANDROID_FROM_STRING[enum_str] + else: + obj.response_code = enum_str + if data.has("purchaseToken") and data["purchaseToken"] != null: + obj.purchase_token = data["purchaseToken"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + if IN_APP_MESSAGE_RESPONSE_CODE_ANDROID_VALUES.has(response_code): + dict["responseCode"] = IN_APP_MESSAGE_RESPONSE_CODE_ANDROID_VALUES[response_code] + else: + dict["responseCode"] = response_code + if purchase_token != null: + dict["purchaseToken"] = purchase_token + return dict + ## Installment plan details for subscription offers (Android) Contains information about the installment plan commitment. Available in Google Play Billing Library 7.0+ class InstallmentPlanDetailsAndroid: ## Committed payments count after a user signs up for this subscription plan. @@ -3836,6 +3953,36 @@ class AndroidSubscriptionOfferInput: dict["offerToken"] = offer_token return dict +## Parameters for showing a billing program information dialog (Android) Available in Google Play Billing Library 9.1.0+ +class BillingProgramInformationDialogParamsAndroid: + ## Billing program. Currently only BILLING_CHOICE is supported. + var billing_program: BillingProgramAndroid + ## External transaction token returned by the Billing Choice reporting-details flow. + var external_transaction_token: String = "" + + static func from_dict(data: Dictionary) -> BillingProgramInformationDialogParamsAndroid: + var obj = BillingProgramInformationDialogParamsAndroid.new() + if data.has("billingProgram") and data["billingProgram"] != null: + var enum_str = data["billingProgram"] + if enum_str is String and BILLING_PROGRAM_ANDROID_FROM_STRING.has(enum_str): + obj.billing_program = BILLING_PROGRAM_ANDROID_FROM_STRING[enum_str] + else: + obj.billing_program = enum_str + if data.has("externalTransactionToken") and data["externalTransactionToken"] != null: + obj.external_transaction_token = data["externalTransactionToken"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + if billing_program != null: + if BILLING_PROGRAM_ANDROID_VALUES.has(billing_program): + dict["billingProgram"] = BILLING_PROGRAM_ANDROID_VALUES[billing_program] + else: + dict["billingProgram"] = billing_program + if external_transaction_token != null: + dict["externalTransactionToken"] = external_transaction_token + return dict + class DeepLinkOptions: ## Android SKU to open (required on Android) var sku_android: Variant = null @@ -3941,6 +4088,66 @@ class DiscountOfferInputIOS: dict["timestamp"] = timestamp return dict +## Parameters for fetching Billing Choice display information (Android) Available in Google Play Billing Library 9.1.0+ +class GetBillingChoiceInfoParamsAndroid: + ## Billing program. Currently only BILLING_CHOICE is supported. + var billing_program: BillingProgramAndroid + ## Desired Play Billing choice image layout. + var play_billing_choice_image_layout: BillingChoiceImageLayoutAndroid + ## BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. + var user_locale: Variant = null + + static func from_dict(data: Dictionary) -> GetBillingChoiceInfoParamsAndroid: + var obj = GetBillingChoiceInfoParamsAndroid.new() + if data.has("billingProgram") and data["billingProgram"] != null: + var enum_str = data["billingProgram"] + if enum_str is String and BILLING_PROGRAM_ANDROID_FROM_STRING.has(enum_str): + obj.billing_program = BILLING_PROGRAM_ANDROID_FROM_STRING[enum_str] + else: + obj.billing_program = enum_str + if data.has("playBillingChoiceImageLayout") and data["playBillingChoiceImageLayout"] != null: + var enum_str = data["playBillingChoiceImageLayout"] + if enum_str is String and BILLING_CHOICE_IMAGE_LAYOUT_ANDROID_FROM_STRING.has(enum_str): + obj.play_billing_choice_image_layout = BILLING_CHOICE_IMAGE_LAYOUT_ANDROID_FROM_STRING[enum_str] + else: + obj.play_billing_choice_image_layout = enum_str + if data.has("userLocale") and data["userLocale"] != null: + obj.user_locale = data["userLocale"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + if billing_program != null: + if BILLING_PROGRAM_ANDROID_VALUES.has(billing_program): + dict["billingProgram"] = BILLING_PROGRAM_ANDROID_VALUES[billing_program] + else: + dict["billingProgram"] = billing_program + if play_billing_choice_image_layout != null: + if BILLING_CHOICE_IMAGE_LAYOUT_ANDROID_VALUES.has(play_billing_choice_image_layout): + dict["playBillingChoiceImageLayout"] = BILLING_CHOICE_IMAGE_LAYOUT_ANDROID_VALUES[play_billing_choice_image_layout] + else: + dict["playBillingChoiceImageLayout"] = play_billing_choice_image_layout + if user_locale != null: + dict["userLocale"] = user_locale + return dict + +## Parameters for showing Play billing in-app messages (Android) Available in Google Play Billing Library 4.1.0+ +class InAppMessageParamsAndroid: + ## In-app message categories to show. Defaults to transactional messages. + var categories: Array[InAppMessageCategoryAndroid] = [] + + static func from_dict(data: Dictionary) -> InAppMessageParamsAndroid: + var obj = InAppMessageParamsAndroid.new() + if data.has("categories") and data["categories"] != null: + obj.categories = data["categories"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + if categories != null: + dict["categories"] = categories + return dict + ## Connection initialization configuration class InitConnectionConfig: ## Alternative billing mode for Android @@ -5023,12 +5230,25 @@ const ALTERNATIVE_BILLING_MODE_ANDROID_VALUES = { AlternativeBillingModeAndroid.ALTERNATIVE_ONLY: "alternative-only" } +const BILLING_CHOICE_IMAGE_LAYOUT_ANDROID_VALUES = { + BillingChoiceImageLayoutAndroid.RECTANGULAR_FOUR_BY_ONE: "rectangular-four-by-one", + BillingChoiceImageLayoutAndroid.RECTANGULAR_THREE_BY_ONE: "rectangular-three-by-one", + BillingChoiceImageLayoutAndroid.RECTANGULAR_TWO_BY_TWO: "rectangular-two-by-two" +} + +const BILLING_CHOICE_SCREEN_TYPE_ANDROID_VALUES = { + BillingChoiceScreenTypeAndroid.UNSPECIFIED: "unspecified", + BillingChoiceScreenTypeAndroid.DEVELOPER_RENDERED: "developer-rendered", + BillingChoiceScreenTypeAndroid.GOOGLE_RENDERED: "google-rendered" +} + const BILLING_PROGRAM_ANDROID_VALUES = { BillingProgramAndroid.UNSPECIFIED: "unspecified", BillingProgramAndroid.USER_CHOICE_BILLING: "user-choice-billing", BillingProgramAndroid.EXTERNAL_CONTENT_LINK: "external-content-link", BillingProgramAndroid.EXTERNAL_OFFER: "external-offer", - BillingProgramAndroid.EXTERNAL_PAYMENTS: "external-payments" + BillingProgramAndroid.EXTERNAL_PAYMENTS: "external-payments", + BillingProgramAndroid.BILLING_CHOICE: "billing-choice" } const DEVELOPER_BILLING_LAUNCH_MODE_ANDROID_VALUES = { @@ -5037,6 +5257,12 @@ const DEVELOPER_BILLING_LAUNCH_MODE_ANDROID_VALUES = { DeveloperBillingLaunchModeAndroid.CALLER_WILL_LAUNCH_LINK: "caller-will-launch-link" } +const DEVELOPER_BILLING_TYPE_ANDROID_VALUES = { + DeveloperBillingTypeAndroid.DEVELOPER_BILLING_TYPE_UNSPECIFIED: "developer-billing-type-unspecified", + DeveloperBillingTypeAndroid.IN_APP: "in-app", + DeveloperBillingTypeAndroid.EXTERNAL_LINK: "external-link" +} + const DISCOUNT_OFFER_TYPE_VALUES = { DiscountOfferType.INTRODUCTORY: "introductory", DiscountOfferType.PROMOTIONAL: "promotional", @@ -5145,6 +5371,16 @@ const IAP_STORE_VALUES = { IapStore.AMAZON: "amazon" } +const IN_APP_MESSAGE_CATEGORY_ANDROID_VALUES = { + InAppMessageCategoryAndroid.UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID: "unknown-in-app-message-category-id", + InAppMessageCategoryAndroid.TRANSACTIONAL: "transactional" +} + +const IN_APP_MESSAGE_RESPONSE_CODE_ANDROID_VALUES = { + InAppMessageResponseCodeAndroid.NO_ACTION_NEEDED: "no-action-needed", + InAppMessageResponseCodeAndroid.SUBSCRIPTION_STATUS_UPDATED: "subscription-status-updated" +} + const PAYMENT_MODE_VALUES = { PaymentMode.FREE_TRIAL: "free-trial", PaymentMode.PAY_AS_YOU_GO: "pay-as-you-go", @@ -5299,12 +5535,25 @@ const ALTERNATIVE_BILLING_MODE_ANDROID_FROM_STRING = { "alternative-only": AlternativeBillingModeAndroid.ALTERNATIVE_ONLY } +const BILLING_CHOICE_IMAGE_LAYOUT_ANDROID_FROM_STRING = { + "rectangular-four-by-one": BillingChoiceImageLayoutAndroid.RECTANGULAR_FOUR_BY_ONE, + "rectangular-three-by-one": BillingChoiceImageLayoutAndroid.RECTANGULAR_THREE_BY_ONE, + "rectangular-two-by-two": BillingChoiceImageLayoutAndroid.RECTANGULAR_TWO_BY_TWO +} + +const BILLING_CHOICE_SCREEN_TYPE_ANDROID_FROM_STRING = { + "unspecified": BillingChoiceScreenTypeAndroid.UNSPECIFIED, + "developer-rendered": BillingChoiceScreenTypeAndroid.DEVELOPER_RENDERED, + "google-rendered": BillingChoiceScreenTypeAndroid.GOOGLE_RENDERED +} + const BILLING_PROGRAM_ANDROID_FROM_STRING = { "unspecified": BillingProgramAndroid.UNSPECIFIED, "user-choice-billing": BillingProgramAndroid.USER_CHOICE_BILLING, "external-content-link": BillingProgramAndroid.EXTERNAL_CONTENT_LINK, "external-offer": BillingProgramAndroid.EXTERNAL_OFFER, - "external-payments": BillingProgramAndroid.EXTERNAL_PAYMENTS + "external-payments": BillingProgramAndroid.EXTERNAL_PAYMENTS, + "billing-choice": BillingProgramAndroid.BILLING_CHOICE } const DEVELOPER_BILLING_LAUNCH_MODE_ANDROID_FROM_STRING = { @@ -5313,6 +5562,12 @@ const DEVELOPER_BILLING_LAUNCH_MODE_ANDROID_FROM_STRING = { "caller-will-launch-link": DeveloperBillingLaunchModeAndroid.CALLER_WILL_LAUNCH_LINK } +const DEVELOPER_BILLING_TYPE_ANDROID_FROM_STRING = { + "developer-billing-type-unspecified": DeveloperBillingTypeAndroid.DEVELOPER_BILLING_TYPE_UNSPECIFIED, + "in-app": DeveloperBillingTypeAndroid.IN_APP, + "external-link": DeveloperBillingTypeAndroid.EXTERNAL_LINK +} + const DISCOUNT_OFFER_TYPE_FROM_STRING = { "introductory": DiscountOfferType.INTRODUCTORY, "promotional": DiscountOfferType.PROMOTIONAL, @@ -5421,6 +5676,16 @@ const IAP_STORE_FROM_STRING = { "amazon": IapStore.AMAZON } +const IN_APP_MESSAGE_CATEGORY_ANDROID_FROM_STRING = { + "unknown-in-app-message-category-id": InAppMessageCategoryAndroid.UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID, + "transactional": InAppMessageCategoryAndroid.TRANSACTIONAL +} + +const IN_APP_MESSAGE_RESPONSE_CODE_ANDROID_FROM_STRING = { + "no-action-needed": InAppMessageResponseCodeAndroid.NO_ACTION_NEEDED, + "subscription-status-updated": InAppMessageResponseCodeAndroid.SUBSCRIPTION_STATUS_UPDATED +} + const PAYMENT_MODE_FROM_STRING = { "free-trial": PaymentMode.FREE_TRIAL, "pay-as-you-go": PaymentMode.PAY_AS_YOU_GO, @@ -5917,6 +6182,26 @@ class Query: const return_type = "VerifyPurchaseResultIOS" const is_array = false + ## Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. + class getBillingChoiceInfoAndroidField: + const name = "getBillingChoiceInfoAndroid" + const snake_name = "get_billing_choice_info_android" + class Args: + var params: GetBillingChoiceInfoParamsAndroid + + static func from_dict(data: Dictionary) -> Args: + var obj = Args.new() + if data.has("params") and data["params"] != null: + obj.params = data["params"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + dict["params"] = params + return dict + const return_type = "BillingChoiceInfoAndroid" + const is_array = false + # ============================================================================ # Mutation Types @@ -6315,6 +6600,7 @@ class Mutation: const snake_name = "create_billing_program_reporting_details_android" class Args: var program: BillingProgramAndroid + var developer_billing_type: DeveloperBillingTypeAndroid static func from_dict(data: Dictionary) -> Args: var obj = Args.new() @@ -6324,6 +6610,12 @@ class Mutation: obj.program = BILLING_PROGRAM_ANDROID_FROM_STRING[enum_str] else: obj.program = enum_str + if data.has("developerBillingType") and data["developerBillingType"] != null: + var enum_str = data["developerBillingType"] + if enum_str is String and DEVELOPER_BILLING_TYPE_ANDROID_FROM_STRING.has(enum_str): + obj.developer_billing_type = DEVELOPER_BILLING_TYPE_ANDROID_FROM_STRING[enum_str] + else: + obj.developer_billing_type = enum_str return obj func to_dict() -> Dictionary: @@ -6332,6 +6624,10 @@ class Mutation: dict["program"] = BILLING_PROGRAM_ANDROID_VALUES[program] else: dict["program"] = program + if DEVELOPER_BILLING_TYPE_ANDROID_VALUES.has(developer_billing_type): + dict["developerBillingType"] = DEVELOPER_BILLING_TYPE_ANDROID_VALUES[developer_billing_type] + else: + dict["developerBillingType"] = developer_billing_type return dict const return_type = "BillingProgramReportingDetailsAndroid" const is_array = false @@ -6356,6 +6652,46 @@ class Mutation: const return_type = "Boolean" const is_array = false + ## Show Google's information dialog for a Billing Choice external transaction. + class showBillingProgramInformationDialogAndroidField: + const name = "showBillingProgramInformationDialogAndroid" + const snake_name = "show_billing_program_information_dialog_android" + class Args: + var params: BillingProgramInformationDialogParamsAndroid + + static func from_dict(data: Dictionary) -> Args: + var obj = Args.new() + if data.has("params") and data["params"] != null: + obj.params = data["params"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + dict["params"] = params + return dict + const return_type = "BillingResultAndroid" + const is_array = false + + ## Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. + class showInAppMessagesAndroidField: + const name = "showInAppMessagesAndroid" + const snake_name = "show_in_app_messages_android" + class Args: + var params: InAppMessageParamsAndroid + + static func from_dict(data: Dictionary) -> Args: + var obj = Args.new() + if data.has("params") and data["params"] != null: + obj.params = data["params"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + dict["params"] = params + return dict + const return_type = "InAppMessageResultAndroid" + const is_array = false + # ============================================================================ # API Wrapper Functions @@ -6484,6 +6820,16 @@ static func validate_receipt_ios_args(options: VerifyPurchaseProps) -> Dictionar args["options"] = options return args +## Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. +static func get_billing_choice_info_android_args(params: GetBillingChoiceInfoParamsAndroid) -> Dictionary: + var args = {} + if params != null: + if params.has_method("to_dict"): + args["params"] = params.to_dict() + else: + args["params"] = params + return args + # Mutation API helpers ## Initialize the store connection. Call before any IAP API. @@ -6638,9 +6984,10 @@ static func is_billing_program_available_android_args(program: BillingProgramAnd return args ## Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). -static func create_billing_program_reporting_details_android_args(program: BillingProgramAndroid) -> Dictionary: +static func create_billing_program_reporting_details_android_args(program: BillingProgramAndroid, developer_billing_type: DeveloperBillingTypeAndroid) -> Dictionary: var args = {} args["program"] = program + args["developerBillingType"] = developer_billing_type return args ## Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). @@ -6652,3 +6999,23 @@ static func launch_external_link_android_args(params: LaunchExternalLinkParamsAn else: args["params"] = params return args + +## Show Google's information dialog for a Billing Choice external transaction. +static func show_billing_program_information_dialog_android_args(params: BillingProgramInformationDialogParamsAndroid) -> Dictionary: + var args = {} + if params != null: + if params.has_method("to_dict"): + args["params"] = params.to_dict() + else: + args["params"] = params + return args + +## Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. +static func show_in_app_messages_android_args(params: InAppMessageParamsAndroid) -> Dictionary: + var args = {} + if params != null: + if params.has_method("to_dict"): + args["params"] = params.to_dict() + else: + args["params"] = params + return args diff --git a/packages/gql/src/generated/types.ts b/packages/gql/src/generated/types.ts index 6d2d9b825..6c2b36866 100644 --- a/packages/gql/src/generated/types.ts +++ b/packages/gql/src/generated/types.ts @@ -118,10 +118,34 @@ export interface AppTransaction { } /** - * Billing program types for external content links, external offers, and external payments (Android) - * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0 + * Play Billing choice image layout (Android) + * Available in Google Play Billing Library 9.1.0+ */ -export type BillingProgramAndroid = 'unspecified' | 'user-choice-billing' | 'external-content-link' | 'external-offer' | 'external-payments'; +export type BillingChoiceImageLayoutAndroid = 'rectangular-four-by-one' | 'rectangular-three-by-one' | 'rectangular-two-by-two'; + +/** + * Display information for developer-rendered Billing Choice screens (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +export interface BillingChoiceInfoAndroid { + /** URL for the Play Billing choice image matching the requested layout. */ + playBillingChoiceImageUrl: string; + /** Play Loyalty information for the user. */ + playBillingLoyaltyInfo?: (string | null); +} + +/** + * Choice screen renderer for Billing Choice availability (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +export type BillingChoiceScreenTypeAndroid = 'unspecified' | 'developer-rendered' | 'google-rendered'; + +/** + * Billing program types for Google Play Billing Programs (Android) + * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, + * BILLING_CHOICE added in 9.1.0. + */ +export type BillingProgramAndroid = 'unspecified' | 'user-choice-billing' | 'external-content-link' | 'external-offer' | 'external-payments' | 'billing-choice'; /** * Result of checking billing program availability (Android) @@ -130,8 +154,26 @@ export type BillingProgramAndroid = 'unspecified' | 'user-choice-billing' | 'ext export interface BillingProgramAvailabilityResultAndroid { /** The billing program that was checked */ billingProgram: BillingProgramAndroid; + /** Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. */ + choiceScreenType?: (BillingChoiceScreenTypeAndroid | null); /** Whether the billing program is available for the user */ isAvailable: boolean; + /** + * Whether external-link payment is available for Billing Choice. + * Populated only for available BILLING_CHOICE results. + */ + isExternalLinkAvailable?: (boolean | null); +} + +/** + * Parameters for showing a billing program information dialog (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +export interface BillingProgramInformationDialogParamsAndroid { + /** Billing program. Currently only BILLING_CHOICE is supported. */ + billingProgram?: BillingProgramAndroid; + /** External transaction token returned by the Billing Choice reporting-details flow. */ + externalTransactionToken: string; } /** @@ -193,6 +235,12 @@ export interface DeveloperBillingOptionParamsAndroid { linkUri: string; } +/** + * Developer-provided billing destination type for Billing Program reporting details (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +export type DeveloperBillingTypeAndroid = 'developer-billing-type-unspecified' | 'in-app' | 'external-link'; + /** * Details provided when user selects developer billing option (Android) * Received via DeveloperProvidedBillingListener callback @@ -507,6 +555,19 @@ export interface ExternalPurchaseNoticeResultIOS { export type FetchProductsResult = ProductOrSubscription[] | Product[] | ProductSubscription[] | null; +/** + * Parameters for fetching Billing Choice display information (Android) + * Available in Google Play Billing Library 9.1.0+ + */ +export interface GetBillingChoiceInfoParamsAndroid { + /** Billing program. Currently only BILLING_CHOICE is supported. */ + billingProgram?: BillingProgramAndroid; + /** Desired Play Billing choice image layout. */ + playBillingChoiceImageLayout?: BillingChoiceImageLayoutAndroid; + /** BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. */ + userLocale?: (string | null); +} + export type IapEvent = 'purchase-updated' | 'purchase-error' | 'promoted-product-ios' | 'user-choice-billing-android' | 'developer-provided-billing-android' | 'subscription-billing-issue'; export type IapPlatform = 'ios' | 'android'; @@ -516,6 +577,38 @@ export type IapStore = 'unknown' | 'apple' | 'google' | 'horizon' | 'amazon'; /** Unified purchase states from IAPKit verification response. */ export type IapkitPurchaseState = 'entitled' | 'pending-acknowledgment' | 'pending' | 'canceled' | 'expired' | 'ready-to-consume' | 'consumed' | 'unknown' | 'inauthentic'; +/** + * High-level in-app message category (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +export type InAppMessageCategoryAndroid = 'unknown-in-app-message-category-id' | 'transactional'; + +/** + * Parameters for showing Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +export interface InAppMessageParamsAndroid { + /** In-app message categories to show. Defaults to transactional messages. */ + categories?: (InAppMessageCategoryAndroid[] | null); +} + +/** + * Response code from Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +export type InAppMessageResponseCodeAndroid = 'no-action-needed' | 'subscription-status-updated'; + +/** + * Result from showing Play billing in-app messages (Android) + * Available in Google Play Billing Library 4.1.0+ + */ +export interface InAppMessageResultAndroid { + /** Purchase token returned when a subscription status changed. */ + purchaseToken?: (string | null); + /** Response code for the in-app messaging flow. */ + responseCode: InAppMessageResponseCodeAndroid; +} + /** Connection initialization configuration */ export interface InitConnectionConfig { /** @@ -597,7 +690,6 @@ export interface Mutation { beginRefundRequestIOS?: Promise<(string | null)>; /** * Check whether alternative billing is available for the user. Step 1 of the alternative billing flow. - * * Returns true if available, false otherwise. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/check-alternative-billing-availability-android @@ -617,7 +709,6 @@ export interface Mutation { * Create a reporting token for an alternative billing flow. Step 3 of the alternative billing flow. * Must be called AFTER successful payment in your payment system. * Token must be reported to Google Play backend within 24 hours. - * * Returns token string, or null if creation failed. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-alternative-billing-token-android @@ -626,7 +717,6 @@ export interface Mutation { /** * Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). * Replaces the deprecated createExternalOfferReportingDetailsAsync API. - * * Returns external transaction token needed for reporting external transactions. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android @@ -655,7 +745,6 @@ export interface Mutation { /** * Check whether a billing program (e.g., External Payments) is available for the current user. * Replaces the deprecated isExternalOfferAvailableAsync API. - * * Available in Google Play Billing Library 8.2.0+. * Returns availability result with isAvailable flag. * Throws OpenIapError.NotPrepared if billing client not ready. @@ -665,7 +754,6 @@ export interface Mutation { /** * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). * Replaces the deprecated showExternalOfferInformationDialog API. - * * Shows Play Store dialog and optionally launches external URL. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/launch-external-link-android @@ -711,12 +799,18 @@ export interface Mutation { /** * Display Google's alternative billing information dialog. Step 2 of the alternative billing flow. * Must be called BEFORE processing payment in your payment system. - * * Returns true if user accepted, false if user canceled. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android */ showAlternativeBillingDialogAndroid: Promise; + /** + * Show Google's information dialog for a Billing Choice external transaction. + * Available in Google Play Billing Library 9.1.0+. + * Throws OpenIapError.NotPrepared if billing client not ready. + * See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android + */ + showBillingProgramInformationDialogAndroid: Promise; /** * Present the disclosure sheet required before linking out via ExternalPurchaseCustomLink (iOS 18.1+). * Call this after a deliberate customer interaction before linking out to external purchases. @@ -724,6 +818,14 @@ export interface Mutation { * See: https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios */ showExternalPurchaseCustomLinkNoticeIOS: Promise; + /** + * Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. + * Available in Google Play Billing Library 4.1.0+. + * Returns a response code and, when the subscription status changes, the related purchase token. + * Throws OpenIapError.NotPrepared if billing client not ready. + * See: https://openiap.dev/docs/apis/android/show-in-app-messages-android + */ + showInAppMessagesAndroid: Promise; /** * Present the manage-subscriptions sheet and return changed purchases (iOS 15+). * See: https://openiap.dev/docs/apis/ios/show-manage-subscriptions-ios @@ -766,7 +868,11 @@ export type MutationBeginRefundRequestIosArgs = string; export type MutationConsumePurchaseAndroidArgs = string; -export type MutationCreateBillingProgramReportingDetailsAndroidArgs = BillingProgramAndroid; +export interface MutationCreateBillingProgramReportingDetailsAndroidArgs { + developerBillingType?: (DeveloperBillingTypeAndroid | null); + program: BillingProgramAndroid; +} + export type MutationDeepLinkToSubscriptionsArgs = (DeepLinkOptions | null) | undefined; @@ -801,8 +907,12 @@ export type MutationRequestPurchaseArgs = }; +export type MutationShowBillingProgramInformationDialogAndroidArgs = BillingProgramInformationDialogParamsAndroid; + export type MutationShowExternalPurchaseCustomLinkNoticeIosArgs = ExternalPurchaseCustomLinkNoticeTypeIOS; +export type MutationShowInAppMessagesAndroidArgs = (InAppMessageParamsAndroid | null) | undefined; + export type MutationValidateReceiptArgs = VerifyPurchaseProps; export type MutationVerifyPurchaseArgs = VerifyPurchaseProps; @@ -1359,6 +1469,13 @@ export interface Query { * See: https://openiap.dev/docs/apis/get-available-purchases */ getAvailablePurchases: Promise; + /** + * Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. + * Available in Google Play Billing Library 9.1.0+. + * Throws OpenIapError.NotPrepared if billing client is not ready. + * See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android + */ + getBillingChoiceInfoAndroid: Promise; /** * Fetch a token for Apple's External Purchase Server reporting API (iOS 18.1+). * Use this token to report transactions made through ExternalPurchaseCustomLink. @@ -1447,6 +1564,8 @@ export type QueryGetActiveSubscriptionsArgs = (string[] | null) | undefined; export type QueryGetAvailablePurchasesArgs = (PurchaseOptions | null) | undefined; +export type QueryGetBillingChoiceInfoAndroidArgs = GetBillingChoiceInfoParamsAndroid; + export type QueryGetExternalPurchaseCustomLinkTokenIosArgs = ExternalPurchaseCustomLinkTokenTypeIOS; export type QueryGetTransactionJwsIosArgs = string; @@ -2235,6 +2354,7 @@ export type QueryArgsMap = { getAllTransactionsIOS: never; getAppTransactionIOS: never; getAvailablePurchases: QueryGetAvailablePurchasesArgs; + getBillingChoiceInfoAndroid: QueryGetBillingChoiceInfoAndroidArgs; getExternalPurchaseCustomLinkTokenIOS: QueryGetExternalPurchaseCustomLinkTokenIosArgs; getPendingTransactionsIOS: never; getPromotedProductIOS: never; @@ -2285,7 +2405,9 @@ export type MutationArgsMap = { requestPurchaseOnPromotedProductIOS: never; restorePurchases: never; showAlternativeBillingDialogAndroid: never; + showBillingProgramInformationDialogAndroid: MutationShowBillingProgramInformationDialogAndroidArgs; showExternalPurchaseCustomLinkNoticeIOS: MutationShowExternalPurchaseCustomLinkNoticeIosArgs; + showInAppMessagesAndroid: MutationShowInAppMessagesAndroidArgs; showManageSubscriptionsIOS: never; syncIOS: never; validateReceipt: MutationValidateReceiptArgs; diff --git a/packages/gql/src/type-android.graphql b/packages/gql/src/type-android.graphql index 339a835fc..05f9ab939 100644 --- a/packages/gql/src/type-android.graphql +++ b/packages/gql/src/type-android.graphql @@ -683,8 +683,9 @@ type UserChoiceBillingDetails { # External Billing Programs (Google Play Billing Library 8.2.0+) """ -Billing program types for external content links, external offers, and external payments (Android) -Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0 +Billing program types for Google Play Billing Programs (Android) +Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, +BILLING_CHOICE added in 9.1.0. """ enum BillingProgramAndroid { """ @@ -716,6 +717,103 @@ enum BillingProgramAndroid { Available in Google Play Billing Library 8.3.0+ """ EXTERNAL_PAYMENTS + """ + Billing Choice program. + Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. + Available in Google Play Billing Library 9.1.0+ + """ + BILLING_CHOICE +} + +""" +Choice screen renderer for Billing Choice availability (Android) +Available in Google Play Billing Library 9.1.0+ +""" +enum BillingChoiceScreenTypeAndroid { + """ + Unspecified choice screen type. + """ + UNSPECIFIED + """ + Choice screen is rendered by the developer app. + """ + DEVELOPER_RENDERED + """ + Choice screen is rendered by Google Play. + """ + GOOGLE_RENDERED +} + +""" +Play Billing choice image layout (Android) +Available in Google Play Billing Library 9.1.0+ +""" +enum BillingChoiceImageLayoutAndroid { + """ + Rectangular image with a 4:1 aspect ratio. + """ + RECTANGULAR_FOUR_BY_ONE + """ + Rectangular image with a 3:1 aspect ratio. + """ + RECTANGULAR_THREE_BY_ONE + """ + Rectangular image with a 2:2 aspect ratio. + """ + RECTANGULAR_TWO_BY_TWO +} + +""" +Parameters for fetching Billing Choice display information (Android) +Available in Google Play Billing Library 9.1.0+ +""" +input GetBillingChoiceInfoParamsAndroid { + """ + Billing program. Currently only BILLING_CHOICE is supported. + """ + billingProgram: BillingProgramAndroid! = BILLING_CHOICE + """ + Desired Play Billing choice image layout. + """ + playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid! = RECTANGULAR_FOUR_BY_ONE + """ + BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. + """ + userLocale: String +} + +""" +Developer-provided billing destination type for Billing Program reporting details (Android) +Available in Google Play Billing Library 9.1.0+ +""" +enum DeveloperBillingTypeAndroid { + """ + Unspecified developer billing type. Do not use. + """ + DEVELOPER_BILLING_TYPE_UNSPECIFIED + """ + Developer-provided billing via native in-app experience. + """ + IN_APP + """ + Developer-provided billing via external link or embedded web browsing. + """ + EXTERNAL_LINK +} + +""" +Display information for developer-rendered Billing Choice screens (Android) +Available in Google Play Billing Library 9.1.0+ +""" +type BillingChoiceInfoAndroid { + """ + URL for the Play Billing choice image matching the requested layout. + """ + playBillingChoiceImageUrl: String! + """ + Play Loyalty information for the user. + """ + playBillingLoyaltyInfo: String } """ @@ -812,6 +910,86 @@ type BillingProgramAvailabilityResultAndroid { The billing program that was checked """ billingProgram: BillingProgramAndroid! + """ + Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + """ + choiceScreenType: BillingChoiceScreenTypeAndroid + """ + Whether external-link payment is available for Billing Choice. + Populated only for available BILLING_CHOICE results. + """ + isExternalLinkAvailable: Boolean +} + +""" +Parameters for showing a billing program information dialog (Android) +Available in Google Play Billing Library 9.1.0+ +""" +input BillingProgramInformationDialogParamsAndroid { + """ + Billing program. Currently only BILLING_CHOICE is supported. + """ + billingProgram: BillingProgramAndroid! = BILLING_CHOICE + """ + External transaction token returned by the Billing Choice reporting-details flow. + """ + externalTransactionToken: String! +} + +""" +High-level in-app message category (Android) +Available in Google Play Billing Library 4.1.0+ +""" +enum InAppMessageCategoryAndroid { + """ + Unknown in-app message category. + """ + UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID + """ + Transactional billing messages, such as payment issues or pending price-change confirmations. + """ + TRANSACTIONAL +} + +""" +Parameters for showing Play billing in-app messages (Android) +Available in Google Play Billing Library 4.1.0+ +""" +input InAppMessageParamsAndroid { + """ + In-app message categories to show. Defaults to transactional messages. + """ + categories: [InAppMessageCategoryAndroid!] = [TRANSACTIONAL] +} + +""" +Result from showing Play billing in-app messages (Android) +Available in Google Play Billing Library 4.1.0+ +""" +type InAppMessageResultAndroid { + """ + Response code for the in-app messaging flow. + """ + responseCode: InAppMessageResponseCodeAndroid! + """ + Purchase token returned when a subscription status changed. + """ + purchaseToken: String +} + +""" +Response code from Play billing in-app messages (Android) +Available in Google Play Billing Library 4.1.0+ +""" +enum InAppMessageResponseCodeAndroid { + """ + Flow finished and no developer action is needed. + """ + NO_ACTION_NEEDED + """ + Subscription status changed and the purchase token should be checked. + """ + SUBSCRIPTION_STATUS_UPDATED } # External Payments Program (Google Play Billing Library 8.3.0+) diff --git a/scripts/audit-non-godot-parity.mjs b/scripts/audit-non-godot-parity.mjs index 20d26feef..a1f6cf753 100644 --- a/scripts/audit-non-godot-parity.mjs +++ b/scripts/audit-non-godot-parity.mjs @@ -54,7 +54,9 @@ const operationParityRegistry = { 'requestPurchaseOnPromotedProductIOS', 'restorePurchases', 'showAlternativeBillingDialogAndroid', + 'showBillingProgramInformationDialogAndroid', 'showExternalPurchaseCustomLinkNoticeIOS', + 'showInAppMessagesAndroid', 'showManageSubscriptionsIOS', 'syncIOS', 'validateReceipt', @@ -69,6 +71,7 @@ const operationParityRegistry = { 'getAllTransactionsIOS', 'getAppTransactionIOS', 'getAvailablePurchases', + 'getBillingChoiceInfoAndroid', 'getExternalPurchaseCustomLinkTokenIOS', 'getPendingTransactionsIOS', 'getPromotedProductIOS', @@ -942,27 +945,42 @@ function checkNativeApis() { 'createAlternativeBillingTokenAndroid', 'isBillingProgramAvailableAndroid', 'createBillingProgramReportingDetailsAndroid', + 'getBillingChoiceInfoAndroid', 'launchExternalLinkAndroid', + 'showBillingProgramInformationDialogAndroid', + 'showInAppMessagesAndroid', ], 'RN native spec'); expectIncludes('libraries/expo-iap/src/index.ts', [ 'getStorefront', 'connectWebhookStream', + "export * from './modules/android';", ], 'Expo API exports'); + expectIncludes('libraries/expo-iap/src/modules/android.ts', [ + 'getBillingChoiceInfoAndroid', + 'showBillingProgramInformationDialogAndroid', + 'showInAppMessagesAndroid', + ], 'Expo Android API exports'); expectIncludes('libraries/flutter_inapp_purchase/lib/types.dart', [ 'Future getStorefront()', 'Future checkAlternativeBillingAvailabilityAndroid()', 'Future createAlternativeBillingTokenAndroid()', 'Future createBillingProgramReportingDetailsAndroid', + 'Future getBillingChoiceInfoAndroid', 'Future isBillingProgramAvailableAndroid', 'Future launchExternalLinkAndroid', + 'Future showBillingProgramInformationDialogAndroid', + 'Future showInAppMessagesAndroid', ], 'Flutter generated API'); expectIncludes('libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt', [ 'suspend fun getStorefront(): String', 'suspend fun checkAlternativeBillingAvailabilityAndroid(): Boolean', 'suspend fun createAlternativeBillingTokenAndroid', 'suspend fun createBillingProgramReportingDetailsAndroid', + 'suspend fun getBillingChoiceInfoAndroid', 'suspend fun isBillingProgramAvailableAndroid', 'suspend fun launchExternalLinkAndroid', + 'suspend fun showBillingProgramInformationDialogAndroid', + 'suspend fun showInAppMessagesAndroid', ], 'KMP generated API'); } From a2bc75a960a041d2f7d1bd5d6218998bb4edc580 Mon Sep 17 00:00:00 2001 From: Hyo Date: Wed, 8 Jul 2026 16:27:57 +0900 Subject: [PATCH 02/14] fix(google): address Billing Choice review feedback --- .../scripts/verify-android-consumer-build.sh | 55 ++++++++++++++++++- libraries/godot-iap/addons/godot-iap/types.gd | 16 +++++- .../hyochan/kmpiap/InAppPurchaseAndroid.kt | 7 +++ .../java/dev/hyo/openiap/OpenIapModule.kt | 3 + packages/gql/codegen/plugins/gdscript.ts | 49 ++++++++++++++++- packages/gql/src/generated/types.gd | 16 +++++- 6 files changed, 137 insertions(+), 9 deletions(-) diff --git a/libraries/flutter_inapp_purchase/scripts/verify-android-consumer-build.sh b/libraries/flutter_inapp_purchase/scripts/verify-android-consumer-build.sh index daaf1681b..05b32b486 100755 --- a/libraries/flutter_inapp_purchase/scripts/verify-android-consumer-build.sh +++ b/libraries/flutter_inapp_purchase/scripts/verify-android-consumer-build.sh @@ -14,9 +14,12 @@ cleanup() { trap cleanup EXIT package_copy="$tmp_root/flutter_inapp_purchase" +local_google_copy="$tmp_root/packages/google/openiap" consumer_app="$tmp_root/openiap_consumer_smoke" cp -R "$package_root" "$tmp_root/" +mkdir -p "$(dirname "$local_google_copy")" +cp -R "$repo_root/packages/google/openiap" "$local_google_copy" rm -rf \ "$package_copy/.build" \ "$package_copy/.dart_tool" \ @@ -26,13 +29,44 @@ rm -rf \ "$package_copy/example/.dart_tool" \ "$package_copy/example/android/.gradle" \ "$package_copy/example/android/build" \ - "$package_copy/example/build" + "$package_copy/example/build" \ + "$local_google_copy/.gradle" \ + "$local_google_copy/build" rm -f "$package_copy/openiap-versions.json" cp "$repo_root/openiap-versions.json" "$package_copy/openiap-versions.json" +cp "$repo_root/openiap-versions.json" "$tmp_root/openiap-versions.json" flutter create --platforms=android -t app --project-name openiap_consumer_smoke "$consumer_app" +google_root_build="$repo_root/packages/google/build.gradle.kts" +read_google_plugin_version() { + local plugin_id="$1" + sed -nE "s/.*id\\(\"${plugin_id}\"\\) version \"([^\"]+)\".*/\\1/p" "$google_root_build" | head -n 1 +} + +android_library_version="$(read_google_plugin_version "com.android.library")" +compose_plugin_version="$(read_google_plugin_version "org.jetbrains.kotlin.plugin.compose")" +maven_publish_version="$(read_google_plugin_version "com.vanniktech.maven.publish")" + +if [ -f "$consumer_app/android/settings.gradle.kts" ]; then + settings_file="$consumer_app/android/settings.gradle.kts" + perl -0pi -e "s/plugins \\{\\n/plugins {\\n id(\"com.android.library\") version \"$android_library_version\" apply false\\n id(\"org.jetbrains.kotlin.plugin.compose\") version \"$compose_plugin_version\" apply false\\n id(\"com.vanniktech.maven.publish\") version \"$maven_publish_version\" apply false\\n/" "$settings_file" + cat >> "$settings_file" <<'EOF' + +include(":openiap") +project(":openiap").projectDir = file("../../packages/google/openiap") +EOF +elif [ -f "$consumer_app/android/settings.gradle" ]; then + settings_file="$consumer_app/android/settings.gradle" + perl -0pi -e "s/plugins \\{\\n/plugins {\\n id 'com.android.library' version '$android_library_version' apply false\\n id 'org.jetbrains.kotlin.plugin.compose' version '$compose_plugin_version' apply false\\n id 'com.vanniktech.maven.publish' version '$maven_publish_version' apply false\\n/" "$settings_file" + cat >> "$settings_file" <<'EOF' + +include ':openiap' +project(':openiap').projectDir = file('../../packages/google/openiap') +EOF +fi + ( cd "$consumer_app" flutter pub add flutter_inapp_purchase --path "$package_copy" @@ -47,13 +81,28 @@ flutter create --platforms=android -t app --project-name openiap_consumer_smoke fi if [ -n "$android_sdk_root" ] && + [ -d "$android_sdk_root/ndk/28.2.13676358" ]; then + preferred_ndk_version="28.2.13676358" + elif [ -n "$android_sdk_root" ] && [ -d "$android_sdk_root/ndk/27.0.12077973" ]; then + preferred_ndk_version="27.0.12077973" + else + preferred_ndk_version="" + fi + + if [ -n "$preferred_ndk_version" ]; then if [ -f android/app/build.gradle.kts ]; then - perl -pi -e 's/ndkVersion\s*=\s*flutter\.ndkVersion/ndkVersion = "27.0.12077973"/' android/app/build.gradle.kts + perl -pi -e "s/ndkVersion\\s*=\\s*flutter\\.ndkVersion/ndkVersion = \"$preferred_ndk_version\"/" android/app/build.gradle.kts elif [ -f android/app/build.gradle ]; then - perl -pi -e 's/ndkVersion\s*=?\s*flutter\.ndkVersion/ndkVersion = "27.0.12077973"/' android/app/build.gradle + perl -pi -e "s/ndkVersion\\s*=?\\s*flutter\\.ndkVersion/ndkVersion = \"$preferred_ndk_version\"/" android/app/build.gradle fi fi + if [ -f android/app/build.gradle.kts ]; then + perl -0pi -e 's/defaultConfig \{\n/defaultConfig {\n missingDimensionStrategy("platform", "play")\n/' android/app/build.gradle.kts + elif [ -f android/app/build.gradle ]; then + perl -0pi -e 's/defaultConfig \{\n/defaultConfig {\n missingDimensionStrategy "platform", "play"\n/' android/app/build.gradle + fi + flutter build apk --debug ) diff --git a/libraries/godot-iap/addons/godot-iap/types.gd b/libraries/godot-iap/addons/godot-iap/types.gd index 3910cb9d8..769c5d933 100644 --- a/libraries/godot-iap/addons/godot-iap/types.gd +++ b/libraries/godot-iap/addons/godot-iap/types.gd @@ -4139,13 +4139,25 @@ class InAppMessageParamsAndroid: static func from_dict(data: Dictionary) -> InAppMessageParamsAndroid: var obj = InAppMessageParamsAndroid.new() if data.has("categories") and data["categories"] != null: - obj.categories = data["categories"] + var arr: Array[InAppMessageCategoryAndroid] = [] + for item in data["categories"]: + if item is String and IN_APP_MESSAGE_CATEGORY_ANDROID_FROM_STRING.has(item): + arr.append(IN_APP_MESSAGE_CATEGORY_ANDROID_FROM_STRING[item]) + else: + arr.append(item) + obj.categories = arr return obj func to_dict() -> Dictionary: var dict = {} if categories != null: - dict["categories"] = categories + var arr = [] + for item in categories: + if IN_APP_MESSAGE_CATEGORY_ANDROID_VALUES.has(item): + arr.append(IN_APP_MESSAGE_CATEGORY_ANDROID_VALUES[item]) + else: + arr.append(item) + dict["categories"] = arr return dict ## Connection initialization configuration diff --git a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt index 6e60d2cb8..eea998dea 100644 --- a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt +++ b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt @@ -2087,6 +2087,13 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife paramsClass, listenerClass ).invoke(client, activity, requestParams, listener) + ?.let { it as? BillingResult } + ?.takeIf { it.responseCode != BillingClient.BillingResponseCode.OK } + ?.let { + if (continuation.isActive) { + continuation.resume(it.toBillingResultAndroid()) + } + } } catch (e: NoSuchMethodException) { if (continuation.isActive) { continuation.resumeWithException(PurchaseException( diff --git a/packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt b/packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt index 2b0a728bd..3d747cb3e 100644 --- a/packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt +++ b/packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt @@ -1066,6 +1066,9 @@ class OpenIapModule( paramsClass, listenerClass ).invoke(client, activity, requestParams, listener) + ?.let { it as? BillingResult } + ?.takeIf { it.responseCode != BillingClient.BillingResponseCode.OK } + ?.let { resumer.resume(it.toOpenIapBillingResult()) } } catch (e: NoSuchMethodException) { OpenIapLog.e("showBillingProgramInformationDialog not found. Requires Billing Library 9.1.0+", e, TAG) resumer.resumeWithException(OpenIapError.FeatureNotSupported()) diff --git a/packages/gql/codegen/plugins/gdscript.ts b/packages/gql/codegen/plugins/gdscript.ts index 1f3156a34..df93b40fb 100644 --- a/packages/gql/codegen/plugins/gdscript.ts +++ b/packages/gql/codegen/plugins/gdscript.ts @@ -329,6 +329,44 @@ export class GDScriptPlugin extends CodegenPlugin { this.emit(`${indent}\t${target} = enum_str`); } + private emitEnumListFromDictAssignment(indent: string, target: string, typeName: string, sourceExpression: string): void { + const enumReverseLookup = toConstantCase(typeName) + '_FROM_STRING'; + const fallback = this.getEnumUnknownFallback(typeName); + + this.emit(`${indent}var arr: Array[${typeName}] = []`); + this.emit(`${indent}for item in ${sourceExpression}:`); + if (fallback) { + this.emit(`${indent}\tif item is String:`); + this.emit(`${indent}\t\tarr.append(${enumReverseLookup}.get(item, ${fallback}))`); + this.emit(`${indent}\telse:`); + this.emit(`${indent}\t\tarr.append(item)`); + } else { + this.emit(`${indent}\tif item is String and ${enumReverseLookup}.has(item):`); + this.emit(`${indent}\t\tarr.append(${enumReverseLookup}[item])`); + this.emit(`${indent}\telse:`); + this.emit(`${indent}\t\tarr.append(item)`); + } + this.emit(`${indent}${target} = arr`); + } + + private emitEnumListToDictAssignment(indent: string, graphqlName: string, fieldName: string, typeName: string): void { + const enumConstName = toConstantCase(typeName) + '_VALUES'; + + this.emit(`${indent}var arr = []`); + this.emit(`${indent}for item in ${fieldName}:`); + this.emit(`${indent}\tif ${enumConstName}.has(item):`); + this.emit(`${indent}\t\tarr.append(${enumConstName}[item])`); + this.emit(`${indent}\telse:`); + this.emit(`${indent}\t\tarr.append(item)`); + this.emit(`${indent}dict["${graphqlName}"] = arr`); + } + + private isEnumList(type: IRType): boolean { + return type.kind === 'list' && + !!type.elementType && + (type.elementType.kind === 'enum' || this.enumNames.has(type.elementType.name!)); + } + // ============================================================================ // Interfaces (not used in GDScript, but required by base class) // ============================================================================ @@ -485,7 +523,12 @@ export class GDScriptPlugin extends CodegenPlugin { const type = field.type; const enumConstName = type.name ? toConstantCase(type.name) + '_VALUES' : ''; - if (this.isObjectOrInput(type) && type.kind === 'list') { + if (this.isEnumList(type)) { + this.emit(`\t\tif ${fieldName} != null:`); + this.emitEnumListToDictAssignment('\t\t\t', graphqlName, fieldName, type.elementType!.name!); + this.emit(`\t\telse:`); + this.emit(`\t\t\tdict["${graphqlName}"] = null`); + } else if (this.isObjectOrInput(type) && type.kind === 'list') { this.emit(`\t\tif ${fieldName} != null:`); this.emit(`\t\t\tvar arr = []`); this.emit(`\t\t\tfor item in ${fieldName}:`); @@ -626,7 +669,9 @@ export class GDScriptPlugin extends CodegenPlugin { this.emit(`\t\tif ${fieldName} != null:`); - if (this.isObjectOrInput(type) && type.kind === 'list') { + if (this.isEnumList(type)) { + this.emitEnumListToDictAssignment('\t\t\t', graphqlName, fieldName, type.elementType!.name!); + } else if (this.isObjectOrInput(type) && type.kind === 'list') { this.emit(`\t\t\tvar arr = []`); this.emit(`\t\t\tfor item in ${fieldName}:`); this.emit(`\t\t\t\tif item.has_method("to_dict"):`); diff --git a/packages/gql/src/generated/types.gd b/packages/gql/src/generated/types.gd index 3910cb9d8..769c5d933 100644 --- a/packages/gql/src/generated/types.gd +++ b/packages/gql/src/generated/types.gd @@ -4139,13 +4139,25 @@ class InAppMessageParamsAndroid: static func from_dict(data: Dictionary) -> InAppMessageParamsAndroid: var obj = InAppMessageParamsAndroid.new() if data.has("categories") and data["categories"] != null: - obj.categories = data["categories"] + var arr: Array[InAppMessageCategoryAndroid] = [] + for item in data["categories"]: + if item is String and IN_APP_MESSAGE_CATEGORY_ANDROID_FROM_STRING.has(item): + arr.append(IN_APP_MESSAGE_CATEGORY_ANDROID_FROM_STRING[item]) + else: + arr.append(item) + obj.categories = arr return obj func to_dict() -> Dictionary: var dict = {} if categories != null: - dict["categories"] = categories + var arr = [] + for item in categories: + if IN_APP_MESSAGE_CATEGORY_ANDROID_VALUES.has(item): + arr.append(IN_APP_MESSAGE_CATEGORY_ANDROID_VALUES[item]) + else: + arr.append(item) + dict["categories"] = arr return dict ## Connection initialization configuration From aa91c52dcae7920bab5caea2a70540efb126f831 Mon Sep 17 00:00:00 2001 From: Hyo Date: Wed, 8 Jul 2026 16:55:43 +0900 Subject: [PATCH 03/14] fix(google): address billing review findings --- .../java/expo/modules/iap/ExpoIapModule.kt | 7 +- libraries/expo-iap/src/modules/android.ts | 42 ++++--- libraries/expo-iap/src/types.ts | 2 + .../flutter_inapp_purchase/lib/types.dart | 22 ++-- .../main/java/dev/hyo/godotiap/GodotIap.kt | 6 + .../screens/AlternativeBillingScreen.kt | 74 +++++++++++- .../hyochan/kmpiap/InAppPurchaseAndroid.kt | 28 ++++- .../io/github/hyochan/kmpiap/openiap/Types.kt | 65 +++++----- .../dev/hyo/openiap/maui/OpenIapMauiModule.kt | 7 +- libraries/maui-iap/src/OpenIap.Maui/Types.cs | 12 +- .../java/com/margelo/nitro/iap/HybridRnIap.kt | 18 +-- .../src/__tests__/index.test.ts | 23 ++++ libraries/react-native-iap/src/types.ts | 2 + packages/apple/Sources/Models/Types.swift | 12 +- .../java/dev/hyo/openiap/OpenIapModule.kt | 14 +-- .../java/dev/hyo/openiap/OpenIapModule.kt | 10 +- .../src/main/java/dev/hyo/openiap/Types.kt | 65 +++++----- .../java/dev/hyo/openiap/OpenIapModule.kt | 7 +- packages/gql/codegen/core/transformer.ts | 7 ++ packages/gql/codegen/core/types.ts | 4 +- packages/gql/codegen/plugins/csharp.ts | 33 +++++- packages/gql/codegen/plugins/dart.ts | 56 ++++++++- packages/gql/codegen/plugins/kotlin.ts | 112 ++++++++++++++++-- packages/gql/codegen/plugins/swift.ts | 28 ++++- packages/gql/src/api-android.graphql | 2 + packages/gql/src/generated/Types.cs | 12 +- packages/gql/src/generated/Types.kt | 65 +++++----- packages/gql/src/generated/Types.swift | 12 +- packages/gql/src/generated/types.dart | 22 ++-- packages/gql/src/generated/types.ts | 2 + 30 files changed, 556 insertions(+), 215 deletions(-) diff --git a/libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapModule.kt b/libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapModule.kt index 4e3816d16..7ef90c149 100644 --- a/libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapModule.kt +++ b/libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapModule.kt @@ -689,7 +689,12 @@ class ExpoIapModule : Module() { } val categories = (params?.get("categories") as? List<*>) - ?.mapNotNull { (it as? String)?.let(::mapInAppMessageCategory) } + ?.map { entry -> + val category = entry as? String + ?: throw IllegalArgumentException("In-app message category must be a string: $entry") + mapInAppMessageCategory(category) + ?: throw IllegalArgumentException("Unknown in-app message category: $category") + } val result = openIapStore.showInAppMessages( activity, diff --git a/libraries/expo-iap/src/modules/android.ts b/libraries/expo-iap/src/modules/android.ts index 4a24d49ec..e53fa6227 100644 --- a/libraries/expo-iap/src/modules/android.ts +++ b/libraries/expo-iap/src/modules/android.ts @@ -16,6 +16,7 @@ import type { GetBillingChoiceInfoParamsAndroid, InAppMessageParamsAndroid, InAppMessageResultAndroid, + MutationCreateBillingProgramReportingDetailsAndroidArgs, MutationField, QueryField, VerifyPurchaseResultAndroid, @@ -393,26 +394,35 @@ export const launchExternalLinkAndroid: MutationField< * * @see {@link https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android} */ -export const createBillingProgramReportingDetailsAndroid = async ( +const createBillingProgramReportingDetailsAndroidField: MutationField< + 'createBillingProgramReportingDetailsAndroid' +> = async ( + args: MutationCreateBillingProgramReportingDetailsAndroidArgs, +): Promise => + ExpoIapModule.createBillingProgramReportingDetailsAndroid( + args.program, + args.developerBillingType ?? null, + ); + +export function createBillingProgramReportingDetailsAndroid( + args: MutationCreateBillingProgramReportingDetailsAndroidArgs, +): Promise; +export function createBillingProgramReportingDetailsAndroid( + program: BillingProgramAndroid, + developerBillingType?: DeveloperBillingTypeAndroid | null, +): Promise; +export function createBillingProgramReportingDetailsAndroid( programOrArgs: | BillingProgramAndroid - | { - program: BillingProgramAndroid; - developerBillingType?: DeveloperBillingTypeAndroid | null; - }, + | MutationCreateBillingProgramReportingDetailsAndroidArgs, developerBillingType?: DeveloperBillingTypeAndroid | null, -): Promise => { - const program = - typeof programOrArgs === 'string' ? programOrArgs : programOrArgs.program; - const resolvedDeveloperBillingType = +): Promise { + const args = typeof programOrArgs === 'string' - ? developerBillingType - : (programOrArgs.developerBillingType ?? developerBillingType); - return ExpoIapModule.createBillingProgramReportingDetailsAndroid( - program, - resolvedDeveloperBillingType ?? null, - ); -}; + ? {program: programOrArgs, developerBillingType} + : programOrArgs; + return createBillingProgramReportingDetailsAndroidField(args); +} /** * Show Google's information dialog for a Billing Choice external transaction. diff --git a/libraries/expo-iap/src/types.ts b/libraries/expo-iap/src/types.ts index 6c2b36866..8e553b2a7 100644 --- a/libraries/expo-iap/src/types.ts +++ b/libraries/expo-iap/src/types.ts @@ -718,6 +718,8 @@ export interface Mutation { * Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). * Replaces the deprecated createExternalOfferReportingDetailsAsync API. * Returns external transaction token needed for reporting external transactions. + * developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, + * native Android defaults it to IN_APP. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ diff --git a/libraries/flutter_inapp_purchase/lib/types.dart b/libraries/flutter_inapp_purchase/lib/types.dart index 5d7a2dbc8..6d9814f67 100644 --- a/libraries/flutter_inapp_purchase/lib/types.dart +++ b/libraries/flutter_inapp_purchase/lib/types.dart @@ -4509,7 +4509,7 @@ class AndroidSubscriptionOfferInput { /// Available in Google Play Billing Library 9.1.0+ class BillingProgramInformationDialogParamsAndroid { const BillingProgramInformationDialogParamsAndroid({ - required this.billingProgram, + this.billingProgram = BillingProgramAndroid.BillingChoice, required this.externalTransactionToken, }); @@ -4520,7 +4520,7 @@ class BillingProgramInformationDialogParamsAndroid { factory BillingProgramInformationDialogParamsAndroid.fromJson(Map json) { return BillingProgramInformationDialogParamsAndroid( - billingProgram: BillingProgramAndroid.fromJson(json['billingProgram'] as String), + billingProgram: json['billingProgram'] != null ? BillingProgramAndroid.fromJson(json['billingProgram'] as String) : BillingProgramAndroid.BillingChoice, externalTransactionToken: json['externalTransactionToken'] as String, ); } @@ -4638,8 +4638,8 @@ class DiscountOfferInputIOS { /// Available in Google Play Billing Library 9.1.0+ class GetBillingChoiceInfoParamsAndroid { const GetBillingChoiceInfoParamsAndroid({ - required this.billingProgram, - required this.playBillingChoiceImageLayout, + this.billingProgram = BillingProgramAndroid.BillingChoice, + this.playBillingChoiceImageLayout = BillingChoiceImageLayoutAndroid.RectangularFourByOne, this.userLocale, }); @@ -4652,8 +4652,8 @@ class GetBillingChoiceInfoParamsAndroid { factory GetBillingChoiceInfoParamsAndroid.fromJson(Map json) { return GetBillingChoiceInfoParamsAndroid( - billingProgram: BillingProgramAndroid.fromJson(json['billingProgram'] as String), - playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid.fromJson(json['playBillingChoiceImageLayout'] as String), + billingProgram: json['billingProgram'] != null ? BillingProgramAndroid.fromJson(json['billingProgram'] as String) : BillingProgramAndroid.BillingChoice, + playBillingChoiceImageLayout: json['playBillingChoiceImageLayout'] != null ? BillingChoiceImageLayoutAndroid.fromJson(json['playBillingChoiceImageLayout'] as String) : BillingChoiceImageLayoutAndroid.RectangularFourByOne, userLocale: json['userLocale'] as String?, ); } @@ -4671,7 +4671,7 @@ class GetBillingChoiceInfoParamsAndroid { /// Available in Google Play Billing Library 4.1.0+ class InAppMessageParamsAndroid { const InAppMessageParamsAndroid({ - this.categories, + this.categories = const [InAppMessageCategoryAndroid.Transactional], }); /// In-app message categories to show. Defaults to transactional messages. @@ -4679,7 +4679,7 @@ class InAppMessageParamsAndroid { factory InAppMessageParamsAndroid.fromJson(Map json) { return InAppMessageParamsAndroid( - categories: (json['categories'] as List?) == null ? null : (json['categories'] as List?)!.map((e) => InAppMessageCategoryAndroid.fromJson(e as String)).toList(), + categories: (json['categories'] as List?) == null ? const [InAppMessageCategoryAndroid.Transactional] : (json['categories'] as List?)!.map((e) => InAppMessageCategoryAndroid.fromJson(e as String)).toList(), ); } @@ -4767,7 +4767,7 @@ class LaunchExternalLinkParamsAndroid { class ProductRequest { const ProductRequest({ required this.skus, - this.type, + this.type = ProductQueryType.InApp, }); final List skus; @@ -4776,7 +4776,7 @@ class ProductRequest { factory ProductRequest.fromJson(Map json) { return ProductRequest( skus: (json['skus'] as List).map((e) => e as String).toList(), - type: json['type'] != null ? ProductQueryType.fromJson(json['type'] as String) : null, + type: json['type'] != null ? ProductQueryType.fromJson(json['type'] as String) : ProductQueryType.InApp, ); } @@ -5813,6 +5813,8 @@ abstract class MutationResolver { /// Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). /// Replaces the deprecated createExternalOfferReportingDetailsAsync API. /// Returns external transaction token needed for reporting external transactions. + /// developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, + /// native Android defaults it to IN_APP. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android Future createBillingProgramReportingDetailsAndroid({ diff --git a/libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIap.kt b/libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIap.kt index 0b970136b..2f369ece4 100644 --- a/libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIap.kt +++ b/libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIap.kt @@ -860,6 +860,12 @@ class GodotIap(godot: Godot) : GodotPlugin(godot) { try { val json = JSONObject(paramsJson) val token = json.optString("externalTransactionToken", "") + if (token.isBlank()) { + return@runBlocking JSONObject().apply { + put("success", false) + put("error", "externalTransactionToken is required") + }.toString() + } val result = store.showBillingProgramInformationDialog( activity, BillingProgramInformationDialogParamsAndroid( diff --git a/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AlternativeBillingScreen.kt b/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AlternativeBillingScreen.kt index 0b342f602..d0bdaa0a4 100644 --- a/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AlternativeBillingScreen.kt +++ b/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AlternativeBillingScreen.kt @@ -327,6 +327,78 @@ fun AlternativeBillingScreen(navController: NavController) { } } + // Handle Android Billing Choice (9.1.0+) + fun handleAndroidBillingChoice(product: ProductCommon) { + scope.launch { + isProcessing = true + purchaseResult = "Checking Billing Choice availability..." + + try { + val availability = kmpIapInstance.isBillingProgramAvailableAndroid( + BillingProgramAndroid.BillingChoice + ) + + if (!availability.isAvailable) { + purchaseResult = "❌ Billing Choice not available for this user or product" + isProcessing = false + return@launch + } + + purchaseResult = "Fetching Billing Choice display metadata..." + val choiceInfo = kmpIapInstance.getBillingChoiceInfoAndroid( + GetBillingChoiceInfoParamsAndroid( + billingProgram = BillingProgramAndroid.BillingChoice, + playBillingChoiceImageLayout = BillingChoiceImageLayoutAndroid.RectangularFourByOne + ) + ) + + val developerBillingType = if (availability.isExternalLinkAvailable == true) { + DeveloperBillingTypeAndroid.ExternalLink + } else { + DeveloperBillingTypeAndroid.InApp + } + + purchaseResult = "Creating Billing Choice reporting token..." + val details = kmpIapInstance.createBillingProgramReportingDetailsAndroid( + BillingProgramAndroid.BillingChoice, + developerBillingType + ) + + purchaseResult = "Showing Billing Choice information dialog..." + val dialogResult = kmpIapInstance.showBillingProgramInformationDialogAndroid( + BillingProgramInformationDialogParamsAndroid( + billingProgram = BillingProgramAndroid.BillingChoice, + externalTransactionToken = details.externalTransactionToken + ) + ) + + purchaseResult = "Showing Play billing in-app messages..." + val messageResult = kmpIapInstance.showInAppMessagesAndroid( + InAppMessageParamsAndroid( + categories = listOf(InAppMessageCategoryAndroid.Transactional) + ) + ) + + purchaseResult = """ + ✅ Billing Choice API flow completed + + Product: ${product.id} + Billing type: ${developerBillingType.rawValue} + Choice image: ${choiceInfo.playBillingChoiceImageUrl} + Token: ${details.externalTransactionToken} + Dialog response: ${dialogResult.responseCode} + In-app message response: ${messageResult.responseCode.rawValue} + + ⚠️ Complete the selected payment flow and report the token to Google Play backend within 24 hours. + """.trimIndent() + } catch (e: Exception) { + purchaseResult = "❌ Error: ${e.message}" + } finally { + isProcessing = false + } + } + } + // Handle Android User Choice Billing (7.0+) fun handleAndroidUserChoiceBilling(product: ProductCommon) { scope.launch { @@ -366,7 +438,7 @@ fun AlternativeBillingScreen(navController: NavController) { } else if (currentPlatform == "Android") { when (billingProgram) { BillingProgramAndroid.UserChoiceBilling -> handleAndroidUserChoiceBilling(product) - BillingProgramAndroid.BillingChoice, + BillingProgramAndroid.BillingChoice -> handleAndroidBillingChoice(product) BillingProgramAndroid.ExternalOffer, BillingProgramAndroid.ExternalPayments, BillingProgramAndroid.ExternalContentLink -> handleAndroidBillingPrograms(product) diff --git a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt index eea998dea..a8c5a5e19 100644 --- a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt +++ b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt @@ -1924,6 +1924,12 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife message = "BillingClient not initialized" ) ) + if (!client.isReady) throw PurchaseException( + PurchaseError( + code = ErrorCode.NotPrepared, + message = "BillingClient not ready" + ) + ) val program = if (params.billingProgram == BillingProgramAndroid.Unspecified) { BillingProgramAndroid.BillingChoice } else { @@ -2035,6 +2041,12 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife message = "BillingClient not initialized" ) ) + if (!client.isReady) throw PurchaseException( + PurchaseError( + code = ErrorCode.NotPrepared, + message = "BillingClient not ready" + ) + ) val activity = currentActivity ?: throw PurchaseException( PurchaseError( code = ErrorCode.NotPrepared, @@ -2132,6 +2144,12 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife message = "BillingClient not initialized" ) ) + if (!client.isReady) throw PurchaseException( + PurchaseError( + code = ErrorCode.NotPrepared, + message = "BillingClient not ready" + ) + ) val activity = currentActivity ?: throw PurchaseException( PurchaseError( code = ErrorCode.NotPrepared, @@ -2143,7 +2161,7 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife try { val paramsClass = Class.forName("com.android.billingclient.api.InAppMessageParams") val builderClass = Class.forName("com.android.billingclient.api.InAppMessageParams\$Builder") - val builder = builderClass.getConstructor().newInstance() + val builder = paramsClass.getMethod("newBuilder").invoke(null) val categories = params?.categories?.takeIf { it.isNotEmpty() } ?: listOf(InAppMessageCategoryAndroid.Transactional) for (category in categories) { @@ -2183,9 +2201,11 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife submitResult.responseCode != BillingClient.BillingResponseCode.OK && continuation.isActive ) { - continuation.resume(InAppMessageResultAndroid( - responseCode = InAppMessageResponseCodeAndroid.NoActionNeeded, - purchaseToken = null + continuation.resumeWithException(PurchaseException( + PurchaseError( + code = ErrorCode.Unknown, + message = "showInAppMessages failed: ${submitResult.debugMessage}" + ) )) } } catch (e: NoSuchMethodException) { diff --git a/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt b/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt index d31318ed0..d1d92d7ed 100644 --- a/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt +++ b/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt @@ -2821,7 +2821,7 @@ public data class ProductAndroid( oneTimePurchaseOfferDetailsAndroid = (json["oneTimePurchaseOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductAndroidOneTimePurchaseOfferDetail.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductAndroidOneTimePurchaseOfferDetail") }, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, price = (json["price"] as? Number)?.toDouble(), - productStatusAndroid = (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) }, + productStatusAndroid = runCatching { (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) } }.getOrNull() ?: ProductStatusAndroid.Unknown, subscriptionOfferDetailsAndroid = (json["subscriptionOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductSubscriptionAndroidOfferDetails.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductSubscriptionAndroidOfferDetails") }, subscriptionOffers = (json["subscriptionOffers"] as? List<*>)?.mapNotNull { (it as? Map)?.let { SubscriptionOffer.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionOffer") }, title = json["title"] as? String ?: "", @@ -3083,7 +3083,7 @@ public data class ProductSubscriptionAndroid( oneTimePurchaseOfferDetailsAndroid = (json["oneTimePurchaseOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductAndroidOneTimePurchaseOfferDetail.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductAndroidOneTimePurchaseOfferDetail") }, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, price = (json["price"] as? Number)?.toDouble(), - productStatusAndroid = (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) }, + productStatusAndroid = runCatching { (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) } }.getOrNull() ?: ProductStatusAndroid.Unknown, subscriptionOfferDetailsAndroid = (json["subscriptionOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductSubscriptionAndroidOfferDetails.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductSubscriptionAndroidOfferDetails") } ?: emptyList(), subscriptionOffers = (json["subscriptionOffers"] as? List<*>)?.mapNotNull { (it as? Map)?.let { SubscriptionOffer.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionOffer") } ?: emptyList(), title = json["title"] as? String ?: "", @@ -3326,11 +3326,11 @@ public data class PurchaseAndroid( pendingPurchaseUpdateAndroid = (json["pendingPurchaseUpdateAndroid"] as? Map)?.let { PendingPurchaseUpdateAndroid.fromJson(it) }, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, productId = json["productId"] as? String ?: "", - purchaseState = (json["purchaseState"] as? String)?.let { PurchaseState.fromJson(it) } ?: PurchaseState.Pending, + purchaseState = runCatching { (json["purchaseState"] as? String)?.let { PurchaseState.fromJson(it) } }.getOrNull() ?: PurchaseState.Unknown, purchaseToken = json["purchaseToken"] as? String, quantity = (json["quantity"] as? Number)?.toInt() ?: 0, signatureAndroid = json["signatureAndroid"] as? String, - store = (json["store"] as? String)?.let { IapStore.fromJson(it) } ?: IapStore.Unknown, + store = runCatching { (json["store"] as? String)?.let { IapStore.fromJson(it) } }.getOrNull() ?: IapStore.Unknown, transactionDate = (json["transactionDate"] as? Number)?.toDouble() ?: 0.0, transactionId = json["transactionId"] as? String, ) @@ -3378,7 +3378,7 @@ public data class PurchaseError( companion object { fun fromJson(json: Map): PurchaseError { return PurchaseError( - code = (json["code"] as? String)?.let { ErrorCode.fromJson(it) } ?: ErrorCode.Unknown, + code = runCatching { (json["code"] as? String)?.let { ErrorCode.fromJson(it) } }.getOrNull() ?: ErrorCode.Unknown, debugMessage = json["debugMessage"] as? String, isEmptyProductList = json["isEmptyProductList"] as? Boolean, message = json["message"] as? String ?: "", @@ -3463,7 +3463,7 @@ public data class PurchaseIOS( advancedCommerceInfoIOS = (json["advancedCommerceInfoIOS"] as? Map)?.let { AdvancedCommerceInfoIOS.fromJson(it) }, appAccountToken = json["appAccountToken"] as? String, appBundleIdIOS = json["appBundleIdIOS"] as? String, - billingPlanTypeIOS = (json["billingPlanTypeIOS"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) }, + billingPlanTypeIOS = runCatching { (json["billingPlanTypeIOS"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, commitmentInfoIOS = (json["commitmentInfoIOS"] as? Map)?.let { TransactionCommitmentInfoIOS.fromJson(it) }, countryCodeIOS = json["countryCodeIOS"] as? String, currencyCodeIOS = json["currencyCodeIOS"] as? String, @@ -3481,7 +3481,7 @@ public data class PurchaseIOS( ownershipTypeIOS = json["ownershipTypeIOS"] as? String, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, productId = json["productId"] as? String ?: "", - purchaseState = (json["purchaseState"] as? String)?.let { PurchaseState.fromJson(it) } ?: PurchaseState.Pending, + purchaseState = runCatching { (json["purchaseState"] as? String)?.let { PurchaseState.fromJson(it) } }.getOrNull() ?: PurchaseState.Unknown, purchaseToken = json["purchaseToken"] as? String, quantity = (json["quantity"] as? Number)?.toInt() ?: 0, quantityIOS = (json["quantityIOS"] as? Number)?.toInt(), @@ -3490,7 +3490,7 @@ public data class PurchaseIOS( renewalInfoIOS = (json["renewalInfoIOS"] as? Map)?.let { RenewalInfoIOS.fromJson(it) }, revocationDateIOS = (json["revocationDateIOS"] as? Number)?.toDouble(), revocationReasonIOS = json["revocationReasonIOS"] as? String, - store = (json["store"] as? String)?.let { IapStore.fromJson(it) } ?: IapStore.Unknown, + store = runCatching { (json["store"] as? String)?.let { IapStore.fromJson(it) } }.getOrNull() ?: IapStore.Unknown, storefrontCountryCodeIOS = json["storefrontCountryCodeIOS"] as? String, subscriptionGroupIdIOS = json["subscriptionGroupIdIOS"] as? String, transactionDate = (json["transactionDate"] as? Number)?.toDouble() ?: 0.0, @@ -3601,7 +3601,7 @@ public data class RenewalCommitmentInfoIOS( return RenewalCommitmentInfoIOS( commitmentAutoRenewProductId = json["commitmentAutoRenewProductId"] as? String ?: "", commitmentAutoRenewStatus = json["commitmentAutoRenewStatus"] as? Boolean ?: false, - commitmentRenewalBillingPlanType = (json["commitmentRenewalBillingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } ?: SubscriptionBillingPlanTypeIOS.Unknown, + commitmentRenewalBillingPlanType = runCatching { (json["commitmentRenewalBillingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, commitmentRenewalDate = (json["commitmentRenewalDate"] as? Number)?.toDouble() ?: 0.0, commitmentRenewalPrice = (json["commitmentRenewalPrice"] as? Number)?.toDouble() ?: 0.0, ) @@ -3687,7 +3687,7 @@ public data class RenewalInfoIOS( jsonRepresentation = json["jsonRepresentation"] as? String, pendingUpgradeProductId = json["pendingUpgradeProductId"] as? String, priceIncreaseStatus = json["priceIncreaseStatus"] as? String, - renewalBillingPlanType = (json["renewalBillingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) }, + renewalBillingPlanType = runCatching { (json["renewalBillingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, renewalDate = (json["renewalDate"] as? Number)?.toDouble(), renewalOfferId = json["renewalOfferId"] as? String, renewalOfferType = json["renewalOfferType"] as? String, @@ -3768,8 +3768,8 @@ public data class RequestVerifyPurchaseWithIapkitResult( fun fromJson(json: Map): RequestVerifyPurchaseWithIapkitResult { return RequestVerifyPurchaseWithIapkitResult( isValid = json["isValid"] as? Boolean ?: false, - state = (json["state"] as? String)?.let { IapkitPurchaseState.fromJson(it) } ?: IapkitPurchaseState.Entitled, - store = (json["store"] as? String)?.let { IapStore.fromJson(it) } ?: IapStore.Unknown, + state = runCatching { (json["state"] as? String)?.let { IapkitPurchaseState.fromJson(it) } }.getOrNull() ?: IapkitPurchaseState.Unknown, + store = runCatching { (json["store"] as? String)?.let { IapStore.fromJson(it) } }.getOrNull() ?: IapStore.Unknown, ) } } @@ -3951,7 +3951,7 @@ public data class SubscriptionOffer( numberOfPeriodsIOS = (json["numberOfPeriodsIOS"] as? Number)?.toInt(), offerTagsAndroid = (json["offerTagsAndroid"] as? List<*>)?.mapNotNull { it as? String }, offerTokenAndroid = json["offerTokenAndroid"] as? String, - paymentMode = (json["paymentMode"] as? String)?.let { PaymentMode.fromJson(it) }, + paymentMode = runCatching { (json["paymentMode"] as? String)?.let { PaymentMode.fromJson(it) } }.getOrNull() ?: PaymentMode.Unknown, period = (json["period"] as? Map)?.let { SubscriptionPeriod.fromJson(it) }, periodCount = (json["periodCount"] as? Number)?.toInt(), price = (json["price"] as? Number)?.toDouble() ?: 0.0, @@ -4045,7 +4045,7 @@ public data class SubscriptionPeriod( companion object { fun fromJson(json: Map): SubscriptionPeriod { return SubscriptionPeriod( - unit = (json["unit"] as? String)?.let { SubscriptionPeriodUnit.fromJson(it) } ?: SubscriptionPeriodUnit.Day, + unit = runCatching { (json["unit"] as? String)?.let { SubscriptionPeriodUnit.fromJson(it) } }.getOrNull() ?: SubscriptionPeriodUnit.Unknown, value = (json["value"] as? Number)?.toInt() ?: 0, ) } @@ -4093,7 +4093,7 @@ public data class SubscriptionPricingTermsIOS( return SubscriptionPricingTermsIOS( billingDisplayPrice = json["billingDisplayPrice"] as? String ?: "", billingPeriod = (json["billingPeriod"] as? Map)?.let { SubscriptionPeriodValueIOS.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionPeriodValueIOS"), - billingPlanType = (json["billingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } ?: SubscriptionBillingPlanTypeIOS.Unknown, + billingPlanType = runCatching { (json["billingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, billingPrice = (json["billingPrice"] as? Number)?.toDouble() ?: 0.0, commitmentInfo = (json["commitmentInfo"] as? Map)?.let { SubscriptionCommitmentInfoIOS.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionCommitmentInfoIOS"), subscriptionOffers = (json["subscriptionOffers"] as? List<*>)?.mapNotNull { (it as? Map)?.let { SubscriptionOffer.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionOffer") }, @@ -4501,7 +4501,7 @@ public data class WebhookEvent( receivedAt = (json["receivedAt"] as? Number)?.toDouble() ?: 0.0, renewsAt = (json["renewsAt"] as? Number)?.toDouble(), source = (json["source"] as? String)?.let { WebhookEventSource.fromJson(it) } ?: WebhookEventSource.AppleAppStoreServerNotificationsV2, - subscriptionState = (json["subscriptionState"] as? String)?.let { SubscriptionState.fromJson(it) }, + subscriptionState = runCatching { (json["subscriptionState"] as? String)?.let { SubscriptionState.fromJson(it) } }.getOrNull() ?: SubscriptionState.Unknown, type = (json["type"] as? String)?.let { WebhookEventType.fromJson(it) } ?: WebhookEventType.SubscriptionStarted, ) } @@ -4567,7 +4567,7 @@ public data class BillingProgramInformationDialogParamsAndroid( /** * Billing program. Currently only BILLING_CHOICE is supported. */ - val billingProgram: BillingProgramAndroid, + val billingProgram: BillingProgramAndroid = BillingProgramAndroid.BillingChoice, /** * External transaction token returned by the Billing Choice reporting-details flow. */ @@ -4575,7 +4575,7 @@ public data class BillingProgramInformationDialogParamsAndroid( ) { companion object { fun fromJson(json: Map): BillingProgramInformationDialogParamsAndroid? { - val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified + val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.BillingChoice val externalTransactionToken = json["externalTransactionToken"] as? String if (externalTransactionToken == null) return null return BillingProgramInformationDialogParamsAndroid( @@ -4713,25 +4713,22 @@ public data class GetBillingChoiceInfoParamsAndroid( /** * Billing program. Currently only BILLING_CHOICE is supported. */ - val billingProgram: BillingProgramAndroid, + val billingProgram: BillingProgramAndroid = BillingProgramAndroid.BillingChoice, /** * Desired Play Billing choice image layout. */ - val playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid, + val playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid = BillingChoiceImageLayoutAndroid.RectangularFourByOne, /** * BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. */ val userLocale: String? = null ) { companion object { - fun fromJson(json: Map): GetBillingChoiceInfoParamsAndroid? { - val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified - val playBillingChoiceImageLayout = (json["playBillingChoiceImageLayout"] as? String)?.let { BillingChoiceImageLayoutAndroid.fromJson(it) } ?: BillingChoiceImageLayoutAndroid.RectangularFourByOne - val userLocale = json["userLocale"] as? String + fun fromJson(json: Map): GetBillingChoiceInfoParamsAndroid { return GetBillingChoiceInfoParamsAndroid( - billingProgram = billingProgram, - playBillingChoiceImageLayout = playBillingChoiceImageLayout, - userLocale = userLocale, + billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.BillingChoice, + playBillingChoiceImageLayout = (json["playBillingChoiceImageLayout"] as? String)?.let { BillingChoiceImageLayoutAndroid.fromJson(it) } ?: BillingChoiceImageLayoutAndroid.RectangularFourByOne, + userLocale = json["userLocale"] as? String, ) } } @@ -4751,12 +4748,12 @@ public data class InAppMessageParamsAndroid( /** * In-app message categories to show. Defaults to transactional messages. */ - val categories: List? = null + val categories: List? = listOf(InAppMessageCategoryAndroid.Transactional) ) { companion object { fun fromJson(json: Map): InAppMessageParamsAndroid { return InAppMessageParamsAndroid( - categories = (json["categories"] as? List<*>)?.mapNotNull { (it as? String)?.let { InAppMessageCategoryAndroid.fromJson(it) } ?: InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId }, + categories = (json["categories"] as? List<*>)?.mapNotNull { runCatching { (it as? String)?.let { InAppMessageCategoryAndroid.fromJson(it) } }.getOrNull() ?: InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId } ?: listOf(InAppMessageCategoryAndroid.Transactional), ) } } @@ -4851,12 +4848,12 @@ public data class LaunchExternalLinkParamsAndroid( public data class ProductRequest( val skus: List, - val type: ProductQueryType? = null + val type: ProductQueryType? = ProductQueryType.InApp ) { companion object { fun fromJson(json: Map): ProductRequest? { val skus = (json["skus"] as? List<*>)?.mapNotNull { it as? String } - val type = (json["type"] as? String)?.let { ProductQueryType.fromJson(it) } + val type = (json["type"] as? String)?.let { ProductQueryType.fromJson(it) } ?: ProductQueryType.InApp if (skus == null) return null return ProductRequest( skus = skus, @@ -5314,7 +5311,7 @@ public data class RequestSubscriptionIosProps( val advancedCommerceData = json["advancedCommerceData"] as? String val andDangerouslyFinishTransactionAutomatically = json["andDangerouslyFinishTransactionAutomatically"] as? Boolean val appAccountToken = json["appAccountToken"] as? String - val billingPlanType = (json["billingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } + val billingPlanType = runCatching { (json["billingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown val compactJWS = json["compactJWS"] as? String val promotionalOfferJWS = (json["promotionalOfferJWS"] as? Map)?.let { PromotionalOfferJWSInputIOS.fromJson(it) } val quantity = (json["quantity"] as? Number)?.toInt() @@ -5536,7 +5533,7 @@ public data class SubscriptionProductReplacementParamsAndroid( companion object { fun fromJson(json: Map): SubscriptionProductReplacementParamsAndroid? { val oldProductId = json["oldProductId"] as? String - val replacementMode = (json["replacementMode"] as? String)?.let { SubscriptionReplacementModeAndroid.fromJson(it) } ?: SubscriptionReplacementModeAndroid.UnknownReplacementMode + val replacementMode = runCatching { (json["replacementMode"] as? String)?.let { SubscriptionReplacementModeAndroid.fromJson(it) } }.getOrNull() ?: SubscriptionReplacementModeAndroid.UnknownReplacementMode if (oldProductId == null) return null return SubscriptionProductReplacementParamsAndroid( oldProductId = oldProductId, @@ -5891,6 +5888,8 @@ public interface MutationResolver { * Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). * Replaces the deprecated createExternalOfferReportingDetailsAsync API. * Returns external transaction token needed for reporting external transactions. + * developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, + * native Android defaults it to IN_APP. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ diff --git a/libraries/maui-iap/android/openiap/src/main/java/dev/hyo/openiap/maui/OpenIapMauiModule.kt b/libraries/maui-iap/android/openiap/src/main/java/dev/hyo/openiap/maui/OpenIapMauiModule.kt index 363b2957d..df0f4e3b4 100644 --- a/libraries/maui-iap/android/openiap/src/main/java/dev/hyo/openiap/maui/OpenIapMauiModule.kt +++ b/libraries/maui-iap/android/openiap/src/main/java/dev/hyo/openiap/maui/OpenIapMauiModule.kt @@ -223,14 +223,11 @@ class OpenIapMauiModule(context: Context) { fun getBillingChoiceInfoAndroid(paramsJson: String, callback: ResultCallback) = run(callback) { val params = GetBillingChoiceInfoParamsAndroid.fromJson(parseMap(paramsJson)) - ?: throw badInput("GetBillingChoiceInfoParamsAndroid") gson.toJson(module.getBillingChoiceInfo(params).toJson()) } - fun createBillingProgramReportingDetailsAndroid(programJson: String, callback: ResultCallback) = run(callback) { - val program = parseProgram(programJson) - gson.toJson(module.createBillingProgramReportingDetails(program).toJson()) - } + fun createBillingProgramReportingDetailsAndroid(programJson: String, callback: ResultCallback) = + createBillingProgramReportingDetailsAndroidWithType(programJson, null, callback) fun createBillingProgramReportingDetailsAndroidWithType( programJson: String, diff --git a/libraries/maui-iap/src/OpenIap.Maui/Types.cs b/libraries/maui-iap/src/OpenIap.Maui/Types.cs index e04ac493d..9acce4555 100644 --- a/libraries/maui-iap/src/OpenIap.Maui/Types.cs +++ b/libraries/maui-iap/src/OpenIap.Maui/Types.cs @@ -4084,7 +4084,7 @@ public sealed record BillingProgramInformationDialogParamsAndroid { /// Billing program. Currently only BILLING_CHOICE is supported. [JsonPropertyName("billingProgram")] - public required BillingProgramAndroid BillingProgram { get; init; } + public BillingProgramAndroid BillingProgram { get; init; } = BillingProgramAndroid.BillingChoice; /// External transaction token returned by the Billing Choice reporting-details flow. [JsonPropertyName("externalTransactionToken")] public required string ExternalTransactionToken { get; init; } @@ -4141,10 +4141,10 @@ public sealed record GetBillingChoiceInfoParamsAndroid { /// Billing program. Currently only BILLING_CHOICE is supported. [JsonPropertyName("billingProgram")] - public required BillingProgramAndroid BillingProgram { get; init; } + public BillingProgramAndroid BillingProgram { get; init; } = BillingProgramAndroid.BillingChoice; /// Desired Play Billing choice image layout. [JsonPropertyName("playBillingChoiceImageLayout")] - public required BillingChoiceImageLayoutAndroid PlayBillingChoiceImageLayout { get; init; } + public BillingChoiceImageLayoutAndroid PlayBillingChoiceImageLayout { get; init; } = BillingChoiceImageLayoutAndroid.RectangularFourByOne; /// BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. [JsonPropertyName("userLocale")] public string? UserLocale { get; init; } @@ -4156,7 +4156,7 @@ public sealed record InAppMessageParamsAndroid { /// In-app message categories to show. Defaults to transactional messages. [JsonPropertyName("categories")] - public IReadOnlyList? Categories { get; init; } + public IReadOnlyList? Categories { get; init; } = new List { InAppMessageCategoryAndroid.Transactional }; } /// Connection initialization configuration @@ -4202,7 +4202,7 @@ public sealed record ProductRequest [JsonPropertyName("skus")] public required IReadOnlyList Skus { get; init; } [JsonPropertyName("type")] - public ProductQueryType? Type { get; init; } + public ProductQueryType? Type { get; init; } = ProductQueryType.InApp; } /// JWS promotional offer input for iOS 15+ (StoreKit 2, WWDC 2025). @@ -4634,6 +4634,8 @@ public interface MutationResolver /// Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). /// Replaces the deprecated createExternalOfferReportingDetailsAsync API. /// Returns external transaction token needed for reporting external transactions. + /// developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, + /// native Android defaults it to IN_APP. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android Task CreateBillingProgramReportingDetailsAndroidAsync(BillingProgramAndroid program, DeveloperBillingTypeAndroid? developerBillingType = null); diff --git a/libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt b/libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt index 6d22cfbce..600de0398 100644 --- a/libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt +++ b/libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt @@ -63,7 +63,7 @@ import org.json.JSONObject * Custom exception for OpenIAP errors that only includes the error JSON without stack traces. * This ensures clean error messages are passed to JavaScript without Java/Kotlin stack traces. */ -class OpenIapException(private val errorJson: String) : Exception() { +class OpenIapException(private val errorJson: String, cause: Throwable? = null) : Exception(cause) { override val message: String get() = errorJson @@ -1497,7 +1497,7 @@ class HybridRnIap : HybridRnIapSpec() { } catch (err: Throwable) { RnIapLog.failure("checkAlternativeBillingAvailabilityAndroid", err) val errorType = parseOpenIapError(err) - throw OpenIapException(toErrorJson(errorType, debugMessage = err.message)) + throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err) } } } @@ -1519,7 +1519,7 @@ class HybridRnIap : HybridRnIapSpec() { } catch (err: Throwable) { RnIapLog.failure("showAlternativeBillingDialogAndroid", err) val errorType = parseOpenIapError(err) - throw OpenIapException(toErrorJson(errorType, debugMessage = err.message)) + throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err) } } } @@ -1540,7 +1540,7 @@ class HybridRnIap : HybridRnIapSpec() { } catch (err: Throwable) { RnIapLog.failure("createAlternativeBillingTokenAndroid", err) val errorType = parseOpenIapError(err) - throw OpenIapException(toErrorJson(errorType, debugMessage = err.message)) + throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err) } } } @@ -1669,7 +1669,7 @@ class HybridRnIap : HybridRnIapSpec() { } catch (err: Throwable) { RnIapLog.failure("isBillingProgramAvailableAndroid", err) val errorType = parseOpenIapError(err) - throw OpenIapException(toErrorJson(errorType, debugMessage = err.message)) + throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err) } } } @@ -1699,7 +1699,7 @@ class HybridRnIap : HybridRnIapSpec() { } catch (err: Throwable) { RnIapLog.failure("getBillingChoiceInfoAndroid", err) val errorType = parseOpenIapError(err) - throw OpenIapException(toErrorJson(errorType, debugMessage = err.message)) + throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err) } } } @@ -1729,7 +1729,7 @@ class HybridRnIap : HybridRnIapSpec() { } catch (err: Throwable) { RnIapLog.failure("createBillingProgramReportingDetailsAndroid", err) val errorType = parseOpenIapError(err) - throw OpenIapException(toErrorJson(errorType, debugMessage = err.message)) + throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err) } } } @@ -1761,7 +1761,7 @@ class HybridRnIap : HybridRnIapSpec() { } catch (err: Throwable) { RnIapLog.failure("showBillingProgramInformationDialogAndroid", err) val errorType = parseOpenIapError(err) - throw OpenIapException(toErrorJson(errorType, debugMessage = err.message)) + throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err) } } } @@ -1796,7 +1796,7 @@ class HybridRnIap : HybridRnIapSpec() { } catch (err: Throwable) { RnIapLog.failure("showInAppMessagesAndroid", err) val errorType = parseOpenIapError(err) - throw OpenIapException(toErrorJson(errorType, debugMessage = err.message)) + throw OpenIapException(toErrorJson(errorType, debugMessage = err.message), err) } } } diff --git a/libraries/react-native-iap/src/__tests__/index.test.ts b/libraries/react-native-iap/src/__tests__/index.test.ts index c1a902311..5d452c9ed 100644 --- a/libraries/react-native-iap/src/__tests__/index.test.ts +++ b/libraries/react-native-iap/src/__tests__/index.test.ts @@ -2222,6 +2222,9 @@ describe('Public API (src/index.ts)', () => { await expect( IAP.createBillingProgramReportingDetailsAndroid('external-offer'), ).rejects.toThrow('Billing Programs API is only supported on Android'); + expect( + mockIap.createBillingProgramReportingDetailsAndroid, + ).not.toHaveBeenCalled(); }); it('should handle native errors', async () => { @@ -2289,6 +2292,18 @@ describe('Public API (src/index.ts)', () => { }); expect(result.responseCode).toBe(0); }); + + it('should throw on non-Android', async () => { + (Platform as any).OS = 'ios'; + await expect( + IAP.showBillingProgramInformationDialogAndroid({ + externalTransactionToken: 'choice-token-123', + }), + ).rejects.toThrow('Billing Choice API is only supported on Android'); + expect( + mockIap.showBillingProgramInformationDialogAndroid, + ).not.toHaveBeenCalled(); + }); }); describe('showInAppMessagesAndroid', () => { @@ -2303,6 +2318,14 @@ describe('Public API (src/index.ts)', () => { }); expect(result.responseCode).toBe('no-action-needed'); }); + + it('should throw on non-Android', async () => { + (Platform as any).OS = 'ios'; + await expect( + IAP.showInAppMessagesAndroid({categories: ['transactional']}), + ).rejects.toThrow('In-app messages are only supported on Android'); + expect(mockIap.showInAppMessagesAndroid).not.toHaveBeenCalled(); + }); }); describe('launchExternalLinkAndroid', () => { diff --git a/libraries/react-native-iap/src/types.ts b/libraries/react-native-iap/src/types.ts index 6c2b36866..8e553b2a7 100644 --- a/libraries/react-native-iap/src/types.ts +++ b/libraries/react-native-iap/src/types.ts @@ -718,6 +718,8 @@ export interface Mutation { * Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). * Replaces the deprecated createExternalOfferReportingDetailsAsync API. * Returns external transaction token needed for reporting external transactions. + * developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, + * native Android defaults it to IN_APP. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ diff --git a/packages/apple/Sources/Models/Types.swift b/packages/apple/Sources/Models/Types.swift index 952083007..742657cb0 100644 --- a/packages/apple/Sources/Models/Types.swift +++ b/packages/apple/Sources/Models/Types.swift @@ -1637,7 +1637,7 @@ public struct BillingProgramInformationDialogParamsAndroid: Codable { public var externalTransactionToken: String public init( - billingProgram: BillingProgramAndroid, + billingProgram: BillingProgramAndroid = .billingChoice, externalTransactionToken: String ) { self.billingProgram = billingProgram @@ -1744,8 +1744,8 @@ public struct GetBillingChoiceInfoParamsAndroid: Codable { public var userLocale: String? public init( - billingProgram: BillingProgramAndroid, - playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid, + billingProgram: BillingProgramAndroid = .billingChoice, + playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid = .rectangularFourByOne, userLocale: String? = nil ) { self.billingProgram = billingProgram @@ -1761,7 +1761,7 @@ public struct InAppMessageParamsAndroid: Codable { public var categories: [InAppMessageCategoryAndroid]? public init( - categories: [InAppMessageCategoryAndroid]? = nil + categories: [InAppMessageCategoryAndroid]? = [.transactional] ) { self.categories = categories } @@ -1823,7 +1823,7 @@ public struct ProductRequest: Codable { public init( skus: [String], - type: ProductQueryType? = nil + type: ProductQueryType? = .inApp ) { self.skus = skus self.type = type @@ -2747,6 +2747,8 @@ public protocol MutationResolver { /// Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). /// Replaces the deprecated createExternalOfferReportingDetailsAsync API. /// Returns external transaction token needed for reporting external transactions. + /// developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, + /// native Android defaults it to IN_APP. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android func createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid, developerBillingType: DeveloperBillingTypeAndroid?) async throws -> BillingProgramReportingDetailsAndroid diff --git a/packages/google/openiap/src/amazon/java/dev/hyo/openiap/OpenIapModule.kt b/packages/google/openiap/src/amazon/java/dev/hyo/openiap/OpenIapModule.kt index c1742fa90..90d538017 100644 --- a/packages/google/openiap/src/amazon/java/dev/hyo/openiap/OpenIapModule.kt +++ b/packages/google/openiap/src/amazon/java/dev/hyo/openiap/OpenIapModule.kt @@ -672,18 +672,16 @@ class OpenIapModule( override suspend fun showBillingProgramInformationDialog( activity: Activity, params: BillingProgramInformationDialogParamsAndroid - ): BillingResultAndroid = BillingResultAndroid( - responseCode = 2, - debugMessage = "Amazon Appstore does not support Google Play Billing Choice" - ) + ): BillingResultAndroid { + throw OpenIapError.FeatureNotSupported("Amazon Appstore does not support Google Play Billing Choice") + } override suspend fun showInAppMessages( activity: Activity, params: InAppMessageParamsAndroid? - ): InAppMessageResultAndroid = InAppMessageResultAndroid( - responseCode = InAppMessageResponseCodeAndroid.NoActionNeeded, - purchaseToken = null - ) + ): InAppMessageResultAndroid { + throw OpenIapError.FeatureNotSupported("Amazon Appstore does not support Google Play billing in-app messages") + } override fun onUserDataResponse(userDataResponse: UserDataResponse) { updateStorefront(userDataResponse.userData) diff --git a/packages/google/openiap/src/horizon/java/dev/hyo/openiap/OpenIapModule.kt b/packages/google/openiap/src/horizon/java/dev/hyo/openiap/OpenIapModule.kt index 4e223aa3c..8b6e10283 100644 --- a/packages/google/openiap/src/horizon/java/dev/hyo/openiap/OpenIapModule.kt +++ b/packages/google/openiap/src/horizon/java/dev/hyo/openiap/OpenIapModule.kt @@ -1215,10 +1215,7 @@ class OpenIapModule( params: BillingProgramInformationDialogParamsAndroid ): BillingResultAndroid { OpenIapLog.w("showBillingProgramInformationDialog is not supported on Meta Horizon", TAG) - return BillingResultAndroid( - responseCode = 2, - debugMessage = "Meta Horizon does not support Google Play Billing Choice" - ) + throw OpenIapError.FeatureNotSupported("Meta Horizon does not support Google Play Billing Choice") } override suspend fun showInAppMessages( @@ -1226,9 +1223,6 @@ class OpenIapModule( params: InAppMessageParamsAndroid? ): InAppMessageResultAndroid { OpenIapLog.w("showInAppMessages is not supported on Meta Horizon", TAG) - return InAppMessageResultAndroid( - responseCode = InAppMessageResponseCodeAndroid.NoActionNeeded, - purchaseToken = null - ) + throw OpenIapError.FeatureNotSupported("Meta Horizon does not support Google Play billing in-app messages") } } diff --git a/packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt b/packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt index 660e25790..9fa46292f 100644 --- a/packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt +++ b/packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt @@ -2696,7 +2696,7 @@ public data class ProductAndroid( oneTimePurchaseOfferDetailsAndroid = (json["oneTimePurchaseOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductAndroidOneTimePurchaseOfferDetail.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductAndroidOneTimePurchaseOfferDetail") }, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, price = (json["price"] as? Number)?.toDouble(), - productStatusAndroid = (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) }, + productStatusAndroid = runCatching { (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) } }.getOrNull() ?: ProductStatusAndroid.Unknown, subscriptionOfferDetailsAndroid = (json["subscriptionOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductSubscriptionAndroidOfferDetails.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductSubscriptionAndroidOfferDetails") }, subscriptionOffers = (json["subscriptionOffers"] as? List<*>)?.mapNotNull { (it as? Map)?.let { SubscriptionOffer.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionOffer") }, title = json["title"] as? String ?: "", @@ -2958,7 +2958,7 @@ public data class ProductSubscriptionAndroid( oneTimePurchaseOfferDetailsAndroid = (json["oneTimePurchaseOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductAndroidOneTimePurchaseOfferDetail.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductAndroidOneTimePurchaseOfferDetail") }, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, price = (json["price"] as? Number)?.toDouble(), - productStatusAndroid = (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) }, + productStatusAndroid = runCatching { (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) } }.getOrNull() ?: ProductStatusAndroid.Unknown, subscriptionOfferDetailsAndroid = (json["subscriptionOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductSubscriptionAndroidOfferDetails.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductSubscriptionAndroidOfferDetails") } ?: emptyList(), subscriptionOffers = (json["subscriptionOffers"] as? List<*>)?.mapNotNull { (it as? Map)?.let { SubscriptionOffer.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionOffer") } ?: emptyList(), title = json["title"] as? String ?: "", @@ -3201,11 +3201,11 @@ public data class PurchaseAndroid( pendingPurchaseUpdateAndroid = (json["pendingPurchaseUpdateAndroid"] as? Map)?.let { PendingPurchaseUpdateAndroid.fromJson(it) }, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, productId = json["productId"] as? String ?: "", - purchaseState = (json["purchaseState"] as? String)?.let { PurchaseState.fromJson(it) } ?: PurchaseState.Pending, + purchaseState = runCatching { (json["purchaseState"] as? String)?.let { PurchaseState.fromJson(it) } }.getOrNull() ?: PurchaseState.Unknown, purchaseToken = json["purchaseToken"] as? String, quantity = (json["quantity"] as? Number)?.toInt() ?: 0, signatureAndroid = json["signatureAndroid"] as? String, - store = (json["store"] as? String)?.let { IapStore.fromJson(it) } ?: IapStore.Unknown, + store = runCatching { (json["store"] as? String)?.let { IapStore.fromJson(it) } }.getOrNull() ?: IapStore.Unknown, transactionDate = (json["transactionDate"] as? Number)?.toDouble() ?: 0.0, transactionId = json["transactionId"] as? String, ) @@ -3253,7 +3253,7 @@ public data class PurchaseError( companion object { fun fromJson(json: Map): PurchaseError { return PurchaseError( - code = (json["code"] as? String)?.let { ErrorCode.fromJson(it) } ?: ErrorCode.Unknown, + code = runCatching { (json["code"] as? String)?.let { ErrorCode.fromJson(it) } }.getOrNull() ?: ErrorCode.Unknown, debugMessage = json["debugMessage"] as? String, isEmptyProductList = json["isEmptyProductList"] as? Boolean, message = json["message"] as? String ?: "", @@ -3338,7 +3338,7 @@ public data class PurchaseIOS( advancedCommerceInfoIOS = (json["advancedCommerceInfoIOS"] as? Map)?.let { AdvancedCommerceInfoIOS.fromJson(it) }, appAccountToken = json["appAccountToken"] as? String, appBundleIdIOS = json["appBundleIdIOS"] as? String, - billingPlanTypeIOS = (json["billingPlanTypeIOS"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) }, + billingPlanTypeIOS = runCatching { (json["billingPlanTypeIOS"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, commitmentInfoIOS = (json["commitmentInfoIOS"] as? Map)?.let { TransactionCommitmentInfoIOS.fromJson(it) }, countryCodeIOS = json["countryCodeIOS"] as? String, currencyCodeIOS = json["currencyCodeIOS"] as? String, @@ -3356,7 +3356,7 @@ public data class PurchaseIOS( ownershipTypeIOS = json["ownershipTypeIOS"] as? String, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, productId = json["productId"] as? String ?: "", - purchaseState = (json["purchaseState"] as? String)?.let { PurchaseState.fromJson(it) } ?: PurchaseState.Pending, + purchaseState = runCatching { (json["purchaseState"] as? String)?.let { PurchaseState.fromJson(it) } }.getOrNull() ?: PurchaseState.Unknown, purchaseToken = json["purchaseToken"] as? String, quantity = (json["quantity"] as? Number)?.toInt() ?: 0, quantityIOS = (json["quantityIOS"] as? Number)?.toInt(), @@ -3365,7 +3365,7 @@ public data class PurchaseIOS( renewalInfoIOS = (json["renewalInfoIOS"] as? Map)?.let { RenewalInfoIOS.fromJson(it) }, revocationDateIOS = (json["revocationDateIOS"] as? Number)?.toDouble(), revocationReasonIOS = json["revocationReasonIOS"] as? String, - store = (json["store"] as? String)?.let { IapStore.fromJson(it) } ?: IapStore.Unknown, + store = runCatching { (json["store"] as? String)?.let { IapStore.fromJson(it) } }.getOrNull() ?: IapStore.Unknown, storefrontCountryCodeIOS = json["storefrontCountryCodeIOS"] as? String, subscriptionGroupIdIOS = json["subscriptionGroupIdIOS"] as? String, transactionDate = (json["transactionDate"] as? Number)?.toDouble() ?: 0.0, @@ -3476,7 +3476,7 @@ public data class RenewalCommitmentInfoIOS( return RenewalCommitmentInfoIOS( commitmentAutoRenewProductId = json["commitmentAutoRenewProductId"] as? String ?: "", commitmentAutoRenewStatus = json["commitmentAutoRenewStatus"] as? Boolean ?: false, - commitmentRenewalBillingPlanType = (json["commitmentRenewalBillingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } ?: SubscriptionBillingPlanTypeIOS.Unknown, + commitmentRenewalBillingPlanType = runCatching { (json["commitmentRenewalBillingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, commitmentRenewalDate = (json["commitmentRenewalDate"] as? Number)?.toDouble() ?: 0.0, commitmentRenewalPrice = (json["commitmentRenewalPrice"] as? Number)?.toDouble() ?: 0.0, ) @@ -3562,7 +3562,7 @@ public data class RenewalInfoIOS( jsonRepresentation = json["jsonRepresentation"] as? String, pendingUpgradeProductId = json["pendingUpgradeProductId"] as? String, priceIncreaseStatus = json["priceIncreaseStatus"] as? String, - renewalBillingPlanType = (json["renewalBillingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) }, + renewalBillingPlanType = runCatching { (json["renewalBillingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, renewalDate = (json["renewalDate"] as? Number)?.toDouble(), renewalOfferId = json["renewalOfferId"] as? String, renewalOfferType = json["renewalOfferType"] as? String, @@ -3643,8 +3643,8 @@ public data class RequestVerifyPurchaseWithIapkitResult( fun fromJson(json: Map): RequestVerifyPurchaseWithIapkitResult { return RequestVerifyPurchaseWithIapkitResult( isValid = json["isValid"] as? Boolean ?: false, - state = (json["state"] as? String)?.let { IapkitPurchaseState.fromJson(it) } ?: IapkitPurchaseState.Entitled, - store = (json["store"] as? String)?.let { IapStore.fromJson(it) } ?: IapStore.Unknown, + state = runCatching { (json["state"] as? String)?.let { IapkitPurchaseState.fromJson(it) } }.getOrNull() ?: IapkitPurchaseState.Unknown, + store = runCatching { (json["store"] as? String)?.let { IapStore.fromJson(it) } }.getOrNull() ?: IapStore.Unknown, ) } } @@ -3826,7 +3826,7 @@ public data class SubscriptionOffer( numberOfPeriodsIOS = (json["numberOfPeriodsIOS"] as? Number)?.toInt(), offerTagsAndroid = (json["offerTagsAndroid"] as? List<*>)?.mapNotNull { it as? String }, offerTokenAndroid = json["offerTokenAndroid"] as? String, - paymentMode = (json["paymentMode"] as? String)?.let { PaymentMode.fromJson(it) }, + paymentMode = runCatching { (json["paymentMode"] as? String)?.let { PaymentMode.fromJson(it) } }.getOrNull() ?: PaymentMode.Unknown, period = (json["period"] as? Map)?.let { SubscriptionPeriod.fromJson(it) }, periodCount = (json["periodCount"] as? Number)?.toInt(), price = (json["price"] as? Number)?.toDouble() ?: 0.0, @@ -3920,7 +3920,7 @@ public data class SubscriptionPeriod( companion object { fun fromJson(json: Map): SubscriptionPeriod { return SubscriptionPeriod( - unit = (json["unit"] as? String)?.let { SubscriptionPeriodUnit.fromJson(it) } ?: SubscriptionPeriodUnit.Day, + unit = runCatching { (json["unit"] as? String)?.let { SubscriptionPeriodUnit.fromJson(it) } }.getOrNull() ?: SubscriptionPeriodUnit.Unknown, value = (json["value"] as? Number)?.toInt() ?: 0, ) } @@ -3968,7 +3968,7 @@ public data class SubscriptionPricingTermsIOS( return SubscriptionPricingTermsIOS( billingDisplayPrice = json["billingDisplayPrice"] as? String ?: "", billingPeriod = (json["billingPeriod"] as? Map)?.let { SubscriptionPeriodValueIOS.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionPeriodValueIOS"), - billingPlanType = (json["billingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } ?: SubscriptionBillingPlanTypeIOS.Unknown, + billingPlanType = runCatching { (json["billingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, billingPrice = (json["billingPrice"] as? Number)?.toDouble() ?: 0.0, commitmentInfo = (json["commitmentInfo"] as? Map)?.let { SubscriptionCommitmentInfoIOS.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionCommitmentInfoIOS"), subscriptionOffers = (json["subscriptionOffers"] as? List<*>)?.mapNotNull { (it as? Map)?.let { SubscriptionOffer.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionOffer") }, @@ -4376,7 +4376,7 @@ public data class WebhookEvent( receivedAt = (json["receivedAt"] as? Number)?.toDouble() ?: 0.0, renewsAt = (json["renewsAt"] as? Number)?.toDouble(), source = (json["source"] as? String)?.let { WebhookEventSource.fromJson(it) } ?: WebhookEventSource.AppleAppStoreServerNotificationsV2, - subscriptionState = (json["subscriptionState"] as? String)?.let { SubscriptionState.fromJson(it) }, + subscriptionState = runCatching { (json["subscriptionState"] as? String)?.let { SubscriptionState.fromJson(it) } }.getOrNull() ?: SubscriptionState.Unknown, type = (json["type"] as? String)?.let { WebhookEventType.fromJson(it) } ?: WebhookEventType.SubscriptionStarted, ) } @@ -4442,7 +4442,7 @@ public data class BillingProgramInformationDialogParamsAndroid( /** * Billing program. Currently only BILLING_CHOICE is supported. */ - val billingProgram: BillingProgramAndroid, + val billingProgram: BillingProgramAndroid = BillingProgramAndroid.BillingChoice, /** * External transaction token returned by the Billing Choice reporting-details flow. */ @@ -4450,7 +4450,7 @@ public data class BillingProgramInformationDialogParamsAndroid( ) { companion object { fun fromJson(json: Map): BillingProgramInformationDialogParamsAndroid? { - val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified + val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.BillingChoice val externalTransactionToken = json["externalTransactionToken"] as? String if (externalTransactionToken == null) return null return BillingProgramInformationDialogParamsAndroid( @@ -4588,25 +4588,22 @@ public data class GetBillingChoiceInfoParamsAndroid( /** * Billing program. Currently only BILLING_CHOICE is supported. */ - val billingProgram: BillingProgramAndroid, + val billingProgram: BillingProgramAndroid = BillingProgramAndroid.BillingChoice, /** * Desired Play Billing choice image layout. */ - val playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid, + val playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid = BillingChoiceImageLayoutAndroid.RectangularFourByOne, /** * BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. */ val userLocale: String? = null ) { companion object { - fun fromJson(json: Map): GetBillingChoiceInfoParamsAndroid? { - val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified - val playBillingChoiceImageLayout = (json["playBillingChoiceImageLayout"] as? String)?.let { BillingChoiceImageLayoutAndroid.fromJson(it) } ?: BillingChoiceImageLayoutAndroid.RectangularFourByOne - val userLocale = json["userLocale"] as? String + fun fromJson(json: Map): GetBillingChoiceInfoParamsAndroid { return GetBillingChoiceInfoParamsAndroid( - billingProgram = billingProgram, - playBillingChoiceImageLayout = playBillingChoiceImageLayout, - userLocale = userLocale, + billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.BillingChoice, + playBillingChoiceImageLayout = (json["playBillingChoiceImageLayout"] as? String)?.let { BillingChoiceImageLayoutAndroid.fromJson(it) } ?: BillingChoiceImageLayoutAndroid.RectangularFourByOne, + userLocale = json["userLocale"] as? String, ) } } @@ -4626,12 +4623,12 @@ public data class InAppMessageParamsAndroid( /** * In-app message categories to show. Defaults to transactional messages. */ - val categories: List? = null + val categories: List? = listOf(InAppMessageCategoryAndroid.Transactional) ) { companion object { fun fromJson(json: Map): InAppMessageParamsAndroid { return InAppMessageParamsAndroid( - categories = (json["categories"] as? List<*>)?.mapNotNull { (it as? String)?.let { InAppMessageCategoryAndroid.fromJson(it) } ?: InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId }, + categories = (json["categories"] as? List<*>)?.mapNotNull { runCatching { (it as? String)?.let { InAppMessageCategoryAndroid.fromJson(it) } }.getOrNull() ?: InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId } ?: listOf(InAppMessageCategoryAndroid.Transactional), ) } } @@ -4726,12 +4723,12 @@ public data class LaunchExternalLinkParamsAndroid( public data class ProductRequest( val skus: List, - val type: ProductQueryType? = null + val type: ProductQueryType? = ProductQueryType.InApp ) { companion object { fun fromJson(json: Map): ProductRequest? { val skus = (json["skus"] as? List<*>)?.mapNotNull { it as? String } - val type = (json["type"] as? String)?.let { ProductQueryType.fromJson(it) } + val type = (json["type"] as? String)?.let { ProductQueryType.fromJson(it) } ?: ProductQueryType.InApp if (skus == null) return null return ProductRequest( skus = skus, @@ -5189,7 +5186,7 @@ public data class RequestSubscriptionIosProps( val advancedCommerceData = json["advancedCommerceData"] as? String val andDangerouslyFinishTransactionAutomatically = json["andDangerouslyFinishTransactionAutomatically"] as? Boolean val appAccountToken = json["appAccountToken"] as? String - val billingPlanType = (json["billingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } + val billingPlanType = runCatching { (json["billingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown val compactJWS = json["compactJWS"] as? String val promotionalOfferJWS = (json["promotionalOfferJWS"] as? Map)?.let { PromotionalOfferJWSInputIOS.fromJson(it) } val quantity = (json["quantity"] as? Number)?.toInt() @@ -5411,7 +5408,7 @@ public data class SubscriptionProductReplacementParamsAndroid( companion object { fun fromJson(json: Map): SubscriptionProductReplacementParamsAndroid? { val oldProductId = json["oldProductId"] as? String - val replacementMode = (json["replacementMode"] as? String)?.let { SubscriptionReplacementModeAndroid.fromJson(it) } ?: SubscriptionReplacementModeAndroid.UnknownReplacementMode + val replacementMode = runCatching { (json["replacementMode"] as? String)?.let { SubscriptionReplacementModeAndroid.fromJson(it) } }.getOrNull() ?: SubscriptionReplacementModeAndroid.UnknownReplacementMode if (oldProductId == null) return null return SubscriptionProductReplacementParamsAndroid( oldProductId = oldProductId, @@ -5766,6 +5763,8 @@ public interface MutationResolver { * Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). * Replaces the deprecated createExternalOfferReportingDetailsAsync API. * Returns external transaction token needed for reporting external transactions. + * developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, + * native Android defaults it to IN_APP. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ diff --git a/packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt b/packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt index 3d747cb3e..ce86cec93 100644 --- a/packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt +++ b/packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt @@ -1097,7 +1097,7 @@ class OpenIapModule( try { val paramsClass = Class.forName("com.android.billingclient.api.InAppMessageParams") val builderClass = Class.forName("com.android.billingclient.api.InAppMessageParams\$Builder") - val builder = builderClass.getConstructor().newInstance() + val builder = paramsClass.getMethod("newBuilder").invoke(null) val categories = params?.categories?.takeIf { it.isNotEmpty() } ?: listOf(InAppMessageCategoryAndroid.Transactional) @@ -1136,10 +1136,7 @@ class OpenIapModule( ).invoke(client, activity, requestParams, listener) as? BillingResult if (submitResult != null && submitResult.responseCode != BillingClient.BillingResponseCode.OK) { - resumer.resume(InAppMessageResultAndroid( - responseCode = InAppMessageResponseCodeAndroid.NoActionNeeded, - purchaseToken = null - )) + resumer.resumeWithException(OpenIapError.PurchaseFailed(submitResult.debugMessage)) } } catch (e: NoSuchMethodException) { OpenIapLog.e("showInAppMessages not found. Requires Billing Library 4.1.0+", e, TAG) diff --git a/packages/gql/codegen/core/transformer.ts b/packages/gql/codegen/core/transformer.ts index 36a538c9e..bb69332b7 100644 --- a/packages/gql/codegen/core/transformer.ts +++ b/packages/gql/codegen/core/transformer.ts @@ -23,6 +23,7 @@ import { type GraphQLField, type GraphQLInputField, type GraphQLArgument, + valueFromASTUntyped, } from 'graphql'; import type { IRSchema, @@ -288,6 +289,9 @@ export class SchemaTransformer { description: field.description ?? undefined, type: this.transformType(field.type), isOverride: false, + defaultValue: field.astNode?.defaultValue + ? valueFromASTUntyped(field.astNode.defaultValue) + : undefined, })); return { @@ -388,6 +392,9 @@ export class SchemaTransformer { description: field.description ?? undefined, type: this.transformType(field.type), isOverride: false, + defaultValue: field.astNode?.defaultValue + ? valueFromASTUntyped(field.astNode.defaultValue) + : undefined, })); const hasRequiredFields = graphqlFields.some( diff --git a/packages/gql/codegen/core/types.ts b/packages/gql/codegen/core/types.ts index 6ed0458bd..a6f9352ba 100644 --- a/packages/gql/codegen/core/types.ts +++ b/packages/gql/codegen/core/types.ts @@ -68,8 +68,8 @@ export interface IRField { type: IRType; /** Whether this field overrides an interface field */ isOverride: boolean; - /** Default value for discriminated unions (e.g., platform: 'ios') */ - defaultValue?: string; + /** Default value from SDL or generated discriminated union defaults. */ + defaultValue?: unknown; } // ============================================================================ diff --git a/packages/gql/codegen/plugins/csharp.ts b/packages/gql/codegen/plugins/csharp.ts index 9696f7972..f227ea6b0 100644 --- a/packages/gql/codegen/plugins/csharp.ts +++ b/packages/gql/codegen/plugins/csharp.ts @@ -409,7 +409,12 @@ export class CSharpPlugin extends CodegenPlugin { // `required` modifier so callers must initialize them; nullable // properties default to null. if (field.type.nullable) { - this.emit(` public ${propType} ${propName} { get; init; }`); + const defaultValue = this.buildDefaultValueExpression(field); + const initializer = defaultValue ? ` = ${defaultValue};` : ''; + this.emit(` public ${propType} ${propName} { get; init; }${initializer}`); + } else if (field.defaultValue !== undefined) { + const defaultValue = this.buildDefaultValueExpression(field); + this.emit(` public ${propType} ${propName} { get; init; }${defaultValue ? ` = ${defaultValue};` : ''}`); } else if (defaults && field.name === 'platform') { const defaultValue = `IapPlatform.${toPascalCasePreserveIOS(defaults.platform)}`; this.emit(` public ${propType} ${propName} { get; init; } = ${defaultValue};`); @@ -422,6 +427,32 @@ export class CSharpPlugin extends CodegenPlugin { }); } + private buildDefaultValueExpression(field: IRField): string | null { + if (field.defaultValue === undefined) return null; + return this.buildDefaultValueForType(field.type, field.defaultValue); + } + + private buildDefaultValueForType(type: IRType, defaultValue: unknown): string | null { + if (type.kind === 'list') { + if (!Array.isArray(defaultValue)) return null; + const itemType = this.mapType(type.elementType!); + const items = defaultValue + .map((value) => this.buildDefaultValueForType(type.elementType!, value)) + .filter((value): value is string => value !== null); + return `new List<${itemType}> { ${items.join(', ')} }`; + } + if (type.kind === 'enum' && typeof defaultValue === 'string') { + return `${type.name}.${this.enumValueCase(defaultValue)}`; + } + if (type.kind === 'scalar') { + if (typeof defaultValue === 'string') return `"${defaultValue}"`; + if (typeof defaultValue === 'number' || typeof defaultValue === 'boolean') { + return String(defaultValue).toLowerCase(); + } + } + return null; + } + private generateResultUnionObject(irObject: IRObject): void { this.emitDoc(irObject.description); const entries = [...irObject.resultUnionEntries!].sort((a, b) => diff --git a/packages/gql/codegen/plugins/dart.ts b/packages/gql/codegen/plugins/dart.ts index 07b8c961a..883fed1af 100644 --- a/packages/gql/codegen/plugins/dart.ts +++ b/packages/gql/codegen/plugins/dart.ts @@ -398,7 +398,10 @@ export class DartPlugin extends CodegenPlugin { const sortedFields = [...irInput.fields].sort((a, b) => a.name.localeCompare(b.name)); for (const field of sortedFields) { - if (field.type.nullable) { + const defaultValue = this.buildDefaultValueExpression(field); + if (defaultValue) { + this.emit(` this.${this.escapeKeyword(field.name)} = ${defaultValue},`); + } else if (field.type.nullable) { this.emit(` this.${this.escapeKeyword(field.name)},`); } else { this.emit(` required this.${this.escapeKeyword(field.name)},`); @@ -420,7 +423,11 @@ export class DartPlugin extends CodegenPlugin { this.emit(` factory ${irInput.name}.fromJson(Map json) {`); this.emit(` return ${irInput.name}(`); for (const field of sortedFields) { - const jsonExpr = this.buildFromJsonExpression(field.type, `json['${field.name}']`); + const jsonExpr = this.buildFromJsonExpression( + field.type, + `json['${field.name}']`, + this.buildDefaultValueExpression(field) + ); this.emit(` ${this.escapeKeyword(field.name)}: ${jsonExpr},`); } this.emit(' );'); @@ -828,11 +835,14 @@ export class DartPlugin extends CodegenPlugin { return this.getPropertyType(field.returnType); } - private buildFromJsonExpression(type: IRType, sourceExpr: string): string { + private buildFromJsonExpression(type: IRType, sourceExpr: string, defaultExpression?: string | null): string { if (type.kind === 'list') { const listCast = `(${sourceExpr} as List${type.nullable ? '?' : ''})`; const elementExpr = this.buildFromJsonExpression(type.elementType!, 'e'); const mapCall = (target: string) => `${target}.map((e) => ${elementExpr}).toList()`; + if (defaultExpression) { + return `${listCast} == null ? ${defaultExpression} : ${mapCall(`${listCast}${type.nullable ? '!' : ''}`)}`; + } if (type.nullable) { return `${listCast} == null ? null : ${mapCall(`${listCast}!`)}`; } @@ -842,15 +852,27 @@ export class DartPlugin extends CodegenPlugin { if (type.kind === 'scalar') { switch (type.name) { case 'Float': + if (defaultExpression) { + return `${sourceExpr} == null ? ${defaultExpression} : (${sourceExpr} as num).toDouble()`; + } return type.nullable ? `(${sourceExpr} as num?)?.toDouble()` : `(${sourceExpr} as num).toDouble()`; case 'Int': + if (defaultExpression) { + return `${sourceExpr} == null ? ${defaultExpression} : ${sourceExpr} as int`; + } return type.nullable ? `${sourceExpr} as int?` : `${sourceExpr} as int`; case 'Boolean': + if (defaultExpression) { + return `${sourceExpr} == null ? ${defaultExpression} : ${sourceExpr} as bool`; + } return type.nullable ? `${sourceExpr} as bool?` : `${sourceExpr} as bool`; case 'ID': case 'String': + if (defaultExpression) { + return `${sourceExpr} == null ? ${defaultExpression} : ${sourceExpr} as String`; + } return type.nullable ? `${sourceExpr} as String?` : `${sourceExpr} as String`; default: return sourceExpr; @@ -858,6 +880,9 @@ export class DartPlugin extends CodegenPlugin { } if (type.kind === 'enum') { + if (defaultExpression) { + return `${sourceExpr} != null ? ${type.name}.fromJson(${sourceExpr} as String) : ${defaultExpression}`; + } return type.nullable ? `${sourceExpr} != null ? ${type.name}.fromJson(${sourceExpr} as String) : null` : `${type.name}.fromJson(${sourceExpr} as String)`; @@ -872,6 +897,31 @@ export class DartPlugin extends CodegenPlugin { return sourceExpr; } + private buildDefaultValueExpression(field: IRField): string | null { + if (field.defaultValue === undefined) return null; + return this.buildDefaultValueForType(field.type, field.defaultValue); + } + + private buildDefaultValueForType(type: IRType, defaultValue: unknown): string | null { + if (type.kind === 'list') { + if (!Array.isArray(defaultValue)) return null; + const items = defaultValue + .map((value) => this.buildDefaultValueForType(type.elementType!, value)) + .filter((value): value is string => value !== null); + return `const [${items.join(', ')}]`; + } + if (type.kind === 'enum' && typeof defaultValue === 'string') { + return `${type.name}.${this.escapeKeyword(this.enumValueCase(defaultValue))}`; + } + if (type.kind === 'scalar') { + if (typeof defaultValue === 'string') return `'${defaultValue}'`; + if (typeof defaultValue === 'number' || typeof defaultValue === 'boolean') { + return String(defaultValue); + } + } + return null; + } + private buildToJsonExpression(type: IRType, accessorExpr: string): string { if (type.kind === 'list') { const inner = this.buildToJsonExpression(type.elementType!, 'e'); diff --git a/packages/gql/codegen/plugins/kotlin.ts b/packages/gql/codegen/plugins/kotlin.ts index 9ec015f46..c549d514f 100644 --- a/packages/gql/codegen/plugins/kotlin.ts +++ b/packages/gql/codegen/plugins/kotlin.ts @@ -349,7 +349,8 @@ export class KotlinPlugin extends CodegenPlugin { const propertyType = this.getPropertyType(field.type); const propertyName = this.escapeKeyword(this.fieldNameCase(field.name)); const suffix = index === sortedFields.length - 1 ? '' : ','; - const defaultValue = field.type.nullable ? ' = null' : ''; + const schemaDefault = this.buildDefaultValueExpression(field); + const defaultValue = schemaDefault ? ` = ${schemaDefault}` : field.type.nullable ? ' = null' : ''; this.emit(` val ${propertyName}: ${propertyType}${defaultValue}${suffix}`); }); @@ -357,20 +358,26 @@ export class KotlinPlugin extends CodegenPlugin { this.emit(' companion object {'); // Check if input has required fields - const hasRequiredFields = sortedFields.some((f) => !f.type.nullable); + const hasRequiredFields = sortedFields.some((f) => !f.type.nullable && !this.hasSchemaDefault(f)); if (hasRequiredFields) { // Nullable fromJson pattern this.emit(` fun fromJson(json: Map): ${irInput.name}? {`); for (const field of sortedFields) { const propertyName = this.escapeKeyword(this.fieldNameCase(field.name)); - const expression = this.buildFromJsonExpression(field.type, `json["${field.name}"]`, false, true); + const expression = this.buildFromJsonExpression( + field.type, + `json["${field.name}"]`, + false, + true, + this.buildDefaultValueExpression(field) + ); this.emit(` val ${propertyName} = ${expression}`); } // Null check for required fields (excluding enums which have fallbacks) const requiredFields = sortedFields.filter( - (f) => !f.type.nullable && f.type.kind !== 'enum' + (f) => !f.type.nullable && !this.hasSchemaDefault(f) && f.type.kind !== 'enum' ); if (requiredFields.length > 0) { const nullChecks = requiredFields @@ -392,7 +399,13 @@ export class KotlinPlugin extends CodegenPlugin { this.emit(` return ${irInput.name}(`); for (const field of sortedFields) { const propertyName = this.escapeKeyword(this.fieldNameCase(field.name)); - const expression = this.buildFromJsonExpression(field.type, `json["${field.name}"]`); + const expression = this.buildFromJsonExpression( + field.type, + `json["${field.name}"]`, + false, + false, + this.buildDefaultValueExpression(field) + ); this.emit(` ${propertyName} = ${expression},`); } this.emit(' )'); @@ -442,7 +455,8 @@ export class KotlinPlugin extends CodegenPlugin { const propertyType = this.getPropertyType(field.type); const propertyName = this.escapeKeyword(this.fieldNameCase(field.name)); const suffix = index === irInput.fields.length - 1 ? '' : ','; - const defaultValue = field.type.nullable ? ' = null' : ''; + const schemaDefault = this.buildDefaultValueExpression(field); + const defaultValue = schemaDefault ? ` = ${schemaDefault}` : field.type.nullable ? ' = null' : ''; this.emit(` val ${propertyName}: ${propertyType}${defaultValue}${suffix}`); }); @@ -450,20 +464,26 @@ export class KotlinPlugin extends CodegenPlugin { this.emit(' companion object {'); // Check if input has required fields - const hasRequiredFields = irInput.fields.some((f) => !f.type.nullable); + const hasRequiredFields = irInput.fields.some((f) => !f.type.nullable && !this.hasSchemaDefault(f)); if (hasRequiredFields) { // Nullable fromJson pattern this.emit(` fun fromJson(json: Map): ${irInput.name}? {`); for (const field of irInput.fields) { const propertyName = this.escapeKeyword(this.fieldNameCase(field.name)); - const expression = this.buildFromJsonExpression(field.type, `json["${field.name}"]`, false, true); + const expression = this.buildFromJsonExpression( + field.type, + `json["${field.name}"]`, + false, + true, + this.buildDefaultValueExpression(field) + ); this.emit(` val ${propertyName} = ${expression}`); } // Null check for required fields (excluding enums which have fallbacks) const requiredFields = irInput.fields.filter( - (f) => !f.type.nullable && f.type.kind !== 'enum' + (f) => !f.type.nullable && !this.hasSchemaDefault(f) && f.type.kind !== 'enum' ); if (requiredFields.length > 0) { const nullChecks = requiredFields @@ -485,7 +505,13 @@ export class KotlinPlugin extends CodegenPlugin { this.emit(` return ${irInput.name}(`); for (const field of irInput.fields) { const propertyName = this.escapeKeyword(this.fieldNameCase(field.name)); - const expression = this.buildFromJsonExpression(field.type, `json["${field.name}"]`); + const expression = this.buildFromJsonExpression( + field.type, + `json["${field.name}"]`, + false, + false, + this.buildDefaultValueExpression(field) + ); this.emit(` ${propertyName} = ${expression},`); } this.emit(' )'); @@ -729,11 +755,15 @@ export class KotlinPlugin extends CodegenPlugin { type: IRType, sourceExpr: string, isListElement: boolean = false, - forNullableFromJson: boolean = false + forNullableFromJson: boolean = false, + defaultExpression?: string | null ): string { if (type.kind === 'list') { const element = this.buildFromJsonExpression(type.elementType!, 'it', true, forNullableFromJson); const mapFn = type.elementType!.nullable ? 'map' : 'mapNotNull'; + if (defaultExpression) { + return `(${sourceExpr} as? List<*>)?.${mapFn} { ${element} } ?: ${defaultExpression}`; + } if (type.nullable || forNullableFromJson) { return `(${sourceExpr} as? List<*>)?.${mapFn} { ${element} }`; } @@ -744,20 +774,32 @@ export class KotlinPlugin extends CodegenPlugin { const useNullable = type.nullable || isListElement || forNullableFromJson; switch (type.name) { case 'Float': + if (defaultExpression) { + return `(${sourceExpr} as? Number)?.toDouble() ?: ${defaultExpression}`; + } return useNullable ? `(${sourceExpr} as? Number)?.toDouble()` : `(${sourceExpr} as? Number)?.toDouble() ?: 0.0`; case 'Int': + if (defaultExpression) { + return `(${sourceExpr} as? Number)?.toInt() ?: ${defaultExpression}`; + } return useNullable ? `(${sourceExpr} as? Number)?.toInt()` : `(${sourceExpr} as? Number)?.toInt() ?: 0`; case 'Boolean': + if (defaultExpression) { + return `${sourceExpr} as? Boolean ?: ${defaultExpression}`; + } return useNullable ? `${sourceExpr} as? Boolean` : `${sourceExpr} as? Boolean ?: false`; case 'ID': case 'String': default: + if (defaultExpression) { + return `${sourceExpr} as? String ?: ${defaultExpression}`; + } return useNullable ? `${sourceExpr} as? String` : `${sourceExpr} as? String ?: ""`; @@ -765,8 +807,16 @@ export class KotlinPlugin extends CodegenPlugin { } if (type.kind === 'enum') { + const unknownFallback = this.buildUnknownEnumFallbackExpression(type); + const enumRead = `(${sourceExpr} as? String)?.let { ${type.name}.fromJson(it) }`; + if (defaultExpression) { + return `${enumRead} ?: ${defaultExpression}`; + } + if (unknownFallback) { + return `runCatching { ${enumRead} }.getOrNull() ?: ${unknownFallback}`; + } if (type.nullable) { - return `(${sourceExpr} as? String)?.let { ${type.name}.fromJson(it) }`; + return enumRead; } // Find if enum has Empty value const irEnum = this.schema.enums.find((e) => e.name === type.name); @@ -819,6 +869,44 @@ export class KotlinPlugin extends CodegenPlugin { return accessorExpr; } + private hasSchemaDefault(field: IRField): boolean { + return field.defaultValue !== undefined; + } + + private buildDefaultValueExpression(field: IRField): string | null { + if (!this.hasSchemaDefault(field)) return null; + return this.buildDefaultValueForType(field.type, field.defaultValue); + } + + private buildDefaultValueForType(type: IRType, defaultValue: unknown): string | null { + if (type.kind === 'list') { + if (!Array.isArray(defaultValue)) return null; + const items = defaultValue + .map((value) => this.buildDefaultValueForType(type.elementType!, value)) + .filter((value): value is string => value !== null); + return `listOf(${items.join(', ')})`; + } + if (type.kind === 'enum' && typeof defaultValue === 'string') { + return `${type.name}.${this.escapeKeyword(this.enumValueCase(defaultValue))}`; + } + if (type.kind === 'scalar') { + if (typeof defaultValue === 'string') return `"${defaultValue}"`; + if (typeof defaultValue === 'number' || typeof defaultValue === 'boolean') { + return String(defaultValue); + } + } + return null; + } + + private buildUnknownEnumFallbackExpression(type: IRType): string | null { + if (type.kind !== 'enum' || !type.name) return null; + const irEnum = this.schema.enums.find((e) => e.name === type.name); + const unknownValue = irEnum?.values.find((value) => value.name.toLowerCase().startsWith('unknown')); + return unknownValue + ? `${type.name}.${this.escapeKeyword(this.enumValueCase(unknownValue.name))}` + : null; + } + // ============================================================================ // Helpers // ============================================================================ diff --git a/packages/gql/codegen/plugins/swift.ts b/packages/gql/codegen/plugins/swift.ts index 9b39f4875..95dfd75fc 100644 --- a/packages/gql/codegen/plugins/swift.ts +++ b/packages/gql/codegen/plugins/swift.ts @@ -275,7 +275,8 @@ export class SwiftPlugin extends CodegenPlugin { .map((field) => { const propertyType = this.getPropertyType(field.type); const propertyName = this.escapeKeyword(this.fieldNameCase(field.name)); - const defaultValue = field.type.nullable ? ' = nil' : ''; + const schemaDefault = this.buildDefaultValueExpression(field); + const defaultValue = schemaDefault ? ` = ${schemaDefault}` : field.type.nullable ? ' = nil' : ''; return ` ${propertyName}: ${propertyType}${defaultValue}`; }) .join(',\n'); @@ -310,6 +311,31 @@ export class SwiftPlugin extends CodegenPlugin { } } + private buildDefaultValueExpression(field: IRField): string | null { + if (field.defaultValue === undefined) return null; + return this.buildDefaultValueForType(field.type, field.defaultValue); + } + + private buildDefaultValueForType(type: IRType, defaultValue: unknown): string | null { + if (type.kind === 'list') { + if (!Array.isArray(defaultValue)) return null; + const items = defaultValue + .map((value) => this.buildDefaultValueForType(type.elementType!, value)) + .filter((value): value is string => value !== null); + return `[${items.join(', ')}]`; + } + if (type.kind === 'enum' && typeof defaultValue === 'string') { + return `.${this.escapeKeyword(this.enumValueCase(defaultValue))}`; + } + if (type.kind === 'scalar') { + if (typeof defaultValue === 'string') return `"${defaultValue}"`; + if (typeof defaultValue === 'number' || typeof defaultValue === 'boolean') { + return String(defaultValue); + } + } + return null; + } + private generateDiscountOfferInputIOS(irInput: IRInput): void { this.generateDocComment(irInput.description); this.emit('public struct DiscountOfferInputIOS: Codable {'); diff --git a/packages/gql/src/api-android.graphql b/packages/gql/src/api-android.graphql index df71a2402..424e10eaa 100644 --- a/packages/gql/src/api-android.graphql +++ b/packages/gql/src/api-android.graphql @@ -70,6 +70,8 @@ extend type Mutation { Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). Replaces the deprecated createExternalOfferReportingDetailsAsync API. Returns external transaction token needed for reporting external transactions. + developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, + native Android defaults it to IN_APP. Throws OpenIapError.NotPrepared if billing client not ready. See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android """ diff --git a/packages/gql/src/generated/Types.cs b/packages/gql/src/generated/Types.cs index e04ac493d..9acce4555 100644 --- a/packages/gql/src/generated/Types.cs +++ b/packages/gql/src/generated/Types.cs @@ -4084,7 +4084,7 @@ public sealed record BillingProgramInformationDialogParamsAndroid { /// Billing program. Currently only BILLING_CHOICE is supported. [JsonPropertyName("billingProgram")] - public required BillingProgramAndroid BillingProgram { get; init; } + public BillingProgramAndroid BillingProgram { get; init; } = BillingProgramAndroid.BillingChoice; /// External transaction token returned by the Billing Choice reporting-details flow. [JsonPropertyName("externalTransactionToken")] public required string ExternalTransactionToken { get; init; } @@ -4141,10 +4141,10 @@ public sealed record GetBillingChoiceInfoParamsAndroid { /// Billing program. Currently only BILLING_CHOICE is supported. [JsonPropertyName("billingProgram")] - public required BillingProgramAndroid BillingProgram { get; init; } + public BillingProgramAndroid BillingProgram { get; init; } = BillingProgramAndroid.BillingChoice; /// Desired Play Billing choice image layout. [JsonPropertyName("playBillingChoiceImageLayout")] - public required BillingChoiceImageLayoutAndroid PlayBillingChoiceImageLayout { get; init; } + public BillingChoiceImageLayoutAndroid PlayBillingChoiceImageLayout { get; init; } = BillingChoiceImageLayoutAndroid.RectangularFourByOne; /// BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. [JsonPropertyName("userLocale")] public string? UserLocale { get; init; } @@ -4156,7 +4156,7 @@ public sealed record InAppMessageParamsAndroid { /// In-app message categories to show. Defaults to transactional messages. [JsonPropertyName("categories")] - public IReadOnlyList? Categories { get; init; } + public IReadOnlyList? Categories { get; init; } = new List { InAppMessageCategoryAndroid.Transactional }; } /// Connection initialization configuration @@ -4202,7 +4202,7 @@ public sealed record ProductRequest [JsonPropertyName("skus")] public required IReadOnlyList Skus { get; init; } [JsonPropertyName("type")] - public ProductQueryType? Type { get; init; } + public ProductQueryType? Type { get; init; } = ProductQueryType.InApp; } /// JWS promotional offer input for iOS 15+ (StoreKit 2, WWDC 2025). @@ -4634,6 +4634,8 @@ public interface MutationResolver /// Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). /// Replaces the deprecated createExternalOfferReportingDetailsAsync API. /// Returns external transaction token needed for reporting external transactions. + /// developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, + /// native Android defaults it to IN_APP. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android Task CreateBillingProgramReportingDetailsAndroidAsync(BillingProgramAndroid program, DeveloperBillingTypeAndroid? developerBillingType = null); diff --git a/packages/gql/src/generated/Types.kt b/packages/gql/src/generated/Types.kt index 2ea3ef089..829641303 100644 --- a/packages/gql/src/generated/Types.kt +++ b/packages/gql/src/generated/Types.kt @@ -2819,7 +2819,7 @@ public data class ProductAndroid( oneTimePurchaseOfferDetailsAndroid = (json["oneTimePurchaseOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductAndroidOneTimePurchaseOfferDetail.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductAndroidOneTimePurchaseOfferDetail") }, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, price = (json["price"] as? Number)?.toDouble(), - productStatusAndroid = (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) }, + productStatusAndroid = runCatching { (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) } }.getOrNull() ?: ProductStatusAndroid.Unknown, subscriptionOfferDetailsAndroid = (json["subscriptionOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductSubscriptionAndroidOfferDetails.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductSubscriptionAndroidOfferDetails") }, subscriptionOffers = (json["subscriptionOffers"] as? List<*>)?.mapNotNull { (it as? Map)?.let { SubscriptionOffer.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionOffer") }, title = json["title"] as? String ?: "", @@ -3081,7 +3081,7 @@ public data class ProductSubscriptionAndroid( oneTimePurchaseOfferDetailsAndroid = (json["oneTimePurchaseOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductAndroidOneTimePurchaseOfferDetail.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductAndroidOneTimePurchaseOfferDetail") }, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, price = (json["price"] as? Number)?.toDouble(), - productStatusAndroid = (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) }, + productStatusAndroid = runCatching { (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) } }.getOrNull() ?: ProductStatusAndroid.Unknown, subscriptionOfferDetailsAndroid = (json["subscriptionOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductSubscriptionAndroidOfferDetails.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductSubscriptionAndroidOfferDetails") } ?: emptyList(), subscriptionOffers = (json["subscriptionOffers"] as? List<*>)?.mapNotNull { (it as? Map)?.let { SubscriptionOffer.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionOffer") } ?: emptyList(), title = json["title"] as? String ?: "", @@ -3324,11 +3324,11 @@ public data class PurchaseAndroid( pendingPurchaseUpdateAndroid = (json["pendingPurchaseUpdateAndroid"] as? Map)?.let { PendingPurchaseUpdateAndroid.fromJson(it) }, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, productId = json["productId"] as? String ?: "", - purchaseState = (json["purchaseState"] as? String)?.let { PurchaseState.fromJson(it) } ?: PurchaseState.Pending, + purchaseState = runCatching { (json["purchaseState"] as? String)?.let { PurchaseState.fromJson(it) } }.getOrNull() ?: PurchaseState.Unknown, purchaseToken = json["purchaseToken"] as? String, quantity = (json["quantity"] as? Number)?.toInt() ?: 0, signatureAndroid = json["signatureAndroid"] as? String, - store = (json["store"] as? String)?.let { IapStore.fromJson(it) } ?: IapStore.Unknown, + store = runCatching { (json["store"] as? String)?.let { IapStore.fromJson(it) } }.getOrNull() ?: IapStore.Unknown, transactionDate = (json["transactionDate"] as? Number)?.toDouble() ?: 0.0, transactionId = json["transactionId"] as? String, ) @@ -3376,7 +3376,7 @@ public data class PurchaseError( companion object { fun fromJson(json: Map): PurchaseError { return PurchaseError( - code = (json["code"] as? String)?.let { ErrorCode.fromJson(it) } ?: ErrorCode.Unknown, + code = runCatching { (json["code"] as? String)?.let { ErrorCode.fromJson(it) } }.getOrNull() ?: ErrorCode.Unknown, debugMessage = json["debugMessage"] as? String, isEmptyProductList = json["isEmptyProductList"] as? Boolean, message = json["message"] as? String ?: "", @@ -3461,7 +3461,7 @@ public data class PurchaseIOS( advancedCommerceInfoIOS = (json["advancedCommerceInfoIOS"] as? Map)?.let { AdvancedCommerceInfoIOS.fromJson(it) }, appAccountToken = json["appAccountToken"] as? String, appBundleIdIOS = json["appBundleIdIOS"] as? String, - billingPlanTypeIOS = (json["billingPlanTypeIOS"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) }, + billingPlanTypeIOS = runCatching { (json["billingPlanTypeIOS"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, commitmentInfoIOS = (json["commitmentInfoIOS"] as? Map)?.let { TransactionCommitmentInfoIOS.fromJson(it) }, countryCodeIOS = json["countryCodeIOS"] as? String, currencyCodeIOS = json["currencyCodeIOS"] as? String, @@ -3479,7 +3479,7 @@ public data class PurchaseIOS( ownershipTypeIOS = json["ownershipTypeIOS"] as? String, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, productId = json["productId"] as? String ?: "", - purchaseState = (json["purchaseState"] as? String)?.let { PurchaseState.fromJson(it) } ?: PurchaseState.Pending, + purchaseState = runCatching { (json["purchaseState"] as? String)?.let { PurchaseState.fromJson(it) } }.getOrNull() ?: PurchaseState.Unknown, purchaseToken = json["purchaseToken"] as? String, quantity = (json["quantity"] as? Number)?.toInt() ?: 0, quantityIOS = (json["quantityIOS"] as? Number)?.toInt(), @@ -3488,7 +3488,7 @@ public data class PurchaseIOS( renewalInfoIOS = (json["renewalInfoIOS"] as? Map)?.let { RenewalInfoIOS.fromJson(it) }, revocationDateIOS = (json["revocationDateIOS"] as? Number)?.toDouble(), revocationReasonIOS = json["revocationReasonIOS"] as? String, - store = (json["store"] as? String)?.let { IapStore.fromJson(it) } ?: IapStore.Unknown, + store = runCatching { (json["store"] as? String)?.let { IapStore.fromJson(it) } }.getOrNull() ?: IapStore.Unknown, storefrontCountryCodeIOS = json["storefrontCountryCodeIOS"] as? String, subscriptionGroupIdIOS = json["subscriptionGroupIdIOS"] as? String, transactionDate = (json["transactionDate"] as? Number)?.toDouble() ?: 0.0, @@ -3599,7 +3599,7 @@ public data class RenewalCommitmentInfoIOS( return RenewalCommitmentInfoIOS( commitmentAutoRenewProductId = json["commitmentAutoRenewProductId"] as? String ?: "", commitmentAutoRenewStatus = json["commitmentAutoRenewStatus"] as? Boolean ?: false, - commitmentRenewalBillingPlanType = (json["commitmentRenewalBillingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } ?: SubscriptionBillingPlanTypeIOS.Unknown, + commitmentRenewalBillingPlanType = runCatching { (json["commitmentRenewalBillingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, commitmentRenewalDate = (json["commitmentRenewalDate"] as? Number)?.toDouble() ?: 0.0, commitmentRenewalPrice = (json["commitmentRenewalPrice"] as? Number)?.toDouble() ?: 0.0, ) @@ -3685,7 +3685,7 @@ public data class RenewalInfoIOS( jsonRepresentation = json["jsonRepresentation"] as? String, pendingUpgradeProductId = json["pendingUpgradeProductId"] as? String, priceIncreaseStatus = json["priceIncreaseStatus"] as? String, - renewalBillingPlanType = (json["renewalBillingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) }, + renewalBillingPlanType = runCatching { (json["renewalBillingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, renewalDate = (json["renewalDate"] as? Number)?.toDouble(), renewalOfferId = json["renewalOfferId"] as? String, renewalOfferType = json["renewalOfferType"] as? String, @@ -3766,8 +3766,8 @@ public data class RequestVerifyPurchaseWithIapkitResult( fun fromJson(json: Map): RequestVerifyPurchaseWithIapkitResult { return RequestVerifyPurchaseWithIapkitResult( isValid = json["isValid"] as? Boolean ?: false, - state = (json["state"] as? String)?.let { IapkitPurchaseState.fromJson(it) } ?: IapkitPurchaseState.Entitled, - store = (json["store"] as? String)?.let { IapStore.fromJson(it) } ?: IapStore.Unknown, + state = runCatching { (json["state"] as? String)?.let { IapkitPurchaseState.fromJson(it) } }.getOrNull() ?: IapkitPurchaseState.Unknown, + store = runCatching { (json["store"] as? String)?.let { IapStore.fromJson(it) } }.getOrNull() ?: IapStore.Unknown, ) } } @@ -3949,7 +3949,7 @@ public data class SubscriptionOffer( numberOfPeriodsIOS = (json["numberOfPeriodsIOS"] as? Number)?.toInt(), offerTagsAndroid = (json["offerTagsAndroid"] as? List<*>)?.mapNotNull { it as? String }, offerTokenAndroid = json["offerTokenAndroid"] as? String, - paymentMode = (json["paymentMode"] as? String)?.let { PaymentMode.fromJson(it) }, + paymentMode = runCatching { (json["paymentMode"] as? String)?.let { PaymentMode.fromJson(it) } }.getOrNull() ?: PaymentMode.Unknown, period = (json["period"] as? Map)?.let { SubscriptionPeriod.fromJson(it) }, periodCount = (json["periodCount"] as? Number)?.toInt(), price = (json["price"] as? Number)?.toDouble() ?: 0.0, @@ -4043,7 +4043,7 @@ public data class SubscriptionPeriod( companion object { fun fromJson(json: Map): SubscriptionPeriod { return SubscriptionPeriod( - unit = (json["unit"] as? String)?.let { SubscriptionPeriodUnit.fromJson(it) } ?: SubscriptionPeriodUnit.Day, + unit = runCatching { (json["unit"] as? String)?.let { SubscriptionPeriodUnit.fromJson(it) } }.getOrNull() ?: SubscriptionPeriodUnit.Unknown, value = (json["value"] as? Number)?.toInt() ?: 0, ) } @@ -4091,7 +4091,7 @@ public data class SubscriptionPricingTermsIOS( return SubscriptionPricingTermsIOS( billingDisplayPrice = json["billingDisplayPrice"] as? String ?: "", billingPeriod = (json["billingPeriod"] as? Map)?.let { SubscriptionPeriodValueIOS.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionPeriodValueIOS"), - billingPlanType = (json["billingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } ?: SubscriptionBillingPlanTypeIOS.Unknown, + billingPlanType = runCatching { (json["billingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, billingPrice = (json["billingPrice"] as? Number)?.toDouble() ?: 0.0, commitmentInfo = (json["commitmentInfo"] as? Map)?.let { SubscriptionCommitmentInfoIOS.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionCommitmentInfoIOS"), subscriptionOffers = (json["subscriptionOffers"] as? List<*>)?.mapNotNull { (it as? Map)?.let { SubscriptionOffer.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionOffer") }, @@ -4499,7 +4499,7 @@ public data class WebhookEvent( receivedAt = (json["receivedAt"] as? Number)?.toDouble() ?: 0.0, renewsAt = (json["renewsAt"] as? Number)?.toDouble(), source = (json["source"] as? String)?.let { WebhookEventSource.fromJson(it) } ?: WebhookEventSource.AppleAppStoreServerNotificationsV2, - subscriptionState = (json["subscriptionState"] as? String)?.let { SubscriptionState.fromJson(it) }, + subscriptionState = runCatching { (json["subscriptionState"] as? String)?.let { SubscriptionState.fromJson(it) } }.getOrNull() ?: SubscriptionState.Unknown, type = (json["type"] as? String)?.let { WebhookEventType.fromJson(it) } ?: WebhookEventType.SubscriptionStarted, ) } @@ -4565,7 +4565,7 @@ public data class BillingProgramInformationDialogParamsAndroid( /** * Billing program. Currently only BILLING_CHOICE is supported. */ - val billingProgram: BillingProgramAndroid, + val billingProgram: BillingProgramAndroid = BillingProgramAndroid.BillingChoice, /** * External transaction token returned by the Billing Choice reporting-details flow. */ @@ -4573,7 +4573,7 @@ public data class BillingProgramInformationDialogParamsAndroid( ) { companion object { fun fromJson(json: Map): BillingProgramInformationDialogParamsAndroid? { - val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified + val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.BillingChoice val externalTransactionToken = json["externalTransactionToken"] as? String if (externalTransactionToken == null) return null return BillingProgramInformationDialogParamsAndroid( @@ -4711,25 +4711,22 @@ public data class GetBillingChoiceInfoParamsAndroid( /** * Billing program. Currently only BILLING_CHOICE is supported. */ - val billingProgram: BillingProgramAndroid, + val billingProgram: BillingProgramAndroid = BillingProgramAndroid.BillingChoice, /** * Desired Play Billing choice image layout. */ - val playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid, + val playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid = BillingChoiceImageLayoutAndroid.RectangularFourByOne, /** * BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. */ val userLocale: String? = null ) { companion object { - fun fromJson(json: Map): GetBillingChoiceInfoParamsAndroid? { - val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified - val playBillingChoiceImageLayout = (json["playBillingChoiceImageLayout"] as? String)?.let { BillingChoiceImageLayoutAndroid.fromJson(it) } ?: BillingChoiceImageLayoutAndroid.RectangularFourByOne - val userLocale = json["userLocale"] as? String + fun fromJson(json: Map): GetBillingChoiceInfoParamsAndroid { return GetBillingChoiceInfoParamsAndroid( - billingProgram = billingProgram, - playBillingChoiceImageLayout = playBillingChoiceImageLayout, - userLocale = userLocale, + billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.BillingChoice, + playBillingChoiceImageLayout = (json["playBillingChoiceImageLayout"] as? String)?.let { BillingChoiceImageLayoutAndroid.fromJson(it) } ?: BillingChoiceImageLayoutAndroid.RectangularFourByOne, + userLocale = json["userLocale"] as? String, ) } } @@ -4749,12 +4746,12 @@ public data class InAppMessageParamsAndroid( /** * In-app message categories to show. Defaults to transactional messages. */ - val categories: List? = null + val categories: List? = listOf(InAppMessageCategoryAndroid.Transactional) ) { companion object { fun fromJson(json: Map): InAppMessageParamsAndroid { return InAppMessageParamsAndroid( - categories = (json["categories"] as? List<*>)?.mapNotNull { (it as? String)?.let { InAppMessageCategoryAndroid.fromJson(it) } ?: InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId }, + categories = (json["categories"] as? List<*>)?.mapNotNull { runCatching { (it as? String)?.let { InAppMessageCategoryAndroid.fromJson(it) } }.getOrNull() ?: InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId } ?: listOf(InAppMessageCategoryAndroid.Transactional), ) } } @@ -4849,12 +4846,12 @@ public data class LaunchExternalLinkParamsAndroid( public data class ProductRequest( val skus: List, - val type: ProductQueryType? = null + val type: ProductQueryType? = ProductQueryType.InApp ) { companion object { fun fromJson(json: Map): ProductRequest? { val skus = (json["skus"] as? List<*>)?.mapNotNull { it as? String } - val type = (json["type"] as? String)?.let { ProductQueryType.fromJson(it) } + val type = (json["type"] as? String)?.let { ProductQueryType.fromJson(it) } ?: ProductQueryType.InApp if (skus == null) return null return ProductRequest( skus = skus, @@ -5312,7 +5309,7 @@ public data class RequestSubscriptionIosProps( val advancedCommerceData = json["advancedCommerceData"] as? String val andDangerouslyFinishTransactionAutomatically = json["andDangerouslyFinishTransactionAutomatically"] as? Boolean val appAccountToken = json["appAccountToken"] as? String - val billingPlanType = (json["billingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } + val billingPlanType = runCatching { (json["billingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown val compactJWS = json["compactJWS"] as? String val promotionalOfferJWS = (json["promotionalOfferJWS"] as? Map)?.let { PromotionalOfferJWSInputIOS.fromJson(it) } val quantity = (json["quantity"] as? Number)?.toInt() @@ -5534,7 +5531,7 @@ public data class SubscriptionProductReplacementParamsAndroid( companion object { fun fromJson(json: Map): SubscriptionProductReplacementParamsAndroid? { val oldProductId = json["oldProductId"] as? String - val replacementMode = (json["replacementMode"] as? String)?.let { SubscriptionReplacementModeAndroid.fromJson(it) } ?: SubscriptionReplacementModeAndroid.UnknownReplacementMode + val replacementMode = runCatching { (json["replacementMode"] as? String)?.let { SubscriptionReplacementModeAndroid.fromJson(it) } }.getOrNull() ?: SubscriptionReplacementModeAndroid.UnknownReplacementMode if (oldProductId == null) return null return SubscriptionProductReplacementParamsAndroid( oldProductId = oldProductId, @@ -5889,6 +5886,8 @@ public interface MutationResolver { * Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). * Replaces the deprecated createExternalOfferReportingDetailsAsync API. * Returns external transaction token needed for reporting external transactions. + * developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, + * native Android defaults it to IN_APP. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ diff --git a/packages/gql/src/generated/Types.swift b/packages/gql/src/generated/Types.swift index 952083007..742657cb0 100644 --- a/packages/gql/src/generated/Types.swift +++ b/packages/gql/src/generated/Types.swift @@ -1637,7 +1637,7 @@ public struct BillingProgramInformationDialogParamsAndroid: Codable { public var externalTransactionToken: String public init( - billingProgram: BillingProgramAndroid, + billingProgram: BillingProgramAndroid = .billingChoice, externalTransactionToken: String ) { self.billingProgram = billingProgram @@ -1744,8 +1744,8 @@ public struct GetBillingChoiceInfoParamsAndroid: Codable { public var userLocale: String? public init( - billingProgram: BillingProgramAndroid, - playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid, + billingProgram: BillingProgramAndroid = .billingChoice, + playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid = .rectangularFourByOne, userLocale: String? = nil ) { self.billingProgram = billingProgram @@ -1761,7 +1761,7 @@ public struct InAppMessageParamsAndroid: Codable { public var categories: [InAppMessageCategoryAndroid]? public init( - categories: [InAppMessageCategoryAndroid]? = nil + categories: [InAppMessageCategoryAndroid]? = [.transactional] ) { self.categories = categories } @@ -1823,7 +1823,7 @@ public struct ProductRequest: Codable { public init( skus: [String], - type: ProductQueryType? = nil + type: ProductQueryType? = .inApp ) { self.skus = skus self.type = type @@ -2747,6 +2747,8 @@ public protocol MutationResolver { /// Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). /// Replaces the deprecated createExternalOfferReportingDetailsAsync API. /// Returns external transaction token needed for reporting external transactions. + /// developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, + /// native Android defaults it to IN_APP. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android func createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid, developerBillingType: DeveloperBillingTypeAndroid?) async throws -> BillingProgramReportingDetailsAndroid diff --git a/packages/gql/src/generated/types.dart b/packages/gql/src/generated/types.dart index 5d7a2dbc8..6d9814f67 100644 --- a/packages/gql/src/generated/types.dart +++ b/packages/gql/src/generated/types.dart @@ -4509,7 +4509,7 @@ class AndroidSubscriptionOfferInput { /// Available in Google Play Billing Library 9.1.0+ class BillingProgramInformationDialogParamsAndroid { const BillingProgramInformationDialogParamsAndroid({ - required this.billingProgram, + this.billingProgram = BillingProgramAndroid.BillingChoice, required this.externalTransactionToken, }); @@ -4520,7 +4520,7 @@ class BillingProgramInformationDialogParamsAndroid { factory BillingProgramInformationDialogParamsAndroid.fromJson(Map json) { return BillingProgramInformationDialogParamsAndroid( - billingProgram: BillingProgramAndroid.fromJson(json['billingProgram'] as String), + billingProgram: json['billingProgram'] != null ? BillingProgramAndroid.fromJson(json['billingProgram'] as String) : BillingProgramAndroid.BillingChoice, externalTransactionToken: json['externalTransactionToken'] as String, ); } @@ -4638,8 +4638,8 @@ class DiscountOfferInputIOS { /// Available in Google Play Billing Library 9.1.0+ class GetBillingChoiceInfoParamsAndroid { const GetBillingChoiceInfoParamsAndroid({ - required this.billingProgram, - required this.playBillingChoiceImageLayout, + this.billingProgram = BillingProgramAndroid.BillingChoice, + this.playBillingChoiceImageLayout = BillingChoiceImageLayoutAndroid.RectangularFourByOne, this.userLocale, }); @@ -4652,8 +4652,8 @@ class GetBillingChoiceInfoParamsAndroid { factory GetBillingChoiceInfoParamsAndroid.fromJson(Map json) { return GetBillingChoiceInfoParamsAndroid( - billingProgram: BillingProgramAndroid.fromJson(json['billingProgram'] as String), - playBillingChoiceImageLayout: BillingChoiceImageLayoutAndroid.fromJson(json['playBillingChoiceImageLayout'] as String), + billingProgram: json['billingProgram'] != null ? BillingProgramAndroid.fromJson(json['billingProgram'] as String) : BillingProgramAndroid.BillingChoice, + playBillingChoiceImageLayout: json['playBillingChoiceImageLayout'] != null ? BillingChoiceImageLayoutAndroid.fromJson(json['playBillingChoiceImageLayout'] as String) : BillingChoiceImageLayoutAndroid.RectangularFourByOne, userLocale: json['userLocale'] as String?, ); } @@ -4671,7 +4671,7 @@ class GetBillingChoiceInfoParamsAndroid { /// Available in Google Play Billing Library 4.1.0+ class InAppMessageParamsAndroid { const InAppMessageParamsAndroid({ - this.categories, + this.categories = const [InAppMessageCategoryAndroid.Transactional], }); /// In-app message categories to show. Defaults to transactional messages. @@ -4679,7 +4679,7 @@ class InAppMessageParamsAndroid { factory InAppMessageParamsAndroid.fromJson(Map json) { return InAppMessageParamsAndroid( - categories: (json['categories'] as List?) == null ? null : (json['categories'] as List?)!.map((e) => InAppMessageCategoryAndroid.fromJson(e as String)).toList(), + categories: (json['categories'] as List?) == null ? const [InAppMessageCategoryAndroid.Transactional] : (json['categories'] as List?)!.map((e) => InAppMessageCategoryAndroid.fromJson(e as String)).toList(), ); } @@ -4767,7 +4767,7 @@ class LaunchExternalLinkParamsAndroid { class ProductRequest { const ProductRequest({ required this.skus, - this.type, + this.type = ProductQueryType.InApp, }); final List skus; @@ -4776,7 +4776,7 @@ class ProductRequest { factory ProductRequest.fromJson(Map json) { return ProductRequest( skus: (json['skus'] as List).map((e) => e as String).toList(), - type: json['type'] != null ? ProductQueryType.fromJson(json['type'] as String) : null, + type: json['type'] != null ? ProductQueryType.fromJson(json['type'] as String) : ProductQueryType.InApp, ); } @@ -5813,6 +5813,8 @@ abstract class MutationResolver { /// Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). /// Replaces the deprecated createExternalOfferReportingDetailsAsync API. /// Returns external transaction token needed for reporting external transactions. + /// developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, + /// native Android defaults it to IN_APP. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android Future createBillingProgramReportingDetailsAndroid({ diff --git a/packages/gql/src/generated/types.ts b/packages/gql/src/generated/types.ts index 6c2b36866..8e553b2a7 100644 --- a/packages/gql/src/generated/types.ts +++ b/packages/gql/src/generated/types.ts @@ -718,6 +718,8 @@ export interface Mutation { * Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). * Replaces the deprecated createExternalOfferReportingDetailsAsync API. * Returns external transaction token needed for reporting external transactions. + * developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, + * native Android defaults it to IN_APP. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ From b8fad7be4d383dd6e495bf223a8e3027534f59b3 Mon Sep 17 00:00:00 2001 From: Hyo Date: Wed, 8 Jul 2026 16:58:33 +0900 Subject: [PATCH 04/14] test(flutter): harden android consumer smoke script --- .../scripts/verify-android-consumer-build.sh | 39 +++++++++++++++---- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/libraries/flutter_inapp_purchase/scripts/verify-android-consumer-build.sh b/libraries/flutter_inapp_purchase/scripts/verify-android-consumer-build.sh index 05b32b486..c461847f0 100755 --- a/libraries/flutter_inapp_purchase/scripts/verify-android-consumer-build.sh +++ b/libraries/flutter_inapp_purchase/scripts/verify-android-consumer-build.sh @@ -42,7 +42,29 @@ flutter create --platforms=android -t app --project-name openiap_consumer_smoke google_root_build="$repo_root/packages/google/build.gradle.kts" read_google_plugin_version() { local plugin_id="$1" - sed -nE "s/.*id\\(\"${plugin_id}\"\\) version \"([^\"]+)\".*/\\1/p" "$google_root_build" | head -n 1 + local version + version="$(sed -nE "s/.*id\\(\"${plugin_id}\"\\) version \"([^\"]+)\".*/\\1/p" "$google_root_build" | head -n 1)" + if [ -z "$version" ]; then + echo "Failed to read Gradle plugin version for $plugin_id from $google_root_build" >&2 + return 1 + fi + printf '%s\n' "$version" +} + +replace_once() { + local file="$1" + local expression="$2" + local description="$3" + local before_file + before_file="$(mktemp "$tmp_root/perl-before.XXXXXX")" + cp "$file" "$before_file" + perl -0pi -e "$expression" "$file" + if cmp -s "$before_file" "$file"; then + echo "Failed to update $description in $file" >&2 + rm -f "$before_file" + return 1 + fi + rm -f "$before_file" } android_library_version="$(read_google_plugin_version "com.android.library")" @@ -51,7 +73,7 @@ maven_publish_version="$(read_google_plugin_version "com.vanniktech.maven.publis if [ -f "$consumer_app/android/settings.gradle.kts" ]; then settings_file="$consumer_app/android/settings.gradle.kts" - perl -0pi -e "s/plugins \\{\\n/plugins {\\n id(\"com.android.library\") version \"$android_library_version\" apply false\\n id(\"org.jetbrains.kotlin.plugin.compose\") version \"$compose_plugin_version\" apply false\\n id(\"com.vanniktech.maven.publish\") version \"$maven_publish_version\" apply false\\n/" "$settings_file" + replace_once "$settings_file" "s/plugins \\{\\n/plugins {\\n id(\"com.android.library\") version \"$android_library_version\" apply false\\n id(\"org.jetbrains.kotlin.plugin.compose\") version \"$compose_plugin_version\" apply false\\n id(\"com.vanniktech.maven.publish\") version \"$maven_publish_version\" apply false\\n/" "Gradle plugin versions" cat >> "$settings_file" <<'EOF' include(":openiap") @@ -59,12 +81,15 @@ project(":openiap").projectDir = file("../../packages/google/openiap") EOF elif [ -f "$consumer_app/android/settings.gradle" ]; then settings_file="$consumer_app/android/settings.gradle" - perl -0pi -e "s/plugins \\{\\n/plugins {\\n id 'com.android.library' version '$android_library_version' apply false\\n id 'org.jetbrains.kotlin.plugin.compose' version '$compose_plugin_version' apply false\\n id 'com.vanniktech.maven.publish' version '$maven_publish_version' apply false\\n/" "$settings_file" + replace_once "$settings_file" "s/plugins \\{\\n/plugins {\\n id 'com.android.library' version '$android_library_version' apply false\\n id 'org.jetbrains.kotlin.plugin.compose' version '$compose_plugin_version' apply false\\n id 'com.vanniktech.maven.publish' version '$maven_publish_version' apply false\\n/" "Gradle plugin versions" cat >> "$settings_file" <<'EOF' include ':openiap' project(':openiap').projectDir = file('../../packages/google/openiap') EOF +else + echo "Failed to locate generated Android settings.gradle(.kts) in $consumer_app/android" >&2 + exit 1 fi ( @@ -92,16 +117,16 @@ fi if [ -n "$preferred_ndk_version" ]; then if [ -f android/app/build.gradle.kts ]; then - perl -pi -e "s/ndkVersion\\s*=\\s*flutter\\.ndkVersion/ndkVersion = \"$preferred_ndk_version\"/" android/app/build.gradle.kts + replace_once android/app/build.gradle.kts "s/ndkVersion\\s*=\\s*flutter\\.ndkVersion/ndkVersion = \"$preferred_ndk_version\"/" "NDK version" elif [ -f android/app/build.gradle ]; then - perl -pi -e "s/ndkVersion\\s*=?\\s*flutter\\.ndkVersion/ndkVersion = \"$preferred_ndk_version\"/" android/app/build.gradle + replace_once android/app/build.gradle "s/ndkVersion\\s*=?\\s*flutter\\.ndkVersion/ndkVersion = \"$preferred_ndk_version\"/" "NDK version" fi fi if [ -f android/app/build.gradle.kts ]; then - perl -0pi -e 's/defaultConfig \{\n/defaultConfig {\n missingDimensionStrategy("platform", "play")\n/' android/app/build.gradle.kts + replace_once android/app/build.gradle.kts 's/defaultConfig \{\n/defaultConfig {\n missingDimensionStrategy("platform", "play")\n/' "OpenIAP platform flavor" elif [ -f android/app/build.gradle ]; then - perl -0pi -e 's/defaultConfig \{\n/defaultConfig {\n missingDimensionStrategy "platform", "play"\n/' android/app/build.gradle + replace_once android/app/build.gradle 's/defaultConfig \{\n/defaultConfig {\n missingDimensionStrategy "platform", "play"\n/' "OpenIAP platform flavor" fi flutter build apk --debug From fccef51bd0cd4aa3d17b3acb252b9456e7b7dd7a Mon Sep 17 00:00:00 2001 From: Hyo Date: Wed, 8 Jul 2026 20:44:12 +0900 Subject: [PATCH 05/14] fix(gql): preserve nullable enum parsing --- .../io/github/hyochan/kmpiap/openiap/Types.kt | 14 +++++++------- .../openiap/src/main/java/dev/hyo/openiap/Types.kt | 14 +++++++------- packages/gql/codegen/plugins/kotlin.ts | 3 +++ packages/gql/src/generated/Types.kt | 14 +++++++------- 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt b/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt index d1d92d7ed..d777c0553 100644 --- a/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt +++ b/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt @@ -2821,7 +2821,7 @@ public data class ProductAndroid( oneTimePurchaseOfferDetailsAndroid = (json["oneTimePurchaseOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductAndroidOneTimePurchaseOfferDetail.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductAndroidOneTimePurchaseOfferDetail") }, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, price = (json["price"] as? Number)?.toDouble(), - productStatusAndroid = runCatching { (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) } }.getOrNull() ?: ProductStatusAndroid.Unknown, + productStatusAndroid = (json["productStatusAndroid"] as? String)?.let { runCatching { ProductStatusAndroid.fromJson(it) }.getOrNull() ?: ProductStatusAndroid.Unknown }, subscriptionOfferDetailsAndroid = (json["subscriptionOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductSubscriptionAndroidOfferDetails.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductSubscriptionAndroidOfferDetails") }, subscriptionOffers = (json["subscriptionOffers"] as? List<*>)?.mapNotNull { (it as? Map)?.let { SubscriptionOffer.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionOffer") }, title = json["title"] as? String ?: "", @@ -3083,7 +3083,7 @@ public data class ProductSubscriptionAndroid( oneTimePurchaseOfferDetailsAndroid = (json["oneTimePurchaseOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductAndroidOneTimePurchaseOfferDetail.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductAndroidOneTimePurchaseOfferDetail") }, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, price = (json["price"] as? Number)?.toDouble(), - productStatusAndroid = runCatching { (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) } }.getOrNull() ?: ProductStatusAndroid.Unknown, + productStatusAndroid = (json["productStatusAndroid"] as? String)?.let { runCatching { ProductStatusAndroid.fromJson(it) }.getOrNull() ?: ProductStatusAndroid.Unknown }, subscriptionOfferDetailsAndroid = (json["subscriptionOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductSubscriptionAndroidOfferDetails.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductSubscriptionAndroidOfferDetails") } ?: emptyList(), subscriptionOffers = (json["subscriptionOffers"] as? List<*>)?.mapNotNull { (it as? Map)?.let { SubscriptionOffer.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionOffer") } ?: emptyList(), title = json["title"] as? String ?: "", @@ -3463,7 +3463,7 @@ public data class PurchaseIOS( advancedCommerceInfoIOS = (json["advancedCommerceInfoIOS"] as? Map)?.let { AdvancedCommerceInfoIOS.fromJson(it) }, appAccountToken = json["appAccountToken"] as? String, appBundleIdIOS = json["appBundleIdIOS"] as? String, - billingPlanTypeIOS = runCatching { (json["billingPlanTypeIOS"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, + billingPlanTypeIOS = (json["billingPlanTypeIOS"] as? String)?.let { runCatching { SubscriptionBillingPlanTypeIOS.fromJson(it) }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown }, commitmentInfoIOS = (json["commitmentInfoIOS"] as? Map)?.let { TransactionCommitmentInfoIOS.fromJson(it) }, countryCodeIOS = json["countryCodeIOS"] as? String, currencyCodeIOS = json["currencyCodeIOS"] as? String, @@ -3687,7 +3687,7 @@ public data class RenewalInfoIOS( jsonRepresentation = json["jsonRepresentation"] as? String, pendingUpgradeProductId = json["pendingUpgradeProductId"] as? String, priceIncreaseStatus = json["priceIncreaseStatus"] as? String, - renewalBillingPlanType = runCatching { (json["renewalBillingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, + renewalBillingPlanType = (json["renewalBillingPlanType"] as? String)?.let { runCatching { SubscriptionBillingPlanTypeIOS.fromJson(it) }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown }, renewalDate = (json["renewalDate"] as? Number)?.toDouble(), renewalOfferId = json["renewalOfferId"] as? String, renewalOfferType = json["renewalOfferType"] as? String, @@ -3951,7 +3951,7 @@ public data class SubscriptionOffer( numberOfPeriodsIOS = (json["numberOfPeriodsIOS"] as? Number)?.toInt(), offerTagsAndroid = (json["offerTagsAndroid"] as? List<*>)?.mapNotNull { it as? String }, offerTokenAndroid = json["offerTokenAndroid"] as? String, - paymentMode = runCatching { (json["paymentMode"] as? String)?.let { PaymentMode.fromJson(it) } }.getOrNull() ?: PaymentMode.Unknown, + paymentMode = (json["paymentMode"] as? String)?.let { runCatching { PaymentMode.fromJson(it) }.getOrNull() ?: PaymentMode.Unknown }, period = (json["period"] as? Map)?.let { SubscriptionPeriod.fromJson(it) }, periodCount = (json["periodCount"] as? Number)?.toInt(), price = (json["price"] as? Number)?.toDouble() ?: 0.0, @@ -4501,7 +4501,7 @@ public data class WebhookEvent( receivedAt = (json["receivedAt"] as? Number)?.toDouble() ?: 0.0, renewsAt = (json["renewsAt"] as? Number)?.toDouble(), source = (json["source"] as? String)?.let { WebhookEventSource.fromJson(it) } ?: WebhookEventSource.AppleAppStoreServerNotificationsV2, - subscriptionState = runCatching { (json["subscriptionState"] as? String)?.let { SubscriptionState.fromJson(it) } }.getOrNull() ?: SubscriptionState.Unknown, + subscriptionState = (json["subscriptionState"] as? String)?.let { runCatching { SubscriptionState.fromJson(it) }.getOrNull() ?: SubscriptionState.Unknown }, type = (json["type"] as? String)?.let { WebhookEventType.fromJson(it) } ?: WebhookEventType.SubscriptionStarted, ) } @@ -5311,7 +5311,7 @@ public data class RequestSubscriptionIosProps( val advancedCommerceData = json["advancedCommerceData"] as? String val andDangerouslyFinishTransactionAutomatically = json["andDangerouslyFinishTransactionAutomatically"] as? Boolean val appAccountToken = json["appAccountToken"] as? String - val billingPlanType = runCatching { (json["billingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown + val billingPlanType = (json["billingPlanType"] as? String)?.let { runCatching { SubscriptionBillingPlanTypeIOS.fromJson(it) }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown } val compactJWS = json["compactJWS"] as? String val promotionalOfferJWS = (json["promotionalOfferJWS"] as? Map)?.let { PromotionalOfferJWSInputIOS.fromJson(it) } val quantity = (json["quantity"] as? Number)?.toInt() diff --git a/packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt b/packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt index 9fa46292f..df2924c86 100644 --- a/packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt +++ b/packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt @@ -2696,7 +2696,7 @@ public data class ProductAndroid( oneTimePurchaseOfferDetailsAndroid = (json["oneTimePurchaseOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductAndroidOneTimePurchaseOfferDetail.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductAndroidOneTimePurchaseOfferDetail") }, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, price = (json["price"] as? Number)?.toDouble(), - productStatusAndroid = runCatching { (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) } }.getOrNull() ?: ProductStatusAndroid.Unknown, + productStatusAndroid = (json["productStatusAndroid"] as? String)?.let { runCatching { ProductStatusAndroid.fromJson(it) }.getOrNull() ?: ProductStatusAndroid.Unknown }, subscriptionOfferDetailsAndroid = (json["subscriptionOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductSubscriptionAndroidOfferDetails.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductSubscriptionAndroidOfferDetails") }, subscriptionOffers = (json["subscriptionOffers"] as? List<*>)?.mapNotNull { (it as? Map)?.let { SubscriptionOffer.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionOffer") }, title = json["title"] as? String ?: "", @@ -2958,7 +2958,7 @@ public data class ProductSubscriptionAndroid( oneTimePurchaseOfferDetailsAndroid = (json["oneTimePurchaseOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductAndroidOneTimePurchaseOfferDetail.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductAndroidOneTimePurchaseOfferDetail") }, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, price = (json["price"] as? Number)?.toDouble(), - productStatusAndroid = runCatching { (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) } }.getOrNull() ?: ProductStatusAndroid.Unknown, + productStatusAndroid = (json["productStatusAndroid"] as? String)?.let { runCatching { ProductStatusAndroid.fromJson(it) }.getOrNull() ?: ProductStatusAndroid.Unknown }, subscriptionOfferDetailsAndroid = (json["subscriptionOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductSubscriptionAndroidOfferDetails.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductSubscriptionAndroidOfferDetails") } ?: emptyList(), subscriptionOffers = (json["subscriptionOffers"] as? List<*>)?.mapNotNull { (it as? Map)?.let { SubscriptionOffer.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionOffer") } ?: emptyList(), title = json["title"] as? String ?: "", @@ -3338,7 +3338,7 @@ public data class PurchaseIOS( advancedCommerceInfoIOS = (json["advancedCommerceInfoIOS"] as? Map)?.let { AdvancedCommerceInfoIOS.fromJson(it) }, appAccountToken = json["appAccountToken"] as? String, appBundleIdIOS = json["appBundleIdIOS"] as? String, - billingPlanTypeIOS = runCatching { (json["billingPlanTypeIOS"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, + billingPlanTypeIOS = (json["billingPlanTypeIOS"] as? String)?.let { runCatching { SubscriptionBillingPlanTypeIOS.fromJson(it) }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown }, commitmentInfoIOS = (json["commitmentInfoIOS"] as? Map)?.let { TransactionCommitmentInfoIOS.fromJson(it) }, countryCodeIOS = json["countryCodeIOS"] as? String, currencyCodeIOS = json["currencyCodeIOS"] as? String, @@ -3562,7 +3562,7 @@ public data class RenewalInfoIOS( jsonRepresentation = json["jsonRepresentation"] as? String, pendingUpgradeProductId = json["pendingUpgradeProductId"] as? String, priceIncreaseStatus = json["priceIncreaseStatus"] as? String, - renewalBillingPlanType = runCatching { (json["renewalBillingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, + renewalBillingPlanType = (json["renewalBillingPlanType"] as? String)?.let { runCatching { SubscriptionBillingPlanTypeIOS.fromJson(it) }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown }, renewalDate = (json["renewalDate"] as? Number)?.toDouble(), renewalOfferId = json["renewalOfferId"] as? String, renewalOfferType = json["renewalOfferType"] as? String, @@ -3826,7 +3826,7 @@ public data class SubscriptionOffer( numberOfPeriodsIOS = (json["numberOfPeriodsIOS"] as? Number)?.toInt(), offerTagsAndroid = (json["offerTagsAndroid"] as? List<*>)?.mapNotNull { it as? String }, offerTokenAndroid = json["offerTokenAndroid"] as? String, - paymentMode = runCatching { (json["paymentMode"] as? String)?.let { PaymentMode.fromJson(it) } }.getOrNull() ?: PaymentMode.Unknown, + paymentMode = (json["paymentMode"] as? String)?.let { runCatching { PaymentMode.fromJson(it) }.getOrNull() ?: PaymentMode.Unknown }, period = (json["period"] as? Map)?.let { SubscriptionPeriod.fromJson(it) }, periodCount = (json["periodCount"] as? Number)?.toInt(), price = (json["price"] as? Number)?.toDouble() ?: 0.0, @@ -4376,7 +4376,7 @@ public data class WebhookEvent( receivedAt = (json["receivedAt"] as? Number)?.toDouble() ?: 0.0, renewsAt = (json["renewsAt"] as? Number)?.toDouble(), source = (json["source"] as? String)?.let { WebhookEventSource.fromJson(it) } ?: WebhookEventSource.AppleAppStoreServerNotificationsV2, - subscriptionState = runCatching { (json["subscriptionState"] as? String)?.let { SubscriptionState.fromJson(it) } }.getOrNull() ?: SubscriptionState.Unknown, + subscriptionState = (json["subscriptionState"] as? String)?.let { runCatching { SubscriptionState.fromJson(it) }.getOrNull() ?: SubscriptionState.Unknown }, type = (json["type"] as? String)?.let { WebhookEventType.fromJson(it) } ?: WebhookEventType.SubscriptionStarted, ) } @@ -5186,7 +5186,7 @@ public data class RequestSubscriptionIosProps( val advancedCommerceData = json["advancedCommerceData"] as? String val andDangerouslyFinishTransactionAutomatically = json["andDangerouslyFinishTransactionAutomatically"] as? Boolean val appAccountToken = json["appAccountToken"] as? String - val billingPlanType = runCatching { (json["billingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown + val billingPlanType = (json["billingPlanType"] as? String)?.let { runCatching { SubscriptionBillingPlanTypeIOS.fromJson(it) }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown } val compactJWS = json["compactJWS"] as? String val promotionalOfferJWS = (json["promotionalOfferJWS"] as? Map)?.let { PromotionalOfferJWSInputIOS.fromJson(it) } val quantity = (json["quantity"] as? Number)?.toInt() diff --git a/packages/gql/codegen/plugins/kotlin.ts b/packages/gql/codegen/plugins/kotlin.ts index c549d514f..35a5e05f3 100644 --- a/packages/gql/codegen/plugins/kotlin.ts +++ b/packages/gql/codegen/plugins/kotlin.ts @@ -813,6 +813,9 @@ export class KotlinPlugin extends CodegenPlugin { return `${enumRead} ?: ${defaultExpression}`; } if (unknownFallback) { + if (type.nullable) { + return `(${sourceExpr} as? String)?.let { runCatching { ${type.name}.fromJson(it) }.getOrNull() ?: ${unknownFallback} }`; + } return `runCatching { ${enumRead} }.getOrNull() ?: ${unknownFallback}`; } if (type.nullable) { diff --git a/packages/gql/src/generated/Types.kt b/packages/gql/src/generated/Types.kt index 829641303..6d0447e66 100644 --- a/packages/gql/src/generated/Types.kt +++ b/packages/gql/src/generated/Types.kt @@ -2819,7 +2819,7 @@ public data class ProductAndroid( oneTimePurchaseOfferDetailsAndroid = (json["oneTimePurchaseOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductAndroidOneTimePurchaseOfferDetail.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductAndroidOneTimePurchaseOfferDetail") }, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, price = (json["price"] as? Number)?.toDouble(), - productStatusAndroid = runCatching { (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) } }.getOrNull() ?: ProductStatusAndroid.Unknown, + productStatusAndroid = (json["productStatusAndroid"] as? String)?.let { runCatching { ProductStatusAndroid.fromJson(it) }.getOrNull() ?: ProductStatusAndroid.Unknown }, subscriptionOfferDetailsAndroid = (json["subscriptionOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductSubscriptionAndroidOfferDetails.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductSubscriptionAndroidOfferDetails") }, subscriptionOffers = (json["subscriptionOffers"] as? List<*>)?.mapNotNull { (it as? Map)?.let { SubscriptionOffer.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionOffer") }, title = json["title"] as? String ?: "", @@ -3081,7 +3081,7 @@ public data class ProductSubscriptionAndroid( oneTimePurchaseOfferDetailsAndroid = (json["oneTimePurchaseOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductAndroidOneTimePurchaseOfferDetail.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductAndroidOneTimePurchaseOfferDetail") }, platform = (json["platform"] as? String)?.let { IapPlatform.fromJson(it) } ?: IapPlatform.Ios, price = (json["price"] as? Number)?.toDouble(), - productStatusAndroid = runCatching { (json["productStatusAndroid"] as? String)?.let { ProductStatusAndroid.fromJson(it) } }.getOrNull() ?: ProductStatusAndroid.Unknown, + productStatusAndroid = (json["productStatusAndroid"] as? String)?.let { runCatching { ProductStatusAndroid.fromJson(it) }.getOrNull() ?: ProductStatusAndroid.Unknown }, subscriptionOfferDetailsAndroid = (json["subscriptionOfferDetailsAndroid"] as? List<*>)?.mapNotNull { (it as? Map)?.let { ProductSubscriptionAndroidOfferDetails.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for ProductSubscriptionAndroidOfferDetails") } ?: emptyList(), subscriptionOffers = (json["subscriptionOffers"] as? List<*>)?.mapNotNull { (it as? Map)?.let { SubscriptionOffer.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for SubscriptionOffer") } ?: emptyList(), title = json["title"] as? String ?: "", @@ -3461,7 +3461,7 @@ public data class PurchaseIOS( advancedCommerceInfoIOS = (json["advancedCommerceInfoIOS"] as? Map)?.let { AdvancedCommerceInfoIOS.fromJson(it) }, appAccountToken = json["appAccountToken"] as? String, appBundleIdIOS = json["appBundleIdIOS"] as? String, - billingPlanTypeIOS = runCatching { (json["billingPlanTypeIOS"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, + billingPlanTypeIOS = (json["billingPlanTypeIOS"] as? String)?.let { runCatching { SubscriptionBillingPlanTypeIOS.fromJson(it) }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown }, commitmentInfoIOS = (json["commitmentInfoIOS"] as? Map)?.let { TransactionCommitmentInfoIOS.fromJson(it) }, countryCodeIOS = json["countryCodeIOS"] as? String, currencyCodeIOS = json["currencyCodeIOS"] as? String, @@ -3685,7 +3685,7 @@ public data class RenewalInfoIOS( jsonRepresentation = json["jsonRepresentation"] as? String, pendingUpgradeProductId = json["pendingUpgradeProductId"] as? String, priceIncreaseStatus = json["priceIncreaseStatus"] as? String, - renewalBillingPlanType = runCatching { (json["renewalBillingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown, + renewalBillingPlanType = (json["renewalBillingPlanType"] as? String)?.let { runCatching { SubscriptionBillingPlanTypeIOS.fromJson(it) }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown }, renewalDate = (json["renewalDate"] as? Number)?.toDouble(), renewalOfferId = json["renewalOfferId"] as? String, renewalOfferType = json["renewalOfferType"] as? String, @@ -3949,7 +3949,7 @@ public data class SubscriptionOffer( numberOfPeriodsIOS = (json["numberOfPeriodsIOS"] as? Number)?.toInt(), offerTagsAndroid = (json["offerTagsAndroid"] as? List<*>)?.mapNotNull { it as? String }, offerTokenAndroid = json["offerTokenAndroid"] as? String, - paymentMode = runCatching { (json["paymentMode"] as? String)?.let { PaymentMode.fromJson(it) } }.getOrNull() ?: PaymentMode.Unknown, + paymentMode = (json["paymentMode"] as? String)?.let { runCatching { PaymentMode.fromJson(it) }.getOrNull() ?: PaymentMode.Unknown }, period = (json["period"] as? Map)?.let { SubscriptionPeriod.fromJson(it) }, periodCount = (json["periodCount"] as? Number)?.toInt(), price = (json["price"] as? Number)?.toDouble() ?: 0.0, @@ -4499,7 +4499,7 @@ public data class WebhookEvent( receivedAt = (json["receivedAt"] as? Number)?.toDouble() ?: 0.0, renewsAt = (json["renewsAt"] as? Number)?.toDouble(), source = (json["source"] as? String)?.let { WebhookEventSource.fromJson(it) } ?: WebhookEventSource.AppleAppStoreServerNotificationsV2, - subscriptionState = runCatching { (json["subscriptionState"] as? String)?.let { SubscriptionState.fromJson(it) } }.getOrNull() ?: SubscriptionState.Unknown, + subscriptionState = (json["subscriptionState"] as? String)?.let { runCatching { SubscriptionState.fromJson(it) }.getOrNull() ?: SubscriptionState.Unknown }, type = (json["type"] as? String)?.let { WebhookEventType.fromJson(it) } ?: WebhookEventType.SubscriptionStarted, ) } @@ -5309,7 +5309,7 @@ public data class RequestSubscriptionIosProps( val advancedCommerceData = json["advancedCommerceData"] as? String val andDangerouslyFinishTransactionAutomatically = json["andDangerouslyFinishTransactionAutomatically"] as? Boolean val appAccountToken = json["appAccountToken"] as? String - val billingPlanType = runCatching { (json["billingPlanType"] as? String)?.let { SubscriptionBillingPlanTypeIOS.fromJson(it) } }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown + val billingPlanType = (json["billingPlanType"] as? String)?.let { runCatching { SubscriptionBillingPlanTypeIOS.fromJson(it) }.getOrNull() ?: SubscriptionBillingPlanTypeIOS.Unknown } val compactJWS = json["compactJWS"] as? String val promotionalOfferJWS = (json["promotionalOfferJWS"] as? Map)?.let { PromotionalOfferJWSInputIOS.fromJson(it) } val quantity = (json["quantity"] as? Number)?.toInt() From ff2dfdee840c5ab248e79ef7083070a8bb0d7e2d Mon Sep 17 00:00:00 2001 From: Hyo Date: Wed, 8 Jul 2026 20:52:17 +0900 Subject: [PATCH 06/14] fix(iap): default billing choice info params --- .../src/modules/__tests__/android.test.ts | 18 ++++++++++++++++++ libraries/expo-iap/src/modules/android.ts | 2 +- .../src/__tests__/index.test.ts | 14 ++++++++++++++ libraries/react-native-iap/src/index.ts | 2 +- 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/libraries/expo-iap/src/modules/__tests__/android.test.ts b/libraries/expo-iap/src/modules/__tests__/android.test.ts index 1719ed43f..01da63ad1 100644 --- a/libraries/expo-iap/src/modules/__tests__/android.test.ts +++ b/libraries/expo-iap/src/modules/__tests__/android.test.ts @@ -294,6 +294,24 @@ describe('Android Module Functions', () => { }); expect(result).toEqual(mockResult); }); + + it('applies Billing Choice defaults when params are omitted', async () => { + const mockResult = { + playBillingChoiceImageUrl: 'https://play.google.com/image.png', + playBillingLoyaltyInfo: null, + }; + (ExpoIapModule.getBillingChoiceInfoAndroid as jest.Mock) + .mockResolvedValue(mockResult); + + const result = await (getBillingChoiceInfoAndroid as any)(); + + expect(ExpoIapModule.getBillingChoiceInfoAndroid).toHaveBeenCalledWith({ + billingProgram: 'billing-choice', + playBillingChoiceImageLayout: 'rectangular-four-by-one', + userLocale: null, + }); + expect(result).toEqual(mockResult); + }); }); describe('launchExternalLinkAndroid', () => { diff --git a/libraries/expo-iap/src/modules/android.ts b/libraries/expo-iap/src/modules/android.ts index e53fa6227..d14bcafdf 100644 --- a/libraries/expo-iap/src/modules/android.ts +++ b/libraries/expo-iap/src/modules/android.ts @@ -340,7 +340,7 @@ export const isBillingProgramAvailableAndroid: MutationField< export const getBillingChoiceInfoAndroid: QueryField< 'getBillingChoiceInfoAndroid' > = async ( - params: GetBillingChoiceInfoParamsAndroid, + params: GetBillingChoiceInfoParamsAndroid = {}, ): Promise => { return ExpoIapModule.getBillingChoiceInfoAndroid({ billingProgram: params.billingProgram ?? 'billing-choice', diff --git a/libraries/react-native-iap/src/__tests__/index.test.ts b/libraries/react-native-iap/src/__tests__/index.test.ts index 5d452c9ed..64ad352de 100644 --- a/libraries/react-native-iap/src/__tests__/index.test.ts +++ b/libraries/react-native-iap/src/__tests__/index.test.ts @@ -2187,6 +2187,20 @@ describe('Public API (src/index.ts)', () => { ); }); + it('should request Billing Choice info with defaults when params are omitted', async () => { + (Platform as any).OS = 'android'; + const result = await (IAP.getBillingChoiceInfoAndroid as any)(); + + expect(mockIap.getBillingChoiceInfoAndroid).toHaveBeenCalledWith({ + billingProgram: 'billing-choice', + playBillingChoiceImageLayout: 'rectangular-four-by-one', + userLocale: null, + }); + expect(result.playBillingChoiceImageUrl).toBe( + 'https://play.google.com/billing-choice.png', + ); + }); + it('should throw on non-Android', async () => { (Platform as any).OS = 'ios'; await expect(IAP.getBillingChoiceInfoAndroid({})).rejects.toThrow( diff --git a/libraries/react-native-iap/src/index.ts b/libraries/react-native-iap/src/index.ts index fcae23a36..05898602f 100644 --- a/libraries/react-native-iap/src/index.ts +++ b/libraries/react-native-iap/src/index.ts @@ -2958,7 +2958,7 @@ export const isBillingProgramAvailableAndroid: MutationField< export const getBillingChoiceInfoAndroid: QueryField< 'getBillingChoiceInfoAndroid' > = async ( - params: GetBillingChoiceInfoParamsAndroid, + params: GetBillingChoiceInfoParamsAndroid = {}, ): Promise => { if (Platform.OS !== 'android') { throw new Error('Billing Choice API is only supported on Android'); From c7073e3588ef3cfece189e90793e08bae3b0c43c Mon Sep 17 00:00:00 2001 From: Hyo Date: Wed, 8 Jul 2026 22:32:10 +0900 Subject: [PATCH 07/14] fix(react-native): align iOS in-app message signature --- libraries/react-native-iap/ios/HybridRnIap.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/react-native-iap/ios/HybridRnIap.swift b/libraries/react-native-iap/ios/HybridRnIap.swift index 0e603ebe9..ba29894d3 100644 --- a/libraries/react-native-iap/ios/HybridRnIap.swift +++ b/libraries/react-native-iap/ios/HybridRnIap.swift @@ -1403,7 +1403,7 @@ class HybridRnIap: HybridRnIapSpec { } } - func showInAppMessagesAndroid(params: NitroInAppMessageParamsAndroid?) throws -> Promise { + func showInAppMessagesAndroid(params: Variant_NullType_NitroInAppMessageParamsAndroid?) throws -> Promise { return Promise.async { throw OpenIapException.make(code: .featureNotSupported, message: "In-app messages are Android-only") } From 73aff2970325828bedee64cbf63a96d5751dd74d Mon Sep 17 00:00:00 2001 From: Hyo Date: Wed, 8 Jul 2026 22:36:30 +0900 Subject: [PATCH 08/14] fix(gql): harden generated default literals --- packages/gql/codegen/plugins/csharp.ts | 17 ++++- packages/gql/codegen/plugins/kotlin.ts | 6 +- packages/gql/src/codegen-defaults.test.ts | 75 +++++++++++++++++++++++ 3 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 packages/gql/src/codegen-defaults.test.ts diff --git a/packages/gql/codegen/plugins/csharp.ts b/packages/gql/codegen/plugins/csharp.ts index f227ea6b0..6e9a62754 100644 --- a/packages/gql/codegen/plugins/csharp.ts +++ b/packages/gql/codegen/plugins/csharp.ts @@ -414,7 +414,11 @@ export class CSharpPlugin extends CodegenPlugin { this.emit(` public ${propType} ${propName} { get; init; }${initializer}`); } else if (field.defaultValue !== undefined) { const defaultValue = this.buildDefaultValueExpression(field); - this.emit(` public ${propType} ${propName} { get; init; }${defaultValue ? ` = ${defaultValue};` : ''}`); + if (defaultValue) { + this.emit(` public ${propType} ${propName} { get; init; } = ${defaultValue};`); + } else { + this.emit(` public required ${propType} ${propName} { get; init; }`); + } } else if (defaults && field.name === 'platform') { const defaultValue = `IapPlatform.${toPascalCasePreserveIOS(defaults.platform)}`; this.emit(` public ${propType} ${propName} { get; init; } = ${defaultValue};`); @@ -445,7 +449,7 @@ export class CSharpPlugin extends CodegenPlugin { return `${type.name}.${this.enumValueCase(defaultValue)}`; } if (type.kind === 'scalar') { - if (typeof defaultValue === 'string') return `"${defaultValue}"`; + if (typeof defaultValue === 'string') return this.csharpStringLiteral(defaultValue); if (typeof defaultValue === 'number' || typeof defaultValue === 'boolean') { return String(defaultValue).toLowerCase(); } @@ -453,6 +457,15 @@ export class CSharpPlugin extends CodegenPlugin { return null; } + private csharpStringLiteral(value: string): string { + return `"${value + .replace(/\\/g, '\\\\') + .replace(/"/g, '\\"') + .replace(/\r/g, '\\r') + .replace(/\n/g, '\\n') + .replace(/\t/g, '\\t')}"`; + } + private generateResultUnionObject(irObject: IRObject): void { this.emitDoc(irObject.description); const entries = [...irObject.resultUnionEntries!].sort((a, b) => diff --git a/packages/gql/codegen/plugins/kotlin.ts b/packages/gql/codegen/plugins/kotlin.ts index 35a5e05f3..e3ff9b6a2 100644 --- a/packages/gql/codegen/plugins/kotlin.ts +++ b/packages/gql/codegen/plugins/kotlin.ts @@ -894,7 +894,11 @@ export class KotlinPlugin extends CodegenPlugin { } if (type.kind === 'scalar') { if (typeof defaultValue === 'string') return `"${defaultValue}"`; - if (typeof defaultValue === 'number' || typeof defaultValue === 'boolean') { + if (typeof defaultValue === 'boolean') return String(defaultValue); + if (typeof defaultValue === 'number') { + if (type.name === 'Float' && Number.isInteger(defaultValue)) { + return `${defaultValue}.0`; + } return String(defaultValue); } } diff --git a/packages/gql/src/codegen-defaults.test.ts b/packages/gql/src/codegen-defaults.test.ts new file mode 100644 index 000000000..ed0293d10 --- /dev/null +++ b/packages/gql/src/codegen-defaults.test.ts @@ -0,0 +1,75 @@ +import { describe, expect, it } from "vitest"; +import { CSharpPlugin } from "../codegen/plugins/csharp"; +import { KotlinPlugin } from "../codegen/plugins/kotlin"; +import type { IRField, IRSchema, IRType } from "../codegen/core/types"; + +const stringType: IRType = { kind: "scalar", name: "String", nullable: false }; +const floatType: IRType = { kind: "scalar", name: "Float", nullable: false }; + +function field(name: string, type: IRType, defaultValue?: unknown): IRField { + return { + name, + type, + isOverride: false, + ...(defaultValue !== undefined ? { defaultValue } : {}), + }; +} + +function schema(fields: IRField[]): IRSchema { + return { + enums: [], + interfaces: [], + objects: [], + inputs: [ + { + name: "DefaultInput", + fields, + hasRequiredFields: true, + isCustomType: false, + }, + ], + unions: [], + operations: [], + metadata: { + unionWrapperNames: new Set(), + futureFieldNames: new Set(), + platformDefaults: new Map(), + singleFieldObjects: new Map(), + unionMembership: new Map(), + inputsWithRequiredFields: new Set(), + }, + }; +} + +describe("codegen defaults", () => { + it("keeps unsupported non-null C# defaults required and escapes string literals", () => { + const output = new CSharpPlugin({ outputPath: "Types.cs" }).generate( + schema([ + field("unsupportedDefault", stringType, { raw: "unsupported" }), + field("escapedString", stringType, 'quote " and slash \\'), + ]), + ); + + expect(output).toContain( + "public required string UnsupportedDefault { get; init; }", + ); + expect(output).toContain( + 'public string EscapedString { get; init; } = "quote \\" and slash \\\\";', + ); + }); + + it("emits whole-number GraphQL Float defaults as Kotlin Double literals", () => { + const output = new KotlinPlugin({ + outputPath: "Types.kt", + packageName: "dev.hyo.openiap", + }).generate( + schema([ + field("wholeWeight", floatType, 0), + field("fractionalWeight", floatType, 1.5), + ]), + ); + + expect(output).toContain("val wholeWeight: Double = 0.0"); + expect(output).toContain("val fractionalWeight: Double = 1.5,"); + }); +}); From 94522fdb4e180d620be302350f0adb1c9d7e3e6a Mon Sep 17 00:00:00 2001 From: Hyo Date: Wed, 8 Jul 2026 22:46:52 +0900 Subject: [PATCH 09/14] fix(iap): simplify billing review paths --- .../io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt | 7 ------- .../react-native-iap/src/__tests__/index.test.ts | 2 +- libraries/react-native-iap/src/index.ts | 11 ++++------- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt index a8c5a5e19..85d80675d 100644 --- a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt +++ b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt @@ -2099,13 +2099,6 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife paramsClass, listenerClass ).invoke(client, activity, requestParams, listener) - ?.let { it as? BillingResult } - ?.takeIf { it.responseCode != BillingClient.BillingResponseCode.OK } - ?.let { - if (continuation.isActive) { - continuation.resume(it.toBillingResultAndroid()) - } - } } catch (e: NoSuchMethodException) { if (continuation.isActive) { continuation.resumeWithException(PurchaseException( diff --git a/libraries/react-native-iap/src/__tests__/index.test.ts b/libraries/react-native-iap/src/__tests__/index.test.ts index 64ad352de..f321d1ffe 100644 --- a/libraries/react-native-iap/src/__tests__/index.test.ts +++ b/libraries/react-native-iap/src/__tests__/index.test.ts @@ -2226,7 +2226,7 @@ describe('Public API (src/index.ts)', () => { expect( mockIap.createBillingProgramReportingDetailsAndroid, - ).toHaveBeenCalledWith('external-offer'); + ).toHaveBeenCalledWith('external-offer', null); expect(result.billingProgram).toBe('external-offer'); expect(result.externalTransactionToken).toBe('token-abc-123'); }); diff --git a/libraries/react-native-iap/src/index.ts b/libraries/react-native-iap/src/index.ts index 05898602f..ae054f7a5 100644 --- a/libraries/react-native-iap/src/index.ts +++ b/libraries/react-native-iap/src/index.ts @@ -3016,13 +3016,10 @@ export const createBillingProgramReportingDetailsAndroid = async ( typeof programOrArgs === 'string' ? developerBillingType : (programOrArgs.developerBillingType ?? developerBillingType); - const result = - resolvedDeveloperBillingType == null - ? await IAP.instance.createBillingProgramReportingDetailsAndroid(program) - : await IAP.instance.createBillingProgramReportingDetailsAndroid( - program, - resolvedDeveloperBillingType, - ); + const result = await IAP.instance.createBillingProgramReportingDetailsAndroid( + program, + resolvedDeveloperBillingType ?? null, + ); return { billingProgram: result.billingProgram as unknown as BillingProgramAndroid, externalTransactionToken: result.externalTransactionToken, From 6aa0cd555e3d18854b228bd3d1a891bc434ad121 Mon Sep 17 00:00:00 2001 From: Hyo Date: Wed, 8 Jul 2026 23:12:56 +0900 Subject: [PATCH 10/14] fix(godot): return external link launch result --- libraries/godot-iap/addons/godot-iap/godot_iap.gd | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/libraries/godot-iap/addons/godot-iap/godot_iap.gd b/libraries/godot-iap/addons/godot-iap/godot_iap.gd index 18e1992fc..4c6a89e34 100644 --- a/libraries/godot-iap/addons/godot-iap/godot_iap.gd +++ b/libraries/godot-iap/addons/godot-iap/godot_iap.gd @@ -1377,19 +1377,17 @@ func get_billing_choice_info_android(params) -> Variant: ## Launch external link (Android 8.2.0+). ## @param params: Types.LaunchExternalLinkParamsAndroid - external link parameters -## @return Types.VoidResult +## @return bool - true if the external link flow was accepted/launched ## ## See: https://openiap.dev/docs/apis/android/launch-external-link-android -func launch_external_link_android(params) -> Variant: +func launch_external_link_android(params) -> bool: if _native_plugin and _platform == "Android": var params_json = JSON.stringify(params.to_dict()) var result_json = _native_plugin.call("launchExternalLinkAndroid", params_json) var result = JSON.parse_string(result_json) if result is Dictionary: - return Types.VoidResult.from_dict(result) - var default_result = Types.VoidResult.new() - default_result.success = false - return default_result + return bool(result.get("launched", result.get("success", false))) + return false ## Create billing program reporting details (Android 8.2.0+). ## @param billing_program: Types.BillingProgramAndroid - billing program enum value From a6136aca93b43ba434be11402662fc9bd6f1d205 Mon Sep 17 00:00:00 2001 From: Hyo Date: Wed, 8 Jul 2026 23:35:34 +0900 Subject: [PATCH 11/14] fix(godot): align boolean wrapper returns --- .../godot-iap/Example/tests/test_godot_iap.gd | 22 +++- .../godot-iap/addons/godot-iap/godot_iap.gd | 103 ++++++++---------- .../Sources/GodotIap/GodotIap.swift | 46 +++++++- .../docs/apis/ios/clear-transaction-ios.tsx | 2 +- .../ios/present-code-redemption-sheet-ios.tsx | 2 +- ...quest-purchase-on-promoted-product-ios.tsx | 2 +- .../docs/src/pages/docs/apis/ios/sync-ios.tsx | 2 +- 7 files changed, 109 insertions(+), 70 deletions(-) diff --git a/libraries/godot-iap/Example/tests/test_godot_iap.gd b/libraries/godot-iap/Example/tests/test_godot_iap.gd index 106fc952d..678a30295 100644 --- a/libraries/godot-iap/Example/tests/test_godot_iap.gd +++ b/libraries/godot-iap/Example/tests/test_godot_iap.gd @@ -204,11 +204,11 @@ func test_finish_transaction_mock() -> void: func test_ios_methods_mock() -> void: # sync_ios var sync_result = GodotIapPlugin.sync_ios() - _assert_true(sync_result is Types.VoidResult, "sync_ios should return VoidResult") + _assert_true(sync_result is bool, "sync_ios should return bool") # clear_transaction_ios var clear_result = GodotIapPlugin.clear_transaction_ios() - _assert_true(clear_result is Types.VoidResult, "clear_transaction_ios should return VoidResult") + _assert_true(clear_result is bool, "clear_transaction_ios should return bool") # get_pending_transactions_ios var pending = GodotIapPlugin.get_pending_transactions_ios() @@ -216,7 +216,11 @@ func test_ios_methods_mock() -> void: # present_code_redemption_sheet_ios var redemption_result = GodotIapPlugin.present_code_redemption_sheet_ios() - _assert_true(redemption_result is Types.VoidResult, "present_code_redemption_sheet_ios should return VoidResult") + _assert_true(redemption_result is bool, "present_code_redemption_sheet_ios should return bool") + + # request_purchase_on_promoted_product_ios + var promoted_result = GodotIapPlugin.request_purchase_on_promoted_product_ios() + _assert_true(promoted_result is bool, "request_purchase_on_promoted_product_ios should return bool") # current_entitlement_ios var entitlement = GodotIapPlugin.current_entitlement_ios("test_sku") @@ -238,11 +242,19 @@ func test_ios_methods_mock() -> void: func test_android_methods_mock() -> void: # acknowledge_purchase_android var ack_result = GodotIapPlugin.acknowledge_purchase_android("mock_token") - _assert_true(ack_result is Types.VoidResult, "acknowledge_purchase_android should return VoidResult") + _assert_true(ack_result is bool, "acknowledge_purchase_android should return bool") # consume_purchase_android var consume_result = GodotIapPlugin.consume_purchase_android("mock_token") - _assert_true(consume_result is Types.VoidResult, "consume_purchase_android should return VoidResult") + _assert_true(consume_result is bool, "consume_purchase_android should return bool") + + # check_alternative_billing_availability_android + var alternative_available = GodotIapPlugin.check_alternative_billing_availability_android() + _assert_true(alternative_available is bool, "check_alternative_billing_availability_android should return bool") + + # show_alternative_billing_dialog_android + var alternative_accepted = GodotIapPlugin.show_alternative_billing_dialog_android() + _assert_true(alternative_accepted is bool, "show_alternative_billing_dialog_android should return bool") # get_package_name_android var package_name = GodotIapPlugin.get_package_name_android() diff --git a/libraries/godot-iap/addons/godot-iap/godot_iap.gd b/libraries/godot-iap/addons/godot-iap/godot_iap.gd index 4c6a89e34..221d6f111 100644 --- a/libraries/godot-iap/addons/godot-iap/godot_iap.gd +++ b/libraries/godot-iap/addons/godot-iap/godot_iap.gd @@ -812,32 +812,28 @@ func _verify_purchase_with_provider_raw(props: Dictionary) -> Dictionary: # ========================================== ## Sync with App Store (iOS only). -## @return Types.VoidResult +## @return bool - true if the sync request completed successfully ## ## See: https://openiap.dev/docs/apis/ios/sync-ios -func sync_ios() -> Variant: - var result = Types.VoidResult.new() - result.success = false - if _native_plugin and _platform == "iOS": - var result_json = _native_plugin.call("syncIOS") - var parsed = JSON.parse_string(result_json) - if parsed is Dictionary: - return Types.VoidResult.from_dict(parsed) - return result +func sync_ios() -> bool: + if not (_native_plugin and _platform == "iOS"): + return false + var pending = _native_plugin.call("syncIOS") + var request_id = _parse_request_id(pending) + var payload = await _await_products_fetched_for("syncIOS", request_id) + return payload.get("success", false) ## Clear pending transactions from the StoreKit payment queue (iOS only). -## @return Types.VoidResult +## @return bool - true if pending transactions were cleared successfully ## ## See: https://openiap.dev/docs/apis/ios/clear-transaction-ios -func clear_transaction_ios() -> Variant: - var result = Types.VoidResult.new() - result.success = false - if _native_plugin and _platform == "iOS": - var result_json = _native_plugin.call("clearTransactionIOS") - var parsed = JSON.parse_string(result_json) - if parsed is Dictionary: - return Types.VoidResult.from_dict(parsed) - return result +func clear_transaction_ios() -> bool: + if not (_native_plugin and _platform == "iOS"): + return false + var pending = _native_plugin.call("clearTransactionIOS") + var request_id = _parse_request_id(pending) + var payload = await _await_products_fetched_for("clearTransactionIOS", request_id) + return payload.get("success", false) ## Get pending transactions (iOS only). ## @return Array[Types.PurchaseIOS] @@ -877,18 +873,16 @@ func get_all_transactions_ios() -> Array: return purchases ## Present code redemption sheet (iOS only). -## @return Types.VoidResult +## @return bool - true if the sheet was presented successfully ## ## See: https://openiap.dev/docs/apis/ios/present-code-redemption-sheet-ios -func present_code_redemption_sheet_ios() -> Variant: - var result = Types.VoidResult.new() - result.success = false - if _native_plugin and _platform == "iOS": - var result_json = _native_plugin.call("presentCodeRedemptionSheetIOS") - var parsed = JSON.parse_string(result_json) - if parsed is Dictionary: - return Types.VoidResult.from_dict(parsed) - return result +func present_code_redemption_sheet_ios() -> bool: + if not (_native_plugin and _platform == "iOS"): + return false + var pending = _native_plugin.call("presentCodeRedemptionSheetIOS") + var request_id = _parse_request_id(pending) + var payload = await _await_products_fetched_for("presentCodeRedemptionSheetIOS", request_id) + return payload.get("success", false) ## Show manage subscriptions UI (iOS only). ## @return Array[Types.PurchaseIOS] - changed purchases @@ -1020,18 +1014,16 @@ func get_promoted_product_ios() -> Variant: return null ## Request purchase on promoted product (iOS only). -## @return Types.VoidResult +## @return bool - true if the promoted product purchase request succeeded ## ## See: https://openiap.dev/docs/apis/ios/request-purchase-on-promoted-product-ios -func request_purchase_on_promoted_product_ios() -> Variant: - var result = Types.VoidResult.new() - result.success = false - if _native_plugin and _platform == "iOS": - var result_json = _native_plugin.call("requestPurchaseOnPromotedProductIOS") - var parsed = JSON.parse_string(result_json) - if parsed is Dictionary: - return Types.VoidResult.from_dict(parsed) - return result +func request_purchase_on_promoted_product_ios() -> bool: + if not (_native_plugin and _platform == "iOS"): + return false + var pending = _native_plugin.call("requestPurchaseOnPromotedProductIOS") + var request_id = _parse_request_id(pending) + var payload = await _await_products_fetched_for("requestPurchaseOnPromotedProductIOS", request_id) + return payload.get("success", false) ## Check if can present external purchase notice (iOS 18.2+). ## @return bool - true if external purchase notice can be presented @@ -1255,12 +1247,12 @@ func show_external_purchase_custom_link_notice_ios(notice_type: String) -> Varia ## Acknowledge a purchase (Android only, for non-consumables). ## @param purchase_token: String - the purchase token to acknowledge -## @return Types.VoidResult +## @return bool - true if the purchase was acknowledged successfully ## ## See: https://openiap.dev/docs/apis/android/acknowledge-purchase-android -func acknowledge_purchase_android(purchase_token: String) -> Variant: +func acknowledge_purchase_android(purchase_token: String) -> bool: var result = _acknowledge_purchase_android_raw(purchase_token) - return Types.VoidResult.from_dict(result) + return result.get("success", false) ## Internal: Acknowledge purchase raw func _acknowledge_purchase_android_raw(purchase_token: String) -> Dictionary: @@ -1276,12 +1268,12 @@ func _acknowledge_purchase_android_raw(purchase_token: String) -> Dictionary: ## Consume a purchase (Android only, for consumables). ## @param purchase_token: String - the purchase token to consume -## @return Types.VoidResult +## @return bool - true if the purchase was consumed successfully ## ## See: https://openiap.dev/docs/apis/android/consume-purchase-android -func consume_purchase_android(purchase_token: String) -> Variant: +func consume_purchase_android(purchase_token: String) -> bool: var result = _consume_purchase_android_raw(purchase_token) - return Types.VoidResult.from_dict(result) + return result.get("success", false) ## Internal: Consume purchase raw func _consume_purchase_android_raw(purchase_token: String) -> Dictionary: @@ -1296,31 +1288,28 @@ func _consume_purchase_android_raw(purchase_token: String) -> Dictionary: return { "success": false, "error": "Not available" } ## Check alternative billing availability (Android). -## @return Types.BillingProgramAvailabilityResultAndroid +## @return bool - true if alternative billing is available ## ## See: https://openiap.dev/docs/apis/android/check-alternative-billing-availability-android -func check_alternative_billing_availability_android() -> Variant: +func check_alternative_billing_availability_android() -> bool: if _native_plugin and _platform == "Android": var result_json = _native_plugin.call("checkAlternativeBillingAvailabilityAndroid") var result = JSON.parse_string(result_json) if result is Dictionary: - return Types.BillingProgramAvailabilityResultAndroid.from_dict(result) - var default_result = Types.BillingProgramAvailabilityResultAndroid.new() - default_result.is_available = false - return default_result + return result.get("isAvailable", false) + return false ## Show alternative billing dialog (Android). -## @return Types.UserChoiceBillingDetails +## @return bool - true if the user accepted the dialog ## ## See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android -func show_alternative_billing_dialog_android() -> Variant: +func show_alternative_billing_dialog_android() -> bool: if _native_plugin and _platform == "Android": var result_json = _native_plugin.call("showAlternativeBillingDialogAndroid") var result = JSON.parse_string(result_json) if result is Dictionary: - return Types.UserChoiceBillingDetails.from_dict(result) - var default_result = Types.UserChoiceBillingDetails.new() - return default_result + return result.get("userAccepted", false) + return false ## Create alternative billing token (Android). ## @return Types.BillingProgramReportingDetailsAndroid diff --git a/libraries/godot-iap/ios-gdextension/Sources/GodotIap/GodotIap.swift b/libraries/godot-iap/ios-gdextension/Sources/GodotIap/GodotIap.swift index e8c62e44e..0aad555ad 100644 --- a/libraries/godot-iap/ios-gdextension/Sources/GodotIap/GodotIap.swift +++ b/libraries/godot-iap/ios-gdextension/Sources/GodotIap/GodotIap.swift @@ -483,6 +483,7 @@ public class GodotIap: RefCounted, @unchecked Sendable { @Callable public func syncIOS() -> String { GodotIapLog.payload("Syncing with App Store", payload: nil) + let requestId = UUID().uuidString Task { [weak self] in guard let self = self else { return } @@ -490,6 +491,8 @@ public class GodotIap: RefCounted, @unchecked Sendable { let result = try await self.openIap.syncIOS() await MainActor.run { [self] in let dict = VariantDictionary() + dict["method"] = Variant("syncIOS") + dict["requestId"] = Variant(requestId) dict["success"] = Variant(result) self.productsFetched.emit(dict) } @@ -498,6 +501,8 @@ public class GodotIap: RefCounted, @unchecked Sendable { GodotIapLog.debug("[GodotIap] syncIOS error: \(error.localizedDescription)") await MainActor.run { [self] in let dict = VariantDictionary() + dict["method"] = Variant("syncIOS") + dict["requestId"] = Variant(requestId) dict["success"] = Variant(false) dict["error"] = Variant(error.localizedDescription) self.productsFetched.emit(dict) @@ -505,12 +510,13 @@ public class GodotIap: RefCounted, @unchecked Sendable { } } - return "{\"status\": \"pending\"}" + return "{\"status\": \"pending\", \"requestId\": \"\(requestId)\"}" } @Callable public func clearTransactionIOS() -> String { GodotIapLog.payload("Clearing transactions", payload: nil) + let requestId = UUID().uuidString Task { [weak self] in guard let self = self else { return } @@ -518,16 +524,26 @@ public class GodotIap: RefCounted, @unchecked Sendable { let result = try await self.openIap.clearTransactionIOS() await MainActor.run { [self] in let dict = VariantDictionary() + dict["method"] = Variant("clearTransactionIOS") + dict["requestId"] = Variant(requestId) dict["success"] = Variant(result) self.productsFetched.emit(dict) } GodotIapLog.debug("[GodotIap] Clear transactions completed: \(result)") } catch { GodotIapLog.debug("[GodotIap] clearTransactionIOS error: \(error.localizedDescription)") + await MainActor.run { [self] in + let dict = VariantDictionary() + dict["method"] = Variant("clearTransactionIOS") + dict["requestId"] = Variant(requestId) + dict["success"] = Variant(false) + dict["error"] = Variant(error.localizedDescription) + self.productsFetched.emit(dict) + } } } - return "{\"status\": \"pending\"}" + return "{\"status\": \"pending\", \"requestId\": \"\(requestId)\"}" } @Callable @@ -587,6 +603,7 @@ public class GodotIap: RefCounted, @unchecked Sendable { @Callable public func presentCodeRedemptionSheetIOS() -> String { GodotIapLog.payload("Presenting code redemption sheet", payload: nil) + let requestId = UUID().uuidString Task { [weak self] in guard let self = self else { return } @@ -594,15 +611,25 @@ public class GodotIap: RefCounted, @unchecked Sendable { let result = try await self.openIap.presentCodeRedemptionSheetIOS() await MainActor.run { [self] in let dict = VariantDictionary() + dict["method"] = Variant("presentCodeRedemptionSheetIOS") + dict["requestId"] = Variant(requestId) dict["success"] = Variant(result) self.productsFetched.emit(dict) } } catch { GodotIapLog.debug("[GodotIap] presentCodeRedemptionSheetIOS error: \(error.localizedDescription)") + await MainActor.run { [self] in + let dict = VariantDictionary() + dict["method"] = Variant("presentCodeRedemptionSheetIOS") + dict["requestId"] = Variant(requestId) + dict["success"] = Variant(false) + dict["error"] = Variant(error.localizedDescription) + self.productsFetched.emit(dict) + } } } - return "{\"status\": \"pending\"}" + return "{\"status\": \"pending\", \"requestId\": \"\(requestId)\"}" } @Callable @@ -895,6 +922,7 @@ public class GodotIap: RefCounted, @unchecked Sendable { @Callable public func requestPurchaseOnPromotedProductIOS() -> String { GodotIapLog.payload("Requesting purchase on promoted product", payload: nil) + let requestId = UUID().uuidString Task { [weak self] in guard let self = self else { return } @@ -902,15 +930,25 @@ public class GodotIap: RefCounted, @unchecked Sendable { let result = try await self.openIap.requestPurchaseOnPromotedProductIOS() await MainActor.run { [self] in let dict = VariantDictionary() + dict["method"] = Variant("requestPurchaseOnPromotedProductIOS") + dict["requestId"] = Variant(requestId) dict["success"] = Variant(result) self.productsFetched.emit(dict) } } catch { GodotIapLog.debug("[GodotIap] requestPurchaseOnPromotedProductIOS error: \(error.localizedDescription)") + await MainActor.run { [self] in + let dict = VariantDictionary() + dict["method"] = Variant("requestPurchaseOnPromotedProductIOS") + dict["requestId"] = Variant(requestId) + dict["success"] = Variant(false) + dict["error"] = Variant(error.localizedDescription) + self.productsFetched.emit(dict) + } } } - return "{\"status\": \"pending\"}" + return "{\"status\": \"pending\", \"requestId\": \"\(requestId)\"}" } @Callable diff --git a/packages/docs/src/pages/docs/apis/ios/clear-transaction-ios.tsx b/packages/docs/src/pages/docs/apis/ios/clear-transaction-ios.tsx index 3985b3ff4..065a33be2 100644 --- a/packages/docs/src/pages/docs/apis/ios/clear-transaction-ios.tsx +++ b/packages/docs/src/pages/docs/apis/ios/clear-transaction-ios.tsx @@ -53,7 +53,7 @@ function ClearTransactionIOS() { {`Task ClearTransactionIOSAsync();`} ), gdscript: ( - {`func clear_transaction_ios() -> Variant`} + {`func clear_transaction_ios() -> bool`} ), }} diff --git a/packages/docs/src/pages/docs/apis/ios/present-code-redemption-sheet-ios.tsx b/packages/docs/src/pages/docs/apis/ios/present-code-redemption-sheet-ios.tsx index ba9f9eac7..510ad7c27 100644 --- a/packages/docs/src/pages/docs/apis/ios/present-code-redemption-sheet-ios.tsx +++ b/packages/docs/src/pages/docs/apis/ios/present-code-redemption-sheet-ios.tsx @@ -55,7 +55,7 @@ function PresentCodeRedemptionSheetIOS() { {`Task PresentCodeRedemptionSheetIOSAsync();`} ), gdscript: ( - {`func present_code_redemption_sheet_ios() -> Types.VoidResult`} + {`func present_code_redemption_sheet_ios() -> bool`} ), }} diff --git a/packages/docs/src/pages/docs/apis/ios/request-purchase-on-promoted-product-ios.tsx b/packages/docs/src/pages/docs/apis/ios/request-purchase-on-promoted-product-ios.tsx index d5f90c4f8..90f0fb8fb 100644 --- a/packages/docs/src/pages/docs/apis/ios/request-purchase-on-promoted-product-ios.tsx +++ b/packages/docs/src/pages/docs/apis/ios/request-purchase-on-promoted-product-ios.tsx @@ -69,7 +69,7 @@ Future requestPurchaseOnPromotedProductIOS();`} Task RequestPurchaseOnPromotedProductIOSAsync();`} ), gdscript: ( - {`func request_purchase_on_promoted_product_ios() -> Variant`} + {`func request_purchase_on_promoted_product_ios() -> bool`} ), }} diff --git a/packages/docs/src/pages/docs/apis/ios/sync-ios.tsx b/packages/docs/src/pages/docs/apis/ios/sync-ios.tsx index e59238e1a..dd360ea9c 100644 --- a/packages/docs/src/pages/docs/apis/ios/sync-ios.tsx +++ b/packages/docs/src/pages/docs/apis/ios/sync-ios.tsx @@ -52,7 +52,7 @@ function SyncIOS() { {`Task SyncIOSAsync();`} ), gdscript: ( - {`func sync_ios() -> Types.VoidResult`} + {`func sync_ios() -> bool`} ), }} From 945fd893dae7edd6d5d4a60a3578245b41ac7e80 Mon Sep 17 00:00:00 2001 From: Hyo Date: Thu, 9 Jul 2026 15:45:19 +0900 Subject: [PATCH 12/14] fix: align framework wrapper operation bindings --- libraries/expo-iap/src/modules/ios.ts | 32 +-- .../godot-iap/Example/tests/test_godot_iap.gd | 12 + .../godot-iap/addons/godot-iap/godot_iap.gd | 58 +++-- .../Sources/GodotIap/GodotIap.swift | 20 +- libraries/react-native-iap/src/index.ts | 52 +++-- .../docs/apis/deep-link-to-subscriptions.tsx | 4 +- .../apis/ios/begin-refund-request-ios.tsx | 5 +- scripts/audit-non-godot-parity.mjs | 207 ++++++++++++++++++ 8 files changed, 327 insertions(+), 63 deletions(-) diff --git a/libraries/expo-iap/src/modules/ios.ts b/libraries/expo-iap/src/modules/ios.ts index d4670c8d5..ede068e63 100644 --- a/libraries/expo-iap/src/modules/ios.ts +++ b/libraries/expo-iap/src/modules/ios.ts @@ -8,8 +8,6 @@ import ExpoIapModule from '../ExpoIapModule'; import type { ExternalPurchaseCustomLinkNoticeResultIOS, ExternalPurchaseCustomLinkTokenResultIOS, - ExternalPurchaseCustomLinkTokenTypeIOS, - ExternalPurchaseCustomLinkNoticeTypeIOS, ExternalPurchaseLinkResultIOS, ExternalPurchaseNoticeResultIOS, MutationField, @@ -386,8 +384,10 @@ export const getPromotedProductIOS: QueryField< * * @see {@link https://openiap.dev/docs/apis/ios/request-purchase-on-promoted-product-ios} */ -export const requestPurchaseOnPromotedProductIOS = - async (): Promise => { +export const requestPurchaseOnPromotedProductIOS: MutationField< + 'requestPurchaseOnPromotedProductIOS' +> = + async () => { const result = await ExpoIapModule.requestPurchaseOnPromotedProductIOS(); return result ?? true; }; @@ -470,8 +470,10 @@ export const canPresentExternalPurchaseNoticeIOS: QueryField< * * @see {@link https://openiap.dev/docs/apis/ios/present-external-purchase-notice-sheet-ios} */ -export const presentExternalPurchaseNoticeSheetIOS = - async (): Promise => { +export const presentExternalPurchaseNoticeSheetIOS: MutationField< + 'presentExternalPurchaseNoticeSheetIOS' +> = + async () => { const result = await ExpoIapModule.presentExternalPurchaseNoticeSheetIOS(); return result as ExternalPurchaseNoticeResultIOS; }; @@ -502,8 +504,10 @@ export const presentExternalPurchaseLinkIOS: MutationField< * * @see {@link https://openiap.dev/docs/apis/ios/is-eligible-for-external-purchase-custom-link-ios} */ -export const isEligibleForExternalPurchaseCustomLinkIOS = - async (): Promise => { +export const isEligibleForExternalPurchaseCustomLinkIOS: QueryField< + 'isEligibleForExternalPurchaseCustomLinkIOS' +> = + async () => { return !!(await ExpoIapModule.isEligibleForExternalPurchaseCustomLinkIOS()); }; @@ -518,9 +522,9 @@ export const isEligibleForExternalPurchaseCustomLinkIOS = * * @see {@link https://openiap.dev/docs/apis/ios/get-external-purchase-custom-link-token-ios} */ -export const getExternalPurchaseCustomLinkTokenIOS = async ( - tokenType: ExternalPurchaseCustomLinkTokenTypeIOS, -): Promise => { +export const getExternalPurchaseCustomLinkTokenIOS: QueryField< + 'getExternalPurchaseCustomLinkTokenIOS' +> = async (tokenType) => { if (!tokenType) { throw new Error( "getExternalPurchaseCustomLinkTokenIOS requires a tokenType ('acquisition' or 'services')", @@ -544,9 +548,9 @@ export const getExternalPurchaseCustomLinkTokenIOS = async ( * * @see {@link https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios} */ -export const showExternalPurchaseCustomLinkNoticeIOS = async ( - noticeType: ExternalPurchaseCustomLinkNoticeTypeIOS, -): Promise => { +export const showExternalPurchaseCustomLinkNoticeIOS: MutationField< + 'showExternalPurchaseCustomLinkNoticeIOS' +> = async (noticeType) => { if (!noticeType) { throw new Error( "showExternalPurchaseCustomLinkNoticeIOS requires a noticeType ('browser')", diff --git a/libraries/godot-iap/Example/tests/test_godot_iap.gd b/libraries/godot-iap/Example/tests/test_godot_iap.gd index 678a30295..660d0ab4e 100644 --- a/libraries/godot-iap/Example/tests/test_godot_iap.gd +++ b/libraries/godot-iap/Example/tests/test_godot_iap.gd @@ -226,6 +226,10 @@ func test_ios_methods_mock() -> void: var entitlement = GodotIapPlugin.current_entitlement_ios("test_sku") _assert_true(entitlement == null or entitlement is Types.PurchaseIOS, "current_entitlement_ios should return PurchaseIOS or null") + # begin_refund_request_ios + var refund_status = await GodotIapPlugin.begin_refund_request_ios("test_sku") + _assert_true(refund_status is String, "begin_refund_request_ios should return String") + # latest_transaction_ios var latest = GodotIapPlugin.latest_transaction_ios("test_sku") _assert_true(latest == null or latest is Types.PurchaseIOS, "latest_transaction_ios should return PurchaseIOS or null") @@ -256,6 +260,10 @@ func test_android_methods_mock() -> void: var alternative_accepted = GodotIapPlugin.show_alternative_billing_dialog_android() _assert_true(alternative_accepted is bool, "show_alternative_billing_dialog_android should return bool") + # create_alternative_billing_token_android + var alternative_token = GodotIapPlugin.create_alternative_billing_token_android() + _assert_true(alternative_token is String, "create_alternative_billing_token_android should return String") + # get_package_name_android var package_name = GodotIapPlugin.get_package_name_android() _assert_true(package_name is String, "get_package_name_android should return String") @@ -264,6 +272,10 @@ func test_android_methods_mock() -> void: var has_subs = GodotIapPlugin.has_active_subscriptions() _assert_true(has_subs is bool, "has_active_subscriptions should return bool") + # deep_link_to_subscriptions + var deep_link_result = await GodotIapPlugin.deep_link_to_subscriptions() + _assert_true(deep_link_result is Types.VoidResult, "deep_link_to_subscriptions should return VoidResult") + # ============================================ # Test Utilities diff --git a/libraries/godot-iap/addons/godot-iap/godot_iap.gd b/libraries/godot-iap/addons/godot-iap/godot_iap.gd index 221d6f111..a9f41d041 100644 --- a/libraries/godot-iap/addons/godot-iap/godot_iap.gd +++ b/libraries/godot-iap/addons/godot-iap/godot_iap.gd @@ -904,17 +904,18 @@ func show_manage_subscriptions_ios() -> Array: ## Begin refund request (iOS only). ## @param product_id: String - the product ID to request refund for -## @return Types.RefundResultIOS +## @return String - refund request status, or empty string on failure ## ## See: https://openiap.dev/docs/apis/ios/begin-refund-request-ios -func begin_refund_request_ios(product_id: String) -> Variant: - if _native_plugin and _platform == "iOS": - var result_json = _native_plugin.call("beginRefundRequestIOS", product_id) - var result = JSON.parse_string(result_json) - if result is Dictionary: - return Types.RefundResultIOS.from_dict(result) - var default_result = Types.RefundResultIOS.new() - return default_result +func begin_refund_request_ios(product_id: String) -> String: + if not (_native_plugin and _platform == "iOS"): + return "" + var pending = _native_plugin.call("beginRefundRequestIOS", product_id) + var request_id = _parse_request_id(pending) + var payload = await _await_products_fetched_for("beginRefundRequestIOS", request_id) + if payload.get("success", false): + return payload.get("status", "") + return "" ## Get current entitlement for a product (iOS only). ## @param sku: String - product SKU @@ -1312,17 +1313,16 @@ func show_alternative_billing_dialog_android() -> bool: return false ## Create alternative billing token (Android). -## @return Types.BillingProgramReportingDetailsAndroid +## @return String - reporting token, or empty string on failure ## ## See: https://openiap.dev/docs/apis/android/create-alternative-billing-token-android -func create_alternative_billing_token_android() -> Variant: +func create_alternative_billing_token_android() -> String: if _native_plugin and _platform == "Android": var result_json = _native_plugin.call("createAlternativeBillingTokenAndroid") var result = JSON.parse_string(result_json) - if result is Dictionary: - return Types.BillingProgramReportingDetailsAndroid.from_dict(result) - var default_result = Types.BillingProgramReportingDetailsAndroid.new() - return default_result + if result is Dictionary and result.get("success", false): + return result.get("token", "") + return "" ## Check if a billing program is available (Android 8.2.0+). ## @param billing_program: Types.BillingProgramAndroid - billing program enum value @@ -1443,17 +1443,29 @@ func get_package_name_android() -> String: ## Open subscription management deep link. ## @param options: Types.DeepLinkOptions or null - optional deep link configuration -## @return void +## @return Types.VoidResult ## ## See: https://openiap.dev/docs/apis/deep-link-to-subscriptions -func deep_link_to_subscriptions(options = null) -> void: +func deep_link_to_subscriptions(options = null) -> Variant: var opts = options if options != null else Types.DeepLinkOptions.new() - if _native_plugin and (_platform == "Android" or _platform == "iOS"): - var options_json = JSON.stringify(opts.to_dict()) - _native_plugin.call("deepLinkToSubscriptions", options_json) + if _native_plugin and _platform == "Android": + var android_options_json = JSON.stringify(opts.to_dict()) + var android_result_json = _native_plugin.call("deepLinkToSubscriptions", android_options_json) + var android_result = JSON.parse_string(android_result_json) + if android_result is Dictionary: + return Types.VoidResult.from_dict(android_result) + elif _native_plugin and _platform == "iOS": + var ios_options_json = JSON.stringify(opts.to_dict()) + var ios_pending = _native_plugin.call("deepLinkToSubscriptions", ios_options_json) + var ios_request_id = _parse_request_id(ios_pending) + var ios_payload = await _await_products_fetched_for("deepLinkToSubscriptions", ios_request_id) + return Types.VoidResult.from_dict(ios_payload) elif _platform == "iOS": # iOS: Open App Store subscription management URL OS.shell_open("https://apps.apple.com/account/subscriptions") + var ios_fallback_result = Types.VoidResult.new() + ios_fallback_result.success = true + return ios_fallback_result elif _platform == "Android": # Android: Open Play Store subscription management URL var sku = opts.sku_android if opts.sku_android else "" @@ -1464,6 +1476,12 @@ func deep_link_to_subscriptions(options = null) -> void: OS.shell_open("https://play.google.com/store/account/subscriptions?sku=%s&package=%s" % [encoded_sku, encoded_package]) else: OS.shell_open("https://play.google.com/store/account/subscriptions") + var android_fallback_result = Types.VoidResult.new() + android_fallback_result.success = true + return android_fallback_result + var unavailable_result = Types.VoidResult.new() + unavailable_result.success = false + return unavailable_result # ========================================== # Utility Functions diff --git a/libraries/godot-iap/ios-gdextension/Sources/GodotIap/GodotIap.swift b/libraries/godot-iap/ios-gdextension/Sources/GodotIap/GodotIap.swift index 0aad555ad..815103d43 100644 --- a/libraries/godot-iap/ios-gdextension/Sources/GodotIap/GodotIap.swift +++ b/libraries/godot-iap/ios-gdextension/Sources/GodotIap/GodotIap.swift @@ -662,6 +662,7 @@ public class GodotIap: RefCounted, @unchecked Sendable { @Callable public func beginRefundRequestIOS(sku: String) -> String { GodotIapLog.debug("[GodotIap] Beginning refund request for: \(sku)") + let requestId = UUID().uuidString Task { [weak self] in guard let self = self else { return } @@ -669,6 +670,8 @@ public class GodotIap: RefCounted, @unchecked Sendable { let result = try await self.openIap.beginRefundRequestIOS(sku: sku) await MainActor.run { [self] in let dict = VariantDictionary() + dict["method"] = Variant("beginRefundRequestIOS") + dict["requestId"] = Variant(requestId) dict["success"] = Variant(true) dict["status"] = Variant(result ?? "unknown") self.productsFetched.emit(dict) @@ -677,6 +680,8 @@ public class GodotIap: RefCounted, @unchecked Sendable { GodotIapLog.debug("[GodotIap] beginRefundRequestIOS error: \(error.localizedDescription)") await MainActor.run { [self] in let dict = VariantDictionary() + dict["method"] = Variant("beginRefundRequestIOS") + dict["requestId"] = Variant(requestId) dict["success"] = Variant(false) dict["error"] = Variant(error.localizedDescription) self.productsFetched.emit(dict) @@ -684,7 +689,7 @@ public class GodotIap: RefCounted, @unchecked Sendable { } } - return "{\"status\": \"pending\"}" + return "{\"status\": \"pending\", \"requestId\": \"\(requestId)\"}" } @Callable @@ -1023,6 +1028,7 @@ public class GodotIap: RefCounted, @unchecked Sendable { @Callable public func deepLinkToSubscriptions(optionsJson: String) -> String { GodotIapLog.payload("Deep linking to subscriptions", payload: nil) + let requestId = UUID().uuidString Task { [weak self] in guard let self = self else { return } @@ -1040,15 +1046,25 @@ public class GodotIap: RefCounted, @unchecked Sendable { try await self.openIap.deepLinkToSubscriptions(options) await MainActor.run { [self] in let dict = VariantDictionary() + dict["method"] = Variant("deepLinkToSubscriptions") + dict["requestId"] = Variant(requestId) dict["success"] = Variant(true) self.productsFetched.emit(dict) } } catch { GodotIapLog.debug("[GodotIap] deepLinkToSubscriptions error: \(error.localizedDescription)") + await MainActor.run { [self] in + let dict = VariantDictionary() + dict["method"] = Variant("deepLinkToSubscriptions") + dict["requestId"] = Variant(requestId) + dict["success"] = Variant(false) + dict["error"] = Variant(error.localizedDescription) + self.productsFetched.emit(dict) + } } } - return "{\"status\": \"pending\"}" + return "{\"status\": \"pending\", \"requestId\": \"\(requestId)\"}" } // MARK: - Verification Methods diff --git a/libraries/react-native-iap/src/index.ts b/libraries/react-native-iap/src/index.ts index ae054f7a5..841c5b8fb 100644 --- a/libraries/react-native-iap/src/index.ts +++ b/libraries/react-native-iap/src/index.ts @@ -18,11 +18,6 @@ import {ErrorCode} from './types'; import type { AndroidSubscriptionOfferInput, DiscountOfferInputIOS, - ExternalPurchaseCustomLinkNoticeResultIOS, - ExternalPurchaseCustomLinkNoticeTypeIOS, - ExternalPurchaseCustomLinkTokenResultIOS, - ExternalPurchaseCustomLinkTokenTypeIOS, - ExternalPurchaseNoticeResultIOS, FetchProductsResult, MutationField, Product, @@ -2404,8 +2399,10 @@ export const presentCodeRedemptionSheetIOS: MutationField< * * @see {@link https://openiap.dev/docs/apis/ios/request-purchase-on-promoted-product-ios} */ -export const requestPurchaseOnPromotedProductIOS = - async (): Promise => { +export const requestPurchaseOnPromotedProductIOS: MutationField< + 'requestPurchaseOnPromotedProductIOS' +> = + async () => { if (Platform.OS !== 'ios') { throw new Error( 'requestPurchaseOnPromotedProductIOS is only available on iOS', @@ -2997,7 +2994,13 @@ export const getBillingChoiceInfoAndroid: QueryField< * * @see {@link https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android} */ -export const createBillingProgramReportingDetailsAndroid = async ( +export const createBillingProgramReportingDetailsAndroid: MutationField< + 'createBillingProgramReportingDetailsAndroid' +> & + (( + program: BillingProgramAndroid, + developerBillingType?: DeveloperBillingTypeAndroid | null, + ) => Promise) = async ( programOrArgs: | BillingProgramAndroid | { @@ -3016,10 +3019,11 @@ export const createBillingProgramReportingDetailsAndroid = async ( typeof programOrArgs === 'string' ? developerBillingType : (programOrArgs.developerBillingType ?? developerBillingType); - const result = await IAP.instance.createBillingProgramReportingDetailsAndroid( - program, - resolvedDeveloperBillingType ?? null, - ); + const result = + await IAP.instance.createBillingProgramReportingDetailsAndroid( + program, + resolvedDeveloperBillingType ?? null, + ); return { billingProgram: result.billingProgram as unknown as BillingProgramAndroid, externalTransactionToken: result.externalTransactionToken, @@ -3193,8 +3197,10 @@ export const canPresentExternalPurchaseNoticeIOS: QueryField< * * @see {@link https://openiap.dev/docs/apis/ios/present-external-purchase-notice-sheet-ios} */ -export const presentExternalPurchaseNoticeSheetIOS = - async (): Promise => { +export const presentExternalPurchaseNoticeSheetIOS: MutationField< + 'presentExternalPurchaseNoticeSheetIOS' +> = + async () => { if (Platform.OS !== 'ios') { throw new Error('External purchase is only supported on iOS'); } @@ -3262,8 +3268,10 @@ export const presentExternalPurchaseLinkIOS: MutationField< * * @see {@link https://openiap.dev/docs/apis/ios/is-eligible-for-external-purchase-custom-link-ios} */ -export const isEligibleForExternalPurchaseCustomLinkIOS = - async (): Promise => { +export const isEligibleForExternalPurchaseCustomLinkIOS: QueryField< + 'isEligibleForExternalPurchaseCustomLinkIOS' +> = + async () => { if (Platform.OS !== 'ios') { return false; } @@ -3299,9 +3307,9 @@ export const isEligibleForExternalPurchaseCustomLinkIOS = * * @see {@link https://openiap.dev/docs/apis/ios/get-external-purchase-custom-link-token-ios} */ -export const getExternalPurchaseCustomLinkTokenIOS = async ( - tokenType: ExternalPurchaseCustomLinkTokenTypeIOS, -): Promise => { +export const getExternalPurchaseCustomLinkTokenIOS: QueryField< + 'getExternalPurchaseCustomLinkTokenIOS' +> = async (tokenType) => { if (Platform.OS !== 'ios') { throw new Error( 'External purchase custom link is only supported on iOS 18.1+', @@ -3339,9 +3347,9 @@ export const getExternalPurchaseCustomLinkTokenIOS = async ( * * @see {@link https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios} */ -export const showExternalPurchaseCustomLinkNoticeIOS = async ( - noticeType: ExternalPurchaseCustomLinkNoticeTypeIOS, -): Promise => { +export const showExternalPurchaseCustomLinkNoticeIOS: MutationField< + 'showExternalPurchaseCustomLinkNoticeIOS' +> = async (noticeType) => { if (Platform.OS !== 'ios') { throw new Error( 'External purchase custom link is only supported on iOS 18.1+', diff --git a/packages/docs/src/pages/docs/apis/deep-link-to-subscriptions.tsx b/packages/docs/src/pages/docs/apis/deep-link-to-subscriptions.tsx index 951d35ee8..9be55b802 100644 --- a/packages/docs/src/pages/docs/apis/deep-link-to-subscriptions.tsx +++ b/packages/docs/src/pages/docs/apis/deep-link-to-subscriptions.tsx @@ -76,7 +76,7 @@ interface DeepLinkOptions { {`Task DeepLinkToSubscriptionsAsync(DeepLinkOptions? options = null);`} ), gdscript: ( - {`func deep_link_to_subscriptions(options: DeepLinkOptions) -> void`} + {`func deep_link_to_subscriptions(options: DeepLinkOptions) -> Types.VoidResult`} ), }} @@ -206,7 +206,7 @@ await ((MutationResolver)OpenIapClient.Instance).DeepLinkToSubscriptionsAsync( {`var options = DeepLinkOptions.new() options.sku_android = "com.app.premium" options.package_name_android = "com.yourcompany.app" -await iap.deep_link_to_subscriptions(options)`} +var result = await iap.deep_link_to_subscriptions(options)`} ), }} diff --git a/packages/docs/src/pages/docs/apis/ios/begin-refund-request-ios.tsx b/packages/docs/src/pages/docs/apis/ios/begin-refund-request-ios.tsx index 503dad89e..4d8c95b6e 100644 --- a/packages/docs/src/pages/docs/apis/ios/begin-refund-request-ios.tsx +++ b/packages/docs/src/pages/docs/apis/ios/begin-refund-request-ios.tsx @@ -56,7 +56,7 @@ function BeginRefundRequestIOS() { {`Task BeginRefundRequestIOSAsync(String Sku)`} ), gdscript: ( - {`func begin_refund_request_ios(product_id: String) -> Types.RefundResultIOS`} + {`func begin_refund_request_ios(product_id: String) -> String`} ), }} @@ -117,8 +117,7 @@ var status = await ((MutationResolver)OpenIapClient.Instance) ), gdscript: ( {`if iap.get_platform() == "iOS": - # Synchronous — no await; returns Types.RefundResultIOS directly. - var result = iap.begin_refund_request_ios("com.app.premium")`} + var status = await iap.begin_refund_request_ios("com.app.premium")`} ), }} diff --git a/scripts/audit-non-godot-parity.mjs b/scripts/audit-non-godot-parity.mjs index a1f6cf753..9888bc082 100644 --- a/scripts/audit-non-godot-parity.mjs +++ b/scripts/audit-non-godot-parity.mjs @@ -268,6 +268,212 @@ function parseGeneratedOperations(kind) { .sort(); } +function escapeRegExp(value) { + return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +function getTopLevelConstDeclaration(text, constName) { + const match = new RegExp( + `(^|\\n)(?:export\\s+)?const\\s+${escapeRegExp(constName)}\\b`, + ).exec(text); + if (!match) return ''; + + const start = match.index + match[1].length; + const rest = text.slice(start + 1); + const next = /\n(?:export\s+)?(?:const|function|class|type|interface)\s/.exec(rest); + const end = next ? start + 1 + next.index : text.length; + return text.slice(start, end); +} + +function hasTypeScriptFieldBinding(text, operation, fieldType) { + return [operation, `${operation}Field`].some((constName) => { + const declaration = getTopLevelConstDeclaration(text, constName); + return ( + declaration.includes(`${fieldType}<`) && + (declaration.includes(`'${operation}'`) || + declaration.includes(`"${operation}"`)) + ); + }); +} + +function expectTypeScriptFieldBindings(label, files, kind) { + const text = files.map((file) => read(file)).join('\n'); + const fieldType = `${kind}Field`; + const missing = parseGeneratedOperations(kind).filter( + (operation) => !hasTypeScriptFieldBinding(text, operation, fieldType), + ); + if (missing.length > 0) { + fail(`${label} missing ${fieldType} bindings: ${missing.join(', ')}`); + } +} + +function extractBetween(text, startMarker, endMarker) { + const start = text.indexOf(startMarker); + if (start < 0) return ''; + const end = endMarker ? text.indexOf(endMarker, start + startMarker.length) : -1; + return text.slice(start, end < 0 ? text.length : end); +} + +function expectFlutterHandlers(kind, block) { + if (!block) { + fail(`Flutter ${kind}Handlers block is missing`); + return; + } + const missing = parseGeneratedOperations(kind).filter( + (operation) => !new RegExp(`\\b${escapeRegExp(operation)}\\s*:`).test(block), + ); + if (missing.length > 0) { + fail(`Flutter ${kind}Handlers missing generated operations: ${missing.join(', ')}`); + } +} + +function parseGodotOperationFields() { + const fields = []; + const lines = read('libraries/godot-iap/addons/godot-iap/types.gd').split('\n'); + let section = null; + let current = null; + + const flush = () => { + if (current) fields.push(current); + current = null; + }; + + for (const line of lines) { + const sectionMatch = line.match(/^class (Query|Mutation):$/); + if (sectionMatch) { + flush(); + section = sectionMatch[1]; + continue; + } + + if (/^class /.test(line)) { + flush(); + section = null; + continue; + } + + if (!section) continue; + + const fieldMatch = line.match(/^\tclass ([A-Za-z0-9_]+)Field:$/); + if (fieldMatch) { + flush(); + current = { + section, + className: fieldMatch[1], + name: '', + snakeName: '', + returnType: '', + isArray: false, + }; + continue; + } + + if (!current) continue; + + const stringConstMatch = line.match(/^\t\tconst (name|snake_name|return_type) = "([^"]+)"$/); + if (stringConstMatch) { + if (stringConstMatch[1] === 'name') current.name = stringConstMatch[2]; + if (stringConstMatch[1] === 'snake_name') current.snakeName = stringConstMatch[2]; + if (stringConstMatch[1] === 'return_type') current.returnType = stringConstMatch[2]; + continue; + } + + const isArrayMatch = line.match(/^\t\tconst is_array = (true|false)$/); + if (isArrayMatch) current.isArray = isArrayMatch[1] === 'true'; + } + + flush(); + return fields; +} + +function parseGodotWrapperFunctions() { + const functions = new Map(); + const source = read('libraries/godot-iap/addons/godot-iap/godot_iap.gd'); + for (const match of source.matchAll( + /^func\s+([A-Za-z_][A-Za-z0-9_]*)\([^)]*\)\s*(?:->\s*([^:]+))?:/gm, + )) { + functions.set(match[1], (match[2] ?? '').trim()); + } + return functions; +} + +function expectedGodotReturnAnnotation(field) { + if (field.isArray) return 'Array'; + if (field.returnType === 'Boolean') return 'bool'; + if (field.returnType === 'String') return 'String'; + if (field.returnType === 'Int') return 'int'; + if (field.returnType === 'Float') return 'float'; + return 'Variant'; +} + +function checkFrameworkOperationBindings() { + for (const kind of ['Query', 'Mutation']) { + expectTypeScriptFieldBindings( + `React Native ${kind}`, + ['libraries/react-native-iap/src/index.ts'], + kind, + ); + expectTypeScriptFieldBindings( + `Expo ${kind}`, + [ + 'libraries/expo-iap/src/index.ts', + 'libraries/expo-iap/src/modules/android.ts', + 'libraries/expo-iap/src/modules/ios.ts', + ], + kind, + ); + } + + const flutter = read('libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart'); + expectFlutterHandlers( + 'Query', + extractBetween( + flutter, + 'gentype.QueryHandlers get queryHandlers', + 'gentype.MutationLaunchExternalLinkAndroidHandler', + ), + ); + expectFlutterHandlers( + 'Mutation', + extractBetween( + flutter, + 'gentype.MutationHandlers get mutationHandlers', + 'gentype.SubscriptionHandlers get subscriptionHandlers', + ), + ); + expectFlutterHandlers( + 'Subscription', + extractBetween( + flutter, + 'gentype.SubscriptionHandlers get subscriptionHandlers', + '\n}', + ), + ); + + const godotFunctions = parseGodotWrapperFunctions(); + for (const field of parseGodotOperationFields()) { + if (field.name === '_placeholder') continue; + const actual = godotFunctions.get(field.snakeName); + if (!actual) { + fail(`Godot wrapper missing generated ${field.section} operation ${field.name} (${field.snakeName})`); + continue; + } + + if (field.snakeName === 'fetch_products' && actual === 'Array') { + continue; + } + + const expected = expectedGodotReturnAnnotation(field); + if (expected === 'Array') { + if (!actual.startsWith('Array')) { + fail(`Godot wrapper ${field.snakeName} should return Array for ${field.returnType}, got ${actual || '(none)'}`); + } + } else if (actual !== expected) { + fail(`Godot wrapper ${field.snakeName} should return ${expected} for ${field.returnType}, got ${actual || '(none)'}`); + } + } +} + function parseKotlinResolverOperations(relativePath, kind) { expectFile(relativePath); if (!exists(relativePath)) return []; @@ -3318,6 +3524,7 @@ checkExpoSsotRegistry(); checkGeneratedTypeSync(); checkGqlRuntimeExports(); checkOperationRegistry(); +checkFrameworkOperationBindings(); checkExpoRouterExample('libraries/expo-iap/example', 'src/utils/constants.ts'); checkReactNativeClassic(); checkFlutter(); From 94bd0a7657694172e97bb8c5d9373e22c48d246d Mon Sep 17 00:00:00 2001 From: Hyo Date: Sat, 11 Jul 2026 07:31:41 +0900 Subject: [PATCH 13/14] fix(iap): complete billing 9.1 release parity Bump the OpenIAP spec to 2.1.0, align framework hooks and store-specific unsupported behavior, consolidate stable release notes, and preserve verification lifecycle guidance. Closes #221 --- .claude/commands/audit-code.md | 23 +- .claude/commands/e2e-tests.md | 69 +- .claude/guides/05-google-package.md | 11 +- .codex/skills/generate-doc/SKILL.md | 23 +- AGENTS.md | 22 +- knowledge/_claude-context/context.md | 255 +- knowledge/external/google-billing-api.md | 158 +- knowledge/external/horizon-api.md | 15 +- knowledge/internal/04-platform-packages.md | 37 +- knowledge/internal/05-docs-patterns.md | 19 + knowledge/internal/06-git-deployment.md | 22 +- .../sandbox-subscription-billing-issue.md | 2 +- libraries/expo-iap/README.md | 2 +- .../java/expo/modules/iap/ExpoIapHelper.kt | 15 +- .../java/expo/modules/iap/ExpoIapModule.kt | 9 +- .../__tests__/subscription-flow.test.tsx | 63 +- .../example/app/subscription-flow.tsx | 47 +- .../expo-iap/plugin/__tests__/withIAP.test.ts | 55 +- libraries/expo-iap/plugin/src/withIAP.ts | 45 +- .../expo-iap/src/__tests__/index.test.ts | 76 + .../expo-iap/src/__tests__/useIAP.test.tsx | 92 + .../src/__tests__/vega-adapter.test.ts | 27 +- libraries/expo-iap/src/index.ts | 43 +- .../src/modules/__tests__/android.test.ts | 28 +- libraries/expo-iap/src/modules/android.ts | 14 +- libraries/expo-iap/src/types.ts | 161 +- libraries/expo-iap/src/useIAP.ts | 118 +- libraries/expo-iap/src/vega-adapter.ts | 51 +- libraries/flutter_inapp_purchase/README.md | 2 +- .../AndroidInappPurchasePlugin.kt | 63 +- .../android/app/src/main/AndroidManifest.xml | 2 +- .../flutter_inapp_purchase/lib/builders.dart | 6 + .../lib/flutter_inapp_purchase.dart | 27 +- .../flutter_inapp_purchase/lib/types.dart | 211 +- .../test/builders_unit_test.dart | 11 +- .../flutter_inapp_purchase_channel_test.dart | 66 +- libraries/godot-iap/CLAUDE.md | 1 + .../godot-iap/Example/export_presets.cfg | 2 +- libraries/godot-iap/Example/project.godot | 2 +- .../godot-iap/Example/tests/test_godot_iap.gd | 64 + libraries/godot-iap/Makefile | 3 + libraries/godot-iap/README.md | 4 +- .../godot-iap/android/GodotIap.release.aar | Bin 85433 -> 99814 bytes .../bin/ios/GodotIap.framework/GodotIap | Bin 4209256 -> 4566640 bytes .../bin/ios/GodotIap.framework/Info.plist | Bin 755 -> 755 bytes .../SwiftGodotRuntime.framework/Info.plist | Bin 770 -> 770 bytes .../SwiftGodotRuntime | Bin 21602336 -> 21602336 bytes .../godot-iap/addons/godot-iap/godot_iap.gd | 30 +- libraries/godot-iap/addons/godot-iap/types.gd | 184 +- .../main/java/dev/hyo/godotiap/GodotIap.kt | 43 +- .../java/dev/hyo/godotiap/GodotIapHelper.kt | 26 + libraries/godot-iap/scripts/install-hooks.sh | 20 +- libraries/kmp-iap/README.md | 2 +- .../screens/AlternativeBillingScreen.kt | 101 +- .../screens/AvailablePurchasesScreen.kt | 2 +- .../hyo/martie/screens/PurchaseFlowScreen.kt | 8 +- .../martie/screens/SubscriptionFlowScreen.kt | 8 +- libraries/kmp-iap/library/build.gradle.kts | 6 +- .../kmpiap/AmazonInAppPurchaseAndroid.kt | 77 +- .../kotlin/io/github/hyochan/kmpiap/Helper.kt | 24 +- .../hyochan/kmpiap/InAppPurchaseAndroid.kt | 303 +- .../hyochan/kmpiap/AmazonErrorMappingTest.kt | 18 + .../kmpiap/BillingResultMappingTest.kt | 33 + .../hyochan/kmpiap/PurchaseTimestampTest.kt | 16 + .../SubscriptionReplacementResolutionTest.kt | 42 + .../kmpiap/UnsupportedGoogleApisTest.kt | 29 + .../github/hyochan/kmpiap/dsl/PurchaseDsl.kt | 10 +- .../io/github/hyochan/kmpiap/openiap/Types.kt | 220 +- .../hyochan/kmpiap/InAppPurchaseTest.kt | 86 +- .../serializeTransaction_enhanced.swift | 4 +- libraries/maui-iap/Directory.Build.props | 12 + libraries/maui-iap/README.md | 18 + .../Pages/AlternativeBillingPage.xaml.cs | 16 +- .../Pages/PurchaseFlowPage.xaml.cs | 6 +- .../Pages/SubscriptionFlowPage.xaml.cs | 6 +- .../OpenIap.Maui.Example/Utils/ErrorUtils.cs | 14 + libraries/maui-iap/src/Directory.Build.props | 6 +- .../OpenIap.Maui.Bindings.Android.csproj | 6 +- .../src/OpenIap.Maui/OpenIap.Maui.csproj | 8 +- libraries/maui-iap/src/OpenIap.Maui/Types.cs | 185 +- libraries/react-native-iap/CLAUDE.md | 2 +- libraries/react-native-iap/README.md | 4 +- .../java/com/margelo/nitro/iap/HybridRnIap.kt | 85 +- .../screens/SubscriptionFlow.test.tsx | 40 +- .../android/app/src/main/AndroidManifest.xml | 2 +- .../example/screens/AlternativeBilling.tsx | 12 +- .../example/screens/SubscriptionFlow.tsx | 38 +- .../__tests__/hooks/useIAP.android.test.ts | 82 + .../src/__tests__/index.test.ts | 79 + .../src/__tests__/vega-adapter.test.ts | 27 +- .../react-native-iap/src/hooks/useIAP.ts | 63 + libraries/react-native-iap/src/index.ts | 171 +- .../react-native-iap/src/specs/RnIap.nitro.ts | 20 +- libraries/react-native-iap/src/types.ts | 161 +- .../react-native-iap/src/vega-adapter.ts | 46 +- openiap-versions.json | 2 +- packages/apple/Sources/Models/Types.swift | 161 +- .../apple/Sources/OpenIapModule+ObjC.swift | 2 +- packages/docs/openiap-versions.json | 2 +- packages/docs/package.json | 2 +- packages/docs/public/llms-full.txt | 175 +- packages/docs/public/llms.txt | 2 +- packages/docs/src/lib/images.ts | 2 +- packages/docs/src/lib/searchData.ts | 2 +- .../docs/src/pages/docs/android-setup.tsx | 23 +- ...ling-program-reporting-details-android.tsx | 5 +- .../enable-billing-program-android.tsx | 7 +- .../get-billing-choice-info-android.tsx | 3 +- .../is-billing-program-available-android.tsx | 4 +- .../android/launch-external-link-android.tsx | 44 +- ...ing-program-information-dialog-android.tsx | 12 +- .../android/show-in-app-messages-android.tsx | 26 +- .../src/pages/docs/apis/init-connection.tsx | 54 +- packages/docs/src/pages/docs/events.tsx | 3 +- ...oper-provided-billing-listener-android.tsx | 169 +- .../pages/docs/features/external-purchase.tsx | 10 +- .../src/pages/docs/foundation/one-pager.tsx | 6 +- packages/docs/src/pages/docs/kit-backend.tsx | 9 + packages/docs/src/pages/docs/setup/godot.tsx | 2 +- .../src/pages/docs/setup/store/horizon.tsx | 21 +- .../docs/types/alternative-billing-types.tsx | 56 +- .../src/pages/docs/types/billing-programs.tsx | 135 +- .../docs/types/request-purchase-props.tsx | 21 +- .../docs/src/pages/docs/updates/releases.tsx | 499 +- packages/docs/src/pages/home.tsx | 4 +- packages/docs/src/pages/introduction.tsx | 4 +- packages/google/ALTERNATIVE_BILLING.md | 4 +- packages/google/Example/build.gradle.kts | 6 +- .../Example/src/main/AndroidManifest.xml | 7 +- packages/google/README.md | 4 +- packages/google/openiap/build.gradle.kts | 24 +- .../java/dev/hyo/openiap/OpenIapModule.kt | 120 +- .../java/dev/hyo/openiap/OpenIapModule.kt | 67 +- .../openiap/store/OpenIapStoreExtensions.kt | 5 +- .../java/dev/hyo/openiap/OpenIapProtocol.kt | 13 +- .../java/dev/hyo/openiap/OpenIapViewModel.kt | 4 +- .../src/main/java/dev/hyo/openiap/Types.kt | 220 +- .../dev/hyo/openiap/helpers/CommonHelpers.kt | 23 + .../DeveloperProvidedBillingListener.kt | 24 +- .../hyo/openiap/listener/OpenIapListener.kt | 5 +- .../dev/hyo/openiap/store/OpenIapStore.kt | 11 +- .../java/dev/hyo/openiap/OpenIapModule.kt | 298 +- .../openiap/utils/BillingResultConverters.kt | 23 + .../openiap/BillingChoiceAndroidTypesTest.kt | 138 + .../openiap/BillingLibraryClassPathTest.kt | 58 + .../hyo/openiap/HorizonAppIdMetadataTest.kt | 54 + .../utils/BillingResultConvertersTest.kt | 36 + packages/gql/CONVENTION.md | 10 + packages/gql/codegen/plugins/csharp.ts | 2 +- packages/gql/codegen/plugins/gdscript.ts | 29 +- packages/gql/package.json | 2 +- packages/gql/src/api-android.graphql | 33 +- packages/gql/src/codegen-defaults.test.ts | 51 +- packages/gql/src/event.graphql | 10 +- packages/gql/src/generated/Types.cs | 185 +- packages/gql/src/generated/Types.kt | 220 +- packages/gql/src/generated/Types.swift | 161 +- packages/gql/src/generated/types.dart | 211 +- packages/gql/src/generated/types.gd | 184 +- packages/gql/src/generated/types.ts | 161 +- packages/gql/src/type-android.graphql | 125 +- packages/gql/src/type-ios.graphql | 1 + packages/gql/src/type.graphql | 28 +- packages/kit/src/content/faq.md | 2 +- .../organization/project/PurchasesTable.tsx | 4 +- .../organization/project/purchase-detail.tsx | 10 +- .../auth/organization/project/purchases.tsx | 4 +- packages/kit/src/pages/docs/sections/api.tsx | 14 +- scripts/audit-non-godot-parity.mjs | 7632 +++++++++++------ scripts/sync-versions.sh | 23 +- 170 files changed, 11241 insertions(+), 4839 deletions(-) create mode 100644 libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/AmazonErrorMappingTest.kt create mode 100644 libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/BillingResultMappingTest.kt create mode 100644 libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/PurchaseTimestampTest.kt create mode 100644 libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/SubscriptionReplacementResolutionTest.kt create mode 100644 libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/UnsupportedGoogleApisTest.kt create mode 100644 libraries/maui-iap/Directory.Build.props create mode 100644 packages/google/openiap/src/play/java/dev/hyo/openiap/utils/BillingResultConverters.kt create mode 100644 packages/google/openiap/src/testHorizon/java/dev/hyo/openiap/HorizonAppIdMetadataTest.kt create mode 100644 packages/google/openiap/src/testPlay/java/dev/hyo/openiap/utils/BillingResultConvertersTest.kt diff --git a/.claude/commands/audit-code.md b/.claude/commands/audit-code.md index 1a25b4360..de470fc02 100644 --- a/.claude/commands/audit-code.md +++ b/.claude/commands/audit-code.md @@ -37,8 +37,8 @@ Use WebSearch to get the latest platform API information: **Google Play Billing Library:** - Search: "Google Play Billing Library release notes site:developer.android.com" -- Check for new features in latest version (currently 8.x) -- Key areas: one-time products, subscription offers, billing programs +- Check for new features in the latest stable version (currently 9.1.0) +- Key areas: one-time products, subscription offers, billing programs, Billing Choice, in-app messages **Apple StoreKit 2:** @@ -79,9 +79,14 @@ Compare current implementation against latest platform APIs: | -------------------------------------- | ------- | -------------------------------------- | | One-time products with multiple offers | 8.0 | Is it in schema? | | Product-level status codes | 8.0 | Returned in fetchProducts? | +| BillingResult sub-response codes | 8.0 | Preserved through every wrapper? | | Suspended subscriptions (isSuspended) | 8.1 | Purchase type has it? | | includeSuspended parameter | 8.1 | getAvailablePurchases supports it? | | Billing Programs API | 8.2 | isBillingProgramAvailable implemented? | +| External Payments | 8.3 | Developer billing fields wired? | +| Nullable developer billing link URI | 9.0 | Null and empty URI handled safely? | +| Opt-in price increase in-app messages | 9.0 | showInAppMessagesAndroid implemented? | +| Billing Choice | 9.1 | Info, dialog, and choice type wired? | **StoreKit 2 (check packages/gql/src/api-ios.graphql):** @@ -98,7 +103,7 @@ Compare current implementation against latest platform APIs: | Feature | Check | | ------------------------------------- | ------------------------------- | -| horizon-billing-compatibility version | Is it latest? (currently 1.1.1) | +| horizon-billing-compatibility version | Is it latest? (currently 2.0.0) | | API parity with Play flavor | Same APIs available in both? | | Shared code compatibility | Uses only Billing 7.0 APIs? | | getAvailableItems (Horizon-only) | Implemented? | @@ -108,7 +113,7 @@ Compare current implementation against latest platform APIs: | Check | Expected | | --------------------------- | --------------------------- | -| Play flavor Billing version | 8.x | +| Play flavor Billing version | 9.1.0 | | Horizon SDK compatible with | Billing 7.0 API | | Shared code uses | Only 7.0-compatible APIs | | react-native-iap requires | v14+, RN 0.79+, Kotlin 2.0+ | @@ -140,15 +145,17 @@ packages/gql (GraphQL): **Latest API Coverage:** -- [ ] Google Play Billing 8.x features implemented +- [ ] Google Play Billing 9.1.0 features implemented end-to-end - [ ] StoreKit 2 iOS 18+ features implemented - [ ] Meta Horizon Billing SDK up to date - [ ] External API docs updated with new features +- [ ] New API comments lead with OpenIAP spec/package versions, then list the + upstream platform SDK requirement **Version Compatibility:** - [ ] horizon-billing-compatibility matches latest -- [ ] Shared code avoids Billing 8.x-only APIs +- [ ] Shared code avoids Billing 8.x/9.x-only APIs - [ ] react-native-iap/expo-iap compatible versions documented ### 6. Fix Issues @@ -312,7 +319,7 @@ For each new feature implemented: - [ ] **Type docs** - New types documented with all fields explained - [ ] **Example apps** - Working examples in iOS and Android example apps - [ ] **Code examples** - Inline code examples in documentation -- [ ] **Platform notes** - Version requirements (e.g., "iOS 18+", "Billing 8.0+") +- [ ] **Platform notes** - Version requirements (e.g., "iOS 18+", "Billing 9.1+") - [ ] **Cross-references** - Links between related functions/types - [ ] **Search** - New items added to search index @@ -386,7 +393,7 @@ Then ask Claude to: Ask Claude Code: > "Run /audit-code with latest API check" -> "Audit the codebase including latest Google Play Billing 8.x features" +> "Audit the codebase including latest Google Play Billing 9.1.0 features" > "Check implementation against latest StoreKit 2 iOS 18.4 APIs" ## Output diff --git a/.claude/commands/e2e-tests.md b/.claude/commands/e2e-tests.md index 0f3931501..11b2344db 100644 --- a/.claude/commands/e2e-tests.md +++ b/.claude/commands/e2e-tests.md @@ -280,7 +280,7 @@ cd android # Build-only regression can stop here. : "${ANDROID_SERIAL:?Set ANDROID_SERIAL to the target Android device serial}" adb -s "$ANDROID_SERIAL" install -r app/build/outputs/apk/debug/app-debug.apk -adb -s "$ANDROID_SERIAL" shell monkey -p dev.hyo.openiap.expo.example 1 +adb -s "$ANDROID_SERIAL" shell monkey -p dev.hyo.martie 1 ``` Normal iOS physical-device build and launch smoke: @@ -290,9 +290,9 @@ cd libraries/expo-iap/example : "${IOS_UDID:?Set IOS_UDID to the target iOS device UDID}" : "${TEAM_ID:?Set TEAM_ID to the Apple development team ID}" xcodebuild \ - -workspace ios/expoiapexample.xcworkspace \ + -workspace ios/ExpoIAPExample.xcworkspace \ -configuration Debug \ - -scheme expoiapexample \ + -scheme ExpoIAPExample \ -destination "id=$IOS_UDID" \ DEVELOPMENT_TEAM="$TEAM_ID" \ -derivedDataPath build/DerivedData \ @@ -301,10 +301,10 @@ xcodebuild \ # Build-only regression can stop here. xcrun devicectl device install app \ --device "$IOS_UDID" \ - build/DerivedData/Build/Products/Debug-iphoneos/expoiapexample.app + build/DerivedData/Build/Products/Debug-iphoneos/ExpoIAPExample.app xcrun devicectl device process launch \ --device "$IOS_UDID" \ - dev.hyo.openiap.expo.example + dev.hyo.martie ``` FireOS/Amazon Android path: @@ -317,7 +317,7 @@ cd android # Build-only regression can stop here. : "${FIREOS_SERIAL:?Set FIREOS_SERIAL to the target FireOS device serial}" adb -s "$FIREOS_SERIAL" install -r app/build/outputs/apk/debug/app-debug.apk -adb -s "$FIREOS_SERIAL" shell monkey -p dev.hyo.openiap.expo.example 1 +adb -s "$FIREOS_SERIAL" shell monkey -p dev.hyo.martie 1 ``` Horizon Android build-only path: @@ -335,9 +335,9 @@ Onside iOS build-only path: cd libraries/expo-iap/example EXPO_IAP_ONSIDE=1 bunx expo prebuild --platform ios --clean xcodebuild \ - -workspace ios/expoiapexample.xcworkspace \ + -workspace ios/ExpoIAPExample.xcworkspace \ -configuration Debug \ - -scheme expoiapexample \ + -scheme ExpoIAPExample \ -destination "generic/platform=iOS" \ CODE_SIGNING_ALLOWED=NO ``` @@ -363,6 +363,7 @@ Library: ```bash cd libraries/react-native-iap +yarn specs yarn lint:tsc yarn test:library --runInBand ``` @@ -402,6 +403,11 @@ Normal iOS physical-device build and launch smoke: cd libraries/react-native-iap/example : "${IOS_UDID:?Set IOS_UDID to the target iOS device UDID}" : "${TEAM_ID:?Set TEAM_ID to the Apple development team ID}" +# Refresh Pods after Nitro type generation so newly generated headers are +# linked into Pods/Headers before the physical-device build. +cd ios +bundle exec pod install +cd .. xcodebuild \ -workspace ios/example.xcworkspace \ -configuration Debug \ @@ -577,7 +583,10 @@ cd libraries/maui-iap/android ../../../packages/google/gradlew :openiap:assembleRelease -PopenIapAndroidStore=play cd .. dotnet build-server shutdown || true -rm -rf src/OpenIap.Maui.Bindings.Android/bin src/OpenIap.Maui.Bindings.Android/obj +rm -rf \ + src/OpenIap.Maui.Bindings.Android/bin src/OpenIap.Maui.Bindings.Android/obj \ + src/OpenIap.Maui/bin src/OpenIap.Maui/obj \ + example/OpenIap.Maui.Example/bin example/OpenIap.Maui.Example/obj dotnet build src/OpenIap.Maui.Bindings.Android/OpenIap.Maui.Bindings.Android.csproj \ -p:TargetFrameworks=net9.0-android \ -p:OpenIapAndroidStore=play \ @@ -590,14 +599,14 @@ dotnet build src/OpenIap.Maui/OpenIap.Maui.csproj \ dotnet build example/OpenIap.Maui.Example/OpenIap.Maui.Example.csproj \ -f net9.0-android \ -p:OpenIapAndroidStore=play \ + -p:EmbedAssembliesIntoApk=true \ --nologo # Build-only regression can stop here. : "${ANDROID_SERIAL:?Set ANDROID_SERIAL to the target Android device serial}" -ANDROID_SERIAL="$ANDROID_SERIAL" dotnet build example/OpenIap.Maui.Example/OpenIap.Maui.Example.csproj \ - -t:Run \ - -f net9.0-android \ - -p:OpenIapAndroidStore=play \ - --nologo +adb -s "$ANDROID_SERIAL" uninstall dev.hyo.martie || true +adb -s "$ANDROID_SERIAL" install --no-incremental -r \ + example/OpenIap.Maui.Example/bin/Debug/net9.0-android/dev.hyo.martie-Signed.apk +adb -s "$ANDROID_SERIAL" shell monkey -p dev.hyo.martie 1 ``` FireOS/Amazon Android build and launch smoke: @@ -607,7 +616,10 @@ cd libraries/maui-iap/android ../../../packages/google/gradlew :openiap:assembleRelease -PopenIapAndroidStore=amazon cd .. dotnet build-server shutdown || true -rm -rf src/OpenIap.Maui.Bindings.Android/bin src/OpenIap.Maui.Bindings.Android/obj +rm -rf \ + src/OpenIap.Maui.Bindings.Android/bin src/OpenIap.Maui.Bindings.Android/obj \ + src/OpenIap.Maui/bin src/OpenIap.Maui/obj \ + example/OpenIap.Maui.Example/bin example/OpenIap.Maui.Example/obj dotnet build src/OpenIap.Maui.Bindings.Android/OpenIap.Maui.Bindings.Android.csproj \ -p:TargetFrameworks=net9.0-android \ -p:OpenIapAndroidStore=amazon \ @@ -620,14 +632,14 @@ dotnet build src/OpenIap.Maui/OpenIap.Maui.csproj \ dotnet build example/OpenIap.Maui.Example/OpenIap.Maui.Example.csproj \ -f net9.0-android \ -p:OpenIapAndroidStore=amazon \ + -p:EmbedAssembliesIntoApk=true \ --nologo # Build-only regression can stop here. : "${FIREOS_SERIAL:?Set FIREOS_SERIAL to the target FireOS device serial}" -ANDROID_SERIAL="$FIREOS_SERIAL" dotnet build example/OpenIap.Maui.Example/OpenIap.Maui.Example.csproj \ - -t:Run \ - -f net9.0-android \ - -p:OpenIapAndroidStore=amazon \ - --nologo +adb -s "$FIREOS_SERIAL" uninstall dev.hyo.martie || true +adb -s "$FIREOS_SERIAL" install --no-incremental -r \ + example/OpenIap.Maui.Example/bin/stores/amazon/Debug/net9.0-android/dev.hyo.martie-Signed.apk +adb -s "$FIREOS_SERIAL" shell monkey -p dev.hyo.martie 1 ``` Horizon Android build-only path: @@ -637,7 +649,10 @@ cd libraries/maui-iap/android ../../../packages/google/gradlew :openiap:assembleRelease -PopenIapAndroidStore=horizon cd .. dotnet build-server shutdown || true -rm -rf src/OpenIap.Maui.Bindings.Android/bin src/OpenIap.Maui.Bindings.Android/obj +rm -rf \ + src/OpenIap.Maui.Bindings.Android/bin src/OpenIap.Maui.Bindings.Android/obj \ + src/OpenIap.Maui/bin src/OpenIap.Maui/obj \ + example/OpenIap.Maui.Example/bin example/OpenIap.Maui.Example/obj dotnet build src/OpenIap.Maui.Bindings.Android/OpenIap.Maui.Bindings.Android.csproj \ -p:TargetFrameworks=net9.0-android \ -p:OpenIapAndroidStore=horizon \ @@ -658,7 +673,17 @@ iOS physical-device build and launch smoke: ```bash cd libraries/maui-iap/example/OpenIap.Maui.Example : "${IOS_UDID:?Set IOS_UDID to the target iOS device UDID}" -dotnet build -t:Run -f net9.0-ios -p:_DeviceName="$IOS_UDID" +dotnet build \ + -f net9.0-ios \ + -p:RuntimeIdentifier=ios-arm64 \ + -p:ValidateXcodeVersion=false \ + --nologo +xcrun devicectl device install app \ + --device "$IOS_UDID" \ + bin/Debug/net9.0-ios/ios-arm64/OpenIap.Maui.Example.app +xcrun devicectl device process launch \ + --device "$IOS_UDID" \ + dev.hyo.martie ``` ## Godot Checks diff --git a/.claude/guides/05-google-package.md b/.claude/guides/05-google-package.md index df9ee97a1..ad6e87753 100644 --- a/.claude/guides/05-google-package.md +++ b/.claude/guides/05-google-package.md @@ -33,10 +33,11 @@ packages/google/ ## Build Variants -| Variant | Purpose | Billing Library | -| --------- | ------------------ | ---------------- | -| `play` | Google Play Store | Play Billing 8.x | -| `horizon` | Meta Horizon Store | Horizon SDK | +| Variant | Purpose | Billing Library | +| --------- | ------------------ | ------------------------- | +| `play` | Google Play Store | Play Billing 9.1.0 | +| `horizon` | Meta Horizon Store | Horizon SDK 2.0.0 | +| `amazon` | Amazon Appstore | Amazon Appstore SDK 3.0.8 | ## Type Generation @@ -52,10 +53,12 @@ Types.kt is auto-generated. **Never edit directly!** # Compile library ./gradlew :openiap:compilePlayDebugKotlin ./gradlew :openiap:compileHorizonDebugKotlin +./gradlew :openiap:compileAmazonDebugKotlin # Run tests ./gradlew :openiap:testPlayDebugUnitTest ./gradlew :openiap:testHorizonDebugUnitTest +./gradlew :openiap:testAmazonDebugUnitTest # Build Example app ./gradlew :Example:assemblePlayDebug diff --git a/.codex/skills/generate-doc/SKILL.md b/.codex/skills/generate-doc/SKILL.md index d545efaa1..62b01b85e 100644 --- a/.codex/skills/generate-doc/SKILL.md +++ b/.codex/skills/generate-doc/SKILL.md @@ -92,6 +92,28 @@ Follow the existing card pattern: - Do not edit `packages/docs/src/generated/version-metadata.json` manually; it is produced by `./scripts/sync-versions.sh`. +## Multi-package Release Trains + +The consolidated release page remains the release-note SSOT, but a release that +ships several packages must still be readable package by package. This is the +project decision recorded from issue #206. + +- When the user gives a starting commit, inspect that commit inclusively through + the latest target branch, then include the current PR diff. Do not derive the + release contents only from the PR title or its latest commits. +- Group notable changes under the affected platform package or framework + library (Google, Apple, IAPKit, React Native, Expo, Flutter, Godot, KMP, and + MAUI). Omit groups with no user-facing change. +- Keep each group concise. State the behavior users gain or the regression that + was fixed; do not list commit mechanics, version-bump-only commits, generated + files, or repeated cross-framework boilerplate. +- Put truly shared schema or release-process changes in one short shared group, + then describe framework-specific wiring or caveats in the relevant framework + group. +- Link the issues and PRs that explain user-visible fixes. Keep package-local + changelogs as pointers to this canonical entry unless a registry requires an + inline changelog. + ## Validation For docs-only release-note edits, run: @@ -110,4 +132,3 @@ Before committing to `main`, pull first: ```bash git pull --ff-only origin main ``` - diff --git a/AGENTS.md b/AGENTS.md index f0596e64a..8d7ad5390 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -6,16 +6,16 @@ This document provides an overview for AI agents working across the OpenIAP mono ## Quick Reference -| Topic | File | -| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | -| Naming Conventions | [`knowledge/internal/01-naming-conventions.md`](knowledge/internal/01-naming-conventions.md) | -| Architecture | [`knowledge/internal/02-architecture.md`](knowledge/internal/02-architecture.md) | -| Coding Style | [`knowledge/internal/03-coding-style.md`](knowledge/internal/03-coding-style.md) | +| Topic | File | +| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Naming Conventions | [`knowledge/internal/01-naming-conventions.md`](knowledge/internal/01-naming-conventions.md) | +| Architecture | [`knowledge/internal/02-architecture.md`](knowledge/internal/02-architecture.md) | +| Coding Style | [`knowledge/internal/03-coding-style.md`](knowledge/internal/03-coding-style.md) | | Platform Packages | [`knowledge/internal/04-platform-packages.md`](knowledge/internal/04-platform-packages.md) (run `bun audit:parity` before commits; pre-commit mirrors CI's SDK parity job) | -| Docs Patterns | [`knowledge/internal/05-docs-patterns.md`](knowledge/internal/05-docs-patterns.md) | -| Git & Deployment | [`knowledge/internal/06-git-deployment.md`](knowledge/internal/06-git-deployment.md) | -| Docs Consistency / SSOT | [`knowledge/internal/07-docs-consistency.md`](knowledge/internal/07-docs-consistency.md) (run `bun audit:docs` before pushing API/Type doc edits) | -| GV Cloud Workspaces | [`knowledge/internal/08-gv-cloud-workspaces.md`](knowledge/internal/08-gv-cloud-workspaces.md) | +| Docs Patterns | [`knowledge/internal/05-docs-patterns.md`](knowledge/internal/05-docs-patterns.md) | +| Git & Deployment | [`knowledge/internal/06-git-deployment.md`](knowledge/internal/06-git-deployment.md) | +| Docs Consistency / SSOT | [`knowledge/internal/07-docs-consistency.md`](knowledge/internal/07-docs-consistency.md) (run `bun audit:docs` before pushing API/Type doc edits) | +| GV Cloud Workspaces | [`knowledge/internal/08-gv-cloud-workspaces.md`](knowledge/internal/08-gv-cloud-workspaces.md) | ## Monorepo Structure @@ -79,7 +79,9 @@ openiap/ - `libraries/flutter_inapp_purchase/lib/types.dart` - Synced from GQL - `libraries/godot-iap/addons/godot-iap/types.gd` - Synced from GQL - `libraries/maui-iap/src/OpenIap.Maui/Types.cs` - Synced from GQL -- `openiap-versions.json` - Managed by CI/CD workflows only; tracks only `spec`, `google`, and `apple` +- `openiap-versions.json` - Tracks only `spec`, `google`, and `apple`. Google + and Apple are CI-managed; the spec may be bumped directly in a feature PR + when explicitly requested, together with `packages/gql/package.json`. Framework library package versions (React Native, Expo, Flutter, Godot, KMP, MAUI) live in their own package metadata / release workflows. Do not add diff --git a/knowledge/_claude-context/context.md b/knowledge/_claude-context/context.md index a9c4d5d9d..e6ce7761e 100644 --- a/knowledge/_claude-context/context.md +++ b/knowledge/_claude-context/context.md @@ -1,7 +1,7 @@ # OpenIAP Project Context > **Auto-generated for Claude Code** -> Last updated: 2026-07-08T06:25:10.073Z +> Last updated: 2026-07-10T22:14:59.408Z > > Usage: `claude --context knowledge/_claude-context/context.md` @@ -882,6 +882,14 @@ swift build # Verifies ObjC bridge compiles ## SDK Parity Checklist (CRITICAL — prevents "declared but not implemented") +### API version annotations + +For newly exposed platform features, public schema and API documentation must +name the OpenIAP versions first and the upstream SDK requirement second. Use the +format `OpenIAP Spec / openiap-google (requires Play Billing ++)`. Upstream-only labels such as `Billing 9.1.0+` do not tell OpenIAP +consumers which library release contains the API. + When the GraphQL schema in [`packages/gql`](../../packages/gql) adds or changes an API, the regenerated `types.*` files **declare** the handler but do not **implement** it. Every wrapper library must wire the new API end-to-end or users will see silent nulls, phantom interfaces (GitHub issue #104), or `UnsupportedOperationException` at runtime. The mechanical guardrail for this checklist is: @@ -934,13 +942,13 @@ GraphQL schema ─► generated types ─► public API ─► native bridge ─ For every new/changed handler in the generated types, verify **all five** of these per target library before considering the change shippable: -| Library | 1. Type declared | 2. Public API exposed | 3. Platform bridge | 4. Wired into handlers bundle | 5. Test coverage | -| -------------------------- | ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **react-native-iap** | `src/types.ts` (generated) | `src/index.ts` export (Nitro or composed TS) | `ios/HybridRnIap.swift` (iOS), `android/.../HybridRnIap.kt` (Android) | Not required (flat exports) | Mock stub in all 4 `mockIap` objects in `__tests__/` (per memory) | -| **expo-iap** | `src/types.ts` (generated) | `src/modules/ios.ts` / `android.ts` export, re-exported from `src/index.ts` | `ios/ExpoIapModule.swift` `AsyncFunction`, `android/.../ExpoIapModule.kt` | Not required (flat exports) | `src/modules/__tests__/*.test.ts` | -| **flutter_inapp_purchase** | `lib/types.dart` (generated) | getter on `FlutterInappPurchase` in `lib/flutter_inapp_purchase.dart` | `case "":` in `ios/flutter_inapp_purchase/Sources/flutter_inapp_purchase/FlutterInappPurchasePlugin.swift` and `macos/flutter_inapp_purchase/Sources/flutter_inapp_purchase/FlutterInappPurchasePlugin.swift`, Android plugin `onMethodCall` | `queryHandlers` / `mutationHandlers` / `subscriptionHandlers` bundles near the bottom of `flutter_inapp_purchase.dart` | Mock + test in `test/ios_methods_test.dart` (and the `errors_unit_test.dart` error-mapping test) | -| **kmp-iap** | `library/src/commonMain/.../openiap/Types.kt` (generated interface) | exposed via `KmpInAppPurchase` / `kmpIapInstance` | `library/src/iosMain/.../InAppPurchaseIOS.kt` — must call `openIapModule.WithCompletion { ... }`, **never** `throw UnsupportedOperationException` | Not required (interface dispatch) | `library/src/commonTest/` if testable cross-platform | -| **godot-iap** | `addons/godot-iap/types.gd` (generated) | public `snake_case` function in `addons/godot-iap/godot_iap.gd` | `ios-gdextension/Sources/GodotIap/GodotIap.swift` (iOS), `android/src/main/java/.../GodotIap.java` (Android) | Not required | Manual testing — no automated test suite yet | +| Library | 1. Type declared | 2. Public API exposed | 3. Platform bridge | 4. Wired into handlers bundle | 5. Test coverage | +| -------------------------- | ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **react-native-iap** | `src/types.ts` (generated) | `src/index.ts` export (Nitro or composed TS) | `ios/HybridRnIap.swift` (iOS), `android/.../HybridRnIap.kt` (Android) | Not required (flat exports) | Mock stub in all 4 `mockIap` objects in `__tests__/` (per memory) | +| **expo-iap** | `src/types.ts` (generated) | `src/modules/ios.ts` / `android.ts` export, re-exported from `src/index.ts` | `ios/ExpoIapModule.swift` `AsyncFunction`, `android/.../ExpoIapModule.kt` | Not required (flat exports) | `src/modules/__tests__/*.test.ts` | +| **flutter_inapp_purchase** | `lib/types.dart` (generated) | getter on `FlutterInappPurchase` in `lib/flutter_inapp_purchase.dart` | `case "":` in `ios/flutter_inapp_purchase/Sources/flutter_inapp_purchase/FlutterInappPurchasePlugin.swift` and `macos/flutter_inapp_purchase/Sources/flutter_inapp_purchase/FlutterInappPurchasePlugin.swift`, Android plugin `onMethodCall` | `queryHandlers` / `mutationHandlers` / `subscriptionHandlers` bundles near the bottom of `flutter_inapp_purchase.dart` | Mock + test in `test/ios_methods_test.dart` (and the `errors_unit_test.dart` error-mapping test) | +| **kmp-iap** | `library/src/commonMain/.../openiap/Types.kt` (generated interface) | exposed via `KmpInAppPurchase` / `kmpIapInstance` | `library/src/iosMain/.../InAppPurchaseIOS.kt` — must call `openIapModule.WithCompletion { ... }`, **never** `throw UnsupportedOperationException` | Not required (interface dispatch) | `library/src/commonTest/` if testable cross-platform | +| **godot-iap** | `addons/godot-iap/types.gd` (generated) | public `snake_case` function in `addons/godot-iap/godot_iap.gd` | `ios-gdextension/Sources/GodotIap/GodotIap.swift` (iOS), `android/src/main/java/.../GodotIap.java` (Android) | Not required | Manual testing — no automated test suite yet | | **maui-iap** | `src/OpenIap.Maui/Types.cs` (generated) | `OpenIap.QueryResolver` / `MutationResolver` interfaces in `Types.cs`; `IOpenIap` adds the listener-stream contract; static facade is `OpenIap.Maui.OpenIapClient` (`OpenIap.Maui.Iap` remains as a legacy shim); IAPKit helpers mirror TypeScript via `OpenIapClient.KitApi(...)`, `OpenIapClient.ConnectWebhookStream(...)`, `OpenIapClient.ParseWebhookEventData(...)`, and `OpenIapClient.WebhookEventTypes` | Android: `OpenIapMauiModule.kt` in `libraries/maui-iap/android/openiap/` (JSON-shaped Java facade over `packages/google`), bound by `OpenIap.Maui.Bindings.Android.csproj`, consumed by `Platforms/Android/OpenIapAndroid.cs`. Google Billing / Play Services / Gson / AndroidX / Kotlin dependencies must stay NuGet `PackageReference`s, not fat-bundled AARs. iOS / macCatalyst: existing `OpenIapModule+ObjC.swift` bridge in `packages/apple`, bound by hand-written `OpenIap.Maui.Bindings.iOS/ApiDefinition.cs`, consumed by `Platforms/iOS/OpenIapIOS.cs` (+ subclass `OpenIapMacCatalyst`). | Not required (interface dispatch) | Example app `libraries/maui-iap/example/OpenIap.Maui.Example` builds for net9.0-android / net9.0-ios / net9.0-maccatalyst; package CI builds net9/net10 shared, Android, iOS, and macCatalyst TFMs (manual device testing for purchase flow); no xUnit tests yet | ### Platform suffix rule (who needs what) @@ -1060,21 +1068,26 @@ The Google package supports **two build flavors**: | Flavor | Billing Library | Version | | ------- | ----------------------------- | -------------------------- | -| Play | Google Play Billing | 8.3.0 | -| Horizon | horizon-billing-compatibility | 1.1.1 (GPB 7.0 compatible) | +| Play | Google Play Billing | 9.1.0 | +| Horizon | horizon-billing-compatibility | 2.0.0 (GPB 7.0 compatible) | -**CRITICAL**: Horizon SDK implements **Billing 7.0 API**, not 8.x. When writing shared code in `src/main/`: +**CRITICAL**: Horizon SDK implements **Billing 7.0 API**, not 8.x/9.x. When writing shared code in `src/main/`: -**Safe APIs (exist in both 7.0 and 8.x):** +**Safe APIs (exist in both 7.0 and 9.x):** - `queryProductDetailsAsync()`, `launchBillingFlow()` - `acknowledgePurchase()`, `consumeAsync()`, `queryPurchasesAsync()` -**DO NOT use in shared code (8.x only):** +**DO NOT use in shared code (8.x/9.x only):** - `enableAutoServiceReconnection()` - Product-level status codes - One-time products with multiple offers +- Suspended-subscription queries and product-level replacement parameters +- Billing Programs APIs, including External Payments and Billing Choice + +Keep those APIs in `src/play/`. Billing Choice information, dialogs, choice +screen types, and developer-provided billing fields require Play Billing 9.1.0. ### Horizon-Specific APIs @@ -1535,6 +1548,25 @@ Framework implementation listings must be derived from Release notes are located at `packages/docs/src/pages/docs/updates/releases.tsx`. +### Package-specific grouping for shared releases + +The docs release page is the canonical release-note SSOT, including when many +packages ship together. To satisfy the package-specific changelog requirement +from issue #206 without duplicating release history across package-local files: + +- Audit the full requested commit range inclusively and include the current PR + diff before drafting the note. +- Group user-visible changes by affected platform package or framework library: + Google, Apple, IAPKit, React Native, Expo, Flutter, Godot, KMP, and MAUI. +- Omit packages with no user-visible change and keep each remaining group to the + smallest set of useful upgrade notes. +- Do not replace package-specific behavior with a generic "framework parity" + bullet when wrappers have different setup, runtime, or compatibility details. +- Exclude version-only commits, generated-file churn, and CI mechanics unless + they change how users install, build, or validate the release. +- Keep package-local changelogs as pointers to this page and GitHub Releases, + except where a package registry requires generated inline history. + ### Adding New Release Notes 1. Add new entry at the **top** of the `allNotes` array @@ -1853,13 +1885,16 @@ linking it. This prevents stale Package Releases tables such as documenting ### openiap-versions.json -**CRITICAL: NEVER manually edit `openiap-versions.json`** +**CRITICAL: NEVER manually edit the `google` or `apple` fields in +`openiap-versions.json`.** -This file is automatically managed by CI/CD workflows during releases: +Version ownership is split: - Apple releases update `apple` version - Google releases update `google` version -- GQL releases update `spec` version +- The shared spec can be bumped directly in a feature PR when the maintainer + explicitly requests the target version. Update both `spec` and + `packages/gql/package.json`, then run `./scripts/sync-versions.sh`. - Deploy script (`npm run deploy`) uses the current `spec` version by default, and updates `spec` only when an explicit version is passed @@ -1869,15 +1904,20 @@ The manifest is only for the shared spec and native platform packages: `kmp-iap`, `maui-iap`) must stay in each library's own package metadata and release workflow, not as extra keys in `openiap-versions.json`. -Manual edits will cause version conflicts and deployment issues. Always use the GitHub Actions workflows or deploy script to update versions. +Manual Google or Apple edits will cause version conflicts and deployment +issues. Use their GitHub Actions workflows. A direct spec edit is the explicit +exception above. **Why this matters:** If a feature PR sets `apple: "2.1.1"` manually, and then CI auto-bumps on release, CI sees "current is 2.1.1" and bumps to 2.1.2 — skipping 2.1.1 entirely. The published tag becomes 2.1.2 with no 2.1.1 ever existing. -**Rule:** Feature PRs must NEVER touch version fields in `openiap-versions.json`. Version bumps happen only via: +**Rule:** Feature PRs must never touch `google` or `apple`. Version bumps happen +via: 1. Release workflows (Apple Release, Google Release) -2. Deploy script (`npm run deploy`, optionally `npm run deploy `) -3. CI auto-bump after merge +2. A maintainer-requested direct `spec` bump paired with + `packages/gql/package.json` +3. Deploy script (`npm run deploy`, optionally `npm run deploy `) +4. CI auto-bump after merge where configured --- @@ -2468,7 +2508,7 @@ cd ../flutter_inapp_purchase && flutter analyze **Horizon flavor (do NOT attempt)** - The Horizon flavor's `addSubscriptionBillingIssueListener` is a documented no-op. Verified by - `SubscriptionBillingIssueHorizonNoOpTest` (Robolectric, runs on CI). There is no sandbox path on Horizon because the Billing Compatibility SDK 1.1.1 targets Play Billing 7.0 which does not expose `Purchase.isSuspended`. + `SubscriptionBillingIssueHorizonNoOpTest` (Robolectric, runs on CI). There is no sandbox path on Horizon because the Billing Compatibility SDK 2.0.0 targets Play Billing 7.0 which does not expose `Purchase.isSuspended`. --- @@ -3295,7 +3335,7 @@ val billingClient = BillingClient.newBuilder(context) .enableAutoServiceReconnection() .enableBillingProgram( EnableBillingProgramParams.newBuilder() - .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS) + .setBillingProgram(BillingClient.BillingProgram.EXTERNAL_PAYMENTS) .setDeveloperProvidedBillingListener(developerBillingListener) .build() ) @@ -3305,10 +3345,12 @@ val billingClient = BillingClient.newBuilder(context) ### DeveloperProvidedBillingListener ```kotlin -val developerBillingListener = DeveloperProvidedBillingListener { - userInitiatedBillingDetails -> - // User chose the developer-provided billing flow. - // Launch your external payment UI here. +val developerBillingListener = DeveloperProvidedBillingListener { details -> + // All nullable fields depend on the selected program and flow. + val token: String? = details.externalTransactionToken + val linkUri: String? = details.linkUri + val originalTransactionId: String? = details.originalExternalTransactionId + val products: List = details.products } ``` @@ -3319,8 +3361,11 @@ val params = BillingFlowParams.newBuilder() .setProductDetailsParamsList(listOf(productDetailsParams)) .enableDeveloperBillingOption( DeveloperBillingOptionParams.newBuilder() - .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS) - .setDeveloperProvidedBillingDetails(developerProvidedBillingDetails) + .setBillingProgram(BillingClient.BillingProgram.EXTERNAL_PAYMENTS) + .setLinkUri(Uri.parse("https://example.com/checkout")) + .setLaunchMode( + DeveloperBillingOptionParams.LaunchMode.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP + ) .build() ) .build() @@ -3332,17 +3377,33 @@ billingClient.launchBillingFlow(activity, params) | Type | Purpose | |------|---------| -| `DeveloperBillingOptionParams` | Configures developer-billing support on `BillingClient` | +| `DeveloperBillingOptionParams` | Configures developer billing on `BillingFlowParams` | | `DeveloperProvidedBillingListener` | Callback when user picks developer-provided billing | -| `DeveloperProvidedBillingDetails` | Billing details to report back for reconciliation | -| `BillingOption.EXTERNAL_PAYMENTS` | Purchase-flow flag requesting external payments | +| `DeveloperProvidedBillingDetails` | Nullable token/link/original-ID fields plus selected products | +| `BillingClient.BillingProgram.EXTERNAL_PAYMENTS` | External Payments program constant | -> **OpenIAP Note**: Exposed through the Android-specific `AlternativeBilling*` surface in OpenIAP. Enrolment with Google Play's External Payments program is required; availability is currently restricted to Japan. The Horizon flavor does NOT implement this. +> **OpenIAP Note**: Exposed through `enableBillingProgramAndroid`, +> `developerBillingOption`, and the developer-provided billing listener. +> Enrolment with Google Play's External Payments program is required; +> availability is currently restricted to Japan. Horizon and Amazon do not +> implement this Google Play program. ## Billing Choice (9.1+) -Billing Library 9.1 adds APIs for markets and programs where Google Play shows -the user a billing choice screen. +Billing Library 9.1 adds APIs for markets and programs where either Google Play +or the app renders a billing choice screen. + +### Integration Scenarios + +| Scenario | Choice renderer | Developer payment | BillingClient setup | Required flow | +|----------|-----------------|-------------------|---------------------|---------------| +| 1A | Google | In app | `EnableBillingProgramParams` with `DeveloperProvidedBillingListener` | Pass a minimal `DeveloperBillingOptionParams`; Play returns the token through the listener | +| 1B | Developer | In app | `EnableBillingProgramParams` without the listener | Fetch choice info, create an `IN_APP` token, show the information dialog, then render the choice UI | +| 2A | Google | External link | `EnableBillingProgramParams` with `DeveloperProvidedBillingListener` | Create an `EXTERNAL_LINK` token and pass it with the URI through `DeveloperBillingOptionParams` | +| 2B | Developer | External link | `EnableBillingProgramParams` without the listener | Fetch choice info, create an `EXTERNAL_LINK` token, render the choice UI, then pass the token to `launchExternalLink` | + +The setup must match `choiceScreenType` from Play Console. Registering the +listener in a developer-rendered integration is not equivalent to omitting it. | API / Type | Purpose | |------------|---------| @@ -3351,17 +3412,116 @@ the user a billing choice screen. | `GetBillingChoiceInfoParams` | Configures the billing-choice info request | | `BillingClient.showBillingProgramInformationDialog()` | Shows an information dialog for a billing program | | `BillingProgramInformationDialogParams` | Configures the information dialog | -| `ChoiceScreenType` | Selects the choice-screen type | +| `LaunchExternalLinkParams.setExternalTransactionToken()` | Supplies the pre-generated token for a developer-rendered external-link flow | +| `BillingProgramAvailabilityDetails.BillingChoiceAvailabilityDetails` | Returns choice-screen type and external-link availability | +| `DeveloperBillingOptionParams` | Selects in-app or external-link developer billing during purchase | +| `BillingProgramReportingDetailsParams.DeveloperBillingType` | Distinguishes `IN_APP` and `EXTERNAL_LINK` reporting | + +### Developer Billing Purchase Options + +Only `billingProgram` is required for an in-app Billing Choice flow: + +```kotlin +val inAppChoice = DeveloperBillingOptionParams.newBuilder() + .setBillingProgram(BillingClient.BillingProgram.BILLING_CHOICE) + .build() +``` + +For a Google-rendered external-link flow, also set the URI, launch mode, and the +pre-generated `EXTERNAL_LINK` transaction token: + +```kotlin +val externalLinkChoice = DeveloperBillingOptionParams.newBuilder() + .setBillingProgram(BillingClient.BillingProgram.BILLING_CHOICE) + .setLinkUri(Uri.parse("https://example.com/checkout")) + .setLaunchMode(DeveloperBillingOptionParams.LaunchMode.CALLER_WILL_LAUNCH_LINK) + .setExternalTransactionToken(preGeneratedToken) + .build() +``` + +### Developer-Rendered Choice Information + +```kotlin +val params = GetBillingChoiceInfoParams.newBuilder() + .setBillingProgram(BillingClient.BillingProgram.BILLING_CHOICE) + .setPlayBillingChoiceImageLayout( + GetBillingChoiceInfoParams.ImageLayout.RECTANGULAR_FOUR_BY_ONE + ) + .setUserLocale(Locale.forLanguageTag("en-US")) + .build() + +billingClient.getBillingChoiceInfoAsync(params) { result, info -> + if (result.responseCode == BillingClient.BillingResponseCode.OK) { + val imageUrl = info.playBillingChoiceImageUrl + val loyaltyText = info.playBillingLoyaltyInfo + } +} +``` + +Supported image layouts are `RECTANGULAR_FOUR_BY_ONE`, +`RECTANGULAR_THREE_BY_ONE`, and `RECTANGULAR_TWO_BY_TWO`. + +### Availability Details + +For `BILLING_CHOICE`, `BillingProgramAvailabilityDetails` can include: + +| Field | Meaning | +|-------|---------| +| `choiceScreenType` | `UNSPECIFIED`, `DEVELOPER_RENDERED`, or `GOOGLE_RENDERED` | +| `isExternalLinkAvailable` | Whether the user is eligible for an external-link option | + +### Information Dialog + +For developer-rendered in-app choice (scenario 1B), call +`showBillingProgramInformationDialog()` before showing the app's choice UI. It +is a UI-thread API and returns through its listener; it does not return a +synchronous `BillingResult`: + +```kotlin +val params = BillingProgramInformationDialogParams.newBuilder() + .setBillingProgram(BillingClient.BillingProgram.BILLING_CHOICE) + .setExternalTransactionToken(externalTransactionToken) + .build() + +billingClient.showBillingProgramInformationDialog(activity, params) { result -> + // Continue according to result.responseCode. +} +``` + +### Developer-Billed Subscription Replacement + +Use the original external transaction ID instead of an old Play purchase token +when replacing a subscription bought through developer billing: + +```kotlin +val updateParams = BillingFlowParams.SubscriptionUpdateParams.newBuilder() + .setOriginalExternalTransactionId(originalExternalTransactionId) + .build() +``` + +> **OpenIAP Note**: OpenIAP exposes these through `BILLING_CHOICE`, +> `getBillingChoiceInfoAndroid`, `showBillingProgramInformationDialogAndroid`, +> `launchExternalLinkAndroid`, `developerBillingOption`, +> `originalExternalTransactionId`, and the expanded developer-provided billing +> callback. Set `InitConnectionConfig.billingChoiceScreenTypeAndroid` to +> `GOOGLE_RENDERED` (default) or `DEVELOPER_RENDERED` so OpenIAP includes or +> omits the listener correctly. Play-only APIs return unsupported/default +> behavior on Horizon and Amazon. + +## In-App Billing Messages (4.1+) -> **OpenIAP gap**: No GraphQL/OpenIAP surface exists yet for Billing Choice -> info or billing-program information dialogs. Add schema types and Play-flavor -> implementations before advertising PBL 9.1 Billing Choice support. +`showInAppMessages()` must run on the UI thread. It returns a synchronous +`BillingResult` for submission errors and reports the user interaction through +`InAppMessageResponseListener`. ## PBL 9 Migration Guardrails - Replace removed APIs: `SkuDetails`, `SkuDetailsParams`, `SkuDetailsResponseListener`, `BillingClient.SkuType`, `querySkuDetailsAsync()`, no-argument `enablePendingPurchases()`, and string `queryPurchasesAsync()`. - Use `ProductDetails`, `QueryProductDetailsParams`, `BillingClient.ProductType`, parameterized `enablePendingPurchases(PendingPurchasesParams)`, and `queryPurchasesAsync(QueryPurchasesParams, ...)`. -- Handle `DeveloperProvidedBillingDetails.getLinkUri()` as nullable. +- Handle `DeveloperProvidedBillingDetails.getExternalTransactionToken()`, + `getLinkUri()`, and `getOriginalExternalTransactionId()` as nullable. +- Preserve every `DeveloperProvidedBillingDetails.Product` (`id`, `type`, and + nullable `offerToken`) from the callback. - Keep Horizon shared code on the Billing 7.0-compatible API subset; put PBL 8/9 code in Play-only sources or behind reflection. ## Best Practices @@ -3372,7 +3532,7 @@ the user a billing choice screen. 4. **Auto-reconnect is enabled by default** in OpenIAP when available (8.0+) 5. **Check product status codes** (8.0+) to understand why products weren't fetched 6. **Check isSuspended** (8.1+) before granting entitlements -7. **Handle Billing Choice separately** before claiming PBL 9.1 feature coverage +7. **Distinguish in-app and external-link Billing Choice** when configuring and reporting developer billing 8. **Cache product details** to avoid repeated queries @@ -3416,12 +3576,11 @@ The release notes call out a fix for querying subscription purchases with a single billing plan and dependencies on Horizon Platform SDK Kotlin `iap-kotlin` 0.2.0 and `core-kotlin` 0.2.0. -> **OpenIAP gap**: `packages/google` is still pinned to -> `horizon-billing-compatibility` 1.1.1. Upgrading to 2.0.0 should be tested -> separately with `:openiap:compileHorizonDebugKotlin` and -> subscription-purchase restore coverage. Play Billing 9.1.0 features remain -> Play-flavor-only because Horizon compatibility still targets the Billing 7.0 -> API surface. +OpenIAP uses `horizon-billing-compatibility` 2.0.0 and its transitive Horizon +Platform Kotlin SDK modules. The Horizon flavor is compiled and tested +separately, including subscription-purchase restore coverage. Play Billing +9.1.0 features remain Play-flavor-only because Horizon compatibility still +targets the Billing 7.0 API surface. ### APIs Available in Both (Safe to use in shared code) @@ -3483,6 +3642,10 @@ import com.meta.horizon.billingclient.api.* ### Important Notes +- Horizon Billing Compatibility 2.x reads the app id from Android manifest + meta-data key `com.meta.horizon.platform.HORIZON_APP_ID`. The older + `com.meta.horizon.platform.ovr.OCULUS_APP_ID` key is deprecated; OpenIAP also + accepts it and other historical keys only for migration compatibility. - Keep SKUs on Meta Horizon Developer Center same as Google Play Console product IDs - Only call `consumeAsync()` on consumable items - `acknowledgePurchase()` is no-op - no acknowledgement requirements diff --git a/knowledge/external/google-billing-api.md b/knowledge/external/google-billing-api.md index 8555d423f..4dde1564c 100644 --- a/knowledge/external/google-billing-api.md +++ b/knowledge/external/google-billing-api.md @@ -410,7 +410,7 @@ val billingClient = BillingClient.newBuilder(context) .enableAutoServiceReconnection() .enableBillingProgram( EnableBillingProgramParams.newBuilder() - .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS) + .setBillingProgram(BillingClient.BillingProgram.EXTERNAL_PAYMENTS) .setDeveloperProvidedBillingListener(developerBillingListener) .build() ) @@ -420,10 +420,12 @@ val billingClient = BillingClient.newBuilder(context) ### DeveloperProvidedBillingListener ```kotlin -val developerBillingListener = DeveloperProvidedBillingListener { - userInitiatedBillingDetails -> - // User chose the developer-provided billing flow. - // Launch your external payment UI here. +val developerBillingListener = DeveloperProvidedBillingListener { details -> + // All nullable fields depend on the selected program and flow. + val token: String? = details.externalTransactionToken + val linkUri: String? = details.linkUri + val originalTransactionId: String? = details.originalExternalTransactionId + val products: List = details.products } ``` @@ -434,8 +436,11 @@ val params = BillingFlowParams.newBuilder() .setProductDetailsParamsList(listOf(productDetailsParams)) .enableDeveloperBillingOption( DeveloperBillingOptionParams.newBuilder() - .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS) - .setDeveloperProvidedBillingDetails(developerProvidedBillingDetails) + .setBillingProgram(BillingClient.BillingProgram.EXTERNAL_PAYMENTS) + .setLinkUri(Uri.parse("https://example.com/checkout")) + .setLaunchMode( + DeveloperBillingOptionParams.LaunchMode.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP + ) .build() ) .build() @@ -447,17 +452,33 @@ billingClient.launchBillingFlow(activity, params) | Type | Purpose | |------|---------| -| `DeveloperBillingOptionParams` | Configures developer-billing support on `BillingClient` | +| `DeveloperBillingOptionParams` | Configures developer billing on `BillingFlowParams` | | `DeveloperProvidedBillingListener` | Callback when user picks developer-provided billing | -| `DeveloperProvidedBillingDetails` | Billing details to report back for reconciliation | -| `BillingOption.EXTERNAL_PAYMENTS` | Purchase-flow flag requesting external payments | +| `DeveloperProvidedBillingDetails` | Nullable token/link/original-ID fields plus selected products | +| `BillingClient.BillingProgram.EXTERNAL_PAYMENTS` | External Payments program constant | -> **OpenIAP Note**: Exposed through the Android-specific `AlternativeBilling*` surface in OpenIAP. Enrolment with Google Play's External Payments program is required; availability is currently restricted to Japan. The Horizon flavor does NOT implement this. +> **OpenIAP Note**: Exposed through `enableBillingProgramAndroid`, +> `developerBillingOption`, and the developer-provided billing listener. +> Enrolment with Google Play's External Payments program is required; +> availability is currently restricted to Japan. Horizon and Amazon do not +> implement this Google Play program. ## Billing Choice (9.1+) -Billing Library 9.1 adds APIs for markets and programs where Google Play shows -the user a billing choice screen. +Billing Library 9.1 adds APIs for markets and programs where either Google Play +or the app renders a billing choice screen. + +### Integration Scenarios + +| Scenario | Choice renderer | Developer payment | BillingClient setup | Required flow | +|----------|-----------------|-------------------|---------------------|---------------| +| 1A | Google | In app | `EnableBillingProgramParams` with `DeveloperProvidedBillingListener` | Pass a minimal `DeveloperBillingOptionParams`; Play returns the token through the listener | +| 1B | Developer | In app | `EnableBillingProgramParams` without the listener | Fetch choice info, create an `IN_APP` token, show the information dialog, then render the choice UI | +| 2A | Google | External link | `EnableBillingProgramParams` with `DeveloperProvidedBillingListener` | Create an `EXTERNAL_LINK` token and pass it with the URI through `DeveloperBillingOptionParams` | +| 2B | Developer | External link | `EnableBillingProgramParams` without the listener | Fetch choice info, create an `EXTERNAL_LINK` token, render the choice UI, then pass the token to `launchExternalLink` | + +The setup must match `choiceScreenType` from Play Console. Registering the +listener in a developer-rendered integration is not equivalent to omitting it. | API / Type | Purpose | |------------|---------| @@ -466,17 +487,116 @@ the user a billing choice screen. | `GetBillingChoiceInfoParams` | Configures the billing-choice info request | | `BillingClient.showBillingProgramInformationDialog()` | Shows an information dialog for a billing program | | `BillingProgramInformationDialogParams` | Configures the information dialog | -| `ChoiceScreenType` | Selects the choice-screen type | +| `LaunchExternalLinkParams.setExternalTransactionToken()` | Supplies the pre-generated token for a developer-rendered external-link flow | +| `BillingProgramAvailabilityDetails.BillingChoiceAvailabilityDetails` | Returns choice-screen type and external-link availability | +| `DeveloperBillingOptionParams` | Selects in-app or external-link developer billing during purchase | +| `BillingProgramReportingDetailsParams.DeveloperBillingType` | Distinguishes `IN_APP` and `EXTERNAL_LINK` reporting | + +### Developer Billing Purchase Options + +Only `billingProgram` is required for an in-app Billing Choice flow: + +```kotlin +val inAppChoice = DeveloperBillingOptionParams.newBuilder() + .setBillingProgram(BillingClient.BillingProgram.BILLING_CHOICE) + .build() +``` + +For a Google-rendered external-link flow, also set the URI, launch mode, and the +pre-generated `EXTERNAL_LINK` transaction token: + +```kotlin +val externalLinkChoice = DeveloperBillingOptionParams.newBuilder() + .setBillingProgram(BillingClient.BillingProgram.BILLING_CHOICE) + .setLinkUri(Uri.parse("https://example.com/checkout")) + .setLaunchMode(DeveloperBillingOptionParams.LaunchMode.CALLER_WILL_LAUNCH_LINK) + .setExternalTransactionToken(preGeneratedToken) + .build() +``` + +### Developer-Rendered Choice Information + +```kotlin +val params = GetBillingChoiceInfoParams.newBuilder() + .setBillingProgram(BillingClient.BillingProgram.BILLING_CHOICE) + .setPlayBillingChoiceImageLayout( + GetBillingChoiceInfoParams.ImageLayout.RECTANGULAR_FOUR_BY_ONE + ) + .setUserLocale(Locale.forLanguageTag("en-US")) + .build() + +billingClient.getBillingChoiceInfoAsync(params) { result, info -> + if (result.responseCode == BillingClient.BillingResponseCode.OK) { + val imageUrl = info.playBillingChoiceImageUrl + val loyaltyText = info.playBillingLoyaltyInfo + } +} +``` + +Supported image layouts are `RECTANGULAR_FOUR_BY_ONE`, +`RECTANGULAR_THREE_BY_ONE`, and `RECTANGULAR_TWO_BY_TWO`. + +### Availability Details + +For `BILLING_CHOICE`, `BillingProgramAvailabilityDetails` can include: + +| Field | Meaning | +|-------|---------| +| `choiceScreenType` | `UNSPECIFIED`, `DEVELOPER_RENDERED`, or `GOOGLE_RENDERED` | +| `isExternalLinkAvailable` | Whether the user is eligible for an external-link option | + +### Information Dialog + +For developer-rendered in-app choice (scenario 1B), call +`showBillingProgramInformationDialog()` before showing the app's choice UI. It +is a UI-thread API and returns through its listener; it does not return a +synchronous `BillingResult`: + +```kotlin +val params = BillingProgramInformationDialogParams.newBuilder() + .setBillingProgram(BillingClient.BillingProgram.BILLING_CHOICE) + .setExternalTransactionToken(externalTransactionToken) + .build() + +billingClient.showBillingProgramInformationDialog(activity, params) { result -> + // Continue according to result.responseCode. +} +``` + +### Developer-Billed Subscription Replacement + +Use the original external transaction ID instead of an old Play purchase token +when replacing a subscription bought through developer billing: + +```kotlin +val updateParams = BillingFlowParams.SubscriptionUpdateParams.newBuilder() + .setOriginalExternalTransactionId(originalExternalTransactionId) + .build() +``` + +> **OpenIAP Note**: OpenIAP exposes these through `BILLING_CHOICE`, +> `getBillingChoiceInfoAndroid`, `showBillingProgramInformationDialogAndroid`, +> `launchExternalLinkAndroid`, `developerBillingOption`, +> `originalExternalTransactionId`, and the expanded developer-provided billing +> callback. Set `InitConnectionConfig.billingChoiceScreenTypeAndroid` to +> `GOOGLE_RENDERED` (default) or `DEVELOPER_RENDERED` so OpenIAP includes or +> omits the listener correctly. Play-only APIs return unsupported/default +> behavior on Horizon and Amazon. + +## In-App Billing Messages (4.1+) -> **OpenIAP gap**: No GraphQL/OpenIAP surface exists yet for Billing Choice -> info or billing-program information dialogs. Add schema types and Play-flavor -> implementations before advertising PBL 9.1 Billing Choice support. +`showInAppMessages()` must run on the UI thread. It returns a synchronous +`BillingResult` for submission errors and reports the user interaction through +`InAppMessageResponseListener`. ## PBL 9 Migration Guardrails - Replace removed APIs: `SkuDetails`, `SkuDetailsParams`, `SkuDetailsResponseListener`, `BillingClient.SkuType`, `querySkuDetailsAsync()`, no-argument `enablePendingPurchases()`, and string `queryPurchasesAsync()`. - Use `ProductDetails`, `QueryProductDetailsParams`, `BillingClient.ProductType`, parameterized `enablePendingPurchases(PendingPurchasesParams)`, and `queryPurchasesAsync(QueryPurchasesParams, ...)`. -- Handle `DeveloperProvidedBillingDetails.getLinkUri()` as nullable. +- Handle `DeveloperProvidedBillingDetails.getExternalTransactionToken()`, + `getLinkUri()`, and `getOriginalExternalTransactionId()` as nullable. +- Preserve every `DeveloperProvidedBillingDetails.Product` (`id`, `type`, and + nullable `offerToken`) from the callback. - Keep Horizon shared code on the Billing 7.0-compatible API subset; put PBL 8/9 code in Play-only sources or behind reflection. ## Best Practices @@ -487,5 +607,5 @@ the user a billing choice screen. 4. **Auto-reconnect is enabled by default** in OpenIAP when available (8.0+) 5. **Check product status codes** (8.0+) to understand why products weren't fetched 6. **Check isSuspended** (8.1+) before granting entitlements -7. **Handle Billing Choice separately** before claiming PBL 9.1 feature coverage +7. **Distinguish in-app and external-link Billing Choice** when configuring and reporting developer billing 8. **Cache product details** to avoid repeated queries diff --git a/knowledge/external/horizon-api.md b/knowledge/external/horizon-api.md index 628d2dfe2..07e902f6a 100644 --- a/knowledge/external/horizon-api.md +++ b/knowledge/external/horizon-api.md @@ -34,12 +34,11 @@ The release notes call out a fix for querying subscription purchases with a single billing plan and dependencies on Horizon Platform SDK Kotlin `iap-kotlin` 0.2.0 and `core-kotlin` 0.2.0. -> **OpenIAP gap**: `packages/google` is still pinned to -> `horizon-billing-compatibility` 1.1.1. Upgrading to 2.0.0 should be tested -> separately with `:openiap:compileHorizonDebugKotlin` and -> subscription-purchase restore coverage. Play Billing 9.1.0 features remain -> Play-flavor-only because Horizon compatibility still targets the Billing 7.0 -> API surface. +OpenIAP uses `horizon-billing-compatibility` 2.0.0 and its transitive Horizon +Platform Kotlin SDK modules. The Horizon flavor is compiled and tested +separately, including subscription-purchase restore coverage. Play Billing +9.1.0 features remain Play-flavor-only because Horizon compatibility still +targets the Billing 7.0 API surface. ### APIs Available in Both (Safe to use in shared code) @@ -101,6 +100,10 @@ import com.meta.horizon.billingclient.api.* ### Important Notes +- Horizon Billing Compatibility 2.x reads the app id from Android manifest + meta-data key `com.meta.horizon.platform.HORIZON_APP_ID`. The older + `com.meta.horizon.platform.ovr.OCULUS_APP_ID` key is deprecated; OpenIAP also + accepts it and other historical keys only for migration compatibility. - Keep SKUs on Meta Horizon Developer Center same as Google Play Console product IDs - Only call `consumeAsync()` on consumable items - `acknowledgePurchase()` is no-op - no acknowledgement requirements diff --git a/knowledge/internal/04-platform-packages.md b/knowledge/internal/04-platform-packages.md index cd51437f4..c34afafd9 100644 --- a/knowledge/internal/04-platform-packages.md +++ b/knowledge/internal/04-platform-packages.md @@ -115,6 +115,14 @@ swift build # Verifies ObjC bridge compiles ## SDK Parity Checklist (CRITICAL — prevents "declared but not implemented") +### API version annotations + +For newly exposed platform features, public schema and API documentation must +name the OpenIAP versions first and the upstream SDK requirement second. Use the +format `OpenIAP Spec / openiap-google (requires Play Billing ++)`. Upstream-only labels such as `Billing 9.1.0+` do not tell OpenIAP +consumers which library release contains the API. + When the GraphQL schema in [`packages/gql`](../../packages/gql) adds or changes an API, the regenerated `types.*` files **declare** the handler but do not **implement** it. Every wrapper library must wire the new API end-to-end or users will see silent nulls, phantom interfaces (GitHub issue #104), or `UnsupportedOperationException` at runtime. The mechanical guardrail for this checklist is: @@ -167,13 +175,13 @@ GraphQL schema ─► generated types ─► public API ─► native bridge ─ For every new/changed handler in the generated types, verify **all five** of these per target library before considering the change shippable: -| Library | 1. Type declared | 2. Public API exposed | 3. Platform bridge | 4. Wired into handlers bundle | 5. Test coverage | -| -------------------------- | ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **react-native-iap** | `src/types.ts` (generated) | `src/index.ts` export (Nitro or composed TS) | `ios/HybridRnIap.swift` (iOS), `android/.../HybridRnIap.kt` (Android) | Not required (flat exports) | Mock stub in all 4 `mockIap` objects in `__tests__/` (per memory) | -| **expo-iap** | `src/types.ts` (generated) | `src/modules/ios.ts` / `android.ts` export, re-exported from `src/index.ts` | `ios/ExpoIapModule.swift` `AsyncFunction`, `android/.../ExpoIapModule.kt` | Not required (flat exports) | `src/modules/__tests__/*.test.ts` | -| **flutter_inapp_purchase** | `lib/types.dart` (generated) | getter on `FlutterInappPurchase` in `lib/flutter_inapp_purchase.dart` | `case "":` in `ios/flutter_inapp_purchase/Sources/flutter_inapp_purchase/FlutterInappPurchasePlugin.swift` and `macos/flutter_inapp_purchase/Sources/flutter_inapp_purchase/FlutterInappPurchasePlugin.swift`, Android plugin `onMethodCall` | `queryHandlers` / `mutationHandlers` / `subscriptionHandlers` bundles near the bottom of `flutter_inapp_purchase.dart` | Mock + test in `test/ios_methods_test.dart` (and the `errors_unit_test.dart` error-mapping test) | -| **kmp-iap** | `library/src/commonMain/.../openiap/Types.kt` (generated interface) | exposed via `KmpInAppPurchase` / `kmpIapInstance` | `library/src/iosMain/.../InAppPurchaseIOS.kt` — must call `openIapModule.WithCompletion { ... }`, **never** `throw UnsupportedOperationException` | Not required (interface dispatch) | `library/src/commonTest/` if testable cross-platform | -| **godot-iap** | `addons/godot-iap/types.gd` (generated) | public `snake_case` function in `addons/godot-iap/godot_iap.gd` | `ios-gdextension/Sources/GodotIap/GodotIap.swift` (iOS), `android/src/main/java/.../GodotIap.java` (Android) | Not required | Manual testing — no automated test suite yet | +| Library | 1. Type declared | 2. Public API exposed | 3. Platform bridge | 4. Wired into handlers bundle | 5. Test coverage | +| -------------------------- | ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **react-native-iap** | `src/types.ts` (generated) | `src/index.ts` export (Nitro or composed TS) | `ios/HybridRnIap.swift` (iOS), `android/.../HybridRnIap.kt` (Android) | Not required (flat exports) | Mock stub in all 4 `mockIap` objects in `__tests__/` (per memory) | +| **expo-iap** | `src/types.ts` (generated) | `src/modules/ios.ts` / `android.ts` export, re-exported from `src/index.ts` | `ios/ExpoIapModule.swift` `AsyncFunction`, `android/.../ExpoIapModule.kt` | Not required (flat exports) | `src/modules/__tests__/*.test.ts` | +| **flutter_inapp_purchase** | `lib/types.dart` (generated) | getter on `FlutterInappPurchase` in `lib/flutter_inapp_purchase.dart` | `case "":` in `ios/flutter_inapp_purchase/Sources/flutter_inapp_purchase/FlutterInappPurchasePlugin.swift` and `macos/flutter_inapp_purchase/Sources/flutter_inapp_purchase/FlutterInappPurchasePlugin.swift`, Android plugin `onMethodCall` | `queryHandlers` / `mutationHandlers` / `subscriptionHandlers` bundles near the bottom of `flutter_inapp_purchase.dart` | Mock + test in `test/ios_methods_test.dart` (and the `errors_unit_test.dart` error-mapping test) | +| **kmp-iap** | `library/src/commonMain/.../openiap/Types.kt` (generated interface) | exposed via `KmpInAppPurchase` / `kmpIapInstance` | `library/src/iosMain/.../InAppPurchaseIOS.kt` — must call `openIapModule.WithCompletion { ... }`, **never** `throw UnsupportedOperationException` | Not required (interface dispatch) | `library/src/commonTest/` if testable cross-platform | +| **godot-iap** | `addons/godot-iap/types.gd` (generated) | public `snake_case` function in `addons/godot-iap/godot_iap.gd` | `ios-gdextension/Sources/GodotIap/GodotIap.swift` (iOS), `android/src/main/java/.../GodotIap.java` (Android) | Not required | Manual testing — no automated test suite yet | | **maui-iap** | `src/OpenIap.Maui/Types.cs` (generated) | `OpenIap.QueryResolver` / `MutationResolver` interfaces in `Types.cs`; `IOpenIap` adds the listener-stream contract; static facade is `OpenIap.Maui.OpenIapClient` (`OpenIap.Maui.Iap` remains as a legacy shim); IAPKit helpers mirror TypeScript via `OpenIapClient.KitApi(...)`, `OpenIapClient.ConnectWebhookStream(...)`, `OpenIapClient.ParseWebhookEventData(...)`, and `OpenIapClient.WebhookEventTypes` | Android: `OpenIapMauiModule.kt` in `libraries/maui-iap/android/openiap/` (JSON-shaped Java facade over `packages/google`), bound by `OpenIap.Maui.Bindings.Android.csproj`, consumed by `Platforms/Android/OpenIapAndroid.cs`. Google Billing / Play Services / Gson / AndroidX / Kotlin dependencies must stay NuGet `PackageReference`s, not fat-bundled AARs. iOS / macCatalyst: existing `OpenIapModule+ObjC.swift` bridge in `packages/apple`, bound by hand-written `OpenIap.Maui.Bindings.iOS/ApiDefinition.cs`, consumed by `Platforms/iOS/OpenIapIOS.cs` (+ subclass `OpenIapMacCatalyst`). | Not required (interface dispatch) | Example app `libraries/maui-iap/example/OpenIap.Maui.Example` builds for net9.0-android / net9.0-ios / net9.0-maccatalyst; package CI builds net9/net10 shared, Android, iOS, and macCatalyst TFMs (manual device testing for purchase flow); no xUnit tests yet | ### Platform suffix rule (who needs what) @@ -293,21 +301,26 @@ The Google package supports **two build flavors**: | Flavor | Billing Library | Version | | ------- | ----------------------------- | -------------------------- | -| Play | Google Play Billing | 8.3.0 | -| Horizon | horizon-billing-compatibility | 1.1.1 (GPB 7.0 compatible) | +| Play | Google Play Billing | 9.1.0 | +| Horizon | horizon-billing-compatibility | 2.0.0 (GPB 7.0 compatible) | -**CRITICAL**: Horizon SDK implements **Billing 7.0 API**, not 8.x. When writing shared code in `src/main/`: +**CRITICAL**: Horizon SDK implements **Billing 7.0 API**, not 8.x/9.x. When writing shared code in `src/main/`: -**Safe APIs (exist in both 7.0 and 8.x):** +**Safe APIs (exist in both 7.0 and 9.x):** - `queryProductDetailsAsync()`, `launchBillingFlow()` - `acknowledgePurchase()`, `consumeAsync()`, `queryPurchasesAsync()` -**DO NOT use in shared code (8.x only):** +**DO NOT use in shared code (8.x/9.x only):** - `enableAutoServiceReconnection()` - Product-level status codes - One-time products with multiple offers +- Suspended-subscription queries and product-level replacement parameters +- Billing Programs APIs, including External Payments and Billing Choice + +Keep those APIs in `src/play/`. Billing Choice information, dialogs, choice +screen types, and developer-provided billing fields require Play Billing 9.1.0. ### Horizon-Specific APIs diff --git a/knowledge/internal/05-docs-patterns.md b/knowledge/internal/05-docs-patterns.md index cfebc742c..c7ae8a378 100644 --- a/knowledge/internal/05-docs-patterns.md +++ b/knowledge/internal/05-docs-patterns.md @@ -188,6 +188,25 @@ Framework implementation listings must be derived from Release notes are located at `packages/docs/src/pages/docs/updates/releases.tsx`. +### Package-specific grouping for shared releases + +The docs release page is the canonical release-note SSOT, including when many +packages ship together. To satisfy the package-specific changelog requirement +from issue #206 without duplicating release history across package-local files: + +- Audit the full requested commit range inclusively and include the current PR + diff before drafting the note. +- Group user-visible changes by affected platform package or framework library: + Google, Apple, IAPKit, React Native, Expo, Flutter, Godot, KMP, and MAUI. +- Omit packages with no user-visible change and keep each remaining group to the + smallest set of useful upgrade notes. +- Do not replace package-specific behavior with a generic "framework parity" + bullet when wrappers have different setup, runtime, or compatibility details. +- Exclude version-only commits, generated-file churn, and CI mechanics unless + they change how users install, build, or validate the release. +- Keep package-local changelogs as pointers to this page and GitHub Releases, + except where a package registry requires generated inline history. + ### Adding New Release Notes 1. Add new entry at the **top** of the `allNotes` array diff --git a/knowledge/internal/06-git-deployment.md b/knowledge/internal/06-git-deployment.md index 2eee8e089..3c74d6e4c 100644 --- a/knowledge/internal/06-git-deployment.md +++ b/knowledge/internal/06-git-deployment.md @@ -232,13 +232,16 @@ linking it. This prevents stale Package Releases tables such as documenting ### openiap-versions.json -**CRITICAL: NEVER manually edit `openiap-versions.json`** +**CRITICAL: NEVER manually edit the `google` or `apple` fields in +`openiap-versions.json`.** -This file is automatically managed by CI/CD workflows during releases: +Version ownership is split: - Apple releases update `apple` version - Google releases update `google` version -- GQL releases update `spec` version +- The shared spec can be bumped directly in a feature PR when the maintainer + explicitly requests the target version. Update both `spec` and + `packages/gql/package.json`, then run `./scripts/sync-versions.sh`. - Deploy script (`npm run deploy`) uses the current `spec` version by default, and updates `spec` only when an explicit version is passed @@ -248,12 +251,17 @@ The manifest is only for the shared spec and native platform packages: `kmp-iap`, `maui-iap`) must stay in each library's own package metadata and release workflow, not as extra keys in `openiap-versions.json`. -Manual edits will cause version conflicts and deployment issues. Always use the GitHub Actions workflows or deploy script to update versions. +Manual Google or Apple edits will cause version conflicts and deployment +issues. Use their GitHub Actions workflows. A direct spec edit is the explicit +exception above. **Why this matters:** If a feature PR sets `apple: "2.1.1"` manually, and then CI auto-bumps on release, CI sees "current is 2.1.1" and bumps to 2.1.2 — skipping 2.1.1 entirely. The published tag becomes 2.1.2 with no 2.1.1 ever existing. -**Rule:** Feature PRs must NEVER touch version fields in `openiap-versions.json`. Version bumps happen only via: +**Rule:** Feature PRs must never touch `google` or `apple`. Version bumps happen +via: 1. Release workflows (Apple Release, Google Release) -2. Deploy script (`npm run deploy`, optionally `npm run deploy `) -3. CI auto-bump after merge +2. A maintainer-requested direct `spec` bump paired with + `packages/gql/package.json` +3. Deploy script (`npm run deploy`, optionally `npm run deploy `) +4. CI auto-bump after merge where configured diff --git a/knowledge/internal/sandbox-subscription-billing-issue.md b/knowledge/internal/sandbox-subscription-billing-issue.md index 8e565a61e..5e58ace50 100644 --- a/knowledge/internal/sandbox-subscription-billing-issue.md +++ b/knowledge/internal/sandbox-subscription-billing-issue.md @@ -107,7 +107,7 @@ cd ../flutter_inapp_purchase && flutter analyze **Horizon flavor (do NOT attempt)** - The Horizon flavor's `addSubscriptionBillingIssueListener` is a documented no-op. Verified by - `SubscriptionBillingIssueHorizonNoOpTest` (Robolectric, runs on CI). There is no sandbox path on Horizon because the Billing Compatibility SDK 1.1.1 targets Play Billing 7.0 which does not expose `Purchase.isSuspended`. + `SubscriptionBillingIssueHorizonNoOpTest` (Robolectric, runs on CI). There is no sandbox path on Horizon because the Billing Compatibility SDK 2.0.0 targets Play Billing 7.0 which does not expose `Purchase.isSuspended`. --- diff --git a/libraries/expo-iap/README.md b/libraries/expo-iap/README.md index 43242b09d..78550f4d4 100644 --- a/libraries/expo-iap/README.md +++ b/libraries/expo-iap/README.md @@ -85,7 +85,7 @@ Expo IAP conforms to the **[OpenIAP specification](https://openiap.dev)** — an - **Shared specification** — Common types, error codes, and purchase flows across all platforms - **Generated type-safe bindings** — Swift, Kotlin, Dart, and GDScript from a single GraphQL schema -- **Platform implementations** — [openiap-apple](https://github.com/hyodotdev/openiap/tree/main/packages/apple) (StoreKit 2) and [openiap-google](https://github.com/hyodotdev/openiap/tree/main/packages/google) (Play Billing 8.x) +- **Platform implementations** — [openiap-apple](https://github.com/hyodotdev/openiap/tree/main/packages/apple) (StoreKit 2) and [openiap-google](https://github.com/hyodotdev/openiap/tree/main/packages/google) (Play Billing 9.1.0) - **Verification profiles** — Standardized receipt validation and purchase verification patterns Other libraries built on OpenIAP: [react-native-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/react-native-iap) · [flutter_inapp_purchase](https://github.com/hyodotdev/openiap/tree/main/libraries/flutter_inapp_purchase) · [kmp-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/kmp-iap) · [godot-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/godot-iap) diff --git a/libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapHelper.kt b/libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapHelper.kt index 4434c3070..97a81893c 100644 --- a/libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapHelper.kt +++ b/libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapHelper.kt @@ -1,6 +1,7 @@ package expo.modules.iap import dev.hyo.openiap.AndroidSubscriptionOfferInput +import dev.hyo.openiap.DeveloperBillingOptionParamsAndroid import dev.hyo.openiap.OpenIapError import dev.hyo.openiap.OpenIapModule import dev.hyo.openiap.ProductQueryType @@ -102,7 +103,15 @@ object ExpoIapHelper { } } ?: emptyList() val purchaseToken = effective["purchaseToken"] as? String + val originalExternalTransactionId = effective["originalExternalTransactionId"] as? String val replacementMode = effective["replacementMode"] as? Number + val developerBillingOption = + (effective["developerBillingOption"] as? Map<*, *>)?.let { optionMap -> + val json = optionMap.entries.mapNotNull { (key, value) -> + (key as? String)?.let { it to value } + }.toMap() + DeveloperBillingOptionParamsAndroid.fromJson(json) + } val subscriptionProductReplacementParams = (effective["subscriptionProductReplacementParams"] as? Map<*, *>)?.let { paramsMap -> val oldProductId = paramsMap["oldProductId"] as? String @@ -128,6 +137,8 @@ object ExpoIapHelper { offerToken = offerToken, offerTokenArr = offerTokenArr, explicitSubscriptionOffers = explicitSubscriptionOffers, + developerBillingOption = developerBillingOption, + originalExternalTransactionId = originalExternalTransactionId, purchaseToken = purchaseToken, replacementMode = replacementMode, subscriptionProductReplacementParams = subscriptionProductReplacementParams, @@ -155,6 +166,8 @@ object ExpoIapHelper { val offerToken: String?, val offerTokenArr: List, val explicitSubscriptionOffers: List, + val developerBillingOption: DeveloperBillingOptionParamsAndroid?, + val originalExternalTransactionId: String?, val purchaseToken: String?, val replacementMode: Number?, val subscriptionProductReplacementParams: SubscriptionProductReplacementParamsAndroid?, @@ -306,7 +319,7 @@ object ExpoIapHelper { "USER_CHOICE_BILLING", ) } - // Developer Provided Billing listener for External Payments (8.3.0+) + // Developer Provided Billing listener for External Payments (8.3.0+) and Billing Choice (9.1.0+) openIap.addDeveloperProvidedBillingListener { details -> safeEmitEvent( module, diff --git a/libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapModule.kt b/libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapModule.kt index 7ef90c149..5ccaf9bb9 100644 --- a/libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapModule.kt +++ b/libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapModule.kt @@ -286,6 +286,8 @@ class ExpoIapModule : Module() { isOfferPersonalized = parsedParams.isOfferPersonalized, obfuscatedAccountId = parsedParams.obfuscatedAccountId, obfuscatedProfileId = parsedParams.obfuscatedProfileId, + developerBillingOption = parsedParams.developerBillingOption, + originalExternalTransactionId = parsedParams.originalExternalTransactionId, purchaseToken = parsedParams.purchaseToken, replacementMode = parsedParams.replacementMode?.toInt(), skus = parsedParams.skus, @@ -295,7 +297,7 @@ class ExpoIapModule : Module() { RequestPurchaseProps( request = RequestPurchaseProps.Request.Subscription( - RequestSubscriptionPropsByPlatforms(android = android), + RequestSubscriptionPropsByPlatforms(google = android), ), type = ProductQueryType.Subs, ) @@ -307,13 +309,14 @@ class ExpoIapModule : Module() { isOfferPersonalized = parsedParams.isOfferPersonalized, obfuscatedAccountId = parsedParams.obfuscatedAccountId, obfuscatedProfileId = parsedParams.obfuscatedProfileId, + developerBillingOption = parsedParams.developerBillingOption, offerToken = parsedParams.offerToken, skus = parsedParams.skus, ) RequestPurchaseProps( request = RequestPurchaseProps.Request.Purchase( - RequestPurchasePropsByPlatforms(android = android), + RequestPurchasePropsByPlatforms(google = android), ), type = ProductQueryType.InApp, ) @@ -723,6 +726,7 @@ class ExpoIapModule : Module() { } val billingProgram = params["billingProgram"] as? String + val externalTransactionToken = params["externalTransactionToken"] as? String val launchMode = params["launchMode"] as? String ?: "unspecified" val linkType = params["linkType"] as? String ?: "unspecified" val linkUri = params["linkUri"] as? String @@ -740,6 +744,7 @@ class ExpoIapModule : Module() { val openIapParams = OpenIapLaunchExternalLinkParams( billingProgram = mapBillingProgram(billingProgram), + externalTransactionToken = externalTransactionToken, launchMode = mapExternalLinkLaunchMode(launchMode), linkType = mapExternalLinkType(linkType), linkUri = linkUri, diff --git a/libraries/expo-iap/example/__tests__/subscription-flow.test.tsx b/libraries/expo-iap/example/__tests__/subscription-flow.test.tsx index 5ce6bc2a5..4caf4e4e7 100644 --- a/libraries/expo-iap/example/__tests__/subscription-flow.test.tsx +++ b/libraries/expo-iap/example/__tests__/subscription-flow.test.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import {render, fireEvent, waitFor} from '@testing-library/react-native'; +import {act, render, fireEvent, waitFor} from '@testing-library/react-native'; import {Alert, Platform} from 'react-native'; // Mock expo-constants @@ -21,6 +21,20 @@ const mockRequestPurchase = jest.fn().mockResolvedValue(undefined); const mockFinishTransaction = jest.fn(); const mockGetActiveSubscriptions = jest.fn(); const mockGetAvailablePurchases = jest.fn().mockResolvedValue([]); +const mockVerifyPurchase = jest.fn().mockResolvedValue({}); +const mockVerifyPurchaseWithProvider = jest + .fn((_request: unknown) => + Promise.resolve({ + iapkit: { + isValid: true, + state: 'purchased', + store: 'google', + }, + }), + ) + .mockName('verifyPurchaseWithProvider'); +let mockOnPurchaseSuccess: + ((purchase: Record) => Promise | void) | undefined; const createMockSubscription = (overrides = {}) => ({ id: 'test.subscription.1', @@ -67,7 +81,10 @@ const mockUseIAP = jest.fn(); jest.mock('../../src', () => ({ initConnection: mockInitConnection, requestPurchase: mockRequestPurchase, - useIAP: () => mockUseIAP(), + useIAP: (options?: {onPurchaseSuccess?: typeof mockOnPurchaseSuccess}) => { + mockOnPurchaseSuccess = options?.onPurchaseSuccess; + return mockUseIAP(); + }, })); const SubscriptionFlow = require('../app/subscription-flow').default; @@ -85,6 +102,15 @@ describe('SubscriptionFlow Component', () => { mockGetActiveSubscriptions.mockResolvedValue([]); mockFinishTransaction.mockResolvedValue(undefined); mockGetAvailablePurchases.mockResolvedValue([]); + mockVerifyPurchase.mockResolvedValue({}); + mockVerifyPurchaseWithProvider.mockResolvedValue({ + iapkit: { + isValid: true, + state: 'purchased', + store: 'google', + }, + }); + mockOnPurchaseSuccess = undefined; // Default mock implementation mockUseIAP.mockReturnValue({ @@ -96,6 +122,8 @@ describe('SubscriptionFlow Component', () => { finishTransaction: mockFinishTransaction, getActiveSubscriptions: mockGetActiveSubscriptions, activeSubscriptions: [], + verifyPurchase: mockVerifyPurchase, + verifyPurchaseWithProvider: mockVerifyPurchaseWithProvider, }); }); @@ -339,4 +367,35 @@ describe('SubscriptionFlow Component', () => { // When there are no active subscriptions but connected, show check status link expect(getByText('Check Status')).toBeDefined(); }); + + it('re-verifies the Android IAPKit snapshot after finishing', async () => { + Object.defineProperty(Platform, 'OS', { + value: 'android', + writable: true, + }); + + await renderConnectedSubscriptionFlow(); + + await act(async () => { + await mockOnPurchaseSuccess?.({ + id: 'transaction-android-1', + platform: 'android', + productId: 'dev.hyo.martie.premium', + purchaseToken: 'android-token', + transactionDate: Date.now(), + }); + }); + + expect(mockFinishTransaction).toHaveBeenCalledTimes(1); + expect(mockVerifyPurchaseWithProvider).toHaveBeenCalledTimes(2); + expect(mockVerifyPurchaseWithProvider.mock.calls[1]?.[0]).toEqual( + mockVerifyPurchaseWithProvider.mock.calls[0]?.[0], + ); + expect( + mockVerifyPurchaseWithProvider.mock.invocationCallOrder[0], + ).toBeLessThan(mockFinishTransaction.mock.invocationCallOrder[0]!); + expect(mockFinishTransaction.mock.invocationCallOrder[0]).toBeLessThan( + mockVerifyPurchaseWithProvider.mock.invocationCallOrder[1]!, + ); + }); }); diff --git a/libraries/expo-iap/example/app/subscription-flow.tsx b/libraries/expo-iap/example/app/subscription-flow.tsx index 3b823a13f..bf61d0608 100644 --- a/libraries/expo-iap/example/app/subscription-flow.tsx +++ b/libraries/expo-iap/example/app/subscription-flow.tsx @@ -54,7 +54,8 @@ const getSubscriptionTier = (productId: string): number => { function isSubscriptionFlowProduct(productId: string): boolean { return SUBSCRIPTION_PRODUCT_IDS.some( (subscriptionId) => - productId === subscriptionId || productId.startsWith(`${subscriptionId}.`), + productId === subscriptionId || + productId.startsWith(`${subscriptionId}.`), ); } @@ -1620,9 +1621,9 @@ function SubscriptionFlowContainer() { const normalizedPurchaseStore = purchaseStore?.toLowerCase() ?? ''; const hasAndroidPurchaseIdentity = Boolean( purchase.purchaseToken || - purchase.id || - purchase.transactionId || - purchase.productId, + purchase.id || + purchase.transactionId || + purchase.productId, ); if (Platform.OS === 'ios' && purchasePlatform === 'ios') { @@ -1672,7 +1673,10 @@ function SubscriptionFlowContainer() { console.log('Android Purchase Analysis:'); console.log(' platform:', purchasePlatform || Platform.OS); console.log(' store:', normalizedPurchaseStore || 'unknown'); - console.log(' hasAndroidPurchaseIdentity:', hasAndroidPurchaseIdentity); + console.log( + ' hasAndroidPurchaseIdentity:', + hasAndroidPurchaseIdentity, + ); console.log(' isPurchased:', isPurchased); console.log(' isRestoration:', isRestoration); } @@ -1701,9 +1705,7 @@ function SubscriptionFlowContainer() { console.log( '[SubscriptionFlow] This is a restoration, skipping verification', ); - setPurchaseResult( - 'Subscription restored; finishing transaction...', - ); + setPurchaseResult('Subscription restored; finishing transaction...'); // Step 6: finish transaction (restoration) const finishCleanupKey = getPurchaseCleanupKey(purchase); @@ -1754,6 +1756,7 @@ function SubscriptionFlowContainer() { // Android: Google Play Developer API + RTDN // ------------------------------------------------------------ const currentVerificationMethod = verificationMethodRef.current; + let iapkitVerifyRequest: VerifyPurchaseWithProviderProps | null = null; console.log('[SubscriptionFlow] About to verify purchase:', { verificationMethod: currentVerificationMethod, productId, @@ -1809,6 +1812,7 @@ function SubscriptionFlowContainer() { provider: 'iapkit', iapkit: iapkitPayload, }; + iapkitVerifyRequest = verifyRequest; const iapkitLogPayload = { ...iapkitPayload, ...(iapkitPayload.apiKey ? {apiKey: '***hidden***'} : {}), @@ -1817,12 +1821,12 @@ function SubscriptionFlowContainer() { console.log( '[SubscriptionFlow] Sending IAPKit verification request:', JSON.stringify( - { - provider: verifyRequest.provider, - iapkit: iapkitLogPayload, - }, - null, - 2, + { + provider: verifyRequest.provider, + iapkit: iapkitLogPayload, + }, + null, + 2, ), ); @@ -1883,6 +1887,21 @@ function SubscriptionFlowContainer() { } if (didFinishTransaction) { + if (Platform.OS === 'android' && iapkitVerifyRequest) { + try { + const refreshedResult = + await verifyPurchaseWithProvider(iapkitVerifyRequest); + console.log( + '[SubscriptionFlow] IAPKit state after finishTransaction:', + refreshedResult, + ); + } catch (error) { + console.log( + '[SubscriptionFlow] IAPKit post-finish verification failed:', + error, + ); + } + } showNativeAlert('Success', 'New subscription activated successfully!'); console.log('✅ New subscription purchase completed'); } diff --git a/libraries/expo-iap/plugin/__tests__/withIAP.test.ts b/libraries/expo-iap/plugin/__tests__/withIAP.test.ts index 689432de8..9ee7d60c4 100644 --- a/libraries/expo-iap/plugin/__tests__/withIAP.test.ts +++ b/libraries/expo-iap/plugin/__tests__/withIAP.test.ts @@ -403,10 +403,22 @@ describe('android configuration', () => { 'meta-data': [ { $: { - 'android:name': 'com.meta.horizon.platform.ovr.OCULUS_APP_ID', + 'android:name': 'com.meta.horizon.platform.HORIZON_APP_ID', 'android:value': '123', }, }, + { + $: { + 'android:name': 'com.meta.horizon.platform.ovr.OCULUS_APP_ID', + 'android:value': 'legacy', + }, + }, + { + $: { + 'android:name': 'com.oculus.vr.APP_ID', + 'android:value': 'legacy', + }, + }, { $: { 'android:name': 'dev.iapkit.API_KEY', @@ -440,7 +452,42 @@ describe('android configuration', () => { expect(manifest.manifest.application?.[0]?.['meta-data']).toEqual([ { $: { - 'android:name': 'com.meta.horizon.platform.ovr.OCULUS_APP_ID', + 'android:name': 'com.meta.horizon.platform.HORIZON_APP_ID', + 'android:value': '123', + }, + }, + ]); + }); + + it('migrates legacy Horizon App ID metadata to the canonical key', () => { + const manifest = { + manifest: { + application: [ + { + 'meta-data': [ + { + $: { + 'android:name': 'com.meta.horizon.platform.ovr.OCULUS_APP_ID', + 'android:value': 'old', + }, + }, + { + $: { + 'android:name': 'com.oculus.vr.APP_ID', + 'android:value': 'old', + }, + }, + ], + }, + ], + }, + }; + + expect(syncHorizonAppIdMetaData(manifest, true, '123')).toBe('updated'); + expect(manifest.manifest.application[0]!['meta-data']).toEqual([ + { + $: { + 'android:name': 'com.meta.horizon.platform.HORIZON_APP_ID', 'android:value': '123', }, }, @@ -473,7 +520,7 @@ describe('android configuration', () => { }, { $: { - 'android:name': 'com.meta.horizon.platform.ovr.OCULUS_APP_ID', + 'android:name': 'com.meta.horizon.platform.HORIZON_APP_ID', 'android:value': '123', }, }, @@ -500,7 +547,7 @@ describe('local OpenIAP configuration', () => { describe('ios module selection', () => { const createConfig = (ios?: ExpoConfig['ios']): ExpoConfig => - ({name: 'test-app', slug: 'test-app', ios}) as ExpoConfig; + ({name: 'test-app', slug: 'test-app', ios} as ExpoConfig); it('defaults to Expo IAP only when no options provided', () => { const result = resolveModuleSelection(createConfig(), undefined); diff --git a/libraries/expo-iap/plugin/src/withIAP.ts b/libraries/expo-iap/plugin/src/withIAP.ts index 5da9a2837..4787229d8 100644 --- a/libraries/expo-iap/plugin/src/withIAP.ts +++ b/libraries/expo-iap/plugin/src/withIAP.ts @@ -58,7 +58,20 @@ const addLineToGradle = ( }; const HORIZON_APP_ID_META_DATA_NAME = - 'com.meta.horizon.platform.ovr.OCULUS_APP_ID'; + 'com.meta.horizon.platform.HORIZON_APP_ID'; +const LEGACY_HORIZON_APP_ID_META_DATA_NAMES = new Set([ + 'com.meta.horizon.platform.ovr.OCULUS_APP_ID', + 'com.meta.horizon.platform.ovr.HORIZON_APP_ID', + 'com.oculus.vr.APP_ID', +]); + +const isHorizonAppIdMetaData = (metaData: any): boolean => { + const name = metaData?.$?.['android:name']; + return ( + name === HORIZON_APP_ID_META_DATA_NAME || + LEGACY_HORIZON_APP_ID_META_DATA_NAMES.has(name) + ); +}; type AndroidManifestLike = { manifest: { @@ -147,7 +160,7 @@ export function syncHorizonAppIdMetaData( if (!Array.isArray(existingMetaData)) return 'unchanged'; const nextMetaData = existingMetaData.filter( - (m) => m.$?.['android:name'] !== HORIZON_APP_ID_META_DATA_NAME, + (metaData) => !isHorizonAppIdMetaData(metaData), ); if (nextMetaData.length === existingMetaData.length || !application) { return 'unchanged'; @@ -179,17 +192,12 @@ export function syncHorizonAppIdMetaData( }, }; - const existingIndex = metaData.findIndex( - (m: any) => m.$?.['android:name'] === HORIZON_APP_ID_META_DATA_NAME, + const hadExistingAppId = metaData.some(isHorizonAppIdMetaData); + horizonApplication['meta-data'] = metaData.filter( + (item: any) => !isHorizonAppIdMetaData(item), ); - - if (existingIndex !== -1) { - metaData[existingIndex] = horizonAppIdMeta; - return 'updated'; - } - - metaData.push(horizonAppIdMeta); - return 'added'; + horizonApplication['meta-data'].push(horizonAppIdMeta); + return hadExistingAppId ? 'updated' : 'added'; } export const modifyAppBuildGradle = ( @@ -238,8 +246,9 @@ export const modifyAppBuildGradle = ( let flavor: 'amazon' | 'horizon' | 'play' = 'play'; let artifactId: - 'openiap-google-amazon' | 'openiap-google-horizon' | 'openiap-google' = - 'openiap-google'; + | 'openiap-google-amazon' + | 'openiap-google-horizon' + | 'openiap-google' = 'openiap-google'; if (isFireOsEnabled) { flavor = 'amazon'; artifactId = 'openiap-google-amazon'; @@ -734,7 +743,8 @@ interface LegacyAmazonPlatformFlagOptions { } type AmazonPlatformFlagInput = - AmazonPlatformFlagOptions | LegacyAmazonPlatformFlagOptions; + | AmazonPlatformFlagOptions + | LegacyAmazonPlatformFlagOptions; function isEnvFlagEnabled(name: string): boolean { return process.env[name] === '1'; @@ -761,7 +771,7 @@ export function resolveAmazonPlatformFlags( isEnvFlagEnabled('EXPO_IAP_VEGA'); const isHorizonEnabled = isFireOsEnabled ? false - : (options?.modules?.horizon ?? isEnvFlagEnabled('EXPO_IAP_HORIZON')); + : options?.modules?.horizon ?? isEnvFlagEnabled('EXPO_IAP_HORIZON'); const isOnsideEnabled = options?.modules?.onside ?? isEnvFlagEnabled('EXPO_IAP_ONSIDE'); @@ -803,7 +813,8 @@ export function resolveModuleSelection( options?: ExpoIapPluginCommonOptions | void, ): ModuleSelectionResult { const normalizedOptions = (options ?? undefined) as - ExpoIapPluginCommonOptions | undefined; + | ExpoIapPluginCommonOptions + | undefined; const selection = normalizedOptions?.module ?? 'auto'; diff --git a/libraries/expo-iap/src/__tests__/index.test.ts b/libraries/expo-iap/src/__tests__/index.test.ts index d380134c8..f4fc6c62f 100644 --- a/libraries/expo-iap/src/__tests__/index.test.ts +++ b/libraries/expo-iap/src/__tests__/index.test.ts @@ -401,6 +401,24 @@ describe('Public API (index.ts)', () => { expect(ExpoIapModule.initConnection).toHaveBeenCalled(); expect(ExpoIapModule.endConnection).toHaveBeenCalled(); }); + + it('forwards developer-rendered Billing Choice connection config', async () => { + (ExpoIapModule.initConnection as jest.Mock) = jest + .fn() + .mockResolvedValue(true); + + await expect( + initConnection({ + enableBillingProgramAndroid: 'billing-choice', + billingChoiceScreenTypeAndroid: 'developer-rendered', + }), + ).resolves.toBe(true); + + expect(ExpoIapModule.initConnection).toHaveBeenCalledWith({ + enableBillingProgramAndroid: 'billing-choice', + billingChoiceScreenTypeAndroid: 'developer-rendered', + }); + }); }); describe('fetchProducts', () => { @@ -735,6 +753,64 @@ describe('Public API (index.ts)', () => { ); }); + it('Android forwards minimal in-app Billing Choice options', async () => { + (Platform as any).OS = 'android'; + (ExpoIapModule.requestPurchase as jest.Mock) = jest + .fn() + .mockResolvedValue([]); + + await requestPurchase({ + request: { + google: { + skus: ['premium'], + developerBillingOption: {billingProgram: 'billing-choice'}, + }, + }, + type: 'in-app', + }); + + expect(ExpoIapModule.requestPurchase).toHaveBeenCalledWith( + expect.objectContaining({ + developerBillingOption: {billingProgram: 'billing-choice'}, + }), + ); + }); + + it('Android forwards Billing Choice subscription replacement fields', async () => { + (Platform as any).OS = 'android'; + (ExpoIapModule.requestPurchase as jest.Mock) = jest + .fn() + .mockResolvedValue([]); + + await requestPurchase({ + request: { + google: { + skus: ['premium_monthly'], + originalExternalTransactionId: 'original-external-id', + developerBillingOption: { + billingProgram: 'billing-choice', + externalTransactionToken: 'pre-generated-token', + launchMode: 'caller-will-launch-link', + linkUri: 'https://example.com/checkout', + }, + }, + }, + type: 'subs', + }); + + expect(ExpoIapModule.requestPurchase).toHaveBeenCalledWith( + expect.objectContaining({ + originalExternalTransactionId: 'original-external-id', + developerBillingOption: { + billingProgram: 'billing-choice', + externalTransactionToken: 'pre-generated-token', + launchMode: 'caller-will-launch-link', + linkUri: 'https://example.com/checkout', + }, + }), + ); + }); + it('Android subscription passes both legacy replacementMode and new subscriptionProductReplacementParams', async () => { (Platform as any).OS = 'android'; (ExpoIapModule.requestPurchase as jest.Mock) = jest diff --git a/libraries/expo-iap/src/__tests__/useIAP.test.tsx b/libraries/expo-iap/src/__tests__/useIAP.test.tsx index 8e59ba9c4..83d48791f 100644 --- a/libraries/expo-iap/src/__tests__/useIAP.test.tsx +++ b/libraries/expo-iap/src/__tests__/useIAP.test.tsx @@ -13,9 +13,11 @@ jest.mock('react-native', () => ({ /* eslint-disable import/first */ import * as React from 'react'; import * as ReactTestRenderer from 'react-test-renderer'; +import {Platform} from 'react-native'; import ExpoIapModule from '../ExpoIapModule'; import {ErrorCode} from '../types'; import {useIAP, UseIAPOptions} from '../useIAP'; +import * as AndroidApi from '../modules/android'; /* eslint-enable import/first */ // Suppress console output during tests @@ -59,6 +61,7 @@ const purchaseErrorEvent = 'purchase-error'; describe('useIAP hook', () => { beforeEach(() => { jest.clearAllMocks(); + (Platform as unknown as {OS: string}).OS = 'ios'; // Default mock for initConnection (ExpoIapModule.initConnection as jest.Mock) = jest .fn() @@ -71,6 +74,95 @@ describe('useIAP hook', () => { }); }); + describe('Android Billing Choice options', () => { + it('forwards renderer config and billing event callbacks', async () => { + (Platform as unknown as {OS: string}).OS = 'android'; + const listeners: Record void> = {}; + (ExpoIapModule.addListener as jest.Mock).mockImplementation( + (eventName: string, listener: (payload: unknown) => void) => { + listeners[eventName] = listener; + return {remove: jest.fn()}; + }, + ); + + const onUserChoiceBillingAndroid = jest.fn(); + const onDeveloperProvidedBillingAndroid = jest.fn(); + const onSubscriptionBillingIssue = jest.fn(); + + await ReactTestRenderer.act(async () => { + ReactTestRenderer.create( + {}} + />, + ); + await flushPromises(); + }); + + expect(ExpoIapModule.initConnection).toHaveBeenCalledWith({ + enableBillingProgramAndroid: 'billing-choice', + billingChoiceScreenTypeAndroid: 'developer-rendered', + }); + + const userChoice = {externalTransactionToken: 'user-choice-token'}; + const developerProvided = { + externalTransactionToken: 'billing-choice-token', + products: [{id: 'premium', type: 'in-app'}], + }; + const billingIssue = {id: 'purchase-id', productId: 'subscription'}; + listeners['user-choice-billing-android']?.(userChoice); + listeners['developer-provided-billing-android']?.(developerProvided); + listeners['subscription-billing-issue']?.(billingIssue); + + expect(onUserChoiceBillingAndroid).toHaveBeenCalledWith(userChoice); + expect(onDeveloperProvidedBillingAndroid).toHaveBeenCalledWith( + developerProvided, + ); + expect(onSubscriptionBillingIssue).toHaveBeenCalledWith(billingIssue); + }); + + it('exposes all Billing Choice APIs through the hook', async () => { + (Platform as unknown as {OS: string}).OS = 'android'; + let hookResult: ReturnType | null = null; + + await ReactTestRenderer.act(async () => { + ReactTestRenderer.create( + { + hookResult = hook; + }} + />, + ); + await flushPromises(); + }); + + expect(hookResult!.getBillingChoiceInfoAndroid).toBe( + AndroidApi.getBillingChoiceInfoAndroid, + ); + expect(hookResult!.isBillingProgramAvailableAndroid).toBe( + AndroidApi.isBillingProgramAvailableAndroid, + ); + expect(hookResult!.createBillingProgramReportingDetailsAndroid).toBe( + AndroidApi.createBillingProgramReportingDetailsAndroid, + ); + expect(hookResult!.launchExternalLinkAndroid).toBe( + AndroidApi.launchExternalLinkAndroid, + ); + expect(hookResult!.showBillingProgramInformationDialogAndroid).toBe( + AndroidApi.showBillingProgramInformationDialogAndroid, + ); + expect(hookResult!.showInAppMessagesAndroid).toBe( + AndroidApi.showInAppMessagesAndroid, + ); + }); + }); + describe('onError callback', () => { it('calls onError when fetchProducts fails', async () => { const mockError = new Error('Failed to query product'); diff --git a/libraries/expo-iap/src/__tests__/vega-adapter.test.ts b/libraries/expo-iap/src/__tests__/vega-adapter.test.ts index 76fc4a521..f7cb09170 100644 --- a/libraries/expo-iap/src/__tests__/vega-adapter.test.ts +++ b/libraries/expo-iap/src/__tests__/vega-adapter.test.ts @@ -65,7 +65,7 @@ const createService = (): jest.Mocked => notifyFulfillment: jest.fn(async () => ({ responseCode: 1, })), - }) as unknown as jest.Mocked; + } as unknown as jest.Mocked); describe('Amazon Vega Expo adapter', () => { it('initializes without fetching Amazon user data', async () => { @@ -223,8 +223,7 @@ describe('Amazon Vega Expo adapter', () => { try { const result = module.acknowledgePurchaseAndroid('receipt-1'); - await Promise.resolve(); - jest.advanceTimersByTime(1_000); + await jest.advanceTimersByTimeAsync(1_000); await expect(result).resolves.toBeUndefined(); expect(service.notifyFulfillment).toHaveBeenCalledTimes(2); @@ -237,6 +236,28 @@ describe('Amazon Vega Expo adapter', () => { } }); + it('times out Amazon Vega fulfillment without duplicating the request', async () => { + jest.useFakeTimers(); + const service = createService(); + service.notifyFulfillment.mockImplementationOnce( + () => new Promise(() => {}), + ); + const module = createExpoIapVegaModule(service); + + try { + const result = module.acknowledgePurchaseAndroid('receipt-1'); + const expectation = expect(result).rejects.toMatchObject({ + code: 'service-timeout', + }); + await jest.advanceTimersByTimeAsync(2_000); + + await expectation; + expect(service.notifyFulfillment).toHaveBeenCalledTimes(1); + } finally { + jest.useRealTimers(); + } + }); + it('recovers fulfillable receipts after Amazon Vega purchase failures', async () => { const service = createService(); service.purchase.mockResolvedValueOnce({ diff --git a/libraries/expo-iap/src/index.ts b/libraries/expo-iap/src/index.ts index fc7c4367d..bf67f1de3 100644 --- a/libraries/expo-iap/src/index.ts +++ b/libraries/expo-iap/src/index.ts @@ -58,8 +58,8 @@ export enum OpenIapEvent { PromotedProductIOS = 'promoted-product-ios', UserChoiceBillingAndroid = 'user-choice-billing-android', /** - * Fired when user selects developer billing in External Payments flow (Android 8.3.0+) - * Only available in Japan. Contains externalTransactionToken for reporting. + * Fired for External Payments (8.3.0+) and Billing Choice (9.1.0+) + * developer billing flows. Nullable fields depend on the selected flow. */ DeveloperProvidedBillingAndroid = 'developer-provided-billing-android', /** @@ -482,33 +482,29 @@ export const userChoiceBillingListenerAndroid = ( }; /** - * Android-only listener for Developer Provided Billing events (External Payments). - * This fires when a user selects the developer's payment option in the External Payments - * side-by-side choice dialog during purchase flow. + * Android-only listener for Developer Provided Billing events. + * This fires when a user selects the developer's option in an External Payments + * or Billing Choice purchase flow. * - * Requires Google Play Billing Library 8.3.0+ and is currently only available in Japan. + * Requires Google Play Billing Library 8.3.0+; Billing Choice fields require 9.1.0+. * - * @param listener - Callback function that receives the external transaction token + * @param listener - Callback that receives selected products and flow details * @returns EventSubscription that can be used to unsubscribe * * @example * ```typescript * const subscription = developerProvidedBillingListenerAndroid(async (details) => { - * console.log('User selected developer billing'); - * console.log('External transaction token received; send it to your backend without logging it.'); - * - * // Process payment with your payment gateway - * await processPaymentWithYourGateway(details.externalTransactionToken); - * - * // IMPORTANT: Report the token to Google Play within 24 hours - * await reportExternalTransactionToGoogle(details.externalTransactionToken); + * await processPaymentWithYourGateway(details.products, details.linkUri); + * if (details.externalTransactionToken) { + * await reportExternalTransactionToGoogle(details.externalTransactionToken); + * } * }); * * // Later, clean up * subscription.remove(); * ``` * - * @platform Android (8.3.0+, Japan only) + * @platform Android (8.3.0+; Billing Choice 9.1.0+) */ export const developerProvidedBillingListenerAndroid = ( listener: (details: DeveloperProvidedBillingDetailsAndroid) => void, @@ -566,7 +562,9 @@ export const subscriptionBillingIssueListener = ( * Initialize the store connection. Must be called before any other IAP API. * * @param config Optional connection config. Use `enableBillingProgramAndroid` (Android, - * Play Billing 8.2.0+) to opt into External Payments etc. iOS ignores Android-specific fields. + * Play Billing 8.2.0+) to opt into a billing program. For Billing Choice 9.1.0+, set + * `billingChoiceScreenTypeAndroid` to the renderer configured in Play Console. + * iOS ignores Android-specific fields. * @returns Promise resolving to `true` when the platform billing client is connected. * @throws When the platform billing client fails to initialize. * @@ -574,6 +572,10 @@ export const subscriptionBillingIssueListener = ( * ```ts * await initConnection(); * await initConnection({ enableBillingProgramAndroid: 'external-offer' }); + * await initConnection({ + * enableBillingProgramAndroid: 'billing-choice', + * billingChoiceScreenTypeAndroid: 'developer-rendered', + * }); * ``` * * @remarks When using `useIAP()`, connection is auto-managed on mount/unmount — @@ -974,6 +976,7 @@ export const requestPurchase: MutationField<'requestPurchase'> = async ( obfuscatedProfileId, isOfferPersonalized, offerToken, + developerBillingOption, } = normalizedRequest; const result = (await ExpoIapModule.requestPurchase({ @@ -984,6 +987,7 @@ export const requestPurchase: MutationField<'requestPurchase'> = async ( obfuscatedAccountId: obfuscatedAccountId, obfuscatedProfileId: obfuscatedProfileId, offerToken: offerToken, + developerBillingOption: developerBillingOption ?? undefined, offerTokenArr: [], isOfferPersonalized: isOfferPersonalized ?? false, })) as Purchase[]; @@ -1020,6 +1024,8 @@ export const requestPurchase: MutationField<'requestPurchase'> = async ( subscriptionOffers, replacementMode: replacementModeInput, purchaseToken: purchaseTokenInput, + originalExternalTransactionId, + developerBillingOption, subscriptionProductReplacementParams, } = normalizedRequest; @@ -1031,6 +1037,8 @@ export const requestPurchase: MutationField<'requestPurchase'> = async ( type: native, skuArr: skus, purchaseToken, + originalExternalTransactionId: + originalExternalTransactionId ?? undefined, replacementMode, obfuscatedAccountId: obfuscatedAccountId, obfuscatedProfileId: obfuscatedProfileId, @@ -1039,6 +1047,7 @@ export const requestPurchase: MutationField<'requestPurchase'> = async ( ), subscriptionOffers: normalizedOffers, isOfferPersonalized: isOfferPersonalized ?? false, + developerBillingOption: developerBillingOption ?? undefined, subscriptionProductReplacementParams: subscriptionProductReplacementParams ?? undefined, })) as Purchase[]; diff --git a/libraries/expo-iap/src/modules/__tests__/android.test.ts b/libraries/expo-iap/src/modules/__tests__/android.test.ts index 01da63ad1..0cb9e974d 100644 --- a/libraries/expo-iap/src/modules/__tests__/android.test.ts +++ b/libraries/expo-iap/src/modules/__tests__/android.test.ts @@ -355,6 +355,28 @@ describe('Android Module Functions', () => { }); }); + it('forwards the Billing Choice external transaction token', async () => { + ( + ExpoIapModule.launchExternalLinkAndroid as jest.Mock + ).mockResolvedValue(undefined); + + await launchExternalLinkAndroid({ + billingProgram: 'billing-choice', + externalTransactionToken: 'pre-generated-token', + launchMode: 'caller-will-launch-link', + linkType: 'link-to-digital-content-offer', + linkUri: 'https://example.com/checkout', + }); + + expect(ExpoIapModule.launchExternalLinkAndroid).toHaveBeenCalledWith({ + billingProgram: 'billing-choice', + externalTransactionToken: 'pre-generated-token', + launchMode: 'caller-will-launch-link', + linkType: 'link-to-digital-content-offer', + linkUri: 'https://example.com/checkout', + }); + }); + it('propagates errors from native module', async () => { const error = new Error('Activity not available'); ( @@ -480,7 +502,11 @@ describe('Android Module Functions', () => { describe('showBillingProgramInformationDialogAndroid', () => { it('applies Billing Choice default program', async () => { - const mockResult = {responseCode: 0, debugMessage: null}; + const mockResult = { + responseCode: 0, + debugMessage: null, + subResponseCode: 'no-applicable-sub-response-code', + }; ( ExpoIapModule.showBillingProgramInformationDialogAndroid as jest.Mock ).mockResolvedValue(mockResult); diff --git a/libraries/expo-iap/src/modules/android.ts b/libraries/expo-iap/src/modules/android.ts index d14bcafdf..e433c9a0b 100644 --- a/libraries/expo-iap/src/modules/android.ts +++ b/libraries/expo-iap/src/modules/android.ts @@ -307,9 +307,10 @@ export const createAlternativeBillingTokenAndroid: MutationField< /** * Check if a specific billing program is available for this user/device (Android only). - * Available in Google Play Billing Library 8.2.0+. + * Available in Google Play Billing Library 8.2.0+. Billing Choice availability + * details, including the configured renderer and external-link support, require 9.1.0+. * - * @param program - The billing program to check ('external-offer' or 'external-content-link') + * @param program - The billing program to check * @returns Promise resolving to availability result * * @example @@ -352,7 +353,8 @@ export const getBillingChoiceInfoAndroid: QueryField< /** * Launch an external link for the specified billing program (Android only). - * Available in Google Play Billing Library 8.2.0+. + * Available in Google Play Billing Library 8.2.0+; developer-rendered Billing + * Choice external-link flows require 9.1.0+ and `externalTransactionToken`. * * @param params - The external link parameters * @returns Promise resolving to true if the link was launched successfully @@ -360,7 +362,8 @@ export const getBillingChoiceInfoAndroid: QueryField< * @example * ```typescript * await launchExternalLinkAndroid({ - * billingProgram: 'external-offer', + * billingProgram: 'billing-choice', + * externalTransactionToken: 'pre-generated-token', * launchMode: 'launch-in-external-browser-or-app', * linkType: 'link-to-digital-content-offer', * linkUri: 'https://your-payment-site.com', @@ -425,7 +428,8 @@ export function createBillingProgramReportingDetailsAndroid( } /** - * Show Google's information dialog for a Billing Choice external transaction. + * Show Google's mandatory information dialog before a developer-rendered, + * in-app Billing Choice screen. * Available in Google Play Billing Library 9.1.0+. * * @param params - Dialog parameters with the external transaction token diff --git a/libraries/expo-iap/src/types.ts b/libraries/expo-iap/src/types.ts index 8e553b2a7..e36ce758d 100644 --- a/libraries/expo-iap/src/types.ts +++ b/libraries/expo-iap/src/types.ts @@ -26,6 +26,7 @@ export interface ActiveSubscription { * pending upgrades/downgrades, and auto-renewal preferences. */ renewalInfoIOS?: (RenewalInfoIOS | null); + /** Unix timestamp in milliseconds since January 1, 1970 UTC. */ transactionDate: number; transactionId: string; /** @@ -119,13 +120,13 @@ export interface AppTransaction { /** * Play Billing choice image layout (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export type BillingChoiceImageLayoutAndroid = 'rectangular-four-by-one' | 'rectangular-three-by-one' | 'rectangular-two-by-two'; /** * Display information for developer-rendered Billing Choice screens (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export interface BillingChoiceInfoAndroid { /** URL for the Play Billing choice image matching the requested layout. */ @@ -136,14 +137,15 @@ export interface BillingChoiceInfoAndroid { /** * Choice screen renderer for Billing Choice availability (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export type BillingChoiceScreenTypeAndroid = 'unspecified' | 'developer-rendered' | 'google-rendered'; /** * Billing program types for Google Play Billing Programs (Android) * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, - * BILLING_CHOICE added in 9.1.0. + * BILLING_CHOICE added in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ export type BillingProgramAndroid = 'unspecified' | 'user-choice-billing' | 'external-content-link' | 'external-offer' | 'external-payments' | 'billing-choice'; @@ -154,20 +156,24 @@ export type BillingProgramAndroid = 'unspecified' | 'user-choice-billing' | 'ext export interface BillingProgramAvailabilityResultAndroid { /** The billing program that was checked */ billingProgram: BillingProgramAndroid; - /** Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. */ + /** + * Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. + */ choiceScreenType?: (BillingChoiceScreenTypeAndroid | null); /** Whether the billing program is available for the user */ isAvailable: boolean; /** * Whether external-link payment is available for Billing Choice. * Populated only for available BILLING_CHOICE results. + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. */ isExternalLinkAvailable?: (boolean | null); } /** * Parameters for showing a billing program information dialog (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export interface BillingProgramInformationDialogParamsAndroid { /** Billing program. Currently only BILLING_CHOICE is supported. */ @@ -222,22 +228,35 @@ export interface DeepLinkOptions { export type DeveloperBillingLaunchModeAndroid = 'unspecified' | 'launch-in-external-browser-or-app' | 'caller-will-launch-link'; /** - * Parameters for developer billing option in purchase flow (Android) - * Used with BillingFlowParams to enable external payments flow - * Available in Google Play Billing Library 8.3.0+ + * Parameters for a developer billing option in a purchase flow (Android). + * Used with BillingFlowParams for external payments (8.3.0+) and Billing Choice + * (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+). + * Only billingProgram is required; link fields are used when the selected program + * links outside the app. */ export interface DeveloperBillingOptionParamsAndroid { - /** The billing program (should be EXTERNAL_PAYMENTS for external payments flow) */ + /** The billing program. Use EXTERNAL_PAYMENTS or BILLING_CHOICE. */ billingProgram: BillingProgramAndroid; - /** The launch mode for the external payment link */ - launchMode: DeveloperBillingLaunchModeAndroid; - /** The URI where the external payment will be processed */ - linkUri: string; + /** + * A pre-generated external transaction token for a Billing Choice external-link + * flow. Omit it when Google Play should provide the token in the callback. + */ + externalTransactionToken?: (string | null); + /** + * The launch mode for the external payment link. + * Required only when the selected billing program links outside the app. + */ + launchMode?: (DeveloperBillingLaunchModeAndroid | null); + /** + * The URI where the external payment will be processed. + * Required only when the selected billing program links outside the app. + */ + linkUri?: (string | null); } /** * Developer-provided billing destination type for Billing Program reporting details (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export type DeveloperBillingTypeAndroid = 'developer-billing-type-unspecified' | 'in-app' | 'external-link'; @@ -249,10 +268,31 @@ export type DeveloperBillingTypeAndroid = 'developer-billing-type-unspecified' | export interface DeveloperProvidedBillingDetailsAndroid { /** * External transaction token used to report transactions made through developer billing. - * This token must be used when reporting the external transaction to Google Play. - * Must be reported within 24 hours of the transaction. + * Nullable for flows such as external payments where no token is returned. */ - externalTransactionToken: string; + externalTransactionToken?: (string | null); + /** + * URI to launch for an external-link Billing Choice flow, when provided by + * Google Play. + */ + linkUri?: (string | null); + /** + * Original external transaction ID when replacing a subscription that was + * purchased through developer billing. + */ + originalExternalTransactionId?: (string | null); + /** Products selected for the developer billing flow. */ + products: DeveloperProvidedBillingProductAndroid[]; +} + +/** Product selected for developer-provided billing (Android 9.0+). */ +export interface DeveloperProvidedBillingProductAndroid { + /** Product identifier. */ + id: string; + /** Subscription offer token, when applicable. */ + offerToken?: (string | null); + /** Google Play product type (in-app or subscription). */ + type: ProductType; } /** @@ -557,7 +597,7 @@ export type FetchProductsResult = ProductOrSubscription[] | Product[] | ProductS /** * Parameters for fetching Billing Choice display information (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export interface GetBillingChoiceInfoParamsAndroid { /** Billing program. Currently only BILLING_CHOICE is supported. */ @@ -579,13 +619,15 @@ export type IapkitPurchaseState = 'entitled' | 'pending-acknowledgment' | 'pendi /** * High-level in-app message category (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ export type InAppMessageCategoryAndroid = 'unknown-in-app-message-category-id' | 'transactional'; /** * Parameters for showing Play billing in-app messages (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ export interface InAppMessageParamsAndroid { /** In-app message categories to show. Defaults to transactional messages. */ @@ -594,13 +636,15 @@ export interface InAppMessageParamsAndroid { /** * Response code from Play billing in-app messages (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ export type InAppMessageResponseCodeAndroid = 'no-action-needed' | 'subscription-status-updated'; /** * Result from showing Play billing in-app messages (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ export interface InAppMessageResultAndroid { /** Purchase token returned when a subscription status changed. */ @@ -618,6 +662,16 @@ export interface InitConnectionConfig { * Use USER_CHOICE_BILLING for user choice billing, EXTERNAL_OFFER for alternative only. */ alternativeBillingModeAndroid?: (AlternativeBillingModeAndroid | null); + /** + * Billing Choice renderer configured in Play Console. Available in OpenIAP + * Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). + * GOOGLE_RENDERED registers the developer-provided billing listener so OpenIAP + * can emit the selection event. DEVELOPER_RENDERED omits that listener so the + * app can render its own choice screen and use the reporting/dialog/link APIs. + * Must match choiceScreenType returned by isBillingProgramAvailableAndroid. + * Defaults to GOOGLE_RENDERED. + */ + billingChoiceScreenTypeAndroid?: (BillingChoiceScreenTypeAndroid | null); /** * Enable a specific billing program for Android (7.0+) * When set, enables the specified billing program for external transactions. @@ -625,6 +679,8 @@ export interface InitConnectionConfig { * - EXTERNAL_CONTENT_LINK: Link to external content (8.2.0+) * - EXTERNAL_OFFER: External offers for digital content (8.2.0+) * - EXTERNAL_PAYMENTS: Developer provided billing, Japan only (8.3.0+) + * - BILLING_CHOICE: Google-rendered or developer-rendered billing choice + * (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+) */ enableBillingProgramAndroid?: (BillingProgramAndroid | null); } @@ -652,12 +708,19 @@ export interface InstallmentPlanDetailsAndroid { /** * Parameters for launching an external link (Android) - * Used with launchExternalLink to initiate external offer or app install flows + * Used with launchExternalLink to initiate external offer, app install, or + * developer-rendered Billing Choice flows * Available in Google Play Billing Library 8.2.0+ */ export interface LaunchExternalLinkParamsAndroid { - /** The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) */ + /** The billing program (EXTERNAL_CONTENT_LINK, EXTERNAL_OFFER, or BILLING_CHOICE) */ billingProgram: BillingProgramAndroid; + /** + * External transaction token for a developer-rendered Billing Choice external-link + * flow. Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). Generate it with createBillingProgramReportingDetailsAndroid. + */ + externalTransactionToken?: (string | null); /** The external link launch mode */ launchMode: ExternalLinkLaunchModeAndroid; /** The type of the external link */ @@ -720,6 +783,8 @@ export interface Mutation { * Returns external transaction token needed for reporting external transactions. * developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, * native Android defaults it to IN_APP. + * The Billing Choice extension is available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ @@ -754,7 +819,10 @@ export interface Mutation { */ isBillingProgramAvailableAndroid: Promise; /** - * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). + * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+), + * including developer-rendered Billing Choice external-link flows. + * Billing Choice availability: OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). * Replaces the deprecated showExternalOfferInformationDialog API. * Shows Play Store dialog and optionally launches external URL. * Throws OpenIapError.NotPrepared if billing client not ready. @@ -807,8 +875,9 @@ export interface Mutation { */ showAlternativeBillingDialogAndroid: Promise; /** - * Show Google's information dialog for a Billing Choice external transaction. - * Available in Google Play Billing Library 9.1.0+. + * Show Google's mandatory information dialog before a developer-rendered, + * in-app Billing Choice screen. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android */ @@ -822,7 +891,8 @@ export interface Mutation { showExternalPurchaseCustomLinkNoticeIOS: Promise; /** * Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. - * Available in Google Play Billing Library 4.1.0+. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). * Returns a response code and, when the subscription status changes, the related purchase token. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-in-app-messages-android @@ -1309,6 +1379,7 @@ export interface PurchaseAndroid extends PurchaseCommon { signatureAndroid?: (string | null); /** Store where purchase was made */ store: IapStore; + /** Unix timestamp in milliseconds since January 1, 1970 UTC. */ transactionDate: number; transactionId?: (string | null); } @@ -1333,6 +1404,7 @@ export interface PurchaseCommon { quantity: number; /** Store where purchase was made */ store: IapStore; + /** Unix timestamp in milliseconds since January 1, 1970 UTC. */ transactionDate: number; } @@ -1390,6 +1462,7 @@ export interface PurchaseIOS extends PurchaseCommon { store: IapStore; storefrontCountryCodeIOS?: (string | null); subscriptionGroupIdIOS?: (string | null); + /** Unix timestamp in milliseconds since January 1, 1970 UTC. */ transactionDate: number; transactionId: string; transactionReasonIOS?: (string | null); @@ -1473,7 +1546,7 @@ export interface Query { getAvailablePurchases: Promise; /** * Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. - * Available in Google Play Billing Library 9.1.0+. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client is not ready. * See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android */ @@ -1667,9 +1740,9 @@ export interface RentalDetailsAndroid { export interface RequestPurchaseAndroidProps { /** - * Developer billing option parameters for external payments flow (8.3.0+). - * When provided, the purchase flow will show a side-by-side choice between - * Google Play Billing and the developer's external payment option. + * Developer billing option parameters for external payments and Billing Choice. + * Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ developerBillingOption?: (DeveloperBillingOptionParamsAndroid | null); /** @@ -1754,9 +1827,9 @@ export type RequestPurchaseResult = Purchase | Purchase[] | null; export interface RequestSubscriptionAndroidProps { /** - * Developer billing option parameters for external payments flow (8.3.0+). - * When provided, the purchase flow will show a side-by-side choice between - * Google Play Billing and the developer's external payment option. + * Developer billing option parameters for external payments and Billing Choice. + * Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ developerBillingOption?: (DeveloperBillingOptionParamsAndroid | null); /** @@ -1768,6 +1841,12 @@ export interface RequestSubscriptionAndroidProps { obfuscatedAccountId?: (string | null); /** Obfuscated profile ID */ obfuscatedProfileId?: (string | null); + /** + * Original external transaction ID for replacing a subscription that was + * purchased through developer billing. Available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). + */ + originalExternalTransactionId?: (string | null); /** Purchase token for upgrades/downgrades */ purchaseToken?: (string | null); /** @@ -1903,11 +1982,11 @@ export type SubResponseCodeAndroid = 'no-applicable-sub-response-code' | 'paymen export interface Subscription { /** - * Fires when a user selects developer billing in the External Payments flow (Android only) - * Triggered when the user chooses to pay via the developer's external payment option - * instead of Google Play Billing in the side-by-side choice dialog. - * Contains the externalTransactionToken needed to report the transaction. - * Available in Google Play Billing Library 8.3.0+ + * Fires when a user selects developer billing in an External Payments or + * Billing Choice flow (Android only). The payload can contain an external + * transaction token, link URI, original transaction ID, and selected products. + * Billing Choice payload fields are available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ developerProvidedBillingAndroid: DeveloperProvidedBillingDetailsAndroid; /** Fires when the App Store surfaces a promoted product (iOS only) */ diff --git a/libraries/expo-iap/src/useIAP.ts b/libraries/expo-iap/src/useIAP.ts index d72df3df5..8998f8edc 100644 --- a/libraries/expo-iap/src/useIAP.ts +++ b/libraries/expo-iap/src/useIAP.ts @@ -10,6 +10,9 @@ import { purchaseErrorListener, purchaseUpdatedListener, promotedProductListenerIOS, + userChoiceBillingListenerAndroid, + developerProvidedBillingListenerAndroid, + subscriptionBillingIssueListener, getAvailablePurchases, finishTransaction as finishTransactionInternal, requestPurchase as requestPurchaseInternal, @@ -32,6 +35,12 @@ import { checkAlternativeBillingAvailabilityAndroid, showAlternativeBillingDialogAndroid, createAlternativeBillingTokenAndroid, + getBillingChoiceInfoAndroid, + isBillingProgramAvailableAndroid, + createBillingProgramReportingDetailsAndroid, + launchExternalLinkAndroid, + showBillingProgramInformationDialogAndroid, + showInAppMessagesAndroid, } from './modules/android'; // Types @@ -40,6 +49,11 @@ import type { ProductSubscription, ProductQueryType, ProductRequest, + AlternativeBillingModeAndroid, + BillingChoiceScreenTypeAndroid, + BillingProgramAndroid, + DeveloperProvidedBillingDetailsAndroid, + InitConnectionConfig, Purchase, MutationRequestPurchaseArgs, PurchaseInput, @@ -51,6 +65,9 @@ import type { ProductAndroid, ProductSubscriptionIOS, PurchaseOptions, + MutationField, + QueryField, + UserChoiceBillingDetails, } from './types'; import {ErrorCode} from './types'; import type {PurchaseError} from './utils/errorMapping'; @@ -125,6 +142,12 @@ type UseIap = { createAlternativeBillingTokenAndroid: ( sku?: string, ) => Promise; + getBillingChoiceInfoAndroid: QueryField<'getBillingChoiceInfoAndroid'>; + isBillingProgramAvailableAndroid: MutationField<'isBillingProgramAvailableAndroid'>; + createBillingProgramReportingDetailsAndroid: MutationField<'createBillingProgramReportingDetailsAndroid'>; + launchExternalLinkAndroid: MutationField<'launchExternalLinkAndroid'>; + showBillingProgramInformationDialogAndroid: MutationField<'showBillingProgramInformationDialogAndroid'>; + showInAppMessagesAndroid: MutationField<'showInAppMessagesAndroid'>; }; export interface UseIAPOptions { @@ -144,6 +167,16 @@ export interface UseIAPOptions { */ onError?: (error: Error) => void; onPromotedProductIOS?: (product: Product) => void; + onUserChoiceBillingAndroid?: (details: UserChoiceBillingDetails) => void; + /** + * Fires when the user selects developer-provided billing in an External + * Payments or Google-rendered Billing Choice flow. + */ + onDeveloperProvidedBillingAndroid?: ( + details: DeveloperProvidedBillingDetailsAndroid, + ) => void; + /** Fires when an active subscription enters a billing-issue state. */ + onSubscriptionBillingIssue?: (purchase: Purchase) => void; /** * Alternative billing mode for Android * If not specified, defaults to NONE (standard Google Play billing) @@ -151,19 +184,20 @@ export interface UseIAPOptions { * - 'user-choice' → 'user-choice-billing' * - 'alternative-only' → 'external-offer' */ - alternativeBillingModeAndroid?: 'none' | 'user-choice' | 'alternative-only'; + alternativeBillingModeAndroid?: AlternativeBillingModeAndroid; /** * Enable a specific billing program for Android (8.2.0+) * When set, enables the specified billing program for external transactions. * Use 'external-payments' for Developer Provided Billing (Japan only, 8.3.0+). * Use 'user-choice-billing' for User Choice Billing (7.0+). + * Use 'billing-choice' for Billing Choice (9.1.0+). */ - enableBillingProgramAndroid?: - | 'unspecified' - | 'external-content-link' - | 'external-offer' - | 'external-payments' - | 'user-choice-billing'; + enableBillingProgramAndroid?: BillingProgramAndroid; + /** + * Select who renders the Billing Choice screen (9.1.0+). Must match the + * choiceScreenType returned by isBillingProgramAvailableAndroid. + */ + billingChoiceScreenTypeAndroid?: BillingChoiceScreenTypeAndroid; } /** @@ -218,6 +252,9 @@ export function useIAP(options?: UseIAPOptions): UseIap { purchaseUpdate?: EventSubscription; purchaseError?: EventSubscription; promotedProductIOS?: EventSubscription; + userChoiceBillingAndroid?: EventSubscription; + developerProvidedBillingAndroid?: EventSubscription; + subscriptionBillingIssue?: EventSubscription; }>({}); const subscriptionsRefState = useRef([]); @@ -656,16 +693,29 @@ export function useIAP(options?: UseIAPOptions): UseIap { ); // Build config from options (prefer new enableBillingProgramAndroid over deprecated alternativeBillingModeAndroid) - const buildConnectionConfig = useCallback(() => { - return optionsRef.current?.enableBillingProgramAndroid || - optionsRef.current?.alternativeBillingModeAndroid - ? { - enableBillingProgramAndroid: - optionsRef.current.enableBillingProgramAndroid, - alternativeBillingModeAndroid: - optionsRef.current.alternativeBillingModeAndroid, - } - : undefined; + const buildConnectionConfig = useCallback((): + InitConnectionConfig | undefined => { + if (optionsRef.current?.enableBillingProgramAndroid) { + return { + enableBillingProgramAndroid: + optionsRef.current.enableBillingProgramAndroid, + ...(optionsRef.current.billingChoiceScreenTypeAndroid + ? { + billingChoiceScreenTypeAndroid: + optionsRef.current.billingChoiceScreenTypeAndroid, + } + : {}), + }; + } + + if (optionsRef.current?.alternativeBillingModeAndroid) { + return { + alternativeBillingModeAndroid: + optionsRef.current.alternativeBillingModeAndroid, + }; + } + + return undefined; }, []); const initIapWithSubscriptions = useCallback(async (): Promise => { @@ -712,6 +762,31 @@ export function useIAP(options?: UseIAPOptions): UseIap { }, ); + if ( + Platform.OS === 'android' && + optionsRef.current?.onUserChoiceBillingAndroid + ) { + subscriptionsRef.current.userChoiceBillingAndroid = + userChoiceBillingListenerAndroid((details) => { + optionsRef.current?.onUserChoiceBillingAndroid?.(details); + }); + } + + if ( + Platform.OS === 'android' && + optionsRef.current?.onDeveloperProvidedBillingAndroid + ) { + subscriptionsRef.current.developerProvidedBillingAndroid = + developerProvidedBillingListenerAndroid((details) => { + optionsRef.current?.onDeveloperProvidedBillingAndroid?.(details); + }); + } + + subscriptionsRef.current.subscriptionBillingIssue = + subscriptionBillingIssueListener((purchase) => { + optionsRef.current?.onSubscriptionBillingIssue?.(purchase); + }); + if (Platform.OS === 'ios') { // iOS promoted products listener subscriptionsRef.current.promotedProductIOS = promotedProductListenerIOS( @@ -823,6 +898,9 @@ export function useIAP(options?: UseIAPOptions): UseIap { currentSubscriptions.purchaseUpdate?.remove(); currentSubscriptions.purchaseError?.remove(); currentSubscriptions.promotedProductIOS?.remove(); + currentSubscriptions.userChoiceBillingAndroid?.remove(); + currentSubscriptions.developerProvidedBillingAndroid?.remove(); + currentSubscriptions.subscriptionBillingIssue?.remove(); endConnection(); setConnected(false); }; @@ -854,5 +932,11 @@ export function useIAP(options?: UseIAPOptions): UseIap { checkAlternativeBillingAvailabilityAndroid, showAlternativeBillingDialogAndroid, createAlternativeBillingTokenAndroid, + getBillingChoiceInfoAndroid, + isBillingProgramAvailableAndroid, + createBillingProgramReportingDetailsAndroid, + launchExternalLinkAndroid, + showBillingProgramInformationDialogAndroid, + showInAppMessagesAndroid, }; } diff --git a/libraries/expo-iap/src/vega-adapter.ts b/libraries/expo-iap/src/vega-adapter.ts index 60207f6e6..29f9d9bd3 100644 --- a/libraries/expo-iap/src/vega-adapter.ts +++ b/libraries/expo-iap/src/vega-adapter.ts @@ -21,6 +21,7 @@ const IAPKIT_VERIFY_TIMEOUT_MS = 10_000; const MAX_IAPKIT_ERROR_DEPTH = 5; const MAX_PRODUCT_DATA_BATCH_SIZE = 100; const MAX_PURCHASE_UPDATE_PAGES = 100; +const NOTIFY_FULFILLMENT_ATTEMPT_TIMEOUT_MS = 2_000; const NOTIFY_FULFILLMENT_MAX_ATTEMPTS = 15; const NOTIFY_FULFILLMENT_RETRY_DELAY_MS = 1_000; const PURCHASE_UPDATES_MAX_ATTEMPTS = 5; @@ -216,6 +217,26 @@ function delay(ms: number): Promise { }); } +function withTimeout( + operation: Promise, + timeoutMs: number, + timeoutError: Error, +): Promise { + return new Promise((resolve, reject) => { + const timeoutId = setTimeout(() => reject(timeoutError), timeoutMs); + operation.then( + (value) => { + clearTimeout(timeoutId); + resolve(value); + }, + (error) => { + clearTimeout(timeoutId); + reject(error); + }, + ); + }); +} + function isSuccess( operation: ResponseOperation, responseCode: unknown, @@ -803,12 +824,18 @@ export function createExpoIapVegaModule( attempt <= NOTIFY_FULFILLMENT_MAX_ATTEMPTS; attempt += 1 ) { - const response = await service.notifyFulfillment({ - fulfillmentResult: FULFILLMENT_RESULT_FULFILLED, - receiptId: purchaseToken, - }); + const response = await withTimeout( + service.notifyFulfillment({ + fulfillmentResult: FULFILLMENT_RESULT_FULFILLED, + receiptId: purchaseToken, + }), + NOTIFY_FULFILLMENT_ATTEMPT_TIMEOUT_MS, + createVegaError( + ErrorCode.ServiceTimeout, + 'Amazon Vega notifyFulfillment timed out.', + ), + ); if (isSuccess('notify-fulfillment', response?.responseCode)) return; - lastResponse = response; if (attempt < NOTIFY_FULFILLMENT_MAX_ATTEMPTS) { await delay(NOTIFY_FULFILLMENT_RETRY_DELAY_MS); @@ -838,7 +865,8 @@ export function createExpoIapVegaModule( const purchaseTimestamp = toTimestamp(receipt.purchaseDate); if ( options?.minPurchaseDateMs != null && - (purchaseTimestamp === 0 || purchaseTimestamp < options.minPurchaseDateMs) + (purchaseTimestamp === 0 || + purchaseTimestamp < options.minPurchaseDateMs) ) { continue; } @@ -919,7 +947,7 @@ export function createExpoIapVegaModule( try { const parsed = JSON.parse(value); return parsed && typeof parsed === 'object' - ? (extractIapkitErrorMessage(parsed, depth + 1) ?? value) + ? extractIapkitErrorMessage(parsed, depth + 1) ?? value : value; } catch { return value; @@ -1266,11 +1294,11 @@ export function createExpoIapVegaModule( renewalInfoIOS: null, autoRenewingAndroid: purchase.platform === 'android' - ? (( + ? ( purchase as Purchase & { autoRenewingAndroid?: boolean | null; } - ).autoRenewingAndroid ?? null) + ).autoRenewingAndroid ?? null : null, basePlanIdAndroid: purchase.productId, currentPlanId: purchase.productId, @@ -1280,8 +1308,9 @@ export function createExpoIapVegaModule( async hasActiveSubscriptions( subscriptionIds?: string[] | null, ): Promise { - const subscriptions = - await vegaModule.getActiveSubscriptions(subscriptionIds); + const subscriptions = await vegaModule.getActiveSubscriptions( + subscriptionIds, + ); return subscriptions.length > 0; }, async acknowledgePurchaseAndroid(purchaseToken): Promise { diff --git a/libraries/flutter_inapp_purchase/README.md b/libraries/flutter_inapp_purchase/README.md index 24ea68893..bd6aee7ab 100644 --- a/libraries/flutter_inapp_purchase/README.md +++ b/libraries/flutter_inapp_purchase/README.md @@ -109,7 +109,7 @@ flutter_inapp_purchase conforms to the **[OpenIAP specification](https://openiap - **Shared specification** — Common types, error codes, and purchase flows across all platforms - **Generated type-safe bindings** — Swift, Kotlin, Dart, and GDScript from a single GraphQL schema -- **Platform implementations** — [openiap-apple](https://github.com/hyodotdev/openiap/tree/main/packages/apple) (StoreKit 2) and [openiap-google](https://github.com/hyodotdev/openiap/tree/main/packages/google) (Play Billing 8.x) +- **Platform implementations** — [openiap-apple](https://github.com/hyodotdev/openiap/tree/main/packages/apple) (StoreKit 2) and [openiap-google](https://github.com/hyodotdev/openiap/tree/main/packages/google) (Play Billing 9.1.0) - **Verification profiles** — Standardized receipt validation and purchase verification patterns Other libraries built on OpenIAP: [react-native-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/react-native-iap) · [expo-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/expo-iap) · [kmp-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/kmp-iap) · [godot-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/godot-iap) diff --git a/libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt b/libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt index bd9015fa6..e94755437 100644 --- a/libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt +++ b/libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt @@ -12,7 +12,6 @@ import dev.hyo.openiap.BillingChoiceImageLayoutAndroid import dev.hyo.openiap.BillingProgramInformationDialogParamsAndroid import dev.hyo.openiap.BillingProgramAndroid import dev.hyo.openiap.DeepLinkOptions -import dev.hyo.openiap.DeveloperBillingLaunchModeAndroid import dev.hyo.openiap.DeveloperBillingOptionParamsAndroid import dev.hyo.openiap.DeveloperBillingTypeAndroid import dev.hyo.openiap.ExternalLinkLaunchModeAndroid @@ -147,6 +146,7 @@ class AndroidInappPurchasePlugin internal constructor() : MethodCallHandler, Act isOfferPersonalized: Boolean, subscriptionOffers: List, purchaseToken: String?, + originalExternalTransactionId: String? = null, replacementMode: Int?, offerToken: String? = null, developerBillingOption: DeveloperBillingOptionParamsAndroid? = null, @@ -167,6 +167,9 @@ class AndroidInappPurchasePlugin internal constructor() : MethodCallHandler, Act return when (type) { ProductQueryType.Subs -> { purchaseToken?.let { androidPayload[KEY_PURCHASE_TOKEN] = it } + originalExternalTransactionId?.let { + androidPayload[KEY_ORIGINAL_EXTERNAL_TRANSACTION_ID] = it + } replacementMode?.let { androidPayload[KEY_REPLACEMENT_MODE] = it } subscriptionProductReplacementParams?.let { androidPayload[KEY_SUBSCRIPTION_PRODUCT_REPLACEMENT_PARAMS] = it.toJson() @@ -310,7 +313,7 @@ class AndroidInappPurchasePlugin internal constructor() : MethodCallHandler, Act // Initialization / teardown when (call.method) { "initConnection" -> { - // Parse alternativeBillingModeAndroid and enableBillingProgramAndroid from arguments + // Parse Android billing configuration from arguments. val params = call.arguments as? Map<*, *> val configMap = mutableMapOf() params?.get("alternativeBillingModeAndroid")?.let { @@ -319,6 +322,9 @@ class AndroidInappPurchasePlugin internal constructor() : MethodCallHandler, Act params?.get("enableBillingProgramAndroid")?.let { configMap["enableBillingProgramAndroid"] = it } + params?.get("billingChoiceScreenTypeAndroid")?.let { + configMap["billingChoiceScreenTypeAndroid"] = it + } val newConfig = if (configMap.isEmpty()) { InitConnectionConfig() } else { @@ -496,35 +502,29 @@ class AndroidInappPurchasePlugin internal constructor() : MethodCallHandler, Act val isOfferPersonalized = params["isOfferPersonalized"] as? Boolean ?: false val purchaseTokenAndroid = (params["purchaseToken"] ?: params["purchaseTokenAndroid"]) as? String + val originalExternalTransactionId = + params[KEY_ORIGINAL_EXTERNAL_TRANSACTION_ID] as? String val replacementModeAndroid = ((params["replacementMode"] ?: params["replacementModeAndroid"]) as? Number)?.toInt() // offerToken for one-time purchase discounts (Android 7.0+) val offerToken = params["offerToken"] as? String val useAlternativeBilling = params["useAlternativeBilling"] as? Boolean - // Parse developerBillingOption for External Payments (8.3.0+) + // Parse developerBillingOption for External Payments (8.3.0+) or Billing Choice (9.1.0+) val developerBillingOptionMap = params[KEY_DEVELOPER_BILLING_OPTION] as? Map<*, *> val developerBillingOption = developerBillingOptionMap?.let { optionMap -> try { - val billingProgram = BillingProgramAndroid.fromJson( - optionMap["billingProgram"] as? String ?: "unspecified" - ) - val launchMode = DeveloperBillingLaunchModeAndroid.fromJson( - optionMap["launchMode"] as? String ?: "unspecified" - ) - val linkUri = optionMap["linkUri"] as? String - if (!linkUri.isNullOrBlank()) { - DeveloperBillingOptionParamsAndroid( - billingProgram = billingProgram, - launchMode = launchMode, - linkUri = linkUri - ) - } else { - null - } + val json = optionMap.entries.mapNotNull { (key, value) -> + (key as? String)?.let { it to value } + }.toMap() + DeveloperBillingOptionParamsAndroid.fromJson(json) } catch (e: Exception) { - OpenIapLog.w(TAG, "Failed to parse developerBillingOption: ${e.message}") - null + safe.error( + OpenIapError.DeveloperError.CODE, + OpenIapError.DeveloperError.MESSAGE, + "Invalid developerBillingOption: ${e.message}" + ) + return } } @@ -541,11 +541,17 @@ class AndroidInappPurchasePlugin internal constructor() : MethodCallHandler, Act replacementMode = replacementMode ) } else { - null + throw IllegalArgumentException( + "oldProductId and replacementMode are required" + ) } } catch (e: Exception) { - OpenIapLog.w(TAG, "Failed to parse subscriptionProductReplacementParams: ${e.message}") - null + safe.error( + OpenIapError.DeveloperError.CODE, + OpenIapError.DeveloperError.MESSAGE, + "Invalid subscriptionProductReplacementParams: ${e.message}" + ) + return } } @@ -604,6 +610,7 @@ class AndroidInappPurchasePlugin internal constructor() : MethodCallHandler, Act isOfferPersonalized = isOfferPersonalized, subscriptionOffers = offers, purchaseToken = purchaseTokenAndroid, + originalExternalTransactionId = originalExternalTransactionId, replacementMode = replacementModeAndroid, offerToken = offerToken, developerBillingOption = developerBillingOption, @@ -613,6 +620,8 @@ class AndroidInappPurchasePlugin internal constructor() : MethodCallHandler, Act iap.requestPurchase(requestProps) // Success signaled by purchase-updated event safe.success(null) + } catch (e: OpenIapError) { + safe.error(e.code, e.message, e.debugMessage) } catch (e: Exception) { safe.error(OpenIapError.PurchaseFailed.CODE, OpenIapError.PurchaseFailed.MESSAGE, e.message) } @@ -921,6 +930,8 @@ class AndroidInappPurchasePlugin internal constructor() : MethodCallHandler, Act val launchModeStr = call.argument("launchMode") val linkTypeStr = call.argument("linkType") val linkUri: String? = call.argument("linkUri")?.takeIf { it.isNotBlank() } + val externalTransactionToken: String? = + call.argument("externalTransactionToken")?.takeIf { it.isNotBlank() } scope.launch { try { @@ -940,6 +951,7 @@ class AndroidInappPurchasePlugin internal constructor() : MethodCallHandler, Act } val launchParams = LaunchExternalLinkParamsAndroid( billingProgram = BillingProgramAndroid.fromJson(programStr ?: "unspecified"), + externalTransactionToken = externalTransactionToken, launchMode = ExternalLinkLaunchModeAndroid.fromJson(launchModeStr ?: "unspecified"), linkType = ExternalLinkTypeAndroid.fromJson(linkTypeStr ?: "unspecified"), linkUri = linkUri @@ -1087,6 +1099,8 @@ class AndroidInappPurchasePlugin internal constructor() : MethodCallHandler, Act iap.requestPurchase(requestProps) safe.success(null) + } catch (e: OpenIapError) { + safe.error(e.code, e.message, e.debugMessage) } catch (e: Exception) { safe.error(OpenIapError.PurchaseFailed.CODE, OpenIapError.PurchaseFailed.MESSAGE, e.message) } @@ -1462,6 +1476,7 @@ class AndroidInappPurchasePlugin internal constructor() : MethodCallHandler, Act private const val KEY_OBFUSCATED_ACCOUNT = "obfuscatedAccountId" private const val KEY_OBFUSCATED_PROFILE = "obfuscatedProfileId" private const val KEY_PURCHASE_TOKEN = "purchaseToken" + private const val KEY_ORIGINAL_EXTERNAL_TRANSACTION_ID = "originalExternalTransactionId" private const val KEY_REPLACEMENT_MODE = "replacementMode" private const val KEY_OFFER_TOKEN = "offerToken" private const val KEY_SUBSCRIPTION_OFFERS = "subscriptionOffers" diff --git a/libraries/flutter_inapp_purchase/example/android/app/src/main/AndroidManifest.xml b/libraries/flutter_inapp_purchase/example/android/app/src/main/AndroidManifest.xml index b1f423cd2..6f8a1988f 100644 --- a/libraries/flutter_inapp_purchase/example/android/app/src/main/AndroidManifest.xml +++ b/libraries/flutter_inapp_purchase/example/android/app/src/main/AndroidManifest.xml @@ -54,7 +54,7 @@ diff --git a/libraries/flutter_inapp_purchase/lib/builders.dart b/libraries/flutter_inapp_purchase/lib/builders.dart index af30414a2..a29cb481a 100644 --- a/libraries/flutter_inapp_purchase/lib/builders.dart +++ b/libraries/flutter_inapp_purchase/lib/builders.dart @@ -109,8 +109,11 @@ class RequestSubscriptionAndroidBuilder { String? obfuscatedAccountId; String? obfuscatedProfileId; String? purchaseToken; + String? originalExternalTransactionId; int? replacementMode; bool? isOfferPersonalized; + SubscriptionProductReplacementParamsAndroid? + subscriptionProductReplacementParams; DeveloperBillingOptionParamsAndroid? developerBillingOption; RequestSubscriptionAndroidBuilder(); @@ -123,8 +126,11 @@ class RequestSubscriptionAndroidBuilder { obfuscatedAccountId: obfuscatedAccountId, obfuscatedProfileId: obfuscatedProfileId, purchaseToken: purchaseToken, + originalExternalTransactionId: originalExternalTransactionId, replacementMode: replacementMode, isOfferPersonalized: isOfferPersonalized, + subscriptionProductReplacementParams: + subscriptionProductReplacementParams, developerBillingOption: developerBillingOption, ); } diff --git a/libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart b/libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart index c8dac504c..1dfb332f2 100644 --- a/libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart +++ b/libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart @@ -291,8 +291,8 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { Stream get userChoiceBillingAndroid => _userChoiceBillingAndroidListener.stream; - /// Developer provided billing Android event stream (8.3.0+) - /// Fires when user selects developer-provided billing option in external payments flow. + /// Developer provided billing Android event stream (8.3.0+). + /// Fires for External Payments and Google-rendered Billing Choice selections. Stream get developerProvidedBillingAndroid => _developerProvidedBillingAndroidListener.stream; @@ -465,6 +465,7 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { /// See: https://openiap.dev/docs/apis/init-connection gentype.MutationInitConnectionHandler get initConnection => ({ gentype.AlternativeBillingModeAndroid? alternativeBillingModeAndroid, + gentype.BillingChoiceScreenTypeAndroid? billingChoiceScreenTypeAndroid, gentype.BillingProgramAndroid? enableBillingProgramAndroid, }) async { if (_isInitialized) { @@ -477,6 +478,7 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { // Build config map for alternative billing and billing program Map? config; if (alternativeBillingModeAndroid != null || + billingChoiceScreenTypeAndroid != null || enableBillingProgramAndroid != null) { config = {}; if (alternativeBillingModeAndroid != null) { @@ -487,6 +489,10 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { config['enableBillingProgramAndroid'] = enableBillingProgramAndroid.toJson(); } + if (billingChoiceScreenTypeAndroid != null) { + config['billingChoiceScreenTypeAndroid'] = + billingChoiceScreenTypeAndroid.toJson(); + } } await _channel.invokeMethod('initConnection', config); @@ -657,6 +663,7 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { final String? obfuscatedAccount; final String? obfuscatedProfile; final String? purchaseToken; + final String? originalExternalTransactionId; final int? replacementMode; final String? offerToken; final List? @@ -672,6 +679,7 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { obfuscatedAccount = androidProps.obfuscatedAccountId; obfuscatedProfile = androidProps.obfuscatedProfileId; purchaseToken = null; + originalExternalTransactionId = null; replacementMode = null; offerToken = androidProps.offerToken; subscriptionOffers = null; @@ -684,6 +692,8 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { obfuscatedAccount = androidProps.obfuscatedAccountId; obfuscatedProfile = androidProps.obfuscatedProfileId; purchaseToken = androidProps.purchaseToken; + originalExternalTransactionId = + androidProps.originalExternalTransactionId; replacementMode = androidProps.replacementMode; offerToken = null; // Subscriptions don't use offerToken subscriptionOffers = androidProps.subscriptionOffers; @@ -724,6 +734,11 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { payload['purchaseToken'] = purchaseToken; } + if (originalExternalTransactionId != null) { + payload['originalExternalTransactionId'] = + originalExternalTransactionId; + } + if (replacementMode != null) { payload['replacementMode'] = replacementMode; } @@ -744,7 +759,7 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { json['useAlternativeBilling'] as bool?; payload['useAlternativeBilling'] = useAlternativeBilling; - // Add developerBillingOption for External Payments (8.3.0+) + // Add developerBillingOption for External Payments (8.3.0+) or Billing Choice (9.1.0+) if (developerBillingOption != null) { payload['developerBillingOption'] = developerBillingOption.toJson(); @@ -2608,7 +2623,8 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { } } - /// Show Google's information dialog for a Billing Choice external transaction (Play Billing 9.1.0+). + /// Show Google's mandatory information dialog before a developer-rendered, + /// in-app Billing Choice screen (Play Billing 9.1.0+). /// /// See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android Future @@ -2687,6 +2703,7 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { final result = await _channel.invokeMethod('launchExternalLinkAndroid', { 'billingProgram': params.billingProgram.toJson(), + 'externalTransactionToken': params.externalTransactionToken, 'launchMode': params.launchMode.toJson(), 'linkType': params.linkType.toJson(), 'linkUri': params.linkUri, @@ -2933,10 +2950,12 @@ class FlutterInappPurchase with RequestPurchaseBuilderApi { required gentype.ExternalLinkLaunchModeAndroid launchMode, required gentype.ExternalLinkTypeAndroid linkType, required String linkUri, + String? externalTransactionToken, }) => launchExternalLinkAndroid( gentype.LaunchExternalLinkParamsAndroid( billingProgram: billingProgram, + externalTransactionToken: externalTransactionToken, launchMode: launchMode, linkType: linkType, linkUri: linkUri, diff --git a/libraries/flutter_inapp_purchase/lib/types.dart b/libraries/flutter_inapp_purchase/lib/types.dart index 6d9814f67..4dce97a37 100644 --- a/libraries/flutter_inapp_purchase/lib/types.dart +++ b/libraries/flutter_inapp_purchase/lib/types.dart @@ -45,7 +45,7 @@ enum AlternativeBillingModeAndroid { } /// Play Billing choice image layout (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). enum BillingChoiceImageLayoutAndroid { /// Rectangular image with a 4:1 aspect ratio. RectangularFourByOne('rectangular-four-by-one'), @@ -74,7 +74,7 @@ enum BillingChoiceImageLayoutAndroid { } /// Choice screen renderer for Billing Choice availability (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). enum BillingChoiceScreenTypeAndroid { /// Unspecified choice screen type. Unspecified('unspecified'), @@ -104,7 +104,8 @@ enum BillingChoiceScreenTypeAndroid { /// Billing program types for Google Play Billing Programs (Android) /// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, -/// BILLING_CHOICE added in 9.1.0. +/// BILLING_CHOICE added in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (requires Play Billing 9.1.0+). enum BillingProgramAndroid { /// Unspecified billing program. Do not use. Unspecified('unspecified'), @@ -127,7 +128,7 @@ enum BillingProgramAndroid { ExternalPayments('external-payments'), /// Billing Choice program. /// Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. - /// Available in Google Play Billing Library 9.1.0+ + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). BillingChoice('billing-choice'); const BillingProgramAndroid(this.value); @@ -188,7 +189,7 @@ enum DeveloperBillingLaunchModeAndroid { } /// Developer-provided billing destination type for Billing Program reporting details (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). enum DeveloperBillingTypeAndroid { /// Unspecified developer billing type. Do not use. DeveloperBillingTypeUnspecified('developer-billing-type-unspecified'), @@ -517,8 +518,9 @@ enum IapEvent { PurchaseError('purchase-error'), PromotedProductIOS('promoted-product-ios'), UserChoiceBillingAndroid('user-choice-billing-android'), - /// Fired when user selects developer-provided billing option in external payments flow. - /// Available on Android with Google Play Billing Library 8.3.0+ + /// Fired for External Payments (8.3.0+) and Google-rendered Billing Choice + /// developer billing selections on Android. Billing Choice is available in + /// OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). DeveloperProvidedBillingAndroid('developer-provided-billing-android'), /// Fired when an active subscription enters a billing-issue state that requires user attention. /// Cross-platform unification of StoreKit 2 Message.billingIssue (iOS 18+) and @@ -655,7 +657,8 @@ enum IapStore { } /// High-level in-app message category (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). enum InAppMessageCategoryAndroid { /// Unknown in-app message category. UnknownInAppMessageCategoryId('unknown-in-app-message-category-id'), @@ -680,7 +683,8 @@ enum InAppMessageCategoryAndroid { } /// Response code from Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). enum InAppMessageResponseCodeAndroid { /// Flow finished and no developer action is needed. NoActionNeeded('no-action-needed'), @@ -1373,6 +1377,7 @@ abstract class PurchaseCommon { int get quantity; /// Store where purchase was made IapStore get store; + /// Unix timestamp in milliseconds since January 1, 1970 UTC. double get transactionDate; } @@ -1414,6 +1419,7 @@ class ActiveSubscription { /// Renewal information from StoreKit 2 (iOS only). Contains details about subscription renewal status, /// pending upgrades/downgrades, and auto-renewal preferences. final RenewalInfoIOS? renewalInfoIOS; + /// Unix timestamp in milliseconds since January 1, 1970 UTC. final double transactionDate; final String transactionId; /// @deprecated iOS only - use daysUntilExpirationIOS instead. @@ -1672,7 +1678,7 @@ class AppTransaction { } /// Display information for developer-rendered Billing Choice screens (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). class BillingChoiceInfoAndroid { const BillingChoiceInfoAndroid({ required this.playBillingChoiceImageUrl, @@ -1713,11 +1719,13 @@ class BillingProgramAvailabilityResultAndroid { /// The billing program that was checked final BillingProgramAndroid billingProgram; /// Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. final BillingChoiceScreenTypeAndroid? choiceScreenType; /// Whether the billing program is available for the user final bool isAvailable; /// Whether external-link payment is available for Billing Choice. /// Populated only for available BILLING_CHOICE results. + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. final bool? isExternalLinkAvailable; factory BillingProgramAvailabilityResultAndroid.fromJson(Map json) { @@ -1811,17 +1819,30 @@ class BillingResultAndroid { /// Available in Google Play Billing Library 8.3.0+ class DeveloperProvidedBillingDetailsAndroid { const DeveloperProvidedBillingDetailsAndroid({ - required this.externalTransactionToken, + this.externalTransactionToken, + this.linkUri, + this.originalExternalTransactionId, + required this.products, }); /// External transaction token used to report transactions made through developer billing. - /// This token must be used when reporting the external transaction to Google Play. - /// Must be reported within 24 hours of the transaction. - final String externalTransactionToken; + /// Nullable for flows such as external payments where no token is returned. + final String? externalTransactionToken; + /// URI to launch for an external-link Billing Choice flow, when provided by + /// Google Play. + final String? linkUri; + /// Original external transaction ID when replacing a subscription that was + /// purchased through developer billing. + final String? originalExternalTransactionId; + /// Products selected for the developer billing flow. + final List products; factory DeveloperProvidedBillingDetailsAndroid.fromJson(Map json) { return DeveloperProvidedBillingDetailsAndroid( - externalTransactionToken: json['externalTransactionToken'] as String, + externalTransactionToken: json['externalTransactionToken'] as String?, + linkUri: json['linkUri'] as String?, + originalExternalTransactionId: json['originalExternalTransactionId'] as String?, + products: (json['products'] as List).map((e) => DeveloperProvidedBillingProductAndroid.fromJson(e as Map)).toList(), ); } @@ -1829,6 +1850,42 @@ class DeveloperProvidedBillingDetailsAndroid { return { '__typename': 'DeveloperProvidedBillingDetailsAndroid', 'externalTransactionToken': externalTransactionToken, + 'linkUri': linkUri, + 'originalExternalTransactionId': originalExternalTransactionId, + 'products': products.map((e) => e.toJson()).toList(), + }; + } +} + +/// Product selected for developer-provided billing (Android 9.0+). +class DeveloperProvidedBillingProductAndroid { + const DeveloperProvidedBillingProductAndroid({ + required this.id, + this.offerToken, + required this.type, + }); + + /// Product identifier. + final String id; + /// Subscription offer token, when applicable. + final String? offerToken; + /// Google Play product type (in-app or subscription). + final ProductType type; + + factory DeveloperProvidedBillingProductAndroid.fromJson(Map json) { + return DeveloperProvidedBillingProductAndroid( + id: json['id'] as String, + offerToken: json['offerToken'] as String?, + type: ProductType.fromJson(json['type'] as String), + ); + } + + Map toJson() { + return { + '__typename': 'DeveloperProvidedBillingProductAndroid', + 'id': id, + 'offerToken': offerToken, + 'type': type.toJson(), }; } } @@ -2326,7 +2383,8 @@ class FetchProductsResultSubscriptions extends FetchProductsResult { } /// Result from showing Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). class InAppMessageResultAndroid { const InAppMessageResultAndroid({ this.purchaseToken, @@ -3154,6 +3212,7 @@ class PurchaseAndroid extends Purchase implements PurchaseCommon { final String? signatureAndroid; /// Store where purchase was made final IapStore store; + /// Unix timestamp in milliseconds since January 1, 1970 UTC. final double transactionDate; final String? transactionId; final bool? isAlternativeBilling; @@ -3347,6 +3406,7 @@ class PurchaseIOS extends Purchase implements PurchaseCommon { final IapStore store; final String? storefrontCountryCodeIOS; final String? subscriptionGroupIdIOS; + /// Unix timestamp in milliseconds since January 1, 1970 UTC. final double transactionDate; final String transactionId; final String? transactionReasonIOS; @@ -4506,7 +4566,7 @@ class AndroidSubscriptionOfferInput { } /// Parameters for showing a billing program information dialog (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). class BillingProgramInformationDialogParamsAndroid { const BillingProgramInformationDialogParamsAndroid({ this.billingProgram = BillingProgramAndroid.BillingChoice, @@ -4559,35 +4619,45 @@ class DeepLinkOptions { } } -/// Parameters for developer billing option in purchase flow (Android) -/// Used with BillingFlowParams to enable external payments flow -/// Available in Google Play Billing Library 8.3.0+ +/// Parameters for a developer billing option in a purchase flow (Android). +/// Used with BillingFlowParams for external payments (8.3.0+) and Billing Choice +/// (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+). +/// Only billingProgram is required; link fields are used when the selected program +/// links outside the app. class DeveloperBillingOptionParamsAndroid { const DeveloperBillingOptionParamsAndroid({ required this.billingProgram, - required this.launchMode, - required this.linkUri, + this.externalTransactionToken, + this.launchMode, + this.linkUri, }); - /// The billing program (should be EXTERNAL_PAYMENTS for external payments flow) + /// The billing program. Use EXTERNAL_PAYMENTS or BILLING_CHOICE. final BillingProgramAndroid billingProgram; - /// The launch mode for the external payment link - final DeveloperBillingLaunchModeAndroid launchMode; - /// The URI where the external payment will be processed - final String linkUri; + /// A pre-generated external transaction token for a Billing Choice external-link + /// flow. Omit it when Google Play should provide the token in the callback. + final String? externalTransactionToken; + /// The launch mode for the external payment link. + /// Required only when the selected billing program links outside the app. + final DeveloperBillingLaunchModeAndroid? launchMode; + /// The URI where the external payment will be processed. + /// Required only when the selected billing program links outside the app. + final String? linkUri; factory DeveloperBillingOptionParamsAndroid.fromJson(Map json) { return DeveloperBillingOptionParamsAndroid( billingProgram: BillingProgramAndroid.fromJson(json['billingProgram'] as String), - launchMode: DeveloperBillingLaunchModeAndroid.fromJson(json['launchMode'] as String), - linkUri: json['linkUri'] as String, + externalTransactionToken: json['externalTransactionToken'] as String?, + launchMode: json['launchMode'] != null ? DeveloperBillingLaunchModeAndroid.fromJson(json['launchMode'] as String) : null, + linkUri: json['linkUri'] as String?, ); } Map toJson() { return { 'billingProgram': billingProgram.toJson(), - 'launchMode': launchMode.toJson(), + 'externalTransactionToken': externalTransactionToken, + 'launchMode': launchMode?.toJson(), 'linkUri': linkUri, }; } @@ -4635,7 +4705,7 @@ class DiscountOfferInputIOS { } /// Parameters for fetching Billing Choice display information (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). class GetBillingChoiceInfoParamsAndroid { const GetBillingChoiceInfoParamsAndroid({ this.billingProgram = BillingProgramAndroid.BillingChoice, @@ -4668,7 +4738,8 @@ class GetBillingChoiceInfoParamsAndroid { } /// Parameters for showing Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). class InAppMessageParamsAndroid { const InAppMessageParamsAndroid({ this.categories = const [InAppMessageCategoryAndroid.Transactional], @@ -4694,6 +4765,7 @@ class InAppMessageParamsAndroid { class InitConnectionConfig { const InitConnectionConfig({ this.alternativeBillingModeAndroid, + this.billingChoiceScreenTypeAndroid = BillingChoiceScreenTypeAndroid.GoogleRendered, this.enableBillingProgramAndroid, }); @@ -4702,17 +4774,28 @@ class InitConnectionConfig { /// @deprecated Use enableBillingProgramAndroid instead. /// Use USER_CHOICE_BILLING for user choice billing, EXTERNAL_OFFER for alternative only. final AlternativeBillingModeAndroid? alternativeBillingModeAndroid; + /// Billing Choice renderer configured in Play Console. Available in OpenIAP + /// Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). + /// GOOGLE_RENDERED registers the developer-provided billing listener so OpenIAP + /// can emit the selection event. DEVELOPER_RENDERED omits that listener so the + /// app can render its own choice screen and use the reporting/dialog/link APIs. + /// Must match choiceScreenType returned by isBillingProgramAvailableAndroid. + /// Defaults to GOOGLE_RENDERED. + final BillingChoiceScreenTypeAndroid? billingChoiceScreenTypeAndroid; /// Enable a specific billing program for Android (7.0+) /// When set, enables the specified billing program for external transactions. /// - USER_CHOICE_BILLING: User can select between Google Play or alternative (7.0+) /// - EXTERNAL_CONTENT_LINK: Link to external content (8.2.0+) /// - EXTERNAL_OFFER: External offers for digital content (8.2.0+) /// - EXTERNAL_PAYMENTS: Developer provided billing, Japan only (8.3.0+) + /// - BILLING_CHOICE: Google-rendered or developer-rendered billing choice + /// (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+) final BillingProgramAndroid? enableBillingProgramAndroid; factory InitConnectionConfig.fromJson(Map json) { return InitConnectionConfig( alternativeBillingModeAndroid: json['alternativeBillingModeAndroid'] != null ? AlternativeBillingModeAndroid.fromJson(json['alternativeBillingModeAndroid'] as String) : null, + billingChoiceScreenTypeAndroid: json['billingChoiceScreenTypeAndroid'] != null ? BillingChoiceScreenTypeAndroid.fromJson(json['billingChoiceScreenTypeAndroid'] as String) : BillingChoiceScreenTypeAndroid.GoogleRendered, enableBillingProgramAndroid: json['enableBillingProgramAndroid'] != null ? BillingProgramAndroid.fromJson(json['enableBillingProgramAndroid'] as String) : null, ); } @@ -4720,24 +4803,31 @@ class InitConnectionConfig { Map toJson() { return { 'alternativeBillingModeAndroid': alternativeBillingModeAndroid?.toJson(), + 'billingChoiceScreenTypeAndroid': billingChoiceScreenTypeAndroid?.toJson(), 'enableBillingProgramAndroid': enableBillingProgramAndroid?.toJson(), }; } } /// Parameters for launching an external link (Android) -/// Used with launchExternalLink to initiate external offer or app install flows +/// Used with launchExternalLink to initiate external offer, app install, or +/// developer-rendered Billing Choice flows /// Available in Google Play Billing Library 8.2.0+ class LaunchExternalLinkParamsAndroid { const LaunchExternalLinkParamsAndroid({ required this.billingProgram, + this.externalTransactionToken, required this.launchMode, required this.linkType, required this.linkUri, }); - /// The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) + /// The billing program (EXTERNAL_CONTENT_LINK, EXTERNAL_OFFER, or BILLING_CHOICE) final BillingProgramAndroid billingProgram; + /// External transaction token for a developer-rendered Billing Choice external-link + /// flow. Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). Generate it with createBillingProgramReportingDetailsAndroid. + final String? externalTransactionToken; /// The external link launch mode final ExternalLinkLaunchModeAndroid launchMode; /// The type of the external link @@ -4748,6 +4838,7 @@ class LaunchExternalLinkParamsAndroid { factory LaunchExternalLinkParamsAndroid.fromJson(Map json) { return LaunchExternalLinkParamsAndroid( billingProgram: BillingProgramAndroid.fromJson(json['billingProgram'] as String), + externalTransactionToken: json['externalTransactionToken'] as String?, launchMode: ExternalLinkLaunchModeAndroid.fromJson(json['launchMode'] as String), linkType: ExternalLinkTypeAndroid.fromJson(json['linkType'] as String), linkUri: json['linkUri'] as String, @@ -4757,6 +4848,7 @@ class LaunchExternalLinkParamsAndroid { Map toJson() { return { 'billingProgram': billingProgram.toJson(), + 'externalTransactionToken': externalTransactionToken, 'launchMode': launchMode.toJson(), 'linkType': linkType.toJson(), 'linkUri': linkUri, @@ -4889,9 +4981,9 @@ class RequestPurchaseAndroidProps { required this.skus, }); - /// Developer billing option parameters for external payments flow (8.3.0+). - /// When provided, the purchase flow will show a side-by-side choice between - /// Google Play Billing and the developer's external payment option. + /// Developer billing option parameters for external payments and Billing Choice. + /// Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). final DeveloperBillingOptionParamsAndroid? developerBillingOption; /// Personalized offer flag. /// When true, indicates the price was customized for this user. @@ -5089,6 +5181,7 @@ class RequestSubscriptionAndroidProps { this.isOfferPersonalized, this.obfuscatedAccountId, this.obfuscatedProfileId, + this.originalExternalTransactionId, this.purchaseToken, this.replacementMode, required this.skus, @@ -5096,9 +5189,9 @@ class RequestSubscriptionAndroidProps { this.subscriptionProductReplacementParams, }); - /// Developer billing option parameters for external payments flow (8.3.0+). - /// When provided, the purchase flow will show a side-by-side choice between - /// Google Play Billing and the developer's external payment option. + /// Developer billing option parameters for external payments and Billing Choice. + /// Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). final DeveloperBillingOptionParamsAndroid? developerBillingOption; /// Personalized offer flag. /// When true, indicates the price was customized for this user. @@ -5107,6 +5200,10 @@ class RequestSubscriptionAndroidProps { final String? obfuscatedAccountId; /// Obfuscated profile ID final String? obfuscatedProfileId; + /// Original external transaction ID for replacing a subscription that was + /// purchased through developer billing. Available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). + final String? originalExternalTransactionId; /// Purchase token for upgrades/downgrades final String? purchaseToken; /// Replacement mode for subscription changes @@ -5126,6 +5223,7 @@ class RequestSubscriptionAndroidProps { isOfferPersonalized: json['isOfferPersonalized'] as bool?, obfuscatedAccountId: json['obfuscatedAccountId'] as String?, obfuscatedProfileId: json['obfuscatedProfileId'] as String?, + originalExternalTransactionId: json['originalExternalTransactionId'] as String?, purchaseToken: json['purchaseToken'] as String?, replacementMode: json['replacementMode'] as int?, skus: (json['skus'] as List).map((e) => e as String).toList(), @@ -5140,6 +5238,7 @@ class RequestSubscriptionAndroidProps { 'isOfferPersonalized': isOfferPersonalized, 'obfuscatedAccountId': obfuscatedAccountId, 'obfuscatedProfileId': obfuscatedProfileId, + 'originalExternalTransactionId': originalExternalTransactionId, 'purchaseToken': purchaseToken, 'replacementMode': replacementMode, 'skus': skus, @@ -5757,6 +5856,7 @@ sealed class Purchase implements PurchaseCommon { /// Store where purchase was made @override IapStore get store; + /// Unix timestamp in milliseconds since January 1, 1970 UTC. @override double get transactionDate; @@ -5815,6 +5915,8 @@ abstract class MutationResolver { /// Returns external transaction token needed for reporting external transactions. /// developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, /// native Android defaults it to IN_APP. + /// The Billing Choice extension is available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android Future createBillingProgramReportingDetailsAndroid({ @@ -5840,6 +5942,7 @@ abstract class MutationResolver { /// See: https://openiap.dev/docs/apis/init-connection Future initConnection({ AlternativeBillingModeAndroid? alternativeBillingModeAndroid, + BillingChoiceScreenTypeAndroid? billingChoiceScreenTypeAndroid, BillingProgramAndroid? enableBillingProgramAndroid, }); /// Check whether a billing program (e.g., External Payments) is available for the current user. @@ -5849,13 +5952,17 @@ abstract class MutationResolver { /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/is-billing-program-available-android Future isBillingProgramAvailableAndroid(BillingProgramAndroid program); - /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). + /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+), + /// including developer-rendered Billing Choice external-link flows. + /// Billing Choice availability: OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). /// Replaces the deprecated showExternalOfferInformationDialog API. /// Shows Play Store dialog and optionally launches external URL. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/launch-external-link-android Future launchExternalLinkAndroid({ required BillingProgramAndroid billingProgram, + String? externalTransactionToken, required ExternalLinkLaunchModeAndroid launchMode, required ExternalLinkTypeAndroid linkType, required String linkUri, @@ -5890,8 +5997,9 @@ abstract class MutationResolver { /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android Future showAlternativeBillingDialogAndroid(); - /// Show Google's information dialog for a Billing Choice external transaction. - /// Available in Google Play Billing Library 9.1.0+. + /// Show Google's mandatory information dialog before a developer-rendered, + /// in-app Billing Choice screen. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android Future showBillingProgramInformationDialogAndroid({ @@ -5904,7 +6012,8 @@ abstract class MutationResolver { /// See: https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios Future showExternalPurchaseCustomLinkNoticeIOS(ExternalPurchaseCustomLinkNoticeTypeIOS noticeType); /// Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. - /// Available in Google Play Billing Library 4.1.0+. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 + /// (upstream API available since Play Billing 4.1.0). /// Returns a response code and, when the subscription status changes, the related purchase token. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-in-app-messages-android @@ -5980,7 +6089,7 @@ abstract class QueryResolver { bool? onlyIncludeActiveItemsIOS, }); /// Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. - /// Available in Google Play Billing Library 9.1.0+. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client is not ready. /// See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android Future getBillingChoiceInfoAndroid({ @@ -6042,11 +6151,11 @@ abstract class QueryResolver { /// GraphQL root subscription operations. abstract class SubscriptionResolver { - /// Fires when a user selects developer billing in the External Payments flow (Android only) - /// Triggered when the user chooses to pay via the developer's external payment option - /// instead of Google Play Billing in the side-by-side choice dialog. - /// Contains the externalTransactionToken needed to report the transaction. - /// Available in Google Play Billing Library 8.3.0+ + /// Fires when a user selects developer billing in an External Payments or + /// Billing Choice flow (Android only). The payload can contain an external + /// transaction token, link URI, original transaction ID, and selected products. + /// Billing Choice payload fields are available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). Future developerProvidedBillingAndroid(); /// Fires when the App Store surfaces a promoted product (iOS only) Future promotedProductIOS(); @@ -6101,11 +6210,13 @@ typedef MutationFinishTransactionHandler = Future Function({ }); typedef MutationInitConnectionHandler = Future Function({ AlternativeBillingModeAndroid? alternativeBillingModeAndroid, + BillingChoiceScreenTypeAndroid? billingChoiceScreenTypeAndroid, BillingProgramAndroid? enableBillingProgramAndroid, }); typedef MutationIsBillingProgramAvailableAndroidHandler = Future Function(BillingProgramAndroid program); typedef MutationLaunchExternalLinkAndroidHandler = Future Function({ required BillingProgramAndroid billingProgram, + String? externalTransactionToken, required ExternalLinkLaunchModeAndroid launchMode, required ExternalLinkTypeAndroid linkType, required String linkUri, diff --git a/libraries/flutter_inapp_purchase/test/builders_unit_test.dart b/libraries/flutter_inapp_purchase/test/builders_unit_test.dart index 912921d46..fbacd3221 100644 --- a/libraries/flutter_inapp_purchase/test/builders_unit_test.dart +++ b/libraries/flutter_inapp_purchase/test/builders_unit_test.dart @@ -94,15 +94,24 @@ void main() { final builder = RequestSubscriptionAndroidBuilder() ..skus = ['sub_sku'] ..purchaseToken = 'old_token' + ..originalExternalTransactionId = 'original-external-id' ..replacementMode = 1 ..obfuscatedAccountId = 'acc' - ..obfuscatedProfileId = 'prof'; + ..obfuscatedProfileId = 'prof' + ..subscriptionProductReplacementParams = + const SubscriptionProductReplacementParamsAndroid( + oldProductId: 'old_product', + replacementMode: SubscriptionReplacementModeAndroid.Deferred, + ); final props = builder.build(); expect(props.skus, ['sub_sku']); expect(props.purchaseToken, 'old_token'); + expect(props.originalExternalTransactionId, 'original-external-id'); expect(props.replacementMode, 1); + expect(props.subscriptionProductReplacementParams?.oldProductId, + 'old_product'); }); test('builds with empty subscriptionOffers returns null', () { diff --git a/libraries/flutter_inapp_purchase/test/flutter_inapp_purchase_channel_test.dart b/libraries/flutter_inapp_purchase/test/flutter_inapp_purchase_channel_test.dart index 6685d6b42..9599814bb 100644 --- a/libraries/flutter_inapp_purchase/test/flutter_inapp_purchase_channel_test.dart +++ b/libraries/flutter_inapp_purchase/test/flutter_inapp_purchase_channel_test.dart @@ -180,6 +180,7 @@ void main() { return jsonEncode({ 'responseCode': 0, 'debugMessage': null, + 'subResponseCode': 'no-applicable-sub-response-code', }); } return null; @@ -197,6 +198,10 @@ void main() { ); expect(result.responseCode, 0); + expect( + result.subResponseCode, + types.SubResponseCodeAndroid.NoApplicableSubResponseCode, + ); final call = calls.singleWhere( (MethodCall call) => call.method == 'showBillingProgramInformationDialogAndroid', @@ -264,8 +269,10 @@ void main() { ); await iap.initConnection( + billingChoiceScreenTypeAndroid: + types.BillingChoiceScreenTypeAndroid.DeveloperRendered, enableBillingProgramAndroid: - types.BillingProgramAndroid.ExternalPayments, + types.BillingProgramAndroid.BillingChoice, ); final call = calls.singleWhere( @@ -273,7 +280,8 @@ void main() { ); final args = call.arguments as Map?; expect(args, isNotNull); - expect(args!['enableBillingProgramAndroid'], 'external-payments'); + expect(args!['billingChoiceScreenTypeAndroid'], 'developer-rendered'); + expect(args['enableBillingProgramAndroid'], 'billing-choice'); }, ); @@ -440,7 +448,8 @@ void main() { ); const params = types.LaunchExternalLinkParamsAndroid( - billingProgram: types.BillingProgramAndroid.ExternalOffer, + billingProgram: types.BillingProgramAndroid.BillingChoice, + externalTransactionToken: 'external-token', launchMode: types.ExternalLinkLaunchModeAndroid.LaunchInExternalBrowserOrApp, linkType: types.ExternalLinkTypeAndroid.LinkToDigitalContentOffer, @@ -457,6 +466,7 @@ void main() { methodCall.arguments as Map, ); expect(payload, params.toJson()); + expect(payload['externalTransactionToken'], 'external-token'); }); }); @@ -1005,7 +1015,7 @@ void main() { ); test( - 'sends developerBillingOption for External Payments on Android', + 'sends minimal in-app Billing Choice option on Android', () async { final calls = []; TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger @@ -1031,10 +1041,7 @@ void main() { google: types.RequestPurchaseAndroidProps( skus: ['product.premium'], developerBillingOption: types.DeveloperBillingOptionParamsAndroid( - billingProgram: types.BillingProgramAndroid.ExternalPayments, - launchMode: types.DeveloperBillingLaunchModeAndroid - .LaunchInExternalBrowserOrApp, - linkUri: 'https://example.com/checkout', + billingProgram: types.BillingProgramAndroid.BillingChoice, ), ), useAlternativeBilling: null, @@ -1056,20 +1063,14 @@ void main() { final developerBillingOption = Map.from( payload['developerBillingOption'] as Map, ); - expect(developerBillingOption['billingProgram'], 'external-payments'); - expect( - developerBillingOption['launchMode'], - 'launch-in-external-browser-or-app', - ); - expect( - developerBillingOption['linkUri'], - 'https://example.com/checkout', - ); + expect(developerBillingOption['billingProgram'], 'billing-choice'); + expect(developerBillingOption['launchMode'], isNull); + expect(developerBillingOption['linkUri'], isNull); }, ); test( - 'sends developerBillingOption for External Payments on subscription Android', + 'sends Billing Choice fields on Android subscription', () async { final calls = []; TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger @@ -1094,8 +1095,10 @@ void main() { apple: null, google: types.RequestSubscriptionAndroidProps( skus: ['sub.premium.monthly'], + originalExternalTransactionId: 'original-external-id', developerBillingOption: types.DeveloperBillingOptionParamsAndroid( - billingProgram: types.BillingProgramAndroid.ExternalPayments, + billingProgram: types.BillingProgramAndroid.BillingChoice, + externalTransactionToken: 'pre-generated-token', launchMode: types.DeveloperBillingLaunchModeAndroid.CallerWillLaunchLink, linkUri: 'https://example.com/subscribe', @@ -1122,12 +1125,18 @@ void main() { expect(payload['type'], 'subs'); expect(payload['skus'], ['sub.premium.monthly']); expect(payload['useAlternativeBilling'], isTrue); + expect( + payload['originalExternalTransactionId'], 'original-external-id'); expect(payload.containsKey('developerBillingOption'), isTrue); final developerBillingOption = Map.from( payload['developerBillingOption'] as Map, ); - expect(developerBillingOption['billingProgram'], 'external-payments'); + expect(developerBillingOption['billingProgram'], 'billing-choice'); + expect( + developerBillingOption['externalTransactionToken'], + 'pre-generated-token', + ); expect(developerBillingOption['launchMode'], 'caller-will-launch-link'); expect( developerBillingOption['linkUri'], @@ -1843,7 +1852,16 @@ void main() { await iap.initConnection(); final payload = { - 'externalTransactionToken': 'ext-token-abc123', + 'externalTransactionToken': null, + 'linkUri': 'https://example.com/checkout', + 'originalExternalTransactionId': 'original-external-id', + 'products': >[ + { + 'id': 'premium_monthly', + 'type': 'subs', + 'offerToken': 'offer-token', + }, + ], }; await TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger @@ -1859,7 +1877,11 @@ void main() { ); final details = await developerBillingFuture; - expect(details.externalTransactionToken, 'ext-token-abc123'); + expect(details.externalTransactionToken, isNull); + expect(details.linkUri, 'https://example.com/checkout'); + expect(details.originalExternalTransactionId, 'original-external-id'); + expect(details.products.single.id, 'premium_monthly'); + expect(details.products.single.offerToken, 'offer-token'); }, ); }); diff --git a/libraries/godot-iap/CLAUDE.md b/libraries/godot-iap/CLAUDE.md index eb3901e53..0fd90beb9 100644 --- a/libraries/godot-iap/CLAUDE.md +++ b/libraries/godot-iap/CLAUDE.md @@ -5,6 +5,7 @@ This document outlines conventions and guidelines for the godot-iap project. ## Project Overview godot-iap is a Godot 4.x plugin for in-app purchases following the [OpenIAP](https://openiap.dev) specification. +The SwiftGodot runtime requires iOS 17 or later; Android supports API 24 or later. ### Architecture diff --git a/libraries/godot-iap/Example/export_presets.cfg b/libraries/godot-iap/Example/export_presets.cfg index ac708b0ce..4ca9771c7 100644 --- a/libraries/godot-iap/Example/export_presets.cfg +++ b/libraries/godot-iap/Example/export_presets.cfg @@ -258,7 +258,7 @@ icons/app_store_1024x1024="res://icons/openiap-1024.png" icons/app_store_1024x1024_dark="" icons/app_store_1024x1024_tinted="" application/targeted_device_family=2 -application/min_ios_version="15.0" +application/min_ios_version="17.0" storyboard/image_scale_mode=0 storyboard/custom_image@2x="" storyboard/custom_image@3x="" diff --git a/libraries/godot-iap/Example/project.godot b/libraries/godot-iap/Example/project.godot index 8cb12caa8..b08a0d1f9 100644 --- a/libraries/godot-iap/Example/project.godot +++ b/libraries/godot-iap/Example/project.godot @@ -16,7 +16,7 @@ compatibility/default_parent_skeleton_in_mesh_instance_3d=true config/name="GodotIap Example" run/main_scene="res://main.tscn" -config/features=PackedStringArray("4.6", "GL Compatibility") +config/features=PackedStringArray("4.5", "GL Compatibility") config/icon="res://openiap-logo.png" [autoload] diff --git a/libraries/godot-iap/Example/tests/test_godot_iap.gd b/libraries/godot-iap/Example/tests/test_godot_iap.gd index 660d0ab4e..5c7201ab3 100644 --- a/libraries/godot-iap/Example/tests/test_godot_iap.gd +++ b/libraries/godot-iap/Example/tests/test_godot_iap.gd @@ -10,6 +10,20 @@ var _tests_failed := 0 var GodotIapPlugin: Node = null +class FakeAndroidPlugin: + extends RefCounted + var last_config: Dictionary = {} + var last_purchase: Dictionary = {} + + func initConnectionWithConfig(config_json: String) -> bool: + last_config = JSON.parse_string(config_json) + return true + + func requestPurchaseJson(params_json: String) -> String: + last_purchase = JSON.parse_string(params_json) + return JSON.stringify({"success": true, "pending": true}) + + func _init() -> void: _run_suite.call_deferred() @@ -46,6 +60,7 @@ func _run_all_tests() -> void: test_product_variant_mapping() # Purchase tests + test_billing_choice_android_payloads() test_get_available_purchases_mock() test_restore_purchases_mock() @@ -109,6 +124,37 @@ func test_init_connection_mock() -> void: _assert_false(result, "init_connection should return false without a native plugin") +func test_billing_choice_android_payloads() -> void: + var fake = FakeAndroidPlugin.new() + GodotIapPlugin._native_plugin = fake + GodotIapPlugin._platform = "Android" + + var config = Types.InitConnectionConfig.new() + config.enable_billing_program_android = Types.BillingProgramAndroid.BILLING_CHOICE + config.billing_choice_screen_type_android = Types.BillingChoiceScreenTypeAndroid.DEVELOPER_RENDERED + _assert_true(GodotIapPlugin.init_connection(config), "Billing Choice config should reach Android plugin") + _assert_equal(fake.last_config.get("enableBillingProgramAndroid"), "billing-choice", "Billing Choice program should be preserved") + _assert_equal(fake.last_config.get("billingChoiceScreenTypeAndroid"), "developer-rendered", "Billing Choice renderer should be preserved") + + var subscription = Types.RequestSubscriptionAndroidProps.new() + var skus: Array[String] = ["monthly_subscription"] + subscription.skus = skus + subscription.original_external_transaction_id = "original-external-id" + var option = Types.DeveloperBillingOptionParamsAndroid.new() + option.billing_program = Types.BillingProgramAndroid.BILLING_CHOICE + subscription.developer_billing_option = option + GodotIapPlugin._request_purchase_raw({ + "type": "subs", + "requestSubscription": {"google": subscription.to_dict()}, + }) + _assert_equal(fake.last_purchase.get("originalExternalTransactionId"), "original-external-id", "Original external transaction ID should reach Android plugin") + _assert_equal(fake.last_purchase.get("developerBillingOption", {}).get("billingProgram"), "billing-choice", "Developer billing option should reach Android plugin") + + GodotIapPlugin._native_plugin = null + GodotIapPlugin._platform = "" + GodotIapPlugin._is_connected = false + + func test_end_connection_mock() -> void: var result = GodotIapPlugin.end_connection() _assert_true(result, "end_connection should return true in mock mode") @@ -276,6 +322,24 @@ func test_android_methods_mock() -> void: var deep_link_result = await GodotIapPlugin.deep_link_to_subscriptions() _assert_true(deep_link_result is Types.VoidResult, "deep_link_to_subscriptions should return VoidResult") + # get_billing_choice_info_android + var choice_params = Types.GetBillingChoiceInfoParamsAndroid.new() + choice_params.billing_program = Types.BillingProgramAndroid.BILLING_CHOICE + choice_params.play_billing_choice_image_layout = Types.BillingChoiceImageLayoutAndroid.RECTANGULAR_FOUR_BY_ONE + var choice_info = GodotIapPlugin.get_billing_choice_info_android(choice_params) + _assert_true(choice_info is Types.BillingChoiceInfoAndroid, "get_billing_choice_info_android should return BillingChoiceInfoAndroid") + + # show_billing_program_information_dialog_android + var dialog_params = Types.BillingProgramInformationDialogParamsAndroid.new() + dialog_params.billing_program = Types.BillingProgramAndroid.BILLING_CHOICE + dialog_params.external_transaction_token = "mock_external_token" + var dialog_result = GodotIapPlugin.show_billing_program_information_dialog_android(dialog_params) + _assert_true(dialog_result is Types.BillingResultAndroid, "show_billing_program_information_dialog_android should return BillingResultAndroid") + + # show_in_app_messages_android + var message_result = GodotIapPlugin.show_in_app_messages_android() + _assert_true(message_result is Types.InAppMessageResultAndroid, "show_in_app_messages_android should return InAppMessageResultAndroid") + # ============================================ # Test Utilities diff --git a/libraries/godot-iap/Makefile b/libraries/godot-iap/Makefile index ae0066561..3452b9438 100644 --- a/libraries/godot-iap/Makefile +++ b/libraries/godot-iap/Makefile @@ -195,6 +195,7 @@ all: android ios macos test: @echo "$(GREEN)Running GDScript unit tests...$(NC)" @cd $(EXAMPLE_DIR) && $(GODOT) --headless --script tests/test_types_only.gd + @cd $(EXAMPLE_DIR) && $(GODOT) --headless --script tests/test_godot_iap.gd @echo "$(GREEN)✓ Tests complete$(NC)" # Clean build artifacts @@ -233,7 +234,9 @@ run-android: export-android # Export iOS Xcode project export-ios: ios @echo "$(GREEN)Exporting iOS Xcode project...$(NC)" + @rm -rf $(IOS_EXPORT_DIR) @mkdir -p $(IOS_EXPORT_DIR) + @touch $(IOS_EXPORT_DIR)/.gdignore @cd $(EXAMPLE_DIR) && $(GODOT) --headless --export-debug "iOS" ios/Martie.xcodeproj @echo "$(GREEN)Fixing iOS frameworks...$(NC)" @cp $(BIN_DIR)/ios/GodotIap.framework/Info.plist $(IOS_EXPORT_DIR)/Martie/addons/godot-iap/bin/ios/GodotIap.framework/ 2>/dev/null || true diff --git a/libraries/godot-iap/README.md b/libraries/godot-iap/README.md index f199ac2a6..d47cd9535 100644 --- a/libraries/godot-iap/README.md +++ b/libraries/godot-iap/README.md @@ -11,6 +11,8 @@ A comprehensive in-app purchase plugin for Godot 4.x that conforms to the Open IAP specification +Requires Godot 4.3+, iOS 17+ for the Swift GDExtension, or Android API 24+. + Open IAP @@ -75,7 +77,7 @@ godot-iap conforms to the **[OpenIAP specification](https://openiap.dev)** — a - **Shared specification** — Common types, error codes, and purchase flows across all platforms - **Generated type-safe bindings** — Swift, Kotlin, Dart, and GDScript from a single GraphQL schema -- **Platform implementations** — [openiap-apple](https://github.com/hyodotdev/openiap/tree/main/packages/apple) (StoreKit 2) and [openiap-google](https://github.com/hyodotdev/openiap/tree/main/packages/google) (Play Billing 8.x) +- **Platform implementations** — [openiap-apple](https://github.com/hyodotdev/openiap/tree/main/packages/apple) (StoreKit 2) and [openiap-google](https://github.com/hyodotdev/openiap/tree/main/packages/google) (Play Billing 9.1.0) - **Verification profiles** — Standardized receipt validation and purchase verification patterns Other libraries built on OpenIAP: [react-native-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/react-native-iap) · [expo-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/expo-iap) · [flutter_inapp_purchase](https://github.com/hyodotdev/openiap/tree/main/libraries/flutter_inapp_purchase) · [kmp-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/kmp-iap) diff --git a/libraries/godot-iap/addons/godot-iap/android/GodotIap.release.aar b/libraries/godot-iap/addons/godot-iap/android/GodotIap.release.aar index 21db3895acb582748fb8fd3db0e6c52a13202ea0..3944a37cad43942941839b5c8a22fd5445f081bf 100644 GIT binary patch literal 99814 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ð?zxqog3ZZtkt%{M2J ziP7+{QvUV7)s@TbFTFWG>8JGHM_UTIPnCa{zqj1zV*D5JV|B~lr{sPA`G0PSiw@74 zw`cw-CPnOYR>*npn|0{dYo9uc|NbZ9CqL}BD&1oEL;3%|@F#N@1ls@n-gv7`grnoN zc+rV(_7hceS>L`*^_??^=Zw#se~rwR7g{(N`B_{(+3^|vIka&9FWKWqk6b)-b6wkF zctg~gfhkJ$&+CP8YAPT8tADef{O{Md$M&9kGWIL}P2afRuI#11Vamq)9e+PN&-lmn z>-F1f^-X`K{1g0Q{`1%L`LcgCEz`bApZxz%@REF$ghTzSzhA$+Jnwr|{zrYS(NYCo zzK`v^AAifAubwu2|7|A5zw!az%q$`d3>+K`3=ED8o7gWm=L1=DfY=g*^%L__it;m4^pi?6b5iuvixN|EQuPxPi*$2SOA=EOOA_@8it-Cmi%K$6i$i-3 zavgHuVSWEsVx#;9_KUAv9R;fDO$#~Ggiq!<{*QaPQZ8MBtz)sfqqOC!9ZTyrzirr2 zz`QVVZTF3Pr@g1-fARTi&;S0|wk6&>jJd?ESUrBODi(`gTeo>P`}|a{BhL?%p5xeP zBcYb+#h>x?9e02?Ba;X-!XH4VGcbV&AYg@1U~)+#hzimxsVG6$@=dx*^(#_n?wgpGnU-2yqF0fdgKmKQK}GwfCPs#T6Brq|Q4H_~8kwAvSX`W1 ote2Hogsu@i&|!L)G=6JlBtHrQyjj^mMzH{)2+#$4T7U!t05JHFtN;K2 delta 85314 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%0DHYvbH&fCy2FAfbs;-z#(9_q|KyOsK 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 R$xD}&g#k+jk4ymo002Jns9XR5 diff --git a/libraries/godot-iap/addons/godot-iap/bin/ios/GodotIap.framework/GodotIap b/libraries/godot-iap/addons/godot-iap/bin/ios/GodotIap.framework/GodotIap index 36e4768be20d37d0f6ca99f3419968ef9abf753c..616c0a0f6fd52463ac916160e5c8bf15566649f8 100755 GIT binary patch literal 4566640 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

    EGAR{5ke##FyanD; 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

    b#Qm4DHe%<)TGBYqcu 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�$q1O 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

    m|68=kxEd{A0jXw9oCT=$K1uYM^nk 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 U>AF`!LIg=1`F&7V7wYT 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ν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

    +ey5nv&&3C7Mv+(iyyp=uXU+Kg^RyS@(HA^^ zUL+ff*!53{UH_;vwhe0p#I5fd3QYu)BI}rY%i-^pqlTGzxa`tSu?H!C89v9#^M}P= z9WgBS+VEkq>LJ5ouMZp+d*kF`u{Vz%7JC^Vd$iXu?r|8#y@gIRdN9x3^c;vrzb}ea z?JnXuDO$CwC?@~(@=uFmH&d=`+?xzccgGu;;g%Vg>0WPOmisdUv)$_qOmRyM49Bh! z#D2Y6kl36n1&KqtT#&VbO9ip*Mhl|XjS_^9UI?r)^R$@$6GQ$HG31{RL;huvm0v|k zt@3MTzc^mgar(0#NzB)3w-m){3T^yD7V=Ba7vF5-o&9Is1rcIxEcqyS3436ZSug8$ zH0wL81-<+4qF8d-xTaNCGQMSHO?B6FiseD~A7vQss0-7fWH!73_NN)->i=?&8@g_&zxG~ z)K(P^i>)|&Sga0Om=50=fbV%szB4Z$-9Uc69Q48z_@iPHPKkpm??TF}BmYYB*N|U6 z3hAMJN#~Hy^y$L$AcCB@4^I=9k~D_PB$ux3o#NNPL?X;<>{yX`BK&F#m=a7 z2KTu)7`>A3nNDEv2l%P8(2=q}>|}H#r~H>^I^_@Xd-%-soTR~;ORFiztVyABsVxD1 znu}WR&CY3_vx4uJZb_`09nZIhK2B_~r<)ByFFWJvw))s0PZ#@+w3;L9kyjg#R~woC zn~+x@Ag?||Ue#y9+mKglkyopbRdte8taGnIR@F&XEeb?eA*<@Z;nqb-(UqzjSygLb zy8E_)8SWnp%yi!{Fw3nrFx!3Az!Z16fobl`2Et1Oky*bNL}o1(L}ooNh|G!#BC~!c zh|KyeP_k+#{tc}gcQkLMHp20tZu(*m^sgIGW9mf_PDK+;)<8%pTs%s?7dX^HQ>&ki`{X1${uu5t?Wp1 zKbS^es9!c(A#-N+E^F6l%~10AFMPiUzgaE(SLrT?K7Y@BCccl(hlzCP7P~<<$r!7% zTu$4K{0JwRI5Nq%c)57-bSpa&ojGXc4SZc~Uk|+)8M!4p(wB7+#e>YJt+SDvvhRHy zru_>YmNYB)hCTL`h0g1LAe|?R?iiD<2KIJ48<_3}4a{%@ z24=d=W=x4YHZa@$&cIYRW?+i@tsr#%jUaUXwIFo9T@X6|QV=@-To5|n1{9r(muY|B z{`9i_(!s5k2G&!a)gijY;k?x*S~JbVcToC65^^wzJnTfhikl%$lDj$ft_(!PC+fO@ z!zA#HZCZC{Co^}%EB*bb(jg=}YQTBj@r+G>(xdmaj1Tw7Nlqsbe>xZ1*1d9Txck)D z_TID60f}Eq9*FMOi@jc_Yk$o2xv6F2o1_z_p!*@;mxfBLe1Dq$nfZCYnV&QBdmd-c z1!b)5zG%A-cJHL0(5G|g+c5fAgsk_@bVt{}MROFoSP%bWBkWh{V|zxPW(|Ds)Z@^5 zI?R6`%{5K6yIJ&qMDB3+5P6b1<+m|@bopSDGG}NW=P_S=eCq#4E3mDdJ!|UT z2||BIL@GIxtr>f?ZbeaS)jP`s@BSr+G__lfh^*+FZN_m4 zeOUVtcF6RiSnXp)u}85v75}6>-~5vK$GFNDy5aSr*!s7iTlW9?chYSpwnP6j)(wxH z%6zS1AHMFS!|%4b@YupwUH>DYZSJ^Y-rl0N_5a!6;x5j>O@&89lpa0eE8Rbby}w%b z&s|2}<(D(%aQ~dnIZ^&n@?OCj+!d@zZGtA({A z#-3^Nk+yxBC45(%BdAkjbp&vom7PmNp6q;ycX6_FW@6ddF+D#$g*_1(1Ml9V$;5`P zMJL&`qbRoViz2O`W20!@Aj3WTK1)l*@L0*tExZ%$sBL>0=YCUctky2ZS?8|VdyBH% zm3$K}HhSgOQEnq^qUg&l_ZHnuKX&3P5}$IsdyB^Ljt$u{ouAmiT{j`*obF}CC;f*l zjFI)h_jZ?Lac@zfgKxaIyNJhsbBto>8@I5xzeOhaT^Wn?Y;>tHuDFY2wVsU?Z-~?s3+s9{3E>l8@&7l z@be`tWk6pYl|fsMg9fIeuQ-g6?l;QSy{)THiyTVZPV?W_nD<}lexq)@pUM0E%B_1^ z^_M)-8`%{;Dxv<;ui{7QFH>6ems{v#d;R5K=-V}pOKbuy1pAc7@w9|6M~{90>w zz1;~P>5L@SOLKB{4d**B$*ca}K0p<~L0_JfZA+>Vd?vZvpuw`<|BU6MkMn_BA_$ zo38B?ZD`hB82W71H?7=Tfj>$zC`xV8Ys;vynbd&g|_H3lwRmfJ!K-v1? zI2pK@G&_-V@iMTAcPI!}2KH+w0~sq{27aE=Dg#r=(_RKP_6t`h9qt^awS8X>UTgHR z4EJXbwv~gADSw2Q%FYFMlsDzvSR& z@nv}WMEkK;TW(~mtsFl;8xATTbqTm`JZ4z55kI1tpOdW*O810n&egzQ9Qey6 zQ?=eEoXOtc3>f}fojuviXFq*IR~rLa!uM}Ed&{4r3y2YZiaDAJPp$OsOGY;}_a)c$ z)f`QCSCOZ#ubrQ{%z=%Chewni-E_65n=X}Zy7YcKKTSDCH`RPgcdN;N8uK#^UbJ?J zotxhh1L@CAyFPDY20y^oS6?(P|C{oupBW#{bN0rmkAdm#;Ra^7Sq5gh83ty#y$#HE z(+o^?Qw&UTdkP|-4iSVt4ibbOx(gzok_Ev{S3%@cXJD&*>e%1oIDOt{zOMFl)-m{e z*Wydtz`R<=yb2&Itj?O|Mkadp5A|D})t+}Oyj=+1?tH+mg=?&(XWIFi=Jw*7%KVTr zH&AAI=T=>HCEv71!146dxB0I<3e0!usOE0XFn4RRp9Wg9aTT4JpJDHA&0|T={3NEp z=%_QLqxLmAs?N2}G&<_t;veXa_f6H@%xcj|f2X{p33xi|BJ)4Zm0VDt()h1^&U)7T zO7*@+`Ch?T2nV7w$<^Df{>WX6Mt?N-W=YV%ZKs5buRySADe?*e&;^QQ0$P_{)xlUdVMNu|K+Ur?_}I+h*i<^c0Ci1V(BM6 zp)N`q&*w>eIp;n!eH6e~rF%O%MR(!n-^*OZj$Z2gD;)a(UhrSEUvW1{lr5jk0Pp|z ze3N|E{94O%Dtgqq^9!TvuPb2hQ5x@4-Cxme!9Vjo1a6ep`nT-amZqM);aDx-&-2P{ zL*uCRi&FCVZFre{djBG@hB%nipmQp`VU6^fdnu=$ zci#}BTDPVkT5I+n*!F1tt6f#5+*J2D;ZVMR%F-U$Z~n%4Tb!l7`x7q)xkzg$ecrDn zCfe7jezHIV*))@1y7HPp1hdPnThsM z*>e-KOpL4AS502&tCLu-n)IuJn9lkw>%0Fl26Oh}(4b<}%GWF>f8a#)u(I$yPcvQ` z!^ONa{g-`TlkEAfh%3K$&m7|CW8(@72KQ&3_u@eQ^fAQO_e~DJG~LTEWg>z!r2Ar&ROna^bN_VRKCql>K1thIrU6G$tR6dw)+V6 ziPlWsoNnyn)OqNI-kNW=`(F2E<4daqpN))#*3Y$n!0w;Sa{m)rl`mx{yyZ69QA~V; z_J);wJuEsu=xqPG>-@~(tJvFf%xTe*eg(i&qs7dPs;Mc2-#goP^Zh&4JHJJ??WPQ4 zJ7lo#On)T*es1VI+Z_vBMjOEAs9b)1`Ta9{@0?}CMm_~?W?+x?=~}$4?+Msb@Q#Wk z_T!UAcTP2#vU|H%6TAJSi6_UFHsygc_IxQ8A;5lVzkHSb7q9HcDf=Gc&L8Mfyshv! zzwDG5nUtGp5qP^5;-~jPjdR{s6!H-ZN4t|9#F} zdz!YXyeBAcXjf4TPiGAR1D zG#gV`Yh>q9kqbQ>e1i{AZR+;^L-E>d{*biU@l&U_V5*4%p5;Fj2b`na>HdAZ$p zn&Cdh``>hc+k5we+v2U$*OYbp&5peP`0I|)urGE*k9}-S^!UX)N|yY2$F$G(?#Meb zDf%1u>n`Z5ihX8PS82ayFLw%MzG~=&kRTl2_xiiWr-ZynW17=1#L-?m2vu%+el`YTA2_ zq3aBHDDMqD7j$W%=bvUoPbeC(9Uv3g{TVJgEB1LGXCSWNOBsWmgS}x~cIzA-@exe>G9M zOuC_E-JPN~erjX}`V4IqUHzN?J*h{uFS=Kn&0dThwJ$o^2m-VHS&IGZn+bAVdB1VuxBXkb+-JUs{HG{^2giq z{TR}dl2}}G^Zj1BDQ(jou5=ICbjwulbT8dwHl447 zi^ghZ*?t|W=O^v+L3*BRpGCJd&)Vm%dR}OsJL&m3`y9}-YoEVod~252=kN6Vl5NLL z(2wq@Hnza)ZQHwD>9~hp<4~YHI?0Dl@}U#$N0#5(*e72ljuBXepYslQ zmbI5T3-3$Lar}gH96#!YF0OO%4vOx&0XwBA7>TFBs$f=AHu2)w#6qomzaX}DO+l>w zuLZhC`m507A%?G%-{{cSf|sNh+)Q6=Y@&_9ijOM@7ZX?T5AssZ3d*UaoVDi{nDun4 z8>E`G*CY2f)4=-}Edf!K9z4>wT`W!1l1z?yGC zY{N?hv5iX#Vw>E8*ay!Q#8xe&&SwkohY}Mtm**$-Oia`)o*&Y4Qgqcso^RH3FuLkG zp0Ck!r)b@k1+m5xoYW9 zp9x~$UMGlsTPld2dW|6V?bU+Vw^s@hCv~}CKjMD{k0Jh7Z~*bYf+vJy7XoXrhpK{C zaqeqdn%I1%Guql)=P|~dkN6SiBYwj9h+h_ads~9W=2GmE&VOGA9))9#&027|fw8gi zukr_4d|O+yw>x;;o;h{NjhqpG!?TLVl8q?4@E7;sXZdv6sM6`~ZGrMVYsT^4&`QA> zhE}d?e00rEPjVVzoCi zrXRe{c)r58(56rtu`AadX3loF3!0X_a1ZI9Ke9!iV!so8n9>RRBg3tP7fD`fjik)j zcaqnco<5rHmQse~brgC1wkNNd1IUn6cLR7Ru6krm9(N>FjYN;>)UYGDVb7YXV}?YR zv6ozS_j+TGr@7}-PUU42qkXF$TQlY0#XGi~_tzbL&--#mzegTh)9>@eJ63Y{POx(C z4&{+9Hh?w@Z(;JS`-jE3kKfH@*7qvC;t0~U*<+6$yOcgvvWM*?@*4csTKsCwXj+OB ziS`@9`cj%ZiM;B!+Pc_l=aJ-j{f3EAe4I=D*oXjY68fJ`Y{Z671HKP>wHF^T)5J#% zKh*f3Ws@I6{dL1HH0wkG{Lr2cda37wo+%&nA)M#T+L((E8sGHkk-DVLCVx74KUf%! zy>SRW=;y+*=J|oauir2v+Au#5(VqWOvp%GKj;Zbt{8bvmZ;?CkI4I|wfm=Kre8o3Q zV`mx~GdLJvaj=zr!b6E8eS}!kl7Mqs<3D~;-vga1L?3i7miXp4`5ZVy=D)msX%-jnLWA9VH=8kZCsljcE`xn~s>ID;{ zo)5n*{*Jf!+d$g74A1XbWa1@HgFd(=iggfYW+?Y0y9bJS5QWEZM*CMI zkUJxgJJ*7<+6;THiDKk6|8*W~N4y5Vlh(nO`hN8S);re1t3P~<`90m-TY1ni~V)5Y&Xm|m03rb;@c`We26o!oLEiTH|sO? z`IxqAV4v{ryMF(VxOb0_s=6Bf&&)tF;f}dX0w@8z1Q4}?U?h~81Q2h4ha2lfSyxad za;V_|bFSG3oQRLT_6lbWtVe7O?0INJ`t#x=P5tabCn8@2CO5zL)c+pVPL)5)8p{7# zLA^rzm-l}s?KQ^8&Qn#6as zEp^Ixd`O+_pNZk^dCJAFNi5-ibA0((lhF9mYZ5glHLgh{lfOB>ny*P*VdLtWX1FS% zZ2X$UZ`J>FYp%*q%m7k}=_GO@fR6sHdf&r(jMTxQ;9C4tqGvez%-87PB5$S49#w|( z|D?^=F@Aw9fIeMmuVa+R{+Q9gu!{28#E?+m^qNJbtXTy3cCk|??!AoZ0^UoRlW0fj zVw`9Bp7mF`oA?lGvqxtcP4utYWFxwbb4;&tj;XLNpw2M`54oZfe{@AB9dkveyWQxU zUTX|>2fqnKFQncHa;}njuDL!S_d`LiTMXc5A9PxxJOM|K%pMfy=gtp*4=t&CXx4GZ z*rP_;9%x6wU(g0!vORi52lR`M@O~$B$u8kTkBZN`jaiS~rDTh3(}+IVojG3i)^9%s zkBVIC8i-~9_ip%4#!2SuZG0$_skO)UNieZZ)% zevA1|X)&3;kFriUU<)*7dD<^ObGWh&MW@c*j$6ND2LGT zen*|#51~W;8@aRxS;E{b_uGhWgr6I|Fgd(y13dB$|CJs*Ox2&x+`DsaAbRZwF+Wsg zydUZpz*7#bHQ#%QU3}cVmvT-(eD_g>gH&s?$UH^QJ*>r}M8?ZpnPn}AdoJPGt8^Wa zT|Udz#zvPRq z;@~$3eoY&{Lc^;6t~mTo*7%jN+6+yGE^)P(Hy0MPGn46qGk4Cm+dsy;Z0eU-KSjJ- z!#p|xomlA)dY`7!Ly8Mz9_?l&0Y`Cxo<{@dAkrtvkNwp|57~cz)48;GU6Lw)h&C4e zi}j2C#;S#%61#@6DZe-C{58y{Wq;K1hvMf`-yA)kZU@dq;BLvRK=ipsp}!}esxEG4 zp&QB_k6JgB{?C{GU+9V=7Y~Tu0E`DjZ&=u;o%t@XJN>`V?*E(A`&atB_$HrP>p7kG zhk6}V_dw)RHXogK;kvfWk4o1be}M18AF`G+T8*{n>5Y3PE$S;i_M2@zbB*s_g?@`K zFeWVWv@_QWJRkX^xqKI2h`=hkmT!ih58gu85g(fDzm#(Va-L-}V=X#^=sCI!^C8b= z$fno8-=bM5=0(z8fy7#1pQP%O&k~xCNPC<=b4mOT&M`d6czi~?N-lI95uHgHiH#)v zdYds=LOqc|#^5#7Eiyf7v3H9668Fe~weKx57FpKaJMBF zuRG)YcLl$er;>N+{aXKfp}#BoSV4*!H?h}c%)g|(jJK?3IctQKJcs%tKiUI_C&k>v z|KfFS%B5P@s`2KG5apVWcSn1?uY(S*>&$plCclr2cbXdSQz#Q^XAEA*c*`0|d9Jp- z4BnSrI=|ZgO+}r5+U7b}q`taGetqf0^NEl5B04$eG>vp)&ddV0dG*7hU!__5fl1-j z;C^?ZHzUj3f1jo|$*0>*Rqaas{=vrJdug|jcGpidRz0ZBv11>qdeW?qRGMn-RB4uV z6|^X_v3$e4>cUMGb+!99*RAjPd0mDpw4@wZM+58VPLVoq+0ioyzoVkZSv#gEO z5&U}I_|S?K$~Hd8yV?MA#f`+5$JW<$WOeiG||yz&C3}Fk3DXJ_e*#$ zYY_L)7wNyiDfZb+Xlzhg0-7Ay#e5ywEgq=pu?o8n8NS6kbGVwrb~dZQ>H14WIr6e)X~k+_4E}&NC(~EDb~# zv;Mhgju5AR{9w<@vKuo{Y>ytTMum|itH)AP-e!IoC2eybk zFe$d@ria>dvsCd2`prX{Rvq1c17*dxRA0dQpluKQL%mD4w%L3&g#YVh-Fvt{dIfkB zTG-Dw>95eiZ|`&HBi(vOy-&4yLCg04{k5LE1WwzQh~a!$5jcNY<9tCAoWs{GaPF+* z`K(Op`Xx9Q8=@;X7nn58v#d{m!KqVl?mw+@f72Yw$@n<#=(M;k40&bd*U13yP6dK{bYm*f%L7ATxc{psAXe$5dF&r@kz^e0Cr zb>82s-e+0&s`5T-C+RU|V`zLn2|j)RDKWd$EJ38aP&=I$6i|L3Z@j7BT?bIgF5#|2d^Rg44&2jX@yA{l-)+hxt>#!=- zcADA6S(=zuHs95pKQ*na zhBifp&B5+$q>(i1O5j^$*YzwkQr4!CM%?s8=*ppyW8@Y4GoCiGp^YFiMr=;eaYsNK z+0aH}nn;5tvJ_3MfmWrzZ$2n|*tplNR^hAhyvFD1f0|WCe#Lvxjc=dP?P<1Tc$ zU-(?wnt4WCTkP+dX1CSGX$yTeRNysd^37?hJKy{l7=xc}4_|c#k1{Wh(EX}s9HgBZ z?p$};$&_{q;@ZJJonW`~75TH6KSe$U=*M0)?&;QVW8*140qqC=3;fmosQ3eXD(@#M zFZ`b%uch*(S=A~J=fFu@op1YeF+YBQ@#&-I+hxQW&^8nIVREMLc=PRB_cohv*R@ge z?Rx54uoRyFcK*T_8tsr^=Pn)D{-c85XT7ib>$5hgRAhUqwFsTq@c}#&_xv=^ z#WC65L+MJjv$bq@Vm{0I*>=`_KHjX?&;Io${zUwzJMja4XyF5SiFKFd%xBLd!@|+x&^|M;^Dp@}h-^oih{zX@md1$#xQ_+R= z{QJC0)2-jB)MqVGDX|1qnq@6kX*X-3q^yTMBk39bXo;l#{n7c7;xC;m=|F$&WmJeA@HYR8@lzDSzsTGzlSK}Cl8}Q& zOb&iTo(OSio*R2jxGQ|SX7jx22eCJz*c%^ptf{L)R`&{Jn3J#_^CRq8rR)Vo_3Ey; z=6O?*{o)&m_mlb2b$i0Y;wKYdIx-0xz@und)=zFb+wtRQUH24x1Jch$(wE;qKHg|k zc8@DqU!AGmXIO_BYng-7_#fxDQRi#(>7%S46%W^bn`g;WJY35|(f`GFQwn?sv5B?q zsBGdbViW)No|p{8R>meS5Z{f@noS*x{^^gN#~z-A?>EZ8)_gbRPiX!3X5fF;p1Yqz zXIp~KR?6J{By)E$^L8y~b|^feFa`KQ^(iN*w#@Mq)YbM#oy8z`i<}J{H`o?TsvOFFqj0zWNM!ojOI=kHnp2 zD4|@uu0NOmM}XJS^J@)o$(h?mJzw{GYX?WqC;lPzqtjK|wpFFrR(q75FXtJwo<3g%009x^3l=lr>Xzx)^Ai9&gYTFpK171y-&BMldf0tvr$jD+s5lQ zzGq~-)VMzb@3S|hs*Js z7N5~0{1y8>8E^8r!l44%_avJOXC<3a;+V0{Byj<&+weOLSpE%6U-J8xUBC9PrCPtE ze(96&*(wJ{Vgd<`XSzb&n#d7ieRYH$oOtg_j#TNnF>TTY@9Y)xs?WakPj%mJ+EiEJ zdV0xR*Zd_tS+kw$nz!U)*W4w(vij;XJIt@{Fu$U11$rm3g75wda`JxUGPtkC8>+8P?OLkp`@pX6GP}Ou{FQatb2rzO zt@yIeXB;Iq(9!BmGP2x#+r`EJsJD`?6vL5ovt;Ux9oW`adlbO@YU24t2x8E zPU-kQYY6o^^UBS(o_a3tTFe8`+v_20Q|MIs+yVdR`nJY-WgF*Jhrn-W{-(OJxnI|f zpx$iOp#+~*#QTu;jFoe%BlA|&WrOb;Y=)ua>DiT7S;Uo+?`0jHt~RK{zY;w0eV~F3 z{$-8Jb*$lltbG*$Q^`*vdz!u%Ui&h^`}=u+dwqiszgTqy+?K7>@b#eXa#>q(b&u)E z&fX9s(=gNc9%MWscdVd4x=d%@m7X=PdPaw`I$!W8{g_vsy<%lus1x5e?yr+Ou2h{f zyS1qES>_+1_g|}V^jZIcreEvx5c>}^kJxMZP3N+qdM*D8@)r-)bJ;}Vc1b;wzxh12 z5!-kVe2I@(&ttP>9?P_LP=3)ifAmUhH<_27!=_xqytJU1FJXhd_9T9U^{hSBzKp&l z>reO+_P*FQy!`|GjPR$dU%bW|_G`>NuMq>f={iQHHJpBlTp6ZPea>(9V=~9+HEuWd zl=c&(S`EV+pX+(9ojp>|FX&a`cZ>HEXg{3Knn%4Hwn$rO&#{Z>ODTPMHhzx9C!*$9 z`tlre?2>nFzX|rRvL_X6X-bz6zn}2y$Fwi{+I=?sGFCekeA>UUooBrUBJ+nmAIAAH z1ir_B>j>q<-xoh8PV8Y!ILthK5Iy&Y`GM&7tbMy;aVa?ec)Ok#%VYDR_G<_{R|C%@ zck6laGR9K;9L~IWGT-WtF;+kF^Kr)ZP$2r_zv=59#_W?o^egcXv7RWpMy-r#|D^C< z#b>l}?`B=2>e0_v z@?1N+K+`63u%=C$RBTyAZDV~yBAyLM?CXglMu?ah`pP~#p# z_6IJ3@34Vne_-PtLTsUjc#jRV_eFSf63;ivGyHm;wt;R|_~~X%w(&GkrD@hpDowS1 zrP6fkdX@UDYgL+Q35|)}aHXW!BUeb;#~;01Qu;eqQf#2hB*g~0L{j>Fk)-hIg_2?e zjg%DKus~A!A0QPP7MW0mo@4JJtc$Dl{XkzDV>GhkDQDqN>Mn;3S zZ(YXL*3HJ}kY9ZIwdi^eioVVM55b$Z@4Hz`ekn3pbpCEuDbKY^Kh?4Og{}+bKQyr0 z<^#0{0NQZYg(IiqbEH0ryZPZ1`f>~KL#y(BH1BtuBKw!qEqSim;{_+O4xFa$juQQK zAn(1 zGDpZBNLeQefJ+(Y2a=_Iv8Px&Qu_?`*-3dGgpYGO<1PC>cG+Vcn|B#kHShLs6PEE7 zAHLAl$Kb%hBecbydo|9L_BeCyc4YM5wqIQE>WuSBc)%IwhI{ll&jh!En|~|*(DU&r zYP|Jxcb?UFA~R)96nv`jM;17Hn`#+%*)zs|$Fy~f%XY>^>g>hX_2wsKu<;J`;%orE zgDv?Xy$;*|xAmoB14Zc1dd9ShvQm%a=lo@K$5&1L2W9vVI^zoz|3L}xqW710s~Y!T z-qwb=u=t2&A8OTFFY&u%FK(*!CV96PjSE-J_eYOV2RjSe~YmrL3SqoI!-7+O@?~gt$X=i_Qo}|c^Ig+AlJSk~+e{{B_$gIaDg;!=t z3ZKlB6xsNwq{vL6y*OWBN&Gw*z;7@2TODtIt6}u~0KIaH<7*K+Zaa8!_Gl`;v)8gc zQ}nne+M_8x_S$J$KD>!+5Z}3@Qx@}0>U8#KhT?oJ=K;U?4IF*&7yNhjXrd3s;zq>p z(VXFJ+@mS{h%U(46}6|eBvIUmuN0qlx4ykcbiqcSN|xXddUABZboD>o>O-BvH?v9O zeJoF?_vu!5(qbi(#owUkgB;~!0bXraZV|ikYw}g_{%zVn?tMfa*H-0kV*c&{4n;rC zkn{b$^*QQs?74|Qi|yR;a~}8buECpw_K`qBX&;C zEPWqbf9`Je8U3HCpEzgfF~%a3-aT|IxNTg!mkxl879+LrnIM|>h5D4j>!g@TVkhm(iYa<3-Mu4-dCif;Ly0b=nE8I*se!#uj|0?_K{BpMpcWfPf_^t3!=tju{?o?ST`VMyo z*7OXGACj#1!TNb;+%+YgsSlP=Vz!U%EyT!{PUxWmH; z8Qeh^8YbWO4}9&8ef?c`Ad~N?zmq!>Zsm@Io49}O>Ll(wOlFTRvE@B(v%%xpDmLTy z>>(EXUWRT}#yzUb)}_5JAGvRUVauT}3;d4JODe#SY#8I&SY{E6eY-3pJhb}#wQ zl68>DtkwJP&~lD_jAj;mnuC0nmmxLtuWLjLm4bUry(EwGdWv-s>4EXY`aMecdKQsIDmDB|R*%JWO^MdPlO3|C5Q zyw=)qJWXBR9%W;$iH#Tj8f1dfpKH2`%tUuP%WNR7Fms2>g$+t`zd>&t@!@L<1QWC$($r{U!-3_g}-!bxQ#!Nrw%Lzb=?Fk+)I13 z{EzpBZ(DAJ%l~*EsVh7+L*CsLzOA<>9QKS;wC#0`J91m^HesQ|6rP0+^}DuVp%L|N zo%1d!Ec77X3#TPh@7>hp4c~Ek${qI?xpRY88Apc;9-s@!BlBSSES+DT-}1P(N*wHi zV=qMha7W2a+);8Xca+>&5Z>D-A2}7cWBW#*T~EbY||4-OV&} zaFe@X)Y*hthMBa$@f9?!V?BF3)m>j%`c5V{bsa<=i{AtK9v>f5JsUj^9jL_Ua=wW^ zQ!O@I{P#omIPtb!TMsig{P4aDdCFb&`1p>lGt4WgPwp`A^AkBKGE!`>CvU-SbsK|5 z!zNi;_9f!{D^RB}$%_|5L+ z&Xsd1<zs4y zvuR88y+}Vp&a;(xzZ(^Gx%_L&2g{wPX-Wo2J?~Oa0EL+%kM>AQ@(NVrEp<_ITFdGq_S!gttf4uSq^%+^6~Zr0a@ z<^sgHc3~rHUs}^UVS=sTIY!6B?7PJRMszH2f#g*R&m}2p&eQbkNr>}NHqL+Q-2F&v zv8vW@9u?m42|iRCC+FBWsYM?ZJ=EEITYHwsSv^OJjLkvs^`=}Hl{-Pa;9l+_cHu+Z zb^-CImX8d7_`!(qP8lh@8m z!1E#S>;j&TfG5maQ(xBwW?%MX4Pkt`+wh4^BIi*@tGP;Gbk0|3dqutpysxt-E|ako zT|>bOoR@tO{X^{KQ~9RX!Sub{vfpDb@Qc4j&d66SH_Wy9 z;ulJ_#*=ruo7i615$E0|x)1SUsBZ~#k<33`RePycF6r(${;>2@Xj}JB%MV9>Nx!nW z59$%{FEZqK^e240=*B?!*<13%awjr#K#8&FvNa3cf!uktrTCEeOX0Y?kOf}Nhhk^Q zU8v3PKu&8Bd(6T4zB11E0ozqJYz+mi$8l={+jtwcKU}uv*8d~8TEe98#h%EofXT5H zLhzl~Um?cfOiA&NUCMZbI0KQxf1x`U@b3ZlVk7+huAh%bm#`nJFI#iof4LvK=*Pja zZ!$+RPZqFmm9drn^t1cZP5ME9GVT5xB-JtnIiva$KzCSMUi^RBr+-|w#`rJyDQQ`Q zZwj<>Ms9=e42Ndm*CU@A%-c=%ff%00=W9AXdCZ!R>Enshu+WI+r6Zr(@$%3I{=Th| zKG2;@4C1Q24Udb?;@FAt^s`y;3;p~~Qt_%U$0 zJufEW$HaYkDy}a=8;cy+kXsIHUSN}N_keo^H@b~{bMrojvo6`*$S`<#nCKn1@y_7g zMACR1%(HRu2=xmN9(LM^!@)Oq8fn;=N=8LH_c(IgF-1NtuDYet+f9MXQ%`1eQtM$E%I z-#|y_?)sZJmwdGc{%ZsOa-R%xNo3;>o+NxRZHc?ph8T32N20_Jsb_8wSnjv?hl{TD zx7(P9(6h>CHO50c2OS}i4^I2pGGczV_D__v$G^#lXN1q|WY^ zgIm!b<&0W};KXy?`C>Cmta-_g9ILd~Z%SnS=Gd*V^&8f8hG19f^2wBa6~E)QBxBVo z{De8kfpSmQ`MnqqfkW=&IZ-$c3O;N&T&yJ}g5%>>;P`^F0>>4^dlWd{0){ojDl3DY zR4fw}e@>sxOeO}V_z&KO&fY3;VH1ypuSURM1@Kuu{1(6_enLNxk@to7ell zcD--lUzU3RO5Dfhb&KwIkoMlP>wbp1#V*rp6sguteD}w#OLT^g#b;(9ubG>kY0v+- zeJU!}Mp zxJTuC%8H&U?YjAWtNv$LlS$iv55ZLc+7aFt{qZpMXkA};MXyIJ((4f_{sa5mRQ!ka z62IxAGtQEYbdfBTXa*BQ8ijQh#O*hrb z0q=5eO)9olDLVV14<5x9O}Eaa&Kh*|gOkO_Ece={TlZhcJI3=gz8yxlzZae*hTQ~N zH)~FZz+#Fo=G&of;FodXpK;?y_TWd3n*-K$*(&qX8tN0BVz#7DMJRtogcJkzvJ?*e6d~HaoAPc)9&#?OgHg99Q(G?>kjQ_jRn;?YXw1 zW_AbC>qy&^UQgPtqRg`;ujY!-urklqyqd9+R_E1RBI&lgnhPb}o>x;K>5jab;gWuk zS2I-7oq07wB>gb2W}u`W<<*=m>8`v(v)WV~`P5Uf?=^SD-j`h!*sB%CJfUF=#)+&% zH@!>icn#~im_n!ZcaFekSO87tLz{s+z8(6`?M3)lluyd@Gy1oqA9eJvsfW*zg_gws zMo+8kTXmMwSs#Os64{Z7^zYxj-ryT8`?qEOBCfy~;1IqM8Eag`nb&6PJwdTy$8|85 z2`~HmnlES=D!ttI62G>i%3sz>`O5Zo`7_L?o$?bCl)t={@?D(rr3XtoQ!(YNJgf@?{zIihQ|KQuJ(De^GS7 zzH`SeaNFbGI?Ro}gqW`WxPQ&Vt-_qhZppH~fF9%Nz|qy0u4)SNbm~HMgBDtP8hb9`un-7#QG1&V8Pl$ageA3h>;IjODPh))F<`+CBYn|Heck+AlIM-r?PU=bA zG4C&)T*4Z2SE(mv-_h4QC@XX_RnpUmZ!Rf5$`I||BF}?~!6@k{VlYZN2ACwhO7=P# zt9~WVH~OR3OL_};_(?j=AHAAXjp@maV@f?~-t3=;X|&VSk%NujZSO8QHG^gU7;N9XQo;k^&08fh+Y-dw+GVq<%{ zD*bAr-QL-fLPKMvUi`kVN=mzbmh_2{=v|}GyDmiU8r@RwN=~46B`46kk`w4%$qDqX zWUY58-42~gbg`P*=vwGqTHmvEt=Z^W=v_LW^A26h(YyW`La#b;z3UX(DP~VyPf2@o zN1CLQ+L;|CUEa>jRNvc~8R~m`t&dG=ul2Fz?X^C($JWPsA4l)n)6p#H-N`g3but%x z5QvK2b`HM_`Q5_raelw&w~pT)elB-pST?_S9c(T-*nD)br_sSme?|v8@~U>?r?m6xFe|^R7r&B6wJ_Fx#yjmYC5IqWg zOzB(bV@lsbA5;1k`k2zU(8rX%g+A6_@}rNPAu0M;A4xyTJM8gPd^6l#v2UQOVsC$= zV&E8C|GHnxp9W7?rGJUN+FbwY4Lz5k(-^@%YQ0J1iu%u;kB;ot|Idj1ce#u~0oRcs zUTm90GTn=ucjUV_;?G@wtby&h{xvB^$P|Bld6hlN(h%(Cq|oMAx&7I;CIZ$R8yC2J%acs`z@ZpkBe5MXO=wbh|toH z_-@PCr#V{MSw}mmP1`AtgQu*Z+v_q8<*$;@*EHW!JKvS)gNfid2Y6(!Yc+V;#Td%? zI{EY+LyfSXM&9loBexviAe790o9kZpau;;kt?uwYPhk8H;$J`H@o<-lrUTCPf*ZH> z`Xo6I*X@XpvEPe65I6Rf@ne5J`{iUGT>RMI%-G9bF4;S|hqM+ym*^<62ks!g!#|C_n{`D2N@TkiA43iMSWj`|B&p{MgBSSl=_c6ZSo(!aQ?gW zoKS*?xrKf2$ER+bL+l*t>_wSBLLbZtCEl4$WooRB)veUgB~{k}9E+VgmbFsHnpWyK zkgn^XZ;v~5RJBsa-&?6;Tw1J-=}sNHTdAX}l{zZzz5vH$rw&)ACUZ;-AOC2jj=Q?X z@G;)0qgN|+yw^${TkLTGrvayqKr3}@YNd{nP8trz_8g~KwT$M?1Ta&K<% z{e$#vex09f@bwyk&2n#pZ%2r==|{;wqro?6R)cT+mImMD{KoMc%Wn+7%lKW&?-G6& z^Sg-OXnq&+8^v!VzY+Wj_~r9^?J&=@BfkK@;r8!$q!;l071HxbhwvNB?>v5k_zmQ@ znQy-!t)fp6eunI^yDMGs7QXrF?AvTRG{Ii5a*0pkI$f<-rLqPUisR*ByW-f$iT3<`kBt5Sxh(64 zRWEs>k>#Ff;W%_#m%ndcV#xP$dFSlrjLs*(r|f3SqxX=pt|)uRBG?+*PbTN>($#sp z&spnt{7sI{9CF}bf2HiFI7FSYry{m5EL@;sL~o#-?c#rAKTiDKMd^pad#HO1@A2PR z(>bm$Ai~-~6|nZkFS~?&-|~OZkYlB?w-&u*!uI9dOU=8av3h)DUU8H6X~_#LvM;DV zGITq4v~PQfywuehTO)}56mo}#?O4p+#m^K(-{Q`;!=BzxMwo%?pDTq7xjyt zRGeVk*V}h|X0f+V!767D9Q?=cyAT{E z(u-@v1}f`h2ABtWMY@^q2ld*etbcn`^nN#)zYLe2)8h5u6QwP=GbRyTjdtjYdt}t! z#EE@0T`?B_30-~P`IIB^bhXW`V~+=`b?os$w8KWj)xphy=tSxkI>@xgR{HaOa=zNX z5TmmLr^e_k$Dys(_&ab$jK7QDO3dFu+G>rzbJ$P$bNmeqar;}F?zzl%cq5|iRFO$P z-TE^!DUcI``TAC19(Wv>3r_%MU}#k)X1Mi=7-#9&_jb1=L5#c=Fy1?FAst!|Ajyxh0_b94a=KTj9gS`QSuxbJ6S z*86=0&pX~sOv@F=f%!z}0vL`@7d7X`aD36v!h2>6$Kh7sop~I1%TIugf#J9~j+d!9 ztgEFEGe=_O4B#x;6yn2dAU=#md>D)PH4-PMJvRIb;{DvdsiN-d{hRAH67Odo@n7yB z{!7Q;(YmvU|8f@bU*;44WhL=nBz};@4w6_q5xs;zOafpc96Cj?@z^XY*#D8vWoLBu6bv!lShL5;9 zQg;XZ8XM=Ws5^7hrn;}CZu&Is%(>N@?^sc{axQSu7YD9+v{ymAn+n>ipuJAO(Fr&< zw|(>#&QSpKd|(EC)*EM5J+mmU$cND(TB+SIH8I)g<_tTLr$W<}FeE3iN5wugH8J4!yRIVYa>5SXfB>lQ6h?61etm+EkYkIa=3` zw)@RnSvRG2Q{9G5`|G5CmrR>m-G0D|x~ah4o;(}D#if+lc;@?c9jtHaI!5ZNr>&S@ zJ#GHVx^F5r#c)|MW}cKQ6?3cSPg_yfspE#aG2iT$IuCqX zm25h7Idu!(V)ez-7~|mJum-#co%w7$E(AvhdAIJ@#E5@*6nmIPhQX)WGtwGf|3qHF zYYI5|e@KU0D*hkQp@YMBCTU(RuyJ_Le}KaqZ5;NkfHskFDZ!(47W_J;6LRtPjnL@V zbuWK0ulk=GSJb`CU1dU(E8wrWD_7KAx_MLGnREBo!HZieW}al8Wy=;v*4)`)UiG&F zD(dcBv9Yc*<;I;kuexMj1w6N@?!byK>V(#|IJ^xF&gJ=Oq0^bErpVO&w#<6p_2?@l zyzk;pHMz5KYZrImmCdf-z9Mw?4f3mka!q7e0y=xd#?g=TSLm$oe}JQO8%MW6|4&w| zsC$xFZ7F5o2|uodEU|6|PaF5wO{M?s;i~bw32nmwaxQ3DjD6m ztiJldy!q8#sB;`V7ULOkF^zu7yijrJ{OZfTA%>mJgJZ$r)8O!IaQH1aRCvihHHMd| zHeU8I4>jUtj+XJ@r3!hr0D0!n&JY_ft8Bb{20xxC|GiIM#eekeDR8r4#frL%$86Sf zDY9(p{Q1@WH&xW_17GdI*X_{QiVn;Rf7n>p;q3i&&V1QF9&dqOF}w}ny*+1c*<6*~ zIA?+%p$`?i4;s3d`LZwb<{a=owW_x{6}(Rc?`j+Zz0H*;8?ie7eRHfiRY=z=Q4K$s^+OV*}>UY6E(lxYU6D2e}JFW2dUA=}_5CEc z>Fdf;XOa4XnX<#A7K-Hnv`TqtIX=+%U_~@}E6ehpu)p zC%BngJz+TyiC>hxyC<6?X+vyu^}pt1Gr)iR%2w@g*>ffSXML_LK%Jt`h-{SoLw89! z+@CA9_`$LH?3blIkDhN1UHy07$$1Of0|q(Ap2j{Br_CI@4X4dh`F}{-q<-C|oE6Hj zPE~EDTUV+!Gt{2=gJT1nw$9}98UCQ}v){2_M!*JqY+>70>eHL=&P5Ug?14G(JfoRa3 zHfPyq#@62WT0Gc7^Pm~k9`LF5fUku1b_2(B^2!*#^DEZsD6@jRZz+1pXWTS?W$i}w z&*-fC7ot4pFV@mtKJNn^*t0aQa0{oSyIC6!;WQfp2ItoZfBY z^y=f`G-&s)hVt}Z;goj@XS}31!0`Wf@5f)n@@PJ!>=*Eglp9yU(h$HQsF z?w_CX#8Fc?<(>ZC&-YcAvSH>xZ(;6G6Mi-km zdYkP}1gAk8r)7i93i>GPd`=vN|6|@i+7hSp9h?H6!fB|tX*R>@yEkawuOM$C-jBCc z8)kLne29)mQq#vU-NaBaC|4$OFnfSmMZ9Q{XAjtINFI^p<+MRr_NZtZSY%2I`RM76 zeDrGB9O-Q?qh6VR^jP&V|A+r-ZlKQix#54PTV&W~zRP)mjgr#VZX3Q2nL~H;U*x;M zyPf|Hp6+h9|zAKTOhdRsEfRWA17?4>uI# z#O8;Z&$=-O;hP8Ea^MwtukZjI*EfUXY8wvKXS>W&$}AW8%$TfWOeQlXs!nk71hK6I z7sUdf;E89wrjcP?CgW6)18y4UyZSrdR%c$eIdUYsi!GaNny=|&j%j-Wve|Fbd}y$F z;JW`3&9}{OG2d;a@5m8!8b$NOx#?qWr#+!tXTEDkKV`lJp1)khJv;L9y*{rwoK5OT$_F@a4cY4*14$25Jm?WE%zdad<_+`${u-S32-E*yr1%2csHI`=%d!_ z3X;H4Ixu7aiw_)S5*sNA9C7C$I8x*CL|Zj3<(?krt8sb4qsOJFO~oLs|0%fUHiN6! zhAWuF*d|HeHGYCgjO}bs#Y8t_>vmNzhoIMWkvXJtGGkjd%e__P%d6b8F0yE~zz-~X z|AVX#W>^oY@xBI_uLkz3z~7bO2JS}?*(ZBT6upELFKy{nrg*6`pFMdGa~EiH{5GJI zecz}%ZZWbIFIDym4mMA2g_pX(|M7cGenxlPlGe2)FC7coyaasAAC&c;RT{sm>vq4@U<_^YX1055TFO7EYky;k$9Gk;_%TxxkuS%pJ2Ce*9O zq?LMiv+gUrtLt`K)y?X4C#YBPT$O^Tngaem_c zb($wn7aAeosgkmXCSJxm_LAxgZKH!!K4!PwoEE-k&(T5pln!0j(7&CuE3!c9-tNEv zO^O`Q=gWAnV92oA+AzfPnE{{e(fWAhW3-K)Q~8JE_PedJ;m%X-x3OM}Yk!s9{y{aC zY1Rz>3mp3;1uqh-OYFJNfb|t%N`!+?9Nwt0dBf-`x>aR<+3Dsg&RI9dM+@FCY~Jt> zHm_p56X{m}F>jpQk~fCXC&k0Sr+5SSF0kp#nP={zkHQ;Qkv9=7dG-&e|b{kHc1NfiFwjZF{Ot)@SZ8n_)t_?bKfSkW%KgHE<hUWE>dj?J?gk}BCk6soQ|OW0@}$( zUgO6o(0+^>hbFVTitfW%Uz;Y49J4bt+1mNg?>U1ndjx-gU-3mmXYh--eRE{)aP0Fx z*f5D6W?fTXx}EP5Q|yy#HP5`u_twsU{wy!l^swdFU~>U=|5te7w3fUu9T*iafEPux z;AIBw?S{r2UZ|iy!V3$?n}`>V8`EH2+EztJ_zRX&K1R#_o@Ock6)n%|+=P}(1%Kdl zJ>P|v-;r|P2ck1LCo+S3iMrz(d7#KJe@rsA4#Ll}u-k}eR^QP0`zB{Ct!H0tA^BeL zc=s(QPHfHOc1m{T=Wv!8f6!9mde+dM$TNBOmiVX0^Evl=%U+uZdyiLhZdU4PaChIg z>}bP;bC~y}%qQegb4CI82UAAM|4GX8e<$CBHtzBqReFWs%5ZbfRPR7|Fl`P`9=)%K zcuk8r7wHAooGZLb1!iNWmaS6P@2Kl0Pmg_7(S`}Bv{_6)Tx|{ZNa;9dpF#6y|Dg95 ze+6CR`~R+{^o4FRSM(;2d_TkfE`Bu!H-gKf0w>=a)}>)1w0=H5oA{c?AJ1-jJn>bW zA>-o6CVUos_^)MCT9fhYV~^(qzRP%ymvXc6k3XL0wKkq&_b_&YLgUBLCpDg)wAi~# zq@R;Jnls|Zle5e%#*;F4JL9>IJ3}ZVbqio}{tyq^=z5 z`nmCZ<>2wh)3U!eAI~QRPBot0{x8S#JUyQHNnWMS*mxSfO`&Zyp4gRIFVb_(pRSR% z@$)Jekatq9{mA2wC-!hc{#5od@!R?SF+L(Sp0p=pEbn&mPVC>#+{+c?PtI|-7*EQi zkVo;S*v6ER^6yG{{=4}m{P_=cM{An(GBCF~o|IGLN$QNJ)U}Gb{{I@!bcIXd&+~qE zJe$uQDc=;0kJpPDlKop7)}4&qp?osfoxROG>KEK7SXiB~v&%hB zet~Z{@X7bb_%Cx=4f>MgE0BCVuM#>Ccxi+0>RTS)Bqnr=_UKElv}fn9+1pU6V5Y3_ zfz&&Ivf$kW?~Gql|J0G2TKbHH&%_o$wpZ7kr^n`g!>Ihg-N#h>8d*z_c)g5klQSn0 zH_*%a!Vu0MG`K|vlyfIO>)+H-%NXi-)alk6S4%(TTZYwe5%V^7TfEMG6Y+sb6)`b+d}V`Hte+|)y|@3?U=2!W7_Sk zP0-HYX(utB^}3DV`B`vuBDg&d+_F#Bw0(C9#@lU};2(vHLjKDcA%}0Cpl-qUG6kF1 zZz3zjUh-MD0C#KnPYko6=;C(jybqdKeS$RM#OqZsGJeBt7#*00@}GFnz^v)wS_N~O zHC@3h@pnb1)@O@zWAu}5-T5ETkI;)j3;{1b4DYW-M2p!g9hkmw{9gQaZg}fgq(b{; zZbST{3b*OBFXe(K+3%pWF1(X?<-rW`EeO0?-|q-q!ET&GRB>eG>||43YfjIp=St^x%UX6A2yFp@3$hk0OH&pftDZ8O0pZF5W4>Bup zT$%6Lt1ht|WpA*LwnNQqhG*%&=s-dr|8r%1=|W{QWLR6T;yv@z8+>oBpE+@3648pb zq1C!%rBSAI_>x}1zUC9uEjVp{j;XmkacHI%T~m11@hQt*YStwyGY4>QwL5dpvOccZ zy5z0EsBi;Luo+a$jVZJza&{qkrJgeSQ%0F5$Xm<)bUlVTo@Q&j(0uF^Ep-Wv&w!Rb zxN$^uvCz`2#pAD{PNAg@_<$T*N;_4~nlfH-I2Z{`!G7r5>=Q2}E^Rt8RdAod`7^0! z1oZ@oQ!DS}zn}kYsdp9iI`99?v%n#^$N(3?T}k1PJ7bRE$*}|bP_8*XPM5ZcXS&*hniK!x@pSKl(3Q}0FlkhH(k&yy5=&pk>7lDG49~c3R9MbH zdWk!bLTtaGU5l4Y-!lSOyUm&C?mowX^$7i0$UA4A7z|uNzV`sG9CbcSXh6qjl5s2~ zzvR6|rNSeLZHF7LxA`SPI7? zv(y-zn`tjZ8RMM(=1ktluRkeV*EF^xcN(g8c;~b;sI_+fw`n^v)@nTby<4=i)9I6O zcC1f|_X}jdLQ{W+_!Pa2%|bWlQQ%{dFS4Im*729p#-j0l{1|%8Kd54t>F1*lH~K9c zpM~lRZ908vy-hhABeKS@MmK9)>_KV!H-g6`e|Yg#Mp)WS)Lz2z*xeLQQ;stpKi>LR zd@e10Jl_+`@CW=Thw!6t4xY2NZq8e}I6G)qGtc#}DVpMcQ1CQ@x)1VB&VEW9V2QUT z^XBK!-xuKQ-|)@m;hNXAj7qnjDir^{KFc^;J?pZMsb`_nM!bqY=*L_Cq1M7$hqW!R z>NBB-f%6D(MuDl4b~S8TX5X&rmwT=5>$j!)zq zvhZ)ZwYEUpl_5DhQ#0Ij+3`O2;wuv!!0?OTA=MK4k1iLvm}%YPjB#Z;-!fSS6`z9K z1?;o3iN~z*kZA>Y|7-FF1x`<+KWw-12c}v7Ln<YeiQ*u_diNM zvMj&Tk1f&%)7Lj0>ptlC zda@4Ed>kIN`!Lk5U;6O(R{AiBGXQ!VGUsH(_2F4nM~0Q6QlFKq(sZjWsk0W^{LTSq zZ8Qb?#5eWl?5g4=9(+HcV-2gX!XGs}=C4Xq{;Kic={sq>(8ePPzF!>o{iOuo^W(n1 z&-aFP!eedW^(5p`GQMChKH(I6&h6O4=4Rbd^O#TZ7{1)k8hPwo`n71vj3ed8e!I=< zGgg=HdE}W4cwaQTekyTMecWft`bdxA`O&|&%YR1Xx%j{(o_ZGZjWefup?Tr4 z!_a!r-DA$~0>ix4554Zo57+Q4G`TBZ^XKSSHScLU)%S)8FTN~3GxAQo=BLt6-M)Ph z{F2>|Hmol1YwQmf4@D$U1h1SoM{nHj5 zg8gHTj+e$hDV5)^_V1MRVo%f|&a%tgoG?FofK>i6JAZaB^Q+_KXMc;zZ>Y6M?uYDc ze$smWk~H=PkiSH1^Imf1k9`2u$IH+9r^;Vu=l7pxzH_|%tO=?7Mps>b+3DsR$IFl3 zT*G7MH*(CC$IFkNsPdy9EBLV)mba4M3oQka-QQjPQ)v+TTfn$7h9zF~p+eppZT;c* z@ja+_=q}E?4bD5}Y3JQP#7BWlKl<>+(EUZw|7iH&Lik}6@%`j1f!@0yv`uW;KO0qx zmUPG0BQgluDLGWzu=*}&DjOfL6Z@+_aV(12!{Yjde~tS#Jzq<#r3bDx(psBKWv>x> zIp-sFOuG>JyJ2)Rmx*5J&ogfV7eZGl=;Ka&1?-Y0@f95ZhS=?WvH8RnRJ6!F7{X`0 zn1e*e5gL{}-N++yF%y4D<{w8Y8Tux;oY-4*v2<%tUVUjNJ5QN{=a;6Ny!quLxpyJc zx?)0osqieYV&A(=CqClI)FJasTF@2F=z`r@rv3He^Qi=PeW1_D{`190UoEi=WUl!f z{(kP;W2Mhh_AQUZqfM+6sI#f~Wt!j5vF;>KID*|Pb$*V1E;dd&u&#b-WK{b2G4CXe z^fsa``;u;D(-+}gp@p}|yNBn`7z=H8bVB~PnG-$GNz*fgiy2b|)2yavpd-Dx8-W;E zzotK-e9kHJb99r>!GXN{1K$knDg_tuyE+6ot^WMuixsi`@F8I9+#@t1$pakcq z_x4#sEL0ct>V|H)_vPv~&~f8gqLdZN&l#f=<>#E0u4pYvTQXkJ$4@=2_0_WMUUYhgC0>+t12 zPuDs4mc$m7@)4mm<0LI3BK^$gPN4iy%0CJm!6fm=Cdc~Pk-j?b9vNO=nhjlw-}g=4 z%b2MD_){&xWm<@5i#^)3uV3*na^sWYhj?2W9O~ zWTDe{KkdZE9e-LL|D|t@eb#&AbLq3tgTz-*yaK%5w9uNh&}KfgspK29xtqCY1~Ncm zR*%a*R_fqGV%-Rz|BCuW&R$PC6xw@uaxZY$-8#jFBae5#^YrFj4=c-trBKnC*lpUk zmjx_R*Tr^S!oSn+FNi8W^JmK*Rdkay^L=92y6)8R(^f+x(ywyy75p#v6tp1*V@PDQ zrlAY@KK&C{RN$S6Y!F({7rNsABNx<{PAp=t9{2xF-_r@$SpWDd&!6bKeUA>)bqh=t zl#%{?MJjleetgNZ;O;){Y`#vWv!(CtLpbLRFz+(kJtU-+!i zPayv7#mu#Xk)sQh&n(Rnz7|^4c-B7JfBqW21b(NFGOx-1QPeN6InOU78F%+O%b0M# zyRVs2Hcs7HmNM6WG&3|J*VkrbZc5Je;r3-Wgr~k_gbOWq*c&94VB1j@!L>!hCcaZN z3@JS03;!QhzWwgj2A-EIxs@h+r%NVB&NPE-)8KoTIpikMjeA&CMroE+%_UQqBsE zf6#423-K}g`lKw4GGB=QI2ZrG;k9kex7=C#LfpTwo_dC}A7#%;%wI}A_^jRoLgTZ6 zCHTbk;hsjfec8qhKl+IqFEO}215SzYw*)#ZJDNO1%1lH)6@PJzKBQUol$*ZTEpc^+ zID15*?)3A&!y}^DZC#BU)c0&zlpRZvPbl9FKtOVX-{GVN;xSbGS9(N;dTBs z=`Q0WnJ=#gb|uftYr=61EI2tL7ck>r_^7ksJ;x|8R*c^+c;`a(u-&w6+G zHpXQNbd*x=3HN0EK=f0u-<4a~i8ESXw+;7rC9v4D?DP`Vp&-#>b zq5Jw=Z&}-17x94Ip{Me^uNz0Z9q@&FW+&xNXFiw?UQ6DnFBLj+=vw+7PuExTU+DUN zHGgDT&+uQ=Yn zjJ`ic;XTd{J4$?@pR>c9^&yeF?_SYV?#g&Jm$|Q#NBZc4M-F4J2tVCGzm`pQZxwrF z*6w4aE9^Wi<*(2Bj=5dw@nWN8yG$p(?_Z%$k-xI9+Xy|L7i^bL`UJS2&9k59BA#dE zrQP5Pr+0zA*$?i`b~8SYBQ zgUu6LB+l(K{1=_7<}>st@`}Fp!2~UrH}Flpho&5R9@!#iEoQ~ng+219Qy2M# zes)u*(BPgLq9 zz6V_;kY^?FXDQzUS@%xgkF zL6K$HBrf}Ig<{GnT@s&C`ZexwYNpaBw@i)C!i*6xdlFc)q|udSy4&1Kbi z`&}yiEyLd~Fn=_Dq^5uNhtK7^%$17%LuZ(RLzyRzz>8ViidbvGZseWtcSNPKHmLV2 z%39*%V{E#`UpgJSmHcAgJASNlDI;_%v2s7Wab(!BzbayN`E2@4wU(=QnvM%6)|ZOT zC%S{a_bAm`!grCY@AZ!Nbv52I=-h8%7(G8|@W`5loB7W5 zeomSt{FcU=h4}1u_hG$_x@B#*E$!SlWx86ks7-2IvpCd7uUGU(_k?z%ieFhHoI$_; zX0KZ`F!zXFn+EJ6kHo&%b*7eYndpc=s+h)NYjm^zgzr>%pir$pG`w|&*E&DGnvXIOY(0XBGZ9+<;B=~IL~8i{z| zeRLydo}NbDTJr8e?nIKj@D;XUb|3h_+ro!Bazg8I?c{!0N1lI3zXc{oo^R*B(02r1 zs`iJZBFEFMt(WPx`!eQz4J>lLi(D38kKk3tQE2`ssWZ+Y#yNF+AT0Fnx5us={WT>% zW+rse75a%>%o;5H@h;^i>mP89SCx4&Sr3CH1C5 zTXGMXjD2T$h92=TZZQUoSyL_jImsUPi5JAiUB{+v922=GJy9F$8Q*f`T-wY)IF)?@ zGT!T`)0s`O2nGwtzcJ{E~! z6&*tGakh*-G%0vq&l;Dkg~@($gZQHyZ_aR;c_GS%xurfv7oxwgR=Az*nHWz|> zbjDB78NWnl{5D_9C68OlCDm{HuGfj&$@<~=5#b%kuVvV3a_6hGCFjI;LqlHn(u!Un z@iav4$lN%Xc5Xm6i4AuyeG&Ux-^H3~)q~%Uq)*dyo!Lpopb)Xam}8#_Qx4laD)zZS zEGK#Qd)|pXUeg|ZoIU-<j-Hv zc&uTJ+JS5FN1SZunPcY(Fkauq^2yz;8b8mYdzT4K5)-8AsJ^@PTFTz$ypO2&m2yYx z6}(@@do{NtkOkY{Ns3l&NXm_@O;YmbkJxIqPEq3M6ff{j=@c81L|<33LD8(*zd_uF zOB}h7Y88>U7F;WReKU1eOTFmq2f8NIE3UcxI6C_~qeN$i_j1gA;KA0rD&;)Pm;Bdy z*FfrR)CWJmI8JA8gU-HoU=!WzB!%Nts|zVKx<&SH#_Q}?;D1s23cTA~UpbXBkq?q= zojqO2-}P%pfxl6?T6g!x^x4lD*XBB1=s0?&_*ER4T>il*C6mi`B}G?#k_3%-t@gCN z9XY$adQ^1T=204_{sBste|2+GZj<*Vz81Rtv2o6P=Gt2StpU$+5BjHWcv#Mbw+$aU z1Nm9tGIwqsmAhltsAy!vsOY=kI2GA+FY7H5yMDTR(UKY5f!x5_=I&0$1j)D486(aZ z7m?rg*;N{xG5#(8#b>wu4e3L=@>jnxP}Wg=)?fG*S<4wRp7oyNEbC#$PK~#bZQjXu z83*;B^@^!>-P_)jx_s74Qhtw9Ui|f$)>O(n?bO3l&!Kb5|32i+?Pjd%#{8N?d_U+j z`fQP5dO0(C ze8OsV&b6C0+|x~+TfSQ4C-&l%jMO<(%JY8=->R0MWfqf)+_@PzvpKi? zaNN4la@LJzphwBM<-)OEwQi(fp>vCw*DQT2U_T7Sb12ThR}lv&*Sg z^1tg#g@0t7$XQEr){!KxM8g;Q`xks~GOmn82OIa!Sa|ub#`P6Ft|F&K*yHNwTcpSt z7wwyE>x?Tj5(VbixI!a8@Ly%GXksZVG@XuzRwANad^vQN>1_>_Lfm>*_LhjS)8$X;WI zK6-bBKGsT{DW9T`PP7;4t=HsaY}?6yzHc9F(*|eQ<@+}N3mu$e(~L{rPwEw;vwGyF z{O>O`;m$EX`d-sS4fXk((ZpJ4LTFOa1#k;p2>i}@S%ITg$ze?!0qCN4D|E5N9{1W- z=wiM7UE(&z<9#-8#p8Vz|J69!cz;vy&AaJ)5;a`L#CRid+>q@1joCcVHdF zb3Cl)@L$22-xSsX@v!nu`mOaP*7+zSuwF+hux|fkREzmX;A;)8?UOo1Ba6GQL1t7> z8ciLybkerU6jE%JG;Ed7H@|siveZAVQ&gUV@_bJx=AuybVJUOJUFM;tWv-HZztv@~ zkmn-(JWigU(9f62^HciyVtJmgpD&c>XY}(3d0woa1M<8?KmSsmpV!Yr<$1Y=X*xES z;5D5&%+Y0T=bg}5|H-vYG-LiMiXI;!Yu|u|B*9pA>xxoL3oH6+S*gNy^sH*ev-&`1_QKnogB3bqoURTjlstqWKUq0&HOw%sg@VvM7@r0_TJLj zNQ7n+ugft!Tr(!+81AQ_9W{4i`gi}KPB{lo+PD)xN%n6Yp{(|+^iO%5b0SAI z)Ro`3vdR%vTIb0Brf#PCE>2IR-$DyAra1l!y}4H{&XZV=jLVddae6Fc5m=1o8uQ95<82zu(uZthA$|sk9%DeB?m2xJ6qq?E$ zTHe2L@IfE+y2AF6vm3B0Uz;F)^9tKfF0F6er4g4rj4zf$j^<7;oR3IQ)%+!+oWna|R^iko{Nonx!4nL@y`kMT{wCwaL%$GV9e+y%jvObm9t4 zWBo7pqQj&efuC*bzIC0zGg1GF_fppvT=(8K!FUq8ZBlzP$4-)`FwgU=!o1n6d)lx# zp}q)Pxl~5ne-28*Ady-rn0o$Yw+l2i_YHp49pMwj@>0#R0%(wCE-#n9V zlCCiA6F;_V;w&?#$D>X&=gw8w3Q{JPZ>0Zzr>D4_GE%-umG=~P;+^}e!n|^5=KZTo zn7qn3-dG%8FE(sFHmrxXd$IOOY*?IJ!%cbjbkl}ixA>NNsqZc7+tBX;-$-m&8L!wX zF|=P3X2T}vTaK9PQ<~eb9xMM&g8s7gUTjz!Rs#2n=+_DA+vC`QZ9X9%#i+@;u5}YpN zeGxwBgS08@#}1QI2B83=Eb%%mXvtI+7-X}w6ZA_kV6aP7b>`y}WH{@m+XRp_Y zZzp?&e`c@-Sn%4D@m9`-rxwT6e>i`XQMqK4Q8P(1DwlD+mFx0R=PC<-lCi-R_eSOK zc{Y(}>xBp7>$knkyY)ZKsCiS{T)BmJQ#9kiTceEq6{E26Mj3l@ZfDN0kM|#IO?pY$ z2p?Rh8K*~T#wPg0))UgF^7Z8T9n`Q|zIRVstoW*sSWAu;>wS)xm8_@yH+xG2ht*E_ z7@taX%I$*ts9#mNqu#2kxwoorcDGOKHb7@??VG9%E>Hb|5u=QcuN{THO4euattrQn z^@G@w((aM{;*TfmlX<6&;#}aJWp$ZMP2H)C#uT-Q&yMV&R^%?{DdmXy!rWq zzE#8__bVBkP^@I>*F)ix9=a``Z>DdRb01JLc@gqhzAr$Y2g~Bj(WWd;SS+&Kst1`Y z^^B(cC+x@S!Fqtb-A#G?=I2fF*jyLWL+PnI$nhs*x|sfp&n^E``F}J2m0q!8klDa~ z@9!rVpWHtISg?lx*h(Do7RgP7j5~cb>w)2Ykr%Qj!L+MAdMtH~7-Q&y@kXZi9zndE>bdxIOMKb{FnW}5`WC(8`1eW<0bx>q}z0kO{n6Ib7@cb z*}fM#k+I#U%6aq;xz;ddH|w0+S#ZlnF6>k9WA(Z69zWucE6XRa5dN|0RcJ7uc={-d z2LH~tdr=M@Tlru~2+F0k~3=XZ^(h@mWJG!8uDuWye zGVV-hO2)j2I&9i{($epdXzMM$7kyvk(uPK&tLMorBsxCkG1Eq{b-mElpDFtZdS200 zQtNcJn>>8dujTY>ss*27{tJyYqpN43s}gK_MOUmXx9G}myzGg*qE4khPjEb0;?8fV@;H85B6d|j)sDpV zJ^KGC8`h)u;MwLQrtG@675eIH(N|gv^wq_tuV07LR{~`}hQ4mahTGfQq_53Kn&ei# zvLl7xWAzM0Uy1rDU~%?(&ZBhQQXkV(+hp^Y*x}#sPT)|$+O;{!a{vaSLS z1F#>^qj$;pCJLX%=yTOrvEM0I)6aa5u3$dvaNR84+2g;emGOVZcfwzlEsXzt_R}l= zS{gq7{gnNP@o(wC`1^;CKg(LrDC0M#2!AE&uhCaqb}_L4tt9F%@vJO_&&n6UXHSRo z*=Ovx6ZsvP&l2@NP}lZRCV%~o{)yjX%I_ZfT;A=c&X3{UlrBv?mI$r9jy({}V=+97 z%wuK_ifR9{<#(dKhmrlrwN?|!>CN%C+lyj?-Ny@6^w+p zEZPz|)I)vOLw||y0&)mFY|Eh@*u+AI@@+S(&OZje6+h0*6=2h?X*pJS90Jw@gtEawk3Gi_rQ=U~%GI{tRk(UPgvqll`Mw<$&nD>G=-V^}&jkG){{N8w zMY1m0vb7HV6#82}!8ib|i0nrvt`J-6EPMUJdDUa-!~}gabsfw#`Rrx-C3I-=YLfma z?*er)2W8t?mjPR$Q`^o;7g&eTAGW7uYf0=RLBIQ-->xoDbG-@r)6_fDw6zdFVrwM{ z{k>?~T0NAlbr_t9-unDH;ngPkGijrTF8Fs?c2`G5FG+e5^$Kl1!quihQx_&Ex>~5- zC+S_S_foIuE1^M~u0$^gP1U@awHY7o9xYLuy#MDDj1O<0fGt*8Rnx7e&feQ5``T)A zn#Z0}ptp~KqtM%rXs4!2mazrq5nyY zTh^}&?e4(_mhp_I9-A&FHPI#Wy8$0ym&9l$2hnADl<5QH%UWzR9T zYnQR#cjNs}Luh)@P0;kRaGD--9-5A#uKv)p(C9hKkFfR6cHp~>Iz|5+pf8p5#rND0 zUun>KhF?(Ln64QTi?nI{XFLnmMJXZl{rV^0u1>M&`(LzS=^~51l`gXA+oR~azoPFX z{c=U$;l9Ka+7mvuX?&8p@1f67T zj9coZo?zL!!FBT+!UqMcC)qzgoDVeicnTk+hwwo)cBIGRgA&>ucQtaigDH1g;)RXa zIl;WJg7P*mbhUWl*VJY6!d0#Cf|u`Y8Ql^uJcJ*rWVAP&7Zy=oWb}bpc!6;%UKrmx zFRUX6UH}KkG+U;G^1>~Qf%s^wpL!$l!UW!*xDFlEtGP~-=gKxk##GQhkukYE8`lNc z_Of)^6jP`D4L?Wh*{gYP!z-rA1`U%Pql4hJ$kJ({vg0xvUcU*4*ANR{N~h(t4yP%= zNo0b=y2a*{|K0fib_oAFu7LjwBk+G_>pCrpy81(p!msCmL$FTU4o%s0W_4}SX%A8+ zSf|~`{rPm-mXDis+9B#apH91sZ$#$|8q-{-{fM@NSA%uh6!naKNU99_pR29YZViP~ zI&fMN4yOjz!ndaTw@BUD=D1(6{9;>97VvHxbt*Xto!W9T-`xbW0rYXRE3Q6RPWI(l zYjW}~U}nq7RkU$FIav)|iC+2l=*TvECk3Y_IT@|)d*}%=Ht1?0*OugDsq5zYWQ+bp zKHjU!BD2FTMo`d2INpi*|o`*3>Yagz@u-)uaG)N@ZOdIlUk7hqo_}0 zrtOD^@jvkuB`=Fj{%4NpMeS=@yWT?|LRmGRgYB?)(0TZun5yD``n7?W`B;bc>hFMO zq;aoi-15x^vG1)I^9I+HdiRV@-nnNQ6M}8vY;x@FeI%R@Mx2Ka>cL@8_(16PxaEu4 zHt<`#3)C581K&yCgXP6+?j^n)?1L4A*a#axYLXZGsP}yGB302=tln4Aev=J+BW;Ds zi|f_1Bz>wXlc4{Vt4a5_5Z^IntkCEd^*%|TXuWTV#s%g@CmUZKMp?!|Zk?fC&W89} z);A{8)-qrp`aF*3NoT{Kcj5V$5uQi${HliV?_E59H^Ot_wTHhA|Nb=33-KRA`*WP< zKRXxxyq4#is7K zgvNY*hWfUN{fKPz^%>^dKa=@%=4fQyn5M!USy;>PuR5f?rC!5)$n|z zT3e75w6?&b|D7`84{TM}SiMGFWAx9|l^m7oO8j44lXWF0vHSkTy~wps>V8Un6<1liVy?59!aV-X%;!&LUVjqnZ1Q|ZpS$TUwfBK@%rvdn z2hI2mn^3`Rfys00ET2U!vY#UDW@fiLJk6N>JDSoM}&-n)b-(DYeG0%jC z{l`2qXSYlCfvEU^wbpxf;7kYBl=7{>Q?2#>lDg}pUSbQS(dglj^-+r*UTDwCaVK;V z#hBYL_O`%4&Ww!qonmhE9AkGs@mStI))iFh_hpE`H{(iea^-9HWz<})ZQg%)s^R|R zF|}5urVn$m|C*|3;-inI8XtbZyPF@&+e6vyRa1@1mnkzq+w6X~FmKy?Q;lQKJAAT+ zrg9_CyJ(vaZ0DPID9=2zT*)KzknD-S4Sdk1_+2uuxP)h8`(^pYU!Lu|VOWlD z!pL0Tjl=*CK^x^I@y7n&#~c6dlC}B&X1X$t6leRk{xRP8kR7+jug=>1QiV(9cJt3H z&h+2LZ(4C?#rAlkdO+6Z(u$~zPoclRRmB?zK8QE`^NTYp562tZK8rWDAB#73d>L=- ztcy3^Jr!@fcP8F=|J!(DmovdAA4r>n;*I}vY8hKc(AKr_#!EA`jBeh?@^(AB6{i$x zWhu^r%!=FMjnbKpjKAGZ{d41uZfhQc&R)8v@_yP_KpT(HMj>r1p^asR|ZKY|kwJc02E= z!^wATcPXYyYwbAMZy_o38JU;Rl-GX3<|-;*nS_V-?r zSxTR^CzoF1r_cWOJg49O&RprczdKj@?vLk6-~Hb{mg%Seekb?z-`|!i{r2Z^rSJY* zxYBq3v?XTWw{%o}_vi4O{`<#prT_l%Tp5FZ0$0Z1AH4_uP@5cXR}?l5l&d^62;HS6lkxToY^dYk=a-v>_M&94{E8s_c6+P!DDUar>e z+5GoMY2$x{E0GnVyJakoTVwfO;LIJnxS343hqm(DjxG~CmV?9mL4Jk9{IYTchAgI7>d02##}>=;{2hE( zG1yzqdwDm4cWGIiqu?>DKwupj&kOQ{y*}#x@gO<3HswqR}zwHw{*6RQG;1RjuhM zr;ZN9vG$-JwxJU~L?3)C`XKHxwQjN!eNgkf%cpe0RoZ6J2cMt^_S-t3AN!w02b3WD zf6s3{zdxb_@nrJ(_=zjjHAY{~69v#pT9ncva&{bsMKXQG$yC)iZ;uDR(^zM@3@0nj!!h+n~-R{pOG$C-#TGdhX2hF9UwPxi070m+MNd{kcBPwKLZR zT)T69gljz4Las?%mvC**_5Q~*-6PC8)2P$k=dnD&PeGxxOl*UKLPuEvx~Tx&6eW1O zeJA>0XJ*Cxotf*}yUNOc&b4;|{J^tmJ2SW5wli~mXU-&^$<>LB&D)t-D)M#6V@iIz zb4|P9)0LdEBlnXgX^7P)jK1k-kDatGp%~_srNx-P-5;7?=#4`jNB2HoHOa- zF=#@Kh4Z2dI48M)as^2RnF}a0ZPpO)8potbLfPji)VFW}iDz_V~?rW*GWt}^cX zcOpNuvKV+bZr`t(CEYHaME^>rtSv(W@Am6&5`jxT^w1#uYjD+G2Tw~`I zS~4T9SiT>uzDH*8{F`+8$J$C;W?aU*J$XqF*|I`ph>{iGTC(DvVNJ4vb#}5YQ`WVg zTR0Be^EzzMG1#J`vA;)IdpVrm`S?s?e~0dG-^0G%SJ-==e`=~)%YNS(k0Ca5EIF6* zkwKZ;zg<1EZmKck%c-Uf92ajq2J~YZI+XuTdr*{hvbAl zHr1#WcvMU^%Bfe@G5&{`k@yv+@7z2`K&#{U)*6R1$*7}FH4fm@A+&Edj%XSOFqAgm zr_Fr6)k41w8OK2uF)CkXarihk(&pYX$Z+}|aldzjGV7#_b6U$~wua~R-uv36M)}K^ z8vc!!D&OY|>r9hi-{;@fc_aQUmqzq`(yds(@JglSODf;zE$Xh2dhvZ$WQO}bTQ%?R zZ5V8I>^>VqzU0rzvwhG7{c$Gm!nVFsm*e~3BPCzNy6@MPEZ(a3peM8t>$J@IJU+ z*JzdxeX%#Dsje3_^0#%d>JmAXkF3Z?R^-Fyk8;kv)HjCrrp##CSJ#31%(#+iD_kcu z$=Y$-cF48vZ%1D!ACq_Te=Yk-9n2BCXD`c(u6BD<$X#3h!76OmRhcQ|uI=3^r)=wI zt1>GNugWa{7tcSE=eax|RkrmM&+B;pCC`t^^U-C!uk>d||0>(q*1o?{;d~0)n|EjU zp*Jqx*QoMYYvgBgKR|o;FUym)A@0S?luxPsh&;v)@)$?mQ0DCTgEHq6jxy~rtxSuW z!2Lw-UECuxksm{?x=N+*#niQISzc0Ka5i^N{l2-g>-T~;fz@Kh4bId)=FR-Ka0Z;y zysvU^;!M`<%i2?OkK)T$n=y=P_NWg|k#z~?9-PfdCX9*ut67_#lhsgMkf z2G>g3UW$E^&i-c25go`$l#DJF*l!>oK(qbLtTPlDqU7c~ms&Pfw33_UiuRI~%(V0M zd`iqi@?w7TJ~=TDk`wdu9N$^u9V$Mz)!{85KG&+;dFM`3er~_i*h{;z7ieb1oyLr} z?lk%6iYvUb53|{`>h{g#uO;-rn%Y z?}-1&eY-Ssoi^+8C&!c)p?_kqSv|@wT_xXe|9ZVmyXJqP-5Kl;btf!ScBUKp)u7)3 zbfM&3c0#-2LyE5``I(*2Y+>gp?x7=S)d{V-q1B?fnz3kEo3eubqKjko1$#|8P06P2 zF4)7J3-Xe?7w3H@bG5R!fc{F~=S#o1|7Sn5?~B~#zJ-sumvbHmC$OJn?XU8B^oK4L zJrcw3XYTn?G|9e|Sl|($Nv*fHEB8W^`}9kp-x&RRfmdLklS!Xlq0iqEPyMjBwkf9l zV|j7Ecq}iWT737o;zfm~PP$IPEFo~8Yu#_6Z}Oe^17&?={)O?N_uDWw_hu80!iNRe zUp5~WF2_z<(!_^_%U#?HAI9pFEm--70V_AKV!fomY7O-zpTLd)KC5X{V!$E;MJ}eO zz9bi~wBWW*aK7NzdCYaam|8H>>ts()PQm5u`%d^Y57E;+C z?0#qI_eu+=_n5TcXAat?g+=g2LQ!E}V&bp!M9wH&q7&B9H;L()xb5Q=+BWwSCID}9 z?1#`@0=Ip#KX_2{>Bu)6X>t`U;4YQ7j+K$etCGQ z)nBboQ-8k^UGvpg&&HjR_RM$xoQagY1;@%CbBguyD7N3+O&qS`Y zS7j247xqQ2v9C_#8u5zQNM&7=Ro__SJbNvB3P1UEGre<)XCiw%K{PA>6_2qt#{Glu zmu5eyvSdx$CYn|D(LcXCjeTj=6-;BvNs(#nUf>o?V|R0J(wNw+f;*GO?gV$CG&u+`aTIvvbJ*uv;`rTXwcYC+r ziLE^fJmi26&eQzd$~lp1=A2OYis17~o;S%qe@J8_Hjv1t!c~L7Hzxh-8qx^%pF4I3)WabHw@69{`ajYGdGtipn z5zT?uTI*vaF%`+@r_ISVVt<-z#LdW6zCp}gF5_L=WFC?^@@r+ivdTwyn5*QY8;vh4 zV-sETDfVbsK05z3P5J1)z8W7YJRjW~*V;ZrNNnQvT;tak{9B5tG=|0|D6_!E+5Ftd z@r(#~+S|X2;oifZ&$(&C{e8Pwv4`%mZ~eto&i|<+w~5NnNFENil{0XWv@@`aie+qJ z>>?A1Wd!nEi2ta3>_MtN1wR{Z5(79j+=d~=ogJJG44=Qs2Z@m<*umnrZVLwWk`E^lk* z=As{VUM}&iWnH^%%bNMQ%v=_ynKw1pm6(3(-a%&nC(|#nliN@?>%zWvFB+usHpH;+ z>Zzwp_-V41KHp)V$(DB);}y6UvF12U(=tXjXuh%7J!$z`#@IFmRc>+%rrlu9HKY_c z%2HwrGSlRJfg?lg^dSnb6OAr%RWY&fKFZpcR(2E`QJOhoqA_FWL<7d( zr0`l0)5I57xSRRZCo@fcXgQDgL}M@bBT6DM4QQmd_gDP4d=6mI$BWmd?6XSbg22y? zT@(xx`4*?Y#Cx&L{>)Wm$CVdbez!xLJVX4il*_z@?0L@7hI!@vX7&opev>$IBE*s- zK-pwG7y8;LvWr{=vVU6cbtTvE?XCMi+V7cP>JC1`>L-4=j{30?@u`QXI-ar0?C#an zFL}R<`xxjn78;dtb)x?+`W1sbjnx{e_UBAw{v23`jse@Sh&CQ|Ce})>u(i&FTKu=k zQpYLUlKAje%2rU;jH$({GiVHpujRY{@ZDAH$x9&TLL&Ra6%Md1cMn$aK!u0i^d}e( zJ-N4Y$%q{)@R>5`IEFIbks{-Im24UV%a#s`Duc4y(|3_DzD-5&XnCd9(rcXgRFWY z#-St0?e0#)-LQDSs zW?f?}KWZQODP&!af1p$8=}exRGMzFachHFyk`u*Ro3n@vgW@tn5o6LrscPH->dsdRQlXEfy?Ix)oL^^0jwivV_A@;7(w~N7z)VYT5wV#mVV#1&5^5^fY%NqDaon!g(s?;ya>dNnW zug>8=SLfl|H>NM}VSfa25-plaPNFe6Vw0?hA$RY6#LiPBhY)+-6#uc`t@5)rz&=KQ zn(~#OjaKW{Qt{6ZtncEL@AHLU+52{gxn0@&_Dkfp(2J^vJ#RJ4%}V(tl+SQw8OC_l zuAj*^-ag?O{>JnXzS3Wli-@t9F@O1%vneEgfKBsLfde?PVOz?*70-p&`+A?{UVN3x z9D%LqV{_f_vkJC}`n$ZBdUi-X?HMO=5%(zazi{r^j^16o+h%t09(&&D+m^&RV^@)% zB`6n+%Gol&dPeS-@hUfrmG`Benaib?br%V&mrukdDiZl4xm(&5WS(TsOYFZz=pi`= z?M-mzpXu~2TyE;!luT`MJ!?l_CyzaiAVWd3|5zMQnzownp%JKmiyXUb!g*>cAMpU^<%u{K_tZUomh?L-UB95ZQV9W)b( zUXGJTNa*D>>jY(wn@u-Tk3k!!k%#r<-xwzQcXn{-Bbt8FO1cb6y0zREbun> z@p^R5>sTe_Z$VZn+PC)dE@JKF-oD7B_#EU+g1$&>8}{wi$!7vxk^`k%hZI%#tcLxTPU@1(v;>Z@TMG#4s2)`Gi}!(}~n zqAp{Wb|hExMGDtVdmB9JK0)tCy)v$1u5RYNWW6ssEmodoV+R$f_X+w%_Iu$m=E4LX zw%oMoRp>CEJ#*gx7oo%ZDYH~^rwm}f4D?)cFME9*=g*%qOyy4@cbKxN6ZD@@Pk_$8 zj7(>D(`MzDob`zv8HvVzXww+`_d;nb-=eVu$!&40b^0p2PUMnDA4#9y>>+!JlJy+^ z3xCcK`hho2K=pZU2Ndp=DRJPtBVYaO9d8nEyE(th6QW4Lt$}|1&h-Hi^C=?Hs2kY z*G4K>BK)EoS6<#SZ+%TY@fL3#Wt_ph^&0P_KE+#CYerU3PK#N< z=_LFX%v-ndtTo>HzjvE>YbSMEyhSWQ;sT1dUNrZ~o4l3CH^NgFMc^&5X+=)hye9M@ z^5jNUhWtNV6>q^eGN&_}wNQb40?ha9?b!@YDxbjT16zVqvi?Wv+j*5KgVq8k*-vH5 zAc-MMeKwqe_Yr#NSMa`$IPOoPcLZ($865j~9&-45-m472vznuU6{@8Qqi#^cwK5({; zX9Bx_sB4V=cXf@^x5~ExA8;b}>kqJFZ@`|to^@U0t+NTD)V`r$+LE&g_R_{j*fs~y zN$594TOz+ETJ$wGpyQhM4Rxly!O)k)eA_`^X9M(wE(KA}7IrZ`H?G{W^7x(MPLmoSv($^pC61!QL^fN)7RK zv{rmdf1ZQ1f(2D~Sn&yb?_KtunCUzd-1s@OMvcw%yLZ`s_jBk9v4zCP$l==>{;OE( z65@Pf?^eelFT>-g_!=$7#Vg7Eh`+re)ZZSEYWdr9!~N|B@Zpy;X2jp_mT3Ch*z!#= z(C@+D<_r&YUJPg0d`5c&6gRC~mSc|d#U$lxtFy&=J2C>#cX>%nb2Z#RN*%_g+_Y@n4p|Kpwt+C4O?TyUCE(?z1*yTdkbIKga-tqV$>)Bfa{y)bj z@=q{%@sRw_(~KJ7N6z2*gTVI|3%)m9q~I&C&8Mx<^LP3lHTT3tqHAe$Klb|T%z2!2 zj`w{t!G!6FX`11s4V%XBXLrf@JNOBT)}jM+7N>8ZZ#JD(FX`ZW(vI!!N^gqo`pJhM zM0d8&ztDz#gxE^u`do9*74yG)$HV(FcH(;-=$FJF)IICg+HtR9i}*vqF^8x@X1@Y? zs(Ftd3*;#uL^to94@E*Qs~r9N={I@j~TJZuh) zKKUrOcN+W;zJht!##5x2pgoonY1^XN+xQ{wAQctq#mnZ!}%ZFufg1#ywn`VR|fZsa}R@IoGVeE!## zH`hU%7c~F7kGYlI*+$&E+2;K30f+Ge+HFZ5{{2c@@5bprp}%4Czg>qk@x|A2PEh## zFSv-jHoYpFdG~CiE$z!(xY$w7pB3bFN541Gboe^^FnXq*Z>%zVKgzyfdfvM{%BWZt zWt1<8GW>;63O`wlQRpVvHW|({Wt*&wifEfW9Dq@bp3Jwl&hS4?-6c{l_DTNmW_rTb z(Z`2cu*r4oHkjv)v=(Il;oe?yBpV-+FZlqulOx$I-}W?Rx~wIyw)UMId?bpvQKEhg zupuUZFLJe)wQOJK6bt~?3Ho2it99T57yGzeM&;q2UMWj_vrKcaj@IEU(>w*42jioR z11tIFY1S^hw}|!P{666K5x;-&JIwF1MVSYyc)z|UvB4DYmFLc__80c>Uc+?*vL-tC zTvlRFFIe`Q|MyWQoo8p7bUw2)bBaBiuYqPAM)0}}1vl1Y6j(M&i?W)ygqDhB(051W@vI{%@3Yw632;orUBcOUrmQ`d*d>|thYg1g*| z?QI~R`cy_~Zk`2I-*eE-PCcjw6XF12E}!uune;oFJ@ zbd8UQZ~ECXzS~E}cbbjwf#LWz1XlLh%Bf~7z>EXP+-l3dQpG+27c>LhCwI?b~?;S+I_0%D#x?{|~mt8;UdJoR2z%xBc*_&D%=1F4nvO-rgEv zkDrCNQ`pU+eEKEN6rZ+$w?RR8+ilt1CZAe(`?^O&ykRqcXS{7e*GgYDj0wkEaWLK- zy)M|t6}(-LthR7>65QQy;qDN4%96DbHx5v^J8?^tFYrto5GJSRwKC@NDu++beHQ*% z6#);A+jxkN%s;!Vn5*#5-OccTeIT}K*FF*PFs7A0RU!`~>CPY8co-3mhjhUMG^}E2 z*_W8Qvu(D|j-@qUN7&pSwC%qO!Ur@iw%|#0WA^|)a?P<;_p|WP27Fl0H1Y47>&LrO z?Jc zE_a?_+{!+`Uo-7<$H?!`KEL0x&lhOML$otv*$-^{ocTj%Q;Z>>*g#NB`W}0Xp|nFB zbT4BN`_{iCtE{54KXcJCGZ%}Wd_onSbIS^sJK3L0UMunrRdgQBJ$s&)kpBvu5~_!^ zmh=$q^tI_>!G+U9unlr=6HNs6M$EHm!jxaYK&_))Vf*iYzSNF|#OM=(X`-zqyHaGW zU%3B%i4Cs^JY(4)Vf*oi*);L4RAKFV9^Q%m^RD-6VU%xi82;DH`GRM`g=H%Qcxx5Ul)Qb% zA@S%i-uiGr6K_2bj7#Pq%9(pmV=C<)5uZP>#}$dcDze4K596=tHa@Qn$LAHmLdjg_ zIijKW^y9Hg=2pCw%{a4FTvX;ZqYyh#%6&3rH0n8Ccl zDq>`cmtGv8#g5N3Up^=PO&l z$Js=SzjDIyvD2~>W!_2QBks+2al6t9O_ydM(>n zNPTv^O7`0P8oBnJ^d0rgr4D8Pd~o4&MZxm*^~=I}^3OaAve(0S@&q|y?DZ=v`8Hq! z+48kIB_co0vEdPkA5EV-j2{=;_{Sy*^}TM8vD^BtTc7_*zFv^cZs|PnxrflE>4RCi zE#HoTm_E1S%dSoO&Ysik-^$p7@i8d^KCV9xK7JE~kAac!kr%4a^Z^5TP=RHNeO6TQ#hxJ61 z6aJNQ5(B}%h`638()jH7@!m_rd2uJt6fc@_kT72C8ie~l^KBC^T5*uBmq*0?5_|lS zc(J|mN5XjVw+WUk#p3QnjM>J)y%BIQ?>sp8Gx-H=c{m{w4pN3h#K9%4^v8-_gyCSAje|$R zao`Td!Ik7N{0=y1ajwRK{e8gx6#9M!@D11^HwM`vDa~z>F9)`)>up#kMu2tK^T2v? z5UfuOh(PbVMnr`5_E!4S60ARox9Ghv9M)yPB0%qluK7-|{x0H&WW@pdS4j{2i3A(D%{_l(@K9V9K0Ah zU%k-A!IE$s++g9L24BY=MDNJns#N5!?Adhj`xIFH8+-h-2==(&jwM8pgEoxjTQGXn z+FvWMxxG1zR!B@>ebC-oJqSkQBEjfqkz)cW{{@T&*)Uob4kK4Eoh~wC0{@G7y|17} zn@*L^WxhTT3$Wy}dY%;>=6@c!tOZ?6eEMbTRl3;u9dt3}{$Q2c%UXl)qKo}i60<3& zI^N&pi(s4|<(c9O>_B|gFq~f&g!7$z+oX%zSiU#=IV14JbN2Wn&|oFDCw^)eU%VP; z$)@GuIA6lpm7h9DGyS4_x_p1J!9iARaHwYdoOWikA8p45*)QC!$rswywV5w8*B;~I zki03_N`j-|)FrXO%8IOvqCzdBfP9F4Y^l(gLyNIL>ggwSP-ZW->4nZg1>4^DMZo!; zHqOo1Ul`6`wDJUsJf7GL=T_{mYvi^3eQkI|!nx@Sh2ea-jq{b^IFFXG+qQRh!hdIb zvo@^$pvGR9=J{D<-RB9`eaimK51m=Y83=gF( z%C4uZq6z2&ebCG%571Hs9N4n|tMqU=@Hx+d^kW!J3<#o$?R?uL2P~UBU-tTk>&JCA z3?lTWCH?qHtR)AY4yTD<$=I>Um45slY;u8#ztE8(^3fLoF6+(%mw%Iw$F`Gy6$vi> z)QE7o^}m42T{c`w!r^kQ1s65Pcif5_Kv(u$z3h>ewaG^!*b6qTwUqDXG;4-!ev!SB z2jG#-@JkB&u!Ua+lN0S?+82IFB~O28W8*Ga10%X}*pw*WRkPaoZ>@ygcr;d8nLHm^jWF`MQGMZj(U^Wb)V5N4p<^3{k8%yncq zY@FVBSu>m}-xT?`-iAX2oZdtIBLDovBP!a4u>osOpX=E`HA6j>~4E35ooL>oG!9)ihU6pTgVH>sdvzK!s&(hwOQ0}`?V>u=fd)9 z6%VoxAUMW8+#Xv5JhhX4f~QC}OT*o7`s$}Ue5a;3eJ3ZnRDMLsjVQUMzhQl<iaV{X`B-)*lu?57Cra>(m}v+rDY+MQzPBZ?`cX@xS9DjJtq5 zU`woV-x)G)c^5qH*^K)s#$DPr%eTIBw(k$|Ilg$tDq}A#)XGZ9jXm2M_fp1vFXJxY zjOfGAkirLJFPeK*y{t7kIgxd1Q?{z{oSgU;V_`hGn)d{}UVskk0A9)QuWam-6DuN) zyU3Z9v9xVg#Ui zQ*0|TU>0;&06e8XG2lRCfIZgcb&z|6I{wo_9gC<##`op%bIs~FxA1M>Ie1yh{?jU( zQqOwWuRD_8#$9}FVR=OO%lEtG`$Vh1DRzGc2KxIsdw9;*Uw;dA*!`_&rN1v(Wh3=B zcwEoRcRhs8W)F`%9us!Iv%Y&0x(x1ja9yjcZ_d}|GWjk=wFxbkZ@3~|iw&nAv)xDe zHcox}i~1Dk=*hW5!stJ^5BFMiN9sc%wD`-Uh6JJe*_t*q1=%6;pa>plb`L)^yQiEx zn)4qW+VSdkYm*|$5Hl~U*=Lg6tcs`4tDN!0LJP>KDzQ~NyR}vK&Aq?Ah}eCv%e3Qt z*sCM*>PL(#%b^XG=Ns6E>L#xeykXoocWBsH<@?z#(lLTnbN&3st2$ivr@DC?ch+^_o1GgUueyOUJ1>2|uA}~CT_=A- z)%-s#ubRJnW8If!@76u;SY9&E@kB}4gymItbu6p9?9TV<%Kme%ZUW^7ZroV6k^AMH zkJWvJO!+GNGVfQ5wB28^|EViEJGzqFv#T@f zBQp)Ji;WB9I7RG+I87=kAw~b^+AX8=%di$Na)a4 zUR<&a_(rE|K7mUx{XL0|A$;6lWD0ghzNQVHq}9KEujA|2W`Fz0o+8d%pMCh3D>dYW zBTDH|W&g>#n+aR{V>%TF|JBj)m@h?wJ zabQPCesp|*t(rHj;gLP=DDBmhw)L;4RsV8jwCDmYy0(J6$L>yAaZER}y*|JqjrB^} z@hqbw=dsv++0*FUg)^YCbwieP>3Od9bb1vh^!A{KfF)pv*P;`a- zg8NcRU)~Ariz7qzWe$CarVlBd*h6pi>+jf>0`q?FHLMoxR$| zZPepcrO>|ix1Dv>Wnb2nKk;~#BdWB{k$9b%Z>65uYFuVLf3n{7;oXs# zEFWWfQ7awpox%CpIegoO-xm5TV-cS^*q#@B;RnC!Z_^xKGlTFY{Xdpu>QRB!CfX65 zl*Tnb0K%fs63Pj#q`miO&&E?{+R*}dGVOWB(JGF99NLFgaP%YKm#;6c z%DQu7UH%R4fxj>777cu&>d?Dob&diP{*(CTd^j3!;X&wGaMY;AW8x^+dbb6KLa%|0?-k!@hE%^F=(9{>c7za}S<*ro~^Q;BE3ORU+pexJC1&0J~^tL(0sjjNK>V zC_eh>yPIdw2(j;Rz-BBk;ta#-oMCv!XkX)E&RK_d8}8o1y@TgY-n;lt&Y5ci3?)XP z?LGq>#gDh?&5PY8KG-^PNu`!vXY{~+D`HOID0=Tjo^^dW*U<2tkGeFkeyk;t547H z)f6`2!~;&!f#tY|1Sbbd#L*I3?5UeQgnBzL8KPH=+08r*Ln59C<(=oXRt&eTO_InhT#3ms^qRMltp z&4z)DzjW~r>!po+`Ybf@cCKT$obhpT;wbQ*3;uJU1Bqw6qx?_kqeb2lzeH$4#_(Hk zs#$#XjqomXYw}gRK3-tPeLc@(k3b7Sd=&={ec#%AwNLSt0sh>Iui}FE>XtLr_%tS8 z#Vfx0EA?eLv|$_CYTh`9XW0hoG5Knr;;VS%VgkQTz$2gjd4TtWT^HaWtx?SE-VXx!@D-Eems@YWXmwF8fC@QM6e*q#`a(+j;CPciNd%n#sa*2b0> zlw?WXy_8gMxkk%NerdbfEtynakJ#?qptM1ODUKj@qUq;AucVX}`&> zPhWi7@cwaGECDIVo0Gb&q$9GjnCov~hZ8tQA?~l3$=;`!39hjwg-1;V!>o88glfKm;BjO!m>y8KC z)S|KK;ohC>KR0QtM>8551dYjDSrKw^Y-erLEB9vj zgw9U6dgztQbL+PiwoYeLEjo(<#>q!CZ~TSO**uHR=B3w1BWtuvdaPOBXMxX+y)AM} zWT~6}2u|D`G~+Mmkps|Onnic%&|L;HCz$Tui59wxsnt0vblZZ+bT`$ayQQ@G>VO5l zA6-Jsqn~@tSmjrkIgzC8SY)Z9aX@%%mbQ61yt}~wGTnSrG${8i1gWeE)Ay>m_ za$yrq&NzL6G)bA3Xi{JsN|QcClRfl*z!$He_hdc1PR(woZ7M+C6v3nE@SxaluW|227P+C3ZJpi4Yn^emPHo(o z#qgc;_%HW}?$x0~(HA1?Bu2JDYz^d_$fmK>p|eh<13W(x`8J39IjKuO%5bz_CiNy# zZ_D(Npp(!1rFXCk8#&Wsu2bmafrxU+q>lt8m#~@kq&wWj{juYgik#wqdxz#bOFs`Z zG`@Pwk_B^s^L@(aZ9XS)<_>dC;=H_{Yx2JEeR7Iv*LmRmv_7r#{ZRP+AbhWI6U66L z);{?M6mAmqVHR#`fNPB#{>H8e#ZP?@e(dv3qPw_@#TRbEQKFvB*hMx-U4kQJ4+i1r zSOgqhW8p~j(D`)782mWV9sR*o^m%m0QE<{9J9E-6-D}d26{*U;Y_i3Qc%QEFddD!2 zU_MWQw|juQPZjPG^fQd-73?{aXA<;N+zT!*glEpD_l0lHr}yswSHXI}H?%H#|6Sxs zK<^`yvHJ~y`)PQs2AO>HJTm$F(*21){cgH{3}@>K{+6NpkG3F#Lv?@RPn&fA7--eB zUByrE=xg8y(fQ+eem4I#TGTfI8onEMoIxWa{_yidg2Mk-XQI}yeh^;#h z*^f=9FT-{a8&$g`Va>V@C_3f*62lHze!HVy}`@ z`cdqL?br?J3l~Pz3)7U{kgW8Aj*gvz-EgQcb_4dxrdbQr{D+)*xnZ$K^Ord51pkr{OauZZ;&%-Ds~XBVh6KT zZ0JBqQIs}RdoBl?)KeUbk1D=NPsS{KeMYX_n>kh!^n1Xe$f;gD7duG4spWr>Gk)3I z&ZOF9$ckQ$B&AE`oOJm=tD$l7+fH}w0Ip&Kr*(@fPN%K6ou1m%vyGGcXPf>=AO7zX zJbjzH$BnNhGABKCU&&n7O{C*XrK4Zxux>*98z0|@Kj&8O=LjwD9t)4n#-Fq7>ElcA z<@`yBv>(wIAVj7&g64`vcz9xt|AIq@;LSRi4E2e!$`oNs0qX{_Ny3%!~>=7=uXka zrjNY8WWYsPhRC1(7imT`v90uO3B^Nxp!sC(0DQdE7x+d;i(lAs>_T8#ia()MXB+p> zhYPb2%{Z#ac(D~%Tx8mc!Lh#;tfPtKBigaQVEk-C_AdoTF>YmshD+pB!)yEU-{W$>(3a~7_)TQbwa6YA%P3&(u7Epv>oX-{ zXCC3Zq&LhnI%UqzjJd_>=DQdj9jWS&oTbzw?f5*tpT&BlY@W$lcYB_!e)`{3Of|T__W#DMNT_tOoz#T&V*33_FMYTo(XTwEGKqAqCOwo_RfU zkNyR8?QwHZ#Tgx-`O-fJiA-+wuzJ11i&iyVY>kD0X{QfAvUQyaT>!1a@ z%ue1#ugE@E?HX#9x9VMLm*?KkH&Skql;gX%xp!0MVa|M73-9P+L(t#Z)7@(lXLRyP ztY1r=)3avE+N80m`8|*RV{K9|NA$cb{Mct@zKOM>BV9de3y4isAL-q%ltrz*twss~m+atDQ zOl)!TJx<>n@P7?4Xb1XqMkj4kDRT8NaQp^)YbUZv_Ucq{c@}ySo+>`rIJp~m z5c|{tPOxpP^(2Ym|Ka^X-b=e~(c{RY%4luV zYpUPz`a=56nNdT<=6t4ecKt|Xu?u=nf*xvUQ_7?f7fb)@;XNNaql+JgR({JhdU}?x zpik18)YPOkhkGZjIYRw1j{E788i!MRwb9w5wisSX>!9rx+X~*V?alqe(>0&6wH%(> zt-vS)JKRY;(UB|j$%*>i!2KCyvdGCA=sSw>OMk@{ehnCkF8-Krq&;LUbHK8{ySe;6 zJ1@uAK%b62mvz^%cGooouK}_3TBNJgo$EB?OK$?V&~IwGBsDZ3r_auFpbMPni{|su z(TRoOy1?a9x?nmwdl9@H=(o#7zs>p0)3@eQUykqWJmxpSe@(kFs?R6U4Kk1UAUalf zbZowRjRzieYt9|aCn+9SL}ekT#BTpKLU4Iz6+~?uE#rofb|S zx+K-Ngae_!!{8`UUQU5D__jlEX{uVluZ-m}G&>?FakLN;@ z9ncGNnBVJv<-@+mnfLk(UhjX&FMarvwZ|SrdNK-}U%3(J`Ll0hi=3o({Ebk?GQ}>*4#Wp`l07BTjUA4Rk2{?}q=QX@4#< z;F>ve>%|XGpW4L#6~h0}l;VF&j(r3FAB6vFfu->D41qUmeFfH1e-6*xG0DX}raFCs z1JRMW$PS5XD4ZeBicU06mUw`azs-_$Un~4`<|MoynRmw2UnsAK^0s|1?d4eQJ!sKe z_yyd(#~PWVyE{PJZLpl%$2?{3K*stkFJ#GZq~1f{HlQl?-!p1-5gi` zbjdH^2mH7fwJbFkxgs@xnAgXi`3+wp4;Nv(BJY=5zHA?^*tf@{M`^p$(BtlNqn>md zkM4P`x5MY6Zv2I>Uriciu&2U1gWq8Kmew_%m`M!2!q_v!6ed?tZvyo^iVZAfy2dqI-)zJ3d~&aG>yX_No3FRzmDu(pG;PP(|E#V`p80=ux6b*bZsAW3*NuJj z)-}=R#ypvJZfx-+&9P(7Be$;U&;7V_7H79K(-%lCh@>iZY( z0`ivk|KvU(Z;`QrSCO}u^1l%qQsQu{=xZwXdm53&)Fm)6$1ig~9(^Ts%lKuy0=GwJ zb~;|n^#F2L>>uGnxi+9z))KQTBpzJCy*b__HNHoz{)r7D{aqmULF2t&?iue!`fJ;J z_IUrqv(WL*wdz~XyWsJzbR=xk((#7UWdpPY#P z%I_Xm9RH&VpW79;L)lbWtZ||32jO>FuiUhDDBSlK8Gx;Y{if+Me=G7(<~4%X4ZX$r zm!Z#Ie?5HN&~I1|)Y_U3iN#0^M`AW2^Cf22yHCUF*P*|*$W77HGFKCwot@DiIXI5E zcCstFIO!73b-p_u+7-CUnuJ(=9OHWkc_4A0DUZgi*^EpT9pZGv)qaMa@jDZWv+s^u zGd3z|jf$J3j8${%M<|<1S)pxto)6yS+0{Ig@@|Lcg|@&|;=!!ZR@v)yF-Fq*v5}ux2 z*xnbNip^xLy(MyDMbFZ^Gt5W7(MK1j1MC0oG@tPrJ?RneKGVQ7B2G;SWJ38)| zGXdX`va;Sc_`4eV=;reI=wG|@_isc{9hy}~X)LhP`IYz#-yI0OlKOM^%!pv_J zu&>*;8)cqDmHBtJ!JNX^r?I~u$Z?vquUX?L=;_@=KMv6kv#xmkQ|gkr60@$RbvaU3 z-0|$DI`XYLs(X2#YgR|HzK1%{|7u;J?75cnyY2qOoeQeNZ`Fa1u`;L*@k45mzvWWT zvh1LG;+yJeV~&4r_lDK^g;Cxaz(VXL7kfHVguhcRGi9MR%)8L8oA2(I^{UjZt3KvN zuDe?faBi#i`R6-3l;u0y^NTK1G>~u6p?0zNr@{61HtS^)fIg3kT<=9W#se!Y`Qx|h z$-l%qDY%}2W<7q`QxClB*!vq$z)2Z+37!Bg}e!ruuVTznS<9-7`k%P4|QB*(y5VifTS=3dh^b&YBbiIQ>5t!265i&L#wpWxJ;T(Ehpi`)T{ zFJO_zxq$_l?p|iDfN}HEhP(R|Y@RYNjo4U{{?G(jC+gAfrOx~F%>LOi=rQzDzB$y` z_+qNo$IDtI;5a^Fzug%*#%kuyg(lqxMzc=aUHtYVnor&TbF}d^_Xq9!L!+U8cX1>4 zGr+&h<4GJ+a@>94(N;bD<@LV5%;#Nic^4me_ZjaNe0GEHquY5`;o@CF;N3yqJ@^r4 zpHH*e%;ZdS+W5u>#)Z$D{XUEvL|ZZ0)(#YFv!FoBA)deZ1b8|F68&$h$bbf1-It z{rTo0L-*PV-#R;H88gXq>h79l%r2KfvYnXhu8ibSjM<~dK4{L379m55vb9YQex&(+ z0el`sA3aO#fwe=sW$sGmn(_}zew`l55BnyOcyo@N@nPN{mwVo)H&{L%cA>ma<6h)` zhsW7dSTHJME&DagiBD~Cj?Nexs|~&L7H#vqzU;qrcJa=jyvU?~NnPA~C@V0`=WI;- z-F|t;eRtl?Snu%e!-tfs_`p^CACGMt{QVB=`?m5ub>8YH{|V#%Gc@VHSQ|QoIR7T% zu5T0P&$&dKJQyEg!|m~F;LSjrTc~5aLyHac)p5t~-CAW;O}Cmlhx|{R(KERJ8?F8y zJsaNt=dJ!6=AHEW|AP82{;|wGorQNEAU~VvD(#{T6H2A&N@@Rs<)Y<5s{ zvodd=*hXkLNngO)RC%Yd_eQ=ut?G-{1&8+Y`#Nev9~!6`n`hqYs{!x-kGA)L%c4rd z{s#m^LqkPHQv<^y(^5mz!UF%Lg{FqBwN|K5T54)o>e_~;Et<99YFTTAuC~HTOD?wB zVqs~ai!B%!K=4P^N-{1T4`RIMkb*}r&ea@UYbLPyaYKvbJQN*U$&JZ8!#@k=?x_n0Y{)Ujx$8qGS=<(_{$ z&$HyXtYus7`ByKK=XB#ceaZ7t$+wuYOFqLmF0~x<$9u^=uJgQ2VmbFIa}C6LtWk8= zs{<0`yNoa0Ox zAE8X%cG}(4$0X9Eo~}{HITn0*V{1kQ^P+Oj%x7Edlh{f0523tYGl}!>&#kTGzY(9* zOE&q1dD?b_*~cBS59+Wb{(OVdR$`n27C$*p?fN_tP+t#HpKC8vpS>E^=PvG#)5*(U zpM9i0k0jRT^9N6T%6<0>#M_=Wvx$F?qm{N3A#I0aZ-4Vc+xV(2&%G(HoU_taj<7B1 zw-B?`Lx1d4${H1w(rFR*?ZWkyG-CO$&)0TtGpkSQ=H$<@t5FrWlT#vzj(pz{cfSZifWe9Dc9in=t7Ar z2g`d15v$QjoQJ6^>)C|!q4NjXzf~_jlkQ5`aykC1jgN)qF#V`J2OEE7g5CaQzj7YL zR61?p9b$}S&Z6Nn!ghHtzwV5G%bB+!PxFj0!oJ3S!FjU6q?eH{$4u_8yUv&ErE~6Y z`mXT}ay&xohI~|6|Nc+$OHH|dv)})TwrVQrM?zaz&$Q!PD5+PA8mm~woF*2I-T!GUcbQoD z@Xn6q4He4=JZF^onpvDj?=aW%4bN3%?oYlKfAZ^)nn@=@YSOtbaAZLTcZ z>Ykk$Zr)pyy!Zysp9e1?FP}>c?RkcrP8?4jxw_vR$~v3+k>fj_eaSbc&RC4!I*yU+ zCeL&!TMcbW=29h&YWig9Uxkn0Js+uS>31GxTh4F3x!ybEuXQiT^KBUq1U$vF5O{gc zl=PO|Mrvic4Xdnwmu^78ElG_lX1p)+FMhO zhm>KFoz6Ei+#`Gg=029|ms1!1``C2)G(Cq}kEN|<^vO;zysfEF z=%`DwZ-rk2Z=Zj>OL~}klsx1Z4kS&mcdReON{EN-4X2)mFuk9GL3W6tB# zH+`(J<*d>5`9@#c2KuN=9eu*3j-EM|JxU+@H;+EU=yQyoIh`F!Kf|l9FnZ>Z?0A?* z+M@JtdG%4@CLW__?kZpDA1?I9WAr&jpU@?HwbJ+6x)6;5v*p=K#Z?)j7jbWUOPzJ9gt4hTClJ6mgy)?0K2z8y$9#Zw zY4)Eu<`bD;5}&2UCzigi-iJ8`+b6^Lq!=IOlf>sq)!j5R*% zdDd9()7JQKe%f_VYn~`he z;l{Ei#!%i#y)~CMVy}ZCZR={v5jB}PxeK%}#uo+AT<@iweRe5hWikKVyg!I zNW;FbVY`)nx|;Dx1^ISh-n!DcW2jorPxGCcY>66^`h2%ZqpPTcL{G@#kmE$rh zVaw2<%o}9=lgvQYo#UP4%$5nWnOm9tB5StIVSU7*tb6zv^F1=JB|Kz z8G)RyfmTgu$Ao1~60PjmfY>Fic*nY!y!(@0`9MN$3G-8x4<+W7JQR>Cb8(fNR}#~% z=FYX(ZZ}-Z~fC;1f9_T~6WUS(pL2l-GmtSy?t zw?W=#pC3fKDave2n&!V)s8%Uv2Ud*#COkvhIuiTIKDF+BE2c z&yL3S#(8w_TNVSz`bO{=O#b( zeu?gTqb#mpRz`mrALzbz*Eh~NX|E4qj}P2&fz)Tl1^U<#7ihz!%#XL0;~$d1@4Q&~ z?ai_JSC~3heA`?c*q&q6zW!KMJX9H9{LuRNSk5nLJNgQbJY|Jtrgw||rMxxD?G%`xsuX=L^G*PFkM&;L=qHEiSldK>x^^(OsMMM%T` zXdLe_dHbV(U-IMr=x&aszdw?3WHIL}V~xT}?0Uvf$LNc9cD8aqKv#KXVs0_#YRQ!W zx$oKA1MGE|O0EpdeTQxN-2^$VN$lHS#)_uJ{iRRPV=0a$=h)KX`z2>pp)5>=V{`z0f7&~-Z*KC>3l;2#K z!*THUX^XjTHe$TTbA8@VX!ve%igo#Z=Cql+=#yQ2!ML3F^(D6ZiS00R-n7?InY3AN zJZI$FN6+=?SH!`+mObXoC5|ATt7q78$oKEk@3`y9XAp~TU;y{x?(ZMSy^2#d?%lX1 zN0WbaMmy(zkn1A%g9Q_lx!>Y`u!FgWTyO3N-TS_{>^$n{w)t_~{{=L-FZ}w7z}zpc zkb6P--od#ST*J733CGN$f2IFW_kvD8K#caip!a?BYGRF2^A2+V_8oO1$E4!&jL`|E zua>#D6t44f|CVFlzqxfF$29;yZ+~6ihnTT$6#YgD$G{>^Z~y(1zMlR^@<^whNj@i- z=ajgegj`KjxSzCX=ulzBt!$b?+pMazv%PRyNj zS3vHs%-Z1RsMi|K0lv3e?!T{TZ_njM?RhrV#P9-h_v=Q`xwe|(ICOUnm~?y2RXdN7~qr>wq@%e{fxr zzEk?Wi7L*;9K(xVhnOQCeZe^Xx9gDXe-QhwzxJ^2i(Y#g$+gE_dt3UULf$c6{_geJ z)puICa*er;JY~+2af>@od1ru`Pjs%G`G6L*1Yi1W_Be@$$=Ph=eK?-T89o;&!r z{m%_DxIXo>+bz%K8ZpmC{xYw)G@N-#`t9()``U_~`IfJ(JfmCt4|fhegL5kq-wfVM z`HGk_cvd{cZVTka9H&38Ipnpq(V&e#_1k4qA1m%l%w74wfZXNe!F9R7IzD{MY4VbJ z(PGZuWB>Ir2Yapkdy;ZpI%~hrA#0?x<+))b&$8O_TdVT>3+`|H`G2?U9Z$^PNUX%X zMJ&&>ZxP!yp{BoBoP~t_4xGxQ@^<;aO$xu8u2cgUNbp- zj~thc5?% zGdl+xU9i#Jh|X|F{9HeDAx0NsbbZko+$bwP^N30B+}KX9Xna|I=7h$M&l*41K0ot_ z;W~#JT|0E4tZhuJYeHGS2zw+n`!cben`CzoJE2K-M?1Yqc9@;sB)hqt-ZcACJH07u z^ooDe>0#N6Cxm4$SreB1%#pC{rJb8) zKg)Mk&#h^e{rk5QYeLX;;ol(sP2}GK{;lR;G5=m!@P7QO3qFX?Tu>6fc)`y2B@1@N zKeOPU@y{+OjbFK7cl-+rK8$~U!N1}UKh-w>i)Y&8fBA>j`TzN2ME#@;VIN1Bb;a)##*{&Pg1^Z&~^ay`%S>iaj&g>T7I&V{X5 zJ9ggl@b^ulO^pA&wBxxm|FU>i$2#OZ?>f&r3I20&dyD1yUh5r$i5Wie z#`^bYEb|UcSMH(ZU5bRM&yB9wop0Ak7dUx;LdGYu9>W*RqrSi~Jm08e-U8;*Wo#?+ z=3~L~uESl}*32DLay=0r)`+slHY4G=c8-?kchT5Pdp^Uz9)q)Puk-#zMBV}FAk&^# z;hKR~u2C|Mly@F2-fhfej#AzQao#oX`$o!~(q4IgCYXJ$;5`+IyO!f6^Sa8wo%|7Y1^_slf0LGmnq}0dY{&LmxFUyx2~G?wEKhC8=sxj zk@$AO$C7;|_>X5`_7jvv#yTr_KDwzn-ycs5+_M_LHJw>AgR(tGJ{7#zSNPOj_HRIi z${GOVHC=ed*s>nob02;GLV)}hl)OLI+ImL(cZE6qND4Y>$KrD@*#6zPM)CX}pi{=J z`yHJemrUlBoqBWXZ2eQLvES4xw4dGb4v06l2l0t&%6o?&J(j!v?Sy5EPt5-4)xd$L zLjxAS6w5nK0hBeGw#ze@vH`SRIesPbeKzZAO{U#n&H2H5rS^NI(cJq>dyr#xv3Jbv zI!xhy^c?TuSMZk7o>PObA@z$B&??L=z9)WlYqBGiLuVKtJpxDaJ;n@6+I$-Q>ACq(J zQ{Iz%=Ze0$g`{PKWQ?9pds%y;>PLR8~WS8 zRIshx=4f+v@5}JpD8ZcT>xyrz|BaNV8Kd4x zyPHZ3_+-m_KK{O*IU?o(I%iLidgdJPKOc9-!i;a=;s8}b-ywWQy{Jp}Di&b6JNo#*=O zJOkg=zV3xBzq(O=3$`qPel+K)fIX3R8nb)Q-J1F-ko&CuaY= z;LrV@nm=~=Z9X{`|7)E~tglc8sdL%yNxpHB`G;Rp|NZz5O|C2cI{ydr5Kf)9%lkL^ z=sM3KO}?{{c?(_VZ}Pn5v55`qd`f+tN9IkXJ~!Rpu+INMTlJsMa*R@cVVz&-IlP=F zc3(*y$oRzWYb?J1m-pEc;nkJ5ASg8_1A;U3q{h;ZRR;% z8|E~mUiYbcT;83a-*ukpcjnxaYngLSaSqWR$XMzSWt3xb`MiMK$g#2>T${WHiII14 zn47*aTk@3iO|DNzX~%zC^TP{wlU{g7ywg6L&^{R_O5gI%dlv6t{`edA_gV(U2a8%TaLn>k}l@9*u({$8OBQb*FKt^|uM<{9Jr`+unaec=pvX}4c+PTP5(Y{C1q zvgTeR#&3za-!&d!kKM-p#D2;bB<6m^81qWXB6F|B%t2{C%es93+w`S!|9jDU#nA(D zxmV1xULLXKdh)B3c%6ISf}g+lZFt}7zgLvsZ1|}*B=u5CT}z#K+fYXE|K5fs(T3X4 zhWhZXcU#kj^gPK=wxJB}4NV)mop|J2mNwL8oU|c+0~OBSpDp|J{0nw_s<_G1o+9%u zr#s+^5B z|FzD(K4!#cAK^MVpgf+nNi#;j$9X7gyFS4F#SPCllm$1-y_L0qSzp|2b=f4sXKdn*pQk@^qaBq;dc)05PAKi4%YP*S6Ejc z<~k$!*3!RJGHzu&S*FL6JReT($3C6sIPREYW{|(VJ7alSuh+kyO4jeUaiWQVJnZcm zNn7Ok-anZ;?9M;h*ys!GllRJ!d6pGn`^-w(BG28p=}4A1FQk_-um70p-`fjg4Kh2A zIZ0cdB##Q#e!P%>6l>=E-R^_sS(Q`91j^^!_c&`2H;A9_G-MqYiC>;o`B+=6?vW7Q zzi-TY_@R7f*@Sl{`E8-!T$0=1*j#7TT+OkG}Ae8I8owm|RTOs*}TZJ;#b9`>GeSR_;B5xi!E*>>zBwlu}$6~n{Sn8=gEE3*{1?>qtQFR`Q9ck zjr7Z{R^N=Ly>RUI9%jtyr13nG=VG)wyB^Q-j*gwqy`5aUD zd-kcs+&HZL-V$--@P3gUe@uYg_XifsI=&G+7rteG0@ob5j>#BB+Li_9#Ll|4^8E|r zmFqc2rEjR<8ZFucG|WHPF(3ZInSTxB-lI{JeAm2sW+nIU;+MjEC3YL#)-$_lG;6ZA zV9w$%GES%7q&`#V8}WbMt|NYdBI!S9LAf z<@5D!(rD-nldX|AbPI@BBG>Y6r_z^Ae%k7H`!!FNJjwT*$N8;lzRmk4Kls`9&$33& z?bmcK>5iXhhhE>kWcLrg-h8{ZYf?byF8Q6W63+k1MwjFrASx~)_FV3 zZyWu=*QA7RtY;i+_3Axa>A%G1Zt{MCb-s1kjs*_Ap=-dbjg+s?ZD(fL(zO1e&!i!w^NCR47=2IUH)T$kiMY|8Z_?Z49Q345F*Uttsd z#ZT3Vx1QvFyo7ow=ee+)&r(0{uqI(B{o=Ze%$JJU_B|EA?=oKa_d2CtZB75M<(?-? zw%ik2Qo?!JikNGDZRJWI5lO#t)*9MJ#zu0yw$ff@edFhScid3Jabx}c!Z|#jZ%P?0 z*(dXx(vP=YXr1F4HM*2zF#Cak+!W>>8SC(^qm{ig@bQh`T$7M1`@E&mCErxhKYSk8 z^qZx@OWX6!Ox%`Fx|MV@{log#x|Ni29*M3v@V43v&TonB`S0(zfi*MQR+7&!&d+1? zkxMv7udbQ3tdjm|3H{GIU7svjf2Gqu(Eswgy}hy-J1v)3@+B7DH4Eh%+->A3T$htF zZ`mqu24#@(G2<29QE>b&w7wYin*B$>rwtk0u>Nj20@1y^(>bE9+nZJIA zok{=M`ehJk*YB7M)bH+Zo%&^M_+MPVtU=n~{U@&L1)-yyu{8aIjA;u3hYzXYo3BFu zy<7rq-rwg9vHMqN-i+VoZrhT5d+!_Ver8ahJ;rN8dJ4zgpVx)o(Fn+E!#NYjzL&4* zWuF%jly~2nCrkEqzPe;5ZFd&$FvbQA?bDiZ&idwjU&GqK>&aKnq2_3FXm5>;ZHg7X z5q7<5lcLG6>#TKNDRXtwCjEJwr(8SP-_FiX`<~4HN;oH^f2h7Ak!!_!>m_!#{kr@K z@`)z)=oB*^NobiJ#dno^8gtDLW3D!|VVw&%z_dHToY#93*_Lxf*ORwit!5dcV zFy6VpD+nFW{T=<16~H^j^e3XL!&mB0a0c&~PvW;eeRzZKl zz*yE#ula^{Bk{^}#`90{dj?ln*^hHPD*v32dwGBBROcoGYAdgLwLSMU1+j;F*?IZ% z5x<7zbiTQ|Q2Cxz<>UVJ2D$gvSo&wyr?_C*dEeSDyZrW?_qf{U%W~&@xsCk1=ZoF8tm~bzu64QH zwr-?t)smMT|5WFAZ8PU@z~mt{9EZXv&Rc1--u+!?pTllj`_7-wEKfc&em+=auJ4C z_$7s3QFx8QuPL0T@aqb1RQOGW-%^-&X6pC*uEOstyi4H^72d1xeuY0#_%nsSQuu3y zPbhp^;j;?YD*S`Ofdkz5LlkbRaC3!QD%?il_6m1WxU<4nDtxWNy%g@F@Qn)JtndJZ zZ&P@L!lMu zd_v(L6b@AFIYi+$3b$9dlfs=9?yB&$3indDkHR-9e6zv>6dt1RZ3^F2kITZF4snlB zbA?+f+@>C9g;XH+3S9qhsZz}w@ z!tW})OW{ux{!HPo6+WwQt-^t~`mZA#cZJ(1++N|%3U^ibT7~;4e51kx6dt1RZ3>T2 z_%4O-QTRTECn)@Y!qXIM`Hg)MI%k*FT2otnifzcUAaWg?lO7N8y_l9-#0Lg>O@Mgud`pI7)5h1V$jn!Wrg`ZP+nZnO2{F1`2)Z?u1uj=#93jbQ+6AGVJ_^iUU z3ja`#3&Pjb=U)*1n!8Ers7!_+5n`Q}}&_cPad#!h03|MB&dA{z2hD zRjv?)n=0JA9%qFI4)ph9S>Yk|xFEcx(o9hKx2fj~!rifPLHKX$+XKg4VRsB%5dOU4 z-ElAVuXuN?TM+J!Z&`m`Y2H-W9n%(szpHq6Oj{7{j%f?R-7ziqq4j0S3U8{)eseuv z5I&$DGtN|+_VweCg78iXcUE|Sif4$zBNQI3@LdYuqwswSKcMhK3Qw!YjC+{!rol3V)`szMndx z_^%ZHTHzB4pH}#+!WZuAe(HSJZJV*QI;IzBOU$=t`P-6>8?+_mYub#hF>S`iy3O=a z`WqF#S>XW+4^eou!gncrkHYsUJVD_H6n;qIX$sF&_%Vg&D!f49rxku);g=MCMd39H zzvkePa-Nzxv9YNW8|ylGUHNWQc(20y75+rw&lEnQ@L7dx75+itKs84c;$S;A9e-*?FPTy$j-*hxKep}&pmG6~mUtJZxR_*tF<-1Ga4;40bV(-h;iH%L2*x1yGjZK}{ z_$!sq*9xCd__V^N4sBmkhc-5KXyYMDf1ARi6~0U1dlbG;;Ry;qpzuQqoAzw)cc$VW zQ+Tezzg2jF!cQx_MB(QYUZ(K#3csZAD+;es*t9DP1PfWku*zD?l~3XfL!E`{$=_&$XvDExrJzhn;WA*G+D@JxjtQ+Tez zzg2jF!cQx_MB(QYUZ(K#3csZAD+;es_%(&|6n{nT7&tb(vvQdKJp^z z$rniH%HN&$g@cdo3$#|m4UF!=49|DhksMZ$* zE(VuQtMyq%Upc4NSI2&ji+)k9?;Lmoczb58uNr(3eD066zLVgE;J&MCeO2Ju;LU%k z^;Lr30ME;-^&JJLfLFa<>#G1KgNxp%^&J8a1;_ra)^`9L5ALw3)>jTL0FT>R>nj7t zfUDoB^_7An!6%DreI?*9!SB`jwu1+Qt3Igp6@!<9d;F``R|M`3?(lJ~Z!`E%d7u^Z zNv*FCTn5hicdf4gydAvqvs$~JHw*r}*0&!16!_$kTHjjmm*9m*YkfK3gW!4psr9V_ z?*^~0to5w~Zv)4EQ|ns}-ULprs`X`obHOK%*ZP)%$AYU**7`ERN#LaKYJCgA3EADUF>i$gOB+--85Pug#L+N11eAayT)vY!D4%YJS)SoYJ) zVA+q9PyUj?oeiG=ZewsfxV6DOz)cM91`ank3LIo`2c?Mw2OB;NTx0eX3O;Ud-Rr^D zVS~?spE9@#{J6oD;1Yumfr|`203P>|6Ms4QuZAxJ4>EiyILGiM;8g~12S*u=zhBr4 z7iKuA6X8R#2RH`7{{4V!Wc5(~%D|-tmx2!)9LjMzYH;0OIR6bUK(or=4d6En_V2$0 z?aPLf{O!I9>+H?7y!UJWNuMQud=F;-`7QZf=&xAHB7fnIvHD&Tz;fi4H3EAHb~LsH zb{tmn(w1*utO@XZA7VX#ZG-jie;V8Lmev%k#5Vi%H@*ad9~$wkFN*EC@Uri?)>XbT z>>F|>_0IOW>?&Uh+e^*%`gQnIsg-8C>K!Mpv2l(*@`Ea04)K(j?W%t{+kJaG z>8YPo`J}?uo9*JG&UR2AC%x{Jqfas0+rM|x%glCyq>%E2dm(l8TlandX9JK;+qp5)oi zcGg{v|8}#T@Pv~dH^)iuF#Uwx{??l9DSvd*W9K^Q^PW55>%soY&2|)d%U`TxtRBYp zH8#Q6p~j9h_SQ#IA4wlJe!AJTDp_QQb%d<->rVJYvueJxzp6mT#x8K|5p;5%M4Ih$ ze{$+)yV)KZ?&#v4a_sx)X};ESv;8*Pa*k)_obbuc=Ph(}Z^6s?Tx8PU#mat)jTOJ< zY)gLPUut+h*0l2%EAj6&+uBM#WrqJHR`QSkvr`WhSq;k}`CI~9!(!PYv#mB;~!1?cHsDF(;i8WdSrUqw5TzolfJzJFf4JT zHDK1X)G290CQnOE<0qZmzmdc#F&eNx(^ljo+TT6f+)c;?JUW?CZ* z82CtPnkB0vAQT_TfAH+|w3*Y!Pho#|Oi!Qu$h1dqPn%anszr!32d+qI%fQn2Pln&h$4_G8 z@ew;)`SxfTV%-aup?sHv<$5+8{uzAz*1x}b_#~2+qL9IfpJ2~)aQaSu>{YQ|s>KmsHq<$*FvXu{i zPQ{Rf-yXQ>N?Qb$wzUmD6s_0EtFsFYb03O;-~PRvM;gK z#3#0tJpA>u7T+f1*G>6G7~h(=f~))TGIerl(Cyn>jk|LC{RQtFeVnt@vxp z@%;hQ(0}mM$&Wrt?=%!=r-NP1IayTc_ikj@r}RrvjZfAew<_x1|2LYt^Y`7tjb&S| zi~hfG10s!$GB(y&@AZ77;l~=AV(cVi?f!iH^ns5|o0c|FI@YAg52Q_;GjWQkp?LN$ zea*raC++b`YTJ|cc-OdF)of?^H?Rp|Cw)DzLpwS;|M+>j(g+;sT!n^@pEmwMxq<{x zCl#hW$*5au>RZ}lgp-y1|7~~P zF(P^9_-T)hw_DHXwDFHVGEJrXuQ$narl&nRVCLl12h*%E9M{>Nb7C0W(3S47KEQRa zKio)p&Dnm%SRx^d4+#4;vqWS`qlz)lpX*ov}mY@4C{>+rvuwDP5H9D;_! zjYB7Pp0V9N{MO!HuKeZtfv;t)9&q^^WRCceHI%oB=O1VTW7XI*p~Ao40{FkX)a znq6l#C~p$H_>VSL>Q}b!Gd2|~{n#Y4Jq;^y%*M*`nQOKeV&y3QFIM)m#Q0svO8!et zy0+rC489$9EmmJ2SQFBY|21Pb7`xHf&BnfM>~>>!8C!;xa`^2l97Wk*3B2_8eqLKi z-*5bNKed~&(x9UakNGyZ4n5psF8$9Y;XJxrxYFxfT_kNt#%ax<}VUbUoetLTRh#H`B*^bf@5Alr9C` zmvB)^CvhKy+d&%^8_NF0)-7;sCDtEz4*t7It2pA8ThKPRBBeWrZWG*QrIX{B3zx=z zv|UfV%61aRLF~DrZ*7~Rj!SHt5G#$eg`WKGhU-Fp+IHxE+9%t6ja^TEvTa@KmSZgW z$={^}|Dg4#b*uFfi@VIW-nV{by=~oM-C?b_dRq@!-K-_n7V9f(nf0pmxpl%yweGjV z1EQ?|QX#vo`PP0bp7Xq=)t<92G$78pEIO=fpO^uy<3n2ZXw=EN;r7@T@ku>?9W^?% z{lIos^wrJ!#rI5VKPb4>IP1#mTMQg=)4iSU3TrbY^jfRk<*}Fay`{&9_Cp%A2(!BP zyKLCqiQ{9(wTv3otasx$>+0SSL+-lyzL>kiI*e%CGtTNaq|=1CBbIet(z^4b%@RXL zEm(8U!!PCazRntdzrlk*k@vrlCj4B>H{I%<+ zU9))e(d;$<{(Ag9zQ~jR{c!$A@zMNJYU@s2Li^l&?Hz4~G-_r|?0RGS+kf5v;j2?&i|7`xus*NtVt4*NWR%h+OL-#6CIl>fGy z?On!}8N1)uL&hF4w$j)W##S3!Yplh1Q2LJ$W5bMXX>6pios5k!wyUu{jO}A=ys-m} z9ct_dW0Q@&$Ji8OA24_%fZ8~Zj^_ET)O-#50@*uBOcFgB~!d6ux>Y#%cAh_RK%o-nrB*ji(mfOG2K*f3*T z8XIYBCu3ub?P_cfWBV8zkCpguHrs>D_7G!-8he|uNm!|Gu~Ofo&9+$C9*dRy?lIdb z#y()|6q7#9Y^NJL7c2Q{EBR%Z^rwwoYV0zj7c07z#=c_gT4VFDlCN0N6<{U4jb?kZ zv2Po@-Pm2mmKnR>*h9u1F}Bj!6UJ6!Wq)F2f3?QSI7qf-{3H7hHQUXNjWD*ou`(VK z{guXcGq#tpeX){{jF&{0VC)cMlZ^ejagxNDYIH#RPsW>)pB_JnPR3DwE9vP*C*vuJ zW1iVwV02LSpKOah)7a;XU2g14#_Dm9?B{^0YEEyMxzaAgSwv2xy4*$64kl8+B zY^AX$jIB1d)>tdZ@eeUJ%-EL3MjG46*cfBG8r#FzKE}oy+iqa6RrN{3u|hMrthw&B zIO)<5D*$f0(#e?Q%z$945&4L%%sA~6TeZ-!sf%3yrT8BsZK3j)G5M!(<4-xZ9KCE? zPrH8Q`0as9QhpNY4!C%w>lPkjZGnsN=`4FYPi12PvTnvw_WM#&@F}w_voI0JEwHX%t55me@J~z zCavN?!}_`x?hew$_BS?Yv0IMi_-{#I-^x#NkRR{uG27Kup<4~NO6jD&R>1w2>yFs9 zQ5?JTU{FCD)ba52hH;!A_8P`Xld zcf-|v?3Q29aJY!2ZhkS`3&?mu>Z>1VrAjaHbcefzbg|uyjZ*%p_%FVNcBA}cKTp6} zkGuP^=O5rQl}_p_4emdTlf?FT_Owsi*ymh-d;S5?A zz7CSMR_P_4-EfzaF1DGm#@v@V>!AQ;+6W!B`r(oC7zezE+t*;c@}9D8?XG!@vpf_-p6Vf&vCfvkGlKm z)}FZGl9W#BYaiU-$yaPS`HG$Q2gh2=UH>Wg?<6fu`Ad9T;S#@g>^$_cyB27Kxgp#JkM3Exm=$guspukzSL$mHY4em`;+YEPV?IpmabtTZ|F!t< zypeXJ{3Noia0xTr{nVj*1Fo;qNqwz@`!o59jU->O9gK}q`-$&Bc}P3A*Dbfi_bgnC zV~(w({Iae67UDM_u2}g=4zoPEL+B>Mt@P;bg-cd(#B~g@f{0h@YZz&hlwRWL5BKf& zj{Vfw6y=|e|BL--H_A`qc@{2whFf2y=;p)4D4o>TEVviQS8UNGwLY=Sn>scN>+iq9 zI#C|dj_zq#U-!Zt{*PseEqdX!PwY75myF*ixDCorau^KPccmNO26X-47J78u;if2E z(B&akHTR!VU+qXsR(h$gW^kXAE_S!Evz7lK{3rKi-^x$oxfibD5jUPy=tjYXE1lHW zV7T9ruh_^JPy56c8$0MF*Z&ay{YWb-Ygk|1;okU)>$v!#7h9$LVxmHAQo3?m}5hjg*| z##Sl+qxd%=EnN9YJm-7!-tJU4p7<+>8?N%hhV}I&+=JvRcI2wlKCxxSc6-_NpNIcJ z($*_~iElUDsH2X}Krh=1mEU&!w!uwTeiFeZxV1{xAtuDig&XS8y$p9i>C(|{XQEWj z$Hk;YD!s(>1l(Uq7yGiYN0ome{s-e|H@n?>5VRX^SH@XsY}x$>9zUWSYQ!m*Rk%k~uIw;aE0xN*u);#&llsdQE7=D@{y zbW`Dqly1X!gI=~vm0v1;`#{~~n5;G#Ub{%}P~7ZDp`tv%z^*VUw*{HI%PiKipn?@1T?gs~;cKN`-O>{Yw@8!$_N={3X8raN8;zI~G6L zo`?1O#a$g@^@NL4eiC07k8UZtc5q=H9h3G}fy(bFy5-eQebw~jyNX>6>+3k&lcbBC zYHX46kLgM|NGn!;l0$#tCb@CXL)Q~-rP4`#b%DEze8q;ZJM9yjVQeYZU+yCO+mSX_ z`AdB@gUkNhvEi?s_Q`ex*6$Z|4f9BFQOZx^JJW+}l+ukucMR^_PPhDmK7|{rbcN^^ ze&^KJPSQ%0UgFsb_Xz1??=?16`B&rLj(-rl7PzA&4eKi(E-25`4FYPfSBG^~dea3__n4&7q7GLP;FxR?!Y9Ld))KLod4=_HOcxZ%uOitWk$zu3OY zZxw#qy7PUH@{@=*!SzjZ^RGsi3zw>NQco|#onf9&>`L+#8=mjjRII zsjvQU`%XC4+Q@Z{?NVdY|K|Fa= zC-HQFTR+~7I~83!xLBo=`f3KZgLzT0DVw;iVUHR+=uOvuE&c(dRle7-zRq0Dw}%I~ zPGDD|7h9tIs_;7oSD^ePhfm?Elx|QT`c=40k8THC)Zg7WR-x-myi#9pkTzE7rM}j| zH6vZ@_w-+4yD9%e_y@qnD?f?nOf2VUio2h<8;Bb&Lg}QwK84#vzGBPCS8V2H$3|{( z{nPQ^Bbs*`*4GZWVIOmyz~-PATdMqu@Y@2nO8H3+`EXHhx%o%*<$3^@?$ND)OIErm z=vor5)Yp8{1}VMN*DSd6%v*~6#@H0)zXAU}SJ7^ipTx5RZs`4PJVE`48_rTXsjqyv zb>u5H<{wdUu#rVPAHgoi`u&#Tw-_!{`AH5> zz~w02QFJrlQarjexN@b7zcIuLBwnenQKa=yda19$aL1Xq6#H*uE0q5{{8wK|yHS1; z&kDH6``oz8(Jh9nDt5~&_4NeY3i1`Zek;#)u=Cz_Y`1q@|A?C?4`~~ezr>dYcdXp8 z<>+PGDt7(G;deJ&y7H3XLOMm-Fgs|23I-Gjb|;oyWtMJc&>vzWNh-guK!W| z6G>aC{3X8La9cid>~{3BeNy>#>(6rqxD@3l5p;y>_MV&nLUb+Q`g(N1;;VFr&>g9C z>g!YtV*sU>c)o<&O}f~B7&}Gzcet5ykXH4!TMvSI!;M|%&U>Y!yBco0(n)=Fgquaa zVnes{TnC$C>=dm3yeh=M1!)VFzr+^|w|K8(SE85g&>gN{9ey=e&~B8U#CII-oXS7> z7M?4>#dvi4;JT^&HlW+fJZ=;6*hX6QR=3;|&nCF7q>KHFv3-?)75*(qJD~g|hhVtO zd)&AOB@lOKu2V`U^>rLBjeNx(AYZW=?>jc=1J{2c{)b7MuKXpweQ)*b+C6dFb9{9#`rso3x6ehV``wE}wL65u z`4{1TIGT2&{3M5caAWUw_Y*OIxZzeQoz&M>xH04_Hivx0_TA~&4OoBsO2+>U(#9!& zsjqc#SC=_9au?4@*dB!S`>n$7MYtH{C-FTCH&5xR(ande`-fY8L9^frlrCvth_#V< zT&b_|q?IbY#4`r&WzxkyV{DP~UyA=5QRJ!oWIyZRV#m61A4T^fT&B`VeLV{|n0&=n zk+0b0|8#6*sp}szi1Ls&RQXGMv*2nzbnJ5UvR$nFrrfv(*^EX(#8J9*rCdQ9RBk!r`;$&`?$cJyUUHI z5Zz?BbfpWDxZ!$}uh?qx6}#a>$0q#C^{>W%6lrnFU*a1Kw{y2+OVP{rIpr5Wgy#xy zbz2(NLwC55Wp4h<(M7|RdvvYg7Ajp8x@BKD^%X$cTBVnG&U9jakaV#R8=Iy4yWL7T zNXt}y64_w5k}+;P3(@t1OHn$hukLVN$X9H_9-ix9>x^B#*Y)3ye>7=P%3tDZ4fkTH zV`DzzISJb%vHtThY$(qa;3_vatgrJOIW9_0*CvY?bn_!#|p|bmb?JwT4@n?8coujJV;FluqjFd&>!}{y%5Pk>Y%KzT5zIMZvsQlw@W1a9B{=w=>v>T5M=^ORoVSpj!1>0)m;HuPgRo>KfzT}Hc6eiGT2aFgzIbuqUSH(Xz( zlls~X7fillqYm&~2OFcTzuc+#ZzJv8o07ZyHL|~5*#y^b7uRoW9dU`3eEfbJ@XLiO zR(_Jh%c57hpd{v5;8uEci{N@3bn_dBZbF4qUo%LXr1Vl>X>h|y7kiVj@ydS{{@dEq zZj_(Ivk9*6Xm>x==yKs=luqjFWwVxDCora+nHNp>*Zw#=|Z2=*GZB9CG96HiG#t;+5-TB5BD=FZI+OML~ybthfyWyWq-{_!IzMJPV%d1SFkpELi3J!I_A3fI3J|DL23DSwHt3taB|j@^J>wht)34x^Yyf?KHkB!Xse zVTaxP)6oUMjq~Wvw53jzt`uD_;+6V3Oj#G^u4(5}^79L^#3)|rf$EINY?PM+f0i>;0{u1ArHq3wRaO^7d zvR$nFs_;7oH(mKj1fP0zgYIOW1#YNEw*#(P<+lo5XX2ImdV{n`rI&ct!8IdY?Dzk6 ztaa2a$07XhCN0KOU&G;MpKx_?$=qkc)v5d??%r@Km2N4zCU7S`y7R4x`#U$kqv%e- zm3VYt!u6!)HyCcZ(yc<*PJBJOW^gOdyZKe43xMn9(VdCl+W&*AOZpY}QE*Wn-B!5N#^1T^ z58WGZ=iYGJub_2stCX$|-5j_ok8Ud5yryn`$z$nf;I?~oW8gBBZUefj;Wm489pN&Y zx%ma%&3!gpmPZ#1m!ov!&>d_=|KZW?hO27s=2wVr8{9aLZWG)&r3<@*bfxHq!DV=K z{o(p{bn}b3mwpy*tVh=cZlu!9Ls!#+YmY~F9Ii*Sn_oG)!*DSk-9ETfrR#Pd<0!aD zkM3o-@UCut3(;l6o&0OV?hteHFcQ@Qok8U_zj?%^5PyYv3HpxOJi5VfSxUDGT|2l4kFFV9%nfdS)#w7?s$Oq+JkDH7pQv<6 z6X^foDm=Qaa3%fR{MMp-18%cNw+^mI>FUtUf!pBGO@+&dck@f0NdE`7(4!jzm#K6c z&|M8T+oS6Ucj#s}zo1n5Ke&+|T`=4^r5lItU~{fB9^G!Z?TK!Fh3K}y_4VjB!Idao zSQ`BwTsM#I3AmL5-TYF~&43H?=+fZUDqRt}esJgV8y>gra79Dh{30Hp|AQ;@=vu>B zx4OD1=#Dj`Y#!aGa6N8wb=%SHfm`L#?SP9@x(*N0|G{N>bkD+7CAs;fqni&m$)lSE z7dG70m7*I4H_oH$50^F4)x}Jr|AUM3=(@laDBV1CHDO$5Ji6m>MWfyP%F!K$vpl+e z9$mM|^nY;G8yX&um*KL;y7?_cmkn3y(Jg{2Q@TUwtn~rbT686I=eOPcfNeB06!u4ufwua)S!z|HgM+QA)Cx|8URU&8pwqdN@O_aQgGp%1g}3fxeS zZYSJWrOQD#=+6OG6uNX3dkV1!P2qT>moy#wEV%UP?!LyMn+$jEFAa6~!WAlAA-V&v z1z2V1rmKAoWnYm~Sr-Alr0IP%ft#J~?rS=_^G&&D@aRqnr*tLgcEGLj=(fPcEO7IS zn#MX_aOoc1YPdm4Hyd3CVoyTXLB(Ei_N?y^X?LTSG#&eJxZ-EreZ@V(^$#w_qw5V< zp>#{pC9to$yZ|fG?5nx7C-!xcwBt>oDB8-@E%7I-TPWSMJg6gzJ{&>T=M% z3|HdOWy5X$v#UFYZV_CLM>hxVfYObe!8>;A0<78SN@qLgg2bLe?1iNDL@#MN_AZj| zdUs!8Gr1nZjr8c6$-a~>72V-bj*~~X4{qLH-295r?S$*#(QSpBu5=NPa=ycbdvuFL z_qvT?Wblu^ilx`uq0JvC>?o0^R`eHY~L+FmdSsvY|aG6RM_c-GnxN7=p z-Tv0WMU}YuEk*YtT&YL*EL?)p9Yr@DuGpg+180@G`NhxXdI-1Dqw5bBrF6^DwSZgd z(FMa*?{@R6LRS;anBJp14p*skgXS>afg9`5ZGszD=H|BwT`pV?kM3o-c}iD}ZU$V8 zN0$cIx7^JyX)gUCTpiaHUC+be#wy)fbkT4pJ-XI#6(76#)uC$wSK`r~58`+naCOPQ zVY~xZj{_a(RG2d4!ikQd1iZbU2|-9EVV|G2s$bUWeBaZS<3V=G*_ z(nb81{tvFoqgw=5__dqg6m)aowtI9_;fj@RJGw-;%^qEExalX{{5m{I{|A@l(RCC~ z>C(}i3grI6qx%vr?v$HfDY}Dj<2<_EaIs1klR^InH`1e90ax^$o8LTii^bQYdjhUR z>B`ZKf|GHAuIIsURkdz@-R9H(!BwwosOt`w@V%>Bh%NxG(xW>Qz&Uf?)g3~246fLt z`xNe|(#0*H|AQ;^=+=qOs;-|GTZ-;QxTPN5vvA!4T-{N0{#N|AUM4=r+L}YU<{<3SBPT z$+ZoS$IEafVXm$k-3+*+9$gyT*h^hq(jxjlxFU~kI9#gItwk3NSK!gLhD&eZ=2wTV z30$T}cizXEVM>?$H2ojkJdbV%TxlyezYXZNz$JTh`EbQb7xX*&Ke(YD-7L7Uwr+mo z&`pMm^62h`i&45lbUooBJi0D$)sb#~VVU%Qa8-Y5cs!cHom0A0bccUn?J|#UAKco@ z-295r?S$Lx(QSoWsdN#G>Hpw1cyx>4DmuFPO+hyYZlOmv6)voktJ{t)5pK3e*BdT0 z+SPSfLjMOh(xdALSFLpE=uVwy%{!0oOSq9&x%ri%I|$doquUKPTj^q+q5p#m_vlu@ zC3kc4n}=>OT;-aE$KwgOg-TbBZWP=hk8UvB?4E9Z-Imh-!4-OR-QlKO@9Gw!3xM11 z(VeLavVv}Mb%)R$gInd%eF_(&baBtp|G{N>bnD;>65afkqI(f;l1KL}T&2<-MK>O9 zoJThXE@_yXU;K0Qe{gXgU4OU@O1B(c3%FR1E*NgmXg9wqbT!{|Z{^V)hf7tuLBFT} zgR5TM@VIS)o0sh7w+dY@T&YL*GTcg~t422iuGphXgPZazH@~DT`akjY=!V11R=Tz5 zqT!Z$bgkhA{o2j14qX$tRFCd_E$v?ElC$am;Kq7%JK&1%ck|nTZVOxwk1ikXq|yZ~ zqyK}8@#tp39h%_gHxAuoxVoH%^?WZ}h0+zG>j`(#qw4}!l;-9a_6PbuxDt=9nQ%&% zitca?z8>8^xUrMn{EE=+gj?>>ZH3EFx`^fUe{h)|-6FWshu!?9pqm4i;?Yfo3!38U zwxdggOZMn`!%d&=>N>2T|AXu1(RG9?P`Y$0Z}e)G^R7GIC<3Ape%uC5&2D7eiY-C($*3tU~d7wG@svOK!( za6wPGx`pW0{~^Gdgzn^n?!02`muG#Iq<#5c`Y2Bx2jOCux_Kn5WPMM#1dnbT+)$-k ziEag4oJY49&RXH-cM{zbaA6+Z47ezz8~S31RkbX@I{He0wMxZaeDthu18G;Imoz<2 z?g+PXjk~X)m*@}SiafetxXns84qZ6)v>e?^voD!*TF<_UN!xms_TkCn4Y-VacVCfz zWc_HkDIVR6a5+jh9i9G5oMQj>M*8H((gsYPGKDp?hw}>^iPKVNJ~BBKp&U@Ep3`C{r&$Dc0TY?71!I}jUb?*MGFcV6f`K*P(eYV zCM`%1(4b&~LK_N!M2I9LK!QXQ1q})sTF{`NLBWE84Hhg~&_uyPg*GTws9=Ml1`9PP zNKk@_`+m>Nx!l>SzQ6r^a-V&k^URqu_s*TY`zO0z*lW+%zfYQ;k$YM`T|#o!%&eTe z{H*DkC?%tC>cq*>HJmncC+LsrOyb!yCgv4REx6^5JF=!rFl2sz#Qf}lWFau8`s_UWH*u|IWyHX=Af3n%y>Yr$ zx#Rl1ec&2y&zdkfFK-Gz+cPmMhl9>9Iz)XZzsAk989a4n_Vm1|(%lt`#sA*nP|D{4nW;0g+^VDV4a}S=rDjTlEP5L@^^QDu4}LFRkd>R9 zRgjULGsD<^DE|Lze{0qq{Bn^vnD@>P7kE`gtzS}1;3#-=MAxsG6p}F^J14uKh-p@s zb9x;N5uXj4hGqu5wCHyhJo>t#0z*{c|=E|!1 zz3}Pv6d#kd$lXI;Q`x!ReRIlq`$8}(AkM*43$hDx%%nF|fBVTa9Qc3k-qY)&@&Dhu z_q6}?L=CLhcE?L4_V$0Q*FpRD^2;NEYYOJG>$&f^A**2GWIZ@DtgMw-2&~87n{mUY z&M3&p$&qtf*0JwRib>^VkO1vMG@sFJCQg@}h z07Z54<8deXjML?N-MIOrORpj?x5w>|op~%+9BI9f=}qExf$}GW-?h1SE5A;3S4NI3 zm)Qk!l)VL010MC7Au}I->}c`*(b2#6_PrUWar5w64?+8>TzU&KR`c{(z~YwymF zs2Vht8;`2t2jZp%w-2e)yQ%;C)7Y+O19LMtQ=B3GUw(d(GRv`hP=3kNdD;*?ccejdA@T#7S*MTv_v5xa*AU%aR}#k%9sgdrf&Sg~#Clog zuFse_#a|QTbku=KeR}tn>F&TKpf`<2MZNPtEYbCS@8K#mypU&}=1J0wyquZ*5}kRb ziqEpB$0J|$dgnU@wEfTw`90L>Gi>|QEUNu!)%nq%AF5AJ0LSI`_d|Y8h#&O+*!cA* z{$Lw#-~Ct(Ui`=U{DI@~W2wxbe!%}@sa^jM)-Hx0$QR|+_>b14@$c0z|5M&~sEB@j zuLP~w`QDh7ye~HmttQ~hLUX@grU~ErPk2wy@yV;9tI(2OvKW8CR}tYI67$+Fle$aLdQ!Jw)A@Yw3wTtq z7WC?F&-;1(iS1hIk6Z5bL|fFKB;>fTFIX+wqySaKf2ChJ?Qn5PWw5;8kR)YU5K`1yuZIU;5&x4I^a8qR_y%0 zek||v?L(U#@a;rPaD18gI-!krd{TE?w4ExnkY`9JkEc|Q?tWx&?~t-Ir^#Fs%I#g0$v9);GKx&?Q4;Qv~| z?TQ;fukL!z z&-)RMPwHNVmb=zs9Q_M#r`Xiq@23y%KaL?b-f1tD4M*GM_{#9@Kx-fHRini^{~un5 zZ#`Q5;^^_MLaTb;?>CY6ACJ}Y{+Z*Gx(}jNS6a-Zf8nDQlbw2sX}^M4sncG1T#VMy z@$JTU4t@6v_*$aH@AKbU1+K)Eg@yYw2W5|&n@C`?s=lp-Uy#F~6txv$$7pPe%05wWAZ@95T@ zE802!_$u)oMq3&1?MLh9{9kqp-s^l9tvKM@hIWYm|MvD*I=*wz(j1@E-4d;Njm1*> z7d}fd)2XL|_FMLGzB%n>1TUlYb9@c>dXr=OqUiB;L(6ympE-s1S399C5BS=mb#Z(v z@r|L6S&mQY9*#Dgx&>?6@%>-mX2nX-8+RS;+YsyLw3o`7_cA9OUn1|p7U8R37+rTR zTKs2zzH)pSXj=omQE0ml`o4O6E9j%b@k!l_(Uz^Y*q;7{w^nTUsoy?<_i#rNOLy8! zWrNYSJHAqUThQ7Cd@qZy-p^NyZw=a^KSYmj8QLtz*QbJc_dfg5@k!nL(T+TCF`fQ} zk5Ei>>M5Z8Qev~6_R`}5w04fK245Tc?i27eoQtwz;_TW)A1GK>y1|T zdw+aVcQ>>o>K0u26Ta5~T%uSCdh?`;_87H>a3#Kv(Uu2%d(aks?bqFeZwK0}fUg>Dfa6PB!MsBo z;rOKP=G|O>Q@7yI=Nlt}-KkeF-l@Bs_M6b!IqhWxYteR%^6Re0*MokxJ`z2?&S;aJ z?-fXXmUS7eBH(L@*3t1*;2TLF1&&YZ9*kD9(&E;$`CcpdM#Yt&x4&y?A12nvX)l$X zc#nPN`1<^jvhY?X;K5lF&9gzG8fv&|(9=wP+2__b%+lw*swhe)RYjqpfs&39FcQ z|Kb|a@k!l#&^lAMU>f}k4pr>q)RRN|MZ}7o_R`~AwAPMqE50y&_X_w<;M*SZKR+M$ z9P6^Q4fyt>&2oGN_h6q|`>e%^Hhljhe4%17=*^Q2wBPqG=bO`BGVMeg z;rL>o=eUp~E#ON+%Rj@fI}=}Tw1j}K8(J5~SA}mHeY9|VQg;?w^$Lr1t@&P4_+G`W zpjUSj?Yk1&`j9_vxz_=0iQ`LK&2d4S74XeP+tt#qyAod!+K7NJ7j3rVYq5rTw~MvH z@k!ll(b`hCU;_OMc2SIV>Pe=3HnBqwM%O(S?LaGkd=>cip;ZKYJJCkB^6PHEw*{>r z;CmUZwc|^9fq93P;`pTQ6Yp^Sz1(5}{R^M0nC8?|M*H=|Vx9Iff>mhU9bX;3uJp5c zZuIy%pki&bax{YUV1iWQ(YPj=J3 z@ommGr@d5m1TEk3B~)@;$Wd1sUH4eDld*o?rT9joRRw&5(N;UYT6~M>qulXH-E+~J zpSIY7{)L}xX|WFU>W*8>^D1I#PJ5}WFWN@OSAcIlTI+ys6fqhEum-3jGTXP)u;@$)x>!VzZp~(qjo)$njO-YeY*3_>Q3U zI@hne{hwKv(OLw2d(aLz-{+EpuPa*Z{r>o*?ha_nmRTJCOk+g&fTt}cg5LhFr2V@! zoNrEh$+Qja&~X28zQsC@3pqvve0|Xtw)g8!$JYa`d%)LO`geRA@MY6S$ni#2G(V?@__FI`Qja48NPvNIgU^2?u)knNsAl8 ze6KZpwPHEw&6671AKStC=Cqf}4x&wVeDN=HT*z_Y-srkVp>^-=*IkTn7}~~wF9~gL zFW6T~VlC*^-ToDxR}mZGw3o_yqOEg$Ir!F~wFvl@ zq4oKtU(Z&2i_mIIqQ^HEt z(_VTkL^~Ndc6xjp@Et?z9`GGR>owS~J9Z=MGFm9$+lh7{+4p7Q>x8zq*dL$N-4<=< z5{qT@FMPIQj#JM{+V6Oa^UY~5nX1tSIKC!){mGFM@byH?zsavBZ4>JraJ%9L(3>aqv_FSfmD64_wM3ie_>y1cxS-_+e1&Mc zf9uy>fiD|vXuvlXt<>=~;9K)|#^U&7e=kGJeZpcK{R?lW*wpOT-RCu)R}njKw?A&V zHymx3<153r1FbyZt46EH^6Rd{w;nAg;9G^3;`kD)n0MRwpC-pAbst2le%xXv{RoRQ@27E`*mN>preErcT zJ3gtqCt6$T7OZSK77<*oSO$9YWGn3tZ{>V*+Dm2o(Z)NzxYs!@N!^8LV;5U&`1V*t_#wsJpjUV78$7Qfmg2OR%DSPg zc6^!mR-lCfzQt&XxqdxW_~xVSy(@ZrC1~|IzOVge=H1^|YaO4|U5&Q3++rgA3-6^E z=hTx%`yyibPJ8Jw7wzaNe|(kr4x_~feEZQ>PxI?(v4wRRt!ZX--P_PcJHB*$=b-I& zd{TEywC2YwmeRlQS&ErXJr%Uy@+Rk-(_VUf8Lgk=Yrxl=976-XZfGep{JK-#WL-w< z67aP}Yntx+R^l5&A14d_@k!mo(S}pEU`^w(h~Q?$O3<4pb+m6oY@^d&GBs~$5t{Az z692|=!Iu;8YeryO4fT5`ZQ3N5bC_toQDK_79BPwHNbw(L=h?de~5YsH3>e%%RM zd0s`Vw!j~^+#8Ix-SL&;+k&<*;CmS@ZkAt9Ext8qlLNkGXf=2FzCPQScbj=^b9_?w zezYTtET+@H@DYlMPCW&*UrH?Gw3oUUptW;+HTc@l_l6nK<7>uOQR3GV|9949w6cKj zAXK=?%@_UP08;(VUZ&X|fdh?`~_F-Zh zoc5CGL>243s4Br^E0Ri7|v?Y$O4&PGx=;-*Q?geN&7g&s? zf8im;`s04x@jH25MQra>f825}32n3EE5^48tt{YMi?-eQF16kGR-k1De2dX$IlhFq znRl;ojo|pC?mcLosar6O{so6B_HpXTq5UFaO}Wu^&qZtP__pE;)Azc7?*zVikNNvM z?j6=;(E`5xX#E^t0lpq+;~k&W-5D*n%wok?$0EWPDi(v@JlR0|eXnx9IqhWxJJCis zzSvzH7jo>*i5_1PTH51&-I@4$qg4ic-OyS%zAAjv=%du}N!?j!)sI-LJ9aE0e6QkG z(5t(N_Fai3JME>i4rogpU)sAI7qpX8qU)ZEHuOoq?n-<`XuATwTxq-1_qF&J^KKK@ zWR6ejUW?Y2x&;&HU$Bc}tW!@i?X!tZcG^p2W6=&A^~YC%Zy#D*z_$}E@fp9K27Fu4 z8t#l9-^*zAPy4=<_n3ERHI7f}KCzMO?}sfG(7*7>ifK+gWwc*UtjuXIJ+4CQ?)d8P zb)}yH0bd8S*k}EE5_hvMqje1Un#otS!uOTq8-{i?+aI6QorJb_zQw99k41#9Q>*~J zd9s`KjejNPw3kdr(DEH$!XAzbIWhyjv1o@@`t_9J8;O<}@C`;=;`nOuEuxS1j!){I zi`G2PVhj2ge)0>8b)Z*w+`oBVMQrzEf827fFWN@OSAcIl+Pr{o723+@{JLxKEkzq2 z@GU?~bA0jdGw)tujd6TZ_fE9o)Ge4o|AGS)6P$W7X+NLX$w|?5m!O3lUlqPaw90_* z2wJ~C`E|G7%estK8u0BwJM@C@%fZ(bE#2`+-5t=DJ!G-`$gzmr2HJNbHo$2wm9<4%==f4T;JBbQWJT9qf;RglzwVXzrlHjYd|7C{ z9A6W@^&6ODj!)`dg_cC!g7Ne(*io^CQ%~Z5cwR*;(`hf2jY8Y|xj(*geD6w*fNvYx z>X-ex>+x+uJDM3izO`th9ba-S^X@NPBRD>(`v}^CxfXNiU-)>%6sMk2+OHut&uK3` zE<@|$_-gTWqVL3juPs`I^L?Lv_OmXdwGa4CkT1pYmEjwRRzJ}npVZwKZGWl74gWh9 z5x!cn9Q5W%4egJ;#QEm5mrMuICOf|P4>>O67$5MBLTg{`@9$!K!_fK#d`W0qo$m|X zjc+}Dv~zss_dC#fWH3*_($|hh1lNIHy>TD0&Z6y|5Ix?(XeS=v`WIZe@pweAjPE-Y z9Pz5(KArYqv?We^$#h~p*L{cm{jveyG<+!mUl!WXH~f6D2e|%4ix2pQqn&)+_hsT+ zN*_%b(RD9C8%*7TvGgw(QmjAZ*RzuL!-!Qm?IlwZ+GfYsgl`jCe!#aDZT1$wp0tm- z{zV%a@GVB`<@hS`eY}o2?D%AU?Lk|7zr`*OG)9Dn?zh-9$AAB@p7x7~9T@MATkg$8 zTix4#|1kLzjthO42Ye^+oqW@;y8_=~w48u%zvOd#4fuMXB|AQ;yEEFsITkDa%k?jO zp<*%U&9gqA@_6@Wu1%fxQuj`@5st46-!O7)92Y&lB((f(e%*EWdP`pcUpKTajxVu} zc}E|U9iP;lh1Qq41?xWJ`WM`*xE1v3E~b4~V%?qgQdtMIC5~@5zC~!Yzl*MWF539F z{JIkka{Y_8A>hkJYv=e%@ojpMbI$Qe-D}b2&bF99|H8W{#ya(ErF}NB6sNsZHWux` zL4SO4pK)B!LIK}Sw7on0x(o1a5p8Vr_+Cbv=lE*yh0)eIKB@b}+7_Wb_gO5Uf8moA z)0}!@|I0c?EZ=D_J+4CQ?)WnCb)}#9fUg7E%76NGSK(`e)|4JycQg6Y9AEoG%saH* zj!)`NLhDA|f>m`~|AOljD?o3aq|v^ylJm`JFFhVX%XfU0__E0{G~gSHR_lC!af`#O z%V=E!zQJf^jxQbGBKkP_TYr2~_gu8XdoAv|w=p7oU5Uj?(5t(G_5+D+blOX%zG$O+ z`s+ypzV&E10pBXLS?~G#JLP|@%V@~~-vYGmj&CKteShK_&GAXyJJGh4SWNkp>tFZ) z#RSl+yN>qriPiqbAGh2qK?^y)#Lqb{XbS_rBWQ=5?^!O#_c7Y!fNu}l6317MuPfRB z$0v1nK)*S?DOAFtthYIO8C_Mnaa*xxVhzhJ(TV|lJ}`ff5Cjkbf=zj+HWE@+G#J9twrnQ`0DZXpr6=)uQOWvM!%lquXz0zt!`BG z_*$ZEJ?Z-@@QtL8D#s^v4@S!^vbgm_UjKz}R9p#q^Q4ycVPeHjd+G7SbIei4*XKCL z1z)d#FAHtfcYZx(_{N~M4)}(nb$5Jq_?FVgfi!=7QuhM1>RA?J>0fwAv3|c_cYFhn zcf^)E?IlwZ+GfXBjBgWKTEMp!ZK(6T*}L(rKuZYt7Nebv_~T1B!Mt0=b)e&uy7!>9 zrEbA4v$*aBLw8whn(04Y<plipLmwn^{88LKw)Dzm90YCeyKlC z>hN`?pVk3i2eg&#{JImrWnD%)a7*;~nxzlNSB`HO+D6AGbtj=M8aLZ9LbnyAaDZZhQ%@%C=M&pJ+#k2xD?#Id`Skdz z@HL_p1bj!(HeBG>-9Ey)jFuAc?Lo_Qd^z~KqQyHtsk;N(g6S5^-{<-lK2Na#^!9fp z?caTd^DQO1?rms89bb!3tI$AlED8AfqP2Fuk3Jn=548M%uQS@lIDdQ_@MTLMj!)_y zi?)B7#nsaqBf{t9TPy{=x*KTUiCAl=y^NqOTCXntd6^P!6`GG$byM{CO3<1v^XplO zZyH*8z?X$q>G+!Pt$&*5U5-!cUWL|^x&@C?r{JzUi#4EEcVbMdPzJFCr@d4*3T@WK ze%#oPQ32kG*w-#-=<4ZoHRj6?p&$}F-)O`f4B;R5`>K5LS zdIj4%b(hk94cZ8&y;QagZSzHb-L?2S(RYi0uPs__ykB>p7Og^I(S}8j?*#eE9A6o} zfoK~XpVZwKZD*dv4ZC^$7rt7t9Q5{g4egIraK1V1rN@J4lO11tOO6XUx(9rt&^G?U zue%uEFf@Kdge-Ei|Bs%8Hres*#y6in_73%ZQg;bjXX+N*KD99-xH{M3O3Q6F2Yd(7Rwwv%$F^=2+J`nY z;M<8d+VN%L>x9xov{*RMORO{-8>w48vi16m))SBWo!K9U`u)IAEVEp-bnXa5S$o?@{W^y;ps z{W-*1IPInGmT28C^!Io2SsWL%jf11dSBO^J$FI8rUpCspfNv~Xg5ztzw`M7G-tkG@ z%h1N=SUg0X!nfaPaVzN6-RJC9p)tg|JME>i;b{36_;r`z+ksY_99?%cT7mQX9Ci5C zqiqQIR-wf^zQkDO-4fOq$0v0kL|Z$>V&*PB{|q0km<)P#7t?+Pu@tAhRJItcqvP9+ z?;QFL1$-^h%AMcsNNCHtOxwMKqQ`dxE!pvv;_HvL&hbgzJ<*!)v^b0XD|~de#Wc{X zdn@e^Kf%6r+Dni7(L$a4{T=rcjte>B1HR#CWdrb@xR}bbK}V=FrD( z$0v0cq7A2R!OheuxO}q33ec-N_NT2vy@{1O?WMtb!XyRAzHw<7_Icze%)30 z=A(59_)5_FIKKAnn0JqJjXKaDpVVEAwk+FX;@f=w8Qx1V4)p3yqkR#vjZS;Xl#6zB zr|+x8cNi@v;MIcw*mgR<=)F^d(ZRtcLToOPb15bs24Pz}FV7-0`i%H-

    uBGGSjcHFbvKuDtev_Of5vgax8c{(BH^krH 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

    wPrnYh!=+`mq|wYXk9S==CgTihuANjzG-VShee zlXy4rIPoxXv-m4xn4nfSl2?K&c@MSZ!dnv{(Aba?8WPi*ZOXt-(8%G zFR;In{th6CWYYZlb@zUi`lO&Gf6@tX{mcIJ<@ZG<)%#_RaKf+lzbL zqT~A~eU&&D*V*4n-()YIW`7%fZZBS=S&u(~zK=K;?`wZM{VDe1EA8)~pJFebYkwzw zw}0yVi2IAP7WxKz@nrkE=yQAVA8yt9C(`dF&c)~0Poke>FMiv8GJWUUv_A1p;_Pnv zMtkw&_V>^)u@`SULF>DhzCoOepSGVuUv|6Zi?|W?8P70KSjU#Bpsi47jgD9{TcS+yXNiI2Vtwe~tc5 zd+}@buhai*FW&M#J^mc}1H`%bO#3(JZ?qRbX8$Jr`}X2h?$_hLMgKQ(E*@gvMt_dI z_*VP3>7TO~|6uUY+l$|`pGUvyR6V}9zc_o3{tSEZ zMEm#Y=h=(bdr;>mr{6=Ii_ftCfPR9#_*MH4>3^{o_kBo@{}KHO;#_>I{e1ej?8ROG zrT*XaJBoAhh4%lUzu#W`f&Ity-KOdMiT^In7SNw)FP>=s3H_V);$X#1b&@3R-bW50xc*%?}&xVJd_ znSMWe@ul{^(BE$_e%t<6`m!hW_~Ji{v$EnZc`mkUd+`PKzoVaIFP>w+4E-`s>G8#t z;%r&^qwK{u*mt6zWiS5DemVM$p4Q`w_ZMf&)1PfGZnp1C|BAi%7yB;s{buU%#b=4L z73d$b7k_QPBK>;Ls22|qXDiW&$VBhzUzxRf8u`PY#sV~d+`MOb?M)* z7cW0s>+4CsjW`z%vtN(?dVBG+_UqFxvKO!Ok{*8p`d!4ixZb{;{u+DnBldrwUtll( z^UHetKhhs9&czqo|B1fEUi_MUFZyL)(fJkk5oa6HpJ*?hWRJh3zStJni`Qt?`uk1$emik4KE!?#`t$6?6YYD`ziKaTx8Ib0{nvDU z#QnwDX7s1pi*L2xoc=j`@k0Ab`n6uyiETd#Mw6VnZ0<7 z{kHT^*o(im-;VwdZ|U*HHR7xv{W->lh z5@(0ekF*!xW1rE_w->MTAFc0j`d!4ixZeH<`pfLa6YY>*(vnD`$}G1FV0S-pKmYT?rW`YIQ>=PT)fgZ@~6>XBF@F1+MiCp z=VHwlzb?+spwGUQ7q^PD2KuV+8FWv@n*lspHF|6 zI2U*RRsI6{qr|y5x4)1+D_gtt=h3m4^exu*Xi?0%Aqv)4iMqYe?IJ<~`lD&BC zWx0QLG5r{EF8K) z=i;HO$&aI-DbB?^tS)~&{bS->yg_&Q8|cp$=i*=OZ=}Cq4ep<;?3?8Uoop!MBJ|A;sjuUanO zLSHA&#b4RqMStEOG+(?(oK2)Z{EzbD+2U*xeZN1+i?0x8lj%RS7a!6~>${tNo;Vj* zZ76>a{cYl0yzxfz_tHNk&cz%4S$+!rSaB|1sY3of`isT6_&@gd)9>;Z?w^Yv6lV|6 zZ@jU*_yTb@mHr)j@qkS<|3Ugk#kqLZ-trI8A0y7iuiO8NzW=70FCHh(rqM677ay{j z9{*wb*TuQG_vZ4C(2o-5;&1IAr9ZAx^Tkhzv+4Bf{8e6jwK#i>e$_4H#ixj~$LU|U z7w_~pt?vo?hs3#fG$1I^Tkud*;Di@ZzV6jTAV#izy8+p;xXcE zCjF20;)cFj-!t?-iF5Jc+sHpl|C~4%Z?~=dbM#ZixwzYQ^0VlNiF5IL_RrJr*N^+> z;(Nu}3-l{&FE2hNf4?{vZ}@llm*{U2=i+wzm+AMd(tPpD;_Mar z>K*09_ldJs`tCc)i<`vRtMsexEH6GyoV`Z>w!L_-{@g!%o&E)JF0R-`eh&Rb;#|D! zuJUitj}qtNPwn5N-)lFmPdrPUy+yz40D1A9;;fCn%kJ{x^TgTP^gr2)586ZPdx!pE zaW39+Px*K09}?%{bq31Mr9W4ki+{AAM}PJptxx>EID3zN=W2QJqvGs+`o4R~i^qwx zoW9*&+)$(SeL(-SI2RwaxBQ3nFNt$;^*-_+(a#a*;_dg9pHF{>I2W%zSpMJiqr|!R z9sB>#Z@wS*&&79(vybU3_m>x6E6x_sFR>S2a)9Q4Lci`1_2MRR_9^{x2g-|26K9{% ze`+t@=^#D+Li!uTxp@79j?R8>8}^(;?<9o|Bk+1 zoQq$w|DJwOE%(pGuZgpE`fZPr7vCz*exP6VXnFA{arPtqTzm1~j?wylqQ6(1i!1Bo zm(Y(D=i+wzpXuw4)qL?harO)SmdDA9FB50K(sw;xUfd+k%6gXm{Oo&s@u9=CzTeTm zBhJMKpCG>s{S)F`{HGJ;m!-c^oQr#$B;Sd?L7a=*?3be-RL}i$@pIyAdHP-_%Ztw! zXPxQavlkzFispBr|45vR_dHd81^NfXx%h9xr^&BGKU$oNJDo1ym41{s z7k^^EGX0=4xPLBwRh+Fte^7(G_*rrGd-^TTlovlH&bsOG&yp9<5NE5>|Ltsf@nhm_ zHTr=gEzZ`WU*~*z z@g3r<2mRI;$crb5v$g3rxKLhvgE(79k3Ujge2zF#n~U}dt53n zZWL#KqF-PyK4gs6*NgrwaW3w2nf!+ISBi7-&-NS9pLn_Ei=Pr_f2Lpa3VHEG;;e%H zCwuX}O`87~`bpwkyxNuW8`GaF&c!d;Z$jVmD$N&PBhGr$uYR?>c(^#*l>QBS@u0Dq zzZv}t;#|D(HS(L&|3jRM%dVBLq(57ni{G~YEB)5jX?^1R#Mu_~mE+{aSBbN~(J!_a zpK`tC_o4q*oQn^>L4Hg6C&jsV%NymlqQ6I+i&q>kzcu~Q;#~Z?eP8-rZsPvA_y%#d z4gHt);_PNU{dvS*6s2;(T^AB;!bzS?@T{ToQprO?@xd5 zo!mbcPZMXm(67-VFTOyW?MnZdy?Dr7n!g+UBjQ}#W1{>3`cuTY_&NLC>9?4q`Qq!v z*&g&i+KUgHtjFJz{uyyDuDDx%ApIzDE`HB`kmlc``QowSteXCJ_sWZp5NCVQ&$btD zIYskp=x-9|;x+G+-qs3W9ztCR1 z&*PeZIQ?{SF5ch?`6K8@i*xZJ`y=UVW@x_nesNYyzv`3n;#0)gQS|fd#Whc9{?YXJ zi*xZRPs<-eKU|!PU$w8J-+ZR#i${yIW9dJ#7gs%_$3KpKf;boVcvk*+`bKdsZnGao zU;UisizkY+6X?6nk{6#K&Q7F%)n2^a^O}DW{cYl0yvhsm_4KESbMc4vC({plQS-%5 zi?dVcx1B97o-EEzr7wR;UOYma4X1y{UcBYYTHk5(my2`pclM{#ANYzMU;L6dJA;15 zR(bJl;;eyw%~$2cmx{A9>A$iU4|+}OJBxm*I2W(|y8PMnqr|!RQ~MG0zbk$Uuf>0~ zEnZ`tvRXrN`}Z~fn`;U_x@>8Hdz%&i8Gh|5rRt>OrdMG2;-AkgD=*oyQdymN^kdb} z{XKhgM}73@r>g%&y}6@4dh~PDH);K5_nngUM~}Wu{gdj=?tM=?)vtaTd$aqIrFv-}J^H$FoL{5f?0!PhM~}Yi_3W=uZ+721 z>7z&ASN+TC&F<@xK6>=c>N{V~<2SqSn)K15pRE3H^=9`CxKnJnsSf*t(f7KM$3IoQ z86MX!J^tv?*QkF+z1e+z@fg^^m>)g*8R|E?g2!)mKN@$64L9hcM?c^uuD?mW8TyIA&aP@Q4o88ypPO;$z^P@*U_h!!j{i?;hz}O%2M-(5}!05d{82yl2*nirMy%`?; z*x~~l7=85U7pm`3yZ~Un8T+Hh2R1PJ=+Sp;=KOs$-|T)?sb1PgkG@U)u9|OlpFV%1 zM?YWvG|e}=AC}CI9(~O}x&CtXX7`gS(WCD%k@N3U zZ^r(Zzo_`Y=01A#T_&;rS-rWVK6>=+>QA|v$8UC@9)I-c8z*!AMD=F(ow)qp)*n6k zk?M2xX7_!QK6>=i)%O_7^_$(N^P@*UL;d#Z&F-s``O%{ z{c#t4H}z}j`$sc8u7BD`kG@>}5n8|5eR=U1*ua<{J^JD5?@(`c-=|bB?W0HEqJFh& zc>c}qyC;40=%=gSP`%lGm!yv#{Q~vdsW-b%&tLTD+trU#Z+4%4{}es?Uia|&zpUQu zzJId*=+W1!|5Ux%efs>39{q6jWyQ|{c>Onb)JKoLLH*k5%^mg8qaUIE#p34x%s0DF zuYdIDo75ky&mXh<^!V+sEk0k$b#8HUYQhgE{8@3C;{JUbS1a3Sx#Ifow?^qvE)|#U zPyS5YMci+>HOe+xzN~D@t@J00pAz3CenI@YxK;d}_)YOH%k%N(ijNjA7T+N5bQ|Zr zDPB!Ht~g)uc(zK8_o*?(G-bCDO zdHSsv6@Im{vf1V2ThCmxY@_0j+6NTx6JeW@tmhH=I{CN7ZQ}is^|s5G7w;=!Tk$MD ze!cjrkp*v1JYSaQ|G)oZahv#Wqv)$T)4z6T@%#G43uyBRCpSnI#vKRGVp3k&}L-cK2;&&R(MKbPb4*^GxSPG{Np}=cqTkPk$bW9{s=vx&DziaQ$ZY zjaYoKfwBJR(a%=@wtBOBoC9p`qes6;{YJ(60yuwW_d}Tf)<=(iz(ZXBw3B)L&F<6d zA3ge^>W|fYvwME_EM0%}=o{2Os^08=Mza3s(f9oq*T3p`9>3ZBfTWKeeWUtg)SKN` zC4KbhXQ*GJcwYqP-|W6I>7z$qHI3^(R=wGMdi|qEU#tF;T3$c1`}F6r=+O^exB6+@aXFw;r#2=o81pj=0}fyzWNo5_jNGe?0$Oj zH5VJWI`Qb6XL0^H>do#m#Kq=5dh}(_vp=eMUk3Bd?wgDM37h-qOY_ygslHk4elYHY zK6>~BAt&mXh<^z%P@^dr@ur}<|0>Fa0o=yUb& zsyBDkM~}YWY_5O1;(a9?zuA4B9Dnrad%nc}M)hX*Ba=RQ^v&uIDc%>te6#z;q>mnb z`OBRDsCu*e^z%P@^!?SZTD&iW`DXV$ai`dDQ=NG9*(;pC%5l8@X6%pIU2vz^aDzU2 z^mVQ5chP(^_D7$-engLcy!vVC&F&X0TRcdyfiXXN^dskR{^qyy_|5Lq?;oN^zgYbp z>do#elKIi2@7c!r>lN>-;ryH3k1nl#>H4Eb-=coy;(ayrX7|lWA3gd3Z*%?y>do%c z_rsz`KjIzsAD+nTZ+5>pnIAp+`ghrXsrhF2>G_WyeXf2;@xC68-|W6$a{i-7-}8OW ze@4C8{nTXr(W7rwzr|ggZ+1U8nIAp+ULSG(E$Yqgrzi8HM?YWv*~R;kIDWJHF-adi z`uh2t{~z^c_x*6E*l<%F_6MV%{BQQ(p2X{KhR5eG)`Sf==%Yv9`XBZ?t2bkR^uutc z*l>eBdi4Dku-|axQD0xYFNtF{ zyC2>4zx(LXkNl4FH!I%PLT`4TKL4XfzgYc3^=9|~^ZKLx;nDZ}k@F`OKSyG|+5P{# z{%C*qE#fKG)3dyC?Ib zM?Y8nTE)+ySijkQdi|qEU-1j)*QqzVADPUL9{ptXkEu7iPrv_(9(|WzIe)d{=TNNQ z?7mMjKYH~2)E}eX>^^<{iyr+V_0!dx-T%+ekJ=v|{eZIKjiq9%D}D~e`pxbeOLpn! zU-al_see?x**!jov4N|@{$TVA)h}QC9Etg6c(nbC4{Tuc(W9^Y9oIid-~XE3r_aCW z(f3!sx#pYQ4=zn#IzM{!GhAkw0`w}YvAiggV_DzWPbGMhjrro zd75u_UzhaJmyTckKE=#!>do%cuOHE)AE*AlM>*f@eoQhydi1?koFs;rTPWPtRZU z=zFW*_8G3<>^@7*U-an5sJ}|R*?s!_iyr*~^e;y=BEM?a<~`x(Xi@Hl=m_Q&z3ufNfw zuUe1&j>Y@n=*{kj;7+mO2J@pwKW=^YyEpRso3VfC{1>;_+((aovie6f-|T)c^WXaD z(U)z&`Rf<&!(;ts_q9nMJ^EVpi`1LlHzs}b=;y27zjz-W^UdyY4zPi%6OX=2IoJP- zets~!PhbC{N8eNZRLwWLPrrUdkA9f?-KRglMvuNp{fX+$?ib)rvEimV><>oY@F%Xn zqWE(J%s0d1*c*!vY+&@!qi_RGG>-t0d8{EHs_c=ea5 zH@i=-U-alJH{<-Z-r{_-`}Fw}J^FF#H!c1g5ZB-Aei~2TZ|5(1^fjAv{)6hx?i+EZ z*l<%F_6MVHtz`e)dByb#43F!#xcI;ZM(_Q>=x6?w{g%a_L!vjsqfd`Ndi1@wVE=@A zv-=Ur^^YEXOCR=w-r;<+`_^I&*uYqS^ynM5WdE*uv-_!~dTAehY5n*`&|*8b_;XAg ze{Zq-rlgM^{dDbr@m%(1_vzi0j5*Ut=(Hobn)qaUmOK+QM1 zPp@C}=;y0n`vb1u>^{AI(W4){9gqK2^=9{t#W7$5SBL$<=;x^4_(RS&!{hkV^A|n( zcJ-r*A9V5gYj&TWzv$6-?Z@?>t@&p6>H7!KqpwvzSH0PNZE+0Pz|~=YF#1{QcPxI7 z0P8oyG4O8zDE_0|Fq$J{+ivV#~(fV-s*4Ge6#!X=eOw5k5k|IW3J!qK1iZY7`}F)pkG@j2e~TXd zboKi$;_;i^|Ig1K;rP%G*n`Lata`Kibbj>c$En}yE6z8&?^}BIE`9z+kG@s?9qP^Q z)6c)?(f8hy>mU6!=bPQ9*FSpnGt_^l-t0cT{?VhKul^0a|7v!hUjOLPx2qre4cBjW zpFaPiM_)UT$G_QP_Gb6#@kd{pul`!~?PB-o@kfuo=OE6n_UpIUeR}-fA0B*^GN8hA=qI$FYa@;94+*F7C!RV*d zaQ+JIoNtE5xoa#wuz}G>kG^tm_Rp&~chpB;ny-GNA2eU=KD~ZZf=53`Tz>(tpV@tS z{h~*|K>gX8Z+1Vhbo5J)KYH|i_Tll*Q*U;kUjOLPH>uzGM;^b~efs`i^yu5w-=*H{ zzBXBZ^yr7~%k}@h_&sEN|7~`ke*K6Z{aE$$)SKNmCiA05-+eIW@3@5X&F<6dA3gfM z>d!o%*Wc_uz5daoAE^E&%{RNxlJ!TAezN*ye&+hk?$hfZJ^C*AKb9BU@#@X)2PgBR zM?X~k-;3X)E?qyd`^KdA{_yDMYX3Xbo8719KYH|K`*Zyd>iaLV`}F)rkG{M5<$l%m z7rRgY|5M%{9(~UPIKNK4*?s!;D|+;!)xW9U?0#f&{-Q_UbqMF<_p)*R&F;r0ee~#? z)jy)%>^_|zJ^Ee;a(;91d(fC~cAw6V9{n`+-HP8sMsIeXUjOLP&sC4#YesK&pZ@=+ zqDSBDV6K0Oe*etuK7IZ~UpjvE^EAJg*!_^?{6~*|g!bQkS+3vgKK=ZS9(|koht-?i z&raq?kAA{X9{*oDalYAodi|qEUvUWgm6l^~cHfxHj~;!C`ZLv=-KW<-di1l^_tW(= zyHBrQ^yqW-?`yuy*?oHbqDP;rKe7wwo870^FM9NyGOj->o@n^|HM>u*U-amE zsDDQD&F&W@=RbP%WruVAYAbO4X7}m!j~@L%_2;WMyHBrw^yu5wFII1MpI-my(GNI+ z>z}(K*Kc;8Ucczk&r&~VCH7|b>Gg{q{X+E*sW-dtjyuJMo9eJX7=2kS*MDL0LW%2d z#$C)#uYdIDyQ^QW_&t2|X7}aAV_*Yge)Q=3s6SV|+5HmSDK^}oj~;#H(Omye>dn|6 z>o1Zz^ z&()jV;~ZcESBL$<=*O#Htm|)vN1I;%=+RG6pB2AHkLz!CpML)qJ^E?Ka{Z61H@hz{ z)_@I+^+%7sP5m~-@6ltv8T(`XZMaixxIrI1`YFeA{xtPw?2mqA@qx{K^yvExW54yP zoNsoYUcczk&vL&Sdviy9^yr74!1+_vo899Wuz{i<&w9yrdQ86Iu={af_t zr=H09_nc7dAJ~2R{*U*EN8jrt_B*IIyB|^PhYgJNM~}W){Uutz+5NOqy|j-W{fK(b z|3JOjeUGG%9{pJLS$Cd4v-{~uA3ge-lR5vw<9Ytf?t3PE^yr7Fe@*kv?$h@VqDMbR zeV;YBezW^7$^7Wi&s9H8z1jWLq>mnb(t&F<6Vj~@MG^*?LA*?oC3KYH}D z)$hF~kKgP*U4QiG8&Bo>$E!EH@1M+%9{o)9|MdHhV)yCsdw+QJx%PiT^UdyuC-b96 zKX^FTzee#FdgAlf?7lVWqetKCH1=cFo8719FM9NC>hB!N>u+{H6nBaZH`QT(F#0}c z==r1hW_Y}QrQg3rkA9^3caG(Jv-{b_V_*Yge)Q;T8aRLR9z1_$_v!hI9{u1m*-ue# zcHdB%zI1-{=v&qAx;E#V-4~x$r45YrM~}YWS)9M}I_%9I_0gkmQ9o3@*?sS1e)Qdo%c*RSZ&cT+!Iy}6@4dh|Wif34o^er&S-=+RGBfAYFK z|7Q2;`lClbRsBQi%^mg8qo1z6UA?)ZK6>;s)oo>dammGie=*vd%`VCZXcAp-9 z^ys^)zgE53eL6pS^aIsTRBv`aFj;@}=*OvlT)o+SIzM{!bJV}4-t0a-{^-%?>VH;m zcAtLzi5`8gb9nw&U60q#?7lWR{^-$`}F)pkG|!6&c9i`*?p&E ze)Q-ktM6RS`R0!L=+RG6e}Q^)M}73@r>cKPy}6@4di2xO-}EQ0-`r6jJ^JbD>o#I< z?x>F*{S5W{Rj@aA)JKngrut9Rn>*^GM?Xvb(2Y6Y+)*Dr`q}DdsW*4jM~}W${id68 zzPY15dh~PDciN1-xuZUM^lj=lQ*Z95j~@M8_1CI5chpCZK36|$bFSaqQ6D|}`RZ4y zWN+@Mj~@L3_4Br1Z|-1r7?x>F*{UY_JsW*4jM~}YOg?#;bPrbRLK6>;O z>QCR2>o<4Q+YdaSf1i90{eAKO6qk$J#TDX#7jXYd@vY*%;?*ytuM%G*9w44Ct`YYi z$^D0j9~Nig%2D)n;v2>F;w~4_H;8A78^sq~Og~z@^JsFD_*(He@n_;@@t{k%e~b7& z@f2~zKj^24|0$j!UiMP@S>j{Ft>Op8ZQ|v|aQ|Fw<*nRvUa>FdPLi|fT3jHPc7pCN7(w~9xLH@SxUH;FG7j}w0*ZWh;E%l%u#_ll>8 z*SU^gl6asO8FW8yaPhS$^Q;xXa{;%~)^#7Ex1{oBQ_i_3=a`fqn5 zeHZcV;%?%V#?$u@pDHdFw~8yoo8QF!E5%of`-*=MSBbNmx&Hw1^WqxuHn-3Z5l<3l z;%^Cc>&4%Q8^nkGllwP{Tg9WrJKsv*Bz{~xPQ2Z1^v&XF;ui7N6X>Ui8^zPa zFNtS}SGb+~&l2x0ZWYfKw}}Vc!TodbOz{G7pF8OniCe_&;`LkT%MRrAzf{~s{H?f~ zc*tGczlV6HxLmx&MEVNx9pXyy>XYdEiq8{Qi5H3oh!2^}{cFTC#6!e?xtl%{j~3U7 z=Zovbr{BZ<8^oRNB{z!e#iPZo;wEwB6z)GxJYL)^{?mQ*E#eEsQ^enhr-^sFpZm`c z-z%Oa?)?CLt9Y!qP5ikycR!W;FA$&nAbFAaLvg$Kkca5Y4&wEHQrtz{_h0ng#8-)X zh(8yXi?^7@{VT+0iYvtziu;OR7FUVC6b}%u{4gJ{M!d0ji1;XRCY~s+6L;xc{Ch6N zzh_gfe@|vJ@kZi(#eK!+ifhETi)+P?i0j33#f{=+yKvrEai#bk@j&qm@d@HK@%iEp z#dnDph+h#5aq-6F)2dMZ8Gd<#rxl=Xu4v;#=MMzvsWl^8>heb9dqD7z&APkp_5v-{r3^@|>T-KCsALA}|1Z8AT4 z^t08ssW-cCN&4u~4?^yr7GU*=#QzuEnC z+$lEPVExgf?{PKfPttrd_Q&~4|Gtvw(T}}`{qMHr`TLF4`!yPmhxyT?Z@-rP0qV`z zAM?wSzi%)4Qhz=ByWNZ355r>=8yNH3gGXO`1N&vSdo*t|Lw&G zHZc0=(Jz|J`S+WynqfK8wqeq`T&h>Az z1J9q?eQog=*ua<{J^GpI&sJ}CUxm2X+((bT(-WNkn0mAO5zK$oyTu>KO~tSJ^C@~FH~=K-^}YX%A!Z#^C|Y7tGIr% z`{Bv=FVUlKn#q25^=9`q$@-&5pQ|6E-t2xt(npVec=cr$8M;^b~ zefs@V^yo)C%lUU5!p~o``*eQv=x3|nPxH<0)6bvi(N{jl`4iQf-FL#BV#7^!*dL6( z&n))8syD;q^FN&*J^FF#2k*r5XLdh4dHstXeb?DKf9lQd)1P0WM_>LD`(MgM~{BU2b{l8 zf3Dx`KK=R^eQCb>JJmOf-8UA;fel<;{3m+!&8>u>bvYro_C-|fcvzi}}a&%c4m{OHk7QGbAXv*%As`smTueb4!Kt2etJ znXEs0^b3Drzw7|6-|W6BnIAp+-aoQGP`%lGr!IT|aCO)pjJ|T2ZlxXWRd0sJ`Ahrg z(f3)A{UL`H`v-R4zx3!!pa0$;9({xQn%#N)X7}myCwlY?)wilQyRS{=M~}W{C9c0_ z56(BcPrv>}kG@^~hez@F&F*L5PO;&pI_wWdKW$~sAEo(bc%1(pxKnJnK_5N()>YWg zQ*Xxp=%*JS*xW~te$4OLZ@DLr-|Rkp{fr*{9QBu}H@k0L@xSLskAA{Bod0k2X7}m$ zuhF9~Uzh#%1G#>)dpswx;ifw54@Td=C;J**KQlbeU;6vj(W7r(kNq{8Z+1VwcnoY{ z%#R-Z$o1KOpx*3$LaAQbM~}W@1NNH^;_;i^r`Iof^!4h`RBv|QJNfz_J^Jw#od1k^ zv-`ox`lCm`Nd2nST))|Udi|nD-+g1wpE8P{e`fdnlljr3AEN#i%{RMmNc!l}x2j)x zFRtJ0zAovbN8fi7uK#THX7}mOpV6bAul@)9dt>H~`smR&_2&FLHQ($Wp99#y)nR`y z`l;#{sW-!;Z7n{qfzd~ge&nW{zfBF#pV|HVQoXc~9(~@QGnc3+$H(W9TO{zdg> z_sz-kKYH}T`f`5vy}5p~`}FHq^yqW-hp0EZAD^s0dh{c<;ru()o870+-{{dVR{y1X zv-@;@^yr(m<@_`C@BNzHr$7HkkA8vrC-wb<*?oHbqDMb)JI+6N7(f5b?$fUy(W9TG zzVAM~erEUS^@|>TzkZxQTD{plJ_oRYtHb_a^qKlL^=5dqt;Gj6F#71xS8mVw75j4i zX7}m$57DC^umk%B^=9|!*N^DYH>sbc-t2xR?i3qtu>R=L53b_;=MU%gGh=@ofBNs0 zM2~**j_i93=JA`|&nX@Q8yNGWN8h*;`@Pkh-M5tLrG511D|Tl85A|mE>G_KueZBgp z)tlX?e|{D{`tiGP{u1?O_v!rT(a%@E<$gSWX7^cg{L!QDzbogTsNU>;H0~4|ZmPrn zVDz(hV}GZ5Gd!+;WAT9vj6Qnw0|&4_BjfYO>^^<{i5~p~^(*WBE3^9=3@^b6H5sps*V-KW<-dh~tv;QW^~-|Rjs zt$ykHqenkh{bmR7_|5Lq_g|w&KVeVKze2s)eQh#7dh}fevTxC!znR_7O8V&0x2j*H z`DXVMl0JI$!v}HxpN8=G&F<6lA3gf%>i1V~cHc93{~&twZF_P4=i zDsABEus;}mk0Ut$BlTwZUd2ax{i8=eLVb1&pMPfeHN|6K17m*l=x3|{^T9lSX7|%e z_0m3i^rMgD`Ww}o-49Lr=+Vzt|F(Lw`@zZeiynR7V>o|{p(QgHJe~6g6;BlW ztZsH+i95xH8_bU$eRc->Yc=1D{jvV^`?u)P_i14Nv3j%n^!i7SzDa%GLwWpW_vz

    Gg{q{Y>>eGakR$eR}<( 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

    mLG5bK8HW~dK>>QynZQ`AFqF( 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

    5Bu1T`6>6RyM9-=^nL`Ka!u-g59{&VbBOfU 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%0Dx~(eA>P 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�H>zXSi{hw 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

    eox^AItZ?iO|) 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

    *B}|2>Vfy>*kl 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%0Aw8;ZvyI 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�Tm?MJcwOxP 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°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

    kwn^b)jvx>k#Da>!A03 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 q_C>seUJ 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ȑejLN)IF9>IQ$K-AaT2$fuDlFS#VMS` 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 z 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

    )$j9CM8vK6G`14m6`M8^3ho6U6 z7x}oGAA7O?{C^0qF7k0VKLJ1CS%3cOA|H42lkg|u)kQw;=BMBv!>fyY+|5tJ@44Ea zzq-iB-TX}aIe2xEkGuIf_(8n7$j9CMJp93b_vf!J@^Lr60DmK1UF73#ei43$=ls69 z$j9CM68u?sb&-#|`DOT5@#-QUck?Uov!3_ouP*X&H@^yhA6{ML<8FQpe&V3tSIf7J z{?YrtfBcTS`FWT4&)-AwYWc3@<8FS^BKIfa)$;j||8X}z1-}xnF7k0VKMnuUfB5TH z7x}oGpNT&YuP*X&H$MmeJYHSo<8FQ){@{Q5^H&%7xSL;qzY?!5@^Lr62tSNh7x}oG zUxNSA3;z7oMLzE4m*IblR~PxXn_q$7WR2ff7x}oGUxlBAR~PxXn_q+P#;c2b+|94U z@ARTSe|3?MyZNz~`p>^6yt>H8-TVZ6A6_k=fBlHN`6c+um-zf?`TXmL9&fw(nV0eW z@oM?}>qp$p&%xh`R~PxXo1cf@^<{tl>LMR^^9%6v@#-QUck_$zPvO-?KJMn1;HM1n z{?qdL^V8#PH$UZafB!GRtL5|O7kBe(@NePO^7-?NyZLo^`~M4NfBmB_@^Lpmw!@$Q z^>}rWkGuH^__6=;`|2Veck`3*v+?R8A9wRp@OR+zp@)t|pwK7amkH@_Oc z2(OmUpMTuVFZ`9i|BvF;^7-?RyZOcV53Tj*ua?ixKknuy|Jv`Lj#ta)=O6dc*N^`b zel;zhpMTuVujTP8Ui0U#me0>W?&jxT;m^PAb@yud{QToS`uZ2UzYaf{me0>W?&hcR z_zmCi`|2Veck?sw$KlmQKJMmcFZHIaPY5DyA>G8IkU;G1vs`TY9hZhi&+MZ8)*zy7$JpV#THzxHi^ z{%ZOB`r~eX0saEKT0TGjxSOAFmET{3SIg(;ANSGMk3VFcKmQf9e186MH@}Ljy8*8*@^Lpm0l(ur{`}QNKJMlx;g83w zi+tS8Pr=`dSIg(`pSYV}fgixD<@5JX+|AFs+TXvo@oM?}{S$Zd3-E`%>+hes$j9CM zBK+_0>LMR^^GooXlx;Tp=b!2#A9wT1@W@2QUF73# zeht1AuP*X&H@^=5DqdaW<8FTJ694}B`uhI-)kQw;<|p9q!>fyY+|5tI@3Vp5R~PxX zo1cPj!K;gW+|5tJ{|T>_&p&_TZhjU14ZK=D|NM=+`32Yb`~Uti{`%GO`R8xk%`d`# z2d^&jaW}sNe+yn+XJ3`TYGC zck{FHdzJh1R~PxXo1cq68?TnnuRreQ$8`DgzZI{R&(A;Z=Evj5Z{p8iUF73#ej@&4 zyjng#|G1l9ioY1ImhVb`|3B{LXJ7BH|4zJGKEM9Bo1cr{ep7$_YWe*9<8FS;4SxRw zyjng#|G1C7e*C@orL=s0{&6?IoX795nLmHE{FwCq#oc@_{$#vbzBc)|n=il7Uw+x^k)$;j%+|9S)kKEj!zgj-ukGuJW z_&e}w`Fua_=2zl(+QRRv<@5cxoA1ZB;MMZ^e%#GhEcMU-8N6CP-;cZb3HXn1>Cay+ zpYO-r{7ifsUM-*R$KCuaeAzg^ua?jE<8HnK--K7o=lgLtzZm}%UM-*R$KCvD{Isq7 z`K#sg{kWSS#9xJ1%jf%XH(zy=fBqZ2&+n_{^ZmG+pM*adua?jE<8FQqel=b#pYO-r zd=vh_t^N6{<@5cxoA1JR;MMZ^e%#G3#cwd)@2lnW{kWT7i$4ahme2R&ZhjblD_$+1 z@5kMI&F}s5-(nko{%ZMrKknwI;Ai92^7($;&CkQ%idW0$`*Anlg5P>ufBtIud_V5y zd+>AcYWaLW?&g={@4>6(^ZmG+A9J(6|2u5w&tEN{@5kMIIsR@kis;^7($;%}>77KmQ)QT0Y;8yZIXYcDwlV zSIg)7aW~(LKOV1^&-deQejfg5yjnirkGuJ0`1)P_`K#sg{kWU&!C!$_%jf%XH(z#} zzyGh})$;j%+|7@{fB6Ic{MGXLe%#GZ#V^CF<@5cxo3F#~InnQ{<@5cxn{UNmj91I& z`*AnF0RJXlEuZhl-TVrC!w3EOtL5|kxSQ|8cj49Y`F`BZk6Y%SfB9~HUoD^S$KCvR z{E>LIe7+xd^E2>E@oM>eKknum^!#`C=dYH}_v3E99X}JVme2R&ZhjH|CcIic-;cZb zRroEc{Q0Zp^ZmG+AHW}jSIg)7aW`LiyMO+7;MMZ^e%#GZ#BcKTzgj-ukGuJ~_~Y?v`Fua_=9}>k;MMZ^ ze%#G>cEme2R&Zhk&~7G5o%@5kMIEB-FLT0Y;8yZK)HuGRkh)$;j% z+|94R{|K*^&-deQer%6_egk;5e7+xd^W*SS_x0zmme2R&ZoVGhiC4?#`*Alv13&h| zeqSx0@5kNzLVOcmEuZhl-F!Q~53iQb_v3E9A78znKYz7+z8`nhO z^3T6)vfo$B=lgLtUy1)VUM-*R$KCua{G)iae7+xd^Rw~0f5e}^T0Y;8yZOcVd3d#a zz8`nRcOeqSx0@5kNzQv3qET0Y;8yZLVXKk#b#d_V5y zhw+De+@HT%KHrbK`E~ef@oM>eKknwI+~c4Bw)^{iwS2xGck{LQnZ`sY9G)BgO`^7($;%}>BD#jEA>{kWT- ziJwsG_tox-{kWT7jITeypTAl@-;cZb)%c}&wS2xG zck_ez$^-qrT0Y;8yZNg7{PSOcSIg)7aW_8+|1MrFpYO-r{2cs=2l?|?%jf%XH{XO` zjaSR(`*Anlh5yo2zps|h_v3DUDgKXmwS2xGck^rUQx5j~YWaLW?&gQ_SK-z2`F`BZ z*ZhG${vP7@)$;j%+|5tHpMzJ+=lgLtKM(&7UM-*R$K8Aj{u`h1=dYH}_v3E92frMz zme2R&Zhkqws?P7L<@5cxn;+B5&p*6cKHrbK`EvX#c(r`KA9wS0_%D6dpTAl@-;cZb zY4{uPYWaLW?&cTZxA>gjSIg)7aW~(FKLxLr&-deQz7PKtUM-*R$KCu&{3j0e=dYH} z_v3DU{2%@EZ^x_U^ZmG+ufVUttL5|kxSMal*G}{2ua?jE<8FSYoy;Gh4@!~FTH<@5cxo3Ful{kWT-fv-8n@2lnW z{kWT7i2praEuZhl-F!R#6W{XtYWaLW?&kaPx8l|E`F`BZufp%&==as~`F`BZPk7Wn z|D|}fe7+xd^OgAhzU}wb^7($;&CkLw!K>x-{kWT-joeKknw&;n#2S`)c`oKknwItn|;n8LyVl_v3E97XK<i@<{kWT- zhHpN@@2lnW{kWT7fFCp8y;?rskGuIc{6f51KHrbK`9AzkKk@r&`Fua_=2zmc!mH); z{kWSS|D=EZd!Om|)$;j%+|5_um*ds)`F`BZH{fTS<@eR{`F`BZ&&2;7ua?jE<8FQt zzNyvktL5|kxSQ|5Z+NzQwS2xGck=`Ig?P1mz8`neKknw|;J>-R@2lnW{kWT7f*-=G<@5cxoA1K^ z@I1e-me2R&Zhi<~{!{mA`Fua_=GWpcz^mo+{kWT-yvjfSZO`}nYWaLW?&fRom*Um( z`F`BZH{*9|^ZRP~d_V5y=ixi>YWaLW?&g=_C;ZIstL5|kxSQ|6{}!*7&-deQzU;65 z{!hBV@2lnW{kWSSgTDcJX`Fua_=4aqf zz0#k*T0Y;8yZMFqm+)%&d_V5y+wmv-*6*w3^ZmG+@5lcWua?jE<8FQx{+Ld`ua?jE z<8FS!v;O(7!mH);{kWU2#DC{1zps|h_v3DU7Je;WEuZhl-TZ9)>A&;)YWaLW?&cTc z*T34mT0Y;8yZKK1X?V4Kz8`ne zKknwM@!z<{@2lnW{kWTN!mq}w<@5cxo1cqsyw>ll<@5cxn_r554zHHa_v3E98-L_= zeqSx0@5kNzFuo73me2R&Zhjs9pf10!me2R&Zhp$&{qyg_tL5|kxSOxVPr2UjtL5|k zxSMam-;Gzx=lgLtKOg_u8~nanKHrbK`Q`Zg@oM>eKknvx@n5{r@2lnW{kWSif6m|k zC-G|ed_V5y$Kq!#_4{i1d_V5yr{M?iYWaLW?&j<9N8jZ4)$;j%+|9S?K3*-K@5kNz zLi~}x_xo!3d_V5ySK=SXtL5|kxSQ|Cf9++nnQYWaLW?&hcA_ge1v)$;j%+|4h*ci`3X`F`BZx8W=A_4{i1d_V5y`|uaz)$;j% z+|94VZ*!mDSIg)7aW_By1^@id!K>x-{kWU2z;FBqzps|h_v3E90e?DPEuZhl-TX}a z>v*+%z8`n`A@&!@2lnW{kWU2!at2y%jf%XH{Xaq_5r`Ime2R&Zhj8_b-Y?W-;cZbCHQ$O z{JvT~-;cZbF8n&YT0Y;8yZIsfDG&O6wS2xGck^rUui(}4`F`BZPkzxq|6?BV`)c`o zKknvh@B?_Ye7+xd^Ue4f5Bq(!e7+xd^Yie3#H;1={kWT7hOg=K`)c`oKknvx@HgVs z^7($;&6mC8?|;=JeqSx0@5kNz82n{;wS2xGck@&6TRiIb)$;j%+|AeF&%vwZ^ZmG+ zZ^f7W$?vP>^ZmG+Ux5D}UM-*R$KCu2{2*Q}pYO-rd>{VnEB*Pa<@5cxn;-YGfBt=V zwS2xGck|=%2R`Qa)$;j%+|AFxUyE1E=lgLt-+i5<1 z`F`BZH{;jg)$;j%+|766=RM{3)$;j%+|4h;{~NEC&-deQejUE~X}_(GoSJMYWaLW?&eqEU%;#7^ZmG+AN#6*esiDo`)c`oKknwo;a|e5<@5cxo3F1z8`n+l!h)$;j%+|5sU-9P{FFZ+G9e7+xd z^R@U(@oM>eKknvR@RdV;UoD^S$KCvV{9?RXKHrbK`Q`XsU-A2D`Fua_=6mti;MMZ^ ze%#HMzv1uyhyUgG)$;j%+|7^0cjMLa`F`BZPs7)|>i5<1`F`BZ*W>TPtL5|kxSMao zPhIQx)$;j%+|4h<_u|#^`F`BZuf!knn%`H;=lgLt-;aMBua?jE<8HoU*gyYSuls$q ze7+xd^Aqqd;MMZ^e%#H^#5cX+_to-@f2KHrbK`7Zo(c(r`KA9wRh@hAP;@2lnW z{kWT7i+>BRme2R&Zhja)_Z`2lme2R&ZocL%|NIB>YWaLW?&hc9zxJ-*SIg)7aW_8? zzXGq8&-deQz6D=bHnwbHX!(3!kGI`?5B?6kT0Y;8yZPn#kF4kS)$;j%+|7@9+u#2y z@oM>eKknws@jI{Y_to)$;j% z+|4h;&)w4RtL5|kxSQ|6Z#>SuT0Y;8yZN$r{rz8vSIg)7aW_8(zw1_hUoD^S$KCu? z{O|B;`Fua_=Iihi-{<$$^7($;&9~y)@oM>eKknui;5Xme@2lnW{kWT7fuDz0%jf%X zH{XX}Z@l0CPmg@G6G#3p-;cZbab=s2JZj|6Bk}5@`*Alv9$&VN-&f1$`*Alv1OI)z zT0X!2xSMal{~NEC&-deQzFqgX_2;ja&-deQei42cua?jE<8FQxzG*wZua?jE<8FQc z{}x^?pYO-reC2xn`JZ0l_to@d$oMNA9wS!@ju3^<@5cxn{UK#xP#wU z%jf%XH{YrIc(r`KA9wRh@MZ7!`)c`oKknw&;G6Mk`Fua_=7;dF{M@jQzJ9tIzclO<%l`jg|KmRT`g#1f@oWEwkNfEB zALFn87x>9^;p-3k=Pj{`wEYPo@iBf7nM~KYcQOZrI=Je%wc2Kaal{zx03jxR1Vm9=}Yl|9|+kVIO_{ z8~N*hUay}neEne`ef{(nm3;q){XJiQ*hgPKy&ryQ*x$>?ef0J7_%Gtu{tqAb(bvDR zzy6c(lj*|OANJALPhY6lANKcp{&T}V`ugcR_4>p9UVdrVM_)hvSH1qQzn5Pd_R-g0 z?yrB`F8=vVrVC$x*hgPK{eSqmVSlgtaUXsCJpNq#(*NP(KKlB3{4Myk|HH?9^!0Dz zum458e!B4Whkf+*(_?q#`#A9wRp@!!O&WA9wRT_^a{iA|LnB*T1E|{x$eAy2!_U^!4-jU3cg8{|{dq z_R-f*&%n2Y{k{J95%(H(!mf!>i@H8-TVOl61=*|$9?qmZ|krBcD;VO$XAAa^!3xv>Gg-* ze(vY@Z&uhxUq8LYUjF`fg#EpI+(%zOkN*gMAo=|H$KCw+?fmtB0k78U&p-d;ZoU@( zUA$U8|M4^K=DYAW;MMZ^{foQ#A^ad-UF73#zPiF+|HQrh{a4H9_b=||XXF15ua?j6 zU);^N;ZMP<<@5cxn_rH<0U;k(D>Z1E`H$N5s1H8J($KCvV{H1tx zk&nCi<@o#X>LMTa(bqr0U;it5{dAEZ6ZX;9PjA1kzyDLi{$B5Y+|4)h_$hd`?&qIB zaW}sh|8=}tKL7lQyZP1lbMR{U{Of<*&Cl4;-@hKbT0VdO#oc@>{_l9Te186MH{Xlj z^27fAtBZWx&6n@w&wnqxT0TGjxSOAX|3AE1K0p7so1cgO0bX6?<8FQ#{?~YQk&nCi zb@==6YWe*A7kBejJNx_hEM6_2Uw_=qH{#dd&p$u4e18AqZhjGd7ra_NKmWL!@5R^R z)$;lI$K8B+rN91@@M`&dKknuy;}_!9^7-dq+|4h>--TDp=jR`H^Q-aC;?+ey?&c@% z;;(=6$^QAN<@588yZMFqTD)35KmWL!Ux{zTtBZWx&5z&JpZ_^{b&-#|`5E}@@M`(| z{Tp}lt@!8hYWe*A6L<4V@jHLS-+#4ye*fcce&PrG^-ssE<@5U=ck{FHC*sxe`F`BZ zuf#9ItL5|kxSJn8(Vzd@cy*DFyZIUT-9GB?pISaY|G1l9jz1o+me0>W?&imQ(4YU+ zc(r`~{)xN!8vGM@wS4~miM#pP_zgbhuU{>n|NEb~n{UDIi&x9%*B^KDJ@}*W>LMR^ z^JTmF`}cFay2!`fd@a5QuP*X&AASA!7xen+BHt4B(brE`)cE_~6ZZG|^T)WGU(4eU z$E$TefBtbdU%9)#e+%$x`TYGCck?swOYmy>d_V5yTktFJYWe*0FYe}t@auit-@pI# z$hXFO{r#7?o3F0&*S{xTt^4`)$KCvFd_7(*pI?96&9~uC#;fJ?&!4!P@56WE)$;lI z$KCvx5BclAAFr0r&p+fD71Fx3P_v3DU zIsP+vwS0d6<8FS;9{&EFgjW~&xSOAf@4&0&^Yf3p`DT0%UM-*Bzqp%Uj32@c)acAo9S^={QXlG`M8^3f}f06%jeHO?&kaP_g=OB=)XU!mLD_nJne_| z^ze9V^Q-Vzjoo0>t8KSmf3uIf`2qZ)pY+$SF7k0VzZzfrDZc;cBCp5WZhnx*PyMue zb&-#|`8D|Q8~gjGF7k0VKZKuumcM`MA|H42Yw?HH`tw&8`M8@O#=m-y-&Ys;xSL;x zzwzJx`qf1~?&iz(@}Ga7Kfs^Ay2!`f{22V#4|K0C@^Lp`j{oLC?$t#;?&inhAF6Y& zF7k0VKMvo2jKBZtA|H42LMR^ z^ONxl8r`dleB8~~;5WIzy}HQ9-TV~%MpyXjR~PxXo3F*!UhZC99 z`M8^}!@t4nR~PxXo1cb%kk_v+@^Lp`k00jstBZWx&CkGJ@&kYU>LMR^^9}eDf9>zT zy2!`f{7n4Qi`=V=eB8~?!k_#r_v#`ack{FHOD=J*F7k0V--v&y+222Pk&nCiIrtxx zyH^+axSManzjcj2e|3?MyZO2J-yG_{eyfXo+|4)R51Qs)UF73#ejfg>cy*DFyZILU z^dtPfy2!`f{Cxa`qui^DeB8~q;-7DHuP*X&H@^VCe6D+Sk&nCiHvH+QxK|hXxSL;y zzvxu=>LMR^^X>S}f9zge7$K8Ave#}{ZUtQ$mZhk4g8Luw#aW~(MzZ^%4CA|H42{rE1ty2!`f{3`r;KlS_SA|H421Ne(i^*?^9i+tS8uf`vA zzTa0D`M8@O#P{LVMLzE4*Wka<=J(Y_KJMm+@DJhDMLzE4*Wz1$=J(Y_KJMm+@#kOQ zUR~tlZhjqpyYv0?Qy2NTn=jkj|N6i2QopY*@^Lpm2LIb@+^dUx+|8HcH(lypUF73# zek}f|o7}65eB8~C!+-Q<_v#`ack|=%72WRDMLzE4EAU(0>Rw&s<8FQezWsLh>LMR^ z^Og7w?sTs%@^Lpm5&tG$UF73#z6yWP{eE9vLMR^ z^ONzzd%0H^`M8^}!N1D$R~PxXo1cQ8zrx=?b&-#|`C9z<9&)cP@^Lpm75@lcUF73# zz7Bur!+u{~pzZxSOAazk6@@>LMR^^Rw|+^7rr5MLzE48}Xm*^!w@}A9wR}@XtNs-#_Xi zA9wRj_^&+bUR~tlZhkKQ)xWq`7x}oGZ^qy7jC*yFkGuJK`14pzZxSMaq_rL94UF73#egXdGf4f%~`M8^J!+-c)_v#`ack>JJ=i${w zKJMn*@yC{JKKkF^sf&Ev%`d`tjQsB~+5i5oy2!`fdbIHi+tS8cj5c+>LMR^^GoqpmHT~lk&nCiZu~2F zb&-#|`DOS|ZsPaVMLzE4d+=xD)kQw;=9l9)*wpW{{m-(MRtBZWx%~#@|?{Kd!@^Lpm5&z_G+^dUx+|5_v|IS~3tBZWx z%}>H_&p$tf_uX_ky}>p9_;GX{T|xhVuB7|uDth9z?yKqJ=^FY9x|Uu|*U>v(=f0jkoNl1c zrDxH9pd0B8yWBU?pP`%S7P^IAMz_*$&~5Yq*ZbFNr+-3s&=1g^^cFYx2CVh zbPxSEx|goH(S09%9NkY}Ll4j|&_ndhrS6C6N9nRL{&~Mcm(xGE$sa$C9;PekxACp}E>c#rR88~W#cK3z_)zufn6^d58t{Y$!%zJ;!$U#F|-eed5c#Bk8h** zrQ7KlbO(J0-AV6tzxyuw61tl%f57)1`Ui9`{Vv@{@3z7p-%q#G1N2?=AieK{{`et! zF+EIg^N{al8~Nw|Q@Wg9|6$+9(WlZC^h8I&7dfMZ@x6}909rWZU zeD9>Mr@QFA`+e`GJLw*}kM5-p`LjR1kG_Q-pr54&>2Eygj~}9+ribaR{^EPt#{PMq zOPABP)8ptD=nDF{RqiY4*Xb(y^uPLEO>gv+cMW|$T}xLy?Ry>lMY^8uryJ;_2K@1} z=)cg7^o+mx-b6n{H`AYe#`hNbdvq&(CEZ3>JnN5dr$0}3&=1m`bnR+?d>4Hq-A(WK zci(&HbLn1si0-4m^_)MxpZ+U7Kp*zJ?}PLo=^^^yLEnezo9VK0|NM9ThwtU|&**XV z8*~MI@<09YmGsMW6@Ad(ZQ{>= zZhHJZyOn;ui&DRsdb{0AAAdsH-?zqJPs65u?|}69rh_*qdH(ySzB2Wy)MHXl;a=-z ze(!yUlz#o{uJuapZJPQ^spq9$eO;+Pk$c@^{ob$BituG4%$ipXXlPIKTIF z+J8O2^!Xi=`l-}A{G{~pd!&8q7ybLQc`Lv7rS$kSPb&3?roJony42%Rf1Z1t@AG>f zn_K$zzwmPD`?+iC`KfP8{mM(F{v7W0Z|(P-RPoDE;~kmyZ0spYZEvP3q>aCWQ?t7)aJw1Nsm;C#)y~6K(Ha))n^3vB=ow_M?Tk3JCKf%4; z?fqU?+P^-j^!=TZ`p2n%lY0BqU*+EL4t}pU?QNZ<_r8<*rqoZSJ|y+&+^d@4_uftW zv<*vt{(KC_g72%ywuO8-eP9yVKvFTEn-2`+eN&o#glS zO^+YErqth)dh=^b_YbGOEIs~3?hWtd_l`)9|5ShJ*V``j&T~rNuUEfQ+Mn2>^!v3u z^|bGnKE5*b$v-XKKa=`J?{~?&qhTvvKLZf9eajE#1G7`iRX+_YbB%V&tC( zjh}y2>d(Jgy6=?w<^46c3%e|G9?8cO%&$Ckdnj?~Y8 zyL7L3z4Z0H{#t3*FE8!t)aTw)y6?86^y{ye`qmRm_g|!bx4v{=m3q%jN?-5#soy=e z^!>ay_1J%ve*M+2l=gP_mG&$5mi8{Yl-?h%EbY}#mOlRW)c?A!^zrwk{{F{G_xjWi zo?E(iq<-=nrTcZMfAf#h{p8eJyjZ$FwWhQupHbT7sSm6vegC&ez4pM;{m#?}K2iGp zv`gv@)+_aol$G|kXOzDG2d7>&z4Y;mQ@^%P>FawSb;Ww6`^#me{f`NyU;n1m-3OFD zzY9}edQ<7wJ1+IkO{MztJ3=ir@r^j(yxDE>eo*z-S1ER)h$Z*52yal#M1j8 zOMS!S(*5+*&pcfE^>0Z1(3eX6FH)bqq;&sW>f^2~-SYu(S8rEipeKb)L;^G}vOzduhY?FS~7e*Iskexked z@yk+Ir=GlT>DSvd_4qZV&v(rWrM+|N&F(6_|8h@hADQ}ByO!Q>PJREGrN7?1?-l-j z#aI2$@6Vve&GdeguAvYAmp{IlzMAf!cX`$KUV0HdM88E>f6c#s!&-lQ1N|7?LLc#( z@168AdXV1bb>GJw>0j@cbPfH!H+-K(H_;vRLv$~F$gn?th`xue__}}n54`Dn1APYF zLJ!fM^igm52b6C>y3Te_Zs>FdKSIoI^SFAbLn3CO?rqv?ce_Rif{PW-{>9h zTKYt~g?@_eqz`-7AKyp+kshWej{JX$w}0NO<|zOAKcr{TW7hM%mHsK+MZZlC(T(f- z<13E#ueXY>rN6j=?~U~JbSJ&}7~lKoGwES^%!a;K&i1eWO?no6AKgkt9XR(d%#Odn^5Ax{JP# z?x$-u^T(Hc%fH@vbS?c1-AI3HEYFvIh3=-0+}!tJ`T@GK(ZBxmEqt$|AE%q>1Gec=X*E3m>!_F-rD!dWBu#@n69JWp_}L* zj`zp6)6dfV^k=s5z3e;w_3ovs=(=rvucxo2+vxGz`QA;p(F62W6~33x@vna}T}S_! zZlVw0-XGsi_t8D{zB~9{cAS5`3+O6(^Y{B+PoGCO(?fJO{e=ns_yM|?EwcKb%KBWi|BfKY^Cqb^nAL5ewrSj_us`IU*6MMBnS_rF1jB;|G23pwFdy=~Z<3 ziT?HW+RYzdO-9tY|57OVM^2d)m$-n+CV{_-S$d?$S!JxFi3m+#|F_OJI{x`uv+o<)CjZ-0CT zeGc7Auce3RqxbR0SDfNs|0cSD-niQL7Wx#rll~{&M<1{+&-Z)&_1ftgdZQ2fK8rq; zZlxcld+87E=Z_zvFQ6-${p*jJ?0YT!Wx9pFmhPl?`G`NhkG_Z=rq|Lnr~23b{6~4d z^q=TfdgjM`@1lF@A$oF+?-k$ouXiO~OYit`-y7-g(Vg@obRT`d{{Hx3`uB9@5B%$I z@d@8&(Z|rO^q=W2`mibf_38Tx`s4%s@on@gbT?gpknh9v zb#&zq{p(Mh>U$l18Qny`O?S}^2m9mu=|}0Z7XNyO9pZZxeIwmSZ}S=7+vxM@ZhDJ4 z-v{U>y7EW<^&h3{=(^APGv46dP(^YiKq5k-K`Z>Cdo;J<* zZu$Xwfd2gd`Cfj8fBoOnb@YzYeQ%;$>2`XU?x7F;yg$BdzJI;T=qh@Ldf)5mOXz0$ zUAmh-`Y?a|0R0GE{uBTDQxEsOn!cEBqKD{q`ou5z<9p~g=|TGF8NOGY>0kdrx}HAZ zi@rD0x6&Q-wqNqSpFWYUILp7@Lv$^Dz!CoVM*0@IjUM0NdmnuQJxsqySGM}sZ~C%7 zzK(vJZl$Mu#rH1yD!QM3|5tr4JDaaZ*V6aWjr6By`s3T^JLqn@@@u{i(?6yw&+)H6 zMAy+rAL);8qHm$Q=qq|kglUQJKFaq`b@f=UQPGY2hR4#m!0Qd?1lhyXgJC zTj^Kn zF1n@3_kMbauDHOz-mLHXUQ7RjZlu3=qVH|=Al*lQ`6SxrzLzcZuXit9OMmQpzBkfcbQ`^Qv+v#X`SdV7L|0zuU;o%s{qc45 zKjO+QNy(1-unA76fv zfBnUD9sN4pM9)5h=Sx39_t1OI_r2_5|9WT8RrDZTPapmhe|$52Io(aKp$F)r&*b@D z;$Q!1x|;sfS-v;Xm(uO@)~&wx&_AUI={0oKBLDiIJKG;$Pv1c|(;qv>_YV5!^Z@-b zU4E&5y>FfCkFTaz(+%|01-`e_i|HP^@;u)M>0i;~F7vOy;ZJ?9r@u`%(|@5m=)=$V z$M@1p=<>_`>uuELdo}%Cx`F;1-9k_PnLoaVK8qftU#G`)_}4%70)KoBeHYzKSNz=f z4*GPum;MJmM1O1{&-YjU^?yP)&>LLndkcLg-AS*Z2kFCq;g28pYyWyH=o6h#<9>%reQ%~up?m3v=!z@-@w;5+k8h;Up}Xmq>GI$DB-ml;3VK^jUN_y_zony+8h-8~pJN^isN$9)F|n!}RfV z-OcX*NVn4;Tr03B!-TwH;=vKP=CVzZCeF0r{i$8wM?|pBkkEMI*9=hUIfBfW| z{qc?TPw8&@CA$1JfBgS-`{Ntv>*!8;yIXu8rca~mmbrh9Zl@2s)gM1d-%8iq?vLO5 zHs4$6E9icD>t()I-Qkb_3EfOTP508DxZNLLai>3iA>By7KzGxJ-QkZf@A1dqKsV46 z@ASQso=*?cuhDgPxo_<8$G6jW(}VQxcllm(w?F#A#x!?D)<^KMhMVHfW(&Om45BTFN=$Gh9x_O1~RrK3* zH9h}9-)rcN9`dfGTj)Ca9lD;L_pm>{fqt2uMSrl*_eS~%x`}>}Zl*u;h(ErCzKL$7 z_j%O!HhK}=PVew1-#h5@=uUdQmA-e;XVBgBD|8Qi+++UuUb>&|qmOvp_kQ{@dVoIk z3Ev0ld+8zi)BXRCt2>R4>FobFK2=L7I$~+;QE9}|7^<2o5lcx`Nv)}>4pj|RVh<%^ zi%`o{(NJQjB}F6F#!^zXj4fgx1Y@bjJ|&3#mizlT4|4v`-mlN^y3Uz7(OdgJCr3RO zZ@`w_y8g9KtNY+Z*oytmsQck5*dIT|LAd`}&D-#K9D;jgsfXbcI2<=WryhY*aU`yK zUfqtT;3#|_N8_(9Xg&tJaUA}_qn?0IVh3(|Q9Tjw!A|_nCG}*y9H(Nx%j#)(I!?zv zSJYj29L~hgup58>kLEr2Ai&2c z4#Ixd)opkI4#98UP!Gd1aX2n?Q#}HIk0bGqsiiD|g)NpX*L41F?7|J!s-MIO_zKR( zcX7x%&0DT(zuCAXzK$#5;PslXWz6Fc{0O(goi=E`6P}NI;hQ)bH{7WCSUeg}!+Y?2 zTzZq{lW{M+32(%^@C$qtxBWxwJvb5H#`o}39G<56VmI`CEy8~I9uCCen>F76|Aw36 zM>qn1x<&In@Cw`?=i*Vg^;XR%;33$7@8cvqdYk4~{Z{7)3F&5yz!oPfXdsL#cB z@lrhEqWU`g1gGPvm((+`&t*9a|Aen&-z)05*og~!^?e2Zqh1DY#&6=VtLiqq3y0!o zxD~Gdujbp~zi@XPk*(ejPsc;C-!=8|xHF!LXW&`5+I7u4@m8FIJKa#C&GA#*1~>dq^BwSJY{yS< z6rOrl^TTn;d-6m)3(vwOa@3u88cx9l?yGOZQ}KRW>Vdi&&&5}9)raaicr`9?SKn9N zTy-m6g{$D&kJRhnCAbl;_gFm~Z^K>i$4}II@H9LX-^R1>YtOWP zIc|ef@b`EFPQ}}CvFBR92Y1F9cosg6kKyz9{TEt)6%WO?@nW2VkK*Sz$m09|zn>Sr zr|Z!Tm&CES3|@|_;Cna_H+n_;1>+&O0ZzrC*tdY@Tj7ql9gfGH@SnH`F8`|5_rd+} z0Q@^1igR!*wind;c$|u7;JbJ>4k@JhB>XF0j<4YqT&=L?H{dVucDx<$!FO;5_AR3I z$MO64Jf4KF;+^<5{txHi03Yr59FN9@b9DXJ;*!{n%ivdwYJC;l5eMRlI2fWO z_!&;YZwDlqxDQ^B2jGA4 zP+YaN*2m(}I391sGw@A38&@l%^-1`9yxdriQ}8Xk0aq`p_1keQ-h=n!4D3@*^T%-; zd>*gGSMg1J8<&4W>vN3t_&Ijs!Vh%)FXNKf&rj>i;7@TCyaoqiFAm1l%WHiD+zp4~ zO}G`li`!xU3R>R@cfdXHZ@3S>j0fP?D{B2v+!V*+**G3=#!K*SycFNS>9~9)?Y{>H z;e+@+d=&S?ZoCwq$EWZWT)MLMzlq!7Ts#3k$G_u(4|P4gxEQWiMf+KCPh1Yq!By}n z9DseQYJDvnifwoh4#9Ca6tBQ7aVBnqef+h52V4<%$L(=%JP!BA8}U$l5s$*JRnz`) z_!AtDr{ih(D4vDOy{YwyxIIq7Q}I%~8Lz}%yb1eN*M2+kCpZJgbn6y`}xExEuDvOK<=_fo-^apw>6UO>tv93^&Jr;Bb5w zN8o@O+OG@#6!*dtaX-8UN8@Wa2KxqSzgYY}o`}E3Q?Ua(@D@B5U&jk@#hTiG32uo~ z@FcteZ@^pdb-V}r*V29m@hA8w9*)o8<@geIL1P{Os>uSH@xG#>yOYuaUfv4g^Hm!GH8=i~%;RSdxUV<;-mAGs@?U#x_#GCL) zybW)_JMlg2!ol^mUk3gTpTV2(C438Kc-isq~E>6PF@nu}_v3|a4HqiQFxG%Qi zRP2Xyu|ID5uGR`}M#fxHtYB z_rpKnXuKZJz;3(}7Yxz<2eAzw#UJAHxI4ayqwxbAj|)7}^*D>m;Md>R@d9vD9D+yU zaGZ&|;nIz?J_>ij!|_}^5nsfKI0rAmoj=fi8}MYj2Oq|6{8nSlU&rmR7mvl3r~LB{ z`{EK!w7wP&!;SEG+yP(0y>Y2ftsjct!m&6EJMb911iSDCoQt>MW=*xf3lG94@eX_) zU&FaLAWZ8EKhx)*h>PQE*cW$hrg=ZS1y{klv3MPxh^v02J{3>J z4ty8S#ogOzegRI$OK`Q1)syiAoPsal4Y+e#&2PcK<8)m16ZJiK3OPcqx9hyZTBTjZ^Vyya~7Y zLi5}3PP`Mp-$UJn*WwIZ{Y&-ZcmY0x3)JCoYCdeWiIT9)Zi@EL;gU?XCGY@p2r5OMR^#j0fWe_#keCYxU857#@pT;hVTE z?);7BJK&u-5(h-7_rSAoA6%%f`T#r@565?LEdHjS=Hu}ZJOg+7R(&o$fs^ou{neM_ zy*LGje5bw%r{L|l>;UyWI2LE%>-Z$@G*I*B@kx9YcZpWNjnCo-_{%}+&#@a9wv@5t z{a?qy>Lu|(Tn;xMqFx1W!GXBWQ1xK^3vP&C8>SwLhv8QE5pIXS9Ip8;_yq2OyN*!r zgZJS9xIv8iaJ&%5;({a9<8d^efzRT(_`^|}Pr@7Va@_EH^%T4eZ^FK#)wkpEcn|jC z4BTgo=1<~N_&okNR{bje6W_)S#;QNStMGGNB~HEYE4u#ka7kQtoO(Gt23Nrka3JnE zUh~1&gB#*cC#Z+wzi=zuc%phcyc~DIl_#n9zzMhyE)cIi0FT7O@l70yyHD19JU)eI z;0_7ubMZc$gu|z(FUJ`;1$UgPz6qbk+wo^VsPDlZoPoPcQ$L9h;q&;z>FQVU27DXW zouU2!FT&4p;hE}%3+Va}!X@!BTn@K(Xub;Gf&+2wAJv1g6F0==XQ_wc1l$UHaXZ}o zC(U=kJ8%!&XtsJEycQ3@b>^rK#|v;Qet)idJU)VF;C?@=&&AJi680H@&R_`^l&g)UL-8@(3in*9-VWc!UGVT_>OJra+y_rsu08-4 zSs@R{@i-RyC9B8dWq1Z|{+s$-d#}9D|{&AK1CLFk0-i~+RJ-FlV>KXV3 zK8a&f)X(D@Yvil=0KSdCOI3e>i>;NP<8`=jL0$jO>(oo)r??zWTCZLOx7r{F;%hh< zPu-~A5C?9OL-7vW3U~ZNy&d-AE;u1gy$614v)l*&i3i~JThxc+EF6mmZB>uQuWXZN z;Q4qi4*pX;3Gc_tanJ4QDfl+tgop1?-;Q5Tm-pabaR#pYm-PJ$Lv)P#(pljAx^=eIAouCEBq&J zhdV0s{gYp2p9S_It4yniDe{nqiK0|#5E^}C(i<5B@Zk(yU93Q|b zxaSe|P53U}jwc;e--AmZlQZxtd=iHqS3i$4@KyZT3H96f27Z8JPO3l0MNY|u3+wv- zh)d!(-Rk9V3a)}bJ*^&y@8DoO?u>dvT=J|Ois$22xLTHaJDh^M;D+bad*EHT5B}u5 z`T%?q569gusK?@ea6JCjqdo)Y;<-5PqIwc8b4gx~f5j=d^=0)<_$uCxW3Q<1!KMC@ zGw?io5?8vaeje|{SMgW>s^7+U@B=(NTm3oqxh5AbqU%2gm&AeB)yv^^xC(A{Lp>0m zz`=OnP4$Mj;4L{6FTkyE-P`Kz@P6C{+wZ9Nz|U|WJjbg(0NehPhvPjs7DwGxkH>}X z$un>=o{L-Ms3+lUyc|!uubzTyK9DzI7v7FLJyhR=&*BW+H&^{6zKhS}F^|-*;#VKb zxA8Rm09&7^KgY?qu#c|)2T#>Y;tX64cYmf{1zVoWfp`%P#`RvPH^kd~qC`LS4BwvZf;m*E+>Sz-0L*o~9$ zcSY2f<7YSpPxn#Zg#C)j+wlr~5Z5oJeg^-Av+;+osXxFYaKWOwe)q619#UNM{`fi$ zHhKy5#@JF)Zi6S_Nc`IC>V5DmJQTlSRUdD3?7*c;sVCvdcr`BPtG)%#!!G<*Y4wvh z6<@(0mr=iqFJMbCeLo}1s+YvY%gL4S&$t#2d_z41Z^W(e`+n-3@F?6J|ABks(DIre zjQ8O<99}_v20n%t;7=>6uf!glhI?01--EB=<9Kvs^-K5(_Ts$v0_Oesc#aEJm5aZo z?{7A)fUEnf2jP{tA%3@-dP|&+JK$Dts@rh}9)LSmS09bf;i>q`0QE$C8864Z-%{Uz z|HV7;=s@*MY^foi$FcY(euf|8F+rO5DX#A)7nj4sYN`j|99$ods-+%=t+nNLcs}lq z%hXZthgahmT`Wbu;XXD}Z)F0rI_2q&k z^!=>BzWA+o)cx@?9E{&=pxziS#BFemchw{DYTO6g8mbS)yYYD3{XKODK7*5R&k*(1 zI2&)lRZZ{D4lupndU4DA?~7P$dOvhg)BBm{nBK3vVQ~KUNo<{vf4^S`=Xc`m{PP*6 z_wVMM&;P!Qiwp9HVfhocY&ZY@UC857YZQ&*bDk z|FWj{Up6HTz5Oz(HxUo8Lpv7hsQzTJ28dxYtIb0tmhm%CXY|9m^s`{M?g-Ve8G zcK$z4-A(U%d&l%Xx5lRTxAio=pKYt@{cDd*?^jD-mH+3ftLgn|i%joJ+w7D7^Gr0o zf2W)2{b&nK??X#5z5i^D>3wH0ruUl-Sd;&Fg-q`+Yj1jASufN3$*P#%M>g5?{;|#D z^Y6drz5Lg|hv|J{*(dW~pW&wWg%vivAFPS#ePD5Q^B-@y>3v^aOz-!KY?lA}lrz1* zYn$nPUD?+B=O1c%AJ_M$_itS*k^g+g6wPmU_5Ax)HN9W!bJP2@>YCo4bz)Wi_1l)^ zcP-QVu-cg3e|2ts{`rGz^PgYViTo~TdVf{0>3vnBOz)@q%=A90nWpzm?XczFf0^n1 zQR$}lL)A6C4{H7L{MYZ8$(a@N_gf~nsh0ov156%l+Ha0&{n_&Q*Y_Co^6xvZSu7Ke z=P;fZ(^cH+l48HbP7`d!$G58{V78+RL{c`x3EiyznL zD;=v|2KU7_ybp)qps||ogeT+f_#YgDTf}KT4mrZaYKs0eBg%gP-AW+4nu&g%2ES|V4%zv2-59}dHzziPfaUWt3-vP;$D@HaRC zr{Sg8x=iz{jd|?C+i@l?vt08x@c^8I_hM_7K3|O$n)k!;xBPGaikrZBS3d)36giz}s;6M$PZS^RUO5$Jw~UCe0VT zpwIU^E{==*p&o?$VjJF%+v2yFfy__#$u{#-ZVaSpar()!YSb^I_~4-dsXumexRyKoB5#m8~W%G&>lu^tDz zbi5oKfqPfc{3yH)FTq~C8wXU?{8gNT3+>bX1^w0E!ewwcK8T}n<7%2;gd_1@JPrSc zld*Nbj@Ri;tq;eeaV%bnf5mQm2IpYQ0qs|*y7sG$TjJJu1O6IM4A6W$&cw@b!MD`2 zus<$!P{(VGKgPZBL_7_z!yE7=oQ(?~;`{@3yau=>{u1}c)9`G(9&f{^aG4s~?WrBX}v!#h%*geuuSxZXLNHj(S_}fGgFNhu{eO6OO^_ zaB-XFPvHjm8SakX$<*;3xGT=YBk`_!+Aj$Q)tCRm5%?yK!M;bdzY~9eUAPza;u+Ze zj`rVzEe+&LI1Kw9)&5bq1zv#dIObigpMjk?1-tMi{1p2f)BfQNwf=1!jlaODcrs`13euyJ*_2W8TGX5A_LbN^_H^B37cf1cTz>l!s`&$3j3GF`{e}<3a+1RI% z<}+{rE_zby!*D2$!=rFAUWRw!BiQJMjp-4bQ+=@CIDGvG#Z4 z2H1?=U+`n~Nw`v5`2?PZt6$Z8SUdIM zcqn$^1-Sgbnzyyrd^C>4ZafVKXKVf-9*@%_wEi>>_*4$Qrunw`2RsyC#tU%hb zKjWMDK0e+-`**yd`KS1I+_o?VVHGUA6vCJQ`QM ztNC0!1`mzY{AIiWN8HnVHr|E{ex~`FIqLq{f$cc&_w40;{sjE_eR(O~jJ??JfqFnU z?VtC1%<|Sp;!GTeYdln6fQR8UycZwG)?Cd$#ouDT&vm@rxB;&GNb}wCNF0MtiRLSH*YU^T5PTMQ!cCrPJ{pIYrniNHE;jbxGUa;9XJc;-S?U|pM%T3 zyl*ql#RutpBX9st#EtPj+zA(XdEa8*`u?~&o`~Dx1$ZdlfPcdW@jiS7Kfq71@5}oD z^Nv?$u+H}bTnB%STjB)V9k0Se@mV|#TVCErm$&~?oOj<~p10x8@p1ekzKPf3f*2PzBkqm!?wiY-AC1@J+4w)a8doZ*`CYgZ&cfqx4&I8357qhp zg9C7-*R@|`+!}YnV{w1H2~Wh2@dE5`)qWdrM|=>E!&mS&{1j*7GQ)Jf)k0`zO=sQS`gUdVI`u ze`SEb&L@}N3P%mr{(qb9zl@?M(8n3;@tdamGw0L&hG;*Ru^#_zx_|QlJ(*smn$FK} zsMcqh?(b|x52456WPHzb|K}#Ui+;;kKTP|dG2I^;@TQI*N&ghP@NU!nqp|dC`dnlE zaP5E9bbo0IJ%)bNSdaZKqJ)azFn+ zZ~D`d=|36k$7p?H)BU|$=pppW#(Mm%>Hgp1fjS=-y*>_!)&6h2lmC1o>5=rY#(JD# zx_@{%J)3^oSU*<#7Y@&V|5@=G{QS~`aW)=dy8k$W?h~i|Mj7jISx5f!UrJA;A2imF z)B0Ve`t-U=X81^{W|vIDl_tb|7B|FeEcS9 z|95aSZfLrHx&z%spNjqCwLaQ(fAvm!I6W6T@h_(PuY+srd|dR7*ncwLr|JIe7G~NH5K+mKvHTIvP{b!l(4^O8@ z(a+;_T+4L-_*1(7RP9&!ZJmD%u4THvJd~bF{{s8`p!I`I_n(iZhtSt!2kvRQKm9sA zjb1fa=VP6w{o9%DU++W@q0hh$e8qHsyNjMif2A(_PuKokP4~YyqKD9(6XekTcTM;2x1mSS2jOI#WV*jUk)BE4X6*kX-;e43e-GVGFZF8vKTn0~ z>--Yv0oa4TGyVHO3wqcr9d9&F#4AnD6Kte=>6tkEC#~OO`uB?)^kjOucXWQ1*_xkh zdLE$}-A<3eX}F*1d4)A}Fa0DApQHW1GCj}mjGjra+<@yjSM%dc|Gv|N?xcT?bMfi> z`TxE%k{`#9!MCaqewN1~f)T4Xp-EjCK?H^-$o@D|(n!eK5A5Sqo?{dW0pZ?6) z->LoEn4X8J`M%CKmEIZqEY|#b)AKUp=r;OqI00WYJx_Clo<@JAk&b6wqWv$Jp0}w- z525$M4m{KJJkC$_bb2cG`&IiFI+g#=?;&~|{RwvCrKab3YJQ;ewJg^=P0t(c zr90_YaV{RwEdRe>7HXpN@n50+>){yO-1NNC7j!3m49>+_rstU!(u0z<|3Msw-zb&; z?=Mg2$@ChbT)*G6zMtuNsE+gy`uEs@e>FWX^();)cVYjP+P`GU{QvuYiylEQ*Hq_| zj+dLBw`xlF&RodStAphrGM315$HulHuP0wq+p!=-Wezn7NK6X6W^gLHrdNTb7 zZ24X5zcM}VwS#V>KgJ2zx;p>)zuQd5PoodS))ejk!1TP>Z}brQ73{!Yo1Q1D+MNCA zov?L{_8)6{-fRjzjJ_Ku;_@5vpZ_Z@xSsSn*e_N4KQukB)|DPcpMVpw&&m8hKWpfj z^eh~-R{Pg8J?~burOqdk{x(j<9Zb)|eM7E$- z(|teG`9-YP{>x4OJ-Q}6n%*9J@IR*K@rKbY8?@g%V?Ewy`tRF+(jD{@#`=v~?>7DS z?^|?#x^F9;zXNwNJ@5A(J(V7beKu+TpG?o|jWqV7|BSQodeifK8|n5xwBH$=hAkEH z|NOk5d+A+T>-_C$TK_wa!>@;{d+{J_-K_b;I1a!4k>;IvCbn+T{D0VnKWM`|o`ln} z8{4*OeeI7mAAv{Vbi5CHaMiZVZ`1l=I2xb89{lbnnz#I^`5$pKzJ(q5!* z9KMFV_~VY6x9-&ZVjPDbVkhp>iTS@ZzY*JT>CWm-JP4=b3~bw_^|iZbJ_66f>9|N& zbq^kZBX(>32^@`^M>3DsV9OrOSNu#p8c)U!oP#ZUHQ%$F=Kb+r?7(k-uAYj2!2T|+ zzlOu`$K9F7zvE2&`WNb9`?P)#wqqC0#8rD}-it?K`+luIhU0L(FPXta0K=rz&sv?J@_DwIHmQ~2WmbVkH8*$09)LeuNKWb9)TVB0=Asi zeCt7)_s2=tf$!r~+-flMXSDuj9EPvqRQ$mZ&1d2nIP9#}U&MA?cPR6C4EEwf*q){J zm4|6Q4iCg${1>*K(|m>D%;O>0iLGoYg1QaIU?<*(({ZJV%x7!;KpcU0;B@@@B+Yy97dYaY)~~|R*e9NO z{57^**ZiM28ke1{c?XWgmK&P?7yIMT1m^J^oQj`e|C?I>^%TvA;lnr;zduzy6Hmoq zx3vB&w&VAHU>^U3z4#Wk-`4up(=;E4ld%^Uovv=Zqxr9J9R3qKvF{A#y_(PaJrIEb zFP}e+^85e&LwUdFAbd`j#6a9iBujspoxPkvI+8@nf8Z z8=cX7HqLv_J8!)gufhKPwf_|yge#uaydCE~XPvh`3Qx!BcpLWO`#2Z-XK8)VcRF5Y zY{PlaE$8iT$A97|d02wB2L9ldMfhPQVVFhL7WPY`v)UUSmDZ#WQhGw9e-!w&CKJ zwBC**a1@@46Y*8-#1$`VeJ1XP-S}thGf2ljkFB`;6|E1$J#aXljbrd}9EW}W(fTyp z3a8_5unW6!CJwo(^=|wH_TXbU+nE1X^IqH==i-IfGFYGY0QSM**;;SK8?Ya)cTL?N zufRdL_;qy~ZiYkfKpciw;&6NhN8k=Ov|l9NjP1DIP4y_8gro6e9E0O-X+93$#|gOF zZFL7;h7+;h9d#%E0Vm^II2Bj$YCa7w!s)p5f9furh%<5VyXtN{5PNVo&c+e zQ1f=Y2uI<7T=i(2h+}Z&N9u9di4(BzV|53fgA*Z(y3!7W}0=}G`@plaH*17ABUUZ1iT76u+Qt7PsAT!C;k#A<1siDU&Cp*rB(Z-putk;8#nlTd^Jc;X~LT*DRy?AiMzE z@N*o3$CuT77`~6gan*9_5x5nO#A(=$%fF%dDBKc9u#6d96>yf8#WK7pLQ|Drnwi%;QY##ctfUqUJsL2+qbIR#NxkWSonuzWhBY zdH+6R8KLVx3H#v3*ou3+{5>go^M2Tk{c*FGzb7TH2jQ*Qh6DW7LvSb#!y9loE?-Ua z5%@hEi8o?9e)CPuN8!ad8oyp$JqEYHad;w5z+12b-@=JFGC=z|@j9H0FX2>deM|Fc z_#wU;ZAG|6l(YUH`AK4?c~pxN%L* z`{6a%AD4Rhdrtm;{qcv`hX2MP*j8KfVYoLA$Fpz*et{$L=XJE+j!)ny9Qw9;G+vEk zaM57(I2?}?@LlY{1M6x&5nsbj+`*=vjHlsLT%ewM8vX{S-iyO=^A_q6cr}j1XRsX?ZK?Sv z{5_7wSvUrl_)zn4xG7G+gRukuh7)m(R$A}GvvD#$j8k#*)|yYlOL01WBV65u$KgzT z2fJ~nk2LSW$v7Lo(nj5jd*EC=0b9P;^?!_gaP-GoZ^c)zA8y@N-5>vsgYYSA!;L@D zdP`$)$MpPj>30wG_D?@`4~I{$Khu<0e|(W<{dZP{SulkshwilaJeJ`G>R>G-ow>Mpz$XX2pF>TcW(d+^^l8|VF=k-R_OUfc`k;@cj;horqEs@$U1UJNCxCai$({Kb{ha>S3Y{w696fXUl zju(wv;}|>+$Kmxj0bj%pT(+C`OT^8v6OYBo_-~wwU*I&{_;c--Zmh>Hyai|CTiA^Q zyKB7%cg5Lw81~|MI2UikmNB~i7qAb0{R{1H#qVK1{2BJg<8TmOjBR)a4#Agk7=D4n zakU;gegysqN8-NNj%VN~yctL1EF6Ph{ZjkKVH-}sov{PQ;Y7R^JMkHujGy9E9AMY+ z(r`502rmAW_6x(II2=de2s{TzVi&gKdpHW$>8<^v@wYezFTrtmKTg28*nz8j zt^E>lJM6?0aWY3N7#m!;t*W0uhxg*Z*e$2fFtnR{WKqmCt^F!!BM!^ zx0;W}J8%pR?ynw)r{M&A2Rm?!?=+u?=V2$li<9w312mtC({LJoYoK~M{u#TlPqca_ z9)R8WB=+FE-$V5OzyIS!*ozAeR?o#>VN0B@{|@Yf^L{T+-hNg*1pDDD*dM<)RP#Z2 zKDOba!_-4?6b{4bI2@N7uK5Vu4@cs^u^m?&q4_907)Rs7I0iR~(R>`9hZFEU?7$Ht zHJ^xAVJ9v*NDB8nYhzv&Aah7?7?r1QP0Msuoru9E)I#+ zyk(rO|5EIO3yf8_;xDlu-i!Tll{n1@;qlmp&)^W;Y@Fu9@G=~Z3yoKgz`bxJ-jD6L z{shfO;kh^(7nrCXgNNZb{4Y+x-6m{6W0B6DQ$hTwt<#D*gti;lFV@uAQKH z7f!&LI19URgDIN#;0ZVzU%_77a;oNY@e*tquj^m%2X!CZ4_omb?1w8()4V?(ii7Yj zY{PY?Yd!=!a2U?T;kfe*%}3xfI1+c8scy$-aTM;r0I0kqBQ9TZy#0mK0S?Uh_ z7f!_We^Phir8pUvnysFSV{sb3iqmo5IhuFje{m-6GgsY>J=lXk`&m63AHrVTCQ&^X z@5Gh~y8dDF)P3+~Y{d=ctNY=V*dJH@MLh`5#5QbMpdNzz<1p;T;kfBS%}3zPI1&dZ zsoU{-9EIOmq#lh|;~4DkRFA_;a00HnSlxl0I1yJ`qVB{Ca58@5SM^k!jMH#~rRwQ; zJ9gm~%hWURG3>@YmaBX4Eu4)EA3@9N=r4vxUSDe94UDz@X-)~H9}$vE2Rsp>JtdK`ye-~>Ey zt>zurixYAGb?Q#+!O6J&di7L%9H-$<8`RTr26o{V8`U%McI?ItHmQ5?pEw&g`$OG} zH{o0yn5J%-r0f41_Q5qat6T9r?1u|)QTNBwa1buBRo#YX;SlV*O+5_H#NoKepXw1f z0Y~D3+tuxO5{|;J>`;%!V{i=4!EtzSy5u{!&lGS=foY?^I95r*JB6|F?P? z-igz3<6Y`5ycTETpxx?jJRf^-={@S%crx~4-@WR&I1yXob^U!^>OOcfw&Ew)5BJ-r zd4GHX2jTYn)opk;4#5o%sE6SdI2@Ngs2+jiaU{;ccHH-n=A-aw9F03?sK?-gI1Wc1 zR!_heumgXYsh)_>U?*;KL_HaA#HqN&QS~%@5U1m?W9lxv24~`$$JO09348DxC)Bg? z57>)~oK(-nvDh+M*WYqV-3O1sR{RY6;TX5({qYkVgh!rMx8dhF1jn9H55upVmBaB^ z9D$2wsYl`&*pADeQ;))na5S!YUOfh<;5gjqf_eh}3p?<;9`!`L6gzQ+i|Wbv2b_wZ z<22m=lIGL#Iqbq8T~^P;`>-3gyrS;GJ8(9B_aAjH{tM^g@T=;U1YQ4~*ayG&ue#Of z*bj$itNY^kT|Er%z~T7)8|o2w6OP2eH`VQU9gf2FZmCD(6dZ#C zZ>z`QB%FXt-BEYoSZtf3@9R2F!==2MPscs67f;2x_yP`^s{Km*r}Z}61c%_SaTrd* z;rK3&!By|_`S4(zYOKd;I0t9r>i4wXi$`GpA9TJ;aS(ovBXPYPt+(TG*ohC~Ozg#O z-1xrM`%KgEdSWYHiNo+g9FD6z(E1qs5st$@<5avIr{Q7`wLTly#aIrx{c3>Ay#80pje^*57lW`JG z#hEw_zv`p;bR3IaI2UK)@kKT7##^xmhZa-M#$&M;@4&g(@|xx?KkE8V!9Mu4;_6o1 z4Ey0B*dO1*LAYuOt+(MeI0U55p^QI6i|T zuupl-N8(!8jyvKg{5_7wOK=RXRzds4;a)faCt?RajuUZ*idyf)E}V>;S5i;K+i)7L zS6MwBCu0|`R7E`#H^Xkc1$*#SoQ=Cy)p{?Uh;#8nZ23vozmmV^eefsPibrEVd=vX) z|7uzvgqvd<{uYPexi}1O$KlxaruK`#pW{gUBevtR)ioc5o8oBv1&+a)I1V=n(E0?t z3OjIxx6~8yMC`=ta56rPQ}HvLhWiF;zjT~{UHAdc#5HSZ-i?#62Oq%M_!jo!H-fZ2 z7q`Kd*}DFNu@9b&t#~u`!=W{`pFjQs2jQ#OhKtqGducUJN7w%*_Q9XMqi)46?1vjPQ1{14I0(P- zuDT7kz#;e#9ENK()O$7o3oH z!~*qcI34f6wuS2Va2kHQiS`RiQtydfcovRWq`m`tajs#f`dguVKa1sF*l&rv3@6|$ zoQtbB)%vJkHQxjKER`D$f7yd97Eij|58MBelZ=j!8hxjF;SsFIjj;W1_3w?2R~UVl z`Z1&97e?Q$UOR^UaaU~LqwX*|b{T!Ix@9EmaR|1%)T51#la0Pl{g%;j*-_fhzF)lw z_TaCLen5S?(eXy3A5_0?bX@d%_CKT^ggv;m(KFQh7#&YC`eF68M#ujcJyX5>Xuco( z3AP_mA7^yD(db9j9~d16jN$x`sdvC09B1_7>M2IYSw=sh{zfe4hdX2YN%fzMj*l4q zl=|yqS&u)#cDH(>(eVkRpH}ycV?AzI|$$Y;!9NWF> zql}Ih8~s0Zm(lSZqu*68m%#qG3AW!;A7pgA!00*ZdyS6o8vVX{Yo`M#~S^y`maXEE~7tDzh!jn`-6^Wf2!URdvKJ| zpQ%qXI!-nEbM@m!$GJv-pJyBP*BQOA`bDE->rBqChY@rI*vE`YwA0Uj&B;hxO({?*&nyU_7dttjEZgs4Es5-3RlNrG;C4p$S08V5yvpd+)Q=k-7nsNX zZ>rm{2Y+q!>gw~2j$K9%P=8=_95|o--%{^_J@|X02dX=bj?WvthI*x6w4Vn@VtbJK zY@_2HMz5)U-RQW+0?x0NdT;E(4x`sr-)3}t%jk8~t1RUFa2U3~t=`M%INs>N>MMUWHegO{>@Q}y=PgQJZeras^3_<+%ysXsM3 zZn%v7o2w7O9-M0Q7V77Wj*Bg4eM|K)?7@AE{-OFbqvNecZ>4_0==jwY?B81bE$qRq zjUKK(*ywnk(LYj8H#)v*^fv0nlXW}~u7~X(t9LOv9%uBn>Z^^8vyJ|Vdcbe&kK18; zJM|c&W2e#EtGkSj?-@Npy~;}V$E~sbQ}t-0%@1fofd+;cuf2qFQ==g}y?dngBj_aqg ze^2!&?7`EG-b;O*(eV|df2Ce-E#EJ0jP1SEdl?=7Z1k_y4;mdmH+mm++dB5gJ+S>7 z^=U@Oe;7SV{gTnK-+DfOU-fp_gC`ojpZXS~Vu7rml}PD`bneX zqG{UCK2*Ii_TWB7AExdwI^JXS;p$I~j%#dY{}JjPum=w`dW`xsqvLf(AE|!c=(yMx z_8+C*0DEu`qkpgdqtWpiqmNcUWOSTk^fBsHxAOhtHrO7k{-@FLyW2RwvFZ-&!8eQ^ zr~cKS?2kRzK2AMsI~_Z*eY|?r9d!IFwogzmmQKfmuzjNXHKXG`e`(%6NqrCY;J}^q zcy%ZC;HrPqC##Rc9(>v83F;koaejCYwog&7yqk`PV*6C}r$)z9_Hg_k)E{9F?z@*h zP5ln`;88C6boFfP!Cm&zXQ&^*9{k~c`b_mD*n?jf-Ju?TK=U5#dyw@%s*l4S>^1r< z^*)DKk1t~TPwGuG=y)Nv&sO(4Ovj1XK1cnD(Q%JV&Tp>ze(b>?9HIZLJ`;QJWuqsm ze|nVT<6YQ3Prbr1I*!Kn`RW&qj=LV`_`j&9Vh=8Qg1$gK27B;Lqc2o%agyWX`PiPM zUhNbe|Bmg8)GN8^_y=rvs#{Of@qBDwtX|{{9S_C!CF+ljjwhYfy!}`8huDMrX3>|b z-^LysbB?}D{TlY*Zs+OC)!o>GKfgd4;2Iu!vib__!F4Xue^Z~0J@~27SE`S? zq=hrddn+xybIfZSFiC89Z$vf6!juk>39mZuTj5kblmY@&D&Ge z_hS!kl}%r(z6^VC!E5w&>M_`Z|1Ht9kpM>RYh~SGh;uuD%R=aJ?M*4s|E?;Mecd)79g#2N!ri|4Y3m_TY4*?^L%v z)Vv2T!}h<`pBWu@&Sn2y>VIPoZup44TYVb#;7dl|qu%Z@$HzOceXn}yCv^M`w!75b zM#t@*a{PVjE3gM!p3(QKM`I8E$LI&tn>^?Ecn-E7R4@2~j$^R>kosYx<3P(B|G!_u zo}vB=_TaLw&=0E*#vXjw=$Y!B3uxYhJ=lIkz1^#Hybarrs@n?E@o(6EOubMcI_`<> z$JLJ+9k(g0dHV_VrPza?8~vpEkRt4lZ(;i>^)^0qyaLJ^I8@hogVt$xesIJ_9= zcSikh?7=Nwqn}k@jye4XR@#)F^;f^32!hzc@-BIpQ$ zAda92ii02sf*>e@@(W^%DT1OXf+D6Sw#ZqK z+23C+e}SAKm#oA51IuTTGvtleW&WY%SCKR1zbRj2`AO@sKk^6U^xrJszlb^cQF8ht z%Qyc4bMn39^v9O}M>+Y#AF{s@%l|^okQ>%#{)y#7yKLg7CA$% z*@XE&EuT%!kjIq&%kt@)vOam`68c|QejYhP{QHgedG-J8|8T$W`F*F*tYDC zJWNinVENQ?=Hy?I(<@rO`Hz^B?;)pGvV7C+n3Jy|r}HiUSULH`?QMQ~Wy=?mGvp~1 z%vZ5|7CA#+X9wo1T7DxrLmp8+!SelfWPjxQ$?4TB-+U+L)xU)%Cq$r zhxExA@|VijxBSv7`sDn*=@(mm9yvpPU-<@>pScfx^0(ylhL)eZFLUyTyuw0r>iXA?iA+a+sNs? zEnl~RIr$cHdLPTbR!%siasGPjZS*(AM?&XE7D{3y#$ztHAq z$gh&qM_az#Ma;>!lhgHGjfK!MEP-+AAJe$pFBuT zPqTc>OPP~9$?4-Q|5Q1-{xa4-!Sa{M8S*yMnV)F+E#wS&sq(bt>C0K4{0cdJlI2@p z!JK?EIeoI_|5Q#s;!4&(#qyt%GvxK!m^WB{9XUfDQGTlB)mO1T`95;`G|T^^oLql3 z@BehmpC)I>h1W1|w7i9!A&)3O!}7WrtWWMHr_Z!}lWUoiFD0kXvV5U(@{g}${U*!r zBWK8K{2%kPEx&-AA-}Ku9Lo=GXMOT7$mw$}FTb8S`2lje+43LUz?^(NIenhxe^XB0 z_eS=2zUB9jGvu$8Utsx(9lU??i{x~R<-6R(oZLlDUugLnKVeR8Bd0I2e4%pkzCUGu z7hB#<&X9{bnYUVg2{}VvA^B9?fd6n*ys>^>gCM!SEO1A{r{#?cxV2sKpX%+`%v$HJ zm6uoQ7Ulj7=A&8?cZm`Yi9RPj2!#dom?=$@O=({9{rLH%ood_k+sKtpTn=* z!RjARUo3x4@O=({A^lnO#q!I8?{oMQcC`BM(HF~a48G6dH`6cL(AF=OUl4qs!=Fz7 z9QtDUt+7n6<}! zpTqCo&H6ur^~Lhz`RjA|^XT`ozF2-!sPA+5CA(Yw68d8K`M8k`T&3K6F#OUz%zu*o zi;-jRT9OL}7{1TpchUcpzBrffbNB^Qto}cfE4==Q<>zOskJtA({6hK#8{6?0%byl} zpTlpWzX6~B#qt}1?{oOW^i%Z3@=Jp6bNHk5cVhoy`Ryy(9e`7AJ{W%MUbcTn(HA4f z@r&oL&*4{9ng1|-vHU{ZNCvJ@-{W?ND4Ea8XzhGbUSKrk77w7VQ4u7!P{442;<;V5=9Ddz?=08hc zEI;4cU)I0R;ZLRi8GW(*%HaDPeh2+6OKkmO`LVvw;djzMh`v~URjBWC_`~$u`1&E1 zpFFK)2RP;CgW+fBug~|7V&pjf(f2w0QTpeyf3f_M7e-Yx-jO@%;5U{A&7ZZf^T8&gJ_YehvLe^u@V+pTn=EzhDci zFP0yVzt7>P=^w|(k63*Y;aB{_fAv=!bd)WPLL+(oU&#!Nnu>NhHOXjbUmpAkmyT5bE^T{)pCV6ry&YAXu?0(E8 z&m;eyyo7wixxqjB~3H@Bjyp#Don?ow)xZ!zva+0MLK;r*S@ z@%YX=$e!PBpf8r+6MUb;@2NHatP7HQj^)Sa7tKcwe}I05^~Lh*l6e^5l$#HRUv!Ao z-)T!*zZf~z-<(`9!0>$ze+K;<=!@l7X6H}1e=_~+8|?Ur<;TxwK8Ig@xYd7=^~Lfh zhyHyIzm@(D+t~WW^8f4eCFdiDUv-4lpF>|Pza`Z7IsAF_*WcFai{sPA+51N6@?xB6oFvxD#RZ2gn1{)hA%$nvM+Mlx`fO8(<>_`Ro?U;87g zFUEYFJMsH9pTnQrV1C_YJb%dYF5lz? zYqqoXi{)pMDH!0Cn~$6DGxWRZi;-jhW+WF3FnpiGZ#d2BpPBre0MGwo%!l8WTrj}! zeGY#S{XzO-`M3`Z`96m~;dHCNNrlxH%b$oF&i6U|(nj;2IKz&=SpJ0I`y77x8Rj3( z`eOO<`NQY%)AV1aFP7i4((?WL9Dd>1R)0$Ja|-OgSblu};B)wG^q;0LmR}m``yBq9 zW~;wV@^c2%7t3$A_Lm($pTn;>&-@LOpEJN0%by*5pTi%f|5N&6`SJTPpTp0;!0KOp zjvaro{3W5j&*6{JU&{Jo`Emb!4!^O*>YtkYoCE6@%bybV-{Tx|ZE^u_Y$h5mgG zzrNM{y>_z{6Zd-8LZ?E1;_JA&Wna`;QgU(grJ zpMo37z*Wl42g9$p!s>s><1a>z=bjSWNCvLp`y77VmFB0;wev@e`S9y-BN@1Y?{oOG z+sr>I`8g5RFUEZM&A5>aT*3D_{KBive~G>r^Wj$|7YzA6hhIm(J^48g>Wk&~tiHVO zbNG2TS^dM3pVPn>%a7;3&*3-I-!S<(4SccuiQ)Y7IsA@JtN$T=vHbY_<8%1MH=AFu zr_~qB@3-YI+drSfUqJsY`eOORxRDH8rQCcl{O((<{=Y7?^GA#v$1lGB@HzZG`aj#t z`WMTuP3{8&jQT!@KVc^KkG@#`jI2HG`y74;{mLqqMri{;1HPoKk| zc&qjQ0e!Ljq0qn2v-Roky0`T|LY5ytKl&Vg)ot8A`eONQp}x=I_tW2HAFD5xk8=P6 zoO1KQ@E6g)ioO^*-0I|l0fz5$_+__S|6`Zh`6rei&p)5TpF;mp))&j4nyo%w-{93yroC%MAvHYgs`yBpK`sdIW%Wnz3&*3+B+4|q4FP0zAU!TJtqCczJ`WMS@3-x^t zzxEER|2=)N{CNC*p6#Fh`xo2sYbMKI66*ULe#4zszkWaKUo5{d_&(3BpZ;s~hsg35 zh40^d4!`GatH1yLR$nZ?C)D>j{PaEM|AxL;es}PF4u8VE=2sqI^~Lhz>xa+bchWDf zF<&e{zJKvK{E4%z{sZ*I@~dzo8MsQh`C$0d?lXTjAHQPcICtXX*XQt?>92dB^)Hqm zAHP0_KS2L{`eOMFNe>uc^zU={W%pbEf21##AJ^}5_>B*kzkBjMFrGie^3y1u3^3~Z z9R48v{DaLG%Ws364Ea8XUo*$*pGIFSKR$ka4!?>1+|%vxE0!ORpU>g9(eGz{vHbY@ z?{oM=^b3;jv9W(*`7>+(9qnoe%wEw!!M)1aJucESbp3;pTnO*{~6X7%TI^>^Ev!k^w&(j7sl}y%a7-u z&*6{JKZCwl{^U^K=kUuPwf%dUzF2;I|Lb%3Gw5G=g!M0$|6j+C^O3{Pf6VItiN09= ze;q&0mtRJH?jjyPm%}Z?#AM(qmHbEZ<=4%%`rA&m{>8}QC#OYr$oDz=AEN&#eX;!E z`2L6Uk;9+$q}Bh?kv#rn`TuqNT@HVY+(Tb1KfCax78vXIdDic-`a2zE^~cEa)3}k0 zWxmVd*ZJgKKf$$^|+A?T%muT!*7^p{*o*0_=_@S8`akO!t1p({7JQ$>@1g$& zeX)G(0R|ZT`yBp!`j52Q{)y$s{qs5e5&GL7YyFGm$JY;^!>{~>t^aTI#q!(Gd@{i3 z-{F;%%)fdZ;>-RbQh4d@<`AIB4uHWbIN9o_p`eOO<^Q+I{PkYwZ{|SAu{1Mzp z2ChCapLd+_~(Sbi05Bm-9| zHy;eY?>FY3!}?<6=)F3*V1VKK9DZKE`Ag`F<&TB;4?c%K_M-V$oNVhC%a4ygpTlo_ z$@~eYm@k$ekDt%sFQxx8`eOO<{P8*bh5@VJ-C*^_@_Vs)$pEL^d@%fpFPmR+s`+B% z*#9=%NCvLp`yBqPSIj@3?;pgN4}VE=!I1BB_?^EszlZh3^5gn_4u6dP?x*qik>yVh z$6xc2!*BVW)gPoUmOq^Be!PF5!>|6m`A3~@^~Lh%1>fh{{^>8GKSq|{8GN6^Zy&Py zE1qHX#q#6h*XQtyUNiqE^u_Yy&;NZ6zv2((KhA&uC6-?l`u92fYWnM*$^9eCuM58B zBZohe^G~BMmLDI#K8K(Gy7fQlEUPb;AD@4G4!?%}74*gO)1iN#!|$eF(PZ_-^4o&% zbNFS$*8g?%#q#kO!~mzg<(4Tp> ztzRrZ9zUPMFL}e(Uwe-EV)<=J4;bK-n-7LRoBo6J#mLcr+&`bgAD~~s??1%yH`0e=+^XSYIrEYUtnR@T=ao^`Cye^)Hqm*Y9)q{qzUui{;1l`yBov`Xw#N@p3Fb zu3z(!!ylu+!3Ea8SbqHc=5zQBf3)>qOH`0zl#1^{P*`_ z`SJMq9R5`Lt6XILi{&R@Yh(u){repL5dE|0i{;1t^Ev#ocWwQ9UCjL_%a8k~`N-k- zasET}#q#6+`5bm(X9i)%q99kNf9y_)YKG`p=**mLK=e=kN#V zzd>ItKa)Lr2KcB-NrN7dZ=8NUW(gK7D)alu z^5gn_4nM>B-|+LNSbki;&*3kje;(_L<;V5=9De#kTmRei#q#6l7oWo)rvLEOwtlhv zxPLx}->}H)uX&C6V)=3Zd=9^z{x``B72f}e<;VT=Is94l&tiSC{P_6sIs7sDuh19g z@_i0}>fdbrTh6fci{+Q#Mlx`fa`VCPTRt*>27NJd>|I-O!2rYeIs7H`tFN{C;#|JZ zv-Ll=`uEXqADT|1>nF>v5Bopja`;vMwE6?|#q#6h*XQtO z(VyID^~LgsLVcgZZ~T|lpF>|PKOTRd!(UAQx|^-OSbkfm?{oM~Us(Mm^u_Yy@%K6W zPWm77^;axE9zUPMpF{uHpIQH6`SJDF=kQ1Azery!e{NX6&*9HnV(Z`T79Kyc{P_7x z^O3_}%=vfH7t4>YpFW3Q`lZ!xnQ8UK^5gOIIs7^F-={B@ACI5U;SbVZBRSFV{#PtN z9zUPMUr4{|R_k9Ze5JvZfU&>y5PmLHFw&*Asb-=WLui{%&LMlx`fa`VCP2fnfX zw@98Sas0)|Q9B-gpTl23zm4_9@=KEYzyPDZ&*6{J|AxL;{!-jX2Cm@y9R8ATt^bSe zu=R^EAN?n%b#}=2IsDe8=6^w7EWbPWK8IiOo%zjoT79wnSl{RHyXk*MUo3xSsPA+5 zQ@*$Qjdxjnv3%?S1~}#BgW;#?&*bqJBZnK0zt7>f(0`Bh#q#6(H=o0w{vYdqw^`P| zSbj;;0|prV`yBo(`t#_EhXtN-(RtiCvx?{oMiE1AFjz2=MM$K&sF_|^31&=<>(@85h5zct_Lr_N6H z%d!0U{g37&hd)C9{U-Cp@~0>BFu*A{9}K@?Wvib*+tx2ej6GDBT!=Fumz5A`cSpK}=`yBq%3AX-QdHlulx<==g!(>*-${Rn zzF21Mo_4^$D9QwPnzF2-ssPA+5#j9KY zo%F@>hlB5P_#^b!o@475%a8l#bNI8?u=)o~v-OMRPs5F5;40hAT)xlYFQk7qeX;zRp?{ylZ(hgte=&Wr{Mf(G z;kVM?q1)Ck&gJ_YejEJ@=!pWuX z7t4?JeGb2HUEBXH>5JvphW>pHe;WPW=!@mY`aXx>MgI``V)=3XK8HVtek*;k{P_Cg zbND0lJLrq$Cr``S0ZzI3VEEPR+5XL@FGh~%-?)CC!*8QMkG?pU?{oP5^atsS<;V5= z9DaV0_5U7yvHZ!&8Zf{qHy;eYlKx`)V&qtVb8^7|!}mG-Zu&bsYUi&wm+y1<#XqqA zFQqS*AJ^}5_|xdO(-+IHLi5Q0qko^n@2CGQeX;zStUd1g9R7qKTK|_lX6qNrkNf9y z_zmluzrkGd#q#q*eV@Z`q<=MiaW3EI@SEs=M_-)F_c{D#`bR!){fl$?K8N2zzqrSI zaW3EI@LTDB_;d5cxqP3)pH6>xp84WjzR%&e(QkOhd~q({=kRCHf9DtGi*xxthu=?% z+)Up2dz;@%zMI@e-ts?|x09bFcarzWTPOSX54y;&l4p}QUBU8h^2OvH@-VrVyzPoM zzn}aQ@*w#O@-Vq>C7Zv1{3JO;-Z0M@t;YaK>mzeNdDz!Houts zf14YZkjKbnB}HT#=P33<)EtllK@uH*{x z!z(6#A1C>nI#W-xzt3~WN(m=l_ST&dgpY4Qu?M)F_C z&Ey~KYxmzuzK7gPeudmm{*XLK#{26A{Dua_Wob2 z_wVyq16Qf!KR(C%|5+Q_=Z9MQV$8?)Pto@|{JM$eUqD|he<1w+0H4Dz+SL5LUb6nh z^5efh@j3jm67#!{OZs&zKb@=r1Dpyu{C4{1u)bLSK-M1jeGb2NGpm0;eX;!b{guz* z&!qoH`eONWLw%pauiD(|uRdV=Czf9le4oQl)8CW6Sbljpem;laQEK(ir!SV@5bFCJ z{wV#2=!@ld2jA!LySB9Y@6s2`kNfX)_!;_Zz0A+gWcl+#ea%M>f952szYl$}{P_K& z&*A59W&TC<#q#6v_c{C?`j62U%b$uH$-q_0%?HCT+nW6!%f}BHIUfJ<-!Evs{3_1R zu)bJ+e{vrfVAS_H>gR1^_1AmF_FpVN9zUPMuc5y`eX;yX6i)^i^?eS%jsE>yzgT`B zZX^R&@O=({O1bra3G0h7ANv=7e~QoH_iktY>-5F)^%?<2eV@ahSYiH_zqS1n%g+nH zzuxCre<$-VlTVi4l+?ulqy9vf!*3_QL0>F?Ao-ho81j7%zjiOHzty1iFP5JP{ren# z`M%~~PG2m4CT_U;K8N35ZT?&I#q#6NuY3-F;(q3D{VMmLEPu?(FI&InBZptKzxh|v z7t4?5zt7=MqyIL2vHV#D)&Mx==7Zsn9d7l@e`o!Rk>mU=5Bu+P_@zhDKP|cKSbk@6 z9~fZN*L*PidGxPgeKB&>#{~ln-{H!UsiARZ=^4lKRx(9hd+n@YxKqP$V)=EU zf1kt8Kf(NC>5Jvh3BJ$achkR{zF2;&?{oNL^fUCu^5gp_pTnPhqV<2^@%H!?%a8Sa z4u6#X7Jsn)6U&c}AD_dYnzs6_^u_Y?aU&VHO1b%9`1L25{~CQUay)m$`aXx>M}PCz zt$(rnmhk-NbNCgfTK$XZi{;19FFuD~eVX}0^u_XH|2~J`O@Fgt>t8H?XtiV$k^xS+ z`C#}h%~t;+`eNk&YyW%>e*yj9(-+H+^?eS1&ZSl#zjq3+A7c6O_0Q+<7t_CxzF2-+ zvJMPz%FPGEZ@SFt|DL`WIo6*^E*N0=K8IgB-TckowEo5N$5zei%Y2{1ubyH4#q`DU z+f85Q`yBod{nzM=<#&bpK8N4XVfD9o%la3~Zwd8%4u1jtOX!Q`$KOBgbNJmqwfe8q z7t5~=^?eS13H>eSTmNGDy}|c6{JEW0|1$bw`EB9#!{_kJZ!!N3`eON2p}x=IH__kf zZR=kwKYxPV0XXI6gW)&dW%VzoFGh~@H~Kz@-|~R@-<^=mcPzg;xep95>T5n2elPt^ z{%HM+k)wV*e|!$Ve2&$>hrU>TLvkM&VAS_H{7(9tykqsn^7|ntL%z@9*F9+UuRhh* zFJ9*3hVy+6zwlx6k6?YV{NmvI9DZ51`H#^T%kQ)D%lh{@{6+LvT43uJ%a6~WK8Iia zh}A!izF7XE@b}kzo?ZVu^Pi?)NR}Vpzxo`02j{QxC+lAOJ6KM z9zUPMUr7IecWwW~@~gt@zt7=Me9`LPLSHO@YUtnR@SExXg}zvRJbpgUuKy*gf84cp z{AQBnSBLsOhrfXH&wkI=FP7gLe4oRw8?gHC(HF~a48G6d_tHObq16}59|*qB;ZJ|r z>d)cd{}s!RpI?0rzw8zBFJyhO{L)b0=kROkKTlsQe>nI)hd=SRR)5t$+xo@w7X{zv z@bd=EucI%P-w=GC!*8H}2Ys>p!f^ik9Dd6iR{sO~V)^m)%jfV%=x_VJtzRsER_Nd7 z@MpYf^;_tR<;U~a=kS-(|22KF{8-=T@Vnl!`Wu{Sk3X^e`1#-G@JH#NbfWoU`SJMq z9RAe#R{vZ6|JTIw%-=s_>lY(O@A37+=kVvzzm2|Feg-#^fh*Ma zIsBP_vifJ7#OH4^=A(Z6`ze}_9RA{W&Hsq?#q#GT^Dw}u?{oP5@0q{pUv2$j`Q2H2 z-1j;B#)anB(-+H+`{#4`J@jv;FP0yFe&%!d3*Wc;zoRdfAM5)Ze(7J#U+Du|zgT`c ztl#JGXV9NQUo5{JHt8HC9)F+1Z=rt|>x<>5(R?z%=-=n?=hI(GUo1a<|LSx2ixye`$1k$=i{&?DtB=?B zIsBTxnP0=7-;3oB2H)rK3qLaddDa)ppA&qa!=Fe0pY+A@T{QT;3_zOR^{#X0R)-RSH z`}aBg(!ZO3GJUc9^6>LRpTn>F%KTr^7t3!C$KU7h7tk;I*!maCpBcXY^*Q{ee_Q=A z9zU`C`2Cg7;rG%%oAt%=n?nCShhO@w)qjeRzxq3? z|0U~-a>*$M=t#j~ss8ism0fUo3w?e)is%t>5SH%T_i2=k&$$=b66D_j$H|`fGg3 z{>k#=&%YMBJlp^3R{yh8?D*G_($KU7hd+4w7cU!+$eti7+9R9>Lt^U#U#qy^nYrp`f+EI)pK>T~$B zHZuQrtS^=y`}aBg_KD`N^$%OWSbjWzd=7sR{ln>t<;U~K=kV(`w)(fx7t4>IAAAmf zHvM<$i{)2`$G^|B{g+t%O-60~i^%fh`){AaU$U9`C({?pAH|Ji;40w&*$*x(BJN#wtlhv!tnmt=kVv@AAu+10{UY43$y9? z`h5<+b1U5Jue1mEZICzhE%hrho{EI+>g^*Q_o`rom>Sbkfm?{oNz=-2#<=MPza ztgrdV;g@f1{a?)Q-^B8lhWb8-U$%|;x3IogesA!74nISG0e!Ljc>eet{*-O4{>ER} z`o;3&y1n@=^u_Yy@$)(S`ShQq zFP0yVpU>e}RapIh(-+H+$Is{RJL&)UOIyEK{)F)S?Q{5DJ6ZiU`eONU{XU1kg#Ozn z+50!K{Ne2GkMF`gQ#KhfQSpvts`)hd*IYtG}4_#qy^I-{e=n9F_uuF67t^2eZ(F}uemeB; zbNID;TmQGx7t4>&A3o2ne;@Ndr(a2yAD@4H4!@oA5BS#l7t4>|Kl&X0?0v2NZ2DsP z@%hW=@R!p6hQ3(-((wM%=kUk&xB7=Kwf@EO|LgUi^O3`Es4@RB{{BX>{P_IkbNJoz zSzjzaKK^_TzxqI{zl6S6emwtt4!?u`Rae>bk63=}-{!0>$ze5JvZ_m4i$`YEfwdfr;u*T02i`2*SN ziZmiy3Xo9&42$OmOmdil7Xv~n-7LR z`Ec_e<^TUhj2!zvgd54g6?~t=&zoxgfiJ7aVE+!L8Zfl=hOdy z$4@LD_kkhb=kUkqzdXb0i{)2k?Q!4d@GFnC{;%Zv#q#rm?{oN5=&!tjo&RF_vA)mY zPp4l_U!2SLIs88Q)98!k$JcM4!|y)M)<2uRSpKx|`sZ`_`6rma#)`InvHX&-e?Es_ zO8>~~?D&c0$LDXK!*8O080(AW$Nqf|e=u$RKTlsQzY8~#fvc384~CyU+5Amcvh|CR zOR{t3KV)@0PzR%%Lq<Hn3! zSbp-cBs;(2-{*G{>Aba;zlxXh59~+KYEt=f2S|T zeAJKce|!$Vrpf%1Rs-#h8!!RmlZIzR%$g(m!N%t1p%x zpMQJ~KSO^8eX;x*R(@H1pTloB$NK*beX;!b{ONP}bLsz^zF2-msPA+53+eBi{2qF| ze-g`&>-RbQCG>wnUo3wrZX^R&DK{Sszowbz4}CFm9KR{a1p^G<=kRCHuStFnKKd79 zKK%IeL!ZMRqyHd%vHWy$9~fZN_c{Ff^Q`|Bli#C{`eMvS{doTS9DWb|6X}cPHzfCg z0Y-hF!!J7D>OVtYEWaOeGUWRl{(SmtC%?xZ{fp(t^Uvq-CthIn&!8`sUu)%;)%Q94 zM*1(&7t4>Yzdnb*fd0nG-vL1XV)>1szR%%TwOIcb(-+Gx3BJ$ar|G{zUo3wvZX^R& zDK{Sszu+RPzipxQFGh~@XKM00`!K-peV(m5JvZf4}8(_=9cc@0a`@cl0lo-xTWm z9RB31%zuKuSbk6V{NQu=i>@(${q?NASbl$~?{oNbW|)uP>yG}#@@EF$=kP19HUAU( zV)^m?ug~ER&_BG$>Wk%fhV#$o@TcBr^`E6LmLH!#d=7sW{T-6uqmK29^eZ z`~~EP>5EmrF`U0XhhNoc{cl-p^~LfRhyC|C{PLU4e~rFaer-5^d=9_$HuEpp!0L-~e~%WtKhpZp#>_+t6-^PkUAe~|vk^u_XVpBT78|2~Jm_)hEp zUHW3oNB=|N{PQ{d-n-2|YGdnPEI%GUpTjS@$NV?xi{;1Xf1kr|qo3M@$B!&O9)Hb8 z4u3x9|Bk+RnIG2gbNFTVS^xWQYW2nPhD=%^~LfR zCF{fhr`&un{Qd{b|BSzXMT{KBKc0U+hhI3y{GV=S^~LhrlKa2_qrT7KchdiuzF2-$ z`27(+hd=z7)xVv;KR_(MI$M3bzR%$o%{BkR&8>g2{P_IkbNEg4AEPgpAJ1Q(!(TxE zJ^Et#-MEnqT&3K6F#NVBtpDA&u>Qr!as1-zkI&)v(Lap7Sbj-z9~fZN_c{E9^k1bf zmS2&z$9=mA7t5~-zR%&;(tm-zSpLM|`y75F{Y|&D`eOO9f1kteqJI^A zvHZCIK8HV_{)hC%^2gXp}&5a)fdZ;$Is{RGxV>bFP0y_ zfAKl|G5W927t4>&Up|LF<>$8lYj17+i{;1ueGb2sem#A${Mf(G;dj!%kG@!bM>v0c z4u9g)*8k`9#qwK&?{oMw>F=?PtzRrZ_V07}bLn3|Uo0Qbp%~zln-7LRO#eyxV&rh+ zAemwp@hd)Sv+P1cSvHX&x2MjR!_c{C#`e)J?%a8Sa4!`^v>;KR6 z#q#6tZ}d6*`d;%-Ew}!~@)w2oUp|LF=(7>-RbQ34b*I>4ReGb2j{t7#ozl@XlsNbDjFy#9j z{xJPp>5DNR{*-Y1eGb3i&({CeJM#FE<;UkQ%|{Nui}Qa?Uo3w{G7kfsa`VCPC%$j> z58uh^i;<)M=H!9_hVOIu9rQn@FP7gHKEL}Me!(KEKYcRSPnI8_KQ$jY{8G+ee`oW> z^5gn_4!@iJFX)Tq$MetU@JHz%xr@~o%a5;rK8IiaH(UP_`eOOD*!*OGQ*J&Oek=XE zcD4Fq;qmWt_%lAX`rpwP%a7;3&$IoHn14#8)h{Q@kNf9y_${3ODt)p1`0o#V z4!_`2tH1qjR$nZ?B-sNDaLUaGXZxprEB$h^{B-#D?>>j$@tM{CmcCeiT))rZ&!>OV z?$*CpemdzB1C0KC4uA6JR{yv3#qztd_PFnJ_(Sx6w1?Ff%P$GfUp|Mwc!|}&g}zw+ zP}o18!|xq4{~P*Z`E8+ppTn>G#{BdY>t8HC{`)VV!!P~T{CDV!<;U~i=kSN*e$i5^{~CR<{NnKagU{iYuT+@bp_)CdzF2;&?{oMq^k1ScmY)v$?{oO` z>F>Fh)fdZ;=bz8vH|1OZ&(RmlkLRDy;diWV{^TmFFJ9({{(TOAF8vSai{(!V&!0Yr zKT=@zXYOtF#q#6+`y777n&$7nkNINxWubqc!>^}5MqeyHzJB-|{v7&`?rZhM^5f@U zpTqB`Kdst)aW3EI@E6iwZ$I^#SIK<;R~t`W*h;LhFA%eX;!b{e{or=dELYM~&4N%bynd_c{D&^lJ_@Uo5{U z_&$f5JvZ=O3TLub@BqQ0reTKOTRd!*8MAMPDpG zuHWbI^ER^nm(mx@?+*L#bNJo#({((5$nxXy*L>vg`#JwD`eON2p}xd_4^!t2j{;)Uo5{b)b~03nvJb~<>6LeEPr}<|LAl01108n(-+H+-~ad={^%Cw z|L6#-FP0zo-{df`~mvk(-+Gx3BJ$aFQWg`qpZGI{;cr+*XQutcC`LW zjy7K`KfeC^9R48vr|662cZU9b4!?dUtG`dZ)fdZ82jA!Ld+EPLUo5{eoc}(DKe~(6 z-{}~uFP1+m)b~03j$O^aoxWIp+&`bgpHKf=`eOO<_b>Y#e$n1m|HNahf3f_g(7(^& zx6yxzzF2<41iJ%p%FPGEUv!|=-|9H4FGgOPTw;Bn!>>EY{2S?u<&TB>K8Ig(g!%uV zFP1+TK7ache&Mm^A2H4P7t4>&-#&*wi~h6p#qtNjehuehvLs=!@moB_%MxDK{Sszl(n13D&iZmiOQWs-9{OVWas57r-$(yr`eONM6i)^i^?eS1;u%)|&=YO_V)^x1d))VV zwtxD+qTfQ6A3wkN9R48ZubsB~V)^m-`5b=nnb!a5^u_Y0h5mh>?VtW1=(mvN$ND~p zKfw9Bon-xs<;UaabNB^kS^qQXi*xxthd-76d-TQf*b0d}+EI;<|bND0l-=Qzg<@+3d#o5;X<_*@r zSbjS6?{oN_^e>?=&gJ_Y{wV!F&=<>(uU|fgKkXdre}_}8e{n9~=kN#V-$Gw3zb>rb z=kSZqwff)C7t8;z$1mq2hu=aTI?ehQ%a7;3&$Ip0-{o}k2i^VS`TxKAcX_t|X6yeE z`o(0`Zw~ACIsA6cZ)~*sV)^m>^*Q`u`j68W%a7~#IsDS|tpB_-tiD)&OX%O{@Vn?A zOCnH=v;EV*hJF`Wer@o54u28nXXuON zw*}wl@Eb0${`Wr1`WMSj2jA!L2k75UUo1bKKR$x9rZ3Lr`yBpM`r9;F|6=*^ z@#}N=J@jv)FV5xrJlp?;*8e}~7m(%0_4_>AKj$BGHv13$tg!!6T@HVg{0M!q>c_{Q z&*4{JWc?SNWA(+ke4oSbqJIs2vHW=c_#FNi{ZHtNxiB-{5JvZ^VjF_2k7s3p4Au2FA4R1 z4u28-Ui#u(zR%(3Ut;~2o^SQVxqP3)FQwm3U!2SLIs9t+OX-W{*WgAnaFufN!SFjS zwf+yi!1@;>$LsHKa=`$@_c{D&mzjSneX)Fg{9NYy9DbVqJI5sT9LpceRv)jg`N-kd zPq+Htv%XkQ$Uo3wHZX^R&@O=)yvCaHN^u?Hu`n9-`3|ztYIsAE7ncs4e)fZzv{EFm)A>Zfl z7t#O0#q6Iff4=FiZo26#6gF7t5a#e4oQ_rGNCLR$nZ?HTXV(0_!!Sbk;J9`}6?en+ zzR%%j=)d_B^TqPx^N-Kr*WYC8-}R^Fi{(!Y^?eS%h5m)~#kqW+!|$a31bwmm;_&Z> zd=9_+r`G@H^u_Y$;6^fVm2&gJ@M~{2fBjDGKN&gBpH|#R2Cm?1J{bPM&&;o)FGdbO z{`(c5!*82u{w4Iq^5g#d9R4i&i|C7U`96o=OaGvoZT;e9e*F0v=Oc$d|90#DS^8r6 zec|}|9De7W=CAoPt1p&6FZe!(Uwyavr_dM69}B+E;ZK=u{;TxG^5f&*=kROjm)>Ii zi*xxthd-76rS!$}px)rHZ!gNGP3;XVgGy% zf6jyEchVQjuS@D+fKlJ)@R!hkkiJ-c{Qk)2@T(rO`YYaQ{fp&S<3=)Yh59~+KjUHZ zi|LCoACKSo`!{?JfBGZlUqoLle`5IePdAy%{j2!Ea?;m^)e<}S*UDm%?es6Lg7+}=*IsAD~S^op{#quX)?Q!4d z@cZa5rZ1Ks|Neu|;SW7+^^dy4`WMS@%eMx==-=n?YkSRqoxWIpb?D#c@H^>mey7zJ z%TEX2=kQ1AUqW9jza#iQhd=!}>wlQOSbqHbAwGxS@k{f!y36_(%bynN`yBoV{VV8; zbNN1pU;Qhq|2BQG{H{>n=kOQOFP~-oi{)1Z-{d&Sx zmS2V&$-q_0&BsmnWv`mQ%51AIMvncjNiG;*_&$fEBCVEI*AK$-q_0%?HCTd6WBhzttBb|6lv(bNG$) z&!#VypT`#%VLD=gTL{kNel?a`^MedpuzMi{;1t^Ev#Q_pJW?^u_Yy`yZdf z?^tO5YICfLu&*9e<+5bWKS^8r61!4bu4u9H2^N;Md`eOOr@%4xEk;Bj5)chyt zi{-QYvi18MegXa0>5Ju0&8~iY{XU1ErvGpHV)-S(_c{DF`kOpr>le$f4!+Of577S! zeX;z8;QJhYS&8l6ijP`-vHYdM_c{F1&CI`uzF2-;@O=)yh5o1X#qx`BBN@0#x%puD z9h+PI6CShv#mMpa{jc|boG*Wb{3d;|{MopX3|yhU&r!d<)avg)*XoNgAN3a`7YzA6 zhu^rR`M;zumLH#geGWf=lKGP#xB6oF@%^{Y;SbTDNnf1H_c{Fft*riH`eOMtw)|!5 z_c{F8^jCPo`d`M0hy9EF`y75{nbkjozF76+_m4h@-$Q@p>ymno<(Gv1H6JeJY-9VkF@3T8w$Q)N;dju#lD=4e?BD0`XVG6mUo5{V z)b~033ENu#*F0tG7t3!BpFeyKzqP{r&3|sbSblu|@Hza3oyE}Id{fp&Sh5hq6{EEre|K;?>xqP3)Z>Ilm`r=%^&*Asbzi6KIFP7gH z`uBOZ|DCP>Nza&HL6#rSf1kr|;QT%4i{;1qK8HVH7puR7zF2-de|-+Wi~bY8u>QsJ zo5T8jo~^&D)!+SD^CytyR|Vha@M}2#5c*>I#liPE{Q2~!(--IReGb36()xdxzF2;3 zsPA+5UG#_Pi{;11pU>eJ?q>DR?zR0B%dZUeeGb2d{?+uw^5gOMIsAF_i=MOkV);`; zeV@ZG*xmXsqc4^pzyJ3+{Prp4PoXcCZ=a6b`!CK%4u3ZJF8bnJzR%(J&|l}5wtjIg z-{9^At%P$N2=X3ZY^z(jY^~Lhz`R8-^lYeac*GgY3e|o6z^X&TRkJ9fU%a6z3 z=kW9QwEB&G*1uSOO{nj4__g#i^u_Yy`h5<+i+=sDt-e@(Jb!!+znlK+^u_Y?L;pU9 zKbQXG=dHe2epT>&4u3KIJLrpZ`96nVz84>Vzp?t_T)xlYH_?BVzBrff^X&TR@7K@u zljWyzBN@0#CI6Z0a`**%TmK)?7h^s?Kjek)4}6~W_cj007p#5(S$-RCBm-Bd?{oMa z)#k7LqWNOXNBwyI_#FN$`ah#D&gJ_Y{#^P$e2M!<&gE-9a`=6meh}mLKc;9R4u<*XWDoSD|<^z^LzY_=Wr1@jvHPt1p%x>-!vj5&eyRXTDf|6^bVV zjQT!@Kb8KA^u_XHeV@axr+?<}t-e@(6^bVVjQT!@-$lP*$b7N-!vjhW>;5FsuK8HV<{zCfVT)xlYSJE#Tw*JMre4oRgLjOGa;#|JZ;a92u zH>|!mm+y1<)%34?%Y1Pz-{ydmpnTJk+R<`?feYjP#|&gAcZlxQ=O>#dUSwK2bj`OV~d^0(wPdGm6c-$?EtHpG96k z&X69%uAU6D)j$*<`v8jNWR$f z{yirx&$a30dHWr$pE~;gPJXcJ{U+vV=K1F>pMS)>nfb-x@pEls z!~C(3ADnzoj{6^F{tNOL`R`{he}BDaEzg}NFVCAL-&^DUivM8e$GRc!U|z=jWpV|% zAo<=IekHlTW%>KBPrkVK$9MLH%kxH8F3+QvEYGi9wLIT)`SN@y>$kD~b8XA#GnjWW z|BBp2Zce^;M*p+Pi^<*O+T?p>Lzh{Sx~7CEo+0UK#oEYnS)? zm{&2+PrgUP{2KDX-Vww zo#Z}p7kRbhdpX?SZ1TzEZt`>F9`Yv1_fnYOOTL=iPkx;|NZvd79s~1-$&Zs4kk?H< z=OWLL|BpOE{sVcGTzr7dA0wYl&KtJl{VsU|dB+-?Ur4@}TulC+TtYtTK$~AizKvW# z{)}8nKKvk?Uq$`}xrV&n!IsyN+sO6g5ptSbTWj+h$-gHzlP6!h{P|aVh|TX}{#){F z@~SDzyUA0@J>&<;z2rsYe)10wHGh!YN**RJBrhPJRcG@v+-6{9^L8|9ZzOMjq;WI(7IG`O z_9)BS$g3W0+)jRh+)2K?-tsQ;YR4GQCf`o(CKn!Sc@OzAaxeJ~az8o$IGaCAK9{_J zd?PtS{)#+8K53fyqvSsF7`ftj%k$o}<8>E#0=e=8%L~cxkc-KCoM?Fo`89GG`J}Yv z733juC3)?WEUzL@CD)M0$aUmdC)@lq`FZjp@@}VCUhtN!XC8SndAkP7r;%?a&mu1& z50K9})#fiIe?l&rZ};DDn&nmG{L_tV$aBbbU7ag*=bE;XXG1Me?!a-;r-4zeye-XUGf5pOe2JFD0+A zuiby%I=22vo`M_V<{ATiR$Q|Te z`z)VHeuCUXp7d+Wd&zf`=aWmGw|ta5hg|Si>v!$%l6=kN{rB-d$UeTeA-9n4BmX~L z=L4VRy#N2DWNK+LEDfVDgdt28qcBW{VhF=9gz1DuG?ilr!)PiR!VX~=X9yvT6NWGv z7M)`#hA@QR=XJkdFTL;2@4M^qaN6^{KF{~(bN#um>$s3->Gp)w z&*bz$#%VWMUQOPXT(zm?SCPBO9pv=QEI+Qs{BrVAat(R(&6anPpCPAjZvO7K&?h&L z>&QFbYI$m=wSR=1L*Ap-@;dTUNaNGVt>j8_WufKu zIqxvb|3@w)51DKAYse$XZRF4Ag?wmuKYxt*zmQAG`$eyp!DBW{**;vL&3nMw&mb3& zKO`5DQxCTG#pEn<3HeBJDfu7da`L~(733A^S@2J%tlM)LXOW^yArYwjyBFA-$c$O?|O{odE`ap0`f`6T3$&0om@ucgUqx zmY+16Ir$HA=~b35sAEpv^$ymbZh14ggM7jq<})n+i`+r3p38iuD89+ zdM9&oudtNM@IRbhTef*hxP<)oH0b?g&Ix>0$~pmm;eOPxaGeL!F{ySxN{l@0?o;e+ zW8L!jP@9RF~Ts(_c{FBaGeX& zOX0m5`Vz~ZnMl|9K8N2#{~7i#mLK=;bNGG2bu>&J;d7tpUo1af|2~JGNq?)Aw*18M z>l4-2jo;_+o9Rys=i=yJEI;nw=kS-({|EaQ%a6A|pTjQ?*99?c&-oY2kNfvI{HgTY z*uPkQeWLoh`S&^etZ-csQ&u>a$NY=s$Nl>pelGpI|Jw2w%dbyVU)R6S;kVMC+0XhH z%a8l_Iec6f#Z=4w#q#6j?{oN7;W{a%+%)T7EI;nw=kROk_y3>GzgT{KqWZe|SN?3+ z-(@qyKVOIakLQ&WIpn3}|MLA` zOS!$@dynt`)|_uV}>J^C-f zA7R2j@O=)yJ6w0ibQ66s+QT1%Kf;86;QJhYez*>g>A&>FXb(UBe6!Etj|)+?_8|e@I%9fv4e%!y$ z;SUS`Hf_|^2s(--&T z`yBo}`e$(d#Xb2xhu=hhA$@UAzR%$=rGFuppICmp{(KIVbtehb@=rZ4Wv_c{D_`mgM3{fm3@eGb2ie(5*1{fc|?eGWf0+!w`k z4}Eb@zR%%j)8A)58^2h7y#9O+KcD_e_AiznuRotB#vkt6VrtH@{!_{FOA_h2!79hWqZAHa*D3FP0xKf1ksjO8;8+FP0xK zf1krI4EOah9XHDQ7t4?LUp|LFfqp0Z7t0@$sJ?Fb`y75f{eJ9UEI;nw=kS~8Z}qLM zKe7C{f1kteraw8~=3gv7?%(I|)53EQn8vYxvHW=Z@j3j-^sDKM<;VT|9DX(Z59o{K zmqp9p=kUAeZ}c7aKVF3cG%m4r0Kd?P=_}SsP7fgM+Z261j z$J>w3;m@MK4}G!xszmj5%irhl)5CK$n96sx`4`KNm%q>952t@F`xncvjQaOE`~~!% zr7xBruRou|uL#fmU^a_etLK= z2-A#%x%|jI`D%|Gen)t22-C|v{}aov!yjS7KN!Ey;a7(1UYHIz+WHrxJ;px|VVLCm z9Dc?>%x@|-Uo1b~fA~DnKmGLYZTqbx%a6BTpTqB9`vd8Vz{~o{3;nz;K@n69C z7t3E9`96m~?qc(=;rxr`$LDW8hrg2kB#vJ!Ki+@%9DeR4*8kTWzgT|!`tv#bBKi&N zUo1b~|N0#MV*1w|W9wfmzav_HK8Ig_sf~Xw$1j%O2Y-YK|BQ9*!SEMUn*S5WFGh~- zcTxBc6BxeF;g?P^|L(nP{9^g>@yqA%C)1y~xB23pe4oRwrhhK`7t1fe;KKyQ_F$x-%fu$9)H9=`96o=MSpdU^)HrRfWe0ejPd&%e(q(q{Ez&>UjJhG zeG>LM-{t8HCo`0XiFQh+<{fp(7M*aI7egpmbJ*|JS{J4Lg!(T-I74|Qd zKOySh=kPNxx8*m7^DmZP5cxibUqb&qj$bT)VdVQ9exIq<{}&@{{>Ad+CdGv zmfsofTVVoY{62?YU1R{QDe!`7P!zr!STt&%e*% zucUv%&(^_#E{DHq%|6=6-*ZTK4{IuET zPoXcCpNl`jgn!V#&*A6Sng1nyG1{a5G58})_y@kv;aA;Z{)^j(_KwjWetiC;_Q>I< z&oO_WZkvCx{EpBL6Bzyb9DW!5bLflZS0wCpzR%&8&b9vM(ih9`jC`NNFPvxooAkx< z!@>jbAK3?%(I|C)C^cFQYG(pBwe>bNI99e@woXHHh!`Ex~PAj!*8O0BYm;_yvX-C{8jY-M_(*IKRSN<9DdGyHvXf+v(4E5h~>|V z`u92fCG_|I!{%Qse^uoB9Dd{d*8gqv#q#6z?{oOWA25FveX;zB>)QapV_kbN{JMqa zkN(rfFGh~nU%dW&4nOx{^G_aQ%TFx76n}&X|Db=L!>@V7{5kAjjP~fiJN$=9zR%%T zKWhFD^u_WgoBp@&bNFlNAO4rkzgT|tHdX+P@%tS9%y+E+d+3YN9^)T}Kf;86;QJhY z+q>rf#`jNRw1?jk{=+2S=kV*_qtE`u^2_4$FSbVxzt5-UzmzgCvHgqX&rI~bu797y zucm*@dghDekBNMr!(U2&i{9po<;VT|9DeaCYT)+rLaw|6=(a>)8SXk9Fxg+IcCf5wLYNq0H?njg&HD%Iv+jP}@mCWQYm$@e+@RrIIO7t3#rwqKva zU-Xmpzl^?Ee!g}8cmF2KR!?NPya*pPnKUE_wRD}Mcvl_&i!osV)^m-eGb2k{xtex`BiB)0PtAX9t^)^ z{XvNa@6i_{$M!QZk*?c*d=7sJ{gZhALo7c&|MWThaeb}-9s1k+i{;1j?{oMa^rzAn z%dd#W?{oOY8(9DE&=<>(&tH8GzncE`X*PawPrlFLFQ#9_{ij%dJbs_U&rP-QU(Wu; z^5gxd&*3knzlgqAemedL6aE?N+JoV@Z)pAhL0^m<+t1AKA0{w-pTjThXa4>JZ25`h zmn7_UzR%$|)1O9PEI&T~^*Q|F{?`9u`eOO<@x$lvXVUMrk&XXv4&%oB$Nl>pepZ_G ze-M4K`j35|!*8OW$>(px^5ggaK8K$_!1|xT{>Ad+?Z@Zv+vvB^7t1e<)}PPeXK!Tv z?=sMqpICmp{Cy689Q~_zu;YhVetp!x&*873Kb`%H<>%p#FyWuEu00t3@N^r0D}6C? ztpBp`A0{w-pTn=Azg4=;zgT|!`tv#b`i-ssiS)(tTcZ4lJvHW=d?Q{5L zgRK8&*uPkQy#Mw&{4V-CZEW)|mLDH~eV*ul6YGBt{W7xrc>D7?{Do}aZ;pv464rc=`Dp{#yFa(ih8*_n$t8KW@Jlzd@n6aQ#q#6hkI&(+r2i&;vHbY_ z$LH{iH@E(?GHm|E^79g}{&lZ^pTn=FpSy?6zgT`e|2~JGnQ8r>$Nt6g*+6N|6=*^_V07}!?&>hx7^g0zgT`eexE1i zpZ=-z=aJ>d>(A%#m$Ch?^u_Yy?ce9{Q-|32f8q5@vHW=b`y759{rxtx`4`KN*T2u< zXJuLc=hGL`yBp+t*rn3=!@mY@4tNxznOjoeX;y_`S~1v7ybL_i{;1t`y77J z);9i+>5JvZ+po{zSJA(kuYa-pc>DD^{Pb+=e_*C9f3f`d_3v}|^XMN%Uo5{Q+J1Zv ze+~Vc=!@l-N50SDPuRxB|2BQG{CN5K9DWV`Z4S5XUo1b~fBGE$ux+{g2HWxz%a50z z&*3-HKY_kje!Ttr9Dept_Rs4#V)^m-eGb2g{=Mv9EI%H<&*2vgv;KdlFP1+sT7N!= zzmWd1TiEgw%a31wK8L@O{>!6n{fXt*NB#R8{><%c{135zvHW=X`5b=c_MCtEV)^mw z-{vHW=aK8N2Y$NK+@zF2;I z{_1o1MfCHsZ2V&RBck=^bNE&CM|1s)<;U~ybNCrM+W434wFQ7kQOIv;Gu_V)^m-eV&+q`nS=q zC(DmtzdncG#`Yi47x(1*9De$68~+r3epM_#KK}VUF@E}6Ze`1_o-98;fAKl|VY^uW zv+0ZF$IH*>@N4P+#rOYW`SJLDp6Gv9>;EP7PnI8#f0)bRH;@n9+U8#@KR$l@9Dd4f z*8ihCev0MC9&!qnl-~Wo`$K&^TqW|5k z|3B3~S$_Qb&2TyV2J(<2?e#B~ANTKb_<4I+|M}Ur{>1X*<>zzwi|Eg!FP0xKKcB-N zzNhuSl)hMg{QCDf{4)Ag+t~QUJ^4O|Kac)D#@g}|%a50z&lBSxVdHOM|HH}h>DvHbY;<8%1wds+XL^u_Yy)%Uj9CZpR=F!-z$8% zYU24daoBE#h5zF5|J^=h@E5ZE`Siu=KlXhNKR4g{|A@X=emws^hd+`2J^cKwSbjYJ zK8L@S{=qxg{EOwst8HCUVc7@KZZWOMi=83%a6zJbNJQt`wTW;+>`Hf_)F>IYlqRl zSbjWypTl26|H`l!;EUyFN6X*m@H0l+@(W)tpYX-UW4>5^Jbs_UZ>9gjmgb9l@_i1!jsB%u znJ<tF4W z!=J_W{leGAV*FzH8Tcbi_-AaC!>>QY=Ks(fJN}B%epvV~E&PW`zR%$=q(7a$SbqHd zaXyFNaVWPx`eOO<_TzK-o%A=_(Z(;9AMbyB4nL#N`X5hUEI!T!a_vHs%Mzt7>XrN1w~|4A%A?%(I| z(+{`#@4J&Nf3f@~{1GPngYo+u{*oiiFQP9-dyIbp{s)Ti+l2Y4!?l@+w{df`96m~j(*85 zHhytWzR%&8(|?4%Sbk2l{(TO=W}GemmGs5(>m%Ri@NN&sf(U z41ZRM`6tmABggi$41a_P|G@V-{L&N6pGRMe_VCN1@%tS9k_qO&L0>GtJ@S1Hzy4J7 z2k&O{FP6U$e}oDDVEjIZUv!%J$I%y~ePaChBTV=QzR%$|o^JlV^u=foe+~W!6aInk zbNCC&%-=ZI#xF*D`0@KUpTnPgrujAW#qyg&4NPG4?{oOW&ocj@-K~GI{Iv;to$qt_ zIcJ+cXbh42=GLp71A`-*+$iWcjmt2PaH_`!0t+>tgfYrZ1LXZTjE7&*5iW zVtyBWvHW=d?{oM$^oQ@w^+)c>S9|2}^V$A<`r@8^pTjSv|2%!M{51R#Cj2wjwFkqW zaH-AzL;KkH#mKS#7lr>Yf#LfcerBclXXcqNmLH$L`W*f+`h)g0Uo5{R(fhjoeGY#W z{b%Wm<;VT|9DXyA@_c{Dh`g_n9%O4)?|9uXB*3CBmMfAn; zi=+O14!@oLIrPOn`96m~{1)qfE`725Rrn)J_-CwZ4~CyvYyM*TV&r)JEDQf(0>k$? z{8jY-OJ6L1G5!b>{(ragK=zl_V{PQ{d)H&wwMqeyHzW(8J_+#iF zM_(*|co+jFFvjn5_!ac0(ih9m!5?A5Kk$7HzizIL|8DwXw8#ACM%$my;kVpr{;TxG z^5gx7&*7KeW&Stx#Xb2xhrfz`dV#G!vHXQ$9x#E&y7plBb@Q$N5%k5#G5;muKTKfw zK8L@C{)P0#^5gaIbNIRS*8e>EV)^mw*XQu7=)Xo^EWa=@`gP;?Is6v-muws6*RlNc z$X9#h@Z0GB!2ZSZmqxzN;V-z`=6~A*ZT*SmmqotM;iukX{xS5$^6Mkt=kOcoPp2=I zzc})J4!`_f>;G~3V)^Bf?{oOA^gpLBmR}S3K8Ihr!1^C_kS#y4{P^|fbNHR~527#b z$@h6;{_nH?C($n_%by&L-{+@)!5y`y75Q{Ymu2J^4O|Kau`h^u_Y4qUG;%_yrHx{Er-C;}^@X zjC`NNPk+$-r|64&@_i1!iT=(9TmNGD6Qllp4nO-L>;Go@V)=a{-{RC+TL0pne4oS5qyHj( zaZkR_;pfxubC~rn?#cH#`~v!8>5F^veGY#N{V(Z@d-8n_zmWcEhuiqYJ^4O|UqpWv zeQ{5|&*2x-A9RHEFYd|rIs9?-%jt`I@_i1!g#Hus#Xb4TyC&K1x7W3W8^>W95WdHF z`*5wTo}5GOBA1Z6$yMaSkIa9LTulCmTu<&7zULVAyUF{KQ$9BT1adL?Msf-HNpb`E zdvYWBcXG;dtG7k?USsrEOg@%eLjEp%Uto4(&h3A)hbHqq5kEF2Ij>{AD%N{`=j8m& z;mJI7_hkMs;-^_}G3#v@zR$vsZ(+pO<|gOogwNmm_HT#JqkFzNJYVg3%)!ZgN_hU) z=Vf~&^QZ%pdAo3O?%NNJ#`9u9a(;GrKH9fGBYa-R^T25NwnY6+AD!I(op569{rY2* zIlm~Gzl!?*Z#2KBhUW);z1PC?w4UFH>WwT;&ihC0uMW@SdH?@F!Dn3Dg1rIsr-Gz8RY5Yhsd+Y?~rdN4;pX3m)Jl) znEW{TR`L?^Gvv3(Ysnqt{Nt=%7x`>*H~C?5>Lzx@>@)Hp^6=x$A4WcooJ+o%yf^u6 z@)+`VCFUPPK8<`L`Bw7jAc%s#Ngj`H+ zCSO5*iF_mZ4f4z6R`M_8Hu5efS^dw+XOlb0*O9*^KSN$a?jo<3Ve8|t305zIJeNF- z{3Uq=d9RbL{UPL=$R*@<^10;nQ>^_Zyub83JKCSUz~B39=kI-fM6Ny6e&6#CatC>bUiN#T*`<~r zM=m8_POc^Q!S96*4DVO@`=MR@{m`}i{m_TQ>uCG14_$V#)%$|HirgnFdHk&r{~jHG zz8RO?eol0}{9wD}y!Xgto*jNq%rCF8Imx_n_`MUKFAKjP<+<;dx=t zXYZ8EPe=8izb!1EaLlO~l9__3liWgnBU=B1ZnyT`%=aM|XPN&~v^`8Rm(bCJ(wZU~GOL$P{vaCvF3h`_A5AV?X!R~8myqu#my#ce_Q!89uVelzxr>~0ri~}% zVXHqo+Fu{fJeT=&avu2&asj#jSyr!*d+{r=D$oIeB+-1^Ik(!6P=_ zf07HykCKbYpOQ<+1In#_DS6|)llONw@0iSc?U~Ha-MM+n_F*5~_0O;)3e!*IiffFw zy^A^dC~`%$<-LMahX3KT^M}d5FMUbG*9ZQ;es6jL-|sI7b#T8xjMCu{^Zz}s=W|>y zsGz?deX;!bdauvnSJD5J*Biw0*YpX6!vr4d+JoUwZVU(6Fy$55^%601j6Xa4hY1Yd z=kROk{~U76zZmV|$K&@o`~~#ahQHy9d-8n_zlnZ$yO!|9@;Uo|kKgC;o9QnIf1`hK zPrmZ7d8TBC|1@oQs-5pO@qFzx@-yUX$&1N3FNF5tS%&s6?0obR@=Ee1VF1}G9{$}j zY#^TR;rUcI&!@g4r=Di#OKJFh_5tDj82LdR@3*qoYi?BkHRct}_mBE}kjL}IMdoiX z&yM%0M;af>*K;{v&$Z+l@(OYTIdq@&`a7j9`Stg&h+ho+f4%+|asB1JV(U+g`q=)m z@JE>N&)D!kKF9iRd(5`~iY4ZY(H?%dtdW@H`y77ue!TpB4!@NC zmF!wZqy!d8!?6Ughy*33(~G zZ`dDr|BA4G@w^L<4>>$O4CVXrx^wLKaU%Ec#oWLDlUzq0!S{0o$J!Qp9Jz)(H0poH z4|*r}e~z91*)dxZl9# zc?@$M|1XR31j8^=>zBQE9fvj`miQ-7C&-FR@m zfn4VkZ$~-Khmh-h2giT(m(Tuid`5p&?C%tCXg_by&`FqXBQN;O_&aj$TgLnJw)RWj zFrGsmv)uSga@i+r-^bdw{>S(xa(#<&E4k)1<4wXp7*FF1#zo{|Ul}hXH?K8bO>QFZ z)0h5%;g2w#2*&x+3%0zk0EhW+IA`-jKA(BT3d>&thyHVquq5`n)_o-w)R3_osl}_!cv7;P^J! z%-ZYo`uKhX`1<~XOUY^Ph8KRA@cjkI_5B1tfnEK*!(v5V$NKob0u)aU1^ z{|9zHK3|VqpP$ENO|U-CKMU;Iw=iGH{_y#JwAbhN_b0FA^26spk?ZrHxW13=BaiP7 zaeZmvuyDNN^&@;g)Hj=QG##x19O1lCWWi3D@&cvtkSDZ#Qu88olx4#=~4zkWP8 z>EpTRtpd2_`0y=Bzb?)@!|dy##hYsTgSYN`Rftm z_s~#Jzjub`b1*VPXMtS5SApkikasXɞP8z1h+VSFhZ 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

    $MGq0{N5KydHNbQ{r`9w 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


    pgT zuv#qm+w=Vj@6e)>ZGW>tpigMchStOWu$q_e;{~Hdskzw{3hvB$sf!au0>i~m@RWW8S>@izU@Wi&&_@e|aX@2G~wgWW?lb$T>M?ObdL z6eU4DNxOwroxkp02b1+=I^XX5=ll1|@tkS}PoD-6lKZV4vC#3^Bn4Q<0yijkJwOkk z!6v|Bd=1`g?~!4>3coMsNa|1Fv0W5%eFN8#eTSKIw2xFh*l~My+ZnamJ$Kmg?B4bD;OT-EKmxNJ z4q!B2qE93s^tyj%F- z8b1rIZ7^PHV}HLEgCyzbvP{KKKF_yQsVh9+%xBL5>;O7KVmG6^V1l}+v;i!~9=I3X zp>u9^hut>*=VCNEcMUGXx2dHgSLTl{e$nW>V{?#p_X|@lv`q+RtcP>tB{@SM%}CBdbh<}1Kf%c`=Ji9>A9Bl ze9fn)rWQ@1HIxW1^AS4fZd{eyO@-E_A=U=kXoc1%L*$w%Z-ZA_&GKzn&8J*%!!~og zHME{HmnOHtmU`w3>^9ax(42u(%yu0Eai^&D}|!R*@(7go3qj%(&z0&!Q=w38v$+|6CRg>ebg4j#N$8(d6} z?)+Rr#iH5gd&nj8FrnZP<#W9AbKxum-;O7`*rsuJT`LVzTf$U}( z+@rIKlqYs?Iy6Rg=$j=5|X;(=mKD zUEpLz@G9&y#%0TyRpp^ErnbbyWTh%P^Cja=*m=k5#<6*K2y}a!Ea=#58X5H`#S_os zgr}C<5spE)g%hnNc#CJw=1M#N%FsTA3pG~N@)V3lzpfZYCbpGkXu3rlD}}FVS+dmt zK&iakNoM)Jn@~s)8Kvdx%=_FDvxt z5b>#E%T_`gn`o|s-*MpkpU=n!`hjPc)!Q*=mNC+fsu{RG_}^jvgh%W@t7Wr{c6D>E zL5_2m*R@rwEUR9Wn&urus@Myr4tv+h#(u;ZV2a*$eguy%tJSaJZybS@R@Ycj^@Q}s z6$dw6=*6iLZqwalwO&SbS;T3k>7XB#xdAjEAKtW0%Yn0g{S zH@+i)kDQ`+!Fn;71{BDBx-;Ert73up%SCXSqen%|SN|lKyDDaJ(>n!fyQiYAE@|e+ zkBTvV*{hD-^!RZsI1tV!(_hD1<)$cQtl>=+qwT`blNcef26jgrr{!NPOijc%HW$Zd zbC?`k=%SlVTtQXhrKyBw;RI_dyaFAKbvkSkt&PXq)ZTh9-}qAI6`nunVgNg zni!knJw(4(SxZwTaKLgBEuf&Q#y?Y;aV+)F;C{JEVrsf%87QskY_FrdTTV*7wU&hgI{HzcT#q)pkU zzvk3L3#L487MKp`zmdo6m;8A4`pKgzl0+WAdwp2?#8v26`t0PRG9@w2EkB;kaZoFo zAB)`wnn96MDQ-eUw|>n4Wtm&Z`rlH9W^p|dh~J<^FLA-(_xfpm{~DiHmBgVhlS7&l z@*lSp$VSjt%jqWA29&BYf>ZL#WQmLF?Caz;cyI`3D(i0Hw({{3?Xp|D1DUICPlH2<3!cN12B+ zBs8K6>0+_hQZjx#2`O#lR%R2ke~%ME>B^;fG5$0jj6d}d0r(>Fv}Bf6i6!MgJObk3 z-Ft-sOP}!HNDlquZ_7&v2WPwfX7WaG7-3!*pwy5vuLSTLCi%??g4LW-k^T27QZxPu zAV0gHiO~b$v)sGM+okmllSEEydDg1{BWM*CAaq+kIK}(<^_P3%8f{;Ag0OKYM2Cb~ zY-ZQruAX16tkA;$L#|qdJxuzoq<*pd@!R}qiyYo9G{=w41o^oe;^+^i-%3bZh}2*$ zEHf_LmPW|r@muL({c{qT9}D$3aeDHhf(ty?$pf9QOK_ z^_SflAnOukL{NdjL1hug?jqw7`f!SPVV?9$Yaz2cdC?9!Yfuy-47O@FoxBX%;D6iPY9eplv?TAxXLcnW?Rzh?^s?DZ|G$p|OMcsW_4dS6tY5%mF( z+s=xjTq1`#gWmRJmLPT}>pOzl?gIRy3U9KQ1XTuSN|j?0jcC~}(FipYoSg*6mP?Emi*lK@ z9Z=s>5R=734oG2DCbXxSe&yAa^uu1|`c&>AH;VC1yyV^m&yaFdvVguYR1|N6+c+t; zf_{H*4D@u}9B6iSHNxxdug0j}Hb-@^ZH(%$G0@HJm@k_+JM=XQYA6Me*qF-I)v3dQ zlHs99;XRc3>M@0RG1*QY5?|G0v?PIM2c^ELs--6MjQ~|ORZWymWB!BJ;B~s*qc~7E zE|)bSQq{^K_^tm+g)YQ{)Wch_ZNi8JSY=94=v@MP*bH`6In~2ZRV^J3`2Ju&ePZq! zdGJIraBu>lnDJ&XhEdwb|Fc`WB~_@J4c~+54tIj_G>}(9Irsp$)F^3Z-CPCFFV8-R z+R}e5H~#(IeLuby2Qw%7q(9)JlAk7XgbHCN2NYtc(`fl|qpU)`poQ11cQf`^p^y4e z194HF^ftj7C9H6pYOxYBFecwG-$gYnGWmU~gw;a%rspLu95o(Cd>M~b&Zn;ju*CiM zfBd_-|K|>FS^PiL^umAmR7+?dNlmo=03Gs$kM2#|A2%~~lh?}|W)aJo#3q*%r+Tq+ z--4c%e6~$7^O1v(F3a-m9o6aLHw;Q1dT8@35L~7qo_rkc+397&8i}9fZ(7H^_(l{r zD?vvLzX^h-SSRR@SZDJ%8{x#}PewPm6xw#oHSvIwW-olMxwMOK#?xDxt@u}jDq5x3 zj}qKLC&qq^^MKXq%J_|YAZVYa!7&}|$9JM6Qf&Ohc0n!Y61w`#vGreT74@0zmigMV z^j}B1D}HL6*`4^;M&|$;bmxuH&%vvLhdsc=I4yM*DJV2CB`UIhbrjPKW$PTg4&t## z^bowBKLykMbP)_}=XLTcplJX5N%*Trc@Eq&iw*?i$FRi=aDRR2ZSk`owJC^~okro_ z@niolypc}f3h7@Ts>(^h`d{GZtqiA6-<2o9|1Bl5=I_Vg%l%KA@dnK%!f2uILVvRu zdP_V2cGsIZGR3xgRVv=YejftCOa!L0-qAqd^UwZtNpB8RPs^9c30hXAj;o`Zsh243f2vRG zO`-Y5MY3Ur-T!oqwZakWa{tXe37Vh00JjO#T-pa4sqW)i{Lq31`(a;7b{*=MeY4>u zaYYcIxI@MOH{vm&WGy#J?F#pg+AwF`xvoS?&Ud19B1-2 zLF?klavGq5^h}B!B49l4;-cO2&h5cD8tn|+Ue9&CR=3+dAGN&EMT@!;kgkrKAZW_N z3K@%P!Up2r904Ux@&<_z2l)S%6DeIv6?CbPKaXF+VxObRYp>e*SRL&uThEGrtzJ1~z9L4dbK5B;o7 z7i)(gIa)vTq}@|L2AqnvEgA!USxRiAx3|)60BzlsIDiMqjiJ?9^B#nkE|_Ul zIJ^G|Q3#){o8QmMn(GU6AF*nf^-G%y|Demrme zW+mTAc%(QzSZbq}Pu7EnBL3SO5A6fC+de9H7jwbxA-;@DFM?$_O{}>{VUcns-E@so zXwt1Ob$T$OrL~52^n%)XB8-Hg=*Z3WvR5&Ak@uAaojkz(+rL8i%x5^V+A^vY_S|+g zU9p}HChTYfo08jZv_Oo|eCp6HI#%2K)1kJx-~LZ1imD_L zHHc7-qJd9Fjnn0^zZb#dPBct{{~2jG+c}JU-iyO-&*;~S0L_r*>-#^BC4U?<{x*r8rcsKV>7;VwDFDvpQ1K5PdF@}C6`Mb3AI?7uk)B6ePL z+NB>6E!4sE1o0;-3sx6v#PW7dx}<)<{6S*JJaJ7xC%Xh0ImiT; z+UO>7{6_fHhe6&*EI_}O<(4(4+MvhQEMUT)V1w~MTs46hffN5J`=Z5`;cj53Kvo%Wp>MkFu0nNjB0;yg3(%N1TC)8-+-!ATv4Ej4PjQ zwk<9V#Pd=#$jj9y>xTGa-CGa+OWf7VAeRl72)XIal}QqKAo0UjzzO(nJy<&^nQ|nc zy*Nu|*LWcSi_PpW>4GrlY6Ylf9tiF*l8v9t7ff!wPwAbfyNIT{$>ocYYpo}n5YNkp z8#3ELltf3}y^IKDaTRiEq#zRVT}HB8+G7${2_+ESp-B(eQCJ{RbD1DV6HVjyzm`&3 zE+Z2mIMIDHrNE3hr)XEay{M|S{|PPJVpr<$Te4?U#Ctet}5vJ_DBICLx&J*RC1xD%kTfd)p+tR;t9MgytJyLO&2kLdY{cyjWUZLal1abbv zr0EqA#)sln@C(BGp+}RT@Jc{+{vNCWzon@t<(_e}`jgPxs3_h68vtEY@&D1B`7_hl zvUjgp*^2%n=42BRo|I6*QE1)FwEg<_#J5m`o)S^7_`yVNIcPnN@xX9V|7Q#tgnt1Y@^2&c$RN^%=mM}-NA!6s|@)F3f*Q64g^q$BF`al6G9vYZK#B z)=Sp^fJIrPoPaxtq;3PFNGj&TL(yA%f^;6%h4b@jAGIrEyV<4v{{~>r(*7Se0Gm~p zZnL(%+pIcvo7Kl|v%9uw3$59u^_pE;wKP)g3fXIRX?Yo@#_mO{}mfNg-*lO69)N0t7)M{A% zTis^wUaelU`oGm{R{yuHX8F@@*#2)fZ2z~Nrq{R8C)akf+Oy%qz1{5D+qBoG*^{?n zr&7CFyQ5Vvraf-W^4{(=t1|6|P1?HrktSts&+0nejgZxK)iXk7*LC!m zVXNz?FvC`tgqvYIsgT$wm6F=7cSf9aPAVm}nT}?2JE@c;o7zOhw##M|7|pG=OSBob zlb!(XNp(qW(G^CVtnKm24BJW9t+r4Mv$>sgch~l)U^KVdo&e0Som5I{dmb>GTU}R9 zGi)c7$&()4C!N_z4X*!hmK$_GF%tjUJdbABPAVn;-z=|7N@|ObFp`oJo8>3H;@6fo zXT-@9o8>1xaB53}GveflF99dD6KcztGvnk*rKGlWJ)^nRmR@Iu?W9t2;!D6urKGm_ zA)|Gx?LE^B+exLQeNsozNvBp}rdE zHA2_6>I!!@LwDLJy>@M-Fb!vS(i5RwTYj6_>`rQ`v`@>*lR6eVC-oS0PU#aYT4R38b*lbpti`DC7zNDt#|4p>K&w*$4u2<8^V*V$Xp=BI{*5=USUFumw^&bk2 zmS})R9W2oLaL}gi7OQ37nOuON+#dItZQDx1$>Wn|UhWe*PwX}UZzxI47=J$>#i;Hk zn67>YoBeqA{2YYTtg;5E)=RKh_m|U`)ut>ot#G((IlqU&hWg!(FVGHezrHM*I`1GD z_AhQb{wxx#e0CkiwEQXcpP!p!>G?ZB;r>61;*~j|vU~n>upPcW1~c>~5!-^n*pE25 z*~4V93)<+|`#ISE_pAPD>v{XnPFhpxS! z+PU+~Q?=Fk0P6ZE2EgbM({xXC=j(0Tpf8g1hkwuZ%NNnKy6Ubv+r51q7x}&t$U`HM z@v``Hz5M%7%4YrWbNbCeI4qE%v{-;@#1{g)ljrm*IbU>={J1O|U9Q9$`}z07`=1Yg zKkOF|`}yOg!L;^+r!&zM`stx++vWl9C^KJB)9DxAsX`Fy)V6XZ+?ywtrc1EA1?C8*wFB!7*^*-Ipxdj+bS;) zj&%C|?dCtiS{Jpowi1HM9=`5o+lTSvY_<9}oBz1j*4z9FY-id+F* zuiKu;-8MX!y*s-ueVewUi77k7_ue=i=yPPIS3Uggi? zPk+3L|NdP3GyU>e{9|<^Ya|mEA{w(kl+EEkyl=N?*mqNiHrYgTeVYy-IE_-i^c^P?moD_;CLp z*-gd)E`;C63Xn*l+Orp>aa4nRYfbUz^!oEZtDFB!CW-9%KU7D4_K;AqX6K)C;lCAo6~p~<|6SPkkLA9` z6)u)6?PF*f1@5?TBF@AK)?{^mb#lbip$e*E+7!MgV*!v<5cBMgflhhn&Y z+vdUvYd;=t24743)Ayxkc6;&1K}0pm#?W{B-){bM{%Q8M5}oKjK74I9@^rs>E6%U$ zb5Xc+Vw9bZY|(g0RY%a_<8JdTkd0g4>1KSp-X5y$Z~D|qqI6ct=#yb1wssGc`v8km ze4JfgPi{sR?}mfnOojRcODA_`RopGxAE{{_-B zH^VL$fUvUBBL8*}y?cxKZdrX?|N2#s>N`SLB%4Ff@z?D1dNP?_>-S5zX1d}tAM=-d zbyxOBpZ<~N`DXbx{r2Ky;! z;`^-lUT=+6ycd34TnH+E-z*NR{4yQOF4w1B{xWkE!y?ZY(^Tvx zBI11#@ly!+1*!-okHJ%sSCcrhKek8qzpY31sC9@cH>vz0kzu*5%wllUA_VRW?MytK zApVQ!@;sv1Wo18^g)w=b%>3k<4&>78jd#NMfy_Xp+c{jM7vdK2QUsKjPlwH+nCy1q zb4Z-6v!}fL4l0A_#UOe3HoqENzWsdv{PX!?zq*-jlI+jh`{jDEd7aMlb$%(n{=|LG zbNMw?BuWg?$?op<;^S)rrCApZ`*XVxj4VDb z3lWRYMa<_({Hyjv24Ww6cRie(UtV8dh*;_WCFhsp>+#Li)%ndR9h|*OlkvxoB0N%G zubx6)@7+x+taPu z&fXNMozlKqwI%A+)d^Q(N5Q%LO;GtfC*2WRIt&*Pr`w)dV!$2C=?Q4#f_J~fDAgOL zQ=X@t0`Tk76Rr=;wK%;U95<+6VhG?0@AUkmpY5j=~7&g-H3ch1P8tr{NT6JN;C^jDE;B{?Dd$%*?g>C4j;wW=v$Et z9?JM&mAdtH^zJbKA#yxN->UzAn0`BZ6sEV>|D1j(vpS}Pgt~Ucn+bS0MulBTDec{# zoa78Fxv$CSVcvdZ*Xxh^sVxHU&1bg!+1TcfwStI?S=`Br52|i!iHxkXI*<(b3rIL_ z6Q@JovY!s*Q?84{o=6KV6}oS;sFq&t|Lr~&7g3Yza3XY_P%VyqRGvky%L zvFeklPGd~c(~b7i^{eC{N7ZU81IxFHF63sie#{{m8aCwEQ5^!H-=`Qx95$<_Y1|GO@8aEt!uVU^P>How7GJe~SdOh2Aqo((^5OL(Ia zo=6-L@1Wj^cU{wOlXnl3cOvF=c$i)dMfPj)Rm>Kf$NMrQ^j^GDOy=w6nc^-vdnoqR zyD$Od_IbOi2`dxT8e-n2I}tMZM|?s5Q~v4kPZ6^$ZESSWQqnxu@}@>S80!cUQu?iu zQZjs4uEkU0>NU2YZS*SMJS^82HM7_2MMdcP?d*2F5J{M;KmI8LI#8syCCNgff`>9G zS`pxf00BxA??hneIp2x=g3b2xVJ-5&>qG!S-}GCVj9mqrN&!}(rz!`qA&Om&tr&|@ zO;Wbnyk^hK#qhhx&r|3sX?d7rA_JjO_5L>zKVm0H$f>ck#oKft-e=FJZz584c$^E_ zY{j46*B13{`suA0-mdrKuk~Nb#0z2P*J)Bk^`_-3nDsnwqkC#lZ+u(6*A-bFVilFq zr`=n-uu7{CLB6X|mDpGXzz2RBGf_Ypm|2nK8+DR-M09O4OO3Nj zpgi6<{)A0Tx`dnNbu&)Dh58yxPbw~OhJ35ZZ+$sOL)N?rZuOaV*$j2eu6<7;3v^1{ zP`*s6MUsk>uuu&{xun0pn=6(jUtvQkbzcPlhBhMsz(b{bv27kd7H{&yqVlkx94+mA z{qPz-=kBMVzW)4KyCbcrQKSij{Rm8oAQ4*T+f&gp-&$#zos5>*|2#ZA6tBz2y*Q+w z=i9gQ^g$`-mLRg)pNzh}pikOb5nA&7sbrP!ZL}08qoq)2iMDQjSHzE_;XF^_I)!iU zUgxJKs6?nPkPEOrdNiswdjg@U2z&m=t7^C>AV@{nC&gjv&zarV-x~OU{0HQxu~BHUQ-2(wo;k^b(hDF>-Yr)vkw7Gt?bB}d+)#Tb zcKQ=JL&}N;2aJ}wletGKb#U_sk78dBPqJS(m`Is;@(bABxE`FPBOEXed&|hZsj4d> z8(Yd|l&_P-l@ex9%r9>pO_tLeP_0AtRgRLWKK3UsqPpko+j1qIOx4vg+Ku5=wW{O1 zHlTAX4pJ2&=_J};1l$tsW56sdoOOE%=})Rh{;K1I zOM!cfac7uWb(U(s$VWM-Q(V0CN3R8Zjy?&sU55H zFqm01D#drFnY{lVDeCm>WOz{psG|(Z4hhT3evMm22c-s;xUcR?FFg+1s;TWq&uO+S zm7w2$Jwd?fPcJ4bal5;&id{F~V4@67`SyOdSuXD2aNT#B`pJ=HS7mvgjVQL$!2CEn zh+6Fi$jP}<(4(rV29RG=HEyfwyx^B(yrHc4XT>GTMABWP9)mM|sUeb@Q0hZD>22dA_)QDFQQI|Z%wA}?+yAKUOL>D|m#gdjU zg2WfjR@9OZc@27t9?DsV)i;s`p&EPoBx;gw7Km^v#9aljdYC8^-&1a;ApV?hSF?Fl zmD#vRWMXl?&+hYY-#42dmot&ju@ZJ6EUxb50M(pk&CtsDuGcTi-DX|d1RR)*<$=?U zxHIkB%t#)CDKs6Zx9&}`M*1cXZ0&eY8w@HzpFISFO+{6 z30$!_UzVZ(v-p3J$q`I!f@WO=gH6XOuPZt!U)!l6YQqzRT*HfpPVDm9gl6_1&eJxnclCeJgWB_?dyS%VG8a$CH6YmY`2 zQ$Wz%ZVE0g5(Ipsd2SS~OHsk)6%w8Z7Hqj`)<~x%olo#-dy~_G<`w$!dWCJ*NXwo7 zc~fq2vsLA^{Of+&6$TELb?19EA`jpEv!wRQWyhO&YfA^W!p#yXtn0jTv&Fw2mrvoO z>(b?drJS9?ucX>OnB|fPH2Jpt(&00|i)Mw$`|UBAFkI$IDtnXR@Eopq!_{eUp{g&} za5nVU#=+D>H>dW_8)u4va^OX&cTeHery>J=x%jet&g(LRYz|X8EPKLTe%~zTc@xXH z%JO($wV-PZ)wWYhhV7;+n8!A ziFIC{cZx07f?=S%%>ib!mNK-qoR=A1q7Z%?Zx1K5G{Std6HzMett=gX5_N=2f}72v zF5$~2kaYBM`7AnNF8(-(ma8Hir`$66pkLgs3$ekk%6P5_fvma3V^0hXHu&SMPOF0Q zBZl!HAT(PFW`>f-8;mR&UY90ScX?zwGnMN(9+;T|Gkh~pOLqiIG3_4b2s*{}4D$-@ zUg1ri%L0ddOMlROr!aqGW#`kL=2{jH7G&wf*nJ#HJb|_dTj(wJtoMRt+^z86_ z9R~>76dwCr=d2z(C`+P`9l$a7$37NM2XdIFWC+>EACrdcW7Rw&hw(7A$YDzRjedN~ zXP=}=K(bF%bCMj!w_nO_){w&#khx@^p-pCTn5v{1RnZf7N_8nu4rrBv%u*JVeX3Jp zlpRc>#C_{rDf_I{kUr%wTbog3pNl40IZW&4T{%p`T1CreyIZ!c9TBI?>V?hQ_qJnW z_;#=($s&FWIbe_W$!Eu%a(%`+pkn(JcfiFPRInoq4T?Bm2#(`8;ON8_aA)IyCOmLv zM-n#_=z!n7BtVoi;i63f;tK29S&k8{wqs4%gYXVGd9M{55OUv>IH2Ua^syu3y0~({ z)P73%hl1@$qTV9f(Fb0M+7YDf*CNl2t{q{-%W6Av#yfaBvSS`=Oal#1eQ@9;Fk8a` z14oXD0~&_x7zZrjSv__nY$-{0RPoZR?6?!A%rOT{N&uvCn?0^r?ReM{_w1;cG7s&D zQr-kg2ZU^?pboe=Q(7I+@#W?^AY;xm_QmL*IPHKjQ(vToWW?C9nO+9^rnNg@O;sM{ z_lV8)ZH#Zz;CBah&cp>_{kC3qQ0t&ZS%^8x7R~Vl#Lii)_bhhId{1;7aB)2|vZIRe zXv&V2;qjLp3HJjwJI3SJi~lnyI~MMzgbo-P-$goL<9gj`N0qhDVcRfam8TQ-R+WHN z-kzHsyG|5}aqe_xBV!GC;Of9?pZPP1rG+yyJM=ML^vTJ4<}kO6<6}3a;2Og;a^LLuadPV@IVXoT^VTclqN=w4&PI z9rp9hb1t$tu5K=`ug-?a=v{htb1@pE=kLbJ^}Dl?sDbtFX7cXi$Ev*M^p7;pH%rk{ ztL#@L+MV316+h)X-V^27QYFDbR+D;b%zFKWbQx2EUFbS#g03$?+{IL@GOiy)8@b)= z^~0?AUOj{!7P;u@mo7#7GS$|ZGT~`Rku)j)#HA0D$<&?Qp~!XrvYV}oSyeQ{C;UJ{ z7&W1ZMoGNnCK4TdiB2@Md`V9;_%d0BdLJLlYBC(o;Cq~imb)pSPlA@txNSGoa zjGR10qa|u06^WGNi;6Z{68ct_wy>fkSP><_{o0p|DIMC9yASTxx)CS;Kivn6NI zurefSkr2jB+9Ht>n!rUu#+}SXLLM`*i$n-#k{1c_@yaA1;fsc`dm80^wM@eong~Y2 z#*!39L&=dKM#IREEJi}empDd38!?HDLav2FHU!oZaEmzVR2`P61T7`Tt zZew8A18o3Iee+qqn>-YL$*=h{f12WfW*g3POt6q{yUQ8L#^jB{kMkr1+Hw2`nMKh*-V z+ejF@l%+P{7@8zS!_JxYM#3B=EzOStIa%zq(r+6k$P|R6tI_z6mAXcvB6b=ZiI{jP zZ6q?Hr?-))VNZ3VVP{W!BcW$Yfg@oxxz^t4a3l&sQsYR77}MlPc-d0sNLYi?=SZ0N zQt3!&)wDW}WHN_Zk~F89pG2p8w_hwqmvWdiIU?Cs-gQ)Im{kpOFhr`b34S>yf8gab;c#v3Ofb;7P$rmXsfr0k zA4_0@AMkpYaF9~m68w0qWC?yy%T~f4VU0@ods|}USdbEo&{UrUqtsH9@W(dCpsm&j zfA4Ne+cvPOVe8x9s^j$KApt`5UO;Yts{+&&egxp0syu=@SV>1P#8kf#4%HTG1Ow5^ zjBrf93?mr9=GOqYA)Xlk#pPN8uza2}036`!14uExTL22K4>ABYLi<~FJ%cN%(D!11 z{MZo#fG%2`1mKAr90J(lwZ8?Xfb^#gi26Y;+V{S4P%$v9sYB7mtQnpZ0~BR8%HM~) z*efVJo>f4&i~(;5x{cKegR1S%WQxk_;Mb=i;`~uaYSi#XBiF$z62&nIA>NCgw0m-3t095vD4!fUvABA@4pV5ZE0x!cJ*USzCXr5`8?4XIo~!NXR0gMySj z`OhEui82F!ErIT(%-mMHsy_}9x+FHzWO&kq!*J5#QXS|#;6V_OnWJa94FFGAIv^ZH~Mjp9y#Z1U} zGsKLT+G3NTSA8ZVC&&gfp=ZefGa-nQ`DH>FJ>ScOoIT6SgzR|F5Ys@pGP;bMu;g(W zG4N$?8PTxiY#Fg|Wons_Fz08PP{q#5GU4XU#WG@IYz}F{!<=_zLdBYGWkM7s$7)c; zysiiR2nlyym60|6Y$_uygFWXo8CvyhC^joRhVg!v>HMwGr3EFtuvq*)!FnD|P+3f_K8 zEVyUNQ{0s)&m!qin&_aq($(mlmo7U4uG25ia)nxVIC^#aLNr-|3iFt=i1&7mu&IyE1M)Mvq5t(J@nv6wVktZgOkn8Hdk+C6euRca)hI*zjfJkUcX)< zDxAuU>h%oVUp)kZ`RIYr3`Yyc!DLYHKD)U7S$$-!+FO##L$TjHm#g{ToBeX0w++7S zCPanhW>QqBt|mr+tC~t{a^(`lTvvCAs&Fe4tk<<_f&@z4O_BhVWTNhH9ZdFj^ne}f zP4>&?N4_RlEDe;S!P0;_+p9BJ)vRph>IqhFtI9=wHx@tD%yw731^~$na2O6IfyQ}~^UN1VW!v1(S)nS-i)d%LPs<5cgI9IDi zFw0$)U?NGK>RfM?4kZ>bIMGdVRJU%rv%(PoG?iNc=#`F4C8!;lO;dayfUoM)L7V<3TLk-Lu;_A-AmiO^3d7`TN?nnP)=Y7c(fb`oMO9vwI$gWx^m!&I zxkoci&v3efs&T&~BL{NO8IFoZ=Q`^d&Q|qg`+6|X)~{nYkDz2Ym8N4b+d;+XYIeWO zvY#Sp_ky5$!n>S{yw=THoGjJjU58`EofzExRd;45a@;C*yacZL*`e*uXd&i~*3UYn#b91JWCf0R+Kp3{Yr>qX*<|I*DvLpF|~&&B86V zsMfK8GaZe_h~3#@bWm_}(HwtTepD#>(@94K!BBJ{XjYXjv-&LEgeyXF9l-s2qh_jVw!KeyucNLwPID*mJi539CP_!^;mZAgWYbu$tL4D4* ztJyqnZ=u{nnFKIyCPV<}YEEt-ansWHI6fe?N0%Egcaw92M>0PrkPfDZ`b26^Qs=xB zrH-CF%gxaASY7Q3g@BupCi3Y3p|Tn*{Ro}wZY1b*l1*R`983TWb(kIve`Efa0&-0b2up?p{pYvJKWjVT;gq;dk(=bB9O+CZ6}40n?;GDR{S z6C?){!hN5tF@ozCkxOyCep&7|>+(Qzaegdw9nHrA#o2iDa8!lc{2y01dc)B}AefCF z2+e4;aC}WB8OtU!-H0agPB(1&X>NvM!0T!wI0%w?xPZ`F20q!{DDe3tdq6>Wo5Dyo z1;?va>Afa?NU0&+$r{JdFD(%IFgB%2?0J8{~Hbl&ytVmh5Z!N<(0w*H|2mfwuU zWzc>z->hnQXS3~gGM{e_>wT55fI>9Z{qu%Op>zEAVYc2c_ixiB!m(&b(W}oTLS}vG zC5vStzJTBUJ$ueEPLDM)bqYwALg+yv&x#+1J_tMJWVkFQhyCVrzRq7om73|d9vRMZ zNEn z-G15B2NHrGEy`c7@-C#uewn2Uh;({A=G^1U`9 z(zX_{wd&)ojcRi`RmcMP1ypFwKOQY?#vhTyFw=J=jAHn%AW3GQ4jQwsyAy_3`Hkk& zp>O3UK&mrpKGa+`%t%p?$!h2zSf~yH$sn`wRsNE%HrssHyuDjA78<@0bEzyUjX_Fu zri`FgcbFtar^(f_sBX_E&*dHZiME~-VAbwDe7LzRnNbO0A3r)m2zIIkK{LxyYnI~w z%Y=vWjw!@83HMB=LajAWW&+r(l$)-gJvKE_L$OyQ9Fox{-Ol0}b)_V8M8l;s%V6%f z>@b{=Aj4D96D$o(q?wi}I(xRQvY;0IyLwTrMdS*9FB@86*<|)yyd-P);k)t)Fnf44 z7(6Mu8WEdz)r8|@TQ>}(gsmJv0A=mKskGJ8?eUcrd+yF`df=fZOci|^DB3_~(-bni zE|Xzb)k98Cbx;n=nCP@Cp8+YG$#KvUW^j-Kin;aXl8o(Gwyj$IlNXT%H2bz(iDc~X zaGUO?z8`M;C1mJ~GbS-yMjMsJAY*o>j9}#MFp0(=FOa9bQk1Pu&34E}ZC9FVEizv3 zuvuL^3d3y9jV_ACIYK1a+c0Sr+BH)K0bvehneoMG%)9jx`XOLf<8joL%Ml zwrn_fR~1bvzE<7SCzt*9=}KAVp*ug6l|z6^S~$n1pY8ckvK+Qr+me%uZDwD@(V9EA!lV~#^ykU85)A{ev-Fp^297q{zT zKU=NJS~cbC{qRf>%8Q&6V%M2-1PO2%a}3ggOxZ>d!H}(>Xl6Y6xO`sj^Ti)cL55Ri z7MuvR)_|FLXR}^zx}uuyC|}P-?d){Fc`MGZtAFnvwh#N?Zq!&;YT}C1{`1LXnpa-~ zKl>j8_Y|UND{1^GUoS*%cI&DCxm}1>ohQoDIURECYGNmWZ9VZ*7Pg|y^ibA<1rp7G zMY)-Lvs>gl23LlVcYO-9TBBt|&StKhG=&*zmsO=^!@7l9$_gc@Jy8r?LxBYZ*yOc@ zkk&_XQI=OKH~2DxC}dxEUmWpq>Q)9DX0BzyM^Mn3z{#-KqkQq90YEavvhCf`6x$Yt z9_eVsz}*&4fK+FUe5kpsk&&VxbJWm5utyyPl0n+b-Cb_P3C4* zFG!Y+f753S&4EweOaT$EOd2uT|Esa^>RI9VViW^;JsVtB`xjeUX{U7d(Ivk zv9atzRLsSIkVFtu1bRYr$3k4WaP0(P;zS7zsmcKt152N;vo89wd zk|ejYtq96j|Jgq#Oi<3ML|o*IGEExp-?n*Kj&N9&pzfVZ@?82`edFGs)S98gCOsGk zV?&Qhx4uJp<66PNbOfzY1v_CCs`F^;EZmXm8LfJlrfolWxkhM+tHe~7mYuF3)f=fH zn1UG&$uzRE;P~P&-y@2XT%f|k2O<^a`4wd7_NkaM;o8HZ(imjq&Xf@h-W?{%_}z;x zyZR!|5Pe@YI(tR#l;}JpT8kq`HtAn6S0@#(fYb}p@Z91BLS&5ehcpk1v`0%1EtCe!w@tPKla?{*uX zLJ@kCLrgp(Hm!k&<76{722#RI4G=&vG&q%JX2$*9cvKo^+Iv&kN~yHhb^6;KBLSwv z)i}}NU^UJsAFA}j#Q0gD%9ReBv~4Jo;KZffG&nKZPsC7cY#UTCAz|B-f}XNDsS{~i z)2KZGtEeFNCnjmc~O(n7Q?7px7KTn`U@tb*qoCN0PeG24Z(n@oCMD z11p==u@DnxbUhL%HrJm_Gr3{a#B;XtZ~bO=3c}%2VuVRdbXtREMr!vC7!a~8AP!o> z)(@nBvV3}TNvkIvh}9!rQl9qJL42e-OXuU4%lsHA3Nk_s9RyS4EAODDDx_j52tP0{Wae$AKzN{`hL0pE~3akmiyY{@w#}wb*>|n{Q@d0GtfM0@47WEthk7xm2+iMb~cqea)XEEGS5k%E%aXt5H;^I(+N8 z*!v1o;ncpmcyO|J1>RA=~cP+M)E4=tDZGg1_^ z0yK0G7J&`|?Q|K->)?~{PBsgVW|$8DEb`su_sw#it9=@M&MHb-zSAJq8Ye4yHv8nID$GR91(O^L z+vpjhn7RQ9&DzuI^?UDKd~91k1zN48Ga_fRb55GVtXxM4#XPkzXvTT2-d5CcO8d52AEGI3<3a$wrX^m+8hKF35!KBoR#60T|7sQ@u$Aq#+S(`m_XS zjXDY$Y*rnIx-hf0(?qdr2WTY2PTTZ0Ik0`ZDe8n8kzSMEl$B@poB3unNoQA|q?c;Q zgY@)1|Mq>e`EmUsQd~V8Y2)W^5(-^OOz5HdaxVwIBO=o+E?$(@FW7K&TR+Fl$GEBvVhjjvzLH&l zVfiF(T*DIAaJep9WsN?Ff9Jce|2*t(R8N~5Ymzip^n>=Zk5&jEVOzA=$si z0&9g)tkXgEdG>lY_(O0zf4q#wuZp)r8c(l!2UE8>@oASWiIS6~pbbbz2w}@fMpw&X zzB#P-_4aT#{p#GHPP4NRQ{o1<>*fA(vtH-({c^Jw|9V_Ld3^d)-Ycc?k!tOk4K>&4 z$|sDl=Rg`d2*#{~Ksqq9rV4I|ND>^UXdX#-LcRTq^ceT1kLp4k`$4ii&*&crab3ntLni0*ZuUi z4A%L%44U&Dgy_Sy9NPqzD$ zt_*Dqd^!_l;gZWNd58%z#XboH^Ft<+OfDO=H9P9o(2I}DVxO<`U5G`vXDpo*z0M$G z5W!`iQD_S?S1UyX>$Sro8FP10-r96?cUNDO``mcATk`2}>&%#)0xlcoCoIT-&EycQ z*8+%Ux>@tx(3-9(zhgL@tru6b^;5pv9E#Q3&2qggzJEDZ-k%)yo9EenIiIaoZ_{u6 zB#@4D`C2UPEfFtL=Sw0swCY`rSaa2N&A&BwM3K;TID1z_ zTnK4ld?uUKBh~J0Z2YoqYcyYr?A?w5Mue1L?P>ArHn}KNu&*Ib6@}ek+U4c5hP3<74I|W?plAo}kbInW+VLe&^(atkb9=rP3lGk?i z!S&zbphP1uNST=vSp=mz0wgJSm^RAoKlxKi3s)tFeYUB8IbWjvGE#KAR&0W}HnHe* z1}y^;b%fPGgG*Z!?dO)}_CqFoS?31V9jvFQw35)|qvYk~xqv?wysm7&g0>~(Rd9Vh?efzYqz z^hD?uLOgkJErEy>1{uF2T?Dgtg-9~^VFtec7Kgd$O0-?g=J~TIfN;vR^Iu1c&itcO z#I*|I6B@J_Xyg&r1Q9T4X{1fBp7u6+QhpwsChzZLsC95kRFOjBI)M7Dc6ZHF}5=zn-3a|3x*O_P(DR7x<9O8mZ*G>|_j2(cHcGq-pzg)kY z&3}YepD70Jc6g3PtUJh)6U@%rd;vskX5e#_qqw~oM+ zTCr);n$J!S2;T|R13F%JH&lyvejOKaa?voXvOB*@&YLwHlWjeAKSjF>eB6dJOV#?b z>i&veLFmVwJF;}3eo57Z&F=>D#dQF)glDcM{7pcEZdW|`{bcWsTi&itVOT8q*iVU& zRTY-{Ez848*D++_M+nccY4O42#}=LJJbf}%w#`eG4!?+h^k~!hIdPqw zQ()Ek?u@v(HYQGzg0?6fAzt2gZ0YzB6-Pc^Uj@+xSO_XIpdk z^5f&wZE9?oxonb;pdfR^$ryxuO~;i`7-^AY<>xGqFAs&NXLD6LkJJ55gos1|G|>4adShEF1X2U84b_))?n3Bs{>R3YssJkIN#URizq?L}B-eJkQR{i91i z8Qt9V!?We0n9f8@?L7raGF%pA#lO#@ZtJV?j;7zB>!Zi$e1zyhTx{!m*-|#{h?8u4 z*v&=rnS8pR?aRQ@{ASRLD(SHv=YQG!$k#NrNDVUGDLxZU=uQwi79qN6`A-V9XZvGy z#w)?^bO8}-ZgzZ5JNL`76Cl+ceSE07&Ot_sf;K)49btETk%bgUTs(RC-btQBUf#q7 z$*a353GulGx@eZX-eDGy{_fh(zhLroObgDBups?t$RT(^ItbUI2imnEmt5(td~vlK$EqW?Y$#{8NKZO{7bG_+ zF0ROva~W3Uk+@DR>8@I7nSMnXTvfqPz>wck{gEkM5_HvTKr0YOx5<|NL&7uWu)x z5Ip<*xs>C3G3w|0>2)!^{`}8Mm8X6dCVgadqboWu1QqDf67-M_dU_D@xytvm<*M-O z^HZv$Nq<(QYQ;5uy1#pqjo)cTF3&)O(&(G6i=JJzMr9>Swi4MG&!DhB=Z}Z=!fK9& zc`~Y&K29No8Dt}Sf~mK_Y6AoU(61Yu_v&7mnWT%SZY>B);& z_Ooxx)pGwVBd}w}CVPNY{(qX1Tb-EZLnv3fJc<0m9?ih&!;gNT{l|y$C#K zjwlISq=SYF4n;MA4t2jyQ{mJI=-bV@$V>ON^#w6av5`YCeGN{65Hr_T8m#u;w&9pO zm%VJm%njFE*Cr`okAOY!S6?zX2pZ*0Cd;{1!d#5OLN_i=@h%4UJ+x1>KZuO>Uygwj-kqK!(tJTMA*oaa$ z6`kb`+o3fs<$#j7%Es;J!?*6qV9Vj-WA`m(-z2!tTWbfn)1Ji|Kpc|C0K_;36cX#mH}#1}z6&U>8STF1XREFLOm zj+&zx8yb-%i;83~)R_u`vQpvM)@Pt}s`>8_iXqGAmJ)9^o> zI3g&mkB*?NBezwWn&&Zq%3ex*L#5Qo*%vcKMgSQ_LP={6{<{k*A0$u1l;kyP$*7#+ zk``2|fz(oDs-U7sw9ks)iK=Yc?arBSK&Oa7H2N#kctS&|I5R!q6gk7>K~5=$!=}g> zVk1aFbI-{r3k?PWjal1_R?Y0bU+%xxslc^ydG5|lM3p5iG!!2!hZP z^!tz1E@XcX-L@r9GaaC#O)h6TlBd)TrMRFzl;5cM>A=J?L2kJQ*WW#uf?|Ro)g;;y9$D?j zh=@XQruwm=pGK%^r8n)!o2ZnL1d7tNXbIvoH8${#m6S&`8i2MVqfnlziZ4H4M3}a$ zf4>X*gi%PBoMt=qCjZ$!8*}qSOtE>GSuwku&&u?mmQD0j&SJ=gV3rQ}30h84`MIR$ z4urcpXAR`b@^Row)N>V*{hZGVP5M=u$&_5LUzWSgx=dd}wUCVE(bJ94VvY|~{Azs| z7)8MCQagc3~6jRb=5bx*?#Z?VBeaCZfF zwA=DyfJB4x65zHpegE$X)cVuGt@wHqwHMcUl~^kN^|*ZUTwnMXi{)WFW>6Zc2%^i9 z+H~7I<8pmRTQ|pa<`RwDnn^R6v@#IU?0D!Q5Q81c>at3cpqeg$rR`ep_brE>**(|< zy3(?S%CmSEuvyPm)tdd+{WQv&>vjh9shWjWb$dBpw1yp9xEQ-@aDU(g^Xl_r5rvY^ zF=##DIt6<1aars|)wG>I>E!{5@0RV=NQ<&rv%+w;#n=10xlCAU8T{RSu-^(nS#Ucj z(M{RN51mAUftW=}FqSlHHl0?1qC*v~Ji|a$aoT}&iRkUF+c8vM0#y?uK@=5f(NfeS zUP=Ca$cufeo?179%fTI7T&9r=Wo79{z8;<&N8aDLj(k0AWti%Xj=S@S6CEx}Kchq) zyG*15RLYXS(JF<#dlPjvtL`TSdh?ehn3}_90UNQSxxZ7^vVDS|_>_QAn;K%?(`YLj z8*OKXU`-t`S=Xk+&t(EGdo2b(*(-;j6s)sF7)+r$+gwZ?!%SvOER(YBrBvWd{W!rO z*hNa05MhJ2qbJyt=AyHgkC}D{pXw@C167CE08%L-U;>!~kgdlft4`}N7zfi;qjv_3 z-zk{oXj;gkLz%fC7+ALe6%5A;BnyY2$PBFNNx?w#oDCpX%mBe96(7D_1M}ekw9vi%?}(ltc+dvaL6# zmF#xA%4<*ll!AS~**rzSn~f}nRC5Zq7uQ*;Q{*e1Ma zagAZSuGx^#8D>3VQ@GfsXdKm$oAAFh{l&3#> z5hw#bZ{mHT{Hmz0^IQH_WZARn1~fn#@Ft4axCG_PvZCnsX;ODX{%dG2*sl5vWKOZ>gc&-WV+J@ zwhVQhc?o*M+4W-pHD??_*;dte)ezJc(!Et{A;vNqn3`}A5R}xNVV=tg-N24Oxpy!H zGW!;Ggies4rjv`GoudY*!O*+!RQ=J~DG@iV;I0!LRX2z7Y<5(dvvM(WycENbwa*JM zd)Ba8k>|Upanc4DX?Ho2R?8k7cgw-E?}J zKfOIYbT>ibKac;>nn^PH{UEB1iA=2zv-M(??|R8M=m^EVO|m}@`R+{%p!c&fTU-Ge z+x<*Gh_+0B+<%il1#EMKdH(_1>DcBJNqQ*?9o~x8L$j)L_IR>dm47LU$FWNA zLV~8@0ZOiBEJ~(kERnp-Apsd9)ny(=w#z&s3t07TjAU#aMj|$jNRm|h1fxXy86!aY znTXex7K;&Mn}bnkn?ogAo0*FetR0P#svS)vGV7H!hPAERx6K&Q?z1r_+-Fmn>eW0x zGF6qhHuB^;8D+_JGLfUS2Un@$jOoTQ1*6_Fg-G+U`5i{y@mGwJmk^v!6Dd~#5)lW7t{T%Dvb#s?HA+)|7)nup7?qy(Q12qClfmVvZ2P=f zi^$up94hO)gl_C**{xl@cvY&OPYl2Yjbqdl!|MSu-{a^3o97`EYpW_7sMpUy5F8(K zc7oHBj||2@D#cw5gdQ&_^(c>HFifJ=O0SUjodF|$ohGcer{UvOkqMl|K-D}EDKz(* z?`7kae<_q-&?fP(KYz-z@iBAtVH?(U{dGQ5;J`eVDt-Rpp?F=lS+6OGFZZ zG6@B|R{^7AR1x4zsKU@!Jq8jn3{=Hp8Yoy$c~8=T%DZ8H_(_ zZ;j_8)f)SgR8jVSS0&j0y%e0f1k#5@Ui|J&w!wx+n5b%x(yb9}Z-dE&hz*K7=))?% zOh+%Ghr;7q`(Q?{HuffV{3dDn@#%xebSn<4{a5kFrTEV?apH(4Cx6X;yGhD;-H+wI z%4imqU{{;j;^V_tffm@0V+-$!ULfzGs$&xSs`^jH{@#~;m0nGY?pJlCXh-$dOM0e? zQa96$3U%q|V5zoi?9Bvr2=iDV15?i@#HfY|kc4qQkcV+Bkcx4vDjT(BH4p~)QRN=~ z*i(Em0E-CBP#FY2svLnI0Sll}9ApCi4A|)X++!pik5$FNF43=m6$lbA1Ai{rQMaEV zK8Ca4TMOi)>Nn4mJ9T-@aQd092J%%(271i?3% zZhR2jtWZe6;53j_t~G;HPBnvExC2R&8c2twECO-=Vd};UWMLZ(w+`EQ^`qN1T9u}4 zv?^BHXeeK~?Q9zj0>UT*DE;QPU@hqe^-i=g_@LHIRArzUq_VCV1UQD_8*Gal1HX~b zs1nGIGE;R9NHdjP%IHUe@(2_xs!Av`RXtH=0_DjuS|Dj9&I^rGnWrvByx|BI<du zZw0C<9hDlDfAu%OVb45&{#4zYUeH_cs*W%QoZ)`n!v{a*`uJe1q(1`2Mw}Zu0-d_g zQ`Zh*UVne;`M*fKx!EbJYvr~x1MtM%X;7`heV%GL+8Y2MQ~fwqhK6xHnGFZ2>Qw3{ ztII?`P8EuNoGOI=Wd-0K8KAO_4N!Mivm=3Q9O(#tjCQpuA zcL0E5fIkBv^nUKC`~rMN9Ft%ggn%Om5%2?l2HYsOOOO}!N5BdAQB`F&S-g~$;}_-q zVlK+Nw_TmVDT(w5MD%< z>HQ8k>iw=Vm9|Am+7DU$OXhe*cYmjR;vlyRO?S-hol5%^hiJ1u29nzwp(7Y5LpSXH zPAPeIZhd%D&WQd6EI{L33vj9gX#md^ElOf5?CAt38sApqf+2Lt(- z2bUsJX-k09hD)M--wX~E%V3}oZL=@9%Jc()A`An2N*E6yr~27I0s4VJ`1*mWD3V^E z>i)jf9|AWmhc;En#+?Ay#|4Ti50@FLU|ePZ38_u9fQ5jzP2dpg{o1pIq!)z+=v0Ow zK$SW8tIEi5&~{O2J$vwCu-=*DGvTanQmg(+C zk2UqYg*7-r>_w2fa93Mv5ZL%Jn$-p}X2*R-XPBS2sZx{%qrY9Rn%&542tVs*EKeSuEsz7=Jvo_)*Kk!n_xHqLU3VBLb zY`;Go?~qcrig{BPUV1Xa2Y6I3C06XaE=>|8q0=_hDJXPD3v zU6O(zhXb7&(dp4@M5mviiq5=Y0kK&It0J=v7UIHAZPghSr*?TPr~#U^7q@5+PnqlP z7=mZFd9W%^3lpj=-TGeunL18VW$QXgk+I_>V1Z8EQh>MZh)IorufQ7(lI2f!NhHbE750=5ID&>0a^()(|iaQ{-*C;^zu6~o~ z;HZ4`;lO-6EgXeK1P%ze=-{Z__u;^Jj1G=!Hhnn#Xjxah>Qa`oYC(NCF!+M^41nrF ztNep+2Mr_`G*OcVR4WCWNosC^fQ1<{m?nx-4zz|30xH1=sq(hh+6R(#n4ns`%LK)= z9VV#KaG0P<#$kdgrLM#PNF%~CCVHWbZaR=<_jeGl(1TS11l@FC*V5k=!5;sv%J2Ah zRZPdfYot+S-W>h(GNZm44Ofz5Hy2S5ge1_0Nc_JDy#Aj3VYHI zDofH2DjU)dD(TV>D!H1P+i=<7#mWJPT3G68(7;lKqJf26k&g%9j$AiYm7#8wDp1`h zRl2%Ss;H3~;y{4d2vscT2w^m86k?dbW4&MC9E2V)z^W*)5vmwq33SLED1i>PzuxSA zYEIU3S0G4L$32jMBRE@SM@?+&3cCZYbfZ+gX-D;RcL7wVo2hcD8>KR=8wL4Rea@UNsH3JFQTb%=e9<(DCL9;_?p0Tk4W#Z6ZQle7K(? z*Q#2+byaTNL+S1A%Ueo%DG{LsBPZ0=K1AhLYb;>e>A&QLR^2C=YTmWzB> z$3}uBYI4`>5(RW2t4yTY*G|EZflpnFqrI#Sp`T~}Y}UsD(Xw=)HL6|M5VHdfc){DhU&I4YULtsX&ewZUYdgQ| zeLUj%53*1)QBEPdyq?^QF5V3X!^usSO)f{-C>snWSC=<8k9VqeUCVid;we8H z*ZbM3sr1ElB=kz^(CGx`%mEST71qI_)2QmK|MEK+;;8*N=G!!t@=J6Ap;|)00i6Vb z0}279x9Hpgc-?DH|8)Z8#{m+^kO8F1x3)wbU7&z{PRObh7$K{|a4up<7mkX^SnDzr zxKgMy6d0lEX(*~LjOD)qfs_Yw1>k}UY?(fM{UVOm(j!uX($Y`RQ7$i}`{js3WmYbQ ze6thr2j)}WQjj^A?$O8P^Kzdr{y5Cm`{n+vEMdr{p!DK)T?of#ReE-!!}6M0Huh@g z!Q$yPVOI;}hr%aRC<#WD=nJXTEz9dj3&+=aHfnKIKGo-ZyV>oR>nCpgcfHpuG?SOv zay9$5TnRG{jT)&NSnm-+s4|kS&k3K?+3%g$+ZGdKOmBY#JwAe2?XChiEX!D&Je1U9 zH3;=xX(-%me3ifCtBr^!HBsutyX9)dzaTVCg@WmKEH4v`=b{mdkkZp`_8f0PNA;$9 z%Puaq-U1$qtcfqX*}9m`%jjirtTjD@b&fyhkB9YwWj$X^R{MOn7ID^>ywQFc18Q85 zzGsIN>TR0#1zX<$vUw{YH%Ar+uWE#{$&-MdD>?|O7!g8KtvFN&XirT#Q1A)L1y%k0 zWP%EgdaUs%T>xkkWFF9yn`y6KH>W{hq;tZ@=(qOENAgT$=MwSXgCmKbkrPB+F18*q&Bh~Fg` zFA>pU-0^+QVa)JBM``ck1ETEab~OtO%b^VLqQJONd!N!*8%B00Oq9;xkOxX>FjSP* zPHh2^Ba~bYz$nGT>oT&u%F8IQ-**&BZ#Y93SDNsi=FW69E>0S+dPaLek>?2yw{#6 zBfKb3F3i0InHCE-5|k6Z>vL2WeBd$axl#%+(z#$`bf;W-85rSgz%j}hQdBUS8Ng!H zM!o;R_=t)S<1jGQ3F9FUBt|83wiiYBp{FmD;9G!Q0ACr3g#N-PIpl;U2mG#=NHBUvA%H~durD&KIh z7`1HAKQNlvfMb-$dmw|c5)T{38`qN}j1w-{DBUa%@=&T-AY(MMy-mc(W&@5<&h*R_ zqnimdMs>>j@)o0>83oD(+q-0x0XFC;?VQiGQSvzvpd9eMWJl@e1CLUVRzTqO$+;^D zxbxv($pKXbDl2~+C?AZqE>IpA;bZj2s0M=Z5d#m(PmBU8C_^z2VH^cln8BzI28vP2 zUkeB$ogWLv3rD3SjCu~Z7`?ITM`1j~!iDj5%torSLe|>@W2yxobd+|yMKwtK1x5{c$deP*b28|l*gz$ zi)kPR9wR?;`L+nFqT`1V55`Zo`eZy^zgH#$YYXi%;lTKaRZ|+ZHK#_dblG8iSu2i* z73Rj+i;NQGvaNsJuUy)ceA{kUIp?V}jEWKE(N~!3R?W8*q&B&`w4e!J#m1bow?kv(f4c*GMnVZqkXA4i2ME+YfAh zO-F!zz^Ms2~5y|6DSYrm0S$oXTRldlSz?|FAv3jBdX1PJ3LMIJ5d_) zaTFKN!GWMPbS0jHHyiNg@(!GeifStNgi1(k6$GU9eRos zeD(lI0$dj1Lk6og_z)n;L8l7BqVS=h6oC#k#R`1;kV_KavIJjJSgpaA2uU6~wGb@A zmkI`}pdUxY;D+&-pyTJ#KOM8gd6?4as41Fe`D`c#*FIWi!A;gM3s#9^NA0qp_13J< zF(UCu*~S${eei~9)CZ%)sgE{&Q2J?-z84gOtFWa>M;V|$Ix>krvg+vAC|c7;9(_M_ zq$7p0Ao&R)YnYz|NfwTJ=cj?k8hmySiF+PP@F9ZH3VhH@G6=Q+AN=9kr|&<~K^3ld zI(jCJ(-BL22kDxQnWAOwRi(#GpJd$>O>>e!);1?{iGN3pb7E)Fy3Y-`#5RlCeQ4m* zyAO6r0-=icLC>Li`Yt0e&7pQW0c<*_qn3CNR5%?sMcZBC%-}Nd_u#z(B^;>98s9|TcSk$3{w-_BR`W7Gs5WEyf$LOy+IxdMj zoh-rCLx3nL>y9lIwHSQx32?FDCu@@pv&6ZhZrM;%G#w*zT4J5DXk(B<)_)8lBzZWR zLJTS>R>AcqK=K|bmcWIctbH!T65oy*=fX_Ua?1U5MY>9-sGFS*vfkM#kR;(~0PG}? zEP?qomc%~E5SYoJ+W|8Hk{n#kfSCf474W`Zl$a+O0WTGF8{ow+Nx{_wcnP3bK9i}c9!G;QcNcnIb@rOMTjI9M`MXa3B^jdE5%74 zl@#mXCWCAh+yqE+aI^+)3Mf_(qb{K&0g5HWAcbrVF^G`l;b;*tsPM9iwoYtS80p>H zr`2r#xY<4X)QXjMNiVBlB*ot<7>SVNLA44-DkxULR#;ZLilUeT8-B9>*)U6-J1U(G zHA&Nq^^c|9kECoy66pG7L@x2~s&Yo`B(1k~ecSydunw}sIZ5-(WYD$GOn@W@R|{aK zfMNv^O3_OKpcp~~O31blfd)w$j^+@72#Q5;^j46vK`AD{ftsvy4x|#lj!NdhO3^BJ zw-3pzDH`S`gRE_C0wg&&YMz?{iWM-ltC38dqId?(WL-1hl(=jeZ;%fe7xyX0dyWM8z z(Zf{|1IaKVkV3bM2t-Koa5akvR8XuU%~Y%SoEL|cXGe7D)T3AfCkbRL;6yI*@2GuF z>?Ey&S9!J8oAwo6`+#44er7W0+Gi%f!vdHo2)Baf;{I1#fj=2cR^U$nmlgO^K(d1L z>uj}Ld|5u{q8Z>~^XiXQVw`jU@KHe5Js)m~d)Mus4>?KW!#|6Bclmv@oagVBtCi@X za+U9A%avbhrr*}jNdsN$oY+0|&WWC+`9yBJKHbmuhvN2b>b2MVwOU{!fUa{k)b!|H z%7&Yy?UAhQPx)@SS%|&956LDxGkevj48O8~_Jk}+ZdK6Tx^3Q00yCu^Ju zuScYhN8A(*rvq8T^{wqmH*_xiWG%v#KoR|TS_>oX9cM^GdXBT0){t405e7C$`( zBc^LI7^R0UgK?6ydDdz(#P#*lCj)A_Mj4QL=#&8~MXPBlvd$KV`CbWloHS<1M*&&K zak$s{FCeVNh@7JFY>a5US<;ms6>|IR)sH12MP!SJNQ*~0Vmwt*EG8Z4EygQ2=Jg@P zOa<98nDNuSaApE17LW`Y3plMi9)^{yVLmP$Pk=y#6b%krS++aSjbv()jpOzFw3&_+d9MH}OBWi`hO8S>S%zq}+7Swa-m~M@A_( z2_#DxeOx{-_xa+F!)(1@?%&Eg>(ko-FBNnv;KlD@1H1%~Ea2jHU5LDt)w4)X5oNvC z42OWKx?=>6#LC{X%k;IKk{{$VYIQp z!F8Hm<=+lZ)BR4ks+XJfOTODLzpZj`5f+smAs9U&Frz3cCC5%wgKLq}{>z1e(9n}d zZwo(K3dgxZHf7Cw$Jg8?oNI=gc8rC4LS_EPBe# z))?@F>*y4cadkyv3PndlPab2%QYJ6rx%=$fawWcB>$B(dwi1sby0yfkh3=|k@rWq} z<7zR<@VX3dtn%_J_q4ar;h4!5z{{;p#=s3@KuXf+NUd&s%AB)=12gw z?HAn>v^xU}6=WU9lY-+J%S-^t0y=A(JeNHMLR@UW1Wq;r=z3>EO+S89Hry0#XXC5< zC0}i}`A#HJm1SiYYH_g;_4|E|$D@dB52ulidQDgT_F@zrg*r2QK_%Yly+Q zqwd*IQ#75OH<}hZ!_#i|{ObdC(Fh{j!bxP~XdLlqAz90XYAyc_!Mcbf(Jdw-F&^Q% zh}2N5CK*n)+b_G>x|q%P%gy?PL4a_~WEfBU}K{J4G*7wli&w)x%Ua{3oc+(^dqu<1rTKfwp4 znLO}%{j%I`*5%zj3N}4!Mqic==4v%7KN&vfvtqMG$Ey`#%gXsU71>a>SP|z~&E{1G z!S9)<4>!pTzrJj5}SR9TxV1=S8PpTBQc6dpL2*_mt9j5j}2m zzN>~*@|>~IrG67jQmRmUTBFO(4q+eVTx{*LtzrEEgya(JypW zy}Bq5$!403z0}xiN^HJ4+W;y|<}dpDc^s74!yy0uJ~kxXZA)9HKh zzdzqkuZ!vR=YLlBt1r)`QHVcwTiit>37O3!IbRz9c`?l^0J2TlnmfzXwD^XZj7SKq zESV?ylb>ed9<8gSfkEgL)1K6JRc4I^wlj=s6a{H(suZ88w=O!XYJpaU@$RklaPW=6 zK5P1PfA=IyITIy_tE~*yLkG6Xv-5hzTtqOdV8Qq#@l}U3KZ_~x}>F0d)L?IR+!l`- z_2|#-;MXi!XtbSbXoouJVGl#wVtv=Nj%QZhj`4qThP z5k0a7WYDb=deO|j9@^T3QjDxO$hnv>&>~@8rCwPg;BAOe8eps}2?->j5~T?n0gOyY zs}g21Hq7iZ6)n$bGD*C=ASM!gB;Z~*NMY1| zFVU^QcCjMwDxuje)dI^2xdg2oh74b%}4K~{HjF5;9gPhalk?Y6h(L*|BbhMv6tlq5w}Vy5ab-Y3<_vJdL^ z(T4+S)+EkjHk}=_b$$6T-sZD8ppR91kTDbE60W->%u9@9G3>u z_UnVWO{arK@N@b!oj&a6kC*Cpb<*XaCF1mpLQBf8SQz<`cjcMR(I)nywD=GUh{kLOMd=2yvi^Ia2P1bQ0$ z41lVFF0N-=<`f*A{smUN3%om~}p|`%J^{qIaT9e1~m})AT3=+E4aZ=%@ z4JrllR_8B$strUxSFmplIS5wYIaQw}Ww_X9my;xYJW(*bO-_W2z75yFPqSpSD2tU| z<;8rrtdgXr)9DlW3(pOV@$0KcS+b~Ww)}hcocj@FgJ4Tcn0}Z{rXPl))xh`Ra=qWY z6{8R0-}&zAKM(sG;8i*#TvFh<(UxQnyV+|=RApJiBF`7obQwUMD?}@OB8z_d*H}H_77Tve@VAeAniN#zjv_-;7KNB@r|(DXA$TI5KKHXEZKS4hM^3^D;gk z7m|WY``zgA)yjg`=X;fcSpSvi>pSyckF99sGw~FxDhOk97vqbRqE{n+&u>vK{IO*p zA^b~Xo%I^1#_Z~|NB2_Q35o2dIujDtQ*|YS*;jQ%8_ipFCEyhPsxvL8@K{}miQ=<5 zBj@#6UD3*ZWY~%CgVF!kamB{(y9Q(S_g-C5$MRpp@yA!V;!>W*q7{_!IW+o_o;NEr zm&QmzkSFVEVI~UVYap68>&(98>D_CwS8~OW`UPN!EwT)UYhMb2fyi4?IHG%IP(MEd zKWmdB;W+*49XL|^*bWRtE6{*38bhQ9n*iM8LVfLCy`A;Azye@X^CS9TvPo~@gRv#u zgAxBoFA$L1EAn8)Q2YV=yzwd!=BQG1`~{RWmdp0ub3s zY(u!(l;&_bJKUf`YRtuhz-aZca_`6H*1Rgb1b#faRl!{14skG8-N!{R;O?s|7?SBx zG}D)?^8Wm=115IXBUhcAZz{wZy+3mrvpQdvbP_=i9Q# z72D}&t5*^%3zIq4&q#w&n2TM7gV#M43x_=Xv&eUs-#4O%dQ;e|DSsPoE9z7HB!*0W#yO;c&flulhqf=;0Xr{OEE)bba8_!#0E=K!_lS(BA%Bi1Qb4Z6$J3-o|iEIMJLgaS4$?C z3}V1TJRz^k0Ks|$4Ako)Nj?t)0o_{AKKIZ7b{D4#c+F-2$st&-vsqu&P>t52hzyLzH7R+?ZD1nm_+m}C_;Mmt1OhaNKXyaLB?i@F!`e0xhSLPS|0?TR+_5C!El{Al>lkNYQ4cks8tVx!RhPp1%p;A z_o7LLNx!^3l;1$uT-k|(gCP>Cs|Mpjc1=3WVxTJ? zgj5&N?5jRlrGh3(37tOHo|PiiLgW%Au*!tdgov>0w4_btlJW~dlr9M)#sbVrO}bnJ zl7K?6;yv3h_p4CubwGO9eaw$qL&#`EJ_P7iovwsb=ZCb30G0C*t9qoCij&un)KS74 z%27(Hjzztns&Gw-Th!C(SCKqX)kFtE+B-S+7@bnt)J}+77{O3-`jC>>^xh+;nq<9F*2Q6h0l)<6$ z6Cvc5RH-RyWmLxKb6G~iroBn@r~^Y==UU7@cbGKP`fFd`$E95O{S+>_KUVW%x%a2p zn1a%eL&?Lma;SN}$5*8^i~`T}4cZxIl7XKFD0{W_-X!*}9WU{d=E>=9HhlP}EOO?2 zU7GF1%}l1bEQAohk4{M5Q}4bxH2a)rix;=+LcEYzJ&T7DqF?Vi_^AZVEK=Ub14QK9 zFC&QPb=QVIMn~BQlHOfjY>b+_zSwBd%R?WeBu|6)p_F1%gG>ZY>OKcp)P(Qx7tM7| zIUlqs4BNdb-Tl9hnknuKye_R@3^jh7N2UsmZToGz5C4>JVEz}RGzs)C@_jg_Y@2M) zdufZS3uQ>J~HalgB!={5EvbDDo-T4%nw2{a12$d8YCUlF2;y3mUcUdpn<<1Ri} zDW~)?{NRI$BGLL^uJE&_(D{4yQA;2lpVdm)jpEf(Dh9XhigdW+iBdO;CVjVj zMjwSx{7jD0Uo^Y7Uaw7_Xa8*0{>MKlK*U|gjpmJURi~qEb(%o6kEv1CK9ZW)v?2Dv zO!=4$&9S5zczB8^4Id)c_2b6(2qVcgI9Za$X%dz^N<$ViVaghJ>Ap(aw+uc@gyOI> zB$Cp^8#T|Ac45Kw8j83JpEnVQ_G2Y5C!comq>QiRXqY3ua-%t5Ty+&_YR{}MQhb&= z#pPqGvO#4W*n8#SG3I|-H`Q2$QfOuutt<@f3y8B|32g)5&-%A&9^NLXkFR_d9K}sK zW+bSuxuWB3PZ*|WSu{0w`Q9@2lb&(Ocp?ggzT`3iUtcdj$tB$p=ehYP0Rwvu68K#c zwt}O&2PkUUH8^Z^wJheF!+J0Nf4iE!-3pJsbp^p#_2UNq2t0K7bBCw4OwrpHju?Wl z82Fu#>;Y!l<6mGxs=Lq!<8XHl4jPK%r%W={NR{B8Ldfz*3i!?VO##L_`$=G4DW-}u z+3d@&K``zZ`O$~~e#gT3N$a>`z(?(mTEpsPNkI5RQC&2DovljSM^I>z9srcIt;y2T zQ^)=9z%bkwgoDmykyeaBp=zG00zkS%0ys=}`3}c{f`2uO8m;QjeE`*TH&>S!1{0F> zKL7T8v-xrTB0}gr$=E6csQYsN{uyA?9jb6xdBLZxa@`vYT+~K}m8aTcNc#l^p^7rO ze;@K<-_`Iwx(TxR8d)!49!64IeLJgw3nFfG#7s+54e(wtg9j|G@51J4$7?q5EKkR4w%$KlKpYWcW=6%)$LL{s^7Ljb0nD39l=BN^unB)35Od&=SrI(D`+s>R2*kNlf6~< zYA;}(+v~Phb=I&wJ00qo!KtJoIVxJ?lP7>j^Fj%XvgXEv@yD|Tct(3pOdD9^52zDtDQtizRiOPwMZsGD7NTI#2Ht9ZpjwedZ@63!B~9p?jJY1=gCCvdIM__^i<^y$*5Eab+~`q=H(xURl6NB zRhIcATF$mrnTEymiA;umszY`J@C00D%(wF9X={{McT&6%_36G>PuZtS$YAEsa>)*b z_Zhw&pYst;j}E#ZkM`W&0lAwK5`%BHXY~$T4%*MMKevn7K3{xX7JCuM*!edXvLmH< zYBA(%{hSM{vuhWC(PxaovBvR?fvWou3@8q5m!OQr=e4RGgYLuCr#5#0HlL^Nc69jX zc1YRu5S(!oc#IZAwL}F?98NUhjiBf1c6}MKdOlGP!x~4r*3a!2yQKKqTFR`nSxQ5{h3@Cg~L zi+Ilu05eFaCY*R{xG@+-uk3X&L`_;mINbi7fOj%E(49+M0Zd7|Ruk>VUmXc9^G`PG z-r19g*IS|*L>1%e|Ja-k*uijgje-S;JFLNAbxwXT;O_e*7?LTFUEjn7qlo>=7Mfov z9PK4{FgIP8wYkSuo0azcw~0r?Q_ zY=fDJTQChU##|Z>Lf7OJ2g@j4ML)nn%;EzORnJq`wQ>fVdh%|$T9qBMcAKZ&?76wS z?m0Hfp(3?%2GF#voWVGd*%|t70SH5v3=nKNNFG8kOsSQ#DkRX#S^ZJh%2^%NdAQ|A zmq^@!YIRIG4CXP`3nifUE+Mqt$g9sDIfFEq6HQu3Fx(i==YVwd8PdVj<7wvMV0*2c zRr5}}xB=eE8H|q6%Gn)-&z%I+pos&|ixz;QlW0hhauZAjG2kJdkUL30upR*e^}0xs z&vh}NTMOFfZWzGs;#2{5qy~^2g5|2}56EQB!2r;$*C=5rCJ-AT^*MO^j?jGru)~)B z1mMPN<*c3;S?9G^S*w$m*>W}ewp=auZ|Y;Ga9zafj00rHn|KI-N4SEA7<#3(j~`O? z<%h;B+KOc<;ETSoQt<@^So*YGZWVcMf(OW zY%A^b2kMK6RoL%Bh6Ms0t`3i z#q?kWi*OU9nq_5q{`Bg6AYe+N6=2uB;mk#g-k-I+mv;r*X&r z@f+01I*>3akxu3}#`~_BCL$h?06`K2flLvyVE0NU6OLy}l@_Rfwwg>OjWR3WYE=mG zyX?x;IdAJKXeW=oWe_39Xr-x;W3#w)*}1<-t2lK|C-l69 zZ9qxWlg%G3%YGa{sw9Ci(J zG9LE_x-l4BO}bsnx-v9tWN5wK&CN*HR$esTxKC^7&C_85|Nr0d@`uA15FyH8PWf=K zpC*Ll)LT6}Q}1y3?9A?EU;y`NhQot3O7+9B?PzYV4ioFM)Xro;hZyZ`LQIW21= zc$%$25P}U@c{{#thX0$r(0S{oH>4j5ryKjhwjFzWIBc)&)t@NVgizO=>zEgNK>GRM zd%urd*>2C>!W>!X8gKylo1*Y`dH84HI2$L*X&m6+_u(IVb`L+SCt>%;bQ2989NRru zlj~y-4JYQ|a=%=H88l7L;y+Kr9~&Ri1?yc9uK%)s8M#|` z4uMX(x!MK4VNjsxBQR!N9^S6)C&%{fr|1Zsfl_98vLfZi-5T2~(1+NpFFTusv!Ux? zwvyS02u$K;vvZ)O4L=@MU>I4m=Ts|}#%Jw5!9w)?=M%~j@bTTUey$lG3D}0OC2vtP ztEg+Rh#+?NaCm&0!*WGN>-B4b$V*M*^Hzb$v|!Y~+O%NWRE z%j$NavlESuSBgiw;9_)QK}r!+;&RVR^CVclPS-@aR5T^9`|Rhsc>l#ws3ec{Bkj zr+O4(vHmbrqVXeGdN#>2MCuQZ0$7qgk_X~IW}p*xV}GBswO7%60`t)&R-r68DI{m# zH6>&pbv0xSC1kCOo;FZ1x|MBXE0N6t!lAC+KK)G;=hYhx;K$Kr5Ud~Up#RN|Rc2(b z$a&;&aO|go7G+B@yOVv`FUVEOrW9w7m`*mP`W;ir##A3MjciQSy66sv@?}-sh!yow zl-EQZ=@w3379Fj`z}dg{p%dpcCY$Bl*uf^)wy)uU3&&gdIX-lhjbFrJ{glArTBrsR zRZ%sNsQxN~G!Y}N29nIDihH1_`-(u>6Id!>G85w^AU;CE56#B^OA%i~X{UF{mQ|+`A z1QoiIXmspNqG>YGwz3v)P%So$UAeeYx*|D)fA%hTfT9CsWdbjlAFoSw-R4=7ltJR_ zk~&y)ZBhq|u1^YKu{BB^EX>z_#dT3!rxXG+r?LFWgY6u9l$m;$-2FM_o#Pek9AUrc zz^1Xf_VCP4$w2t5lnsW?McH8J43rLr%{$p(Fxz?+e^qg|Nrz+4F-cH7GpiWfmaT)` zfLuD1=NGJh=@f&r8EuZW12e!223~CP{1q;M;wZcE+F$v}gKbUMx5sRiU(C-xZLR;? z-(0%$Utf%AeB*LFL>5`KgTXiZ+y3Rr+rd8A`qE+v&xFDru@BP;KJ)W$=m?i-`!{ri z%WVEDI>KX;{|z0nE)2w{_HUZ)uyA!Mw?wps>)#=iZntxKVfHGEw)scd6*bgiABjuN3>w(mX?JWOC4NHaI<`?djvQhIn`-V4U=n%D_0~EtP-) zifi=QS|(|<*!RLMbqcfMBqoqPLg^z%x`ze4E6wlb;y^@2py;7TDKNTXC>-V)x~eDz z##SDcz%UtrfJUCp1UiUb)i{kIjI&}{7o8zH{6com z*!vYpNXV2i`-?PT$}GV3P0&-+jxH+gmORhUtw>A0u|=XS-=LKPc9219>g+8?voXQ6 zPG3SSefV6kM8q?hxhba$N9)5qBDrLoYP#Wv5a0}Ns>tim+GVE=PeqHmc{ES#4xI%a zKjxl?1@yps9v09UaV8d!otAkX7GUo7*&z$(V&a`<1ZD|_Bv3U;I#{p)xAt{x-UDBbRze zAusF-%O}sPHM1Sv6YF9to{982$TdJq&e=QlhGUXQFOGe(@@(;*$ z;eYWC=HI{J4QlZTA4Fe*Rk5aRY`|H$K&`}iIl=76c{xFkSLf7`8D@*lJ0@U7kch!E z^TOWnokKd<_OQ>kAnDT$Vo3ViMm_w4R_l6j?p7F3chOfs3@huq|0z2vlj?2AQz;9qr>+ zVB`nL-G>AK1>7T}Z4AQw6J%NiH#{VYBe@3m_}+qQDUSOKCik*|P?I4Y3^N__!LTil zWO>0p$n3MPl%)5KZBk@Gp~^nr?{<(=cT5trB>8x;tqtvkI!E3_c_1g0Tp|#tL63bm zWej9OAvU5t3?}~m8d4sIQQ;&dU;6SeaN$eDL5-VC9L%ms!~tFIA{R9>k=Ux-9tG26 ziDxu+7bJp^Wv0V^njrPei7hehkG6zK#>sp!z@BR|QHUip z+41|PTr9PHLL?*6WzFn^L=4pS$;1KaR|^nS-Oh#WX&XmBvJ4V8bUPG8@@9uP9k<&8 z0L?XBKU;CQ8(Wh`<=mcg^mauCd1MDIfjlUuj<^-uk3L%`n{$t-V#nMI!=&6JF)T#y+bupT(DxYV)Z&|JbeTr|Wx4r&l#f(_XI zKt-6$nI;wQ98)f+mdqK@)H0uoKE@bkct~|*kpl+oqc`Ht9zhoR#^QB`US|}R}i}aU`MYNsm zaFve6)O1Nmh?bM2?(mnCy**gWF9Gk1QqYG zz16BfnVK#aP_Dvb`y{PHUiY#!eHQ$Jy68y}tk0dF)-U#lnw#~!CB2gj}x z)q^9>FXiBDH?AsZY^Jta&k+C({=(&qU<`n#~T|g}0;>HgnZ{zI_ahi*y3i1g4QF%c+pJ03= zbR9!mc#HkkE8m8mK!Y;N;DWR)ZKB;iK9MTjh^(+~wSdPu+$juXTp*fz7)hs=*V;qU zE9N%OkcEJaTXT$LY^Ey*a-Be>Qw${5jdHD1#$drSDyVW{+nfUDrY zoT^9ALKMidsz_$SgGO~Y{SG2|m;6ZFo`dkJ2Tv`PjBwI)!H zk+ihd>x_|*Jas=DuvT?E%hHWv4@bF+2_le;A=@7=Mv6IwxyVFN2JX=X1E+z7gNs)7 zqdReOY|aMt5r)yt0{ejx9UGpLt&JhljZ>}vj}tuo?aiYF#HsIs!-di9lWA1`r9K!W zbE~#cCG*<4OlNgsnNCdov~%8araCPjR~)f zhrpSwU=%NU$rG}cWQwC!>VLC`(Yd+6F5RTQJivftro~Kg3L8*(u+GlDoNTuEH;jc% z=!K!P7c+II#G~jEH<$S01UEBr)K-(0gZNb5prxtDw?R!>CiM!Nv`nfEH)z@I#E$(Y zExS$o+3m)+!%Z-I@s_no%YJMe8?-c%Crhn&8L+dBhgt%mq>h*bLP;e(34{icy4LB& z7OXu-on$eTKqv{zYfq><0U1zZ1(Ze2U`JNBtz(1k#oDLoK*>ve!-XM9 zs=;#HZXqu+$e#Ut9E4hxq3&(PU!B!$Z7_=eL(c%+AD-xYlhJ$am-5}>ZabkCnHLZQoilf~` zV!>LkofvHiYbQot?%IhUwSHE06a|uiUQ%f05$hdRXarLF1_Tk9Tvr_i)c$?+QCrMnm3k+P8i1+mrfl`De3moTMO!Ldsv=Eh%mO&%$x8$^Y1^{y0fB z_WjS7|Bk<`C-yVk2KRqV?Ky;=jIJHnT$n$mKmE-j_?`R?;I)DIS4iC==zUVI`PC~l zFiq!bG8$ijORslnbSJ}}X7n!y`uMWjGtBYj#Jaq>u>)=3>BhANS2>4?^$B>m>W%(8 zCgCMZeZFxvahKQOxV!XsVRU5MUcIiWOs6A6=de?b7EdoM&~P)I(FThVW3|B)me~e5 zhcMe9hM(2ud)Hy!bFkVx_QczK?~Av29Ei91J``{BsB29cA?pzRk_%Tj>ZKZ5nVE%x z7-HRAdeQtjH5eh;qjx9dH!JHHyhLL3G2U~L)h)t%mhL>#21SGIYwOyeP%OkX&1%E28hKr zc3Kz2M}1-}e5_Ht@v~lCe@&vSj{^?A&*FvqHSqZfyo4lhIfP@*$t_bGy4bF%4P9*G z)P^p$cWOfy+dj3S`-oWjgzkD>aHEq-GO;>nc>o3+b+3~tiOnrhTBqeMz!ze3g!w|w z8=|yM%ap&5m>g+#r5_$Pb0W;-<-rMaTKyW6G$$HjJZoskw|r=r)vKam-IvKS$x|3ZW?qbEiPnFT_G9+B;<5FyMrBt!^1{fQAm_N8KkkgcfEB`!#K zO9W3{rI_gk^iWgXgdS$Do6tj)wbA$?I@^REX1ev^eC@frf@lji8?(Y_Lrh|5L(G7n z4Y6$z+7MeK(T0sj6*B-hA~NA=%al%nQtrLE2bKD++{h)8g=o6;c!OLimkX&Ar)DpC zkeK^4;a374%}x`7$eLvI$^=QJ99Sk_{RO1uIC8sOeM)akAK;fh{FB!QD+K_X1X2Ld z$zp=+kClFH`}7W4XEZ?s!Dxc*a0~+&qZF7W0Wct?NjU|PS z4Pj&o8f`d6Cu$qQSR6(>jaeu!Xq?1hfp^Uh%0}6N0FE zH6VzqRRe;!IyE4O9SfTY1#@$0v?8J{gxrK4CgTS5P!Ttvhf25sJygIA=wZiyqX9ka z5YUJoayBq@Y7NVHQG@dUr(xlwf$141AE<6|(m?fzlLo3oyfiSoz)J&NLHOi?-Q;uY z2XeW{O9Q>9=O-dV%XG{QR89b1s>|A6B}G|bYs$4G3zEXR*73uFrzSp=``!Z1_3>Qh z;cbtPeEP0nqZBMftL8ia?F1Wrlg6oHenI7tARAJE%c%!4sZOYqQ(9A@`RcmxC| z5o~x{@rEAb`8tS^XvZ72v~coJ%oA zebVF6lqM#W#x#+^Y)liGbj*TX6E)?k1!^LOoTWo# z=pgJO+?}^@e*TYn7o2`#jb2y(OY-M3UT-I)rkgNwH*?P#9VY)n$^pRN=R6P4*ULGR zwT`y)R-_igE{~Af@8)m?I9hrg@75S8Zm6*0CYh^q zwMed6nOdO?5!E7vsL1|GAu6)GD?~-KS|KWWnXE{EXW06$u&>DZK_M!7Ev0OPv4B=p zc4_vAT#wMxfMhA3m?jNxhT5eQO|fS}Cz@jGn4yty(#?K5euJ$U#0=XJ)Xd^C`eZQJ zTd=l-(Xnbz95dA|hh(O5yl0q)rTwrV_EqnBn{dDLjvG{NE&0M$lU7tw9cf1yoo;PL z0@aRoJY%ZSjxy$bYeyMdTU$~_*3ZTno4{=}Ek_jI+N(UjoCc0|l4}il=A#?Q+tnnw z9M=poVN-sDm=It7iH)^P5PXhF?9B{wiOKB|vSXGCgk88w1;U(Ra)FS`Te(2k?3Jo@ z*oN1Hr{=->)q{YI?C~@BuC`%k32*$s7MRl@yw0DeJ6rgb-c8fVWDVfv+KG@AutTo$ zmTQ0Y98EV#*2f>4CAfUTXRlPhFyyipa9J7Wt(-0(44>Eu_S&l)8MPhi(XloB4CsiJ zIRiR!K39*9*`qU{BSy+Fx2e;ayg^EzwU8XGT$2l~M&rrV50YF5BvvS2n)8gYkn1tU z$kIQ4aUiv-^+o&9OOhmzHwf_)1m;2VgYk*ZfyM|24)})-anUo`BP8)sj>aKlK_B(w>2`e|bc{8+_ z{-HcEVQGfHJx{q`8Fo?!SeY0J=j2JwoLm8>chC^$1K7*!0yeW(hFV;Fax2D0C#zy? zbn+?2#?A)H<&C&`RAZy>G8B(F`i4U_Hge7YLr@F()Vmc+2G)aa#UQ(M#fITQI8-$D zi|^~yV8t*+b9Ev^j93TG`_$X$dT-GV4qH=q`^%5w3N~N8FmzYmjT0a4$h&)}3;@rt zx7SX@K11m}h-x`L+lHl}@^agrh4%L>&HnxN&u%>)%!5tj`kN3Q%UYL{HjHW6s_u%f^)f+m9leVIYKKC6+LwtvpB)ZS*o~K5XM26fw@M#@kCOo> zXC9Y~A5^p7iznQba8~^}juUbV@LuDD#R@)D>|y(c55OLFOY#2f_5NCTOK*4MVDGU=>VbF?P$vjqU<*-n zwjWj+0;;U?P%xd7hk~h&L=+^}L?Q~dLzJaoGjz`<4F%oB$wR^RW%5w4ot8WlmLnf=G{eM4AN9nK1&dDKT`WkJk->K7 z2RlDH3O>+Gj4HJN8cS!}E^#koAH0;^&pglaM>EDdgz7A71UZYahbrJ-xfgezXIKC-byB z-7L7H;b9nrk4>~&hyf%~j@B2Bkh~AT8@gJ22>y^uix0scrhEOO?!~bXT&i~U9=gTOUGA`B)_i7=R4hOu1AL64l0v26~a$f1u*L>2}n4p|t8ER5Jb7Z3Br;7CrP z6yu{$i$@(KDlwI?h!9o6Vsh2uyW1@OpJXV6TxMMIq=%Kkz8QP)ZK%P^0@+Hp!^~UZ zb24%Aiuyg6!6(2OMU;&WdZc`x5jy{*p(=4cLTKRHdx#8ksK1ZM5I6g~F!UX9zP}4Y zkJzQ?d+5-2?EbXB@WZVe&7X@~jdZ2rTA@xvO~|2-+fqpwnA6^ngn_x)Wnp0Vf3h%8 zyCi9>&`1eM7-*b?EDX#bNWwV797nTRO4BPWJ_0-e^;gXFWXrRk%#EoK71WPOrDS@W z#W90nUbR4s9R?B942p1rZUyOtmL4n;5NW#D&!dnyWx5mco5JI5$V!v^In7T+l6Fr- z1z|SE5f+u9!^>)5x%k`@o_Rvoo=H8MlU31a*oCspe`&+Jq=td@IT02n(I*G z1?*wCe<7m?YMb{bz8_d6g|fxWwb3Or7Yr?gycaMfj+s6rS&MfC;zS-#jfS7MlAz!i z@D;-oB+6HP8d3`tio^;+aFxbAJA$~*3nhX|k}>(83(1&7SH?yOR0OSmi;OTrNJbAH znE1;)TNX)`2iE`9UwAvRvh|YuSF7h~nj40svickT*?j!uK#HpgGkuHLw9(B{8kj5x zj2IDS@yb;^-x^srRz1uTN#S8L4Cro}Jh2em2nlWCHSxNfhy$`6x{yidy4m7uK!qSG z)KeR(dNIj`4LR@kWO<5fzs6lC_kfHRq-;#mE(=-)L#&*zpvnjm7nd|=$!jsT`{7|T zZ@y&1s{$|dHqnV{sDd_+yF_Q>ou0Yyye+BFISY!{h_L?!``NjIKNd43HQ1>Nl>-zL znHXtdJ>xI62vz%zW&E1h#CA~PJ>w|Vdh8Pv6-`UE3W}#Gig16L)NmB+3xD}OQo`|9 zstz}CM$Py)aaG5gw5sF#f(wtYDN<2Te*cdNa$6;R`?dO1ICMv%j;3a*&>#+pB%cyq zptohuMwVFy7AP>x<(=#c0C{dF1oJ9x~-PpQ^7g(#m@4da}=)--I zO0aNrhh1Z!4ec*?$%hkdLM^GCK2M;TchI2>avs=bf{~V`unIrZ_u;l%4Gs{DvIdAazuw3=f?j zU4!i{c+kFhhwwJkZcX^XvO??Yovw$`4*v4suJ@j8zpjw^_x=pNCBCTna`X|{GzOzR zIGAT|-EUDhIr`D%7P+Zn0uX@u@ z51S7|aLi)}6yEU+WSo>)5_y`w?u& z!tM`196UI)NMHREm(~gOzVi)mU%e}TPT<|$;i2z9#RAwT8*XI&@(!dt#U73(5E1st z4WDNueBhyXxu5^?q6g<~^N$0MhT+O2?`-KX|Bx2(QG%2Yt4fescMz4+`$k2p8j;sB%kh?`qMpAe|l%?&pU8s`G)oJkqFUGqFL>Yi(n=$>np==RUF9QCyG zOjx1_)ZKPx9&8Vgytmn2oz|Lb|4nPi*i)Zk`>@3}`UN1{=KL^Ac61De#u^%$L&orS z_Z5o&SepfuFNMR`V4fbgbb}NH8m~Qa4GNc?aPWF+dNgVc#U-28C?bMv3WiI)DOFrW znoskfpf%v^A%G4sH)_}u{%tXM4jk(`#+fbk&1SxFHnBLL4{!E!BC3bOn{zz}Sq1$cQ=62JA63)X>BH2y zSB&($wO2oHSH(S--L7AfnZrz2aV_s?NA0}c)3jQ1Er*oQkQSU?XTJX>Q^f!y(cdUV2=>Q<|Y4Bs3w7Q0fr`2IH zTXq(ShG(l(3CT45Fw1yeROLcs78f$qy3J>`2I2GscY^^Nr=z7wQp(c1KIlq1Td93% zP7;mcY(W;wW!Q!+mbsb$8BoPJ4lr0Yhn`H7(9+5dG5d}#qBoE~~k{CoD%Huia{R}HTC$TSB zdJvf~ND@JLFyHm_On?16^Iu0+S$Tu@sGr9I=%@*R*Qxj3+=G%ES8n8zhlY^oIC(3E z?{;qQcyo`+l^CbIK?254(aSe=P6hm zBKR`PKLXMCFJH6=5?6n6&n+RmUh|gMy@dN4Cuh6B%o^Uf0ec(ZYaR0yKXg2G8hCHc zl*_%`%Iu{0Jxg(a&|!8=!Zr?Y3|RKj}LXdRDk3?+TBvY+<&>zlon!eo3EIo;YhO!b8s& zsxYzBhAPbO$mT;8CU(A8g^8U@RAFML6lIvmhDFkw+rO8^^Z~~Qj5DifIZEEWX76k# z$vfLTFE2vB2m6*{1~;C!wMDu?YzpC7Q?v^X7lzqK!YrjcvMqxD6;j=Z@*iLpK`TA( zn@EpUa&ln|*pUexZRf2>rt}?LUnKH{QX`P5#k+liAYphZbzV$O)rc~*63!mb2lNm;|Mm>h1LfvLNZ%^*K~88Cg_i2+u>H!feTl-7LLz0 zn@x750DHE0+ZJC1&a)fF__p;v{F7V^uJ_9kX&)yiV(i(<)>2soh{Qza*NX$^!QJ^T z>?PqH{PBv>x&C?Uv2D48jWp}2w)L63pe%1e%R?g(y!xu*JmBPG#$8 z4l(QaAvm`mtQgE1XELyQzsenv<_?d1nCu5=j!<;x+Fy2w{calFX@<$OXf!+*`9h zWyeBb(GF%WuFLXcla$@|7KP(3@HF?r5TZ=D27q3tg?Pm9f)llA)PcyQ7q$iN#2gp+ z%(lCdxJ=dO`Va>qv3HHSLAWeifZh<}94%7J#r^G9mpw2tRtLI)R*lMd>31gBYRZ(~ zZ*OV`Iqhx@cfNfmT*XSo>TmQ;xL))=;~c&ZE;fxMm?ZlXr2Y8*^NBsC5kW0IsZT!gVsd2z}f>vKJ4&pCLa zi|_yHWXQ@-PcKaC`!NxG`l3|HBL?i@~#vB)ZOjH0?y0{W#i*vRN2YmhjJ|ohYAV zI9Uv$+6nPgwMvObquNerI1~*=Z(kP)#ccCl2aAy5EJK1m&fyzjNFraTo`n&ljjz#b zQbq(FQW^|i08N;j!CeGRoHTF!9%0I2B?^VfH>zSMj?$`X-8r6qG zVRWGmlrr)sbdxbGM^(Y-!s~AOUyuxXv@XZx%nEm*pMU2iw%|1e1m2{zC55#LeWdYI zoE)Qen>ZnMF*#vc2Iqo@cNZP0??|Qrnml!8*<&PBS;pG~oqpW@eWp9Bs!vNfF1@=Y z50-Kscn-TL6A~`gQ2OeeO}|HX?E69)u#B;NH(b?s`*eN&{a&!=x!JE-jk#i6#wedD zkfGLH)wqoAo+*B!)?L-O^zN3|1l2q+>=r*0GS&pFlZ_7eh}VI(3le%C#8sY8cyB0L ziW7M)PwQc$0*~lPr3uCFf?SK1*{w6I_w)Qp5MCMu^I&~vS!2!}EM5%zvAWl0fVFqe z)pqsDkSebtjkGFwc6NsMscY|;pXulAyu7Po@g;PsEg#Ey`z|zrctzK$tSmQ3!!obD z^qb67UfQPIvaZ~)vg@g)!1iNkf4cu;e;VAozmrmYkN4X@yY;vO@8F(0{)W^w?2+Oa zP?_ToBvs79`?K(?Y^IR%;~vE5XQ>^V6Ydv7_qoYx183*{CX8Ncoe*B_*@jE?PJb9?W(VX%?Fv)L&Q^1ZiR zyYo1;FQn!p*?)I|zmNb!#(eymq!UOLBhw$vItoPB{SZ=oZXjO($nEKMYmH`K%7zyI z_!skI z9HXt6Si`?Euv2W8c{$Yw-3<3nc~QuuC-k>1C%Pp{h}l!U^H+%_p8hg8KH2$!TXW>c zvOFfqKGkbp3heF<|Ee>=)8_(@C;Qo*?{_5+*$VE%2Ye)0 z4VdFVYw-1A=Y{(h@1l}{`8X5BM-Q27{lAi4o*1v1M`Itl|%`xT=n-V=tPj7^nmT=?r4yM8>4256jYv z2a9ulrB*|}^lUqpR@F%=L0UOw<A21hrj4X|EN8z7zFkD!Bk0N3fbV?Bgmve*r^+(A(j z+dkPsz~ji1@vxR2@8sySJ0oLB$nrn17Fd}W^-HQ_=cVFQZWT(tuHMdD!uIkxTef(2 zIgc*e0JortjfviduA(uRA#+tXmtHh~zDx3Kg`M!%KI}w?t#?S$V>z&h_tL+9-+Q~m z4E}bTMDSs@vISYx6t&>C8m)FzG#>%T}?mh}8uwIAHgMaprPz}nT>s@!dwdQkD8+{i1 z@;1ZYP^IdY6i_!bckxOt4WM%R3lz4RdnBcHvICDpR;jbVeuBUG%#z7Xy0B}2{Bb8wRn^IMl9-4EI!R1q`kW?)=x{&DW> zN-_chN;zRXDH|J)VlB+2AQB1WvE8Q(^2q*6g#6LXm=6rHS8872Bpq|a)6$k}g#*G? zM1%40Oz##il&1?QSRCiag$sw18<@s4k*VC6CNiU&(^N5@>vO?t1Talw;e@|w2PZ*0XDr-m34U7Q+XMVe4!Pn}Z{=6aTCIZ>nKwQeN! zwUPmabOqpb_lv51g04)chtl(lJD?En@go^++ z!dwKfA>$)}j6s)-0VFerl-z~04SDe$$Mb0UcD-=d!@g^7a&?4_PZRDCLx)ufMC6P= z$7Y`}IA78u$ea|gA=E&?1<5jA^P@UeJXs_mNuVBNl}J=XH;R#QBpUEK&k}&#y>a#p zp`g<<03hSZXn~9$qXjZvIy0RB#u&2^#v8LyGxpeK0_hXBGX&K;Ui=c1lHL6x=NzK1 zTZQ&mL*P_i%_x2~xtwL@fJE#R4F!MH{-x_+_sj zoVmU#nW(V-r?K8+a>2EZU!$a!mE1>V*J5RQSid!RGXo{p3g-SKIZS~Xkdw_FB8&#y zA!`Y5;udVYICH;XW5k=#3uA+qh7>*!0rB#INTnZwD~2o_PbUq3lP8eK2vm`gPmSRg zqFdnQ$p~JO-9zy_C`1bpY4)?{kxS&$Azemq;du}Py!kZ?id!kN3r}0OhQ|mXx$k(G zXJ^jiVE%O15mj&ZAo%D25~72Qq!1ls6CsqWpk)Z07|-mD3;#Q6U^uN&3>C#s&g)im zF-=G}k#$9L2?YAKE!3UhqURa1}{IbnnD}E7EXmUIuKXN(+2Znv>?zSmO zY*d?ai415{l5AaVvQ}Vbi2sE=*JNey7$rx>VuF<1Cq%v?5B=MYpKL5_1Z86(3kEf> z?CG@|Ylid;YlbkHJ@(RjNwHxPEpZ#yiMHIu_)hO7h3|g)>-7kpZmc|Q<$pfDR{#D7 zUSR!X1x;(CLWYC5cE%@o{}DbX86JGWrmR#DLioCwT zX0J38l2%-6-yto|Rz2}PlU z=u(4sXIUNie!>$z<;s(_Av4ZaCI%=N>NiBzW^dA3EUk87Jpodma3~bED_O z;lFF!pV)zJ{+RysH;dr6J@+-YV8u3=(qBs; zyDe_vrPBa%PDCKJT_h7Ket@Kgbk+;X`?HpS8D%q%8Bd-QF0v<4_i<(RBu5L>%XTiu z9jiYYkB63~-Rb?&U_5}Ap#4eDfXAVRKDfEbbwfyg86(>D@c^Vv3)b@}D$V%@Vt(~( zFM80;d9Xbsw!#174d$tBIM^iV%yBA&I)5tx^)Hj{5MIC>v0$^mHwJ)^f{?$L^sgI( z_nn2e_9D-4qXX&pCs@a3WVL+gUGC?Nm6WxLK13yfR`r&Qk&}l(UyZbJL6xtIstln_ zqhP&;G&^9eZkM+k@8Mv5zRv6(SjfUk1b4wn`nYh+U`y9PFfZWh32&Dfi?*LIX~#^J zShcS2qd)6OsOgS-31{7W>U}QodsE=|+JSGiBgdc2gyXx6WBY4p|GJN}RfWMWGM)~w zQe~L-3^oSVRrKY*V^SkI?mKvvSNj0+36KT%$idM{Uz6#snSX`-9Pu8_#T}N>Np(65P;MLg zGkw{vlRmvUZ&^PM_6}C8KaTDHA-{sB>Df3Qdy#j-Q_zWPMkh9#P2LZX%a>R#ddEp- zAaMagmwH5<{mqbw%Ug^$i@1NALwCAacyIRl`yUt>7@x8br=+K(&h;)=nqy~=BJ&mW z_6xJOd1rU9Ji#-Yl{X8v_xnxg^q%6a9CR%SKa3|Y5!n_bXFsLFg#I9sJE!^`1;@8^ z>Yb#6)6|;k-4}SA^s;}+cF1r|ybFF$f*o8vLNrCZ$ASn#cwR)TYhuf?L~&s+89WoV zy5@_&=sf%25i5=$88yc;iz9b5c1JzPm42l_4W>*rfWb>AuL}zw*@(hI^OkG_Dm|_2 z^zjX8rLAE&5LI6^Uzf>w0jHAh$-`y@=o(6FRrpS;MWY>~P2VxX0;6}wa6xf6E;6tp z-jelY2IXQmi_9>~S(zL0{*BH%o%LzPx+Km|9B=T00d;Vnr_RB;fzy!nH99Y|M^jNg ziwUurB(G_?Q)7&3^(4n+EdJ2?TpPc0&q+o?tK zEJZ_Do*zn9B+Z+2<3ubPY_Th`m%W!@v0r=ED1E2}IhSB$;Qj?d58>y7ZNvYy86^=4b;cLOV%k31dG zN{-9i*Jq8BQai-Uhqp((s+M-G50CEDECuM!0&gpv6SU9T-Om|IcqP8*#fTZ50NyDz zl#d^O{lUh}T!mj)Mo?Z%nzpfc6Xo4_T}&Loi43m-tT>`|C4VJW@o{!Dg{5N)PzlJRYYG&uyu%0$n7*|6dxNt-tCrO6D3>L)`>??CoXLknau7B=U}iSY_NK|SzH3v`m`k3 zt~`FGkC5p3;dt$@d~kz<4{^GQc0ruj2m(O+;8@&mr&r)u&0d{iS}aJ3 z%~PWoDYiyc<7tsTG(u)~q=wA?wAnN&)2lAWQ*X6#?A6cP16liR8~(jI{yW>r9v6l3 z_u1c>RJ{t-_}^J83f0ozi+4S>4Q#cXVqpVV-9uORmbwNHUE$Sh2zMY4{nz9NNWE&A z{ci8F)43d64b7o8?wdosXH2@ip*ik%^x@5o2@mjX0~CGoKkB*H(2tZaAqrs)R}hd2 zjEnXtJsYNbyh;emazX4;H48EGqiUv69_YQ-$DhBxlwIgayrmmo0=5Jo#%9N(5P3eJJ4k$4l!=$G;st zdviE|I*uRS!5bD(f|pc%tmpn+cq`Z8~H4|Cok;yLBP5Dh}fs7qHDi+_2k&OO)NtUwBSJ2&n&Z zmN6p^;b~l_LgNkCJ@%#ntCYUky2I?A-F57~L;6X&bYtpOwjGF~faoK~UAS9_oVrU# zyfUPP@#ysV#>0u8;kpe@@#+WWhi)b^NyU2i8cVgoPz?%0WyV8AM4NX-e6TcRu;y{N z7nyr6!DjptYfEniYL$eQLGAQl2X4SGM8i8X7w&SSuU-U#irgttqv-~mt0V#bcr2hu z6r~*By}sQ2NG3=;T?pb)OG#u}I<;Ov*X*8STaJC{ycDO&@pFB!T)QhPgj?qgh~Ej} z4t4xm(4ga|hL(J4??ZAW3vqn4k4?QW-MkRk1E0{PJO8zSn3Ukq?ZxVKBsnI$>z{+C zyPY5Gz?#KO{x7p6?a7V5eKG%XwE24cI{x-!4Z7wGz$k8BVUZi#68*7R2lHQ5w(kkwy(G~O(Sf8zafI8megSnC7Z-YgL!&slpkJe;K2J$pMyF`; z;uPVu&-9+VfV8WG_lICVhstc#E*5b00hpaA*m);DzcKoSRVAexLKaXGjk35aYL(te z|NPb6xGQf5>g;Z30cb+Zhe>`Q9Q^NpAeKa@UK2i@4HRYz!2$yNcf;(LAqe`%8l=mR zG}%Yvs}>JOb&>E44W-pE6H@4I9C!ZD-X{xWX@E+f>>x_Y4YN=3`2m5x>3l2Gsc1bc zyd||K&mqXrW~)bu$`Oi-3YEsON2mIJM5BHAbr0))wtxBLt)b!`loN#2`yOK3LubEP zy8g}~6VwTxiV8cVwTve+rRAxHy?tT>@TQ$!(e%NFWjA|9njqP zbW$ac$Uen;^CPatxd zl*HO3uhHiRX9>H2b$o*~{`>CB{7=05pF1z%%7&Hnug~`Fx8&i*Pl#jr1N z@ISDN4R-&jeE;MA2D}<@*%3g-Oz%G=AdWn`+mPd7_1n1aR2*9#U(i%2xr;^NaeMNN z#H-;!p6EEP9+pJU-$npmA@dXj>v%6-{e66*1YSpLHw>$+J;i^mQ=7XRa-@VmR9nE7 zF|F`Oo-TwHG_uzs19%)xd>9wr(uM1ybP1{wOa2Hs-uGVhPXW|^OwJyazbyT=H-3W< z{m_cYql+s4#CTPjkYB}8_vZeKyQZ~>{~Wxy{^mb(coF@dJv^wGZk7S-Tgt%s;a6y$ z7?mmmAxO?&6b7yG0kNBvUlCpsZ$ae`K`OUQeaTT3BCkO&Ke@!YP*W}TOYaKhZIY3H zx`1F|f9ZS43HmsPlE66*Wrn>>JZ^aeOZDTwx*kyA6AI%HQHWBYCi1 zX_PD;U>`;|7C0Qgj%S~4uWTpwnYh~|>;nD@XM~ycZ8Xk5aAwgcb32v&0r2(h<>!&} zSG`e*>i-k}%ewpj(*NrJFSNY7zn$HVZg1*szuAciLO;5_n>pMc+F$P60}1Y?NCic~ z8=SGxM~B1q`s+RM?1cKjx$@&Ub$55j{|+g0vM)d!hi#O64HbBa6XH5p z1QDEtBLBsMS9O0wocrh{rH6oGtuuCz=I}Ht`-;vqg}yP!P5w0VFe-20Fg%TDSggd-!(#e3NG#2xI?N2n9K@)+F|z-1kgLsfW+r70Viex; z>m^k7)UPPisCSpRyiYfw;9!Xw(T?yoq+ya|mDYM)SYG2ilQ!6GUvURJ7dYsUEqOil z5eV`WAEG2^eDLL8I>AW;A~ar3q!=>yyY(rJJe5p|LW9DIVKO40bUpP^aBaVuP@!;B z&6f^~D%1qx;efj(4V4y%g>I}*G@xJ@cyhw>s#iAwBCToY?4-=6ka=6uP|n<)Su9IClM00!eeg>BcyQsGx@p1eFx%H8Ak>k1dGpu6L0$?bt9Pu~?+SXvtX82CX$k>0DBVupN{1k>pJZrfZux4kni*$+yp3baRf!+Q?qfF}fK> ze08S;0`^;_J*x^3vsXM^TtYfHi1e9;;ofVGHeruilHv^`Y&r zAg?G{X06={;@}`{47|06_oxr<&WED5M|c0o`F=<9+(OQ{Xb+izlO$Rp7gvxLDSzmA z3;>QFAn8u+u}N(?qr5~qJ)gud)7kqr^{myWo%0qZPlBB-#6Ex8{Ry0KK<=4I7|#8l zu=@>e2zIykp|jJR_3WN>!I@omlVz$ck(3ugG`UP@P4L3dQ{GB0@us3oA6;pV){U=x ztbTgmqglzY-Nuz_?D^NndHlvqoe95pRa1o@&YE&N^B##%#&5a5z%T_iX)KpOT^;l|1v5zQ&JbS7Mm@~wXXr*&IxS}+2+LpQYeoe|ufRam5yZ@Z4N1PE3XQr> zLp~$w?1FeHvLT>Ix~ocRG%b~UY3pN@&Hfgooza#_($2u zH(pmsmaCR)eN3X=;&g~Jn8Je=V~}!_&MbSCPObPVKL1y!Loj<%{wR*~$ZzH`vlMoJ zz}vq;HvO?ri-~AVhz)`%l<^UmgCEmESP+S)$vnOA#(uFj z2a;$q-gS9toKq5rH~I>(pYV2#pRoOCi#H;R!fTwB7w07u?}_~>!_N#_@^}uMT_fG}!#o1UTNKU^ly8S1x@u{@YHrxi z)NEO?cIKHlb-i%BdAQDxk9A16`z#$)$1i>yKlTaEAi?fX1;3$!7poUReM`-PBliOW zs#lMd(?u2N3l)eYF-GWuPd*txSUZY0E%zkl=%EhswF!vPDUVp5&=*p9mb3UW`T(I% zg=$X|L(9&4#f-r55Tb%JGB)B}M@EC6iK0a*>B`~?6Ycv>l=J=Ej*?fH2bIY<4t6C@P91im|%#SgFvo$rFzM5r_(z3@`w;O-y z%@6RLX4E0!u&^uXbgr&?!_K8Xy0k{d$Q%w$v(p_62A7j=XL8lOxv_)ZHygtLe;r+6 z9P|w>4RVHi;A@iUJ6RRA zu%RVSUp7&dy4sj~yay+PNkn{||0b>|0d0shkH**j2hcC#Mja!0{l)GYh z9^E{lL2{PiU_m#?aAv?mxZX&NYn65l zYh^cj?MnO|w;t+^A`G$rRVo1zbTuXqs>`>e9uciGNBu#sbZ!gn0Q*tnA#V5AQ=EH%P{AX%ln>D@FbnVH5{0SOyOy(1B#Fhh0hP0n)Bh zPwoLS(O=hkOKmdBn^@T3=beN^rA~SZr}Zf7Ev`Pgo^9koUphGGx#SOdhjMAx1}FauWfCGE z_lq-@F+NAq)fzw<;S-7jQEZuSIM$oOvYzS)q08gZm|!UZWb_}NzuXB zrfFYtnD{oT_%g-zyAb%Z_ni7*>w_Y~9n9fi@z8<#CDCnX5C2;b-|-pF@$nBqNnhxs zLO;(URHPdsx|SZQ(aS6?P zkS}7~ea>5?-OWj9ZuRm#cjP3?HMaQYUCzV>dEk5CBeP*uA?e5B{miXyF8pu~~ zIAIqHHQC@b|L#CG-M3IWhmM&o42U__u4p}Hvop$_0c1f>*%@g!Y<5cKGSk|0#S&(W zCX$hsi)6|n5;{M~BkW8`j&mCP+-XO^8_S_?83jrdLp~sE2C~+T%B9e6EkrL73oieR z8%kda?(JkyO6QzoHONEZmf-a0F^E(h{f!A_9V&^p))my8#Jr@EEV7&4y`E+*<3YPR zCeqX<#oBNDG~m#bUeb}^3<3Q*4uC+Tayo|*N6SKj03ztJ!Q5uYoI5fjA0du@W-UDSL25`vQA_JV(3Ll=Z^<7k)QgkGDcMGseEG^u|tUZ z@+IkFHu9JaAk{_UR2>N zCe%Pm4S5<4$EAmKCx>BB#-3tS^kN91$h2kA7a6G{cG@l*DD}JM(zXyL8Rx0~?2HK= z^3Tj&{mg%E25K$$01ccd$ob06Pi+p}0sEKT*c(p@1?t3YPc2o2Yy_YG|z81N_ zwhtMHNqsPq|4nG69a`&%WDFoh;nRm%PvdZK5fY|(MRJFc zd-0Ukjl18>pBr+d_cPlNZvbMqi@?%$+(46!b1O~^Guw+3QiKtK(P2C#;86;*b_S@P zR0uDyr4W)*ocOJnW#ULQKEpJinIw}d(o9Y_hv z2$wZ6O-K@I_DoH)u11r|pf|a>IkI~a&@ipVD+%a>k`pg49^|4I28wif6_&HNLp znLvi!glO{E7qyO=P-dvHaX1qT$S8CO5%mQHfp>Ol!b zZ+FIlCfDo!9Co93kPkoe>nPn16Gz+;F>F1uh4V7KGyG@e+)*c$smeYjWv9S)Cv#1v zu(um;2Gv(GdlN54iArSW{z7AuWEmo_Gm9Rij1UQ2NR^4w6p2yDJrMcEhq8~%-jHPH zO=La`bg{8X%Xo%Y3x&{&%pW7bY$=?fF*_WiVq_leBEzk9j{}%nX_WS!75&i|v@k8o z=MVuCPz#@F%ngSej^6zw&aW|6ru!71SMo|Ue><0b3AZWf3K!cKa>@{yBBcmmGampS|=>`7N*Fg%`kJKX=C61#dWGV~J+k%m~;M(P-+b(U`GFm~sq;RYFqVX{rP?N)O)ChoR&Vsp=_TzQIf`qm^TJen7#@(R1L>vlyFf zSEzK1jkvBR*~|X)H;dr+Ikq-NpB4)Je#oDos{0?vOVD_rGZUBJ=I5Cwd8RTmFuXB8 z9H^#VmO-&BM9Ym15BllQ{KlOxnDx`06tM6{@zT4wu5gTwF-+$|@ywBI0m-{WrPzA+ z%JU%i_~uudF;Xd-325bDz6ABoh2X&Ueg~eh&M!lb1FYQEYb3o7JmF4jl)_I-f2DSy z^&~bi^PUp{pKp+Jr%n0_R%ura@|pzlK0-{Oo7@t7{%PkAdK;S+4qZCF>p08Y(X!KF zB^$9caO@I9IXL2}!m~;@mTyfm^%*rGqg$?Y?ug;X1g(DJ|L&_ za-V+oZR#}UE)Q8iYzsa)h9*ZZE~)7%+j5i&`;AizH~(%USMegh(<~i&Yl)s7j!fBe z9mrliQW?s==8*(=Z~oas3FRW8SOn+Ng^rOeL$$(aNrboc;=*yDrCM+dMJJmQ^{sfy z$acH-B=Lb5^Rx1S*!7cwxekKWSq9{khDc!~n_4HkUDQXBnFcxB;+e)$FG-q(Nz|;& za&ik+h{ZnN7S!mKM}cI@_s+3XQVWcXebvj7=&ZCZW5`Kb#r)xY>R)LMolO|LXW0zN zzs9-AKIgF4`mn4+E$2_hpvgB+1sKKr9xa*X7$!plSK_5R|5e^TH{P^lkjM(A3KCKB zJZFJ6(M{Ny9dqW%e!x&f>Zg0wGoZDW7czK8_D<_|S6m=&wdJRGft|bus!B|HN)By# ztyovtxau{Rj;(T(kN$q;MxX?xek_l0D#y>z$_r|8qYqYK^-1riy9RZZ4ntRK(J^H8 zvSpw*7IfJG!jmeX*aFW8Q20{d;eVkO^1i?DRXs66;g84gV&XMtzVR=%IQ5jj@U8Ik z`(oStT|njv#$VYNn({rSFEpsVnJ@eeeHvft5#5XLtXqN&mmWOPh9wd?}2!+!HIX^#ZOBwq~pyxo7Hkm zMD0~~ku2c=dAwctROF3zp;bPZvL9K9kN)e$*^>;&zxn zsg*Q9p)5p_Q0r-iWD&0A5n{(^s+5jgR3Q<`gs#g;D)pMM6ue;PpHWJ{g+!--gSrG& zfYby@QIj;6!kK4X3sfP|$?R}lW>Trwg(WpD0{?`Qn-(E7!~`a_(-e`(rC$@8gxn7N zl9B=@BpwNfb(zQ@S`&oIychfuQp<&q=v1;&m#I>;y0Dd{7ZDJ(LLS5ft&9F`Uy5)(jcK#B<3)2s_2pJGXXQ=(HR>=oN(n{fKf<8vFW$|Kd6J_$- zYZcf+hFU%Yb$Kels0mR;#!-GTszDbLqzV@5qEv!X6Q=wGuKc1@fh{CR`3%&>r~sob zM7f!81tcgNSWJ9!(J8W%3{V%G>`cM}qLU9TCOp~r6!A%is0&bDK4t;Y$pjS>nmlBR zxFiy<35uTfS*iP4Qr2w22r*e5t;s@RagW7pq#hn!sD;ndcX2Yak(^wM46n zr7gkQz)Q}%&o2n+z(RtNj9wR%Y=D~J6xJ=^7ot)ogaoRPle%zKg4F~~YT?wXnlwwD z$}d={phAL_h+G$(OyV^`9n+GYW&0?hI)~t?wDZ}5EVtw#sRErUifE+k6G04EA$U+L) zxS(*2N`_ za$Pu5ik|V$wsPL5`0+)9;s&B;8Y!Kmh(!+Fnoy)whU1ruL`b1IBMrAM9eJc{0+Lim zk6%2}0EL7j3AHX7S%hnXkz8+(UqI40CmCX#U;B`@-OkQbF0ddI$6%&>`WQwRH60ZwNayeB2X-P*G z6PaXqiri!)a0;(^McTH)YlAF7c+KH?h1UY1EJ*;R8c^he+rsv;KjtLf(ME`mB7>ls<$n#%`ZF&P(p%gjaL^+ zdy+K)oT^>g!~7&f~m z3{}PL`30no1EJZaijBG;l_AxHd(4g4w#p&DIAvlA2~Zxe{b*TV=l{p~E6i%3NTmHq zA?>;XXw!`!je^a_n@4`IfuENCs?mKU_cAFDQcV1^aO)G+kVd*DAX86Db&cO5Z?|#R zB-KgVdc*v4RSmk3*i^7km!J}qnlSU%d|63rmD^D%U_zpjfLND|45Bqb7^E8QOF%51 zyN;K>&p++yX1kA?MI7_bDEY`jB9aYXmzQ*en(&TK8k*PQ<`rU*jz%7k*P4=cvll|r4ZtX_PVD}O#J$kD_7t#n7EYv5k5)`&Di-CJ*TQ>7PN=0ub zOo=QY!jy?p6K1|h7g5f$jAlD8X~;rCl-=>V0Hq_;glEDl#&}6B4q?2kp3Sr><3LE5 zss^GiRAopt;dYEvxDVdWUmmhu(@#Hop1Rv#eq_D4e}awrU6gW0ghZ{Fo4UkR1J(tf zZI+mV-)`658RV{*4>7STWriYkwRm-*pPKF0L9jZD)KxPgCU&*lP~@%{uqJr3cf!o8 zpXdr%5E8aBKI&pt2UQbr$E@tm7W;X0?`_xa+Dm_+;Z#dKGkd0{Sy!XUWYC-3+}!d9B(z5o5=UFOx)fSdLLY*wyi&Xe zlZ`7REVAhf2N5dOuB-M8l0l7!ck0TBT<#^4m9_?&Jlx+aJc1SSs4E2ajN zYr+|1Q7Gz9qY|Km#L*hBE{FCcaRD@)bo^7J)Pv@5%>~gE^Mo)OlSKp~KEImCp$SUE z;TMO(M!f;G+F%=6`C8!K3-@dAjLjEgy`Nt4sB_P#K^GE^3Kr@@Q-UHSOtp?qtbfgr zr3tYKyqEwRAqWYtsd42uhnN7Hqe~NFQx?Po*%*aanBo?@wFH|$$`G44F1M^2kmeOo zvhFp#me8(ExJ9aET|t)ECZ;14hiSZ$3qgs?CDbOg5tFk=*2X7kHyi#Fbejyr6^&H| z4iNfyvw@lo5LKvjkS2pg9e?J1Km!jmLoJyQjV^KMqF`Y(87Hb3^4mDL{BFA5h4iUa zB;8DLsFKaeHW>rz#F7?U5Ne-j6IVr?2?I)2OcG1wWe29Q7B9&Gj4T+*vBUJ`QFTl- zLlu+-;D_3jrsXGJakYG3qkX2LDt$#1GC)r~VQKkrkdCVAVI)I;WIwKD%t0lu&FK>{ zhsu2HaV%xahrD!?PYOHANyWj~7f4Jb!VpX@|7^6{CLmx4MM0h?I+Bb$RgA5U?A&Aw zkw{2c$LN5HG=(g?A}gmQYmcH|`Qbd+Z=%)#w{$&Hl|`2^UNW*TvxaJz&goJR+H&db z;*^C=QpV7StaUYwu^6EAcL`bNUZe1FeOH1hn-yXG_U?51e0o=JpD4{ z6_8?eL}oQH7KXI?a;*8@D^Bz~$a)bh9^CcbYnYsrG1&(clqQFD>hWJ%=~2cQNvfht zcZtXh2yMKX|KerxFAP|to>09%`GH8jc0q6aIlKeAdv-%FY(t-_ zTjcuVNMAa6GC90pxA1nUj><WjvT^$c+2ZG3yLE_q?O+V6P^89#0-%mo1xgBA z5x80K%iFZWq|W?KZ5)r7GDegNYWA{@#?}l{%mlj#rho)xp-Rvkl<=%qSZ&-Ve+{!B z8PYcMfQqPh#$=MM!_2{z_v)>Kt+#^>#jC&Y7MK2dt#CpZS_;r!{pmgGr}UvetDXCzeufXr zfM=QFkRoZeb2p(IS7wqoTa2!?cy%{(Z!rp9Uc4Py)yNsE>D-|%poUomnMU4=R0va} zL8L~$DH7G(QaS^>o2C%d@zMtti22nk`efRRJTwdlZSxja-aO8h0Oh^lC z4-vOS3Q>HMMsGa%2cZO|e$0<>jfa^-qv-*2+VWcQV6t)5k1QQqQyyIQ#p9p9VBd7w@qA;{AN{Fa3MdUAv@ks0J?HP+BQ8UKeFn0 zL4Hn@g%I+ya5Ac}U8o&DBdVhB_&LY}vWi>z7KKFkkGd#`p&BEOC_e^;dy$QFRi-Kxp;e)HnK{Ftgj4*5Bd5rxQ)W=IcALxN43UB~bvs*Bp>=RsN^ zCqJZw*iHd33E`dsXfh%|1>jl+g$f|GjuREYk`Ow|k0vpilpj=KfGIx{hTND_eqddL z%_d2_uiC&WjZ78jZzt{VS@wJ|xX1X?7V)bB{gV{Z%8w{9%2fbVcHpZ3wA@%&0buFj zvHaL7B4+u~cvqpy2>)qUphJHBS zxKC?uVL!cYf4(kAENDBD{bzTxSbMvJHR|4wVD?+bwxhYdl0?4?NnrM#9ca37YdZ^w z_IIQCvvZ@3asWu_>5ynjf3*+xp|#t&2RjOO?#de-!tRghCK^1{hHnVN_Z1FLYj0!> z{EZ(0g^d@-a}zH<#9u=d+{h0$hr_{sa>8!x&v&-=Dw@9YAf$J>uz*4C)y7hOsNBSW0E&4E{-93Q}ZcJGLK7 zs@^9)DX9ZR``V-Q_0B!419#z+webqH5p>W2MXXAVuZOasxcXJ}xo2|h1|$;=F>g`g zCkl3lcr!j;`z!w`eg>!M`t}%Q@x}c7)7JXGlX{z9jOn60HX!|Uc;(x}5?W)n?T+Rl=hEC2Oa(UKbwHg>am%t(|S9)*b=t zg`tOs&78`2lTBj-Y8ZE&VP)03-EizynrwGvBVoNV`wP$8CU4`5>xBgK)RHpFwZ4R7 zM)+LNccSZA4Ci#=Xnk0TScCIQOUfA6 zhW-l4)|Q8Cx@242>eM(K_ow9!a7_`JC|GYyt==0j%yHb{?bF|*0T_b#A3b;L!!u#? z@84myr)0ZrP22VNynLV|(r1rIdQ2k&)88gXw(?*Ey7A4v@?+vt0pr4J#)fyVZ$DIuzco`F^+aHc>e% z5Oeuz>T?=MghBh$U&C!f7}YmDR53N}jzko+H-jf{KC-&{Fy-5H$sKM`--M$l*yWR!+?evN=ohlZAYqz8V4eg!ohXuWhpI-PL zNshyuPSv9RZk?6|$uB$R(c)B1D1MP_xJ_ojDMy55P z2qHe>NE*$Vp~MCWS8!dFF%}*UoQ#}md!Y{p$StVWQ7@1SqtiiIP&^UgBDiZJ45%_b z7e-GVPMks*4BlobrB>9ClG+p zvAHPo$Oc%3fptgjLG;2jvDv2NIDcVwuo)-UGXh}PR5N6Hl`hOKHo*+34!H}n*GKe3 zzDM)I>|--phBNrW9H3KKn#cUY9AXo?<&A}P(b2G_v(-h*MMp>N!}%|&E;zUX!^>+o;uOc&c-ihxQEVc)y-UrdgmSASi;lVtI245)$QoLOQSm(_B5k^Inc+K-JW5NFDKUJ%?)`G`elNg z(e=IuMfkE+AP(K;By3qwqC$H(>K-ys@<32QN`wLLdwJC86)W($Dw7{{2d5j!{w*;g zTmm$g!7f)#ZK6HcwiBICS-{7LZMGz;B^-yaose9lRB7^BNrm_DrB~?XmmJ zO`z1ScPsNnU7vcXICJgQlVTG7+$BMp_g=VPN4MmHP%lImp-=7gLD32(1y8wVk)wkz z{A#~l6L3%OF0vo(U=L-|v^(7_@GxBfS1{Kg7r|2;C;x>j^y4FNcQ(5_K=-@m|4-iA zbT@7zVWaa?vY5ran>qZDWoaqv!|lW!cUs*}G8-LPqTQO7C66dOqn!80-vUX1C=dWa zqA2%0?<_Kj1yns%D15L`sCoglvckRWd!>jeUcrU1(_ry;OqcsCh$@ZK@2|p$%H6rg zcf-PxM!ziP-%g`ng0KDj#pC@oq>`vvDtiG0&pblRo385ae84o!H!1$hP_YL_O z$Ce5v3}#Tob)D^9gYk09K8p|cL-wA1zk|rnyJEVO!sw!S*IoFnG! zXWO|r3i)v$TS&RgAej=n$n-3Pg->x1*TtOdbX2E)q5V5Y326D)Bx)4;YVpCnTLi5qCaPdu3yiu@T-!%L1W&)8 z;h6Rt%LllCyY6rM*X??=US}sxxKd+3GG`kc`}e_c{!8(vSukF}A0T1ie9!)xyY9wL zi(1$nQ=28iDz#iq1_1TAU+uS}XgT?0aKV51-J&xs9jz0-1sQY?#}?L$8O!%~U2I`@ zF#CDB_Tp0_|CnhCIAVb{pbB|)gjEq3e!Br@DhnV7$9q$%;f0bJhe^P{d4vp*VFB1& zOCL*(8O16iT?(G!PNp&O5bphRhjihsfvEUa>d2H_O+LjEOUcKBYf#6HbTaVZRY}W~ zu_||G7~AW1viQ3Tni^A-rGeC@wV{)0s7W@{)^4Jn=_M_5)iIxG@sZzH6D&)EA4+yCZGQGy%)$$WBdiX3Zm|5r`s~H4hh1B2fiB!xVtr;zyjEvN|Jl>G8_9q6 zANWr%$zm{q(oY82Mq90;A&ZbM$-v;Zr4+GQTY0z*%6-aaR6BT4mRK-z$Rjs=zNZA& z_|ptr{aF^^!YABxDnyY!I|-z2_M;ohUpXQzNw%P|tq~Hn$-*&x!JS3h#S_0NMcErJ zpYqfVK5KKRO?KhEIA0bS5L<6XaOYxqdf%FC-~0}qY*%);?~pwyt>$@r;qZXEt(J_h z>+#!jwibNbl-{X!OG3=<>QeYjQ=irrPx;w|D%rrT1Nb@G9PWFNJyA-7qH-&}cx=tg z1G^d@y<@hMn*xDzqtMuGQ=R&?5raZz0WVs{3Y`S*Pq4i;sGJGSd*e#KGntiGuXFJRCnJX$o54u2Ls4LOANc zv-a!~@FXH2Au90r%WS^-aylJ(knHv8k13RR5QAZMYrPAcLOuob? z_x1B_c7q`X(e*w%41b>A{W{&PAbZha9QN;Ck1wxBNCEb|JRUc@Cw>@MTXdY7piiAof$!L0edpBQQpGF_9|Ne8Ctqc~&>yL@Iuv8|7 zc0lbaaGIIc&F6>I%IE_uXf@&QKR9sPR{29ihpaE=UG+ytUTEFz@dmuL5mRm~y)vPg za!nubbdJSlk8u&p*JZ4x&@_6_L%CaBM8$3;Z>BxSrk=pgy%v19di*w)~v)`I!3w zz}eQ%hy|!K4QaLK7UM2`!s#u$myM4!Dg>X{@|a}bIE$ACU)b-2$TkwB6Q&;&PB6FQ z1ou&VE+6t{4@$G??MK2Y@(=KO2Od3J^K<T+ zy;89F&CY^i=nVRscF(!6*NV}ck9B3L2-ay7K^>lCow?ZHbOO)AkIM~slJ84j%0&LK zvkt|WM>1^w^NR>97zbPUPbsj#G=akal9U4m0F-iv%X{Ke2keKzr#EFAyh#Ec)N>8* z4-U^T9e)`08MZeaKK(J*Iz>gWk@fAI(-Z|KetzXVKOS=1g2<-h22!$|ZB11dHl(C9 z8szvU$-^sr#{Q5X>vq?34d(m|Td>Q_`vHu~y6*odMr8$gMx(OhID=6+>^ARdQ%>;S zd7W~=cn*tlf$@VFRB#u=DfMjIoOP0=X9i>6bM;`NBEp$JIEA3xZBph-C_D!6Wc>lY zJ%*oNAGT0YI9cCAoNM7ufE#{(+Trii`8UF)uAi=Xm6Sdy6Zc@)=^FZ0nN&lV?1ZKE z79?C7W$XD9Z+`cZ>~2PoJBI5UM_=d^#>rLtR0RqL)oP495<^E@8asVg&H~<2SWE$a z`nT!$)q<7}3zqW|;z;JJkAJRo!6cpX zs<`Y4xWVg9Wl_u|4bCB{JMV5JFK0<6^La$BWonT%3cf9O>oRk-$gAdJ#Sn83iPDTg zl%*|^a{*a`9r8XBxwoG5A@}_;IZd z12#8PE$T>A%~*_V`NoGU=zI&z0)6CS3TykX8)8`slUI|fvDB+SR?j)^=bYj z>5P?hl>Re^^Yq7GKMk_Mgag}XB#+R1HChc2r0U2;~+b;bbR|EZ6r!`J?oog)Dh9o$Ur!MJlCgr$)`0{WMa6%1_9uo<7uu z%+74fM5TSE18WzZq$~%=OO`lVA~=6TlazhWNWW%`m?GH!fMIdJcb9(NEdKty2^N1J zwo@Iia5ySVW3*xsKG}DTJVA2GoNg2^*d^rV>2?2_jt&Qydc~`tpHkRv;B#)X%6<9w z5<2$nBmHMaOtx}4Kf2oP1ba=k8Ccb*_L8ZqDYtBGQ66`x;e2hCAPOg&bj8+(yzu!B z-a)W$PKkmlv^_7Ttz)dD$h_I7%wW2^ANnSOR4XCKll}%X=OKk z@}K1`_@C+g&wnhIX}Vu+AhLP=(`pa?8+cK)TP01{rctoS&ZEC3e;r}Z|NXFhf%w+> zxMT8Ze6jejO!KSF(e4EQ{w=G6krc0xv-7Vc{Xf$*3K#h?c=MKwuMV5_Q^LByeDK%9 z`~!&mo5U}(U}1~-hZZPWwy>*-)E=ErGJ`1QfcU<_iMXY%m{kNWt~|SQ{-rp5-ayFh ze)j^5ZHEc6@`OaWaP@O!Vl2bLb&(> za};?AKPOMXG=GoTf^YHB6K&Rue2&2v`v836S?yvt$I4Tx_x0<|{4jBMuP zvD1_kjk;!9cSoc>-_18N^>6IlBmaRNxHT)Nkg_Ai=k`?9t^`ethrpthFQb$x`Xr5< zX5b{!S)Xi^`L;VO9O%P#^lj(Tuu9ZoCK(Kcw52&5o!Gv}Agi*#2mk75mw7&CeV-~_ zVf$%1{ew{y!IvcL`8)XFhk1Xyc}!L(c+Ma%J@bA4*Eu}z_%8o3A9wL?T9Si3o}NEs zze8jMKx4xZ&6WLea2?~M1HeQfjIj*6=J z25&|UM)^Z!kpGzc@$pMTSjAB2#-aFFg#*9}2CBrzvVh<2pYASlr;w!kTsM4p8OGBZ zic7)QO;JNg$0q9}$ct=%x}jhn7FqM_(wg}-LFF_ho4jbGsrAF}qf|L^@g+{$RQ&Ag z9KCB-$*`ARS4R!rE}+=tlyi<(L6!iqIK%Awh&f?eD_Ag|22g8h`oEV=zL9@Umg#<{ zBa3#7?7f@{I5%4e8G!N!C3Gk80RGiJ(-;*w)>| zWdW(|@Hbcfz)&TtHp)&pnns3QA_V`$8$9C6E4rA*&CvNGv!RNl@&v_3S9E|PZF#=d zkC3mR(w(gZ4ZM(<#jrlGp1CSGZ!Kww9j7CFw9@*sWzmEoNOUqV+D4jH!L8q=oGYVV z;R03Vjzhzaul){Q6FAu_XU`4G1_-%$v;Xy8;aWjEWAVF(NN?Tp#S44^;~)yh@nkTKt^)Y{>BIj` zX0xjpiVDw$msex_36$~TI}4A-uZEL%i3SDrs#;T_RUb0E8?-YrHhjhNX#jqDR-RX} zC@&L1gTkT%nG4{ZVWh!456i0w(*2QunnLL7F)DEk@)0B$X7ATGe<$lnFdC)7B=Dja z7ASw6XU=<0QC!yMi-b7p8ZH;PHEO??i_VLqm^C%c3|n_)eW*j_N+*|*-Ct{OjGK54 zRgCOZ;L|_b;tjYYUZskK%wkiOnz;?86A7ma_Kcr=v1r1ie-C)h;^Ak+&}NzJeeV zrq*vzx}mT$LnX%uxwd8gitK-OmqkgA@0=BH$+PqHEL-+MenZT!<;tAMdE)0h_+A${ zAyEm;RI>cXE=1xA6n6m8PzAseNxN{ZRH0MHvdO%QLfJ!;Kcuj0u6Ymb>jM>ZIW%#E zOF*!|Gl)!i+d!B@uAhn>u_r`L+>;VBUN@)86V8&5fyBVEq!7ipt9b}r#zh>t?bG!% z--q$no8KY!WB=Ej6*nF?QUFY0xOr`&G8gb-F(1Nsu~=oT_-4o6?49u>86ekd?$a7*JJJ&*1rxUHR} zdZd(|95ffw;A58>J_l~Isugc(1Q zul4skFZ|4{Gkt^SJzi9JS}Cpr_D$)xCWIjX`ve6JSp>HiHsQGPqJkno{3!LLSQ20J zbGTG!v=Z}kaPAcFnabk3Ff6_m*hKJET>gbgF{Mh^u)nQF!u^@y@RB)V zulT^b@Uq{f3EOBXh9v4$zKJPRik(ECvcMT%`_AM~SBK3DTj_F|YA8UhZW zxF7f9AQ(-?v)Q0OgF-wW2%>njeq*D)hJ-E838<1MrSXCRSFpu7pRdyzM#tn?=hWdn zdC-_8GAj-$=z-`YfmF2Hl+pGQLYesaXj($p-T{q8H)e%c;;6VTKy|Je+Zy?Ps4PZQhI@~m*;D!VF`7Pi%fSD`neoJS z;&(w3q8p>Lt}bJk zCzAaEqN?6=Y*=R2&5CK{+cM=Y&GUYiMBwQzA*3XOQT_DR3+mwx5|7fm0<0YGB&b#C zdi=Ja0CTrXzCh|mZsys}o12*&fmEdvv#e!m=oqKTBDM-!wNruId#?||Rh%)GJ7iu3 z$xRrEv!v!UFNv-7Mp)LJ21@Z?oF#eSDWD`icM^IC67tbK`$0G2FJ)wjNDRK|U^-i- z|4=sYsv1M!yiio~VMnM?CdEIqPv=`7 zky?LCfdWJQrE6e{8bQv>|04HgmjT%4Wv|{fot1k8sb!(6-}XI^aC-r< zyM793cTX?S)%COk*qSqs7wD!-t3jl*VhD8!JI;zA>dPmUJWAo7r5ZW^(aG?%=e+9Z zeN7>C*|+^>#lt!I3I4n|A{d0tnthYxk7nNG3>jVO-U|IdP(JJr8z{I;@ck_<(IOoyQ4jO6GZ0xN958zRql>%)Gt zme=phb&#b}I4_v+Vv;0K)Mxjd7f|yW#->|&4D4}Kdk*8%62j(b9Ar%)mDj%In4Ep~ zM*%B9QYIgTe|y|Ko!2ztFpt{jms-q7-f>)n7qUp1a$aRb>|yBhp2a{e^Xt8zf1iug zCuf~Ap>S-x&y)?g8zH|^5Lv3bLu0$&JU<$XAJ$$Z;jC5?8Otu57Y4Ws{`;DwM{YDQ zjiB^{KL+X8XVeTq!ts}tN!X75TUgl_{!K5Y~S5Q4F&p4;k< zHy)}L11-xU%88KLlo&;s6;hijhiq5eKP7h-IMt3#1`|Aw*=&*tzps7uBEBEP+l$8& zpXTgyCC_V7RQM&D_6?NP;}fy^Aypt_b%P1!fcAuG*|Xjkm}UE_9m}G0bVp-pQ(2vr z(IS)Pa;;8e`}UdIkYYNU+9qr5%1~|g5G(5pyDyiXF1_Q|fVBp=|4yJTGZxc4GZM>i zsZPIqPIPxHw?WDC%Zu%xaQD$+k!Gk}Y;{V?9ql01o~lh)#1Dsf7E{e#34H9fUU&#$ zbHGsv)Ig_E0RHr=+sDXC0XG z2JZZ;6XN|2>M!}9Rpn8D&l-7D5=@4t58-8T?mFWlZG&^>?aBt_9qhvZr;V}HB+0AG zZN(GG;Urul0YP1N=}f70|JCHx@&pg*n#K^oe*-VASk=+dXfWDt*U3u4CV|oD%Gjw+M~04yv^w3?P~ai5g-u6UtPMa zX*KH6b+M{L-=Ri)T_=BWrQCZpQc5kY!l8CGGD&UyMJeCZ>GRXo$XD0hDs+A48coy@ zAW)An#a^9aj2-PNv2?3bhOw)^8r<{w)u_dtkX21h$keFKofLr@T@x18Y0;IAU5V~g z>U8Kz$zO#v=@@GiSJT_7uG+peN~-DaubMKQWQ`WehE{>)W;L>vP5s5t=d-L4N#DsT zo~cWXsQPXMVxy#+b>gDNb}^Nvb>gAs{$er9$m%5C)reF!w2C7)s}ZGa>MsUPL0TgU zZfq4tZCWD|ZcZSUnh&*3GPS*3xN7S<`P3c+BJu~VW!<mF9KqQ#$yISCgN(M%tR*R^e;=*65<9KY?mY z`IYOGV(MpChq+gsB1}CARDiM}XE*vh8+4r#%suUDu=T4`gt;$)D$wi6GJ|!U9t_>= zN-%b+(}1BPf%weGL;`$rhaw>n0wV}z|_-U1u-%&DZWll4PK)TCmL4OI8vxl zlM@wxmEpWQZW}0iwqD7PUcH^s@u)9+uHoV@Ze+>DUSk-xu2y@ncdRi3TW11w7*ojC zDZ|*&t_n-HIzEEReJ^tXL+9P|GATIT_RRtuP^N0D9{GV&|pO}_= z`XRx-HVwYSyOx=uMt~e0TUP@>VkcI9slP3~yVO-dYDrFS>{Q9$ZfxnEYu!x3F)zB2 zfFXyu+FsTqJ2yd0Qf)Dr(o|ftfva2vh4KkE&fIP8&?GOPES$)RZDcgxSSFG^*_n_> z&3~=RAtSP7AeH)o(a-1CRcJCPQ`%06Of~`JKKkrXwjQQ@DQcfm8)C5XNN}j=VQ#A? z&o;JnPIPUi;FfCH*uP0yWHS->6vjpxWpn}GTv&)ineEKju|74hv1>S-CC3#jzs=ql zr9}{<)LgqtbLXcLnqAXPgt6DO)5p_Fos{LjCKIu_qvM=a*x57unz^}7>vF&1g_sPjj>ST%x5dRnlde$*QR>jV%pnD9!EpV{pEux$Q7zOuvz`YcfhB zf!ZX>I(szaKr}M3W(zd-a#?pI+lO1g<%!octmI&m8|tzrswkxP?E19HmeN!^+H8(0 z9%0b9=48Gh*w;yOZbCDY#^+-79c*slrbVTcMw=>-=jSuyi*?UVtZJ}5D9uya8M!&6 zpOgCPCQNhYlKuJ5ahz{X!dhA3Ev{ZmH#}1--fd;yuE{{B@)5RD%@${D>XzBf*uDIO z$IpGu9rPK~)b`S#HhAVz86?B|3zeHtTzxJzV^?uJ=J_FvE$unVjNQru2!Eb$Y#P^P z+cNePseAbTTdYfPs)lq>YBy<=eC^0N#giB-cC^r>tWq)7wGYNYWeXI2V)ZzZ=|N5s zWn>pSZ_;w?OSq?Z~mlqaTd!92YX8+{OzM_tB5X`e^~C;+vI?@W4IQa|GE5Sg>DMw z^ZAqR&krYU)9PO{1ld3G4#E^-#|x^TMx$W0zD7H2o=ax_q>!|pS@S*%cKLZ!`f0~_ z{*a-rFfruol}6hvvU3S#ozMj!1$*=3CLc~Q5=}1wia{3ro8JY@pL7-x@$(8lI2MkZ zOc|4l%F=RbU~NrqTyo_nk59cUP!U<4I3}q|0Eb9Xa!2=JtQA+E&A}wC*{UMEHOcAY za}C}X63wbQ%&3Zy4D(e-w>o4E%eA2F(pYZ&{SQF2ef|i&!@p#=naVV%i+L#ES4OP| z8~K;Ra+fYwY*Cg!PXx=NufnlhG?;eB5ZA#7pcOUinEgZP+o1YrF?3pEGzn$!=+EcX z2?NU^QmC|y3HhrF26B9xy<$4iBcn4ZlT_WQA#9# zX%f=4Mw=1xagI+TD7fjgoLRh>enZCG3roxEd%&NZSxv zN65i7oQ9C4KFE%e0ebkEhv*WL#~!Xu&iuNVJW2_=tyf&0qzryYN>R*iG)gX}2tZ06 z+Tgzq_6POSJHLbAQHGQf8C}VQOl+6kRK*!!$S!<)CY%l!AuUO>}-Ing)u3mate|qWY{R;laenFkEw=xbWr3{ z?18o7%2B0+;yT8m5^`)7DoV)M8iq;9NBIQ6;i#01>;bHVob(~DgbZxwfBIcbAAC+I zjtHm?#v}!_#4;fhrmDD8B~GXbW3ji@^c-BqXJA6eLLW69tR}QpWM)HdQ+if}Dl22P zsOK7@Os<%cI-xQQG4c@EJtZq$CYB2uGm64wPK?OM#UNFiL8?n~HW)!P>{}v#C)_vZ z!_&3ZaMJ|Q?H>0min=qF9mEK>7q)f8pesw#_(4ae1kr?!oVtuHbcN7aq@g1KvbaM> zejP?3IwB|?rM@wVt_(#K9!Z3vBUj&eMOQZ7(TlE(gcd#SHC=i6M>aZg>M+jH6+u@~ zkBB^NluF{n+U6iFGN2-`hM|NZp zn2!9!)nWS}2uDtxMrS%=2>oI;9k~!kZaQ-9Fpkp^0bx|9BggX2xO4OMkN9+z2|Xt6 z?DIdQhz4~Pi6A!Am6d;_s3Rw`xKT%b-9?c)0-%a1b!A5qVd}_?EZ)?SpEd(yXLH?} z4YND0WRa)0lK- z$=;E$jxy56#X2&sW=85vmtDooI!anPhJ7PwT^Ulv(>n6&BD&U*wfJCeA8YH#i8}Ju zk!|@+)jkf_kyQs#xsIHvV{~2F5=QL0vZRXNb>!DYG;dSZ@}0eBY_B70VNWt^k)yT4 zeWqB2WVTsEo}62^GxoJ%v7_hZ-%!^rOM2WLicVvK9SxvX6@C%Ijwm{d7k1>|b@Z?! z4B}W~SFXy3nQvsVD_iO~V@JMJQOAz#Y+q#^FEECLy`3#+au{)&P(4SD%52&O>NRE6 zna)TfnH{Av@@x^;?8&k-z3L-`+r~UQN@-@=v7PD}cc$Dj%D828w4*)|pN>^n^6E@& zh9F?CIBG{t+E{nERNL5gJe~&D?=!f?$J}_o-t3-!Nls}TF9z{=I-2!|SG}M&n#J*G z+>iTl5R4|{*=*3C-QM1%!F3F+N24?vj9=5^{&|u-ygtp32Ou-v?;r#Har3ZEYRlal zl#yGWKe#vtM~kbCS)N5 zavDr&R6~u1MlJ2;dlxG4L_(mBHdZ>JHV!Wkt(BlZW3w-c_Vb2lN$C_?2MTLv$DJ$7 z6Beu8L+Pxb+rtfot6&oinjgW0Vbd$A&3pLnwd9G4Tuoks=J{o2 zup}=?trbM!S|vLT5`!U8O1mwBXjzsO;t9lG8Ep)d=p-og;Dw>J3dpWi(%=Kl(YOml zt<}@Tg%_EoItJHTX;hbzWP5i9fLbf3rle|{Re;K`N_~edIWXI+i}*fY!sL0@=?++X zW!Y*2zo%t&hO4!zx(<>dTjb9Ow6!uji+DUTy(&8m zL!{H>xnQsrYh{VB ze>oD}GxlD><#%B27@WV-c&2!Q(0#h8$v28_z_nHydw2ie*Cah6TrKh>l6~WMfvCND z2%i{{O~9xdQ0NBSc;A5=gMU-@(5hE2 z+pLpA+pJa+E1J6VE61bYj)bVSdP0(v)^vtL z4X3?ghVm%gv@U%o4U*q!h$`2)1gN!gx=Z{{7vsq9Q>)*Yd0FoKo1m2gMTB9tRv=lX zerYuQ%&QATt<@9ymrNj23@w)SDj_IXL8lX1FzuB>Q89#0E5vBptHrZk3*B~32c*3+ zVjj5C-fbt2p?+(uf59GUWZEm_f-A(wl|rQwS}?7ZLRct@Y(41)Q)?AKxQ3X%vn@LQOO%fm@CptZGm*2R++NY83HnKf<=hY4 z?bStFH=0gao#AS)s^QHpJubJ~=VW*Mv|a89<{;IreV5Q$E3At;>~vo(A&=4Kr=?%_ z$IU9qUDR!_I|)8lhAJ)=Lr#Rs^PJEnwANPE3si;W>9d*IzU;pzJ3rm=GjK4CqL%5x z&xQ~#78~a>?^WhOsXmGsL7~61L2RSIxXb1x#%nyTdOb%3XS=ngQ!fb z14OOW6JHkU0sDG_7uG-G!TTH#+beL075HNwz0U)(wGzYL=;h_hVYy3}*)#TcJyMZk zX|0mzVzho+?pDcqynlX94$P#G>V`)X0o0ntE{jlWMqN3tzB}s|LOAXCE4AKKA8$%K0bX2+ty6{$D$KB zZ7Ofh91mW2gX>a?eW8pfn)YVz&I-iQ7I`n z`|>2SeuoJm*q>G3wtO()^?7L%Qtq)mQ5Es=fIwcm#|Mj&SLJ%Yf7&K_+O;!}OxGn! zJhaqV-472;wPiH?N-KCE>#7id2PBb;S^iS=NVD$&rHcgi6mWP1UA87)ogg;y__#kj zpLr1=%fGIwWd0;RfZgoVMxZvGzS_CL_Y-A)bsrc!4FI=`;&${swrug#@m=;M>XgzR zgCbtyw9nq`!M%&5%^q;b(jog`5FrG4I-1?fYs=s*4-j4D_4R;6k)YOtJ$+tU4=~=D zRy}xkl3>*bPY0PxJ>XF01oeTTe1zq(A|LjL&ENZ7i~9_6DD5Moe4x-}XY@fqnf}lR z2U&_i9}u(|{5+5lCGPV;K$aiR0|QMGIv)T;$=*C5beB@i0~A?OFb@m_`L}$y6J)yb zVNa1#%7?#a0w*8V-g%pRn2T@qcRDkGe}a`aLVmth4@W$d&|$(K4^+gtYCMp5riSt0 z+-XJ_4_v~r^FFf%GSHOiIy|ae`DlPBWrzm^!Xy|zD5x_`_+X(;;NXLVJUM~~m@aZ6 zc)*FspY(fx>GYkv53Ww%pL+l!c=+qXT|CRn9oXkSDnSIIT(s}J&aO~+@7u+od+43` znWhgCp#JbM!GN!G^lbb7g- zKgms>o))^MCm2qIc94>SF%MU4K(** z^y_@G$zFyo4<~u}!9MVBpuDGrEDHcq|CaF-V;4rUtEz_h>FR{2GffrQq8K0L=hGkC z`O|!V`RhCzN>FCj1d+(V=-T`g26qqtVP&1)lJNlkb$qqoZ)ID|dSw<1lyxLzJs_mD zjTNmrkXMD2)pR;$gYe;?{!s#$>!FMht88$#w#e6OX&9+-WBEldtfF{vkQNf;Dyz2p z<1b-I!AL)~vsE0+UI@DwT^)ZKu;nKCWpm`w;rAiB>TB zElMP3kZJhw0IPgOk!4(jm3SE9o(iDyg6 zyI;ZjQ)y;E-hYGAlaD7pmww+Izk%szRjOeD5Bhn5F?e>|&sYC@_~Qot^8#AIv!Fkh zzsy3mr+wcXi?8h~r=j|LI_e@>9CX67VAcR_*r31*|voMtJ#a z_On>T|KIQyOR1MZoK?YwwclzH=iiFn8BU|&>`*&Sv!T&GVqLZUjt^+e_-6B7;H)F~ zZr~io^GC*(26r(e!WoUy$S?0U{!XBDAJ0NGWtdo^%&U5CTpH{0#_ z+j92=^&azuaWe>|_12KZ}5V8jzvO9=7 ze(n>?ab^zX$Rit)`l;e9UZg%X%d?mlqKo&T@FE78P|8Rv4`40t|)yzhoq?I47j{^=DN9u2O+PA6|0__-#J$HDPfku zC<@`M3YRG<+@oK?P4PC#ZaCrEY7}2y^sjootHER#4}HTRm2`}%Lhs|<#l)`luzkRxX zd;0R<3YVC3$+q@xcwD^X!4c^!f%vgx-3gZ=1m5i+QpcJ6d}CBf1hH;}D34(*T+BpU}on-R8JiZa04? z>-htpLYk(%G&xFbPw;^}%ja9Q@x>v5)~A!PK^UbhAn6lCxxf)B+N{IySXO3$L&QRa zKj5gJqnTvzlpITfhW-#_HeXnX#E0a0|0V%rSS;-?U|_OS;BNVne%l}6AY_Y7vxY&0^)n093k!iTLwNQ$FZ9G?ZPF8H3{d>}u)3bl%}DyowW1yot^@iR zfO94b-MQRnD@J;f0~&f?zurvlSvXlR3+{ju{0jsifZ4LuCAI6VCo#^p5RUw0;_-ML z+yj%N#cZNX9IPBcm#J0m8hhwCPl+f$^!Hj4$KCK?dcu9}N zLw_Yk?sM`4Q!aNE1R+G+PkW=w@pL*I1;NkZ<#;e1%qEk|Sw9LcuA*>odwZ{Jlcc1x zO_1+H5%`qyQ#D>lKLFzW;nWT;5m5vb4)qZnjv;3^I2aa(-dQCvSw7;_VczSV%_Fm>7~{1FuOH?GuIbb`qHbzX8n}hMOnC` zv`2qVmg#;6r^s;-h2wZKm_}CtOpQML-()tsihGywYjnJrX87A{ zayT&)yF32ks5EabO|?hL&_RuDO-_=lv6)lKXkl(B3nce|mRDX%{J> z##uc#aO|b6mSH_?F9wbRv>Hil8D{XUh$G;p8cp7YLP*#NFwE<~(@0E^Tak7Hy_$B1 zx)p5%n;(tuyg~X<(nIoD$MN(M*nCJDLAIKrW`M28A#hRf`(}5wTz&V=*6{%BuCo$oid5b4LE_X_Pb*&Kv@B4l2-P(=EE>-;f>!|+ zECW7N_Lw?*NK7PIx6H6$5ifgGc~@Qt_Pm6G8E|9Js;FesG4rdhhaKE*CCR*(?#|et zaiT7^rwj}^c?7|10(cjmRPg%KL-0DOO{qZc zh6fg-gOZl26kV`DLQodMRKSyx#-J5PWd5qRec4PEI5l|(@a@b0IDz*dkHOQG=2USL zQpS)e>v*c5Noix)WMw~9%yfh?V3a-h6L{+O>-**QHECC3Lq$zY9YH6mDXKuGqKcrB z6(3c=($Ph5Y3h_JSc!;YphWddRj5>C5!mi3pDOS>WP}7FtD36dr=yGD5)@cffKpJz z5DBWVsu(FqVvrQIT2+)JG%-w+=HK6q- zN-+bPg9{;L1i8anv&xj}k`oe%xKOPk1~qjA9hK|wpMy}BH8aPSCWxSQTKZPeakspX zSi&1mx2*6R0}qM_Vg$oTQeIclG96t6mjzpwa6OcutkzUy5m>^Sy{dL$#ZDmgLUNcS z$K_`0Q5G4;dPLL(epTS)^s&ZiYXYm_iK%1gfzNbu_ z(Hm?|%ZJT&b3ElYAY@y1+#x3<5~IG%-x?dfF;Re}WjGh>vLb zQG@54ZwYVZXeI^(l1RL4mnW9akZd{;*ZfwX3%&Z5@m35Vq9cq9As$Rv3E@4Y6^5@| zRuybrWThfsmpkNyM2e`Yn5#oTMi;^DuHdJN9w8Ae$qG+Q90QM4;5V%c$twmzS)(4W^l_jAT`Za; zD(`|ro!()iCBd%IdwbFdv^K4Hi>ad=UW2m<%vHkr!Uvgxro0iT_REUS=(|PYB7t|y znXpfv{Z8S*mghV(JXR4u?r{>?myOalWTkLEZI{Q#{oz^pEnoJbwuJKcFocx7tb`03 zKlQhs^jlROVZR8_DRbpw%q&DB4=Bqj>FEap0OXA{b|DsTy<*FXWjbv@q(PDHJWB;q zR15)T%-ecUM2#Z&1ceKv7btv?FhkUXje7EzsxarOZX)!+Ab$v;X~npTdMZ4Ub# zW3RLe2Xedl9<*PvsJ`4pH{x+&4a}Fe-z{FSMS(#SV`}(a=TE>S%q|k#uGS5Nn`_7x z&NQW+#aoD5R$QO>=h)c?tMt3XtGww#822(b_i-cVOAXx3bjPB!vfWPMrubS+`Axae zQ+^dpvbha2_Fiewn?j|R<2IXq)t}29qULrQQ+2#M$DMi&f(VqJ0pBOZY!drlwvXjE z=~eOSVoNZa`d}K|J{)Fs!iohT%|R$@OjHwNgegY0cq*l-J#I{CY>JM<&GfN^xQ!u< z5jPV1V6oUMM%f_XRH4f^Xw6Xb&0XH1^z5BOqcL-1xH)cCX7tc=FAo7(c^XAEaJncq zjH-xmekp!4P4>!T4+UE9bFxeRT5j1zd6mB5;SHt{@f2bli`ML2-ymVy@Np|0FZ3Ys zK_OFwqC&%~IE5AVZs!jlag)gQdQoYLPEYLg@|tS&YkqjDkTX52Rhns^JnOAaO#_*a z8h?GQ(2a2}I@9WE%R{QOZHMRm7>JU>0RLE*j{&!?CY->(yJgbAeadq{J|B7g5~WqZ zs_m7vf#BaBH&2Sq)@OXdM8yKjv)bUF?KyyO+j70)NsaLDwRxLxbCK_juMdSi!Y&DU z{*<=HOj%01KuOl6C8lo#HH?%kIaXJ&jGCNo4RaUm<;BS+6;Gojw-@Qf6xy(2|MxXX zk8;}@Jhka5h86L)pY5sEuCOP7lKMz*xEN>gPC&85&! zgql3Sn6N(8F>Yg9KlK)_%~*|zitOO{&!$}QxRpM0KW-zu6w0(Rlz73N!~Vxt*d4Pk z_jJF7E85BzbDVi+V9(M1j5l{vtCG!!C9AM}P*G2+X|;7ai&>+F2-WmF#1ykl*# z!3*CDP53b)j$J~&DhL%Pk~cjey7&_HCaF5Adt{5sqQJu}+2$6f*n_AVO?M<@c0{5n-*BgpYe1jRo&HrH&)wagEw)*^@KNF^M!^tY10*mH(|x& zmtSsBt+)1T7H{mviy2?aHdkbRmE+AJs`{M4$(hAA>Px+|(rIYJX>=3o zD^ioYTW?-XZhL*1Io=QZvT1gs?90u12klK4NzzwVL#Rx!T2I5vV!8F3wKfj^tBj30jjjzGd=+0N z$-rSr<=-!ES(+;)v`P9odzl2`F;~Gf9$rN8Y&yLhgwbFynO$6rMw2KQjiaF7zr9sn zPNM_^Dt9?8MjwKrHjgKMv}dt-+)v_~w}QXDQ(vKg$ zN`+5{6rwvTsKZ|QBYW7PKnc;q(oErtMf%s~@wix~r`>7+uQv~;1*9ok!CSUt`j5r` zB|jgMqgm=7{l|Z%O|pJmp+qD4w{@tE@hK8+rT4*Q?*dRm@g?>V{n_+!fm`Vh#kh@_ z-FNu!hQm(YsDTFOf6m7rM@)+iI;By#xO@0dlBG2pUmZ50P>+(xf8R=Tp5SG$X zROv}S){rSf^7Kh8sf6;3M_EWTMA7dx#Kf^rgRcCo zh6v7aqC+I*Ik~GNrY1$v&{Lb#k>p`~Wg-;~(Q2a_vWE04RnmrrHRN&PmMT^JdmS-e zc8F(s(a=+y)R7c5+>GX}w5TCilTfCLxTZrLJ5x#;4I@+2IuQ=)VKhZZDGm7}jTh$PbEGdAhqS#v3 zF*0Tl(y%eMtzn`~KUAf!ZB|FRnzl$oxZ0?OEM4SJ6%C7u&0a$DJ-+R&U6r)tzRkV6 zx+Y?C9$!MLriaZg3Hx^sX>xdDA1C=2lKP1v`)-h*g)=Bz7_+<2cXd?Tm0xCV?H5sTkF{# za>{3JC%5)v$o1B=&)1t@HjYyM_PRVA|7J|w;CzHKa$C2ijOfkt^2w1hBur!Z?y`+* z4Suc7;|82&ZmiPH^V+TD9ENJ+D#6|ScK_r?7Y$M28?YE~#USguAe*mmUa_0{E|MYF zH_oR=eY1kq|`b@!INqRBp4j8yd;L_$-S-BnHMAuK9YXxz` z;%gHhJ2aul4PcQD_=kVOlO19hk0556nY%$AM|;T3{N|y$0?o{eXMa-Bw^Sb*&ZJ#_I`% zs<9oW=YI2m>AUw+__^LPDC}IjVQw{73z$buV@$ccTEIlgzvK4$n*-ce-$tQ>E(?_Y z=r`O?xF7CtpYrdxJ-#BqeeiEeKh@Q*bX9*=dRKk=O8;sDOu^u~$5afBFeU7+#{}?i zN}6NznHwq;4Q_IUoS~IM z%j6JOh?$yUYEJ%cOxdXm=A!e6W1_kin1;=rjcM6hDm0D0YlWh*9j2%CRbx`xCJL3R zV_Kn6ZJS5Z>-7vTEN(d*{ z!^BOk6j~yyoF<{3LeSO}Q^lF|Fd6)t(oe~mr}R{QRr(5eBI}6Kz1l#bpr*r9`l~-@OZSeLWBJ9&??PD|ULF$8vdUvN zb*(Y&`gC}hdVPCLUtbdg)6}=Ybn24oVTyIF7239hdJ17%Q-!KMlb%A?-dLe*N}{LG zG&RH2Sfui11A->Fm+=yOs&i@qE|!pccs7h zkj}FYVGwFoJEbqmQK$4ozbXBy+31wc)dmWMO7b~{K;?I(znW@J>8}2admHk~VH$=; z3MF19fbT!~-lMptjL$F7b*XDwItMvshE@tKb2d4JoVlSw(Ue3^ zp=WBQP*bvQd1)R6sulxptI#!Oi&JPC+hKaP6dSr#y1uz3I~(T!V`Eu{ZOx!o|kMqROV zO_IDRO!=7|C-2gi_G%_+k^dnp;HEHbk|z#J>X`Kn^KWU-4($+LT}bcQ&=cwDf5RFeQB(Os7m$fcutz$L$R%3~*;dBTPwCx(!p& zG*BogwcV8N%CERD{va2X-!KV7Bb5@izQTnfMX3g0Kxa zj84B__>M6ZRTr!*uO`jl>rwmAcg5dk9I;uLvA3a(ahpyjzE(m<*9|XB>A-WJ3*l_J zeq9~!4)T}pT^q`dnA;@K#in6WbGzKU=<8A(dVLk^K?v(n5b{{RvHB<|nlZMSoo0M( zs9|h|Paxm%B_oT`)_*nn0`GzYmO=k@?2DU8t>?RttBF)tYE%Wa+IOC25;QN)G_wj5Ds7X9WcNW zRAX9vAyZJq80|4UzIdsrW9*esCSSM&1Tn(;*ezekU2woMMEamMU*Ke96|^Bd#alrp zzax(M^M*@C7vpt{YxG6m6&EZ^HSW_FHw8tEu`bfp7co73j9&@*^@ZzA4x@7jaP~#q z2@6Gv5Qi+t6|LIV7RN_an+LWn2P{KmjFI;p07}XVX2si>N1*Vx0^YcZsk>n3?B4HYI<6H#%>63cd?|4bcA7iPxjjm)V{o#%N6S;HykR!Wgl0 z>I+{9I%I?;vZf31m4cW!Mvl^@_#*WrhLJT$4&#fvQ&w0i;cRa|{gnkp&CSzX85p4< zVNi3j7$+H7jFv@9m+6hjluASuV`U3!vOlbo!vw0arW2YsqARpfBQYdV+eTKqA5Zth%HW+gH7=L{_I$!m7!2!!qm$1)Q0($xwf6qOy zp|2>NvQnf9r~iXW)Vt-DpUlh3yua>`n^ls3&{KFmnk1uau0kwV?3QPrd;*lUAs35H7s`bW5K~h1fB;@sm z=uJ<-Cn6pwRuG)HxVfwtTO@`%&BTK;p zU$C^a72NS?{kGh#k~NgZd`=Fli}9G3HQL z9mQAEL_{&tvbeYD?-zN|Z+t2#yA?mP-VfXT>ic4yq^rZ`<+wjo|MIUWuKuz5mw)ww z3*BFP@YjE)mqi)cU^IlQ;*XFmV4I91oaOhBJZ?8n-;Q^$$JPEhfmA`0*?2m+=!N~O z=wdeP2hru#Ae>%Z^rLusH5*;s-YTgE$;qn43^(LNh>R|xuuzAUYvEZJT5Kdq(){+!FUM!=>ZD8?{}4XRYF6} zRBB-W%P|CUr9k7p@?)?3k;T5t76~(P$8cSEGwK8c(lAVRZGnTW^!u zW(RkJ07h{0qGCan>l>^DNzS>+zgD2gKUz3M{p|F#d>QX|yJW>i{dV)1tWK+~o@q^o z3XYog7HHxM{^N4De99DFjy~6crcnigrj3T}ogf($D!JW1F|)V|rt$D1if7a5{r*KZkI@ME(-K1XlTu_Ygv-y#0=4?rPoM9;+>P&U7xQ1>?8vS+ zzZ{mkbeUPm-9wrj;DidjMY~_;cMtyo1Csy7f1Ep00jwYHCW|kBeww;>0ydwfpTFEd z7aa;jQ)-~-g)KS41foJ8bNFo0&x25HVj;(@XcS*w^sjootHER#4}E=m8^IcqW0;}I-PO)Zb|5N;b`2TXzP&4C4UA9wHR8biTO$!XR{AR?Gj`O`Ljp79?hsVv+>;5$z z9S+MAvjbRz#;4QE^~W^>n1+MJWRp#Y<)Qq2J{K)uFFU;)^VSfW{@3OazE5CB`wY)N zH_u5wpD*L*f}Vw`tv82b>3;fS%UkI|Yv||I!FOy2zu9e$o8@-%cXlSozy9aT(`YOt zxGu=gSD)rjxj3g6{%`ZiNmfb(|B?QFo2k%(IaeO1yDaq%oagi6@8V!E8jZvLV#9$Z zFw>}_rDnwnNn^98l6Cd{pJa7 zwAt7A=kxlzQ@DM`{iM?+#O4U7%zVN#L-9V`BfqEJlf3v7XQBbIA4v5|2iGH z!Ze(NtBdU6-JPY40Uan(Ad#hPsjt)V?d9K(o73r!>EqYMm$yazK++AC$~?%pcOX^R z72&8W!f{uGdtDK}$OzlkTFpclF#i_&YPjc<>y1x|`91$PO}}u+C+ujoO42l+O`~xd z%!1LVSdI!`+8rz~&LlL(9S_rQ`@ibKU*Ot040c&0%$L(kGLPnq> z-Sutu@lCmphrtYTh^({oSa?w$Rj*FqPvQ`28gbyoSk9mLg38WX;=jb+8Z58CZS`~) zg=qq(!sF&G`6W5c;82{Mg5az*9$dzwFc|d1{;U^V&cJ^%nT)Sy(ID>ih8N@NS&M?^ z{2MzC!kGk};yC5-QlK5Z9=`!%b}DR-v@N}^Q2v`Az`}4bPmba%rFuf<8u1%H&aYw? z!%aHfEg!bY+DX6j2h)i4xBDmX^*B*c&+c5tCN!db+6TJ^miGmul<6|tQ?Fm)cn{ww z5Z}FDffH`FhX(kYf?+`w2d=k-gn<2xweDGK|+60rQ3eSJ3QFuI!mIUg5W zjys>xRT^I`J}lGx=rr1$;NQQoS@Jn~IV7+&u>;(G*NXJ~w|3n=wCa{d!6Nfu{F?lA zgp=Rzhvf_05^!4F{)E$6u}kUi$lA)kXEwyi#Ns*U*B993lJ)H-Jti>KJ||D`Z~5g! z5W@HUv^TmOPp89C5d0iojtA4hY%+npCkigEqHu6~t6YarQvSG=ryeQgOiA+O=zaZq zGr5m8>&5A`8f*)76wamjet0)u?9&CTo#WiNt9@BV-d>y*2bq8Km(4K@ZRfUN6h&|k zqq!nb#@W^o4ZNjcW(krfNjX`axRF#sP8Rd|aV3s5(P~=sEF3JnpL!dhh*13*0k8a= z!4-Psr3>zZagTi=-H)d8-}v`QwN;4HjAY-nefCxNnu_I9bPDq#amDIZoFkd@2@M_p z9_0fo09jcrMjr~>sAXp(7{H-=m;ANdUI%<{E9oJa!|c65rXfCJqNNjuX>cFHQ;e5Q zz8HK?mMPpda$3mz;Z`&ezcl8u01fLjA6yqMxzp%+aqXnNU@W?foP_)k+%NckC^-(D zWZ-r*x^8HIVi1{%!$UrxOoy^k1AsPvdVBiv*OkM0M;u3G61`$v_?V>^a3<>a?qRd# z9#YgiTLF1vp#p6EA-Hhf*jWvBRmCI>JuWgsteOX=TeJ$p;w}s>&om~5`$#6PT?BAz zEeGw`;eK$QXIE5@2e_{ov&52z6BOJ@=5u*$#L_q9%L1Eu>D6JgeoEkz?&ta4uhROT zYmObkgD4!wlfg8)3SevP!~acYv#Ypw8PA57SMW)9Kbn>P7lVp5gW{l&Fur4l>-5{^ zrLvIPj+E%)pr#>g7<_ucZR4D8k8t#i_!UD=4u8~#O7;roMw|#YqR@hv;uWJ6zi1X^ zOJhwcqGqjwX|XBU*MuJTiR5QyF*&#y)%jSe8UT0d>q8y}%1-8wkMOyLCzEXI@)eKl z`uT-loNO-MSfa0mh7k_?gdocO`o8xSE{5)Uukg=eh^5;pxK1iQH40NmqX<3{k~RC( zV^KQHy|UbZDc*~t2VAwVNeAa9vU!B!mkK0Y-(9mCeMp0O3_|mR3Rl5&_kWKH%3bn| zYL5o_r{N@dc!h8<=Ew(ggUE{G2EG#caGVoRoCB)IQdtA#%{nZ|{5sDrTDTy_J992! zSq!pVm#e?=b$VVd0C-a@8W`D$bpv69CfM?xBqR`9iL=b2 zM~%2;AcJ5A4mRZ;nh#De3j6SdIEMvSL<-zpCT#u4oO%7;)z$RsDxQSHSvVZS=lbO! znuN3ARlhd~<48D%=?Efw%#JwOa+Vy%g`>~TYR#5^O6*MtRG#*PcZ4G!yb|EUKZ65&7D@phIKj>Ex7XxwV!PSh@t4`ZFU$7=qmR|gLGck>Ft~@S zoXTotD0Cq=wH?pI9OAf18S5`4;Jc#CrN(EVCw^eS9|TGZ~hj9QZqT^f9pk2vzVa+=Pk;!2SlQ`m>AKvsCPoEf0( zso2VjQ(|KU>kMRE8pw@aZ{^fc(y;;H{9CzbKkD7eeDk#2^2m$0wE(^LTj;SzlZbhbMIyk1bs%W}-siUWTq^%HZ z8B6BS%|Vy*2Sr=18NYSXy7pBR&@5oj+}c50v25XmvCzSMAI4vAeuwv6`@iNZxcVrr zQ*Fjr?Nbo5c7iKdhi2S@S@z8AFpAu$4G8c>`mRBrNS~#@0R^4gw@G)AHHdvL6&;02 z)Xzb2G}pIKOs@PI|(rFQ2p4}5m&K< zO5(2F`mo=uJuw)FD!k)(lDs9`J;cKmAa0khyVW-`UAQn%Fol=g<0t}c{B)rssPHVm z4%kBlVja{GSFyxA^pjy>er+17G?G>L$Cbw$`HIKT5_gNg= z*{J#viD$V}ztm6t^P*fme1&pxmB-jypBMct009VE1HpipJ&0lG<%JnrotK2 zo^#IbZXH$=rGwWvAl@o4UhhO~bY84fYAQG3Yo=H;6k-amNZb@as*cTL5s(eT@V0?~ z0hi^Yj)IS-YG|vnuuLBiOa20{niBT0Kx4Wlsw(#$@@KKIKoV<-%yd-*=p}4kMAUnI z!an4ZsLC5@lR6%P8_RC#dj@ zE`CoQzU}wl$1Iocb}L1X`)!Ff!YYQiz>poUrn|Qd1az~}@I+uFtMCs8GXMD=B5geV z23m?L*S^d(-@$y=zOYJ9<){|ahmgVdBskrmM?Ni+GcW%2+EmTBD2iH z)qLV9>ZK%Iv1xA5waSyNPBv~!qJ7O&u(h^L21`E~n9D#}Ncj&HDe=l+aq%pZfVMb+ zyZu*UF1&R~K#?gB?O?ave8m!0;2B%F~tmn({P6QR*qAo_a(=~MVlxW7oP0o zX`GpRhk3Y~%IRIdPnFc0pi$PyR`OStn=8jy@LAh9fFu`C^H*6xbxn1b=DK!K1Q`@J z>o1TMIFCInys#*u%VB1QV(w(O{xHn<{wF&Mnr)UDg2J1s$@$j?t=OEysFe59*{D#~ zlv4!kkP{QU@i)G>GVe-o7wvaduvgW6SA1G&zAG?=&<=WU^7O)ck?NKi8-btYW4ep@ z?$1a3rSFng8{x}fEgs2%Q`dS+OwYhL%WU3{uckZWMV=Mt(%~7m=END@02`DmsBBzF|C&i7R(WKhK zrbDHztUZZo4=gYX_baq?w@cW!J6|BPubq4y;jh+OcD6umfI*gm@AWwBRM)}~(5Q(4wf!Mj_Bg*VS!!6x~fr#dsmA(oQW9lrru1l+?bgG5)dQx&irdM`!Z=h53 z#?o7Bp42LfCD)5yOszuHU|YG7!pwnI)#aOBbB zhEn%kC0m2&qd$|$O&#=Ve01!sM?%UKgOPSYe0`%ii-=1nw!~c9b`I21)}v6lA#_=8 z>!9=M6L)WAQ;;++V-VkN`y7>}=b9=rE#>jQx;Et#8TnTi{fWl{S*lBd3m0#KM%_to zd1WcNo;0y*%4W!0!i$(97hiT#YPw&d)D8aT=1I<|F0(##+SBMnZsuZ2Rjv9fhk|Bh z$#W6r;&bu{MXCs$p&e^czGP-Sqa?Ls9EoFC%nAkV+ z1(R53wGU$DWrepiBa(ej$I zHN;;wGQt%jcUaS+-q#dTn19=ERyKkN^izoDp@{{U)5Y)`%-BHvy`VggZL*kxA6y78r1ZU{*`2;FcSu@(L% z^5t~Ff++&|Z5_tgAyurmm3P9UBCK?juUBsMRPWHoa=@?eEt?>pl{FbTr4FC4Hc_NsqRCFt5&BwSdLu$kEjl(=+ zr<^yFdKz@V!Z-!W5OKCrRkM-G>Jch6ruURvyDX7Bf`S*w@?RnSDKb@|joLwwh$W7H z-m`kT%WXFCfBtoNpeZy}m69#kYr{I7vI; zU>q~s^X|?Bb(#~!tmeutPJJ*_UQ&Xc1B$5s_cck6MC2>_<*S|Bsifh`7sU$tn|(^9 z7(&uUrIb(W@iC{V8sMfC4I-5esOT~Upwn_`6$NtnBPK(Cb%Iws$H)EQIYqZwqGza+ zxvp1aHFti0$$6N~i??)`z;P{5?~Sbs7Hr6n<3}jPszTXvMGxatl3O=XrED#<>!DC3 zA&biNm)uHqAK6u>Qf&{5OR27}JRW@XdaQdWxS5kT^VtL5sudFAI#>ur)RN4$q!t-Q6v_{0zdmF+CD0xRpY{{q$# z8{;BYuTt%pS>MxiLkf_Yp1%;2Wb+ z0WUAxgi8KSnHj~md{y*1MO5q?F2hh~hu8c46Wus;%dOQwbPGxOrfoD4o2=CRn&pIO zBE?%C>P33&mMl)>BdQIhchpcyOS+ z59EP?5)o;mLKO`;T^8QIGjQ{^2%(|ol$Z@nbWe5!&0yS0>x?kErR8g$Ot`I*jl?Ti zTAI#TUJC5)Ap526g2xZdb=%-nWMVse53a3w@*$24;xs4B23o(>8dwCYDIph@i>Q(f zM*AYjBr?pNpy?7~6k1H3hE}Z?BY3=SHM8B#+RV4@#P{Xhd@z*FS1(d?vgQ>`YjVMA z(rT=XrlgmHv1vOrMpo8DCk-vRd>PRBVF0mes}y&8E!j0UCdEd5NU>4Wo(D>z)CU4Y zxvior^U2}37X|n;Gk*~Td;Qag@Ur-7Z@PB754eqcx5r!?=eGLymfPFv4N^6yYhK6< z_Oe<}TiXj`hMafe45hdRa^vKWt>k4>^svBdV^C&j7DjFD$IMKthvMT*8^7ZaQ2g6y z^!x2U7XM6fyu|jHK!Nk)=8Zq=lxv6E<emA>njiOv#KfgcF=yr=wNd4e>NlA4st zGfPZNF;U^=tywH9?JWHGyChChWht^5ikG)K)v75PEesWc3cvct);jhzz07FpI^vPe z65zlG$;*D1Ch&#K^YNSJv$4Gekg0N{swZnMBCU?hJuGl6ofO@m)HHeWEO=jPRE?pz z1&XPMf`chAT^%+r?9p3}<10K7H3BiUw;(Zg!BAWybabQT)YlBrtviN`vy0iMyXH;4 z8H|pwYR(r$R)q0#w@S9~P6Y<*Vk#IK#cP*ft>u?aRG^q2% zS35x2m&y$odoQn}UOqv!fs}8tD*W{K5?W@1(Tcfh_Dp~;==P)MUj+auafPy2D*k{hvmep+z88hSBZC6kXmbEBB_Rd zh3Kj<))E^ua}a0JC!(oT_aUMxDzoJ8##-fR)QurQ0bCu~PK(4=Z6)ri6sb0^g(ksu5WEkog%xbJE@a~x=5r>8f!stnpFTC0k*OfL`*1a304P#ogvG@ zdi*F#1U-;xd!*LVjj!-m(PHknewAhbKuOt01L0Yd`#|O6KCPNMtx;4}5@{))D*5WS z7|jGIJ)CWGi)t<3yY`7j12iQ=G=xd&cWCHRRMV)EC9G;uCEjH*i7Gd`A`BYZ$d{L$ zfvMaHfxKu@pRQ?A=<6mWc?S8a(j(-|_Q?>h6@WIGx&}UFN^=c)YwQ!vdal0l!*OOr zJV^6rSM_9jEJnFYb(9*qDiA?3<0{d*6g@O!O_Kt*iry{D8;uO6>~t12kw>2J7#GR?^O`)Gs^eB{$z7lUEV4MikNXKAvk2Gt7bm-|S^((#=?kw!btE~69BnqGlMEcG<(o1R1~hCPJ?jUaTnE~*pQcHAc2 zg{X23=tea%?VMJ8Nkv zSvzK~Lg~+5p6OMZZAaZe@K-=vdulY!X5rhi_Y=IGwGoKij$p67h-DW-a@zg ze5R7REq7nB+gVs6(>9HCJJzlO(|B_l4lfncHbS;t8XJwJEMQxPjfHDxDDC8G$IDeD z%H*%j&J(1ZUB&Ij)!cASb_K#!33R^vhJsTvb`_R9dwTP)c>4R92A}Xs$d~^GRKqc+ zzX59?JZ;&9<|9wf-_`8TP(GvCa(@m$uFC1~X1n3+=oE>oIy#RnXsDDk;Bi(>$AKPA zHPbm9XT{W28uF_N*LbO|wHbdruBz#(5@BPVbP2>&86vt+4r=o#o7q?iT>x+uzMF`? zhHFMwAQ~%yG<>qH5{N;#DuKP3BB^`b-2N#!JBw?qqukD$(a3W`8*JR*YlFwtavSrG z-EC;(VyPnp;5y=+1gkfczatE;Dxi4>&`@S7rmjNT%SWGMb~A@B>5C5c8BX#@rRf0k zJY7ByW86iIJ9+QZQ0A^cI2$?Li>ii_N0gkM#T7}BaE14C%w|&7t^#-W_OIb^cL~H* z88i@@->s6akO=Pwz*%_8oFPr+ zrseG{GHo7~rb1J5cNUv4xlL1VQMHc zAzxQfBf4}}4TUA;>?$tK+TT7eSVLLq*g6Y3lxOeF?s0#nX-k*Yt%2W+JO8T(aHxOu zeRIqYWal`HbeTfWT_J>70vlR7DQ9P6r^vO~P|%Qur?ZG8X)2q_NW|1xNSY*{O{Jvb z>MW*re$=KC5-@ZYPL#qro6mzHi>>?GT3-73ePTAcR;Oa>I*O$Ej2l`jF>hCqJIxr~ zPz4=haaD=6z|c7^sHpRVH<;xCxNg_4tK+$j&HnscN44V&@(oSBb2P4M5%C4*T-JGf zfgev-5n1WavX+8Zy@Q6MOv>3+T=s6f6xUD1&30=-#;(G$T{GDq;I3(s9G9EzSx1+a zx3kFf~t?D(DJ?s}j1XI@M4G-9T_vK*x2y(qI}zZt2pxM*=SNx}0rY7g}qgk8t|GV{+In zw>%s?&-=#8qW!u*ZdOU|l5YKV5lkHv(qWmqhV!ITB(Bq?(;|aS6*Axkl3hZL-r&f# zeAsMZ8_zAnZzFeA2}wD}hN2VkbQY1O6lPN)skl0eNl-_$sf;8nodp!p%B>g8W{>9m ztGzZj&nyI9N1^k)G=M$Z#fZd{ z3}*6hc}>k%l*iuY9C+6EDBPOfyLp_?7s2vj^!a)5X7QVUG27YO+u=uPc`Z1w^!``- z{>gQ}ji2pp@cFQ_XT#C_@8R(4w5XCkC>EQ$dm7SbzHW>x-=-1Hv!bUK{NeS-fwf+T z|LSYzaJ|0O{`&F!_|NCB6%(O61ZFwODZ_~3S8Dkv1f~f*aCR8AM z03eEvc9v1QOfM!L#YMB^4$6cB%KYzaIQn<~sF|Ov?>9t6JOI|lhb-DK?mrw(eaqlA zk0NAu#VkfdpdB%Xwlwx5m4*DJ>q!_=G~ym(T}cpv3PUuah^P4B?sQ<`z+_p-kchzb zG}7y@z3m-%jb#A?X%Mvc(K@69Dd(ubgsjSffO-Ltr{^)-YDo}+8qmdudEk0nvo8xK z7lI&koiIMqH22_oo8zo03W89V@jZ_8Fpb?qLzSZ?3Z49w5PidCsXzR=& zxmhwYDnE`&mC4TtKfB-TZ8|V;sP&#PsBvRJ1uxSxs=9))-(+aW4RV}{jH%@vb80cn z)cWwyHndb=NMtq>rch*E9$gTsFtzsE*!^eodEx8S8DplSv0`>XPb>!ZzrkG)Gm??s zn6QFcQ2jwhW?~Uo8p=;&DvC8Y+DP`9Gt(xz+D1`=Qr`-4xX#3L_>b{^*TaosXR>kC zdlqA>^fK#RCGFwui@;7^0#zku{@9V~QJ{#VzNuztDxIg|*_~wSN#_*K=NyWIe_GYZ z212+;R;@%7kG%2c>Syh+DJnMN~aRQEiAR7sWHDWWil`V9H>YHN99Xd!a(m<;}u6`#9H?>|iFpF6x@q(7rm` zD{J|!d>C9T%0pnQXOA|GFBNW4@40oD&u{3z|K7}Pe{O&Jv5rrI>7O$5FBATYuUT(cXQSPdx})CoPnqGAiJcm~1ji znKRQSo?2dWZqc5s7Nw_&-t{Q9ug01jJj?UM@QONzuUYq_0Vx%@OLy&;qb2x;=J{iJ z@1)&XX$>B8nJuXEpu&UN*wR%Z=ZREiyYS5Ch;GYeCo#{QGL+hxo-TKPxghDv9A>I` zGN3Y$H0*uXMiY*+je4D?gPE)}hcBc(B2aZe`>wl?n%Qldd_wLPg2~@Zc6C(XfmS=UL)YYhFXl`e-u z6iH3xu>u+EqHt7Ty&Me4%!+ZiSV_YCq;(a(0-ARI;uLXB-vRBlk+*rXa2D(GcuYZZ zeSz-CJONYL5vxx~$H%j8UC;T^=}L-#y_G$@WA8-^Aj`|FE&wVsv$+6lDWEov{X1$Q zkd1iN1gV0Z&5)b_JMl=Wol!D74^0+SQc}k5s&WlM)*>Ukv=rMF{U{8!95`9@TIS&< z{$Pd1z-ke@<)quL7~Ph02$@9TySbynpsCD?)Jw1dp@NJIYN#j*#448KnCWC?@viz1 zXPYl7S6DePnlD-|aG1oqCg?nwW|XpmRcqvz;%l>CIc$-ZWjo=A15!f1YXL9`iKhk7 zWF&wVfIBi9bApsMH}reRqj<3%kVUota{fZ&=n)g zp{F8UCExH%qrZ;s;1n%jZ^LND)RkX$E4sXu$`|yN#B|4r(+WdqIfn@vIkSe5Z3u;{ zzoHFU3HYQ$v1Adr^cfqqwZ`)vG-Ve>XG&D>v1Dx_E0OMerorh&F&u4IVeV!AF+y_Y zWzaAxxqBL$Mx|`gp#{nXGWj;435Y2wlG4wL|E|sQV-(SLW{?5>qP+fHp5OIupp#W}14OQef#hb@~0RBAIQ1 zo{eO!cLcL3iif4z#kug3SiDJk)CL|0w$gO3{G6#x_{y(`gp8H~VA%wkeZi^hlXRme z$qX1T;+0~RzClzX8JQEM9i#q`x;VKh>Uvb z^40P8K$QvN__dIbs*N8EY%+DuS61mPtr@wBy{54IY)anNvORiS{V>6tX)dm`v3YrJn3M7NVxSv?!S&?)d^o%|wBg9m`u*v2@%2YBr(Y)- z!_j#(F9a)4;DCZebVjG_SlfqFuBKUIG+Di%{5riD}v&(ZS;PFRf*N*l<{!9 zj1LSEvAsF9-r*o3gu=W_;-f6piGJ`Wp%SBF1`J=q?q==qlXI*|5=~A-zn9` zVtzMw`fGdp7(4}sNs?ia@(?e=g8m#VgUR9Wx3zruvPjIC z8_W0e<*;(WqP9k^DoX(x$#H17Wm5gMDflqDX9Ca3N)9l!XWMfg4k=7%CRKfQ=%KdR z{eMS;UGkT{wR0#{iuvE~e%1c@eEvARJ#~>2Ro7 zBmI(^XHskGJlM;_k{Z_(To}m^mCGDN8Pnc5L3$&9g%7Mz zBUub5Njei+t!KC3(#t(uLeO}IQ%0nG=-PyyXP|Rt>J+_e>h09_+H;9#%INXU?j-wT z(hv^Ap{^G*j8of+?;7RxO203t0urQM$DMO_7>*VHk6|?%ov*udlz4B=SzE=j&*Z4`-izZ z_%NsbOO1Lor~Df6A1T$+sHz>ZJ@k7uxqAYdn^i5q^!+$UDJ_{h~bxzosZ?}`R^Y|2qLS`-H;=S$rG;e1l)PETy zMd-GhIrIro!1cp8n8I$f>b+TX2pv@{E0 zvh`cEfU$#YwZYpTTg#D>Z&Oov3TGOX3V-=Djf0lbu@L_{Tn-I=apgIyM|%~GK&ub) zs3KG$liCaO=au})J67rXpYz#=@s{#y+1^O+&-TG?AJC$2V+8?4Bc;o=qQ0$lhGSZ8 z% z&|lA~c~ah$zpZzZ^h0;JvFO$U#pJGCYc*Zm4gZ{vQ579tH?T*&x;iqK#Dl45!i;XE>y@boC>tv-+|CP1^v)&2D zo68+N>}=CuPqR0DsYDMg7KLbI?e6*U^Y^Rd>!A2sKdzRImY8=5rc>hn%!YI`IqJPQ z52AKmoDUlt{U~kp&VS!!jeex9>8~7(zIc3;@`IhwsKjwSucX9q>T5HTzJAia_>%6b zcGHrk$vCInU5!fo9PYvc%W1vEp##%dX`;$-6Qq)oRDM_FP&8>;Y12QcddWU;W2^fK z^s7$ar)_MBlNyy6PV+JUr3Z;qXu{F1Pva6UMFii*D=&s*Oop6V^1e1CUqPOMfJRiY zhg4rq%@=oM%V6=dII>kuUPm_Os7ybo^MNt!57D>tNH-RapKSQrEBdy$=v`@7+WFOJ z(7PC2_OAPr>+9b2;EGPGG()=_PN$SxdUH>?#4kVY@7Iq1WUuZH^ZT28PX_-UZ*Ugk zEYi*1`dTZg=L$i&oCN$Wf_rrlI-qMZ-tj>&tr;aU(h9$~PsOZm&MHq6h z@9x3jNE`LT{o}oV*Q`m_LPvQE)y7%fM92DkkWC$h_b9aMf{aNjBR!PLkP3Z4@6q%V z&~~>M9ft53Of1tWP$|*Fs9%e@m{%55#CjV=kzi%u>XfgHKa_vrGKmK(Xm_RxPyXyf&}mh02T$F0Mts66dXZpA`gcw=^#1F*P{gt8iXQ5hwA4)^u<< zr^qRX#-u1#2ArVu(q(6y1~oj8%+5~visxq=VL)0zKaT3PRf7?}B}lI(_;etCMPV*$ zJDN&qt{a*c=l!c*?`m*;X6a8)y|Z?L!+HPBVjdPe@6#7@yzE{cW^^n{ zr_Z*Z{rG85;d~pr@WXF@6sQt=bd+}Hak7#aUbP2i(n%V9UEEa)R!kX$?;LO3XZvti z&L6Wy#@sarUv9&b$0Y11>;!2n2_1+h8F=a3$MVhd#aqjd;{u1<1O53ad@Gt>JN9fp zyrCV2O3X*^m+#+&^M!!u`QM$Y`Gyud{e%5Ips2*Jp0%S@Oeb0MzdBX(=_4x-EQ&)7 zLZ@^RHh-H}OB+Hw*HSFmh(afa!_>Ly&)I9Y@2xGxmw1d)m(dOmMa_l5n|`e3%!q;& z3bAEzAPIHok!I*4^Lj8guC&2;(5L^qo=mRH-i0~2yto=or+49@d`%ezFm&zkiHlifMqMafL>n^$R#BoPtj6gz%K))R?|Dk59X6z_q+ddC;eJ z83islKj<|@4d~oZRZq5WvjC+wTwg;F+E5Q~6U-@~*;+e4;tx9Aq`2@Ug{B74{oo$O zVQ%Q_bCBK|o(yic6s8o1SEnJ&i(vB4MIMcU`a1^eCEKt`R`Z_!ZSVKO;h7-Qkvtpk=0t#$scPou4Mz_O^d z&R86$_Oy4kTeI#JLgz8wqDH-gDHl15B^Nn~RTepiQMT17Ja;ycgShH}7RFT%IF73x za3WVd;831=t;P`+*${Cp|uWhO=}(CueLhvPGnwahwfvSMvh~bMlNHQM$TfF zMs8x3Zgr5EUD{7~nX4Cm!>uCvB%C3K3DgD-6sQdxDo`6ZSfDm=IDhSS0&1D&asr}_ z^+x}5S4QsVu8h3TT^Tu_yE5`UZ{=3k8#PJs758Cu{TVj+wkp8QZB>AC+o}MUwp9U+ zY^l=fzHm!={2boGMMFd3SKySwufYDoufWv8ufVGO*H#14t7hrQ7u|n^#xP0(!x$xj zk&KeSU`9z`JTBSpi10`+eH|4$pj-kOUM_(QE|)-tmP;T5OC?$j3mZdp(EGpl8gm6bBBM$(fhNkl#c`8W?r zJP0-3I1v(Jx2+0rL0c8zk+v$pL2XrlzgnuayN{I@5ju`p7`cpD7&(hs7`cgA7&(Yl zxZO4Egp<%Y4aJdr8j2$aH55lKYABAJ#4g_MCPqq6=p$BH>)>xsWKd*zw5aj$RRk@GuOe_C zUq#?bzKX!DToqegj1mMRkHT`mfv_C#7c2+d1Iqz#pmMFo8x6^okrNur17|dr2To}$ z51i9j9yqC~e7m#E;$!IJ?XyG4?l!DVGIr8yI8w1?BR8>2BPX#-BNs7Cw>k*s2S?2a z7X*0<{tLMe>pgedRuS)`qS!xD;5ueXKk+2a$Q} z0$c;X;DTUSMS)ava2+P%cIgU4^3}dd%;PbKyD~s#y@CS`Vm!QqT3O>0Ku~zon?VSn z{P-#oSt$XmuRgy7rBt41g1ThNXRk&1AferIB94 zIDtcS?J2&6oIa9>wB@f1Y%sI5wh^*W_vEY!P(_|BLnaH=NBCNL0V~~*t3(FGUT1MC z@bDXAI}g1{(aUevA&Xn<04v)c^Fv4+wE&jU@@OGKYORBCnqFmuAdM9e!l3b8YlzWO z1);E>XNB^ag@NSoqOY?I-{lV9H*Xp^7$t$s@MI>J={E^w6$MhWlZz&K^+G(7=+4WC zu8D3o?zX-N7I^3vu_00&=}NxL-ZMt>%MTH>NocgR@d0gw-CP0a(paHUH}3bMk)HgO zk4o3Z&}gB-(WF>#nexupp3Vl%8XW4{YwN^*)RxhLW2rAcWFcQk;B>DV$Xn$?bii z_bf(FF6AvRe>h{k8;T?8tf%QwV>XzDk>rbVcWM79Gn#8~W4v`ehm!SU_dtxS2Es6r z9ZY7~rGf0GXQJ4X3r8)4Wt8nGz9-c*fN@jT z(u7$S$<=P@P&-MkN@-N+PY=!`bdJF&3Z$C))Y@;CPw9R_=ywk9wATVy*{4uCg`;t; zUI<7s!Yl!lACcT(ts^)8`E{OWD6oO2n`;1!d?ni44znd%oQoBvJu$Vk)R!GS{$;PG zNvgpn(e0Ih)<(KMN&%BjOa7u)RFK14Y9I_VAuz?bb;B2uSn}DWk!)Hu(#wQ?mQb}p zFrz4tYF6LSi=_SjBO&m4yt8T?=4k+!bpzvyrwBTmxX3^xY6KQmnz} zKfam(vq$evMVR$zGG65;sjiugPD}vOAZ;;B4Wg%b*b0c$NBC_XNM3nhDsgvdnRvHfZ8)F%`AMHjCS?c)-pP#XrG$|B>)|o)1TX5a!FpVO2@wW(!NF0LSjGQkmdQspDk8sY^N(cW`1T;}1j)sI(94{4-k#)NG(21fR74snnP?QoGsE`#Yf)O#*3vr5RkpU-4 z%JG3C3)e@yt4M74G>Vk+>35N*hyOXJyZgonClC4S;NVPIBK(xpW*bZ!K zW4bgEcyx=f@hLRrS{MfJt88jjL3}GlM5OayTUN-qVkHD9SE&hPTqz(RyzSO^2bK+i zpo`iA2IYI|UC;#waQO~EyedEeWVTl*>6v~7Z zB~KnUq)noDKp4&?qn0gsn1WQv0!BPZlMP5>KKtOyc8JAjWkA@N???^mE&#@u_0gVa9 z)Dj{cT96>g_=qss5P(4LRBdX>RH}v`u?lrTB&&o2gflbdsU=t{tRSHhu@QkX#RJ0f zOf4r`Zq_mxc4--c6v;3WaU(@8BBhdO5Ylk0OhiIG>8D~Q2~m_FDX@?pIg$Z6j8y1q`H=`JNRc#T#F9MW zfGC)VUM)@1AO%U1go`MWB^nUan5JJXQPQCW36qSEh?5P02xL5kpqM*}sG_t?l*vSgtVsnx#IauPP)wUlSW(jCVMEF!ibsT1axa%(Pf^U8bZk-T zBr5>=8Hax36zQ}N}fb;NSsXhfV8H>?D4}& zYROZBFG!*aB@mfPa1g2OPf;mmRgD6ow5reo@~Q*~5LeSLF2TzbN8K8(FDRKcRd~f`zB}$zRg5;@E1QDtX z3y_>=r!2qlqn1{gsDebwgP#8lp1RU04d*hx$#GncoKxp>P za`wXOcICOwDt?VrEt~SO1*w#+0OCLkrQ(W`ClMSHCsRHm4L|a(m@#>v zqIAhZhTrbeguewF1JZKCZ3c!Sy!2;sp9?@CDn33MEjNR)W(+ zYVir{GwkD$_xbR8`JEPm?)I zy)J^Zt5yiHuN)IJ0;6A^Cl1{OU6fx%7#D$R<6jz)ANZKl#VS*p=1Rh zhq5sciGy-4OfJWqh(-C}qBP3Z0P-ju1Q4lTmWe#YT1g(JAZ@aM5nIw^1CpAq!kmII zHTZ($sZatDsRRd*YG_}b?Ul9sc5L{mFY=I_JWxUUq?wC2lP4SybwOP${L+|dBi*C} zfRVeR*ErwV2j4Uo19LPUPWqQuJ*_vKnC5WQH~Xfh4X;O&$)G=(PG=(g9FHYP%dvon zjiY6@kZ_TF;+=|!?s!L#(G|3fkj`?ONKqTakhP~SFkLAS$7=L^2XVmRhMtZ^UU4gA zrY*3aZ>FOXGkTgi6WKQu_D*;T9mZK37AIA%ABcf|J6zM7@E4l+7Lr7QDR#G|( zZX`y$$93bQ3r=Sm#KD@q-$5R5x}lYiBjN;w^nJS;>leu(lge!$HTZ%gsZauurvyik zRMi`*O*VGJmPlq71w@JLgds>`*I`#=m~0}lJHA9RyDA|{XlERLQpLw|2~2hYl|!F6 zvH)itg!2;>&x>7;L$n){PO;DhIQAsmWjOJ>0Ck@21;NDm@wEx|o1B%kHs+AtjfPgq zU7T@^)m5;m!ty&Cs+*e_^kSGUE@SY(Jca16pUrHfOps1TNGwWNC|$h8pd&jKq+|K6 zbE41cY(?SS8WDrzOmG)ZFuIzw=m%eWi#xN5m>4FQtVk+$7myuT$DZIMhhnmUBu7QF zCQ;Q9-^@m#?4p6M-QqUidXMeMdqvux3|yr*sC*`D+r^zDFHy2^Rb3Qiwj|ltj+uQ@ z$*p`=$IQUeef=md^vJvttmz|Tpxq`WVkeG~xNl?}jQZtTC*}x=6OA)^8 zR#srIrj8%jTiZJ#UY>;|BNG^NStL6T9FrOei2|8Ms7MpZ9&Kc07iF(zq~)ufwjK21It+-b0M9zJl1=J zV1KvPx7!D|Ym;T{tLc=k=wZKI#Ur9@;r(#6jvYBP52bTbv)eYRtX zK2Jp-Gbb>F8wLo9?dltb)6D_ENNkBnPP##-VU@8TY4q8cop2bo=~{x*)n^P|da2yh zPh0!5v$4~bP;gr(YZyCA*+-R%mPQsiOS%{L@yYUSC1V~1c;^Vmn7|-A>@2qHt!z)- zz-<9`F&+gj_?dmr4uS=z_VRIDN9vI;hJw%?RM^|UI~XzvH^CItNKezUj7p)y8; zUd@|1stms}V9kDNY&6PI`X1K{s6$9-HVh`sK?!mAOp7w>-dR(hh#h-OuV7&6y>Zy- z)=^#}$&-iPFF#x)c@1Tjq<5Ns7_*+9?Nmwjh>>}Obf>&!s!mfaknyik8wU+JzLwQy&AcjjqQc=Uih8XwJ$LyS;MTt+y?eWGKi@mkYozzip3a; zfk8)nG&8)W4~9hevt8U(l1aWc>{BY+srxuPpN8YZYz~41>xDpe`+6bpHl8-TB)Io< zpK@)FjQ(>it!gqhc@#aUC7}lok8ddvqrYDVcl3`A{q>wm?fkpHt#=bWl$U4XwGM07 zT1^*sbGsgXs0=(gus<>QAhA43K`VegD7Gc~GI>}#k59pDA1vLCO_@ioC!_K8c~9?O z8RwJBzGhrp4fOHVdEYR{SCiotWgbCcs%7uW0D&!0cKcy?ar~0a=ak?{^hMr&UJ|?* zyC#(0rrh`xjw=-n1>?kDM$Pu#dMbzE$whXTPNszFs9d4WjK50ffk$iLk-Me2C~)rA zFF9{iH2hf_SED0O+PIoEdBORj!rV)?Ej*!B6nycf#i8YCS{9EYKTX5ZW;nD{*}T%& z;rx@UQ(df-TQysqkmPybdiLmozH#rJt*!TG_rC2tTQuU&?*D5q1GM1F>uICQ8Eu_d z;m0@Q8;MmIek-vGXWvYV_qO+FuWr`vy|wn=EEfO#^UsHK|GV=Ln0oYoi@@@~Eo^^j z(Gy>GnDB8$Da+l%d4K%z!+dc$^bgzRXDTzMzv=p)?meAzxE}3Jj>jL~nZGTx<$C-) zzWDrPPpuz^5F!DX(&>L-1$+OKy`*!Csk{6Z{%;%>nHuJ^yI(%hVTR*}-WxsHlxmW; z529c7e)6lI{Je@)pBl05i{$6U*0xvv!dkhz;NxZbk3K2(W&J!})HKVC*Dn`|^}e-T zSj+$I9nT(rd}f)%sOZ^io6eJXD)#zCcW>#S;PaDb(^sZTo~MOFVE-GGy}xW#rk8jl zrtn`U=qB>)3$@oc5_we5w*Z=)-MP}GrpW64?ANPA_z54y%rMt4vuEIZ`-G+8=?3F`J&HrQT zI$J7#b`y%Az7(Z zB8an0y`5)=mIlAasQ#JJ|Kt2@xLn%4@7zZl`F|9&iWRnhCq>rw@8q=Nk1win*!&(n z+BsegecujBiv7G=Cqr@3i$Alno;?XY9JR^Uqw|et?Vg$9?bqYr&opkn zB5lJn1d2!wXYSXd^&K5oxvxZB@30Hpcg`zm6W5ma-Pyhl*IrwJMMpWbR;NYED^WQ; za}8H1{(Qd+gA!he>U83512)X^hK@w5?bo)bm^jg!cVPs9_c~nt z+B`fB&*Q$^;eRP58J)&Q-?(8I+$&kdMPJ6leegsoCm(UIqous3!20#;Q1ycye0RNX zuS40{oFWWfiK@|NAVpk^UW>lbHm2Z`=w$mw6sZwDapKqahG;u=dprDC_wrA;ze1tT zUhrc?J8N}yf5!cwIj!8B*D{ht8}qN`gJ~Y_zzej3pP;8jDo0zjpD4DJu7lLo{|WnC zr1h8ESJdean|u1mt2_6n93c*rC}Q(Ebp3MsYDR}ITjzleH$ESB_U$TM{XRH!K=V4> z{GX4nWXZD#kEG~o$Krv4Jw?Xi7d%v2(8<+u?|Jrid3YVoVG(Z)<{!`cE7jY0rFxsM zMDI9)ju!gSvFY}eeCL%}Z~BxrqY;(vP|*fPnqY7yk^y0a6KtbN4rj z!W`!Ao-VuOQ3_{ouEMZ}WLHxa>Pdqu5`$a{!b!qrC{7{>@9k0?M>r*UbeEOgQ zyj|1fre}MVGWEu@{b;~h+*1_E+NRjGaKdzdmf=RoHaK)M4eUhRj$)c95X3)=!mZ9y zH@>yk6o=`by@^6PX%vfBNiW{mk9S{YkP>%A`dK>~^SAK<`qX)_mxpB<2J#Cyu)#zn zE=~5fY1*WA`s;M#idjlrm+tw7OAr6bb5?1@*Dufvk!?zx7&(tRbhzUb-rxRZM#7q5 zGTld)kL@+hAIWGD<=y&aJXbPGq1WcLwz1aEk3ul)FVJ%n@0E>H;l-$d|1ym(wnnC( z($4wwe9J^lgHEftR{n5xoHVY^A2N*faO$c!r^5dcbh3;8>-5K>X)0P-EdQ73j!8pH ztWx1HS|JAR(oG_zew~Jv*`>m1(X#MYYh@sW=VBfF`-M8*YB6{ LTHP}D&71!RH+XaV diff --git a/libraries/godot-iap/addons/godot-iap/bin/ios/GodotIap.framework/Info.plist b/libraries/godot-iap/addons/godot-iap/bin/ios/GodotIap.framework/Info.plist index 7cc8f2d57684018f2b7bf7e10dc523d36d3bdf8e..2aa9c6cec38c83fab25a7b91093a371a29ad75b8 100644 GIT binary patch delta 80 zcmV-W0I&b^1@i^4%K-*eGBrjxG?UW-W(QU>Ge$TuVUs@s9tk!uRxvk5F)=ffWdcJV m(E-!}-2wOk`~m?21p)^G5CRecHv&EaM*>U&Spr^@#{w+04iww~ delta 80 zcmV-W0I&b^1@i^4%K->iGBrdpF)}!l(E(-#RWdV1H#3ty0v-r8FjX-(Ml>>$WdcJV m(*f22-vRmo{sIF62LcHK5&{$gIRZZdNCHg)S^{5_#{w*b)K#L0e4a-3!cVTR^zhK9zIOPHMHFEUZh+bXZWE%0;6|v{32p;!1130-7y&neRsn4#xB*rL+<-?d z!EHjUPS7eLE(ABgwgTEpa3k32fLZ}|Y(4nv2dBhZm30VSd&bQC%o9fN*`evXn+3Q9%CqT|r<=mc~k za-pRt4J|__p_9=mXgNwpD^LbH6`h7oM`xfjQ6^f6vd}NkS?Fx^OLPu$qg5yyor}&x z=c5bIg~)?)P%gR%U5qY4m!iwIA06#=9qKfO(A0C#26#OZ)1yXyLLulzKe$ zHY*o~jj8f@(y=9KH(Q~8ENh>(XnL*UPoUVpQCTOj=7u}fgb%CMwiBqT(5@4_7cs-q z6G53ao)}u(W<#5XfHVJ)=1!#N?0RLp=$WYvF2b{Ss}<|?JfvP@+x?m}de)a!!fhb*fs!)X;%-tqv~4)eCSV)Pjw$YR>`1<{ zPRCZO#BB3zYC4@Yr{Ab?!cIfIBF}(5w<*myK2usNpYY|y=R72Fk#tbMQ4(ox>y;RHpQJPg6#4-3;QlsXC@o&)dH3?A!Q{e z_=qZ3l1#os?JKEmP`}y1T+Nv6Q(P9c;aUkC*X=6JV&K^-HHDa?Zpi-MWmPUk`~uW! zDR2g_RsJtnNF--XcV%I3s&YkSE=W+`zo$c z)wzT#wCP;Jp0yglIte#x#=<>{JCCq8TUqB}T`DnKeYKj*2DHs=?K+L`u@UEcj|;m> zY3DP9r&9UnGs8%>I?Q`lYuFfdz2+bbNxXp0eQT9{0ehoOEm*Fm9fk%?7`OvmX!BjK zj0@=!tHKMt7l&P~&OL6YB?DJz@j?c0E60P4y+KtTrb)j}?U3uR-@~Etlqfz2TdS2h zRLvKt6zeo>P?Lqbw9UfdXKUQ-ydrY39Fnx$P^UbzZ3U{yWu`I>VL2mq8+w#@5x0Q^ zwOkYm?lAZ@VJK7d#dPGN%($3wyec%?bB5~8Mrms(yH2B6$8&=gEj*}{OKkFADEAV( z2#eHi^yX>Cm|UQ&OIby%8ZTuEm$n(&vr`B= zVGDC|S-9+UC3y*l-=J(`<`pW3wk=-Lv0n9hnQ2VXdDy{Im66BTvujkJNA*atI?dN+ zXc5oWrQ~yTR;Vf;7o|=4bgEsg0j$$=m1ZoQthmc$F{|R%3CY zdW}7&Xwu5OiY}lmYK<}qu=6U!av|3lxb!XAb+JYZm~!eIrCvdiOF37N^{W!tNbMFK zQNP)!)tWKO7Wycf*Gk|7uT-gzX)D&K$ymKy-9CnNU#`ePsvESlkg|%^$~T*!jb_t} z)q!>T@-=K6yhwA#iVKuf1V`2>+vvJn<&fRjQp8Cfm9I$)yVogZE%aTk3}f>tDl%5A zSG}<;Po0occjwwYlP_90aI#X@u{Q3`RqODx9<@WR!v1w^(TJwkad}^^_$x^UmnrK? zihY-<$-JjX-NvrVG#<*QDRRAS=%vbEZ}o+$!E@RUt!JqTmni8f!kHH+`zr4M$2_{2 zrSx2(jAEu7QK8wX6IG9O8h9@=_FbY;;$bIh(QMGC)Dl>cqudh4PS&Op#!fz0GgznV zG-Z_%PEcbh;n|}#Udq@3MO@9;u8Wm+HP)v*EXQ`EMVl{BhedldbTzlwS|wgXGFGb$ zJnFAupph)~UPBERIZ>zW9K~FVoz;qKvA$dtnVnbNwG{i$)u>sX@n(IOD)%~;T%DsT z<6yGdA=}@79i83TnlU@5xa+YMS<1SeE#UgV65VEK&@M~zz>O?ph$xTJjAK7jKD2YF zjC6uq9Tsl5NW;dm3pHn)Jw{0z*gLLsRK5XUe3n{`wP&i=n2@VUW5WfCDQC8$l~Io6 zI2Rd5&Q^Un-2@E(jD@|5yOA;7T6rTo zqdHAZH`XpR1&sV8fBh zzKNOUGu3JwS*}To&t@y;X6VaS#?6d!go7b@SFe7b6? zZ03_RY~Fv4<{)?1#9M5tSY_XW9nl7})u*Wy>tvp)UOZDynl0m8yA@WPr3|Cz5EVf- zqwZF!2DQ~NqMf(0OqWuAjcZWOuf0z=;lI?(ujx{qrTE{#`2&^p8`cw>p(Z>BaNBP} z)w>LA#BD4i^JJynX2oYI-#C`38e`7^>bQ;0Q|X#BAI{CUnn8GhtfpJ+St_q4-4ml; z3v;Dd*psf9jo2Qo*obX*smN@U>OwY6of|nM&05&V>JyYx12VO#hFV{i25LeROq-33 zR{ZVQSgpK0wAvDbPmKn)#1POf;PjlR$U9g|^HIu&EOGN49C1&w=FBE*)tywiGF5&j z8#1y&t;X5?)C;+aCoJtgNilaZh&xq9caip-se1F7`)SmC@C+>)lQWchHyqqoxscbY z%DZh1X=*n+rGB%;$(p&F-t(!-swJGPl3MPpN2&?uRGhBvTC%Qv6j_IlJzZ&#Ly}iV z)!wQx*QL#M3^n4?u-Slin+aAy+D-?YXyLM28_YjRe zRrU8Uk87DajSUeRHFoh_H@2lI^|vq~Lb*n7hN?oIjWPzpHDHW7TrIlb=sDz_x{ij6Zg|MT+t1n zSSx_j$1!Li$qm+`9&NR#FHEBrt=57?!Dp$t`6rE=^(o>3tUFn04`BP0XV!P9YRtB2v)S-O4L`t$ZY4g*v{731 zp!W&7PMBjqKLmI%JmkG-N%6w|y5}KpioIPBcBYQe=tJzUzGJm$ocg&^ABKT>)dI%UV&G#%iw$&wVp^^CM->^n64hx;K1hqLOpu@yG4h~t zfD`*4Rf*`BHkqAD(0~~00L4E_pNd$OLRPcwQTn*F%h0Td$EXd=DeW8F;eY;nt_}Zahpg-MJQ_%Vc!8N-NcBzXcK0rU4}kI zw1WgKZRa%e|5G*XbaiPnQ71fJ!+Y%RkX=;L6O0t~Ph~&BgvoJg#j~S#JVA9|oF*;p z{a!Iol6J+a$T)SFI-exo{GCSeCnUs1?d4B=_osD>{Xd;_bnIUC?~=I1pDx*Z@hAKL zfqU(BhqKq4PB2=zPlblBe9G3guLjIcY5FN<3ml^Ory12fqbz7|;7=2FAEG7;k4&rk zX|^^~5znxFJ}m`K!@LYRz;hs&Wur~(G#vk;&wiD*g_(e+rbor+GIBTPz`jD^=jJe*f)yb zf-Tm{E!eUsm2UCoE=l-le{J8wr8TBq#2G8%S<>_0DD7FM%sgEAM$i7Lfjl2Kljf;3 zWa!iGJxKgLZeFVlK5a1YVr}Ts4nv^BC-Vz+TC`d_&5k%)#5xrVN_{ajRL+YOyHyFCvU#;zv{?NX4QSfnQQRLw z1Frl7`>Ixr=9;z5P@!E04$n*UcSk7gB}VW1T=|fly^%0Qn_uEN_qm46MQe`Sk|>Vw zQ7?0ZxmUeRU+Be25o6Ynp zVmo72|5y3jsUF!!HOBd$)B)L@LzZs-QAw|0eOmPja|ORwIo7Fm)N0`}?I6s8CJa10 zUbPMVk1}3mA^z`F|0+ei;#oN12aTE?(}LOXMWw!GLyamIa`&%%jd0hT+AZw=K?BC9 z8O>O_S#htE=C+mfI$_rml^VO|)nuF7;k zA8MGWQx>i{WB9C+c7!HbwS#o+KU9u&!Y9;f49=+6(q2uF=Ez0&f+?*q@E4L^cBfBU z%>}g6P@x5|q+zcp9s7ni#qs{A+&37>^MR_Mee8RKiDLh$0SjmTq!|lmD(+3f-uIRD zCgIw>RBBBAUQKVZF-f0g^~1q0lw}Oxp;E{jOk+P|@s4Y#(9!|Wtc?cFHUob;e3!37 z5@yx=+~s#bVdIW+w+w&{>U1W$5sDF#_#$>oyLYQG)mlVUw>jOzVR@) z)Nd$O+@INHZCVMO@b6S=_H8x&nPgDoe-3qA`W~nJ*ypNwkMa6u)bSqk48Ey3JO?^) zkiH3DDtnM{?WbxTq-=Idz2+Ozf!*$w>$zoz#f?tNTPD-AxC>_OxEtbA6xa8B1h6!`&bng6rWjAO4W z-U(uq`^R-exgl!YbH5R|3Dr553YBzF~4H$#l zH51}jiXXw(29;$j-mcP+|4L29o}jvo!ETL*{I`nSiJ$sZX*)TL>DsuHLOijGnL50Vx~$l<5ZtmGqgd{cp;KOtj%MdIw%q>u2nU z9!-2k)$Du97{j_$Hx`<3>ljh@i&`8DtubX6Q9f}SnpJ7w6D)9gUeLfUY7#VUQNG3* zC(83CYn)k=KT)YM_60Q=JzuKZ=>AaS<93e!Nok*lR+aZTy?xsFd1woV%nfQca9kfL z>2LJu+N$io(P!*0YBeADRK3RZQB4|W1B&@OV+FP1?{xG1MMYT0{i*6LJf^J{P7i2w zk6kc3^?_2q2xW7=V9I$_0;l?UwOh1H{bq|l(2Qk2QT&%IpyxT28UydE`%9|)+Vv$> z{ys$p2{*s1{2<|gHU{YwrOgKZ@)l&%0!o~)X+Ki-1hwhESL+0|yjxnhYes%Vn(`9XD>ZywdC`PnT>{R$Qjs_HA^wWDe`@7tmoJh!>HuNijaJ!O4O zI%-sA_wQq4D^>doKSDbl4mvx7?f2iwEj z*gx1FzKzB?!4dWTgCRV_nluLdiusn}2Cev(^x&UV^eyYE-Jwnk2ep$h_ml<8j(n)p zDLQ%oq}&jnQ59sSO;e=j-_?MHW8c<{v7$%u({Svs$})QYsM2XhdsTugZsZ3z%W_+NacEmUm9GzJAS_omb*_*oxPb{T-cRUspL~;VpzY zm^%!-IDf}JsMU(^LAC0>r_0p)>inKAU40rgdY{xHWT&V6leGJ7<^B`fqe`=!H0@ZY z?FkK7xIxnvE`Ce#|6+%Ya9{fuVXqqhW!3Mf8|(PnHE!WSMf^ZG>P@BnfK68(mWSxZ zP_$hgKQKnr8=AAMM~Sl(H*8b(EMqkPS>=#UEf)4}Qm@%AO_-h9p_tuN1^%QA<7}IX zjLmJThg|(zcT>i5d(`Z#7R<)JtkgN|ymIES&D&Hp7rM#xW9c((@GI`$e6!?M4G=M=xAMUu|Q>q`9}Oy)NokgCf6 zk)G{VyM?`PYrw+Enzpd3Me+0O=B{ljohRM*rkWsIyKSDduUX?3_HcJtfMs1ugY4(L z1=3T$SB-@$-cZK^qohBgIrFoCl-^bxs~13pT3;>kMvDhjHpz z4I8^&(OfA0vXYkI{SC^7_GDVZY=MAUm*m;k8xvTLW^_2wwk^sCr+B_wMUV@k&cgHe zsnf!loQKA-=d>73XFm2ske>CcDuQaCHeorC{RY0)wj_`3_(=M2(q?p3KV@Uohq zotcr8RsUAwk$L>B|5>H&O?XOqdlRmBN;PJCv>D5KhW5_0m*B*GaGZ&TWNp}opj$f( z9!2j<$FUccu`lD*)~SA92JmXDg#*uN)WV)kO5Kkz-}~;z5J6S$M_(R9hBn3RPiUTARbvc)M8l9vD>0fO1KJRs zcZ(Aq&}208J+GJ;aECHt=o=eQ5oG#0qE74`>NMM+on}Y4vsqPUK&c1V47aPw*!83a z4xlVn(+5yC`>5g%v;{q{tPr=T6q0T{kke%935{FW-=@fepzBekLDG2#k)Ewq$3eF2 zCp2f_5hWhXpkq?@!C03zm@VF{R;*Kdn|dvru8B~%T``AX`OEwvRC)X=!a7~QQT-u| z8Qi2%;$e?z(ZYSrN{waDG^jF`XrDG2n$>UMq={vB@kM(a&Z81Tn;PQ?#%hdWxxhSA4WEzLm4ov zT}6kH|H87it(AY=_sZjyItdWo`MlaQ^n25;8mWX zK^uY7z@zbK`b0gdVWYQ9bC8Ec;xVLaA5r!(*fwo2+fb)gtdq$j(!$)CESzw?Vtz(A zc%L$io`+Qg=~eeLrgCYk!LOYLj~0L}HudM!j@_o*pR?GhtJMDgoUwS>E)At{lPJ|3&S{X6 zQep4`Wv5bHs`6CU5o}Peg^OD?X-s}VF~>q*i8731kEzHwf4}OFrJf%?jhdfo)}qnX zq}1b##mY5SKdLHY;6Ak>{)WX+Aovu5wT>b9`!VT~Kx z8Weeg`SnUOHb10%qo+YN#=w>8For*-;ZXh_%|UKzi6=6gt47%;l8${)<;KDL)oS#u zQ}2nas;f>hE_`y6GK^CtDl#^#RXwyr=wjE^YSdg%3oZt&tybz%E}bq_F2&9_s(mTh zdG(u(Ez%6u>3dl5Y0!PQvW&q-l^Q+wswosNRCgLnD85UP%jnL}zm{=0dXxw3hb=YB z$X48`VX{v31DZ1i?@`i8uiS+Azgc)a!7K~+Jd}?vN2|9-rmtBnXTL=}vt}(Qd1lRb+${3^YaZYO&xD^K zx53S8);j(})UkO@8vAtT<~7T>MMQM0S>}u#tc;E|X-?osl|l|ji-n^OcqsPZ4Ae53au)kF5^wk?*9)Z~^m?T#yEd;PO(sF4O7D zNb+X{FQt6K@Z#LsYADk#Lp8rTD)`QsU&gPC3TC)VP3IH!ZBM+s;Px;ZeKodLL#tU1 zugGg~{C?EH9ehn_j*SK60$O}4_zK=|W-r=aQ&^B2 z#)E07h+6(KxRz|K3W3wGT1{&U(j3oK>V<6Wv}L1|xDLcBXC0FzDEdmawkKcZS5m_V zvn%OZ!OwWi@--BeE=$)_6q~Q6^#w(2%Jh1Q!q4FsF$KL8?Yb&7V01AHb!$^GZdOAE zmllBI_A0G}@p@EPLX=|yoOGXhOA3mdvdffI${zD8`f9?ntCV#$>*jYI<&ZHp5w;y+ z;Hh#oo61+g*RcFSC0-jEFvq|%065+pbzaK=Q8^mFmh~oU<#nvAc>B(KS63~fN==mvBn`W3nf-Ha+wC8|QVpj*+e(QnXgs2XiV zHRyJ92f7p8h3-bRs1DVmd(dyuz34u4KeBCUL`~=c^dNc&J&Ybf&8P*nBB4joW9V`8 zJJg0Yp?35HdJ;W_o<`3gKiZ5s&=&M8`aOCMJ&yutE9yiqpcl~}&`aoL)P=U8ZnPb} zf?h?hq1RCl+JSn}8|Y2+7J3`KgZfZE8bI%&KcYXOKcn~1AR0o$=za77`V0Ci`Vftv zooEz&gg!=}pij|fXbkN_tU1e?v#t51HRo94wq}(z+18wE&3R#O delta 13200 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 H|5pA#M8AQ6 diff --git a/libraries/godot-iap/addons/godot-iap/godot_iap.gd b/libraries/godot-iap/addons/godot-iap/godot_iap.gd index a9f41d041..e01ca54b3 100644 --- a/libraries/godot-iap/addons/godot-iap/godot_iap.gd +++ b/libraries/godot-iap/addons/godot-iap/godot_iap.gd @@ -203,9 +203,9 @@ func _on_android_subscription_billing_issue(purchase_json: String) -> void: ## Initialize the store connection. Must be called before any other IAP API. ## -## This wrapper currently takes no arguments — Android billing-program flags -## (e.g. [code]enable_billing_program_android[/code]) live on the underlying -## [InitConnectionConfig] but are not yet plumbed through the GDScript API. +## [param config]: optional [InitConnectionConfig]. On Android, set +## [code]enable_billing_program_android[/code] to Billing Choice and use +## [code]billing_choice_screen_type_android[/code] to match Play Console. ## ## Returns [code]true[/code] once the platform billing client is connected. ## @@ -214,12 +214,16 @@ func _on_android_subscription_billing_issue(purchase_json: String) -> void: ## [/codeblock] ## ## See: https://openiap.dev/docs/apis/init-connection -func init_connection() -> bool: +func init_connection(config = null) -> bool: print("[GodotIap] init_connection called") if _native_plugin: if _platform == "Android": print("[GodotIap] Calling Android initConnection...") - _is_connected = _native_plugin.call("initConnection") + if config != null: + var config_dict = config.to_dict() if typeof(config) == TYPE_OBJECT and config.has_method("to_dict") else config + _is_connected = _native_plugin.call("initConnectionWithConfig", JSON.stringify(config_dict)) + else: + _is_connected = _native_plugin.call("initConnection") if not _is_connected: print("[GodotIap] ERROR: initConnection failed. Check Google Play Services and billing setup.") else: @@ -436,16 +440,19 @@ func _request_purchase_raw(args: Dictionary) -> Dictionary: var params = { "type": purchase_type, "skus": google_props.get("skus", []), - "obfuscatedAccountIdAndroid": google_props.get("obfuscatedAccountIdAndroid", ""), - "obfuscatedProfileIdAndroid": google_props.get("obfuscatedProfileIdAndroid", ""), + "obfuscatedAccountId": google_props.get("obfuscatedAccountId", google_props.get("obfuscatedAccountIdAndroid", "")), + "obfuscatedProfileId": google_props.get("obfuscatedProfileId", google_props.get("obfuscatedProfileIdAndroid", "")), "isOfferPersonalized": google_props.get("isOfferPersonalized", false), "offerTokenArr": offer_token_arr, "subscriptionOffers": subscription_offers, - "purchaseTokenAndroid": google_props.get("purchaseTokenAndroid", ""), - "replacementModeAndroid": google_props.get("replacementModeAndroid", 0), + "purchaseToken": google_props.get("purchaseToken", google_props.get("purchaseTokenAndroid", "")), + "originalExternalTransactionId": google_props.get("originalExternalTransactionId", ""), + "replacementMode": google_props.get("replacementMode", google_props.get("replacementModeAndroid", 0)), + "subscriptionProductReplacementParams": google_props.get("subscriptionProductReplacementParams", null), + "developerBillingOption": google_props.get("developerBillingOption", null), } var params_json = JSON.stringify(params) - print("[GodotIap] Calling Android requestPurchase: type=", purchase_type, ", skus=", params["skus"].size(), ", subscriptionOffers=", params["subscriptionOffers"].size(), ", hasPurchaseToken=", not str(params["purchaseTokenAndroid"]).is_empty()) + print("[GodotIap] Calling Android requestPurchase: type=", purchase_type, ", skus=", params["skus"].size(), ", subscriptionOffers=", params["subscriptionOffers"].size(), ", hasPurchaseToken=", not str(params["purchaseToken"]).is_empty()) result_raw = _native_plugin.call("requestPurchaseJson", params_json) elif _platform == "iOS": var apple_props = request.get("apple", request.get("ios", {})) @@ -1401,7 +1408,8 @@ func create_billing_program_reporting_details_android(billing_program, developer default_result.billing_program = billing_program return default_result -## Show Google's information dialog for a Billing Choice external transaction (Android 9.1.0+). +## Show Google's mandatory information dialog before a developer-rendered, +## in-app Billing Choice screen (Android 9.1.0+). ## @param params: Types.BillingProgramInformationDialogParamsAndroid ## @return Types.BillingResultAndroid ## diff --git a/libraries/godot-iap/addons/godot-iap/types.gd b/libraries/godot-iap/addons/godot-iap/types.gd index 769c5d933..28193ce4e 100644 --- a/libraries/godot-iap/addons/godot-iap/types.gd +++ b/libraries/godot-iap/addons/godot-iap/types.gd @@ -21,7 +21,7 @@ enum AlternativeBillingModeAndroid { ALTERNATIVE_ONLY = 2, } -## Play Billing choice image layout (Android) Available in Google Play Billing Library 9.1.0+ +## Play Billing choice image layout (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). enum BillingChoiceImageLayoutAndroid { ## Rectangular image with a 4:1 aspect ratio. RECTANGULAR_FOUR_BY_ONE = 0, @@ -31,7 +31,7 @@ enum BillingChoiceImageLayoutAndroid { RECTANGULAR_TWO_BY_TWO = 2, } -## Choice screen renderer for Billing Choice availability (Android) Available in Google Play Billing Library 9.1.0+ +## Choice screen renderer for Billing Choice availability (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). enum BillingChoiceScreenTypeAndroid { ## Unspecified choice screen type. UNSPECIFIED = 0, @@ -41,7 +41,7 @@ enum BillingChoiceScreenTypeAndroid { GOOGLE_RENDERED = 2, } -## Billing program types for Google Play Billing Programs (Android) Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, BILLING_CHOICE added in 9.1.0. +## Billing program types for Google Play Billing Programs (Android) Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, BILLING_CHOICE added in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). enum BillingProgramAndroid { ## Unspecified billing program. Do not use. UNSPECIFIED = 0, @@ -53,7 +53,7 @@ enum BillingProgramAndroid { EXTERNAL_OFFER = 3, ## External Payments program (Japan only). Allows presenting a side-by-side choice between Google Play Billing and developer's external payment option. Users can choose to complete the purchase on the developer's website. Available in Google Play Billing Library 8.3.0+ EXTERNAL_PAYMENTS = 4, - ## Billing Choice program. Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. Available in Google Play Billing Library 9.1.0+ + ## Billing Choice program. Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). BILLING_CHOICE = 5, } @@ -67,7 +67,7 @@ enum DeveloperBillingLaunchModeAndroid { CALLER_WILL_LAUNCH_LINK = 2, } -## Developer-provided billing destination type for Billing Program reporting details (Android) Available in Google Play Billing Library 9.1.0+ +## Developer-provided billing destination type for Billing Program reporting details (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). enum DeveloperBillingTypeAndroid { ## Unspecified developer billing type. Do not use. DEVELOPER_BILLING_TYPE_UNSPECIFIED = 0, @@ -176,7 +176,7 @@ enum IapEvent { PURCHASE_ERROR = 1, PROMOTED_PRODUCT_IOS = 2, USER_CHOICE_BILLING_ANDROID = 3, - ## Fired when user selects developer-provided billing option in external payments flow. Available on Android with Google Play Billing Library 8.3.0+ + ## Fired for External Payments (8.3.0+) and Google-rendered Billing Choice developer billing selections on Android. Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). DEVELOPER_PROVIDED_BILLING_ANDROID = 4, ## Fired when an active subscription enters a billing-issue state that requires user attention. Cross-platform unification of StoreKit 2 Message.billingIssue (iOS 18+) and Play Billing 8.1+ isSuspended. NOT emitted on the Horizon flavor, whose Billing Compatibility SDK implements only the Play Billing 7.0 API surface. SUBSCRIPTION_BILLING_ISSUE = 5, @@ -217,7 +217,7 @@ enum IapStore { AMAZON = 4, } -## High-level in-app message category (Android) Available in Google Play Billing Library 4.1.0+ +## High-level in-app message category (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (upstream API available since Play Billing 4.1.0). enum InAppMessageCategoryAndroid { ## Unknown in-app message category. UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID = 0, @@ -225,7 +225,7 @@ enum InAppMessageCategoryAndroid { TRANSACTIONAL = 1, } -## Response code from Play billing in-app messages (Android) Available in Google Play Billing Library 4.1.0+ +## Response code from Play billing in-app messages (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (upstream API available since Play Billing 4.1.0). enum InAppMessageResponseCodeAndroid { ## Flow finished and no developer action is needed. NO_ACTION_NEEDED = 0, @@ -436,6 +436,7 @@ class ActiveSubscription: var days_until_expiration_ios: Variant = null var transaction_id: String = "" var purchase_token: Variant = null + ## Unix timestamp in milliseconds since January 1, 1970 UTC. var transaction_date: float = 0.0 var base_plan_id_android: Variant = null ## Required for subscription upgrade/downgrade on Android @@ -732,7 +733,7 @@ class AppTransaction: dict["originalPlatform"] = original_platform return dict -## Display information for developer-rendered Billing Choice screens (Android) Available in Google Play Billing Library 9.1.0+ +## Display information for developer-rendered Billing Choice screens (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). class BillingChoiceInfoAndroid: ## URL for the Play Billing choice image matching the requested layout. var play_billing_choice_image_url: String = "" @@ -865,17 +866,85 @@ class BillingResultAndroid: ## Details provided when user selects developer billing option (Android) Received via DeveloperProvidedBillingListener callback Available in Google Play Billing Library 8.3.0+ class DeveloperProvidedBillingDetailsAndroid: ## External transaction token used to report transactions made through developer billing. - var external_transaction_token: String = "" + var external_transaction_token: Variant = null + ## URI to launch for an external-link Billing Choice flow, when provided by + var link_uri: Variant = null + ## Original external transaction ID when replacing a subscription that was + var original_external_transaction_id: Variant = null + ## Products selected for the developer billing flow. + var products: Array[DeveloperProvidedBillingProductAndroid] = [] static func from_dict(data: Dictionary) -> DeveloperProvidedBillingDetailsAndroid: var obj = DeveloperProvidedBillingDetailsAndroid.new() if data.has("externalTransactionToken") and data["externalTransactionToken"] != null: obj.external_transaction_token = data["externalTransactionToken"] + if data.has("linkUri") and data["linkUri"] != null: + obj.link_uri = data["linkUri"] + if data.has("originalExternalTransactionId") and data["originalExternalTransactionId"] != null: + obj.original_external_transaction_id = data["originalExternalTransactionId"] + if data.has("products") and data["products"] != null: + if data["products"] is Array: + var arr: Array[DeveloperProvidedBillingProductAndroid] = [] + for item in data["products"]: + if item is Dictionary: + arr.append(DeveloperProvidedBillingProductAndroid.from_dict(item)) + elif item is DeveloperProvidedBillingProductAndroid: + arr.append(item) + obj.products = arr return obj func to_dict() -> Dictionary: var dict = {} - dict["externalTransactionToken"] = external_transaction_token + if external_transaction_token != null: + dict["externalTransactionToken"] = external_transaction_token + if link_uri != null: + dict["linkUri"] = link_uri + if original_external_transaction_id != null: + dict["originalExternalTransactionId"] = original_external_transaction_id + if products != null: + var arr = [] + for item in products: + if item != null and item.has_method("to_dict"): + arr.append(item.to_dict()) + else: + arr.append(item) + dict["products"] = arr + else: + dict["products"] = null + return dict + +## Product selected for developer-provided billing (Android 9.0+). +class DeveloperProvidedBillingProductAndroid: + ## Product identifier. + var id: String = "" + ## Google Play product type (in-app or subscription). + var type: ProductType + ## Subscription offer token, when applicable. + var offer_token: Variant = null + + static func from_dict(data: Dictionary) -> DeveloperProvidedBillingProductAndroid: + var obj = DeveloperProvidedBillingProductAndroid.new() + if data.has("id") and data["id"] != null: + obj.id = data["id"] + if data.has("type") and data["type"] != null: + var enum_str = data["type"] + if enum_str is String and PRODUCT_TYPE_FROM_STRING.has(enum_str): + obj.type = PRODUCT_TYPE_FROM_STRING[enum_str] + else: + obj.type = enum_str + if data.has("offerToken") and data["offerToken"] != null: + obj.offer_token = data["offerToken"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + dict["id"] = id + if PRODUCT_TYPE_VALUES.has(type): + dict["type"] = PRODUCT_TYPE_VALUES[type] + else: + dict["type"] = type + if offer_token != null: + dict["offerToken"] = offer_token return dict ## Discount amount details for one-time purchase offers (Android) Available in Google Play Billing Library 7.0+ @@ -1304,7 +1373,7 @@ class ExternalPurchaseNoticeResultIOS: dict["externalPurchaseToken"] = external_purchase_token return dict -## Result from showing Play billing in-app messages (Android) Available in Google Play Billing Library 4.1.0+ +## Result from showing Play billing in-app messages (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (upstream API available since Play Billing 4.1.0). class InAppMessageResultAndroid: ## Response code for the in-app messaging flow. var response_code: InAppMessageResponseCodeAndroid @@ -2356,6 +2425,7 @@ class PurchaseAndroid: var product_id: String = "" var ids: Array[String] = [] var transaction_id: Variant = null + ## Unix timestamp in milliseconds since January 1, 1970 UTC. var transaction_date: float = 0.0 var purchase_token: Variant = null ## Store where purchase was made @@ -2559,6 +2629,7 @@ class PurchaseIOS: var id: String = "" var product_id: String = "" var ids: Array[String] = [] + ## Unix timestamp in milliseconds since January 1, 1970 UTC. var transaction_date: float = 0.0 var purchase_token: Variant = null ## Store where purchase was made @@ -3953,10 +4024,10 @@ class AndroidSubscriptionOfferInput: dict["offerToken"] = offer_token return dict -## Parameters for showing a billing program information dialog (Android) Available in Google Play Billing Library 9.1.0+ +## Parameters for showing a billing program information dialog (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). class BillingProgramInformationDialogParamsAndroid: ## Billing program. Currently only BILLING_CHOICE is supported. - var billing_program: BillingProgramAndroid + var billing_program: BillingProgramAndroid = BillingProgramAndroid.BILLING_CHOICE ## External transaction token returned by the Billing Choice reporting-details flow. var external_transaction_token: String = "" @@ -4005,14 +4076,16 @@ class DeepLinkOptions: dict["packageNameAndroid"] = package_name_android return dict -## Parameters for developer billing option in purchase flow (Android) Used with BillingFlowParams to enable external payments flow Available in Google Play Billing Library 8.3.0+ +## Parameters for a developer billing option in a purchase flow (Android). Used with BillingFlowParams for external payments (8.3.0+) and Billing Choice (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+). Only billingProgram is required; link fields are used when the selected program links outside the app. class DeveloperBillingOptionParamsAndroid: - ## The billing program (should be EXTERNAL_PAYMENTS for external payments flow) + ## The billing program. Use EXTERNAL_PAYMENTS or BILLING_CHOICE. var billing_program: BillingProgramAndroid - ## The URI where the external payment will be processed - var link_uri: String = "" - ## The launch mode for the external payment link + ## The URI where the external payment will be processed. + var link_uri: Variant = null + ## The launch mode for the external payment link. var launch_mode: DeveloperBillingLaunchModeAndroid + ## A pre-generated external transaction token for a Billing Choice external-link + var external_transaction_token: Variant = null static func from_dict(data: Dictionary) -> DeveloperBillingOptionParamsAndroid: var obj = DeveloperBillingOptionParamsAndroid.new() @@ -4030,6 +4103,8 @@ class DeveloperBillingOptionParamsAndroid: obj.launch_mode = DEVELOPER_BILLING_LAUNCH_MODE_ANDROID_FROM_STRING[enum_str] else: obj.launch_mode = enum_str + if data.has("externalTransactionToken") and data["externalTransactionToken"] != null: + obj.external_transaction_token = data["externalTransactionToken"] return obj func to_dict() -> Dictionary: @@ -4046,6 +4121,8 @@ class DeveloperBillingOptionParamsAndroid: dict["launchMode"] = DEVELOPER_BILLING_LAUNCH_MODE_ANDROID_VALUES[launch_mode] else: dict["launchMode"] = launch_mode + if external_transaction_token != null: + dict["externalTransactionToken"] = external_transaction_token return dict class DiscountOfferInputIOS: @@ -4088,12 +4165,12 @@ class DiscountOfferInputIOS: dict["timestamp"] = timestamp return dict -## Parameters for fetching Billing Choice display information (Android) Available in Google Play Billing Library 9.1.0+ +## Parameters for fetching Billing Choice display information (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). class GetBillingChoiceInfoParamsAndroid: ## Billing program. Currently only BILLING_CHOICE is supported. - var billing_program: BillingProgramAndroid + var billing_program: BillingProgramAndroid = BillingProgramAndroid.BILLING_CHOICE ## Desired Play Billing choice image layout. - var play_billing_choice_image_layout: BillingChoiceImageLayoutAndroid + var play_billing_choice_image_layout: BillingChoiceImageLayoutAndroid = BillingChoiceImageLayoutAndroid.RECTANGULAR_FOUR_BY_ONE ## BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. var user_locale: Variant = null @@ -4131,7 +4208,7 @@ class GetBillingChoiceInfoParamsAndroid: dict["userLocale"] = user_locale return dict -## Parameters for showing Play billing in-app messages (Android) Available in Google Play Billing Library 4.1.0+ +## Parameters for showing Play billing in-app messages (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (upstream API available since Play Billing 4.1.0). class InAppMessageParamsAndroid: ## In-app message categories to show. Defaults to transactional messages. var categories: Array[InAppMessageCategoryAndroid] = [] @@ -4139,13 +4216,14 @@ class InAppMessageParamsAndroid: static func from_dict(data: Dictionary) -> InAppMessageParamsAndroid: var obj = InAppMessageParamsAndroid.new() if data.has("categories") and data["categories"] != null: - var arr: Array[InAppMessageCategoryAndroid] = [] - for item in data["categories"]: - if item is String and IN_APP_MESSAGE_CATEGORY_ANDROID_FROM_STRING.has(item): - arr.append(IN_APP_MESSAGE_CATEGORY_ANDROID_FROM_STRING[item]) - else: - arr.append(item) - obj.categories = arr + if data["categories"] is Array: + var arr: Array[InAppMessageCategoryAndroid] = [] + for item in data["categories"]: + if item is String and IN_APP_MESSAGE_CATEGORY_ANDROID_FROM_STRING.has(item): + arr.append(IN_APP_MESSAGE_CATEGORY_ANDROID_FROM_STRING[item]) + elif item is int: + arr.append(item) + obj.categories = arr return obj func to_dict() -> Dictionary: @@ -4166,6 +4244,8 @@ class InitConnectionConfig: var alternative_billing_mode_android: AlternativeBillingModeAndroid ## Enable a specific billing program for Android (7.0+) var enable_billing_program_android: BillingProgramAndroid + ## Billing Choice renderer configured in Play Console. Available in OpenIAP + var billing_choice_screen_type_android: BillingChoiceScreenTypeAndroid = BillingChoiceScreenTypeAndroid.GOOGLE_RENDERED static func from_dict(data: Dictionary) -> InitConnectionConfig: var obj = InitConnectionConfig.new() @@ -4181,6 +4261,12 @@ class InitConnectionConfig: obj.enable_billing_program_android = BILLING_PROGRAM_ANDROID_FROM_STRING[enum_str] else: obj.enable_billing_program_android = enum_str + if data.has("billingChoiceScreenTypeAndroid") and data["billingChoiceScreenTypeAndroid"] != null: + var enum_str = data["billingChoiceScreenTypeAndroid"] + if enum_str is String and BILLING_CHOICE_SCREEN_TYPE_ANDROID_FROM_STRING.has(enum_str): + obj.billing_choice_screen_type_android = BILLING_CHOICE_SCREEN_TYPE_ANDROID_FROM_STRING[enum_str] + else: + obj.billing_choice_screen_type_android = enum_str return obj func to_dict() -> Dictionary: @@ -4195,11 +4281,16 @@ class InitConnectionConfig: dict["enableBillingProgramAndroid"] = BILLING_PROGRAM_ANDROID_VALUES[enable_billing_program_android] else: dict["enableBillingProgramAndroid"] = enable_billing_program_android + if billing_choice_screen_type_android != null: + if BILLING_CHOICE_SCREEN_TYPE_ANDROID_VALUES.has(billing_choice_screen_type_android): + dict["billingChoiceScreenTypeAndroid"] = BILLING_CHOICE_SCREEN_TYPE_ANDROID_VALUES[billing_choice_screen_type_android] + else: + dict["billingChoiceScreenTypeAndroid"] = billing_choice_screen_type_android return dict -## Parameters for launching an external link (Android) Used with launchExternalLink to initiate external offer or app install flows Available in Google Play Billing Library 8.2.0+ +## Parameters for launching an external link (Android) Used with launchExternalLink to initiate external offer, app install, or developer-rendered Billing Choice flows Available in Google Play Billing Library 8.2.0+ class LaunchExternalLinkParamsAndroid: - ## The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) + ## The billing program (EXTERNAL_CONTENT_LINK, EXTERNAL_OFFER, or BILLING_CHOICE) var billing_program: BillingProgramAndroid ## The external link launch mode var launch_mode: ExternalLinkLaunchModeAndroid @@ -4207,6 +4298,8 @@ class LaunchExternalLinkParamsAndroid: var link_type: ExternalLinkTypeAndroid ## The URI where the content will be accessed from var link_uri: String = "" + ## External transaction token for a developer-rendered Billing Choice external-link + var external_transaction_token: Variant = null static func from_dict(data: Dictionary) -> LaunchExternalLinkParamsAndroid: var obj = LaunchExternalLinkParamsAndroid.new() @@ -4230,6 +4323,8 @@ class LaunchExternalLinkParamsAndroid: obj.link_type = enum_str if data.has("linkUri") and data["linkUri"] != null: obj.link_uri = data["linkUri"] + if data.has("externalTransactionToken") and data["externalTransactionToken"] != null: + obj.external_transaction_token = data["externalTransactionToken"] return obj func to_dict() -> Dictionary: @@ -4251,11 +4346,13 @@ class LaunchExternalLinkParamsAndroid: dict["linkType"] = link_type if link_uri != null: dict["linkUri"] = link_uri + if external_transaction_token != null: + dict["externalTransactionToken"] = external_transaction_token return dict class ProductRequest: var skus: Array[String] = [] - var type: ProductQueryType + var type: ProductQueryType = ProductQueryType.IN_APP static func from_dict(data: Dictionary) -> ProductRequest: var obj = ProductRequest.new() @@ -4312,6 +4409,7 @@ class PurchaseInput: var id: String = "" var product_id: String = "" var ids: Array[String] = [] + ## Unix timestamp in milliseconds since January 1, 1970 UTC. var transaction_date: float = 0.0 var purchase_token: Variant = null ## Store where purchase was made @@ -4451,7 +4549,7 @@ class RequestPurchaseAndroidProps: var is_offer_personalized: Variant = null ## Offer token for one-time purchase discounts (7.0+). var offer_token: Variant = null - ## Developer billing option parameters for external payments flow (8.3.0+). + ## Developer billing option parameters for external payments and Billing Choice. var developer_billing_option: DeveloperBillingOptionParamsAndroid static func from_dict(data: Dictionary) -> RequestPurchaseAndroidProps: @@ -4555,7 +4653,7 @@ class RequestPurchaseProps: ## Per-platform subscription request props var request_subscription: RequestSubscriptionPropsByPlatforms ## Explicit purchase type hint (defaults to in-app) - var type: ProductQueryType + var type: ProductQueryType = ProductQueryType.IN_APP ## @deprecated Use enableBillingProgramAndroid in InitConnectionConfig instead. var use_alternative_billing: Variant = null @@ -4672,13 +4770,15 @@ class RequestSubscriptionAndroidProps: var is_offer_personalized: Variant = null ## Purchase token for upgrades/downgrades var purchase_token: Variant = null + ## Original external transaction ID for replacing a subscription that was + var original_external_transaction_id: Variant = null ## Replacement mode for subscription changes var replacement_mode: Variant = null ## Subscription offers var subscription_offers: Array[AndroidSubscriptionOfferInput] = [] ## Product-level replacement parameters (8.1.0+) var subscription_product_replacement_params: SubscriptionProductReplacementParamsAndroid - ## Developer billing option parameters for external payments flow (8.3.0+). + ## Developer billing option parameters for external payments and Billing Choice. var developer_billing_option: DeveloperBillingOptionParamsAndroid static func from_dict(data: Dictionary) -> RequestSubscriptionAndroidProps: @@ -4698,6 +4798,8 @@ class RequestSubscriptionAndroidProps: obj.is_offer_personalized = data["isOfferPersonalized"] if data.has("purchaseToken") and data["purchaseToken"] != null: obj.purchase_token = data["purchaseToken"] + if data.has("originalExternalTransactionId") and data["originalExternalTransactionId"] != null: + obj.original_external_transaction_id = data["originalExternalTransactionId"] if data.has("replacementMode") and data["replacementMode"] != null: obj.replacement_mode = data["replacementMode"] if data.has("subscriptionOffers") and data["subscriptionOffers"] != null: @@ -4733,6 +4835,8 @@ class RequestSubscriptionAndroidProps: dict["isOfferPersonalized"] = is_offer_personalized if purchase_token != null: dict["purchaseToken"] = purchase_token + if original_external_transaction_id != null: + dict["originalExternalTransactionId"] = original_external_transaction_id if replacement_mode != null: dict["replacementMode"] = replacement_mode if subscription_offers != null: @@ -6644,7 +6748,7 @@ class Mutation: const return_type = "BillingProgramReportingDetailsAndroid" const is_array = false - ## Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). + ## Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+), class launchExternalLinkAndroidField: const name = "launchExternalLinkAndroid" const snake_name = "launch_external_link_android" @@ -6664,7 +6768,7 @@ class Mutation: const return_type = "Boolean" const is_array = false - ## Show Google's information dialog for a Billing Choice external transaction. + ## Show Google's mandatory information dialog before a developer-rendered, class showBillingProgramInformationDialogAndroidField: const name = "showBillingProgramInformationDialogAndroid" const snake_name = "show_billing_program_information_dialog_android" @@ -7002,7 +7106,7 @@ static func create_billing_program_reporting_details_android_args(program: Billi args["developerBillingType"] = developer_billing_type return args -## Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). +## Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+), static func launch_external_link_android_args(params: LaunchExternalLinkParamsAndroid) -> Dictionary: var args = {} if params != null: @@ -7012,7 +7116,7 @@ static func launch_external_link_android_args(params: LaunchExternalLinkParamsAn args["params"] = params return args -## Show Google's information dialog for a Billing Choice external transaction. +## Show Google's mandatory information dialog before a developer-rendered, static func show_billing_program_information_dialog_android_args(params: BillingProgramInformationDialogParamsAndroid) -> Dictionary: var args = {} if params != null: diff --git a/libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIap.kt b/libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIap.kt index 2f369ece4..770f666f7 100644 --- a/libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIap.kt +++ b/libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIap.kt @@ -5,7 +5,9 @@ import dev.hyo.openiap.OpenIapModule import dev.hyo.openiap.store.OpenIapStore import dev.hyo.openiap.listener.OpenIapPurchaseErrorListener import dev.hyo.openiap.listener.OpenIapPurchaseUpdateListener +import dev.hyo.openiap.listener.OpenIapDeveloperProvidedBillingListener import dev.hyo.openiap.listener.OpenIapSubscriptionBillingIssueListener +import dev.hyo.openiap.listener.OpenIapUserChoiceBillingListener import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob @@ -54,6 +56,14 @@ class GodotIap(godot: Godot) : GodotPlugin(godot) { emitSignal("subscription_billing_issue", JSONObject(sanitized).toString()) } + private val userChoiceBillingListener = OpenIapUserChoiceBillingListener { details -> + emitSignal("user_choice_billing", JSONObject(details.toJson()).toString()) + } + + private val developerProvidedBillingListener = OpenIapDeveloperProvidedBillingListener { details -> + emitSignal("developer_provided_billing", JSONObject(details.toJson()).toString()) + } + override fun getPluginName(): String = "GodotIap" override fun getPluginSignals(): Set { @@ -74,7 +84,22 @@ class GodotIap(godot: Godot) : GodotPlugin(godot) { // ========================================== @UsedByGodot - fun initConnection(): Boolean { + fun initConnection(): Boolean = initConnectionInternal(null) + + @UsedByGodot + fun initConnectionWithConfig(configJson: String): Boolean { + val config = try { + InitConnectionConfig.fromJson( + GodotIapHelper.jsonObjectToMap(JSONObject(configJson)) + ) + } catch (e: Exception) { + GodotIapLog.failure("initConnectionWithConfig", e) + return false + } + return initConnectionInternal(config) + } + + private fun initConnectionInternal(config: InitConnectionConfig?): Boolean { GodotIapLog.debug("initConnection called") val activity = activity ?: run { @@ -89,9 +114,11 @@ class GodotIap(godot: Godot) : GodotPlugin(godot) { store = OpenIapStore(openIap) store.addPurchaseUpdateListener(purchaseUpdateListener) store.addPurchaseErrorListener(purchaseErrorListener) + store.addUserChoiceBillingListener(userChoiceBillingListener) + store.addDeveloperProvidedBillingListener(developerProvidedBillingListener) openIap.addSubscriptionBillingIssueListener(subscriptionBillingIssueListener) - val result = store.initConnection() + val result = store.initConnection(config) isInitialized = result if (result) { @@ -117,6 +144,8 @@ class GodotIap(godot: Godot) : GodotPlugin(godot) { try { store.removePurchaseUpdateListener(purchaseUpdateListener) store.removePurchaseErrorListener(purchaseErrorListener) + store.removeUserChoiceBillingListener(userChoiceBillingListener) + store.removeDeveloperProvidedBillingListener(developerProvidedBillingListener) openIap.removeSubscriptionBillingIssueListener(subscriptionBillingIssueListener) val result = store.endConnection() @@ -244,6 +273,8 @@ class GodotIap(godot: Godot) : GodotPlugin(godot) { isOfferPersonalized = params.isOfferPersonalized, obfuscatedAccountId = params.obfuscatedAccountId, obfuscatedProfileId = params.obfuscatedProfileId, + developerBillingOption = params.developerBillingOption, + originalExternalTransactionId = params.originalExternalTransactionId, purchaseToken = params.purchaseToken, replacementMode = params.replacementMode, skus = params.skus, @@ -252,7 +283,7 @@ class GodotIap(godot: Godot) : GodotPlugin(godot) { ) RequestPurchaseProps( request = RequestPurchaseProps.Request.Subscription( - RequestSubscriptionPropsByPlatforms(android = android) + RequestSubscriptionPropsByPlatforms(google = android) ), type = ProductQueryType.Subs ) @@ -262,12 +293,13 @@ class GodotIap(godot: Godot) : GodotPlugin(godot) { isOfferPersonalized = params.isOfferPersonalized, obfuscatedAccountId = params.obfuscatedAccountId, obfuscatedProfileId = params.obfuscatedProfileId, + developerBillingOption = params.developerBillingOption, offerToken = params.offerTokenArr.firstOrNull(), skus = params.skus ) RequestPurchaseProps( request = RequestPurchaseProps.Request.Purchase( - RequestPurchasePropsByPlatforms(android = android) + RequestPurchasePropsByPlatforms(google = android) ), type = ProductQueryType.InApp ) @@ -756,9 +788,12 @@ class GodotIap(godot: Godot) : GodotPlugin(godot) { val launchMode = json.optString("launchMode", "unspecified") val linkType = json.optString("linkType", "unspecified") val linkUri = json.getString("linkUri") + val externalTransactionToken = json.optString("externalTransactionToken", "") + .takeIf { it.isNotBlank() } val params = OpenIapLaunchExternalLinkParams( billingProgram = mapBillingProgram(billingProgram), + externalTransactionToken = externalTransactionToken, launchMode = mapExternalLinkLaunchMode(launchMode), linkType = mapExternalLinkType(linkType), linkUri = linkUri diff --git a/libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIapHelper.kt b/libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIapHelper.kt index 850e93141..0a9eb160c 100644 --- a/libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIapHelper.kt +++ b/libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIapHelper.kt @@ -1,9 +1,11 @@ package dev.hyo.godotiap import dev.hyo.openiap.AndroidSubscriptionOfferInput +import dev.hyo.openiap.DeveloperBillingOptionParamsAndroid import dev.hyo.openiap.ProductQueryType import dev.hyo.openiap.SubscriptionProductReplacementParamsAndroid import dev.hyo.openiap.SubscriptionReplacementModeAndroid +import org.json.JSONArray import org.json.JSONObject import java.util.Locale @@ -13,6 +15,21 @@ import java.util.Locale */ internal object GodotIapHelper { + fun jsonObjectToMap(json: JSONObject): Map = buildMap { + val keys = json.keys() + while (keys.hasNext()) { + val key = keys.next() + put(key, jsonValue(json.opt(key))) + } + } + + private fun jsonValue(value: Any?): Any? = when (value) { + null, JSONObject.NULL -> null + is JSONObject -> jsonObjectToMap(value) + is JSONArray -> List(value.length()) { index -> jsonValue(value.opt(index)) } + else -> value + } + /** * Helper extension to get nullable string from JSONObject. * Returns null if the key doesn't exist or the value is empty. @@ -90,6 +107,7 @@ internal object GodotIapHelper { val isOfferPersonalized = json.optBoolean("isOfferPersonalized", false) val purchaseToken = json.optStringOrNull("purchaseTokenAndroid") ?: json.optStringOrNull("purchaseToken") + val originalExternalTransactionId = json.optStringOrNull("originalExternalTransactionId") val replacementMode = when { json.has("replacementModeAndroid") -> json.optInt("replacementModeAndroid") json.has("replacementMode") -> json.optInt("replacementMode") @@ -112,6 +130,10 @@ internal object GodotIapHelper { } else null } else null + val developerBillingOption = json.optJSONObject("developerBillingOption")?.let { + DeveloperBillingOptionParamsAndroid.fromJson(jsonObjectToMap(it)) + } + // Parse offer token array val offerTokenArr = mutableListOf() val offerTokenArray = json.optJSONArray("offerTokenArr") @@ -160,6 +182,8 @@ internal object GodotIapHelper { isOfferPersonalized = isOfferPersonalized, offerTokenArr = offerTokenArr, subscriptionOffers = subscriptionOffers, + developerBillingOption = developerBillingOption, + originalExternalTransactionId = originalExternalTransactionId, purchaseToken = purchaseToken, replacementMode = replacementMode, subscriptionProductReplacementParams = subscriptionProductReplacementParams @@ -194,6 +218,8 @@ internal object GodotIapHelper { val isOfferPersonalized: Boolean, val offerTokenArr: List, val subscriptionOffers: List, + val developerBillingOption: DeveloperBillingOptionParamsAndroid?, + val originalExternalTransactionId: String?, val purchaseToken: String?, val replacementMode: Int?, val subscriptionProductReplacementParams: SubscriptionProductReplacementParamsAndroid? diff --git a/libraries/godot-iap/scripts/install-hooks.sh b/libraries/godot-iap/scripts/install-hooks.sh index edc517cd6..f0260d1f8 100755 --- a/libraries/godot-iap/scripts/install-hooks.sh +++ b/libraries/godot-iap/scripts/install-hooks.sh @@ -3,13 +3,29 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" -HOOKS_DIR="$PROJECT_ROOT/.git/hooks" + +REPO_ROOT="$(git -C "$PROJECT_ROOT" rev-parse --show-toplevel 2>/dev/null)" || { + echo "Not inside a Git worktree; skipping hook installation." + exit 0 +} + +if [ "$REPO_ROOT" != "$PROJECT_ROOT" ]; then + echo "Using monorepo hooks from $REPO_ROOT; skipping library-local hook installation." + exit 0 +fi + +HOOKS_DIR="$(git -C "$PROJECT_ROOT" rev-parse --git-path hooks)" +case "$HOOKS_DIR" in + /*) ;; + *) HOOKS_DIR="$PROJECT_ROOT/$HOOKS_DIR" ;; +esac echo "Installing git hooks..." +mkdir -p "$HOOKS_DIR" # Create symbolic link for pre-commit if [ -f "$SCRIPT_DIR/pre-commit" ]; then - ln -sf "$SCRIPT_DIR/pre-commit" "$HOOKS_DIR/pre-commit" + ln -sf "$SCRIPT_DIR/pre-commit" "$HOOKS_DIR/pre-commit" || exit 1 echo "✓ pre-commit hook installed" fi diff --git a/libraries/kmp-iap/README.md b/libraries/kmp-iap/README.md index cb3b8b68d..716694c8e 100644 --- a/libraries/kmp-iap/README.md +++ b/libraries/kmp-iap/README.md @@ -134,7 +134,7 @@ kmp-iap conforms to the **[OpenIAP specification](https://openiap.dev)** — an - **Shared specification** — Common types, error codes, and purchase flows across all platforms - **Generated type-safe bindings** — Swift, Kotlin, Dart, and GDScript from a single GraphQL schema -- **Platform implementations** — [openiap-apple](https://github.com/hyodotdev/openiap/tree/main/packages/apple) (StoreKit 2) and [openiap-google](https://github.com/hyodotdev/openiap/tree/main/packages/google) (Play Billing 8.x) +- **Platform implementations** — [openiap-apple](https://github.com/hyodotdev/openiap/tree/main/packages/apple) (StoreKit 2) and [openiap-google](https://github.com/hyodotdev/openiap/tree/main/packages/google) (Play Billing 9.1.0) - **Verification profiles** — Standardized receipt validation and purchase verification patterns Other libraries built on OpenIAP: [react-native-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/react-native-iap) · [expo-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/expo-iap) · [flutter_inapp_purchase](https://github.com/hyodotdev/openiap/tree/main/libraries/flutter_inapp_purchase) · [godot-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/godot-iap) diff --git a/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AlternativeBillingScreen.kt b/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AlternativeBillingScreen.kt index d0bdaa0a4..54fa30e04 100644 --- a/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AlternativeBillingScreen.kt +++ b/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AlternativeBillingScreen.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.unit.sp import androidx.navigation.NavController import dev.hyo.martie.theme.AppColors import dev.hyo.martie.utils.swipeToBack +import io.github.hyochan.kmpiap.PurchaseException import io.github.hyochan.kmpiap.kmpIapInstance import io.github.hyochan.kmpiap.openiap.* import io.github.hyochan.kmpiap.requestPurchase @@ -79,7 +80,14 @@ fun AlternativeBillingScreen(navController: NavController) { try { val config = if (currentPlatform == "Android") { - InitConnectionConfig(enableBillingProgramAndroid = billingProgram) + InitConnectionConfig( + enableBillingProgramAndroid = billingProgram, + billingChoiceScreenTypeAndroid = if (billingProgram == BillingProgramAndroid.BillingChoice) { + BillingChoiceScreenTypeAndroid.DeveloperRendered + } else { + null + } + ) } else null connected = kmpIapInstance.initConnection(config) @@ -115,7 +123,7 @@ fun AlternativeBillingScreen(navController: NavController) { lastPurchase = purchase isProcessing = false - val dateText = Instant.fromEpochSeconds(purchase.transactionDate.toLong()) + val dateText = Instant.fromEpochMilliseconds(purchase.transactionDate.toLong()) .toLocalDateTime(TimeZone.currentSystemDefault()) purchaseResult = """ @@ -145,7 +153,10 @@ fun AlternativeBillingScreen(navController: NavController) { launch { kmpIapInstance.purchaseErrorListener.collect { error -> isProcessing = false - purchaseResult = "❌ Purchase failed: ${error.message}" + purchaseResult = when (error.code) { + ErrorCode.UserCancelled -> "⚠️ Purchase cancelled by user" + else -> "❌ Purchase failed: ${error.message}" + } } } } @@ -171,7 +182,14 @@ fun AlternativeBillingScreen(navController: NavController) { // Reinitialize with new program val config = if (currentPlatform == "Android") { - InitConnectionConfig(enableBillingProgramAndroid = program) + InitConnectionConfig( + enableBillingProgramAndroid = program, + billingChoiceScreenTypeAndroid = if (program == BillingProgramAndroid.BillingChoice) { + BillingChoiceScreenTypeAndroid.DeveloperRendered + } else { + null + } + ) } else null connected = kmpIapInstance.initConnection(config) @@ -344,6 +362,12 @@ fun AlternativeBillingScreen(navController: NavController) { return@launch } + if (availability.choiceScreenType != BillingChoiceScreenTypeAndroid.DeveloperRendered) { + purchaseResult = "❌ This example is configured for a developer-rendered Billing Choice screen" + isProcessing = false + return@launch + } + purchaseResult = "Fetching Billing Choice display metadata..." val choiceInfo = kmpIapInstance.getBillingChoiceInfoAndroid( GetBillingChoiceInfoParamsAndroid( @@ -352,16 +376,10 @@ fun AlternativeBillingScreen(navController: NavController) { ) ) - val developerBillingType = if (availability.isExternalLinkAvailable == true) { - DeveloperBillingTypeAndroid.ExternalLink - } else { - DeveloperBillingTypeAndroid.InApp - } - - purchaseResult = "Creating Billing Choice reporting token..." + purchaseResult = "Creating an in-app Billing Choice reporting token..." val details = kmpIapInstance.createBillingProgramReportingDetailsAndroid( BillingProgramAndroid.BillingChoice, - developerBillingType + DeveloperBillingTypeAndroid.InApp ) purchaseResult = "Showing Billing Choice information dialog..." @@ -372,24 +390,16 @@ fun AlternativeBillingScreen(navController: NavController) { ) ) - purchaseResult = "Showing Play billing in-app messages..." - val messageResult = kmpIapInstance.showInAppMessagesAndroid( - InAppMessageParamsAndroid( - categories = listOf(InAppMessageCategoryAndroid.Transactional) - ) - ) - purchaseResult = """ - ✅ Billing Choice API flow completed + ✅ Developer-rendered in-app Billing Choice is ready Product: ${product.id} - Billing type: ${developerBillingType.rawValue} + Billing type: ${DeveloperBillingTypeAndroid.InApp.rawValue} Choice image: ${choiceInfo.playBillingChoiceImageUrl} Token: ${details.externalTransactionToken} Dialog response: ${dialogResult.responseCode} - In-app message response: ${messageResult.responseCode.rawValue} - ⚠️ Complete the selected payment flow and report the token to Google Play backend within 24 hours. + ⚠️ Render your choice UI now. If the user selects developer billing, complete the payment and report the token to Google Play within 24 hours. """.trimIndent() } catch (e: Exception) { purchaseResult = "❌ Error: ${e.message}" @@ -399,6 +409,25 @@ fun AlternativeBillingScreen(navController: NavController) { } } + fun showAndroidBillingMessages() { + scope.launch { + isProcessing = true + purchaseResult = "Checking for Play billing messages..." + try { + val result = kmpIapInstance.showInAppMessagesAndroid( + InAppMessageParamsAndroid( + categories = listOf(InAppMessageCategoryAndroid.Transactional) + ) + ) + purchaseResult = "Play billing message result: ${result.responseCode.rawValue}" + } catch (e: Exception) { + purchaseResult = "❌ Error: ${e.message}" + } finally { + isProcessing = false + } + } + } + // Handle Android User Choice Billing (7.0+) fun handleAndroidUserChoiceBilling(product: ProductCommon) { scope.launch { @@ -424,6 +453,11 @@ fun AlternativeBillingScreen(navController: NavController) { ⚠️ Billing Library 7.0+ required """.trimIndent() + } catch (e: PurchaseException) { + if (e.error.code != ErrorCode.UserCancelled) { + purchaseResult = "❌ Error: ${e.message}" + } + isProcessing = false } catch (e: Exception) { purchaseResult = "❌ Error: ${e.message}" isProcessing = false @@ -619,6 +653,17 @@ fun AlternativeBillingScreen(navController: NavController) { } } + if (currentPlatform == "Android") { + Spacer(modifier = Modifier.height(8.dp)) + OutlinedButton( + onClick = { showAndroidBillingMessages() }, + modifier = Modifier.fillMaxWidth().height(48.dp), + enabled = !isProcessing && connected + ) { + Text("Show Play billing message") + } + } + Spacer(modifier = Modifier.height(16.dp)) // Purchase Result @@ -771,10 +816,10 @@ private fun InfoCard(platform: String, billingProgram: BillingProgramAndroid) { """.trimIndent() BillingProgramAndroid.BillingChoice -> """ • Billing Choice (9.1.0+) - • Get Google/developer-rendered choice metadata - • Show the required program information dialog - • Request reporting details with billing type - • Show Play billing in-app messages + • This example configures a developer-rendered screen + • Fetch Play choice metadata + • Request an IN_APP reporting token + • Show the required information dialog before your choice UI """.trimIndent() BillingProgramAndroid.ExternalOffer -> """ • External Offer Mode (8.2.0+) @@ -1084,7 +1129,7 @@ private fun LastPurchaseCard(purchase: Purchase) { Column(modifier = Modifier.padding(16.dp)) { Text("Product: ${purchase.productId}", fontSize = 14.sp) Text("Transaction: ${purchase.id}", fontSize = 14.sp) - val dateText = Instant.fromEpochSeconds(purchase.transactionDate.toLong()) + val dateText = Instant.fromEpochMilliseconds(purchase.transactionDate.toLong()) .toLocalDateTime(TimeZone.currentSystemDefault()) .toString() Text("Date: $dateText", fontSize = 14.sp) diff --git a/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AvailablePurchasesScreen.kt b/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AvailablePurchasesScreen.kt index 736412880..ff820f20e 100644 --- a/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AvailablePurchasesScreen.kt +++ b/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AvailablePurchasesScreen.kt @@ -625,7 +625,7 @@ fun PurchaseCard( color = AppColors.Secondary ) - val instant = kotlinx.datetime.Instant.fromEpochSeconds(purchase.transactionDate.toLong()) + val instant = kotlinx.datetime.Instant.fromEpochMilliseconds(purchase.transactionDate.toLong()) Text( text = "Date: $instant", fontSize = 12.sp, diff --git a/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/PurchaseFlowScreen.kt b/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/PurchaseFlowScreen.kt index eb847d266..05d83ec42 100644 --- a/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/PurchaseFlowScreen.kt +++ b/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/PurchaseFlowScreen.kt @@ -21,6 +21,7 @@ import androidx.navigation.NavController import dev.hyo.martie.config.AppConfig import dev.hyo.martie.theme.AppColors import dev.hyo.martie.utils.swipeToBack +import io.github.hyochan.kmpiap.PurchaseException import io.github.hyochan.kmpiap.kmpIapInstance import io.github.hyochan.kmpiap.fetchProducts import io.github.hyochan.kmpiap.requestPurchase @@ -115,7 +116,7 @@ fun PurchaseFlowScreen(navController: NavController) { println(jsonString) println("=============================================\n") - val dateText = Instant.fromEpochSeconds(purchase.transactionDate.toLong()) + val dateText = Instant.fromEpochMilliseconds(purchase.transactionDate.toLong()) .toLocalDateTime(TimeZone.currentSystemDefault()) purchaseResult = """ ✅ Purchase successful (${purchase.platform}) @@ -494,6 +495,11 @@ fun PurchaseFlowScreen(navController: NavController) { } } // Purchase updates will be received through the Flow + } catch (e: PurchaseException) { + if (e.error.code != ErrorCode.UserCancelled) { + purchaseResult = "Purchase failed: ${e.message}" + } + isProcessing = false } catch (e: Exception) { purchaseResult = "Purchase failed: ${e.message}" isProcessing = false diff --git a/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/SubscriptionFlowScreen.kt b/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/SubscriptionFlowScreen.kt index e9e821c44..e71c06d8b 100644 --- a/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/SubscriptionFlowScreen.kt +++ b/libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/SubscriptionFlowScreen.kt @@ -22,6 +22,7 @@ import dev.hyo.martie.config.AppConfig import dev.hyo.martie.theme.AppColors import dev.hyo.martie.utils.swipeToBack import io.github.hyochan.kmpiap.KmpIAP +import io.github.hyochan.kmpiap.PurchaseException import io.github.hyochan.kmpiap.requestPurchase import io.github.hyochan.kmpiap.toPurchaseInput import io.github.hyochan.kmpiap.getCurrentPlatform @@ -106,7 +107,7 @@ fun SubscriptionFlowScreen(navController: NavController) { PurchaseState.Purchased -> { isProcessing = false - val dateText = Instant.fromEpochSeconds(purchase.transactionDate.toLong()) + val dateText = Instant.fromEpochMilliseconds(purchase.transactionDate.toLong()) .toLocalDateTime(TimeZone.currentSystemDefault()) purchaseResult = """ ✅ Subscription successful (${purchase.platform}) @@ -778,6 +779,11 @@ fun SubscriptionFlowScreen(navController: NavController) { } // Purchase updates will be received through the purchaseUpdatedListener // The UI will be updated automatically when the listener triggers + } catch (e: PurchaseException) { + if (e.error.code != ErrorCode.UserCancelled) { + purchaseResult = "Subscription failed: ${e.message}" + } + isProcessing = false } catch (e: Exception) { purchaseResult = "Subscription failed: ${e.message}" isProcessing = false diff --git a/libraries/kmp-iap/library/build.gradle.kts b/libraries/kmp-iap/library/build.gradle.kts index 5adce7c10..c2a096e65 100644 --- a/libraries/kmp-iap/library/build.gradle.kts +++ b/libraries/kmp-iap/library/build.gradle.kts @@ -346,9 +346,9 @@ dependencies { // androidMain still contains the Play Billing implementation. Amazon uses // the OpenIAP module delegate at runtime, but these symbols must be present // while compiling the shared Android source set for non-Play variants. - add("horizonCompileOnly", "com.android.billingclient:billing-ktx:$playBillingVersion") - add("amazonCompileOnly", "com.android.billingclient:billing-ktx:$playBillingVersion") - add("androidUnitTestImplementation", "com.android.billingclient:billing-ktx:$playBillingVersion") + add("horizonCompileOnly", "com.android.billingclient:billing:$playBillingVersion") + add("amazonCompileOnly", "com.android.billingclient:billing:$playBillingVersion") + add("androidUnitTestImplementation", "com.android.billingclient:billing:$playBillingVersion") } // Only configure publishing when we have signing credentials diff --git a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/AmazonInAppPurchaseAndroid.kt b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/AmazonInAppPurchaseAndroid.kt index 0b3d63943..1f46fc8ef 100644 --- a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/AmazonInAppPurchaseAndroid.kt +++ b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/AmazonInAppPurchaseAndroid.kt @@ -37,7 +37,6 @@ import io.github.hyochan.kmpiap.openiap.FetchProductsResultSubscriptions import io.github.hyochan.kmpiap.openiap.InitConnectionConfig import io.github.hyochan.kmpiap.openiap.GetBillingChoiceInfoParamsAndroid import io.github.hyochan.kmpiap.openiap.InAppMessageParamsAndroid -import io.github.hyochan.kmpiap.openiap.InAppMessageResponseCodeAndroid import io.github.hyochan.kmpiap.openiap.InAppMessageResultAndroid import io.github.hyochan.kmpiap.openiap.LaunchExternalLinkParamsAndroid import io.github.hyochan.kmpiap.openiap.Product @@ -105,13 +104,15 @@ internal class AmazonInAppPurchaseAndroid( private var subscriptionIssueListener: OpenIapSubscriptionBillingIssueListener? = null override suspend fun initConnection(config: InitConnectionConfig?): Boolean = withContext(Dispatchers.Main) { - val ctx = ensureContext() - val openModule = module ?: buildOpenIapModule(ctx).also { created -> - module = created - registerListeners(created) + withMappedOpenIapError { + val ctx = ensureContext() + val openModule = module ?: buildOpenIapModule(ctx).also { created -> + module = created + registerListeners(created) + } + openModule.setActivity(currentActivity) + openModule.initConnection(config?.toOpenIap()) } - openModule.setActivity(currentActivity) - openModule.initConnection(config?.toOpenIap()) } override suspend fun endConnection(): Boolean = withContext(Dispatchers.IO) { @@ -127,42 +128,57 @@ internal class AmazonInAppPurchaseAndroid( } override suspend fun fetchProducts(params: ProductRequest): FetchProductsResult = - requireModule().fetchProducts(params.toOpenIap()).toKmp() + withMappedOpenIapError { requireModule().fetchProducts(params.toOpenIap()).toKmp() } override suspend fun requestPurchase(params: RequestPurchaseProps): RequestPurchaseResult? = - requireModule().requestPurchase(params.toOpenIap())?.toKmp() + withMappedOpenIapError { requireModule().requestPurchase(params.toOpenIap())?.toKmp() } override suspend fun getAvailablePurchases(options: PurchaseOptions?): List = - requireModule().getAvailablePurchases(options?.toOpenIap()).map { it.toKmp() } + withMappedOpenIapError { + requireModule().getAvailablePurchases(options?.toOpenIap()).map { it.toKmp() } + } override suspend fun getActiveSubscriptions(subscriptionIds: List?): List = - requireModule().queryHandlers.getActiveSubscriptions?.invoke(subscriptionIds) - ?.map { ActiveSubscription.fromJson(it.toJson()) } - ?: emptyList() + withMappedOpenIapError { + requireModule().queryHandlers.getActiveSubscriptions?.invoke(subscriptionIds) + ?.map { ActiveSubscription.fromJson(it.toJson()) } + ?: emptyList() + } override suspend fun hasActiveSubscriptions(subscriptionIds: List?): Boolean = - requireModule().queryHandlers.hasActiveSubscriptions?.invoke(subscriptionIds) ?: false + withMappedOpenIapError { + requireModule().queryHandlers.hasActiveSubscriptions?.invoke(subscriptionIds) ?: false + } override suspend fun restorePurchases() { - requireModule().mutationHandlers.restorePurchases?.invoke() + withMappedOpenIapError { requireModule().mutationHandlers.restorePurchases?.invoke() } } override suspend fun finishTransaction(purchase: PurchaseInput, isConsumable: Boolean?) { - requireModule().finishTransaction(purchase.toOpenIap(), isConsumable) + withMappedOpenIapError { + requireModule().finishTransaction(purchase.toOpenIap(), isConsumable) + } } override suspend fun acknowledgePurchaseAndroid(purchaseToken: String): Boolean = - requireModule().acknowledgePurchaseAndroid(purchaseToken) + withMappedOpenIapError { requireModule().acknowledgePurchaseAndroid(purchaseToken) } override suspend fun consumePurchaseAndroid(purchaseToken: String): Boolean = - requireModule().consumePurchaseAndroid(purchaseToken) + withMappedOpenIapError { requireModule().consumePurchaseAndroid(purchaseToken) } override suspend fun deepLinkToSubscriptions(options: DeepLinkOptions?) { - options?.let { requireModule().mutationHandlers.deepLinkToSubscriptions?.invoke(it.toOpenIap()) } + withMappedOpenIapError { + options?.let { + requireModule().mutationHandlers.deepLinkToSubscriptions?.invoke(it.toOpenIap()) + } + } } override suspend fun getStorefront(): String = - requireModule().queryHandlers.getStorefront?.invoke().orEmpty().ifBlank { Locale.getDefault().country } + withMappedOpenIapError { + requireModule().queryHandlers.getStorefront?.invoke().orEmpty() + .ifBlank { Locale.getDefault().country } + } override suspend fun getStorefrontIOS(): String = getStorefront() @@ -218,7 +234,7 @@ internal class AmazonInAppPurchaseAndroid( failUnsupported("Amazon Appstore does not support Google Play Billing Choice.") override suspend fun showInAppMessagesAndroid(params: InAppMessageParamsAndroid?): InAppMessageResultAndroid = - InAppMessageResultAndroid(responseCode = InAppMessageResponseCodeAndroid.NoActionNeeded) + failUnsupported("Google Play billing in-app messages are unavailable on $storeName.") override suspend fun launchExternalLinkAndroid(params: LaunchExternalLinkParamsAndroid): Boolean = false override suspend fun checkAlternativeBillingAvailabilityAndroid(): Boolean = false @@ -363,7 +379,7 @@ internal class AmazonInAppPurchaseAndroid( _purchaseUpdatedListener.tryEmit(purchase.toKmp()) } val purchaseError = OpenIapPurchaseErrorListener { error -> - _purchaseErrorListener.tryEmit(error.toKmp()) + _purchaseErrorListener.tryEmit(error.toKmpPurchaseError()) } val userChoice = OpenIapUserChoiceBillingListener { details -> _userChoiceBillingListener.tryEmit(UserChoiceBillingDetails.fromJson(details.toJson())) @@ -401,11 +417,12 @@ internal class AmazonInAppPurchaseAndroid( subscriptionIssueListener = null } - private fun AndroidOpenIapError.toKmp(): PurchaseError = - PurchaseError( - code = ErrorCode.fromJson(code), - message = debugMessage?.takeIf { it.isNotBlank() } ?: message - ) + private suspend fun withMappedOpenIapError(block: suspend () -> T): T = + try { + block() + } catch (error: AndroidOpenIapError) { + throw PurchaseException(error.toKmpPurchaseError()) + } private fun failWith(error: PurchaseError): Nothing { _purchaseErrorListener.tryEmit(error) @@ -416,6 +433,12 @@ internal class AmazonInAppPurchaseAndroid( failWith(PurchaseError(code = ErrorCode.FeatureNotSupported, message = message)) } +internal fun AndroidOpenIapError.toKmpPurchaseError(): PurchaseError = + PurchaseError( + code = ErrorCode.fromJson(code), + message = debugMessage?.takeIf { it.isNotBlank() } ?: message + ) + private fun InitConnectionConfig.toOpenIap(): dev.hyo.openiap.InitConnectionConfig = dev.hyo.openiap.InitConnectionConfig.fromJson(toJson()) diff --git a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/Helper.kt b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/Helper.kt index e9c0f25b9..16dbab3f7 100644 --- a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/Helper.kt +++ b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/Helper.kt @@ -45,6 +45,7 @@ import io.github.hyochan.kmpiap.openiap.SubscriptionPeriod import io.github.hyochan.kmpiap.openiap.SubscriptionPeriodUnit import io.github.hyochan.kmpiap.openiap.SubscriptionReplacementModeAndroid import io.github.hyochan.kmpiap.openiap.ValidTimeWindowAndroid +import io.github.hyochan.kmpiap.openiap.SubResponseCodeAndroid import kotlinx.coroutines.CancellationException import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll @@ -240,6 +241,16 @@ internal fun mapBillingResponseCode(responseCode: Int): ErrorCode = when (respon else -> ErrorCode.Unknown } +internal fun Int.toOpenIapSubResponseCode(): SubResponseCodeAndroid? = when (this) { + BillingClient.OnPurchasesUpdatedSubResponseCode.NO_APPLICABLE_SUB_RESPONSE_CODE -> + SubResponseCodeAndroid.NoApplicableSubResponseCode + BillingClient.OnPurchasesUpdatedSubResponseCode.PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS -> + SubResponseCodeAndroid.PaymentDeclinedDueToInsufficientFunds + BillingClient.OnPurchasesUpdatedSubResponseCode.USER_INELIGIBLE -> + SubResponseCodeAndroid.UserIneligible + else -> null +} + /** * Maps SubscriptionReplacementModeAndroid to BillingFlowParams product-level replacement mode. */ @@ -260,6 +271,15 @@ internal fun mapReplacementMode(mode: SubscriptionReplacementModeAndroid): Int? BillingFlowParams.ProductDetailsParams.SubscriptionProductReplacementParams.ReplacementMode.KEEP_EXISTING } +internal fun resolveLegacySubscriptionReplacementMode( + purchaseToken: String?, + originalExternalTransactionId: String?, + replacementMode: Int?, + hasProductLevelReplacementParams: Boolean = false +): Int? = if (hasProductLevelReplacementParams) null else replacementMode ?: 5.takeIf { + !purchaseToken.isNullOrBlank() && originalExternalTransactionId.isNullOrBlank() +} + internal fun enablePendingPurchasesCompat(builder: BillingClient.Builder): BillingClient.Builder { return try { val paramsClass = Class.forName("com.android.billingclient.api.PendingPurchasesParams") @@ -375,6 +395,8 @@ internal suspend fun loadProductDetails( return details } +internal fun Long.toOpenIapTransactionDate(): Double = toDouble() + internal fun com.android.billingclient.api.Purchase.toPurchase(): Purchase { val purchaseStateEnum = when (purchaseState) { com.android.billingclient.api.Purchase.PurchaseState.PURCHASED -> PurchaseState.Purchased @@ -403,7 +425,7 @@ internal fun com.android.billingclient.api.Purchase.toPurchase(): Purchase { purchaseToken = purchaseToken, quantity = quantity, signatureAndroid = signature, - transactionDate = purchaseTime.toDouble() / 1000 + transactionDate = purchaseTime.toOpenIapTransactionDate() ) } diff --git a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt index 85d80675d..b32167f30 100644 --- a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt +++ b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt @@ -13,9 +13,14 @@ import com.android.billingclient.api.AlternativeBillingOnlyReportingDetails import com.android.billingclient.api.BillingClient import com.android.billingclient.api.BillingClientStateListener import com.android.billingclient.api.BillingFlowParams +import com.android.billingclient.api.BillingProgramAvailabilityDetails +import com.android.billingclient.api.BillingProgramReportingDetailsParams import com.android.billingclient.api.BillingResult import com.android.billingclient.api.ConsumeParams import com.android.billingclient.api.ExternalOfferReportingDetails +import com.android.billingclient.api.GetBillingChoiceInfoParams +import com.android.billingclient.api.InAppMessageParams +import com.android.billingclient.api.InAppMessageResult import com.android.billingclient.api.ProductDetails import com.android.billingclient.api.QueryProductDetailsParams import com.android.billingclient.api.QueryProductDetailsResult @@ -51,6 +56,7 @@ import io.github.hyochan.kmpiap.openiap.MutationHandlers import io.github.hyochan.kmpiap.openiap.Product import io.github.hyochan.kmpiap.openiap.ProductOrSubscription import io.github.hyochan.kmpiap.openiap.ProductQueryType +import io.github.hyochan.kmpiap.openiap.ProductType import io.github.hyochan.kmpiap.openiap.ProductRequest import io.github.hyochan.kmpiap.openiap.ProductStatusAndroid import io.github.hyochan.kmpiap.openiap.Purchase @@ -98,6 +104,7 @@ import io.github.hyochan.kmpiap.openiap.DeveloperBillingLaunchModeAndroid import io.github.hyochan.kmpiap.openiap.DeveloperBillingOptionParamsAndroid import io.github.hyochan.kmpiap.openiap.DeveloperBillingTypeAndroid import io.github.hyochan.kmpiap.openiap.DeveloperProvidedBillingDetailsAndroid +import io.github.hyochan.kmpiap.openiap.DeveloperProvidedBillingProductAndroid import io.github.hyochan.kmpiap.openiap.ExternalLinkLaunchModeAndroid import io.github.hyochan.kmpiap.openiap.ExternalLinkTypeAndroid import io.github.hyochan.kmpiap.openiap.GetBillingChoiceInfoParamsAndroid @@ -164,6 +171,7 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife private var purchaseTimeoutRunnable: Runnable? = null private var alternativeBillingMode: AlternativeBillingModeAndroid = AlternativeBillingModeAndroid.None private var enabledBillingProgram: BillingProgramAndroid? = null + private var billingChoiceScreenType: BillingChoiceScreenTypeAndroid = BillingChoiceScreenTypeAndroid.GoogleRendered // --------------------------------------------------------------------- // Event streams @@ -203,6 +211,9 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife alternativeBillingMode = config?.alternativeBillingModeAndroid ?: AlternativeBillingModeAndroid.None // Track enabled billing program for validation enabledBillingProgram = config?.enableBillingProgramAndroid + billingChoiceScreenType = config?.billingChoiceScreenTypeAndroid + ?.takeUnless { it == BillingChoiceScreenTypeAndroid.Unspecified } + ?: BillingChoiceScreenTypeAndroid.GoogleRendered if (context == null) { val disposer = tryCaptureApplication( @@ -275,7 +286,13 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife // Enable billing program from config (8.2.0+, EXTERNAL_PAYMENTS requires 8.3.0+, BILLING_CHOICE requires 9.1.0+) config?.enableBillingProgramAndroid?.let { program -> if (program == BillingProgramAndroid.ExternalPayments || program == BillingProgramAndroid.BillingChoice) { - enableDeveloperProvidedBillingProgram(builder, program) + enableDeveloperProvidedBillingProgram( + builder, + program, + includeDeveloperListener = + program == BillingProgramAndroid.ExternalPayments || + billingChoiceScreenType != BillingChoiceScreenTypeAndroid.DeveloperRendered + ) } else { enableBillingProgram(builder, program) } @@ -314,13 +331,16 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife val purchases = withContext(Dispatchers.Main) { val resolvedType = props.type - val purchaseAndroidOptions = (props.request as? RequestPurchaseProps.Request.Purchase)?.value?.android - val subscriptionAndroidOptions = (props.request as? RequestPurchaseProps.Request.Subscription)?.value?.android + val purchaseRequest = (props.request as? RequestPurchaseProps.Request.Purchase)?.value + val subscriptionRequest = (props.request as? RequestPurchaseProps.Request.Subscription)?.value + val purchaseAndroidOptions = purchaseRequest?.google ?: purchaseRequest?.android + val subscriptionAndroidOptions = subscriptionRequest?.google ?: subscriptionRequest?.android val subscriptionOffers: List = subscriptionAndroidOptions?.subscriptionOffers.orEmpty() val purchaseToken = subscriptionAndroidOptions?.purchaseToken + val originalExternalTransactionId = subscriptionAndroidOptions?.originalExternalTransactionId val replacementMode = subscriptionAndroidOptions?.replacementMode val subscriptionProductReplacementParams = subscriptionAndroidOptions?.subscriptionProductReplacementParams @@ -465,19 +485,30 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife flowBuilder.setObfuscatedProfileId(profileId) } - if (desiredProductType == BillingClient.ProductType.SUBS && !purchaseToken.isNullOrEmpty()) { + val hasSubscriptionUpdateSource = + !purchaseToken.isNullOrEmpty() || !originalExternalTransactionId.isNullOrEmpty() + if (desiredProductType == BillingClient.ProductType.SUBS && hasSubscriptionUpdateSource) { val updateParamsBuilder = BillingFlowParams.SubscriptionUpdateParams.newBuilder() - .setOldPurchaseToken(purchaseToken) - if (subscriptionProductReplacementParams == null) { - replacementMode?.let { mode -> - @Suppress("DEPRECATION") - updateParamsBuilder.setSubscriptionReplacementMode(mode) - } + purchaseToken?.takeIf { it.isNotEmpty() }?.let { + updateParamsBuilder.setOldPurchaseToken(it) + } + originalExternalTransactionId?.takeIf { it.isNotEmpty() }?.let { + updateParamsBuilder.setOriginalExternalTransactionId(it) + } + val legacyReplacementMode = resolveLegacySubscriptionReplacementMode( + purchaseToken = purchaseToken, + originalExternalTransactionId = originalExternalTransactionId, + replacementMode = replacementMode, + hasProductLevelReplacementParams = subscriptionProductReplacementParams != null + ) + legacyReplacementMode?.let { mode -> + @Suppress("DEPRECATION") + updateParamsBuilder.setSubscriptionReplacementMode(mode) } flowBuilder.setSubscriptionUpdateParams(updateParamsBuilder.build()) } - // Apply developer billing option for External Payments flow (8.3.0+) + // Apply the developer billing option for External Payments (8.3.0+) or Billing Choice (9.1.0+) developerBillingOption?.let { option -> applyDeveloperBillingOption(flowBuilder, option) } @@ -1057,7 +1088,7 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife isActive = true, productId = purchase.products.firstOrNull().orEmpty(), purchaseToken = purchase.purchaseToken, - transactionDate = purchase.purchaseTime.toDouble() / 1000, + transactionDate = purchase.purchaseTime.toOpenIapTransactionDate(), transactionId = purchase.orderId ?: purchase.purchaseToken, willExpireSoon = null, daysUntilExpirationIOS = null, @@ -1117,11 +1148,11 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife // --------------------------------------------------------------------- private fun billingProgramConstant(program: BillingProgramAndroid, operation: String): Int = when (program) { - BillingProgramAndroid.ExternalContentLink -> 1 + BillingProgramAndroid.ExternalContentLink -> BillingClient.BillingProgram.EXTERNAL_CONTENT_LINK BillingProgramAndroid.UserChoiceBilling -> 2 - BillingProgramAndroid.ExternalOffer -> 3 - BillingProgramAndroid.ExternalPayments -> 4 - BillingProgramAndroid.BillingChoice -> 5 + BillingProgramAndroid.ExternalOffer -> BillingClient.BillingProgram.EXTERNAL_OFFER + BillingProgramAndroid.ExternalPayments -> BillingClient.BillingProgram.EXTERNAL_PAYMENTS + BillingProgramAndroid.BillingChoice -> BillingClient.BillingProgram.BILLING_CHOICE BillingProgramAndroid.Unspecified -> throw PurchaseException( PurchaseError( code = ErrorCode.DeveloperError, @@ -1132,9 +1163,12 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife private fun billingChoiceImageLayout(layout: BillingChoiceImageLayoutAndroid): String = when (layout) { - BillingChoiceImageLayoutAndroid.RectangularFourByOne -> "RECTANGULAR_FOUR_BY_ONE" - BillingChoiceImageLayoutAndroid.RectangularThreeByOne -> "RECTANGULAR_THREE_BY_ONE" - BillingChoiceImageLayoutAndroid.RectangularTwoByTwo -> "RECTANGULAR_TWO_BY_TWO" + BillingChoiceImageLayoutAndroid.RectangularFourByOne -> + GetBillingChoiceInfoParams.ImageLayout.RECTANGULAR_FOUR_BY_ONE + BillingChoiceImageLayoutAndroid.RectangularThreeByOne -> + GetBillingChoiceInfoParams.ImageLayout.RECTANGULAR_THREE_BY_ONE + BillingChoiceImageLayoutAndroid.RectangularTwoByTwo -> + GetBillingChoiceInfoParams.ImageLayout.RECTANGULAR_TWO_BY_TWO } private fun developerBillingTypeConstant( @@ -1142,36 +1176,49 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife developerBillingType: DeveloperBillingTypeAndroid? ): Int? = when (developerBillingType) { - DeveloperBillingTypeAndroid.InApp -> 1 - DeveloperBillingTypeAndroid.ExternalLink -> 2 + DeveloperBillingTypeAndroid.InApp -> + BillingProgramReportingDetailsParams.DeveloperBillingType.IN_APP + DeveloperBillingTypeAndroid.ExternalLink -> + BillingProgramReportingDetailsParams.DeveloperBillingType.EXTERNAL_LINK DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified, null -> - if (program == BillingProgramAndroid.BillingChoice) 1 else null + if (program == BillingProgramAndroid.BillingChoice) { + BillingProgramReportingDetailsParams.DeveloperBillingType.IN_APP + } else { + null + } } private fun billingChoiceScreenTypeFromConstant(value: Int?): BillingChoiceScreenTypeAndroid? = when (value) { - 1 -> BillingChoiceScreenTypeAndroid.DeveloperRendered - 2 -> BillingChoiceScreenTypeAndroid.GoogleRendered - 0 -> BillingChoiceScreenTypeAndroid.Unspecified + BillingProgramAvailabilityDetails.BillingChoiceAvailabilityDetails.ChoiceScreenType.UNSPECIFIED -> + BillingChoiceScreenTypeAndroid.Unspecified + BillingProgramAvailabilityDetails.BillingChoiceAvailabilityDetails.ChoiceScreenType.DEVELOPER_RENDERED -> + BillingChoiceScreenTypeAndroid.DeveloperRendered + BillingProgramAvailabilityDetails.BillingChoiceAvailabilityDetails.ChoiceScreenType.GOOGLE_RENDERED -> + BillingChoiceScreenTypeAndroid.GoogleRendered else -> null } private fun inAppMessageCategoryConstant(category: InAppMessageCategoryAndroid): Int = when (category) { - InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId -> 0 - InAppMessageCategoryAndroid.Transactional -> 2 + InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId -> + InAppMessageParams.InAppMessageCategoryId.UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID + InAppMessageCategoryAndroid.Transactional -> + InAppMessageParams.InAppMessageCategoryId.TRANSACTIONAL } private fun inAppMessageResponseCodeFromConstant(value: Int?): InAppMessageResponseCodeAndroid = when (value) { - 1 -> InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated + InAppMessageResult.InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED -> + InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated else -> InAppMessageResponseCodeAndroid.NoActionNeeded } private fun BillingResult.toBillingResultAndroid(): BillingResultAndroid = BillingResultAndroid( responseCode = responseCode, - debugMessage = debugMessage + debugMessage = debugMessage, + subResponseCode = onPurchasesUpdatedSubResponseCode.toOpenIapSubResponseCode() ) /** @@ -1716,7 +1763,7 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife // --------------------------------------------------------------------- // Billing Programs API (Android 8.2.1+) // These APIs use reflection to maintain compatibility with older Billing Library versions - // Full implementation uses Google Play Billing Library 8.2.1 + // Full implementation uses Google Play Billing Library 9.1.0 // --------------------------------------------------------------------- /** @@ -1843,7 +1890,7 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife listenerClass.classLoader, arrayOf(listenerClass) ) { _, method, args -> - if (method.name == "onBillingProgramReportingDetailsResponse") { + if (method.name == "onCreateBillingProgramReportingDetailsResponse") { val result = args?.get(0) as? BillingResult val details = args?.getOrNull(1) @@ -2034,7 +2081,7 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife override suspend fun showBillingProgramInformationDialogAndroid( params: BillingProgramInformationDialogParamsAndroid - ): BillingResultAndroid { + ): BillingResultAndroid = withContext(Dispatchers.Main) { val client = billingClient ?: throw PurchaseException( PurchaseError( code = ErrorCode.NotPrepared, @@ -2067,7 +2114,7 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife ) } - return suspendCancellableCoroutine { continuation -> + suspendCancellableCoroutine { continuation -> try { val paramsClass = Class.forName("com.android.billingclient.api.BillingProgramInformationDialogParams") val builderClass = Class.forName("com.android.billingclient.api.BillingProgramInformationDialogParams\$Builder") @@ -2130,7 +2177,9 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife } } - override suspend fun showInAppMessagesAndroid(params: InAppMessageParamsAndroid?): InAppMessageResultAndroid { + override suspend fun showInAppMessagesAndroid( + params: InAppMessageParamsAndroid? + ): InAppMessageResultAndroid = withContext(Dispatchers.Main) { val client = billingClient ?: throw PurchaseException( PurchaseError( code = ErrorCode.NotPrepared, @@ -2150,7 +2199,7 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife ) ) - return suspendCancellableCoroutine { continuation -> + suspendCancellableCoroutine { continuation -> try { val paramsClass = Class.forName("com.android.billingclient.api.InAppMessageParams") val builderClass = Class.forName("com.android.billingclient.api.InAppMessageParams\$Builder") @@ -2237,7 +2286,9 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife * * @see https://openiap.dev/docs/apis/android/launch-external-link-android */ - override suspend fun launchExternalLinkAndroid(params: LaunchExternalLinkParamsAndroid): Boolean { + override suspend fun launchExternalLinkAndroid( + params: LaunchExternalLinkParamsAndroid + ): Boolean = withContext(Dispatchers.Main) { val client = billingClient ?: throw PurchaseException( PurchaseError( code = ErrorCode.NotPrepared, @@ -2277,7 +2328,7 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife ) } - return suspendCancellableCoroutine { continuation -> + suspendCancellableCoroutine { continuation -> try { // Build LaunchExternalLinkParams using reflection val paramsClass = Class.forName("com.android.billingclient.api.LaunchExternalLinkParams") @@ -2302,6 +2353,11 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife val setLinkUriMethod = builderClass.getMethod("setLinkUri", Uri::class.java) setLinkUriMethod.invoke(builder, Uri.parse(params.linkUri)) + params.externalTransactionToken?.takeIf { it.isNotBlank() }?.let { token -> + builderClass.getMethod("setExternalTransactionToken", String::class.java) + .invoke(builder, token) + } + // Build the params val buildMethod = builderClass.getMethod("build") val launchParams = buildMethod.invoke(builder) @@ -2317,14 +2373,7 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife if (result?.responseCode == BillingClient.BillingResponseCode.OK) { if (continuation.isActive) continuation.resume(true) } else { - if (continuation.isActive) { - continuation.resumeWithException(PurchaseException( - PurchaseError( - code = ErrorCode.Unknown, - message = "External link launch failed: ${result?.debugMessage}" - ) - )) - } + if (continuation.isActive) continuation.resume(false) } } null @@ -2339,23 +2388,9 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife ) launchMethod.invoke(client, activity, launchParams, listener) } catch (e: NoSuchMethodException) { - if (continuation.isActive) { - continuation.resumeWithException(PurchaseException( - PurchaseError( - code = ErrorCode.FeatureNotSupported, - message = "launchExternalLink requires Billing Library 8.2.0+" - ) - )) - } + if (continuation.isActive) continuation.resume(false) } catch (e: Exception) { - if (continuation.isActive) { - continuation.resumeWithException(PurchaseException( - PurchaseError( - code = ErrorCode.Unknown, - message = "Failed to launch external link: ${e.message}" - ) - )) - } + if (continuation.isActive) continuation.resume(false) } } } @@ -2384,17 +2419,17 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife } // --------------------------------------------------------------------- - // External Payments Program (8.3.0+) + // Developer-provided billing programs (8.3.0+) // --------------------------------------------------------------------- /** - * Enable External Payments program using reflection for 8.3.0+ compatibility. - * This sets up the DeveloperProvidedBillingListener to receive callbacks - * when the user selects developer billing in the external payments flow. + * Enable External Payments or Billing Choice using the available Play APIs. + * The listener is omitted for developer-rendered Billing Choice. */ private fun enableDeveloperProvidedBillingProgram( builder: BillingClient.Builder, - program: BillingProgramAndroid + program: BillingProgramAndroid, + includeDeveloperListener: Boolean ) { try { // Get the EnableBillingProgramParams class @@ -2407,35 +2442,62 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife val setBillingProgramMethod = enableParamsBuilderClass.getMethod("setBillingProgram", Int::class.javaPrimitiveType) setBillingProgramMethod.invoke(enableParamsBuilder, billingProgramConstant(program, "enable billing program")) - // Create the DeveloperProvidedBillingListener proxy - val listenerClass = Class.forName("com.android.billingclient.api.DeveloperProvidedBillingListener") - val listener = java.lang.reflect.Proxy.newProxyInstance( - listenerClass.classLoader, - arrayOf(listenerClass) - ) { _, method, args -> - if (method.name == "onDeveloperProvidedBillingDetails") { - val details = args?.get(0) - if (details != null) { - try { - val tokenMethod = details.javaClass.getMethod("getExternalTransactionToken") - val token = tokenMethod.invoke(details) as? String - if (token != null) { - val billingDetails = DeveloperProvidedBillingDetailsAndroid( - externalTransactionToken = token + if (includeDeveloperListener) { + val listenerClass = Class.forName("com.android.billingclient.api.DeveloperProvidedBillingListener") + val listener = java.lang.reflect.Proxy.newProxyInstance( + listenerClass.classLoader, + arrayOf(listenerClass) + ) { _, method, args -> + if (method.name == "onUserSelectedDeveloperBilling") { + val details = args?.get(0) + if (details != null) { + try { + val detailsClass = details.javaClass + val token = (detailsClass.getMethod("getExternalTransactionToken") + .invoke(details) as? String)?.takeIf { it.isNotBlank() } + val linkUri = (detailsClass.getMethod("getLinkUri") + .invoke(details) as? String)?.takeIf { it.isNotBlank() } + val originalExternalTransactionId = (detailsClass + .getMethod("getOriginalExternalTransactionId") + .invoke(details) as? String)?.takeIf { it.isNotBlank() } + val products = (detailsClass.getMethod("getProducts") + .invoke(details) as? List<*>) + .orEmpty() + .mapNotNull { product -> + val productClass = product?.javaClass ?: return@mapNotNull null + val id = productClass.getMethod("getId").invoke(product) as? String + ?: return@mapNotNull null + val type = when (productClass.getMethod("getType").invoke(product) as? String) { + BillingClient.ProductType.INAPP -> ProductType.InApp + BillingClient.ProductType.SUBS -> ProductType.Subs + else -> return@mapNotNull null + } + DeveloperProvidedBillingProductAndroid( + id = id, + offerToken = (productClass.getMethod("getOfferToken") + .invoke(product) as? String)?.takeIf { it.isNotBlank() }, + type = type + ) + } + _developerProvidedBillingListener.tryEmit( + DeveloperProvidedBillingDetailsAndroid( + externalTransactionToken = token, + linkUri = linkUri, + originalExternalTransactionId = originalExternalTransactionId, + products = products + ) ) - _developerProvidedBillingListener.tryEmit(billingDetails) + } catch (e: Exception) { + logError("Failed to extract developer billing details: ${e.message}", e) } - } catch (e: Exception) { - android.util.Log.e("KmpIAP", "Failed to extract developer billing token: ${e.message}") } } + null } - null - } - // Set the listener on the builder - val setListenerMethod = enableParamsBuilderClass.getMethod("setDeveloperProvidedBillingListener", listenerClass) - setListenerMethod.invoke(enableParamsBuilder, listener) + enableParamsBuilderClass.getMethod("setDeveloperProvidedBillingListener", listenerClass) + .invoke(enableParamsBuilder, listener) + } // Build the params val buildMethod = enableParamsBuilderClass.getMethod("build") @@ -2472,9 +2534,10 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife } return } - BillingProgramAndroid.ExternalContentLink -> 1 - BillingProgramAndroid.ExternalOffer -> 3 - BillingProgramAndroid.BillingChoice -> 5 + BillingProgramAndroid.ExternalContentLink, + BillingProgramAndroid.ExternalOffer, + BillingProgramAndroid.BillingChoice -> + billingProgramConstant(program, "enable billing program") BillingProgramAndroid.ExternalPayments -> { logWarning("ExternalPayments should use enableExternalPaymentsProgram()") return @@ -2511,60 +2574,78 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife // Set billing program (EXTERNAL_PAYMENTS = 4) val billingProgramConstant = when (option.billingProgram) { BillingProgramAndroid.UserChoiceBilling -> 2 - BillingProgramAndroid.ExternalPayments -> 4 - BillingProgramAndroid.BillingChoice -> 5 - BillingProgramAndroid.ExternalContentLink -> 1 - BillingProgramAndroid.ExternalOffer -> 3 - BillingProgramAndroid.Unspecified -> 0 + BillingProgramAndroid.ExternalPayments, + BillingProgramAndroid.BillingChoice, + BillingProgramAndroid.ExternalContentLink, + BillingProgramAndroid.ExternalOffer -> + billingProgramConstant(option.billingProgram, "apply developer billing option") + BillingProgramAndroid.Unspecified -> + BillingClient.BillingProgram.UNSPECIFIED_BILLING_PROGRAM } val setBillingProgramMethod = paramsBuilderClass.getMethod("setBillingProgram", Int::class.javaPrimitiveType) setBillingProgramMethod.invoke(paramsBuilder, billingProgramConstant) - // Set launch mode + // Link fields are optional for in-app Billing Choice flows. val launchModeConstant = when (option.launchMode) { DeveloperBillingLaunchModeAndroid.LaunchInExternalBrowserOrApp -> 1 DeveloperBillingLaunchModeAndroid.CallerWillLaunchLink -> 2 - DeveloperBillingLaunchModeAndroid.Unspecified -> 0 + DeveloperBillingLaunchModeAndroid.Unspecified -> throw IllegalArgumentException( + "Cannot use UNSPECIFIED launch mode" + ) + null -> null + } + launchModeConstant?.let { launchMode -> + paramsBuilderClass.getMethod("setLaunchMode", Int::class.javaPrimitiveType) + .invoke(paramsBuilder, launchMode) } - val setLaunchModeMethod = paramsBuilderClass.getMethod("setLaunchMode", Int::class.javaPrimitiveType) - setLaunchModeMethod.invoke(paramsBuilder, launchModeConstant) - // Set link URI - val setLinkUriMethod = paramsBuilderClass.getMethod("setLinkUri", android.net.Uri::class.java) - setLinkUriMethod.invoke(paramsBuilder, android.net.Uri.parse(option.linkUri)) + option.linkUri?.takeIf { it.isNotBlank() }?.let { linkUri -> + paramsBuilderClass.getMethod("setLinkUri", android.net.Uri::class.java) + .invoke(paramsBuilder, android.net.Uri.parse(linkUri)) + } + + option.externalTransactionToken?.takeIf { it.isNotBlank() }?.let { token -> + paramsBuilderClass.getMethod("setExternalTransactionToken", String::class.java) + .invoke(paramsBuilder, token) + } // Build the params val buildMethod = paramsBuilderClass.getMethod("build") val developerBillingParams = buildMethod.invoke(paramsBuilder) // Apply to BillingFlowParams.Builder - val setDeveloperBillingOptionMethod = flowBuilder.javaClass.getMethod( - "setDeveloperBillingOption", + val enableDeveloperBillingOptionMethod = flowBuilder.javaClass.getMethod( + "enableDeveloperBillingOption", paramsClass ) - setDeveloperBillingOptionMethod.invoke(flowBuilder, developerBillingParams) + enableDeveloperBillingOptionMethod.invoke(flowBuilder, developerBillingParams) } catch (e: NoSuchMethodException) { logWarning("DeveloperBillingOption requires Billing Library 8.3.0+") + throw e } catch (e: ClassNotFoundException) { logWarning("DeveloperBillingOption requires Billing Library 8.3.0+") + throw e } catch (e: Exception) { logError("Failed to apply DeveloperBillingOption: ${e.message}", e) + throw e } } /** * Get the developer provided billing details when user selects developer billing - * in the External Payments flow. + * in an External Payments or Billing Choice flow. * - * @throws PurchaseException if External Payments program is not enabled + * @throws PurchaseException if a developer-provided billing program is not enabled */ override suspend fun developerProvidedBillingAndroid(): DeveloperProvidedBillingDetailsAndroid { - if (enabledBillingProgram != BillingProgramAndroid.ExternalPayments) { + if (enabledBillingProgram != BillingProgramAndroid.ExternalPayments && + enabledBillingProgram != BillingProgramAndroid.BillingChoice + ) { throw PurchaseException( PurchaseError( code = ErrorCode.DeveloperError, - message = "External Payments program not enabled. Set enableBillingProgramAndroid = BillingProgramAndroid.ExternalPayments in InitConnectionConfig." + message = "Developer-provided billing is not enabled. Set enableBillingProgramAndroid to ExternalPayments or BillingChoice." ) ) } diff --git a/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/AmazonErrorMappingTest.kt b/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/AmazonErrorMappingTest.kt new file mode 100644 index 000000000..602d61a0a --- /dev/null +++ b/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/AmazonErrorMappingTest.kt @@ -0,0 +1,18 @@ +package io.github.hyochan.kmpiap + +import dev.hyo.openiap.OpenIapError +import io.github.hyochan.kmpiap.openiap.ErrorCode +import kotlin.test.Test +import kotlin.test.assertEquals + +class AmazonErrorMappingTest { + @Test + fun `Amazon cancellation maps to KMP user-cancelled error`() { + val error = OpenIapError.UserCancelled("Amazon purchase was cancelled") + + val mapped = error.toKmpPurchaseError() + + assertEquals(ErrorCode.UserCancelled, mapped.code) + assertEquals("Amazon purchase was cancelled", mapped.message) + } +} diff --git a/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/BillingResultMappingTest.kt b/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/BillingResultMappingTest.kt new file mode 100644 index 000000000..df2cddbdf --- /dev/null +++ b/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/BillingResultMappingTest.kt @@ -0,0 +1,33 @@ +package io.github.hyochan.kmpiap + +import com.android.billingclient.api.BillingClient +import io.github.hyochan.kmpiap.openiap.SubResponseCodeAndroid +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNull + +class BillingResultMappingTest { + @Test + fun `maps every Play Billing 9_1 sub-response code`() { + assertEquals( + SubResponseCodeAndroid.NoApplicableSubResponseCode, + BillingClient.OnPurchasesUpdatedSubResponseCode.NO_APPLICABLE_SUB_RESPONSE_CODE + .toOpenIapSubResponseCode() + ) + assertEquals( + SubResponseCodeAndroid.PaymentDeclinedDueToInsufficientFunds, + BillingClient.OnPurchasesUpdatedSubResponseCode.PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS + .toOpenIapSubResponseCode() + ) + assertEquals( + SubResponseCodeAndroid.UserIneligible, + BillingClient.OnPurchasesUpdatedSubResponseCode.USER_INELIGIBLE + .toOpenIapSubResponseCode() + ) + } + + @Test + fun `unknown sub-response code remains absent`() { + assertNull(Int.MAX_VALUE.toOpenIapSubResponseCode()) + } +} diff --git a/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/PurchaseTimestampTest.kt b/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/PurchaseTimestampTest.kt new file mode 100644 index 000000000..8e1259d4d --- /dev/null +++ b/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/PurchaseTimestampTest.kt @@ -0,0 +1,16 @@ +package io.github.hyochan.kmpiap + +import kotlin.test.Test +import kotlin.test.assertEquals + +class PurchaseTimestampTest { + @Test + fun `Play purchase timestamp remains epoch milliseconds`() { + val purchaseTimeMillis = 1_700_000_000_123L + + assertEquals( + purchaseTimeMillis.toDouble(), + purchaseTimeMillis.toOpenIapTransactionDate() + ) + } +} diff --git a/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/SubscriptionReplacementResolutionTest.kt b/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/SubscriptionReplacementResolutionTest.kt new file mode 100644 index 000000000..27dbc516f --- /dev/null +++ b/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/SubscriptionReplacementResolutionTest.kt @@ -0,0 +1,42 @@ +package io.github.hyochan.kmpiap + +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNull + +class SubscriptionReplacementResolutionTest { + @Test + fun `legacy replacement mode follows native Google precedence`() { + assertNull( + resolveLegacySubscriptionReplacementMode( + purchaseToken = null, + originalExternalTransactionId = "original-external-id", + replacementMode = null + ) + ) + assertEquals( + 5, + resolveLegacySubscriptionReplacementMode( + purchaseToken = "play-purchase-token", + originalExternalTransactionId = null, + replacementMode = null + ) + ) + assertEquals( + 3, + resolveLegacySubscriptionReplacementMode( + purchaseToken = null, + originalExternalTransactionId = "original-external-id", + replacementMode = 3 + ) + ) + assertNull( + resolveLegacySubscriptionReplacementMode( + purchaseToken = "play-purchase-token", + originalExternalTransactionId = null, + replacementMode = 3, + hasProductLevelReplacementParams = true + ) + ) + } +} diff --git a/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/UnsupportedGoogleApisTest.kt b/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/UnsupportedGoogleApisTest.kt new file mode 100644 index 000000000..509adb902 --- /dev/null +++ b/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/UnsupportedGoogleApisTest.kt @@ -0,0 +1,29 @@ +package io.github.hyochan.kmpiap + +import io.github.hyochan.kmpiap.openiap.ErrorCode +import kotlinx.coroutines.test.runTest +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFailsWith + +class UnsupportedGoogleApisTest { + @Test + fun `non-Play stores reject Google in-app messages`() = runTest { + for ((storeName, store) in listOf( + "amazon" to Store.AMAZON, + "horizon" to Store.PLAY_STORE, + )) { + val implementation = AmazonInAppPurchaseAndroid( + storeName = storeName, + store = store, + versionPlatform = "Android $storeName", + ) + + val error = assertFailsWith { + implementation.showInAppMessagesAndroid(null) + } + + assertEquals(ErrorCode.FeatureNotSupported, error.error.code) + } + } +} diff --git a/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/dsl/PurchaseDsl.kt b/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/dsl/PurchaseDsl.kt index 7a23aaac2..3c8907bc0 100644 --- a/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/dsl/PurchaseDsl.kt +++ b/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/dsl/PurchaseDsl.kt @@ -14,6 +14,7 @@ import io.github.hyochan.kmpiap.openiap.RequestSubscriptionPropsByPlatforms import io.github.hyochan.kmpiap.openiap.DiscountOfferInputIOS import io.github.hyochan.kmpiap.openiap.PromotionalOfferJWSInputIOS import io.github.hyochan.kmpiap.openiap.SubscriptionBillingPlanTypeIOS +import io.github.hyochan.kmpiap.openiap.SubscriptionProductReplacementParamsAndroid import io.github.hyochan.kmpiap.openiap.WinBackOfferInputIOS /** @@ -201,8 +202,11 @@ class AndroidOptionsBuilder { var obfuscatedProfileId: String? = null var isOfferPersonalized: Boolean? = null var purchaseToken: String? = null + /** Original external transaction ID for a developer-billed subscription replacement (9.1.0+). */ + var originalExternalTransactionId: String? = null var replacementMode: Int? = null var subscriptionOffers: List = emptyList() + var subscriptionProductReplacementParams: SubscriptionProductReplacementParamsAndroid? = null /** * Offer token for one-time purchase discounts (Android 7.0+). * Pass the offerToken from oneTimePurchaseOfferDetailsAndroid or discountOffers @@ -210,9 +214,7 @@ class AndroidOptionsBuilder { */ var offerToken: String? = null /** - * Developer billing option for External Payments (Billing Library 8.3.0+, Japan only). - * When set, the purchase dialog shows side-by-side choice between Google Play - * and developer's external payment option. + * Developer billing option for External Payments (8.3.0+) or Billing Choice (9.1.0+). */ var developerBillingOption: DeveloperBillingOptionParamsAndroid? = null @@ -234,8 +236,10 @@ class AndroidOptionsBuilder { obfuscatedProfileId = obfuscatedProfileId, isOfferPersonalized = isOfferPersonalized, purchaseToken = purchaseToken, + originalExternalTransactionId = originalExternalTransactionId, replacementMode = replacementMode, subscriptionOffers = if (subscriptionOffers.isNotEmpty()) subscriptionOffers else null, + subscriptionProductReplacementParams = subscriptionProductReplacementParams, developerBillingOption = developerBillingOption ) diff --git a/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt b/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt index d777c0553..f9b40ea43 100644 --- a/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt +++ b/libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt @@ -51,7 +51,7 @@ public enum class AlternativeBillingModeAndroid(val rawValue: String) { /** * Play Billing choice image layout (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ public enum class BillingChoiceImageLayoutAndroid(val rawValue: String) { /** @@ -84,7 +84,7 @@ public enum class BillingChoiceImageLayoutAndroid(val rawValue: String) { /** * Choice screen renderer for Billing Choice availability (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ public enum class BillingChoiceScreenTypeAndroid(val rawValue: String) { /** @@ -118,7 +118,8 @@ public enum class BillingChoiceScreenTypeAndroid(val rawValue: String) { /** * Billing program types for Google Play Billing Programs (Android) * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, - * BILLING_CHOICE added in 9.1.0. + * BILLING_CHOICE added in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ public enum class BillingProgramAndroid(val rawValue: String) { /** @@ -153,7 +154,7 @@ public enum class BillingProgramAndroid(val rawValue: String) { /** * Billing Choice program. * Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ BillingChoice("billing-choice"); @@ -216,7 +217,7 @@ public enum class DeveloperBillingLaunchModeAndroid(val rawValue: String) { /** * Developer-provided billing destination type for Billing Program reporting details (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ public enum class DeveloperBillingTypeAndroid(val rawValue: String) { /** @@ -608,8 +609,9 @@ public enum class IapEvent(val rawValue: String) { PromotedProductIos("promoted-product-ios"), UserChoiceBillingAndroid("user-choice-billing-android"), /** - * Fired when user selects developer-provided billing option in external payments flow. - * Available on Android with Google Play Billing Library 8.3.0+ + * Fired for External Payments (8.3.0+) and Google-rendered Billing Choice + * developer billing selections on Android. Billing Choice is available in + * OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ DeveloperProvidedBillingAndroid("developer-provided-billing-android"), /** @@ -766,7 +768,8 @@ public enum class IapStore(val rawValue: String) { /** * High-level in-app message category (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ public enum class InAppMessageCategoryAndroid(val rawValue: String) { /** @@ -793,7 +796,8 @@ public enum class InAppMessageCategoryAndroid(val rawValue: String) { /** * Response code from Play billing in-app messages (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ public enum class InAppMessageResponseCodeAndroid(val rawValue: String) { /** @@ -1578,6 +1582,9 @@ public interface PurchaseCommon { * Store where purchase was made */ val store: IapStore + /** + * Unix timestamp in milliseconds since January 1, 1970 UTC. + */ val transactionDate: Double } @@ -1608,6 +1615,9 @@ public data class ActiveSubscription( * pending upgrades/downgrades, and auto-renewal preferences. */ val renewalInfoIOS: RenewalInfoIOS? = null, + /** + * Unix timestamp in milliseconds since January 1, 1970 UTC. + */ val transactionDate: Double, val transactionId: String, /** @@ -1868,7 +1878,7 @@ public data class AppTransaction( /** * Display information for developer-rendered Billing Choice screens (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ public data class BillingChoiceInfoAndroid( /** @@ -1908,6 +1918,7 @@ public data class BillingProgramAvailabilityResultAndroid( val billingProgram: BillingProgramAndroid, /** * Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. */ val choiceScreenType: BillingChoiceScreenTypeAndroid? = null, /** @@ -1917,6 +1928,7 @@ public data class BillingProgramAvailabilityResultAndroid( /** * Whether external-link payment is available for Billing Choice. * Populated only for available BILLING_CHOICE results. + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. */ val isExternalLinkAvailable: Boolean? = null ) { @@ -2020,16 +2032,32 @@ public data class BillingResultAndroid( public data class DeveloperProvidedBillingDetailsAndroid( /** * External transaction token used to report transactions made through developer billing. - * This token must be used when reporting the external transaction to Google Play. - * Must be reported within 24 hours of the transaction. + * Nullable for flows such as external payments where no token is returned. */ - val externalTransactionToken: String + val externalTransactionToken: String? = null, + /** + * URI to launch for an external-link Billing Choice flow, when provided by + * Google Play. + */ + val linkUri: String? = null, + /** + * Original external transaction ID when replacing a subscription that was + * purchased through developer billing. + */ + val originalExternalTransactionId: String? = null, + /** + * Products selected for the developer billing flow. + */ + val products: List ) { companion object { fun fromJson(json: Map): DeveloperProvidedBillingDetailsAndroid { return DeveloperProvidedBillingDetailsAndroid( - externalTransactionToken = json["externalTransactionToken"] as? String ?: "", + externalTransactionToken = json["externalTransactionToken"] as? String, + linkUri = json["linkUri"] as? String, + originalExternalTransactionId = json["originalExternalTransactionId"] as? String, + products = (json["products"] as? List<*>)?.mapNotNull { (it as? Map)?.let { DeveloperProvidedBillingProductAndroid.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for DeveloperProvidedBillingProductAndroid") } ?: emptyList(), ) } } @@ -2037,6 +2065,45 @@ public data class DeveloperProvidedBillingDetailsAndroid( fun toJson(): Map = mapOf( "__typename" to "DeveloperProvidedBillingDetailsAndroid", "externalTransactionToken" to externalTransactionToken, + "linkUri" to linkUri, + "originalExternalTransactionId" to originalExternalTransactionId, + "products" to products.map { it.toJson() }, + ) +} + +/** + * Product selected for developer-provided billing (Android 9.0+). + */ +public data class DeveloperProvidedBillingProductAndroid( + /** + * Product identifier. + */ + val id: String, + /** + * Subscription offer token, when applicable. + */ + val offerToken: String? = null, + /** + * Google Play product type (in-app or subscription). + */ + val type: ProductType +) { + + companion object { + fun fromJson(json: Map): DeveloperProvidedBillingProductAndroid { + return DeveloperProvidedBillingProductAndroid( + id = json["id"] as? String ?: "", + offerToken = json["offerToken"] as? String, + type = (json["type"] as? String)?.let { ProductType.fromJson(it) } ?: ProductType.InApp, + ) + } + } + + fun toJson(): Map = mapOf( + "__typename" to "DeveloperProvidedBillingProductAndroid", + "id" to id, + "offerToken" to offerToken, + "type" to type.toJson(), ) } @@ -2546,7 +2613,8 @@ public data class FetchProductsResultSubscriptions(val value: List): DeveloperBillingOptionParamsAndroid? { val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified - val launchMode = (json["launchMode"] as? String)?.let { DeveloperBillingLaunchModeAndroid.fromJson(it) } ?: DeveloperBillingLaunchModeAndroid.Unspecified + val externalTransactionToken = json["externalTransactionToken"] as? String + val launchMode = (json["launchMode"] as? String)?.let { DeveloperBillingLaunchModeAndroid.fromJson(it) } val linkUri = json["linkUri"] as? String - if (linkUri == null) return null return DeveloperBillingOptionParamsAndroid( billingProgram = billingProgram, + externalTransactionToken = externalTransactionToken, launchMode = launchMode, linkUri = linkUri, ) @@ -4651,7 +4735,8 @@ public data class DeveloperBillingOptionParamsAndroid( fun toJson(): Map = mapOf( "billingProgram" to billingProgram.toJson(), - "launchMode" to launchMode.toJson(), + "externalTransactionToken" to externalTransactionToken, + "launchMode" to launchMode?.toJson(), "linkUri" to linkUri, ) } @@ -4707,7 +4792,7 @@ public data class DiscountOfferInputIOS( /** * Parameters for fetching Billing Choice display information (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ public data class GetBillingChoiceInfoParamsAndroid( /** @@ -4742,7 +4827,8 @@ public data class GetBillingChoiceInfoParamsAndroid( /** * Parameters for showing Play billing in-app messages (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ public data class InAppMessageParamsAndroid( /** @@ -4774,6 +4860,16 @@ public data class InitConnectionConfig( * Use USER_CHOICE_BILLING for user choice billing, EXTERNAL_OFFER for alternative only. */ val alternativeBillingModeAndroid: AlternativeBillingModeAndroid? = null, + /** + * Billing Choice renderer configured in Play Console. Available in OpenIAP + * Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). + * GOOGLE_RENDERED registers the developer-provided billing listener so OpenIAP + * can emit the selection event. DEVELOPER_RENDERED omits that listener so the + * app can render its own choice screen and use the reporting/dialog/link APIs. + * Must match choiceScreenType returned by isBillingProgramAvailableAndroid. + * Defaults to GOOGLE_RENDERED. + */ + val billingChoiceScreenTypeAndroid: BillingChoiceScreenTypeAndroid? = BillingChoiceScreenTypeAndroid.GoogleRendered, /** * Enable a specific billing program for Android (7.0+) * When set, enables the specified billing program for external transactions. @@ -4781,6 +4877,8 @@ public data class InitConnectionConfig( * - EXTERNAL_CONTENT_LINK: Link to external content (8.2.0+) * - EXTERNAL_OFFER: External offers for digital content (8.2.0+) * - EXTERNAL_PAYMENTS: Developer provided billing, Japan only (8.3.0+) + * - BILLING_CHOICE: Google-rendered or developer-rendered billing choice + * (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+) */ val enableBillingProgramAndroid: BillingProgramAndroid? = null ) { @@ -4788,6 +4886,7 @@ public data class InitConnectionConfig( fun fromJson(json: Map): InitConnectionConfig { return InitConnectionConfig( alternativeBillingModeAndroid = (json["alternativeBillingModeAndroid"] as? String)?.let { AlternativeBillingModeAndroid.fromJson(it) }, + billingChoiceScreenTypeAndroid = (json["billingChoiceScreenTypeAndroid"] as? String)?.let { BillingChoiceScreenTypeAndroid.fromJson(it) } ?: BillingChoiceScreenTypeAndroid.GoogleRendered, enableBillingProgramAndroid = (json["enableBillingProgramAndroid"] as? String)?.let { BillingProgramAndroid.fromJson(it) }, ) } @@ -4795,20 +4894,28 @@ public data class InitConnectionConfig( fun toJson(): Map = mapOf( "alternativeBillingModeAndroid" to alternativeBillingModeAndroid?.toJson(), + "billingChoiceScreenTypeAndroid" to billingChoiceScreenTypeAndroid?.toJson(), "enableBillingProgramAndroid" to enableBillingProgramAndroid?.toJson(), ) } /** * Parameters for launching an external link (Android) - * Used with launchExternalLink to initiate external offer or app install flows + * Used with launchExternalLink to initiate external offer, app install, or + * developer-rendered Billing Choice flows * Available in Google Play Billing Library 8.2.0+ */ public data class LaunchExternalLinkParamsAndroid( /** - * The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) + * The billing program (EXTERNAL_CONTENT_LINK, EXTERNAL_OFFER, or BILLING_CHOICE) */ val billingProgram: BillingProgramAndroid, + /** + * External transaction token for a developer-rendered Billing Choice external-link + * flow. Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). Generate it with createBillingProgramReportingDetailsAndroid. + */ + val externalTransactionToken: String? = null, /** * The external link launch mode */ @@ -4825,12 +4932,14 @@ public data class LaunchExternalLinkParamsAndroid( companion object { fun fromJson(json: Map): LaunchExternalLinkParamsAndroid? { val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified + val externalTransactionToken = json["externalTransactionToken"] as? String val launchMode = (json["launchMode"] as? String)?.let { ExternalLinkLaunchModeAndroid.fromJson(it) } ?: ExternalLinkLaunchModeAndroid.Unspecified val linkType = (json["linkType"] as? String)?.let { ExternalLinkTypeAndroid.fromJson(it) } ?: ExternalLinkTypeAndroid.Unspecified val linkUri = json["linkUri"] as? String if (linkUri == null) return null return LaunchExternalLinkParamsAndroid( billingProgram = billingProgram, + externalTransactionToken = externalTransactionToken, launchMode = launchMode, linkType = linkType, linkUri = linkUri, @@ -4840,6 +4949,7 @@ public data class LaunchExternalLinkParamsAndroid( fun toJson(): Map = mapOf( "billingProgram" to billingProgram.toJson(), + "externalTransactionToken" to externalTransactionToken, "launchMode" to launchMode.toJson(), "linkType" to linkType.toJson(), "linkUri" to linkUri, @@ -4963,9 +5073,9 @@ public data class PurchaseUpdatedListenerOptions( public data class RequestPurchaseAndroidProps( /** - * Developer billing option parameters for external payments flow (8.3.0+). - * When provided, the purchase flow will show a side-by-side choice between - * Google Play Billing and the developer's external payment option. + * Developer billing option parameters for external payments and Billing Choice. + * Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ val developerBillingOption: DeveloperBillingOptionParamsAndroid? = null, /** @@ -5183,9 +5293,9 @@ public data class RequestPurchasePropsByPlatforms( public data class RequestSubscriptionAndroidProps( /** - * Developer billing option parameters for external payments flow (8.3.0+). - * When provided, the purchase flow will show a side-by-side choice between - * Google Play Billing and the developer's external payment option. + * Developer billing option parameters for external payments and Billing Choice. + * Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ val developerBillingOption: DeveloperBillingOptionParamsAndroid? = null, /** @@ -5201,6 +5311,12 @@ public data class RequestSubscriptionAndroidProps( * Obfuscated profile ID */ val obfuscatedProfileId: String? = null, + /** + * Original external transaction ID for replacing a subscription that was + * purchased through developer billing. Available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). + */ + val originalExternalTransactionId: String? = null, /** * Purchase token for upgrades/downgrades */ @@ -5230,6 +5346,7 @@ public data class RequestSubscriptionAndroidProps( val isOfferPersonalized = json["isOfferPersonalized"] as? Boolean val obfuscatedAccountId = json["obfuscatedAccountId"] as? String val obfuscatedProfileId = json["obfuscatedProfileId"] as? String + val originalExternalTransactionId = json["originalExternalTransactionId"] as? String val purchaseToken = json["purchaseToken"] as? String val replacementMode = (json["replacementMode"] as? Number)?.toInt() val skus = (json["skus"] as? List<*>)?.mapNotNull { it as? String } @@ -5241,6 +5358,7 @@ public data class RequestSubscriptionAndroidProps( isOfferPersonalized = isOfferPersonalized, obfuscatedAccountId = obfuscatedAccountId, obfuscatedProfileId = obfuscatedProfileId, + originalExternalTransactionId = originalExternalTransactionId, purchaseToken = purchaseToken, replacementMode = replacementMode, skus = skus, @@ -5255,6 +5373,7 @@ public data class RequestSubscriptionAndroidProps( "isOfferPersonalized" to isOfferPersonalized, "obfuscatedAccountId" to obfuscatedAccountId, "obfuscatedProfileId" to obfuscatedProfileId, + "originalExternalTransactionId" to originalExternalTransactionId, "purchaseToken" to purchaseToken, "replacementMode" to replacementMode, "skus" to skus, @@ -5890,6 +6009,8 @@ public interface MutationResolver { * Returns external transaction token needed for reporting external transactions. * developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, * native Android defaults it to IN_APP. + * The Billing Choice extension is available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ @@ -5924,7 +6045,10 @@ public interface MutationResolver { */ suspend fun isBillingProgramAvailableAndroid(program: BillingProgramAndroid): BillingProgramAvailabilityResultAndroid /** - * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). + * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+), + * including developer-rendered Billing Choice external-link flows. + * Billing Choice availability: OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). * Replaces the deprecated showExternalOfferInformationDialog API. * Shows Play Store dialog and optionally launches external URL. * Throws OpenIapError.NotPrepared if billing client not ready. @@ -5976,8 +6100,9 @@ public interface MutationResolver { */ suspend fun showAlternativeBillingDialogAndroid(): Boolean /** - * Show Google's information dialog for a Billing Choice external transaction. - * Available in Google Play Billing Library 9.1.0+. + * Show Google's mandatory information dialog before a developer-rendered, + * in-app Billing Choice screen. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android */ @@ -5991,7 +6116,8 @@ public interface MutationResolver { suspend fun showExternalPurchaseCustomLinkNoticeIOS(noticeType: ExternalPurchaseCustomLinkNoticeTypeIOS): ExternalPurchaseCustomLinkNoticeResultIOS /** * Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. - * Available in Google Play Billing Library 4.1.0+. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). * Returns a response code and, when the subscription status changes, the related purchase token. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-in-app-messages-android @@ -6075,7 +6201,7 @@ public interface QueryResolver { suspend fun getAvailablePurchases(options: PurchaseOptions? = null): List /** * Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. - * Available in Google Play Billing Library 9.1.0+. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client is not ready. * See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android */ @@ -6161,11 +6287,11 @@ public interface QueryResolver { */ public interface SubscriptionResolver { /** - * Fires when a user selects developer billing in the External Payments flow (Android only) - * Triggered when the user chooses to pay via the developer's external payment option - * instead of Google Play Billing in the side-by-side choice dialog. - * Contains the externalTransactionToken needed to report the transaction. - * Available in Google Play Billing Library 8.3.0+ + * Fires when a user selects developer billing in an External Payments or + * Billing Choice flow (Android only). The payload can contain an external + * transaction token, link URI, original transaction ID, and selected products. + * Billing Choice payload fields are available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ suspend fun developerProvidedBillingAndroid(): DeveloperProvidedBillingDetailsAndroid /** diff --git a/libraries/kmp-iap/library/src/commonTest/kotlin/io/github/hyochan/kmpiap/InAppPurchaseTest.kt b/libraries/kmp-iap/library/src/commonTest/kotlin/io/github/hyochan/kmpiap/InAppPurchaseTest.kt index dde4d862a..cbb852abb 100644 --- a/libraries/kmp-iap/library/src/commonTest/kotlin/io/github/hyochan/kmpiap/InAppPurchaseTest.kt +++ b/libraries/kmp-iap/library/src/commonTest/kotlin/io/github/hyochan/kmpiap/InAppPurchaseTest.kt @@ -2,6 +2,7 @@ package io.github.hyochan.kmpiap +import io.github.hyochan.kmpiap.dsl.AndroidOptionsBuilder import io.github.hyochan.kmpiap.openiap.* import kotlin.test.Test import kotlin.test.assertEquals @@ -807,19 +808,87 @@ class InAppPurchaseTest { assertEquals("https://example.com/payment", params.linkUri) } + @Test + fun testDeveloperBillingOptionParamsAndroidWithInAppBillingChoice() { + val params = DeveloperBillingOptionParamsAndroid( + billingProgram = BillingProgramAndroid.BillingChoice + ) + + assertNull(params.externalTransactionToken) + assertNull(params.launchMode) + assertNull(params.linkUri) + } + + @Test + fun testBillingChoiceConnectionConfigRenderer() { + assertEquals( + BillingChoiceScreenTypeAndroid.GoogleRendered, + InitConnectionConfig().billingChoiceScreenTypeAndroid + ) + assertEquals( + BillingChoiceScreenTypeAndroid.DeveloperRendered, + InitConnectionConfig( + billingChoiceScreenTypeAndroid = BillingChoiceScreenTypeAndroid.DeveloperRendered, + enableBillingProgramAndroid = BillingProgramAndroid.BillingChoice + ).billingChoiceScreenTypeAndroid + ) + } + + @Test + fun testBillingChoiceLaunchExternalLinkToken() { + val params = LaunchExternalLinkParamsAndroid( + billingProgram = BillingProgramAndroid.BillingChoice, + externalTransactionToken = "external-token", + launchMode = ExternalLinkLaunchModeAndroid.LaunchInExternalBrowserOrApp, + linkType = ExternalLinkTypeAndroid.LinkToDigitalContentOffer, + linkUri = "https://example.com/checkout" + ) + + assertEquals("external-token", params.externalTransactionToken) + } + + @Test + fun testAndroidOptionsBuilderPreservesExternalSubscriptionId() { + val options = AndroidOptionsBuilder().apply { + skus = listOf("monthly_subscription") + originalExternalTransactionId = "original-external-id" + developerBillingOption = DeveloperBillingOptionParamsAndroid( + billingProgram = BillingProgramAndroid.BillingChoice + ) + }.build() + + assertEquals( + "original-external-id", + options?.subscription?.originalExternalTransactionId + ) + } + @Test fun testDeveloperProvidedBillingDetailsAndroid() { val details = DeveloperProvidedBillingDetailsAndroid( - externalTransactionToken = "ext_txn_token_12345" + externalTransactionToken = null, + linkUri = "https://example.com/checkout", + originalExternalTransactionId = "original-external-id", + products = listOf( + DeveloperProvidedBillingProductAndroid( + id = "monthly_subscription", + offerToken = "offer-token", + type = ProductType.Subs + ) + ) ) - assertEquals("ext_txn_token_12345", details.externalTransactionToken) + assertNull(details.externalTransactionToken) + assertEquals("https://example.com/checkout", details.linkUri) + assertEquals("original-external-id", details.originalExternalTransactionId) + assertEquals(ProductType.Subs, details.products.single().type) } @Test fun testRequestPurchaseAndroidPropsWithDeveloperBillingOption() { val developerBillingOption = DeveloperBillingOptionParamsAndroid( - billingProgram = BillingProgramAndroid.ExternalPayments, + billingProgram = BillingProgramAndroid.BillingChoice, + externalTransactionToken = "pre-generated-token", launchMode = DeveloperBillingLaunchModeAndroid.LaunchInExternalBrowserOrApp, linkUri = "https://example.com/checkout" ) @@ -831,19 +900,22 @@ class InAppPurchaseTest { assertEquals(listOf("premium_product"), props.skus) assertNotNull(props.developerBillingOption) - assertEquals(BillingProgramAndroid.ExternalPayments, props.developerBillingOption?.billingProgram) + assertEquals(BillingProgramAndroid.BillingChoice, props.developerBillingOption?.billingProgram) + assertEquals("pre-generated-token", props.developerBillingOption?.externalTransactionToken) assertEquals("https://example.com/checkout", props.developerBillingOption?.linkUri) } @Test fun testRequestSubscriptionAndroidPropsWithDeveloperBillingOption() { val developerBillingOption = DeveloperBillingOptionParamsAndroid( - billingProgram = BillingProgramAndroid.ExternalPayments, + billingProgram = BillingProgramAndroid.BillingChoice, + externalTransactionToken = "pre-generated-token", launchMode = DeveloperBillingLaunchModeAndroid.LaunchInExternalBrowserOrApp, linkUri = "https://example.com/subscribe" ) val props = RequestSubscriptionAndroidProps( + originalExternalTransactionId = "original-external-id", skus = listOf("monthly_subscription"), subscriptionOffers = listOf( AndroidSubscriptionOfferInput( @@ -856,7 +928,9 @@ class InAppPurchaseTest { assertEquals(listOf("monthly_subscription"), props.skus) assertNotNull(props.developerBillingOption) - assertEquals(BillingProgramAndroid.ExternalPayments, props.developerBillingOption?.billingProgram) + assertEquals("original-external-id", props.originalExternalTransactionId) + assertEquals(BillingProgramAndroid.BillingChoice, props.developerBillingOption?.billingProgram) + assertEquals("pre-generated-token", props.developerBillingOption?.externalTransactionToken) assertEquals("https://example.com/subscribe", props.developerBillingOption?.linkUri) } diff --git a/libraries/kmp-iap/serializeTransaction_enhanced.swift b/libraries/kmp-iap/serializeTransaction_enhanced.swift index a3f3bc04c..d749e5f7f 100644 --- a/libraries/kmp-iap/serializeTransaction_enhanced.swift +++ b/libraries/kmp-iap/serializeTransaction_enhanced.swift @@ -32,7 +32,7 @@ func serializeTransaction(_ transaction: Transaction, jwsRepresentationIOS: Stri "productId": transaction.productID, "ids": [transaction.productID], "transactionId": String(transaction.id), // @deprecated - use id instead - "transactionDate": transaction.purchaseDate.timeIntervalSince1970, + "transactionDate": transaction.purchaseDate.timeIntervalSince1970 * 1000, "transactionReceipt": jwsReceipt, "platform": "ios", // Existing iOS-specific fields @@ -115,4 +115,4 @@ func serializeTransaction(_ transaction: Transaction, jwsRepresentationIOS: Stri } return purchaseMap -} \ No newline at end of file +} diff --git a/libraries/maui-iap/Directory.Build.props b/libraries/maui-iap/Directory.Build.props new file mode 100644 index 000000000..ef7fd1494 --- /dev/null +++ b/libraries/maui-iap/Directory.Build.props @@ -0,0 +1,12 @@ + + + $(DefaultItemExcludes);obj/**;bin/** + + + + + obj/stores/$(OpenIapAndroidStore)/ + bin/stores/$(OpenIapAndroidStore)/ + + diff --git a/libraries/maui-iap/README.md b/libraries/maui-iap/README.md index 9e3b1e80b..63b3a904e 100644 --- a/libraries/maui-iap/README.md +++ b/libraries/maui-iap/README.md @@ -141,6 +141,24 @@ For .NET 10 apps, use the matching `net10.0-android`, `net10.0-ios`, and VS Code launch configurations are in `libraries/maui-iap/.vscode/launch.json`. The Android launcher builds both AARs before compiling the example app. +### Android store variants + +Source builds can select Amazon Appstore or Meta Horizon instead of Google +Play. Build the matching native facade immediately before the .NET build: + +```bash +cd libraries/maui-iap/android +../../../packages/google/gradlew :openiap:assembleRelease -PopenIapAndroidStore=amazon +cd .. +dotnet build example/OpenIap.Maui.Example/OpenIap.Maui.Example.csproj \ + -f net9.0-android \ + -p:OpenIapAndroidStore=amazon +``` + +Use `horizon` for Meta Horizon and `play` for Google Play. MAUI keeps each +store's intermediate and output directories separate, preventing a prior +store build from leaking its AAR or manifest into the next variant. + ## What's generated vs. hand-written - **Generated:** [`src/OpenIap.Maui/Types.cs`](src/OpenIap.Maui/Types.cs) is diff --git a/libraries/maui-iap/example/OpenIap.Maui.Example/Pages/AlternativeBillingPage.xaml.cs b/libraries/maui-iap/example/OpenIap.Maui.Example/Pages/AlternativeBillingPage.xaml.cs index da8db5dae..d82d0bf84 100644 --- a/libraries/maui-iap/example/OpenIap.Maui.Example/Pages/AlternativeBillingPage.xaml.cs +++ b/libraries/maui-iap/example/OpenIap.Maui.Example/Pages/AlternativeBillingPage.xaml.cs @@ -397,8 +397,12 @@ await mutate.RequestPurchaseAsync(new RequestPurchaseProps } catch (Exception ex) { - ShowResult($"❌ Error: {ErrorUtils.ExtractErrorMessage(ex)}"); - await DisplayAlert("Error", ErrorUtils.ExtractErrorMessage(ex), "OK"); + var message = ErrorUtils.FormatPurchaseFailure(ex); + ShowResult(ErrorUtils.IsUserCancelled(ex) ? $"⚠️ {message}" : $"❌ {message}"); + if (!ErrorUtils.IsUserCancelled(ex)) + { + await DisplayAlert("Error", ErrorUtils.ExtractErrorMessage(ex), "OK"); + } SetProcessing(false); } } @@ -431,9 +435,13 @@ private void OnPurchaseError(PurchaseError error) { _isProcessing = false; UpdatePurchaseButton(); - ShowResult($"❌ Purchase failed: {error.Message}"); - if (error.Code != ErrorCode.UserCancelled) + if (error.Code == ErrorCode.UserCancelled) + { + ShowResult("⚠️ Purchase cancelled by user"); + } + else { + ShowResult($"❌ Purchase failed: {error.Message}"); _ = DisplayAlert("Error", error.Message, "OK"); } } diff --git a/libraries/maui-iap/example/OpenIap.Maui.Example/Pages/PurchaseFlowPage.xaml.cs b/libraries/maui-iap/example/OpenIap.Maui.Example/Pages/PurchaseFlowPage.xaml.cs index af7d5a937..fd9ab1c32 100644 --- a/libraries/maui-iap/example/OpenIap.Maui.Example/Pages/PurchaseFlowPage.xaml.cs +++ b/libraries/maui-iap/example/OpenIap.Maui.Example/Pages/PurchaseFlowPage.xaml.cs @@ -334,7 +334,7 @@ private async Task HandlePurchaseAsync(string sku) catch (Exception ex) { _isProcessing = false; - UpdateResult($"Purchase failed: {ErrorUtils.ExtractErrorMessage(ex)}"); + UpdateResult(ErrorUtils.FormatPurchaseFailure(ex)); RenderProducts(); } } @@ -371,7 +371,7 @@ private async Task ObservePurchaseRequestAsync(Task requ { if (!_isProcessing) return; _isProcessing = false; - UpdateResult($"Purchase failed: {ErrorUtils.ExtractErrorMessage(ex)}"); + UpdateResult(ErrorUtils.FormatPurchaseFailure(ex)); RenderProducts(); }); } @@ -471,7 +471,7 @@ await mutate.FinishTransactionAsync( private void OnPurchaseError(PurchaseError error) { _isProcessing = false; - UpdateResult($"Purchase failed: {error.Message}"); + UpdateResult(ErrorUtils.FormatPurchaseFailure(error)); RenderProducts(); } diff --git a/libraries/maui-iap/example/OpenIap.Maui.Example/Pages/SubscriptionFlowPage.xaml.cs b/libraries/maui-iap/example/OpenIap.Maui.Example/Pages/SubscriptionFlowPage.xaml.cs index 3cc3965be..a80a4ad9a 100644 --- a/libraries/maui-iap/example/OpenIap.Maui.Example/Pages/SubscriptionFlowPage.xaml.cs +++ b/libraries/maui-iap/example/OpenIap.Maui.Example/Pages/SubscriptionFlowPage.xaml.cs @@ -531,7 +531,7 @@ private async Task SubmitSubscriptionRequestAsync(ProductSubscription sub, Cance MainThread.BeginInvokeOnMainThread(() => { _isProcessing = false; - UpdateResult($"Subscription failed: {ErrorUtils.ExtractErrorMessage(ex)}"); + UpdateResult(ErrorUtils.FormatPurchaseFailure(ex, "Subscription")); RenderSubscriptions(); }); } @@ -576,7 +576,7 @@ private async Task ObserveSubscriptionRequestAsync( { if (!_isProcessing) return; _isProcessing = false; - UpdateResult($"Subscription failed: {ErrorUtils.ExtractErrorMessage(ex)}"); + UpdateResult(ErrorUtils.FormatPurchaseFailure(ex, "Subscription")); RenderSubscriptions(); }); } @@ -748,7 +748,7 @@ private void OnPurchaseError(PurchaseError error) CancelPurchaseWatchdog(); _isProcessing = false; _isHandlingPurchase = false; - UpdateResult($"Subscription failed: {error.Message}"); + UpdateResult(ErrorUtils.FormatPurchaseFailure(error, "Subscription")); RenderSubscriptions(); } diff --git a/libraries/maui-iap/example/OpenIap.Maui.Example/Utils/ErrorUtils.cs b/libraries/maui-iap/example/OpenIap.Maui.Example/Utils/ErrorUtils.cs index 43a0e73c9..f6861cd5e 100644 --- a/libraries/maui-iap/example/OpenIap.Maui.Example/Utils/ErrorUtils.cs +++ b/libraries/maui-iap/example/OpenIap.Maui.Example/Utils/ErrorUtils.cs @@ -1,5 +1,7 @@ // Mirrors libraries/expo-iap/example/src/utils/errorUtils.ts. +using OpenIap; + namespace OpenIap.Maui.Example.Utils; public static class ErrorUtils @@ -18,4 +20,16 @@ public static string ExtractErrorMessage(object? error) _ => error.ToString() ?? "Unknown error", }; } + + public static bool IsUserCancelled(object? error) => error switch + { + OpenIapException ex => ex.Error.Code == ErrorCode.UserCancelled, + PurchaseError purchaseError => purchaseError.Code == ErrorCode.UserCancelled, + _ => false, + }; + + public static string FormatPurchaseFailure(object error, string operation = "Purchase") => + IsUserCancelled(error) + ? $"{operation} cancelled by user" + : $"{operation} failed: {ExtractErrorMessage(error)}"; } diff --git a/libraries/maui-iap/src/Directory.Build.props b/libraries/maui-iap/src/Directory.Build.props index e89076802..0024ccd38 100644 --- a/libraries/maui-iap/src/Directory.Build.props +++ b/libraries/maui-iap/src/Directory.Build.props @@ -1,10 +1,12 @@ + 9.1.0 3.0.8 - 77.0.1 - 1.1.1 + 2.0.0 + 0.2.0 + 1.11.0.1 2.10.1 9.1.0.1 2.14.0 diff --git a/libraries/maui-iap/src/OpenIap.Maui.Bindings.Android/OpenIap.Maui.Bindings.Android.csproj b/libraries/maui-iap/src/OpenIap.Maui.Bindings.Android/OpenIap.Maui.Bindings.Android.csproj index 7f09b5201..4d66d1fc5 100644 --- a/libraries/maui-iap/src/OpenIap.Maui.Bindings.Android/OpenIap.Maui.Bindings.Android.csproj +++ b/libraries/maui-iap/src/OpenIap.Maui.Bindings.Android/OpenIap.Maui.Bindings.Android.csproj @@ -65,8 +65,12 @@ - + + + + + - + @@ -96,8 +96,12 @@ - + + + + + diff --git a/libraries/maui-iap/src/OpenIap.Maui/Types.cs b/libraries/maui-iap/src/OpenIap.Maui/Types.cs index 9acce4555..9b60900f3 100644 --- a/libraries/maui-iap/src/OpenIap.Maui/Types.cs +++ b/libraries/maui-iap/src/OpenIap.Maui/Types.cs @@ -79,7 +79,7 @@ public static class AlternativeBillingModeAndroidExtensions } /// Play Billing choice image layout (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). [JsonConverter(typeof(BillingChoiceImageLayoutAndroidJsonConverter))] public enum BillingChoiceImageLayoutAndroid { @@ -134,7 +134,7 @@ public static class BillingChoiceImageLayoutAndroidExtensions } /// Choice screen renderer for Billing Choice availability (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). [JsonConverter(typeof(BillingChoiceScreenTypeAndroidJsonConverter))] public enum BillingChoiceScreenTypeAndroid { @@ -190,7 +190,8 @@ public static class BillingChoiceScreenTypeAndroidExtensions /// Billing program types for Google Play Billing Programs (Android) /// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, -/// BILLING_CHOICE added in 9.1.0. +/// BILLING_CHOICE added in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (requires Play Billing 9.1.0+). [JsonConverter(typeof(BillingProgramAndroidJsonConverter))] public enum BillingProgramAndroid { @@ -215,7 +216,7 @@ public enum BillingProgramAndroid ExternalPayments, /// Billing Choice program. /// Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. - /// Available in Google Play Billing Library 9.1.0+ + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). BillingChoice } @@ -329,7 +330,7 @@ public static class DeveloperBillingLaunchModeAndroidExtensions } /// Developer-provided billing destination type for Billing Program reporting details (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). [JsonConverter(typeof(DeveloperBillingTypeAndroidJsonConverter))] public enum DeveloperBillingTypeAndroid { @@ -947,8 +948,9 @@ public enum IapEvent PurchaseError, PromotedProductIOS, UserChoiceBillingAndroid, - /// Fired when user selects developer-provided billing option in external payments flow. - /// Available on Android with Google Play Billing Library 8.3.0+ + /// Fired for External Payments (8.3.0+) and Google-rendered Billing Choice + /// developer billing selections on Android. Billing Choice is available in + /// OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). DeveloperProvidedBillingAndroid, /// Fired when an active subscription enters a billing-issue state that requires user attention. /// Cross-platform unification of StoreKit 2 Message.billingIssue (iOS 18+) and @@ -1209,7 +1211,8 @@ public static class IapStoreExtensions } /// High-level in-app message category (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). [JsonConverter(typeof(InAppMessageCategoryAndroidJsonConverter))] public enum InAppMessageCategoryAndroid { @@ -1259,7 +1262,8 @@ public static class InAppMessageCategoryAndroidExtensions } /// Response code from Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). [JsonConverter(typeof(InAppMessageResponseCodeAndroidJsonConverter))] public enum InAppMessageResponseCodeAndroid { @@ -2578,6 +2582,7 @@ public interface PurchaseCommon int Quantity { get; } /// Store where purchase was made IapStore Store { get; } + /// Unix timestamp in milliseconds since January 1, 1970 UTC. double TransactionDate { get; } } @@ -2648,6 +2653,7 @@ public sealed record ActiveSubscription /// pending upgrades/downgrades, and auto-renewal preferences. [JsonPropertyName("renewalInfoIOS")] public RenewalInfoIOS? RenewalInfoIOS { get; init; } + /// Unix timestamp in milliseconds since January 1, 1970 UTC. [JsonPropertyName("transactionDate")] public required double TransactionDate { get; init; } [JsonPropertyName("transactionId")] @@ -2753,7 +2759,7 @@ public sealed record AppTransaction } /// Display information for developer-rendered Billing Choice screens (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public sealed record BillingChoiceInfoAndroid { /// URL for the Play Billing choice image matching the requested layout. @@ -2772,6 +2778,7 @@ public sealed record BillingProgramAvailabilityResultAndroid [JsonPropertyName("billingProgram")] public required BillingProgramAndroid BillingProgram { get; init; } /// Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. [JsonPropertyName("choiceScreenType")] public BillingChoiceScreenTypeAndroid? ChoiceScreenType { get; init; } /// Whether the billing program is available for the user @@ -2779,6 +2786,7 @@ public sealed record BillingProgramAvailabilityResultAndroid public required bool IsAvailable { get; init; } /// Whether external-link payment is available for Billing Choice. /// Populated only for available BILLING_CHOICE results. + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. [JsonPropertyName("isExternalLinkAvailable")] public bool? IsExternalLinkAvailable { get; init; } } @@ -2819,10 +2827,34 @@ public sealed record BillingResultAndroid public sealed record DeveloperProvidedBillingDetailsAndroid { /// External transaction token used to report transactions made through developer billing. - /// This token must be used when reporting the external transaction to Google Play. - /// Must be reported within 24 hours of the transaction. + /// Nullable for flows such as external payments where no token is returned. [JsonPropertyName("externalTransactionToken")] - public required string ExternalTransactionToken { get; init; } + public string? ExternalTransactionToken { get; init; } + /// URI to launch for an external-link Billing Choice flow, when provided by + /// Google Play. + [JsonPropertyName("linkUri")] + public string? LinkUri { get; init; } + /// Original external transaction ID when replacing a subscription that was + /// purchased through developer billing. + [JsonPropertyName("originalExternalTransactionId")] + public string? OriginalExternalTransactionId { get; init; } + /// Products selected for the developer billing flow. + [JsonPropertyName("products")] + public required IReadOnlyList Products { get; init; } +} + +/// Product selected for developer-provided billing (Android 9.0+). +public sealed record DeveloperProvidedBillingProductAndroid +{ + /// Product identifier. + [JsonPropertyName("id")] + public required string Id { get; init; } + /// Subscription offer token, when applicable. + [JsonPropertyName("offerToken")] + public string? OfferToken { get; init; } + /// Google Play product type (in-app or subscription). + [JsonPropertyName("type")] + public required ProductType Type { get; init; } } /// Discount amount details for one-time purchase offers (Android) @@ -3057,7 +3089,8 @@ public sealed record FetchProductsResultProducts(IReadOnlyList? Value) public sealed record FetchProductsResultSubscriptions(IReadOnlyList? Value) : FetchProductsResult; /// Result from showing Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). public sealed record InAppMessageResultAndroid { /// Purchase token returned when a subscription status changed. @@ -3178,7 +3211,7 @@ public sealed record ProductAndroid : Product, ProductCommon [JsonPropertyName("oneTimePurchaseOfferDetailsAndroid")] public IReadOnlyList? OneTimePurchaseOfferDetailsAndroid { get; init; } [JsonPropertyName("platform")] - public IapPlatform Platform { get; init; } = IapPlatform.Android; + public IapPlatform Platform { get; init; } = global::OpenIap.IapPlatform.Android; [JsonPropertyName("price")] public double? Price { get; init; } /// Product-level status code indicating fetch result (Android 8.0+) @@ -3199,7 +3232,7 @@ public sealed record ProductAndroid : Product, ProductCommon [JsonPropertyName("title")] public required string Title { get; init; } [JsonPropertyName("type")] - public ProductType Type { get; init; } = ProductType.InApp; + public ProductType Type { get; init; } = global::OpenIap.ProductType.InApp; } /// One-time purchase offer details (Android). @@ -3272,7 +3305,7 @@ public sealed record ProductIOS : Product, ProductCommon [JsonPropertyName("jsonRepresentationIOS")] public required string JsonRepresentationIOS { get; init; } [JsonPropertyName("platform")] - public IapPlatform Platform { get; init; } = IapPlatform.IOS; + public IapPlatform Platform { get; init; } = global::OpenIap.IapPlatform.IOS; [JsonPropertyName("price")] public double? Price { get; init; } /// iOS 26.4+ subscription pricing terms, including billing plan metadata for @@ -3291,7 +3324,7 @@ public sealed record ProductIOS : Product, ProductCommon [JsonPropertyName("title")] public required string Title { get; init; } [JsonPropertyName("type")] - public ProductType Type { get; init; } = ProductType.InApp; + public ProductType Type { get; init; } = global::OpenIap.ProductType.InApp; [JsonPropertyName("typeIOS")] public required ProductTypeIOS TypeIOS { get; init; } } @@ -3323,7 +3356,7 @@ public sealed record ProductSubscriptionAndroid : ProductSubscription, ProductCo [JsonPropertyName("oneTimePurchaseOfferDetailsAndroid")] public IReadOnlyList? OneTimePurchaseOfferDetailsAndroid { get; init; } [JsonPropertyName("platform")] - public IapPlatform Platform { get; init; } = IapPlatform.Android; + public IapPlatform Platform { get; init; } = global::OpenIap.IapPlatform.Android; [JsonPropertyName("price")] public double? Price { get; init; } /// Product-level status code indicating fetch result (Android 8.0+) @@ -3344,7 +3377,7 @@ public sealed record ProductSubscriptionAndroid : ProductSubscription, ProductCo [JsonPropertyName("title")] public required string Title { get; init; } [JsonPropertyName("type")] - public ProductType Type { get; init; } = ProductType.Subs; + public ProductType Type { get; init; } = global::OpenIap.ProductType.Subs; } /// Subscription offer details (Android). @@ -3403,7 +3436,7 @@ public sealed record ProductSubscriptionIOS : ProductSubscription, ProductCommon [JsonPropertyName("jsonRepresentationIOS")] public required string JsonRepresentationIOS { get; init; } [JsonPropertyName("platform")] - public IapPlatform Platform { get; init; } = IapPlatform.IOS; + public IapPlatform Platform { get; init; } = global::OpenIap.IapPlatform.IOS; [JsonPropertyName("price")] public double? Price { get; init; } /// iOS 26.4+ subscription pricing terms, including billing plan metadata for @@ -3428,7 +3461,7 @@ public sealed record ProductSubscriptionIOS : ProductSubscription, ProductCommon [JsonPropertyName("title")] public required string Title { get; init; } [JsonPropertyName("type")] - public ProductType Type { get; init; } = ProductType.Subs; + public ProductType Type { get; init; } = global::OpenIap.ProductType.Subs; [JsonPropertyName("typeIOS")] public required ProductTypeIOS TypeIOS { get; init; } } @@ -3485,6 +3518,7 @@ public sealed record PurchaseAndroid : Purchase, PurchaseCommon /// Store where purchase was made [JsonPropertyName("store")] public required IapStore Store { get; init; } + /// Unix timestamp in milliseconds since January 1, 1970 UTC. [JsonPropertyName("transactionDate")] public required double TransactionDate { get; init; } [JsonPropertyName("transactionId")] @@ -3585,6 +3619,7 @@ public sealed record PurchaseIOS : Purchase, PurchaseCommon public string? StorefrontCountryCodeIOS { get; init; } [JsonPropertyName("subscriptionGroupIdIOS")] public string? SubscriptionGroupIdIOS { get; init; } + /// Unix timestamp in milliseconds since January 1, 1970 UTC. [JsonPropertyName("transactionDate")] public required double TransactionDate { get; init; } [JsonPropertyName("transactionId")] @@ -4079,12 +4114,12 @@ public sealed record AndroidSubscriptionOfferInput } /// Parameters for showing a billing program information dialog (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public sealed record BillingProgramInformationDialogParamsAndroid { /// Billing program. Currently only BILLING_CHOICE is supported. [JsonPropertyName("billingProgram")] - public BillingProgramAndroid BillingProgram { get; init; } = BillingProgramAndroid.BillingChoice; + public BillingProgramAndroid BillingProgram { get; init; } = global::OpenIap.BillingProgramAndroid.BillingChoice; /// External transaction token returned by the Billing Choice reporting-details flow. [JsonPropertyName("externalTransactionToken")] public required string ExternalTransactionToken { get; init; } @@ -4100,20 +4135,28 @@ public sealed record DeepLinkOptions public string? PackageNameAndroid { get; init; } } -/// Parameters for developer billing option in purchase flow (Android) -/// Used with BillingFlowParams to enable external payments flow -/// Available in Google Play Billing Library 8.3.0+ +/// Parameters for a developer billing option in a purchase flow (Android). +/// Used with BillingFlowParams for external payments (8.3.0+) and Billing Choice +/// (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+). +/// Only billingProgram is required; link fields are used when the selected program +/// links outside the app. public sealed record DeveloperBillingOptionParamsAndroid { - /// The billing program (should be EXTERNAL_PAYMENTS for external payments flow) + /// The billing program. Use EXTERNAL_PAYMENTS or BILLING_CHOICE. [JsonPropertyName("billingProgram")] public required BillingProgramAndroid BillingProgram { get; init; } - /// The URI where the external payment will be processed + /// The URI where the external payment will be processed. + /// Required only when the selected billing program links outside the app. [JsonPropertyName("linkUri")] - public required string LinkUri { get; init; } - /// The launch mode for the external payment link + public string? LinkUri { get; init; } + /// The launch mode for the external payment link. + /// Required only when the selected billing program links outside the app. [JsonPropertyName("launchMode")] - public required DeveloperBillingLaunchModeAndroid LaunchMode { get; init; } + public DeveloperBillingLaunchModeAndroid? LaunchMode { get; init; } + /// A pre-generated external transaction token for a Billing Choice external-link + /// flow. Omit it when Google Play should provide the token in the callback. + [JsonPropertyName("externalTransactionToken")] + public string? ExternalTransactionToken { get; init; } } public sealed record DiscountOfferInputIOS @@ -4136,27 +4179,28 @@ public sealed record DiscountOfferInputIOS } /// Parameters for fetching Billing Choice display information (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public sealed record GetBillingChoiceInfoParamsAndroid { /// Billing program. Currently only BILLING_CHOICE is supported. [JsonPropertyName("billingProgram")] - public BillingProgramAndroid BillingProgram { get; init; } = BillingProgramAndroid.BillingChoice; + public BillingProgramAndroid BillingProgram { get; init; } = global::OpenIap.BillingProgramAndroid.BillingChoice; /// Desired Play Billing choice image layout. [JsonPropertyName("playBillingChoiceImageLayout")] - public BillingChoiceImageLayoutAndroid PlayBillingChoiceImageLayout { get; init; } = BillingChoiceImageLayoutAndroid.RectangularFourByOne; + public BillingChoiceImageLayoutAndroid PlayBillingChoiceImageLayout { get; init; } = global::OpenIap.BillingChoiceImageLayoutAndroid.RectangularFourByOne; /// BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. [JsonPropertyName("userLocale")] public string? UserLocale { get; init; } } /// Parameters for showing Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). public sealed record InAppMessageParamsAndroid { /// In-app message categories to show. Defaults to transactional messages. [JsonPropertyName("categories")] - public IReadOnlyList? Categories { get; init; } = new List { InAppMessageCategoryAndroid.Transactional }; + public IReadOnlyList? Categories { get; init; } = new List { global::OpenIap.InAppMessageCategoryAndroid.Transactional }; } /// Connection initialization configuration @@ -4174,16 +4218,28 @@ public sealed record InitConnectionConfig /// - EXTERNAL_CONTENT_LINK: Link to external content (8.2.0+) /// - EXTERNAL_OFFER: External offers for digital content (8.2.0+) /// - EXTERNAL_PAYMENTS: Developer provided billing, Japan only (8.3.0+) + /// - BILLING_CHOICE: Google-rendered or developer-rendered billing choice + /// (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+) [JsonPropertyName("enableBillingProgramAndroid")] public BillingProgramAndroid? EnableBillingProgramAndroid { get; init; } + /// Billing Choice renderer configured in Play Console. Available in OpenIAP + /// Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). + /// GOOGLE_RENDERED registers the developer-provided billing listener so OpenIAP + /// can emit the selection event. DEVELOPER_RENDERED omits that listener so the + /// app can render its own choice screen and use the reporting/dialog/link APIs. + /// Must match choiceScreenType returned by isBillingProgramAvailableAndroid. + /// Defaults to GOOGLE_RENDERED. + [JsonPropertyName("billingChoiceScreenTypeAndroid")] + public BillingChoiceScreenTypeAndroid? BillingChoiceScreenTypeAndroid { get; init; } = global::OpenIap.BillingChoiceScreenTypeAndroid.GoogleRendered; } /// Parameters for launching an external link (Android) -/// Used with launchExternalLink to initiate external offer or app install flows +/// Used with launchExternalLink to initiate external offer, app install, or +/// developer-rendered Billing Choice flows /// Available in Google Play Billing Library 8.2.0+ public sealed record LaunchExternalLinkParamsAndroid { - /// The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) + /// The billing program (EXTERNAL_CONTENT_LINK, EXTERNAL_OFFER, or BILLING_CHOICE) [JsonPropertyName("billingProgram")] public required BillingProgramAndroid BillingProgram { get; init; } /// The external link launch mode @@ -4195,6 +4251,11 @@ public sealed record LaunchExternalLinkParamsAndroid /// The URI where the content will be accessed from [JsonPropertyName("linkUri")] public required string LinkUri { get; init; } + /// External transaction token for a developer-rendered Billing Choice external-link + /// flow. Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). Generate it with createBillingProgramReportingDetailsAndroid. + [JsonPropertyName("externalTransactionToken")] + public string? ExternalTransactionToken { get; init; } } public sealed record ProductRequest @@ -4202,7 +4263,7 @@ public sealed record ProductRequest [JsonPropertyName("skus")] public required IReadOnlyList Skus { get; init; } [JsonPropertyName("type")] - public ProductQueryType? Type { get; init; } = ProductQueryType.InApp; + public ProductQueryType? Type { get; init; } = global::OpenIap.ProductQueryType.InApp; } /// JWS promotional offer input for iOS 15+ (StoreKit 2, WWDC 2025). @@ -4270,9 +4331,9 @@ public sealed record RequestPurchaseAndroidProps /// to apply a discount offer to the purchase. [JsonPropertyName("offerToken")] public string? OfferToken { get; init; } - /// Developer billing option parameters for external payments flow (8.3.0+). - /// When provided, the purchase flow will show a side-by-side choice between - /// Google Play Billing and the developer's external payment option. + /// Developer billing option parameters for external payments and Billing Choice. + /// Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). [JsonPropertyName("developerBillingOption")] public DeveloperBillingOptionParamsAndroid? DeveloperBillingOption { get; init; } } @@ -4359,6 +4420,11 @@ public sealed record RequestSubscriptionAndroidProps /// Purchase token for upgrades/downgrades [JsonPropertyName("purchaseToken")] public string? PurchaseToken { get; init; } + /// Original external transaction ID for replacing a subscription that was + /// purchased through developer billing. Available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). + [JsonPropertyName("originalExternalTransactionId")] + public string? OriginalExternalTransactionId { get; init; } /// Replacement mode for subscription changes /// @deprecated Use subscriptionProductReplacementParams instead for item-level replacement (8.1.0+) [JsonPropertyName("replacementMode")] @@ -4370,9 +4436,9 @@ public sealed record RequestSubscriptionAndroidProps /// Use this instead of replacementMode for item-level replacement [JsonPropertyName("subscriptionProductReplacementParams")] public SubscriptionProductReplacementParamsAndroid? SubscriptionProductReplacementParams { get; init; } - /// Developer billing option parameters for external payments flow (8.3.0+). - /// When provided, the purchase flow will show a side-by-side choice between - /// Google Play Billing and the developer's external payment option. + /// Developer billing option parameters for external payments and Billing Choice. + /// Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). [JsonPropertyName("developerBillingOption")] public DeveloperBillingOptionParamsAndroid? DeveloperBillingOption { get; init; } } @@ -4636,6 +4702,8 @@ public interface MutationResolver /// Returns external transaction token needed for reporting external transactions. /// developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, /// native Android defaults it to IN_APP. + /// The Billing Choice extension is available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android Task CreateBillingProgramReportingDetailsAndroidAsync(BillingProgramAndroid program, DeveloperBillingTypeAndroid? developerBillingType = null); @@ -4664,7 +4732,10 @@ public interface MutationResolver /// See: https://openiap.dev/docs/apis/android/is-billing-program-available-android Task IsBillingProgramAvailableAndroidAsync(BillingProgramAndroid program); - /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). + /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+), + /// including developer-rendered Billing Choice external-link flows. + /// Billing Choice availability: OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). /// Replaces the deprecated showExternalOfferInformationDialog API. /// Shows Play Store dialog and optionally launches external URL. /// Throws OpenIapError.NotPrepared if billing client not ready. @@ -4708,8 +4779,9 @@ public interface MutationResolver /// See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android Task ShowAlternativeBillingDialogAndroidAsync(); - /// Show Google's information dialog for a Billing Choice external transaction. - /// Available in Google Play Billing Library 9.1.0+. + /// Show Google's mandatory information dialog before a developer-rendered, + /// in-app Billing Choice screen. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android Task ShowBillingProgramInformationDialogAndroidAsync(BillingProgramInformationDialogParamsAndroid @params); @@ -4721,7 +4793,8 @@ public interface MutationResolver Task ShowExternalPurchaseCustomLinkNoticeIOSAsync(ExternalPurchaseCustomLinkNoticeTypeIOS noticeType); /// Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. - /// Available in Google Play Billing Library 4.1.0+. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 + /// (upstream API available since Play Billing 4.1.0). /// Returns a response code and, when the subscription status changes, the related purchase token. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-in-app-messages-android @@ -4790,7 +4863,7 @@ public interface QueryResolver Task> GetAvailablePurchasesAsync(PurchaseOptions? options = null); /// Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. - /// Available in Google Play Billing Library 9.1.0+. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client is not ready. /// See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android Task GetBillingChoiceInfoAndroidAsync(GetBillingChoiceInfoParamsAndroid @params); @@ -4859,11 +4932,11 @@ public interface QueryResolver /// GraphQL root subscription operations. public interface SubscriptionResolver { - /// Fires when a user selects developer billing in the External Payments flow (Android only) - /// Triggered when the user chooses to pay via the developer's external payment option - /// instead of Google Play Billing in the side-by-side choice dialog. - /// Contains the externalTransactionToken needed to report the transaction. - /// Available in Google Play Billing Library 8.3.0+ + /// Fires when a user selects developer billing in an External Payments or + /// Billing Choice flow (Android only). The payload can contain an external + /// transaction token, link URI, original transaction ID, and selected products. + /// Billing Choice payload fields are available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). Task DeveloperProvidedBillingAndroidAsync(); /// Fires when the App Store surfaces a promoted product (iOS only) diff --git a/libraries/react-native-iap/CLAUDE.md b/libraries/react-native-iap/CLAUDE.md index 2e70b2f57..426e60506 100644 --- a/libraries/react-native-iap/CLAUDE.md +++ b/libraries/react-native-iap/CLAUDE.md @@ -134,7 +134,7 @@ Access these from the Run and Debug panel (⌘⇧D) in VSCode. 3. **Native Implementation** - iOS: `ios/HybridIAP.swift` - StoreKit 2 implementation - Android: `android/.../Iap.kt` - Play Billing implementation with auto-reconnection - - **Connection Management**: Uses Google Play Billing v8.0.0+ automatic service reconnection + - **Connection Management**: Uses Google Play Billing v9.1.0 automatic service reconnection ## Coding Standards diff --git a/libraries/react-native-iap/README.md b/libraries/react-native-iap/README.md index cfb4d6f40..578a1d786 100644 --- a/libraries/react-native-iap/README.md +++ b/libraries/react-native-iap/README.md @@ -79,7 +79,7 @@ React Native IAP is built with a modern architecture that emphasizes: | Platform | Support | Notes | | ----------------- | ------- | -------------------------------- | | iOS | ✅ | StoreKit 2 (requires iOS 15+) | -| Android | ✅ | Google Play Billing v8.0.0+ | +| Android | ✅ | Google Play Billing v9.1.0 | | Expo Go | ❌ | Use `expo-iap` for Expo projects | | Expo Dev Client | ❌ | Use `expo-iap` for Expo projects | | Bare React Native | ✅ | Full support | @@ -170,7 +170,7 @@ React Native IAP conforms to the **[OpenIAP specification](https://openiap.dev)* - **Shared specification** — Common types, error codes, and purchase flows across all platforms - **Generated type-safe bindings** — Swift, Kotlin, TypeScript, Dart, C#, and GDScript from a single GraphQL schema -- **Platform implementations** — [openiap-apple](https://github.com/hyodotdev/openiap/tree/main/packages/apple) (StoreKit 2) and [openiap-google](https://github.com/hyodotdev/openiap/tree/main/packages/google) (Play Billing 8.x) +- **Platform implementations** — [openiap-apple](https://github.com/hyodotdev/openiap/tree/main/packages/apple) (StoreKit 2) and [openiap-google](https://github.com/hyodotdev/openiap/tree/main/packages/google) (Play Billing 9.1.0) - **Verification profiles** — Standardized receipt validation and purchase verification patterns Other libraries built on OpenIAP: [expo-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/expo-iap) · [flutter_inapp_purchase](https://github.com/hyodotdev/openiap/tree/main/libraries/flutter_inapp_purchase) · [kmp-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/kmp-iap) · [maui-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/maui-iap) · [godot-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/godot-iap) diff --git a/libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt b/libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt index 600de0398..95e9ac6f6 100644 --- a/libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt +++ b/libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt @@ -18,7 +18,7 @@ import dev.hyo.openiap.ProductRequest import dev.hyo.openiap.ProductSubscriptionAndroid import dev.hyo.openiap.ProductSubscriptionAndroidOfferDetails import dev.hyo.openiap.ProductCommon -import dev.hyo.openiap.ProductType +import dev.hyo.openiap.ProductType as OpenIapProductType import dev.hyo.openiap.Purchase as OpenIapPurchase import dev.hyo.openiap.PurchaseAndroid import dev.hyo.openiap.RequestPurchaseAndroidProps @@ -28,6 +28,7 @@ import dev.hyo.openiap.RequestPurchaseResultPurchase import dev.hyo.openiap.RequestPurchaseResultPurchases import dev.hyo.openiap.RequestSubscriptionAndroidProps import dev.hyo.openiap.RequestSubscriptionPropsByPlatforms +import dev.hyo.openiap.SubResponseCodeAndroid as OpenIapSubResponseCodeAndroid import dev.hyo.openiap.SubscriptionProductReplacementParamsAndroid as OpenIapSubscriptionProductReplacementParams import dev.hyo.openiap.SubscriptionReplacementModeAndroid as OpenIapSubscriptionReplacementMode import dev.hyo.openiap.VerifyPurchaseGoogleOptions @@ -42,6 +43,8 @@ import dev.hyo.openiap.BillingChoiceScreenTypeAndroid as OpenIapBillingChoiceScr import dev.hyo.openiap.BillingProgramInformationDialogParamsAndroid as OpenIapBillingProgramInformationDialogParams import dev.hyo.openiap.BillingProgramAndroid as OpenIapBillingProgramAndroid import dev.hyo.openiap.DeveloperBillingTypeAndroid as OpenIapDeveloperBillingType +import dev.hyo.openiap.DeveloperBillingLaunchModeAndroid as OpenIapDeveloperBillingLaunchMode +import dev.hyo.openiap.DeveloperBillingOptionParamsAndroid as OpenIapDeveloperBillingOptionParams import dev.hyo.openiap.GetBillingChoiceInfoParamsAndroid as OpenIapGetBillingChoiceInfoParams import dev.hyo.openiap.InAppMessageCategoryAndroid as OpenIapInAppMessageCategory import dev.hyo.openiap.InAppMessageParamsAndroid as OpenIapInAppMessageParams @@ -209,15 +212,27 @@ class HybridRnIap : HybridRnIapSpec() { sendUserChoiceBilling(nitroDetails) }.onFailure { RnIapLog.failure("userChoiceBillingListener", it) } }) - // Developer Provided Billing listener (External Payments - 8.3.0+) + // Developer Provided Billing listener (External Payments 8.3.0+, Billing Choice 9.1.0+) openIap.addDeveloperProvidedBillingListener(OpenIapDeveloperProvidedBillingListener { details -> runCatching { RnIapLog.result( "developerProvidedBillingListener", - mapOf("token" to details.externalTransactionToken) + mapOf("productCount" to details.products.size) ) val nitroDetails = DeveloperProvidedBillingDetailsAndroid( - externalTransactionToken = details.externalTransactionToken + externalTransactionToken = details.externalTransactionToken.wrapVariant(), + linkUri = details.linkUri.wrapVariant(), + originalExternalTransactionId = details.originalExternalTransactionId.wrapVariant(), + products = details.products.map { product -> + DeveloperProvidedBillingProductAndroid( + id = product.id, + offerToken = product.offerToken.wrapVariant(), + type = when (product.type) { + OpenIapProductType.InApp -> ProductType.IN_APP + OpenIapProductType.Subs -> ProductType.SUBS + } + ) + }.toTypedArray() ) sendDeveloperProvidedBilling(nitroDetails) }.onFailure { RnIapLog.failure("developerProvidedBillingListener", it) } @@ -263,6 +278,9 @@ class HybridRnIap : HybridRnIapSpec() { }, enableBillingProgramAndroid = configValue.enableBillingProgramAndroid?.let { program -> mapBillingProgram(program) + }, + billingChoiceScreenTypeAndroid = configValue.billingChoiceScreenTypeAndroid?.let { type -> + mapBillingChoiceScreenTypeToOpenIap(type) } ) } @@ -486,6 +504,11 @@ class HybridRnIap : HybridRnIapSpec() { } ?: emptyList() val normalizedOffers = subscriptionOffers.takeIf { it.isNotEmpty() } + val developerBillingOption = + (androidRequest.developerBillingOption as? + Variant_NullType_DeveloperBillingOptionParamsAndroid.Second) + ?.value + ?.let(::mapDeveloperBillingOption) val requestProps = when (queryType) { ProductQueryType.Subs -> { @@ -503,6 +526,8 @@ class HybridRnIap : HybridRnIapSpec() { isOfferPersonalized = androidRequest.isOfferPersonalized.unwrapBool(), obfuscatedAccountId = androidRequest.obfuscatedAccountId.unwrapString(), obfuscatedProfileId = androidRequest.obfuscatedProfileId.unwrapString(), + developerBillingOption = developerBillingOption, + originalExternalTransactionId = androidRequest.originalExternalTransactionId.unwrapString(), purchaseToken = androidRequest.purchaseToken.unwrapString(), replacementMode = replacementMode, skus = androidRequest.skus.toList(), @@ -511,7 +536,7 @@ class HybridRnIap : HybridRnIapSpec() { ) RequestPurchaseProps( request = RequestPurchaseProps.Request.Subscription( - RequestSubscriptionPropsByPlatforms(android = androidProps) + RequestSubscriptionPropsByPlatforms(google = androidProps) ), type = ProductQueryType.Subs ) @@ -521,12 +546,13 @@ class HybridRnIap : HybridRnIapSpec() { isOfferPersonalized = androidRequest.isOfferPersonalized.unwrapBool(), obfuscatedAccountId = androidRequest.obfuscatedAccountId.unwrapString(), obfuscatedProfileId = androidRequest.obfuscatedProfileId.unwrapString(), + developerBillingOption = developerBillingOption, offerToken = androidRequest.offerToken.unwrapString(), skus = androidRequest.skus.toList() ) RequestPurchaseProps( request = RequestPurchaseProps.Request.Purchase( - RequestPurchasePropsByPlatforms(android = androidProps) + RequestPurchasePropsByPlatforms(google = androidProps) ), type = ProductQueryType.InApp ) @@ -974,7 +1000,7 @@ class HybridRnIap : HybridRnIapSpec() { var subscriptionPeriodAndroid: String? = null var freeTrialPeriodAndroid: String? = null - if (product.type == ProductType.InApp) { + if (product.type == OpenIapProductType.InApp) { oneTimeOffers?.firstOrNull()?.let { otp -> originalPriceAndroid = otp.formattedPrice originalPriceAmountMicrosAndroid = otp.priceAmountMicros.toDoubleOrNull() @@ -1756,7 +1782,8 @@ class HybridRnIap : HybridRnIapSpec() { RnIapLog.result("showBillingProgramInformationDialogAndroid", mapOf("responseCode" to result.responseCode)) NitroBillingResultAndroid( responseCode = result.responseCode.toDouble(), - debugMessage = result.debugMessage.wrapVariant() + debugMessage = result.debugMessage.wrapVariant(), + subResponseCode = mapSubResponseCode(result.subResponseCode) ) } catch (err: Throwable) { RnIapLog.failure("showBillingProgramInformationDialogAndroid", err) @@ -1818,6 +1845,7 @@ class HybridRnIap : HybridRnIapSpec() { val openIapParams = OpenIapLaunchExternalLinkParams( billingProgram = mapBillingProgram(params.billingProgram), + externalTransactionToken = params.externalTransactionToken.unwrapString(), launchMode = mapExternalLinkLaunchMode(params.launchMode), linkType = mapExternalLinkType(params.linkType), linkUri = params.linkUri @@ -1864,6 +1892,16 @@ class HybridRnIap : HybridRnIapSpec() { } } + private fun mapBillingChoiceScreenTypeToOpenIap( + type: BillingChoiceScreenTypeAndroid + ): OpenIapBillingChoiceScreenType { + return when (type) { + BillingChoiceScreenTypeAndroid.UNSPECIFIED -> OpenIapBillingChoiceScreenType.Unspecified + BillingChoiceScreenTypeAndroid.DEVELOPER_RENDERED -> OpenIapBillingChoiceScreenType.DeveloperRendered + BillingChoiceScreenTypeAndroid.GOOGLE_RENDERED -> OpenIapBillingChoiceScreenType.GoogleRendered + } + } + private fun mapDeveloperBillingType(type: DeveloperBillingTypeAndroid?): OpenIapDeveloperBillingType? { return when (type) { null, DeveloperBillingTypeAndroid.DEVELOPER_BILLING_TYPE_UNSPECIFIED -> null @@ -1872,6 +1910,37 @@ class HybridRnIap : HybridRnIapSpec() { } } + private fun mapSubResponseCode( + code: OpenIapSubResponseCodeAndroid? + ): SubResponseCodeAndroid? = when (code) { + null -> null + OpenIapSubResponseCodeAndroid.NoApplicableSubResponseCode -> + SubResponseCodeAndroid.NO_APPLICABLE_SUB_RESPONSE_CODE + OpenIapSubResponseCodeAndroid.PaymentDeclinedDueToInsufficientFunds -> + SubResponseCodeAndroid.PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS + OpenIapSubResponseCodeAndroid.UserIneligible -> + SubResponseCodeAndroid.USER_INELIGIBLE + } + + private fun mapDeveloperBillingOption( + option: DeveloperBillingOptionParamsAndroid + ): OpenIapDeveloperBillingOptionParams { + val launchMode = when (option.launchMode) { + null -> null + DeveloperBillingLaunchModeAndroid.UNSPECIFIED -> OpenIapDeveloperBillingLaunchMode.Unspecified + DeveloperBillingLaunchModeAndroid.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP -> + OpenIapDeveloperBillingLaunchMode.LaunchInExternalBrowserOrApp + DeveloperBillingLaunchModeAndroid.CALLER_WILL_LAUNCH_LINK -> + OpenIapDeveloperBillingLaunchMode.CallerWillLaunchLink + } + return OpenIapDeveloperBillingOptionParams( + billingProgram = mapBillingProgram(option.billingProgram), + externalTransactionToken = option.externalTransactionToken.unwrapString(), + launchMode = launchMode, + linkUri = option.linkUri.unwrapString() + ) + } + private fun mapInAppMessageCategory(category: InAppMessageCategoryAndroid): OpenIapInAppMessageCategory { return when (category) { InAppMessageCategoryAndroid.UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID -> OpenIapInAppMessageCategory.UnknownInAppMessageCategoryId diff --git a/libraries/react-native-iap/example/__tests__/screens/SubscriptionFlow.test.tsx b/libraries/react-native-iap/example/__tests__/screens/SubscriptionFlow.test.tsx index 190ab095c..e609f8dcd 100644 --- a/libraries/react-native-iap/example/__tests__/screens/SubscriptionFlow.test.tsx +++ b/libraries/react-native-iap/example/__tests__/screens/SubscriptionFlow.test.tsx @@ -4,6 +4,15 @@ import SubscriptionFlow from '../../screens/SubscriptionFlow'; import * as RNIap from 'react-native-iap'; import {SUBSCRIPTION_PRODUCT_IDS} from '../../src/utils/constants'; +jest.mock( + '@env', + () => ({ + IAPKIT_API_KEY: 'test-api-key', + IAPKIT_BASE_URL: '', + }), + {virtual: true}, +); + const requestPurchaseMock = RNIap.requestPurchase as jest.Mock; const deepLinkToSubscriptionsMock = RNIap.deepLinkToSubscriptions as jest.Mock; @@ -33,7 +42,7 @@ describe('SubscriptionFlow Screen', () => { const getActiveSubscriptions = jest.fn(() => Promise.resolve([])); const finishTransaction = jest.fn(() => Promise.resolve()); const verifyPurchase = jest.fn(() => Promise.resolve({})); - const verifyPurchaseWithProvider = jest.fn(() => + const verifyPurchaseWithProvider = jest.fn((_request: unknown) => Promise.resolve({ iapkit: { isValid: true, @@ -190,6 +199,35 @@ describe('SubscriptionFlow Screen', () => { ); }); + it('re-verifies the Android IAPKit snapshot after finishing', async () => { + Platform.OS = 'android'; + const {finishTransaction, verifyPurchaseWithProvider} = mockIapState(); + + render(); + + await act(async () => { + await onPurchaseSuccess?.({ + id: 'transaction-android-1', + platform: 'android', + productId: 'dev.hyo.martie.premium', + purchaseToken: 'android-token', + transactionDate: Date.now(), + }); + }); + + expect(finishTransaction).toHaveBeenCalledTimes(1); + expect(verifyPurchaseWithProvider).toHaveBeenCalledTimes(2); + expect(verifyPurchaseWithProvider.mock.calls[1]?.[0]).toEqual( + verifyPurchaseWithProvider.mock.calls[0]?.[0], + ); + expect(verifyPurchaseWithProvider.mock.invocationCallOrder[0]).toBeLessThan( + finishTransaction.mock.invocationCallOrder[0]!, + ); + expect(finishTransaction.mock.invocationCallOrder[0]).toBeLessThan( + verifyPurchaseWithProvider.mock.invocationCallOrder[1]!, + ); + }); + it('shows error message on purchase error callback', async () => { const {getByText} = render(); diff --git a/libraries/react-native-iap/example/android/app/src/main/AndroidManifest.xml b/libraries/react-native-iap/example/android/app/src/main/AndroidManifest.xml index 491f51db2..28994e41b 100644 --- a/libraries/react-native-iap/example/android/app/src/main/AndroidManifest.xml +++ b/libraries/react-native-iap/example/android/app/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ { if (Platform.OS !== 'android' || isVega) return; const subscription = developerProvidedBillingListenerAndroid( (details: DeveloperProvidedBillingDetailsAndroid) => { + const externalTransactionToken = + details.externalTransactionToken ?? null; console.log( '[Android] User selected developer billing (External Payments)', ); console.log( '[Android] External transaction token available:', - Boolean(details.externalTransactionToken), + Boolean(externalTransactionToken), ); - setExternalPaymentsToken(details.externalTransactionToken); + setExternalPaymentsToken(externalTransactionToken); setIsProcessing(false); setPurchaseResult( - `✅ User selected Developer Billing (External Payments)\n\nToken: ${details.externalTransactionToken}\n\n⚠️ Important:\n1. Process payment through your external system\n2. Report token to Google Play within 24 hours`, + externalTransactionToken + ? `✅ User selected Developer Billing (External Payments)\n\nToken received.\n\n⚠️ Important:\n1. Process payment through your external system\n2. Report the token to Google Play within 24 hours` + : `✅ User selected Developer Billing (External Payments)\n\nNo external transaction token was returned for this flow.`, ); Alert.alert( diff --git a/libraries/react-native-iap/example/screens/SubscriptionFlow.tsx b/libraries/react-native-iap/example/screens/SubscriptionFlow.tsx index 64c14d731..e67ecccf6 100644 --- a/libraries/react-native-iap/example/screens/SubscriptionFlow.tsx +++ b/libraries/react-native-iap/example/screens/SubscriptionFlow.tsx @@ -412,8 +412,7 @@ function SubscriptionFlow({ // For Android, get purchase token from activeSubscriptions const extendedSub = currentSub as - | ExtendedActiveSubscription - | undefined; + ExtendedActiveSubscription | undefined; const purchaseToken = extendedSub?.purchaseToken || extendedSub?.purchaseTokenAndroid; @@ -1107,7 +1106,8 @@ function SubscriptionFlow({ {new Date( - sub.renewalInfoIOS.gracePeriodExpirationDate, + sub.renewalInfoIOS + .gracePeriodExpirationDate, ).toLocaleDateString()} @@ -1770,6 +1770,7 @@ function SubscriptionFlowContainer() { // - iOS: App Store Server API + App Store Server Notifications V2 // - Android: Google Play Developer API + RTDN const currentVerificationMethod = verificationMethodRef.current; + let iapkitVerifyRequest: VerifyPurchaseWithProviderProps | null = null; console.log('[SubscriptionFlow] About to verify purchase:', { verificationMethod: currentVerificationMethod, productId, @@ -1840,6 +1841,7 @@ function SubscriptionFlowContainer() { provider: 'iapkit', iapkit: iapkitPayload, }; + iapkitVerifyRequest = verifyRequest; const iapkitLogPayload = { ...iapkitPayload, apiKey: '***hidden***', @@ -1932,6 +1934,21 @@ function SubscriptionFlowContainer() { purchase, isConsumable, }); + if (Platform.OS === 'android' && iapkitVerifyRequest) { + try { + const refreshedResult = + await verifyPurchaseWithProvider(iapkitVerifyRequest); + console.log( + '[SubscriptionFlow] IAPKit state after delayed finishTransaction:', + refreshedResult, + ); + } catch (error) { + console.log( + '[SubscriptionFlow] IAPKit post-finish verification failed:', + getErrorMessage(error), + ); + } + } if (mountedRef.current) { setPurchaseResult( `Subscription activated and finished successfully.\n` + @@ -2016,6 +2033,21 @@ function SubscriptionFlowContainer() { } if (didFinishTransaction) { + if (Platform.OS === 'android' && iapkitVerifyRequest) { + try { + const refreshedResult = + await verifyPurchaseWithProvider(iapkitVerifyRequest); + console.log( + '[SubscriptionFlow] IAPKit state after finishTransaction:', + refreshedResult, + ); + } catch (error) { + console.log( + '[SubscriptionFlow] IAPKit post-finish verification failed:', + getErrorMessage(error), + ); + } + } showNativeAlert('Success', 'Purchase completed successfully!'); } }, diff --git a/libraries/react-native-iap/src/__tests__/hooks/useIAP.android.test.ts b/libraries/react-native-iap/src/__tests__/hooks/useIAP.android.test.ts index e7f6dad45..abd299bdb 100644 --- a/libraries/react-native-iap/src/__tests__/hooks/useIAP.android.test.ts +++ b/libraries/react-native-iap/src/__tests__/hooks/useIAP.android.test.ts @@ -34,6 +34,7 @@ jest.mock('react-native', () => ({ // Import after mocks import * as IAP from '../../index'; import {useIAP} from '../../hooks/useIAP'; +import type {DeveloperProvidedBillingDetailsAndroid} from '../../types'; describe('hooks/useIAP Android', () => { afterEach(() => { @@ -81,6 +82,28 @@ describe('hooks/useIAP Android', () => { }); }); + it('passes the Billing Choice renderer to initConnection on Android', async () => { + let api: any; + const Harness = () => { + api = useIAP({ + enableBillingProgramAndroid: 'billing-choice', + billingChoiceScreenTypeAndroid: 'developer-rendered', + }); + return null; + }; + + await act(async () => { + TestRenderer.create(React.createElement(Harness)); + }); + await act(async () => {}); + + expect(api.connected).toBe(true); + expect(IAP.initConnection).toHaveBeenCalledWith({ + enableBillingProgramAndroid: 'billing-choice', + billingChoiceScreenTypeAndroid: 'developer-rendered', + }); + }); + it('passes alternativeBillingModeAndroid config to initConnection on Android (deprecated)', async () => { let api: any; const Harness = () => { @@ -151,6 +174,65 @@ describe('hooks/useIAP Android', () => { expect(mockUserChoiceBillingListener).toHaveBeenCalled(); }); + it('forwards developer-provided Billing Choice events from the hook', async () => { + let listener: + | Parameters[0] + | undefined; + jest + .spyOn(IAP, 'developerProvidedBillingListenerAndroid') + .mockImplementation((callback) => { + listener = callback; + return {remove: jest.fn()}; + }); + + const onDeveloperProvidedBillingAndroid = jest.fn(); + const Harness = () => { + useIAP({onDeveloperProvidedBillingAndroid}); + return null; + }; + + await act(async () => { + TestRenderer.create(React.createElement(Harness)); + }); + await act(async () => {}); + + const details: DeveloperProvidedBillingDetailsAndroid = { + externalTransactionToken: 'external-token', + products: [{id: 'premium', type: 'in-app'}], + }; + listener?.(details); + + expect(onDeveloperProvidedBillingAndroid).toHaveBeenCalledWith(details); + }); + + it('exposes all Billing Choice APIs through the hook', async () => { + let api: any; + const Harness = () => { + api = useIAP(); + return null; + }; + + await act(async () => { + TestRenderer.create(React.createElement(Harness)); + }); + await act(async () => {}); + + expect(api.getBillingChoiceInfoAndroid).toBe( + IAP.getBillingChoiceInfoAndroid, + ); + expect(api.isBillingProgramAvailableAndroid).toBe( + IAP.isBillingProgramAvailableAndroid, + ); + expect(api.createBillingProgramReportingDetailsAndroid).toBe( + IAP.createBillingProgramReportingDetailsAndroid, + ); + expect(api.launchExternalLinkAndroid).toBe(IAP.launchExternalLinkAndroid); + expect(api.showBillingProgramInformationDialogAndroid).toBe( + IAP.showBillingProgramInformationDialogAndroid, + ); + expect(api.showInAppMessagesAndroid).toBe(IAP.showInAppMessagesAndroid); + }); + it('reconnect uses Android billing config', async () => { let api: any; const Harness = () => { diff --git a/libraries/react-native-iap/src/__tests__/index.test.ts b/libraries/react-native-iap/src/__tests__/index.test.ts index f321d1ffe..aca063dc3 100644 --- a/libraries/react-native-iap/src/__tests__/index.test.ts +++ b/libraries/react-native-iap/src/__tests__/index.test.ts @@ -68,6 +68,7 @@ const mockIap: any = { showBillingProgramInformationDialogAndroid: jest.fn(async () => ({ responseCode: 0, debugMessage: null, + subResponseCode: 'no-applicable-sub-response-code', })), showInAppMessagesAndroid: jest.fn(async () => ({ responseCode: 'no-action-needed', @@ -413,6 +414,18 @@ describe('Public API (src/index.ts)', () => { expect(mockIap.endConnection).toHaveBeenCalled(); }); + it('passes developer-rendered Billing Choice config to native', async () => { + (Platform as any).OS = 'android'; + const config = { + billingChoiceScreenTypeAndroid: 'developer-rendered', + enableBillingProgramAndroid: 'billing-choice', + } as const; + + await IAP.initConnection(config); + + expect(mockIap.initConnection).toHaveBeenCalledWith(config); + }); + it('listeners work after endConnection → initConnection reconnection', async () => { // 1. Initial connection + listener await IAP.initConnection(); @@ -760,6 +773,56 @@ describe('Public API (src/index.ts)', () => { ).toBeUndefined(); }); + it('Android forwards minimal in-app Billing Choice options', async () => { + (Platform as any).OS = 'android'; + await IAP.requestPurchase({ + request: { + google: { + skus: ['premium'], + developerBillingOption: { + billingProgram: 'billing-choice', + }, + }, + }, + type: 'in-app', + }); + + const [lastCallArgs] = mockIap.requestPurchase.mock.lastCall; + expect(lastCallArgs.android.developerBillingOption).toEqual({ + billingProgram: 'billing-choice', + }); + }); + + it('Android forwards Billing Choice subscription replacement fields', async () => { + (Platform as any).OS = 'android'; + await IAP.requestPurchase({ + request: { + google: { + skus: ['premium_monthly'], + originalExternalTransactionId: 'original-external-id', + developerBillingOption: { + billingProgram: 'billing-choice', + externalTransactionToken: 'pre-generated-token', + launchMode: 'caller-will-launch-link', + linkUri: 'https://example.com/checkout', + }, + }, + }, + type: 'subs', + }); + + const [lastCallArgs] = mockIap.requestPurchase.mock.lastCall; + expect(lastCallArgs.android.originalExternalTransactionId).toBe( + 'original-external-id', + ); + expect(lastCallArgs.android.developerBillingOption).toEqual({ + billingProgram: 'billing-choice', + externalTransactionToken: 'pre-generated-token', + launchMode: 'caller-will-launch-link', + linkUri: 'https://example.com/checkout', + }); + }); + it('Android subs supports all replacement modes', async () => { (Platform as any).OS = 'android'; const replacementModes = [ @@ -2305,6 +2368,9 @@ describe('Public API (src/index.ts)', () => { externalTransactionToken: 'choice-token-123', }); expect(result.responseCode).toBe(0); + expect(result.subResponseCode).toBe( + 'no-applicable-sub-response-code', + ); }); it('should throw on non-Android', async () => { @@ -2365,6 +2431,19 @@ describe('Public API (src/index.ts)', () => { expect(result).toBe(true); }); + it('forwards Billing Choice external transaction token', async () => { + (Platform as any).OS = 'android'; + const params = { + ...defaultParams, + billingProgram: 'billing-choice' as const, + externalTransactionToken: 'external-token', + }; + + await IAP.launchExternalLinkAndroid(params); + + expect(mockIap.launchExternalLinkAndroid).toHaveBeenCalledWith(params); + }); + it('should return false when user declines', async () => { (Platform as any).OS = 'android'; mockIap.launchExternalLinkAndroid.mockResolvedValueOnce(false); diff --git a/libraries/react-native-iap/src/__tests__/vega-adapter.test.ts b/libraries/react-native-iap/src/__tests__/vega-adapter.test.ts index 59637e05b..71f6546a0 100644 --- a/libraries/react-native-iap/src/__tests__/vega-adapter.test.ts +++ b/libraries/react-native-iap/src/__tests__/vega-adapter.test.ts @@ -233,8 +233,7 @@ describe('Amazon Vega adapter', () => { const result = module.finishTransaction({ android: {purchaseToken: 'receipt-1', isConsumable: true}, }); - await Promise.resolve(); - jest.advanceTimersByTime(1_000); + await jest.advanceTimersByTimeAsync(1_000); await expect(result).resolves.toEqual( expect.objectContaining({ @@ -252,6 +251,30 @@ describe('Amazon Vega adapter', () => { } }); + it('times out Amazon Vega fulfillment without duplicating the request', async () => { + jest.useFakeTimers(); + const service = createService(); + service.notifyFulfillment.mockImplementationOnce( + () => new Promise(() => {}), + ); + const module = createVegaIapModule(service); + + try { + const result = module.finishTransaction({ + android: {purchaseToken: 'receipt-1', isConsumable: true}, + }); + const expectation = expect(result).rejects.toMatchObject({ + code: 'service-timeout', + }); + await jest.advanceTimersByTimeAsync(2_000); + + await expectation; + expect(service.notifyFulfillment).toHaveBeenCalledTimes(1); + } finally { + jest.useRealTimers(); + } + }); + it('recovers fulfillable receipts after Amazon Vega purchase failures', async () => { const service = createService(); service.purchase.mockResolvedValueOnce({ diff --git a/libraries/react-native-iap/src/hooks/useIAP.ts b/libraries/react-native-iap/src/hooks/useIAP.ts index e80234b05..965b5d376 100644 --- a/libraries/react-native-iap/src/hooks/useIAP.ts +++ b/libraries/react-native-iap/src/hooks/useIAP.ts @@ -24,7 +24,14 @@ import { checkAlternativeBillingAvailabilityAndroid, showAlternativeBillingDialogAndroid, createAlternativeBillingTokenAndroid, + getBillingChoiceInfoAndroid, + isBillingProgramAvailableAndroid, + createBillingProgramReportingDetailsAndroid, + launchExternalLinkAndroid, + showBillingProgramInformationDialogAndroid, + showInAppMessagesAndroid, userChoiceBillingListenerAndroid, + developerProvidedBillingListenerAndroid, subscriptionBillingIssueListener, isStandardIOS, } from '../'; @@ -35,7 +42,9 @@ import type { ProductQueryType, RequestPurchaseProps, AlternativeBillingModeAndroid, + BillingChoiceScreenTypeAndroid, BillingProgramAndroid, + DeveloperProvidedBillingDetailsAndroid, UserChoiceBillingDetails, VerifyPurchaseProps, VerifyPurchaseResult, @@ -50,6 +59,8 @@ import type { PurchaseError, PurchaseUpdatedListenerOptions, ProductSubscription, + MutationField, + QueryField, } from '../types'; import type {MutationFinishTransactionArgs} from '../types'; @@ -265,6 +276,18 @@ type UseIap = { createAlternativeBillingTokenAndroid?: ( sku?: string, ) => Promise; + /** Fetch assets and loyalty text for a developer-rendered Billing Choice screen. */ + getBillingChoiceInfoAndroid?: QueryField<'getBillingChoiceInfoAndroid'>; + /** Check Billing Program availability and the configured choice renderer. */ + isBillingProgramAvailableAndroid?: MutationField<'isBillingProgramAvailableAndroid'>; + /** Create Google Play reporting details for a developer billing transaction. */ + createBillingProgramReportingDetailsAndroid?: MutationField<'createBillingProgramReportingDetailsAndroid'>; + /** Launch a supported Billing Program external link. */ + launchExternalLinkAndroid?: MutationField<'launchExternalLinkAndroid'>; + /** Show the required Billing Choice information dialog. */ + showBillingProgramInformationDialogAndroid?: MutationField<'showBillingProgramInformationDialogAndroid'>; + /** Show Play billing in-app messages. */ + showInAppMessagesAndroid?: MutationField<'showInAppMessagesAndroid'>; }; export interface UseIapOptions { @@ -280,6 +303,13 @@ export interface UseIapOptions { onError?: (error: Error) => void; onPromotedProductIOS?: (product: Product) => void; onUserChoiceBillingAndroid?: (details: UserChoiceBillingDetails) => void; + /** + * Fires when the user selects developer-provided billing in an External + * Payments or Google-rendered Billing Choice flow. + */ + onDeveloperProvidedBillingAndroid?: ( + details: DeveloperProvidedBillingDetailsAndroid, + ) => void; /** * Fires when an active subscription enters a billing-issue state * (StoreKit 2 Message.billingIssue on iOS 18+, Purchase.isSuspended on @@ -301,8 +331,14 @@ export interface UseIapOptions { * Use 'user-choice-billing' for User Choice Billing (7.0+). * Use 'external-offer' for External Offer program. * Use 'external-payments' for Developer Provided Billing (Japan only, 8.3.0+). + * Use 'billing-choice' for Billing Choice (9.1.0+). */ enableBillingProgramAndroid?: BillingProgramAndroid; + /** + * Select who renders the Billing Choice screen (9.1.0+). Must match the + * choiceScreenType returned by isBillingProgramAvailableAndroid. + */ + billingChoiceScreenTypeAndroid?: BillingChoiceScreenTypeAndroid; } /** @@ -356,6 +392,7 @@ export function useIAP(options?: UseIapOptions): UseIap { purchaseError?: EventSubscription; promotedProductIOS?: EventSubscription; userChoiceBillingAndroid?: EventSubscription; + developerProvidedBillingAndroid?: EventSubscription; subscriptionBillingIssue?: EventSubscription; }>({}); @@ -565,6 +602,7 @@ export function useIAP(options?: UseIapOptions): UseIap { | { enableBillingProgramAndroid?: BillingProgramAndroid; alternativeBillingModeAndroid?: AlternativeBillingModeAndroid; + billingChoiceScreenTypeAndroid?: BillingChoiceScreenTypeAndroid; } | undefined; @@ -573,6 +611,12 @@ export function useIAP(options?: UseIapOptions): UseIap { config = { enableBillingProgramAndroid: optionsRef.current.enableBillingProgramAndroid, + ...(optionsRef.current.billingChoiceScreenTypeAndroid + ? { + billingChoiceScreenTypeAndroid: + optionsRef.current.billingChoiceScreenTypeAndroid, + } + : {}), }; } else if (optionsRef.current?.alternativeBillingModeAndroid) { config = { @@ -644,6 +688,17 @@ export function useIAP(options?: UseIapOptions): UseIap { }); } + if ( + Platform.OS === 'android' && + optionsRef.current?.onDeveloperProvidedBillingAndroid && + !subscriptionsRef.current.developerProvidedBillingAndroid + ) { + subscriptionsRef.current.developerProvidedBillingAndroid = + developerProvidedBillingListenerAndroid((details) => { + optionsRef.current?.onDeveloperProvidedBillingAndroid?.(details); + }); + } + // Always attach so callers that supply `onSubscriptionBillingIssue` later // (after the hook has already set up listeners) still receive events. if (!subscriptionsRef.current.subscriptionBillingIssue) { @@ -660,11 +715,13 @@ export function useIAP(options?: UseIapOptions): UseIap { subscriptionsRef.current.purchaseError?.remove(); subscriptionsRef.current.promotedProductIOS?.remove(); subscriptionsRef.current.userChoiceBillingAndroid?.remove(); + subscriptionsRef.current.developerProvidedBillingAndroid?.remove(); subscriptionsRef.current.subscriptionBillingIssue?.remove(); subscriptionsRef.current.purchaseUpdate = undefined; subscriptionsRef.current.purchaseError = undefined; subscriptionsRef.current.promotedProductIOS = undefined; subscriptionsRef.current.userChoiceBillingAndroid = undefined; + subscriptionsRef.current.developerProvidedBillingAndroid = undefined; subscriptionsRef.current.subscriptionBillingIssue = undefined; }, []); @@ -763,6 +820,12 @@ export function useIAP(options?: UseIapOptions): UseIap { checkAlternativeBillingAvailabilityAndroid, showAlternativeBillingDialogAndroid, createAlternativeBillingTokenAndroid, + getBillingChoiceInfoAndroid, + isBillingProgramAvailableAndroid, + createBillingProgramReportingDetailsAndroid, + launchExternalLinkAndroid, + showBillingProgramInformationDialogAndroid, + showInAppMessagesAndroid, } : {}), }; diff --git a/libraries/react-native-iap/src/index.ts b/libraries/react-native-iap/src/index.ts index 841c5b8fb..982af0d72 100644 --- a/libraries/react-native-iap/src/index.ts +++ b/libraries/react-native-iap/src/index.ts @@ -626,12 +626,11 @@ export const userChoiceBillingListenerAndroid = ( }; /** - * Add a listener for developer provided billing events (Android 8.3.0+ only). - * Fires when a user selects developer billing in the External Payments flow. + * Add a listener for developer provided billing events (Android 8.3.0+). + * Fires for External Payments and Billing Choice developer billing flows. * - * External Payments is part of Google Play Billing Library 8.3.0+ and allows - * showing a side-by-side choice between Google Play Billing and developer's - * external payment option directly in the purchase flow. (Japan only) + * The payload includes selected products and nullable token, link, and original + * transaction fields. Billing Choice fields require Billing Library 9.1.0+. * * @param listener - Function to call when user chooses developer billing * @returns EventSubscription with remove() method to unsubscribe @@ -641,14 +640,10 @@ export const userChoiceBillingListenerAndroid = ( * @example * ```typescript * const subscription = developerProvidedBillingListenerAndroid((details) => { - * console.log('User chose developer billing'); - * console.log('External transaction token received; send it to your backend without logging it.'); - * - * // Process payment through your external payment system - * await processExternalPayment(); - * - * // Report transaction to Google Play (within 24 hours) - * await reportToGooglePlay(details.externalTransactionToken); + * await processExternalPayment(details.products, details.linkUri); + * if (details.externalTransactionToken) { + * await reportToGooglePlay(details.externalTransactionToken); + * } * }); * * // Later, remove the listener @@ -859,8 +854,7 @@ export const fetchProducts: QueryField<'fetchProducts'> = async (request) => { if (normalizedType === 'all') { const converted = (await fetchAndConvert('all')) as ( - | Product - | ProductSubscription + Product | ProductSubscription )[]; RnIapConsole.debug( @@ -1626,6 +1620,10 @@ export const getTransactionJwsIOS: QueryField<'getTransactionJwsIOS'> = async ( * ```ts * await initConnection(); * await initConnection({ enableBillingProgramAndroid: 'external-offer' }); + * await initConnection({ + * enableBillingProgramAndroid: 'billing-choice', + * billingChoiceScreenTypeAndroid: 'developer-rendered', + * }); * ``` * * @remarks When using `useIAP()`, connection is auto-managed on mount/unmount — @@ -1848,6 +1846,10 @@ export const requestPurchase: MutationField<'requestPurchase'> = async ( if (androidRequest.isOfferPersonalized != null) { androidPayload.isOfferPersonalized = androidRequest.isOfferPersonalized; } + if (androidRequest.developerBillingOption) { + androidPayload.developerBillingOption = + androidRequest.developerBillingOption; + } // One-time purchase offerToken (Android 7.0+) if (!isSubs) { @@ -1862,6 +1864,10 @@ export const requestPurchase: MutationField<'requestPurchase'> = async ( if (subsRequest.purchaseToken) { androidPayload.purchaseToken = subsRequest.purchaseToken; } + if (subsRequest.originalExternalTransactionId) { + androidPayload.originalExternalTransactionId = + subsRequest.originalExternalTransactionId; + } if (subsRequest.replacementMode != null) { androidPayload.replacementMode = subsRequest.replacementMode; } @@ -2401,41 +2407,40 @@ export const presentCodeRedemptionSheetIOS: MutationField< */ export const requestPurchaseOnPromotedProductIOS: MutationField< 'requestPurchaseOnPromotedProductIOS' -> = - async () => { - if (Platform.OS !== 'ios') { - throw new Error( - 'requestPurchaseOnPromotedProductIOS is only available on iOS', - ); - } - - try { - await IAP.instance.buyPromotedProductIOS(); - const pending = await IAP.instance.getPendingTransactionsIOS(); - const latest = pending.find((purchase) => purchase != null); - if (!latest) { - throw new Error('No promoted purchase available after request'); - } +> = async () => { + if (Platform.OS !== 'ios') { + throw new Error( + 'requestPurchaseOnPromotedProductIOS is only available on iOS', + ); + } - const converted = convertNitroPurchaseToPurchase(latest); - if (converted.platform !== 'ios') { - throw new Error('Promoted purchase result not available for iOS'); - } + try { + await IAP.instance.buyPromotedProductIOS(); + const pending = await IAP.instance.getPendingTransactionsIOS(); + const latest = pending.find((purchase) => purchase != null); + if (!latest) { + throw new Error('No promoted purchase available after request'); + } - return true; - } catch (error) { - const parsedError = parseErrorAndLogIfNeeded( - '[requestPurchaseOnPromotedProductIOS] Failed:', - error, - ); - throw createPurchaseError({ - code: parsedError.code, - message: parsedError.message, - responseCode: parsedError.responseCode, - debugMessage: parsedError.debugMessage, - }); + const converted = convertNitroPurchaseToPurchase(latest); + if (converted.platform !== 'ios') { + throw new Error('Promoted purchase result not available for iOS'); } - }; + + return true; + } catch (error) { + const parsedError = parseErrorAndLogIfNeeded( + '[requestPurchaseOnPromotedProductIOS] Failed:', + error, + ); + throw createPurchaseError({ + code: parsedError.code, + message: parsedError.message, + responseCode: parsedError.responseCode, + debugMessage: parsedError.debugMessage, + }); + } +}; /** * Clear unfinished transactions on iOS @@ -2994,9 +2999,7 @@ export const getBillingChoiceInfoAndroid: QueryField< * * @see {@link https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android} */ -export const createBillingProgramReportingDetailsAndroid: MutationField< - 'createBillingProgramReportingDetailsAndroid' -> & +export const createBillingProgramReportingDetailsAndroid: MutationField<'createBillingProgramReportingDetailsAndroid'> & (( program: BillingProgramAndroid, developerBillingType?: DeveloperBillingTypeAndroid | null, @@ -3038,7 +3041,8 @@ export const createBillingProgramReportingDetailsAndroid: MutationField< }; /** - * Show Google's information dialog for a Billing Choice external transaction (Android only). + * Show Google's mandatory information dialog before a developer-rendered, + * in-app Billing Choice screen (Android only). * * @param params - Dialog parameters with the external transaction token * @returns Promise with BillingResult @@ -3096,7 +3100,8 @@ export const showInAppMessagesAndroid: MutationField< }; /** - * Launch external link for external offers or app download (Android only). + * Launch an external link for Billing Programs (Android only). Developer-rendered + * Billing Choice external-link flows require 9.1.0+ and a pre-generated token. * * @param params - Parameters for launching the external link * @returns Promise - true if user accepted, false otherwise @@ -3106,7 +3111,8 @@ export const showInAppMessagesAndroid: MutationField< * @example * ```typescript * const success = await launchExternalLinkAndroid({ - * billingProgram: 'external-offer', + * billingProgram: 'billing-choice', + * externalTransactionToken: reportingDetails.externalTransactionToken, * launchMode: 'launch-in-external-browser-or-app', * linkType: 'link-to-digital-content-offer', * linkUri: 'https://your-website.com/purchase' @@ -3127,6 +3133,7 @@ export const launchExternalLinkAndroid: MutationField< try { return await IAP.instance.launchExternalLinkAndroid({ billingProgram: params.billingProgram, + externalTransactionToken: params.externalTransactionToken, launchMode: params.launchMode, linkType: params.linkType, linkUri: params.linkUri, @@ -3199,21 +3206,20 @@ export const canPresentExternalPurchaseNoticeIOS: QueryField< */ export const presentExternalPurchaseNoticeSheetIOS: MutationField< 'presentExternalPurchaseNoticeSheetIOS' -> = - async () => { - if (Platform.OS !== 'ios') { - throw new Error('External purchase is only supported on iOS'); - } - try { - return await IAP.instance.presentExternalPurchaseNoticeSheetIOS(); - } catch (error) { - RnIapConsole.error( - 'Failed to present external purchase notice sheet:', - error, - ); - throw error; - } - }; +> = async () => { + if (Platform.OS !== 'ios') { + throw new Error('External purchase is only supported on iOS'); + } + try { + return await IAP.instance.presentExternalPurchaseNoticeSheetIOS(); + } catch (error) { + RnIapConsole.error( + 'Failed to present external purchase notice sheet:', + error, + ); + throw error; + } +}; /** * Present an external purchase link to redirect users to your website (iOS 16.0+). @@ -3270,21 +3276,20 @@ export const presentExternalPurchaseLinkIOS: MutationField< */ export const isEligibleForExternalPurchaseCustomLinkIOS: QueryField< 'isEligibleForExternalPurchaseCustomLinkIOS' -> = - async () => { - if (Platform.OS !== 'ios') { - return false; - } - try { - return await IAP.instance.isEligibleForExternalPurchaseCustomLinkIOS(); - } catch (error) { - RnIapConsole.error( - 'Failed to check external purchase custom link eligibility:', - error, - ); - return false; - } - }; +> = async () => { + if (Platform.OS !== 'ios') { + return false; + } + try { + return await IAP.instance.isEligibleForExternalPurchaseCustomLinkIOS(); + } catch (error) { + RnIapConsole.error( + 'Failed to check external purchase custom link eligibility:', + error, + ); + return false; + } +}; /** * Get external purchase token for reporting to Apple (iOS 18.1+). diff --git a/libraries/react-native-iap/src/specs/RnIap.nitro.ts b/libraries/react-native-iap/src/specs/RnIap.nitro.ts index 678c7eda2..79e9cf180 100644 --- a/libraries/react-native-iap/src/specs/RnIap.nitro.ts +++ b/libraries/react-native-iap/src/specs/RnIap.nitro.ts @@ -35,6 +35,7 @@ import type { ExternalPurchaseCustomLinkTokenTypeIOS, ExternalPurchaseLinkResultIOS, ExternalPurchaseNoticeResultIOS, + DeveloperBillingOptionParamsAndroid, DeveloperProvidedBillingDetailsAndroid, MutationFinishTransactionArgs, ProductCommon, @@ -53,6 +54,7 @@ import type { UserChoiceBillingDetails, PaymentModeIOS, SubscriptionProductReplacementParamsAndroid, + SubResponseCodeAndroid, WinBackOfferInputIOS, } from '../types'; @@ -243,6 +245,10 @@ export interface NitroRequestPurchaseAndroid { /** @deprecated Use subscriptionProductReplacementParams instead for item-level replacement (8.1.0+) */ replacementMode?: RequestSubscriptionAndroidProps['replacementMode']; purchaseToken?: RequestSubscriptionAndroidProps['purchaseToken']; + /** Original external transaction ID for developer-billed subscription replacement (9.1.0+). */ + originalExternalTransactionId?: RequestSubscriptionAndroidProps['originalExternalTransactionId']; + /** Developer billing option for External Payments (8.3.0+) or Billing Choice (9.1.0+). */ + developerBillingOption?: DeveloperBillingOptionParamsAndroid | null; /** * Product-level replacement parameters (8.1.0+) * Use this instead of replacementMode for item-level replacement @@ -323,8 +329,10 @@ export interface NitroDeepLinkOptionsAndroid { * Parameters for launching an external link (Android 8.2.0+) */ export interface NitroLaunchExternalLinkParamsAndroid { - /** The billing program (external-content-link or external-offer) */ + /** The billing program (external-content-link, external-offer, or billing-choice) */ billingProgram: BillingProgramAndroid; + /** Reporting token for a developer-rendered Billing Choice external-link flow (9.1.0+). */ + externalTransactionToken?: string | null; /** The external link launch mode */ launchMode: ExternalLinkLaunchModeAndroid; /** The type of the external link */ @@ -387,6 +395,7 @@ export interface NitroPurchaseResult { export interface NitroBillingResultAndroid { responseCode: number; debugMessage?: string | null; + subResponseCode?: SubResponseCodeAndroid | null; } export interface NitroBillingChoiceInfoAndroid { @@ -1149,12 +1158,11 @@ export interface RnIap extends HybridObject<{ios: 'swift'; android: 'kotlin'}> { ): void; /** - * Add a listener for developer provided billing events (Android 8.3.0+ only). - * Fires when a user selects developer billing in the External Payments flow. + * Add a listener for developer provided billing events (Android 8.3.0+). + * Fires for External Payments and Billing Choice developer billing flows. * - * External Payments is part of Google Play Billing Library 8.3.0+ and allows - * showing a side-by-side choice between Google Play Billing and developer's - * external payment option directly in the purchase flow. (Japan only) + * Billing Choice expands the payload with nullable link/original transaction + * fields and selected products in Billing Library 9.1.0+. * * @param listener - Function to call when user chooses developer billing * @platform Android diff --git a/libraries/react-native-iap/src/types.ts b/libraries/react-native-iap/src/types.ts index 8e553b2a7..e36ce758d 100644 --- a/libraries/react-native-iap/src/types.ts +++ b/libraries/react-native-iap/src/types.ts @@ -26,6 +26,7 @@ export interface ActiveSubscription { * pending upgrades/downgrades, and auto-renewal preferences. */ renewalInfoIOS?: (RenewalInfoIOS | null); + /** Unix timestamp in milliseconds since January 1, 1970 UTC. */ transactionDate: number; transactionId: string; /** @@ -119,13 +120,13 @@ export interface AppTransaction { /** * Play Billing choice image layout (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export type BillingChoiceImageLayoutAndroid = 'rectangular-four-by-one' | 'rectangular-three-by-one' | 'rectangular-two-by-two'; /** * Display information for developer-rendered Billing Choice screens (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export interface BillingChoiceInfoAndroid { /** URL for the Play Billing choice image matching the requested layout. */ @@ -136,14 +137,15 @@ export interface BillingChoiceInfoAndroid { /** * Choice screen renderer for Billing Choice availability (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export type BillingChoiceScreenTypeAndroid = 'unspecified' | 'developer-rendered' | 'google-rendered'; /** * Billing program types for Google Play Billing Programs (Android) * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, - * BILLING_CHOICE added in 9.1.0. + * BILLING_CHOICE added in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ export type BillingProgramAndroid = 'unspecified' | 'user-choice-billing' | 'external-content-link' | 'external-offer' | 'external-payments' | 'billing-choice'; @@ -154,20 +156,24 @@ export type BillingProgramAndroid = 'unspecified' | 'user-choice-billing' | 'ext export interface BillingProgramAvailabilityResultAndroid { /** The billing program that was checked */ billingProgram: BillingProgramAndroid; - /** Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. */ + /** + * Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. + */ choiceScreenType?: (BillingChoiceScreenTypeAndroid | null); /** Whether the billing program is available for the user */ isAvailable: boolean; /** * Whether external-link payment is available for Billing Choice. * Populated only for available BILLING_CHOICE results. + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. */ isExternalLinkAvailable?: (boolean | null); } /** * Parameters for showing a billing program information dialog (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export interface BillingProgramInformationDialogParamsAndroid { /** Billing program. Currently only BILLING_CHOICE is supported. */ @@ -222,22 +228,35 @@ export interface DeepLinkOptions { export type DeveloperBillingLaunchModeAndroid = 'unspecified' | 'launch-in-external-browser-or-app' | 'caller-will-launch-link'; /** - * Parameters for developer billing option in purchase flow (Android) - * Used with BillingFlowParams to enable external payments flow - * Available in Google Play Billing Library 8.3.0+ + * Parameters for a developer billing option in a purchase flow (Android). + * Used with BillingFlowParams for external payments (8.3.0+) and Billing Choice + * (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+). + * Only billingProgram is required; link fields are used when the selected program + * links outside the app. */ export interface DeveloperBillingOptionParamsAndroid { - /** The billing program (should be EXTERNAL_PAYMENTS for external payments flow) */ + /** The billing program. Use EXTERNAL_PAYMENTS or BILLING_CHOICE. */ billingProgram: BillingProgramAndroid; - /** The launch mode for the external payment link */ - launchMode: DeveloperBillingLaunchModeAndroid; - /** The URI where the external payment will be processed */ - linkUri: string; + /** + * A pre-generated external transaction token for a Billing Choice external-link + * flow. Omit it when Google Play should provide the token in the callback. + */ + externalTransactionToken?: (string | null); + /** + * The launch mode for the external payment link. + * Required only when the selected billing program links outside the app. + */ + launchMode?: (DeveloperBillingLaunchModeAndroid | null); + /** + * The URI where the external payment will be processed. + * Required only when the selected billing program links outside the app. + */ + linkUri?: (string | null); } /** * Developer-provided billing destination type for Billing Program reporting details (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export type DeveloperBillingTypeAndroid = 'developer-billing-type-unspecified' | 'in-app' | 'external-link'; @@ -249,10 +268,31 @@ export type DeveloperBillingTypeAndroid = 'developer-billing-type-unspecified' | export interface DeveloperProvidedBillingDetailsAndroid { /** * External transaction token used to report transactions made through developer billing. - * This token must be used when reporting the external transaction to Google Play. - * Must be reported within 24 hours of the transaction. + * Nullable for flows such as external payments where no token is returned. */ - externalTransactionToken: string; + externalTransactionToken?: (string | null); + /** + * URI to launch for an external-link Billing Choice flow, when provided by + * Google Play. + */ + linkUri?: (string | null); + /** + * Original external transaction ID when replacing a subscription that was + * purchased through developer billing. + */ + originalExternalTransactionId?: (string | null); + /** Products selected for the developer billing flow. */ + products: DeveloperProvidedBillingProductAndroid[]; +} + +/** Product selected for developer-provided billing (Android 9.0+). */ +export interface DeveloperProvidedBillingProductAndroid { + /** Product identifier. */ + id: string; + /** Subscription offer token, when applicable. */ + offerToken?: (string | null); + /** Google Play product type (in-app or subscription). */ + type: ProductType; } /** @@ -557,7 +597,7 @@ export type FetchProductsResult = ProductOrSubscription[] | Product[] | ProductS /** * Parameters for fetching Billing Choice display information (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export interface GetBillingChoiceInfoParamsAndroid { /** Billing program. Currently only BILLING_CHOICE is supported. */ @@ -579,13 +619,15 @@ export type IapkitPurchaseState = 'entitled' | 'pending-acknowledgment' | 'pendi /** * High-level in-app message category (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ export type InAppMessageCategoryAndroid = 'unknown-in-app-message-category-id' | 'transactional'; /** * Parameters for showing Play billing in-app messages (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ export interface InAppMessageParamsAndroid { /** In-app message categories to show. Defaults to transactional messages. */ @@ -594,13 +636,15 @@ export interface InAppMessageParamsAndroid { /** * Response code from Play billing in-app messages (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ export type InAppMessageResponseCodeAndroid = 'no-action-needed' | 'subscription-status-updated'; /** * Result from showing Play billing in-app messages (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ export interface InAppMessageResultAndroid { /** Purchase token returned when a subscription status changed. */ @@ -618,6 +662,16 @@ export interface InitConnectionConfig { * Use USER_CHOICE_BILLING for user choice billing, EXTERNAL_OFFER for alternative only. */ alternativeBillingModeAndroid?: (AlternativeBillingModeAndroid | null); + /** + * Billing Choice renderer configured in Play Console. Available in OpenIAP + * Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). + * GOOGLE_RENDERED registers the developer-provided billing listener so OpenIAP + * can emit the selection event. DEVELOPER_RENDERED omits that listener so the + * app can render its own choice screen and use the reporting/dialog/link APIs. + * Must match choiceScreenType returned by isBillingProgramAvailableAndroid. + * Defaults to GOOGLE_RENDERED. + */ + billingChoiceScreenTypeAndroid?: (BillingChoiceScreenTypeAndroid | null); /** * Enable a specific billing program for Android (7.0+) * When set, enables the specified billing program for external transactions. @@ -625,6 +679,8 @@ export interface InitConnectionConfig { * - EXTERNAL_CONTENT_LINK: Link to external content (8.2.0+) * - EXTERNAL_OFFER: External offers for digital content (8.2.0+) * - EXTERNAL_PAYMENTS: Developer provided billing, Japan only (8.3.0+) + * - BILLING_CHOICE: Google-rendered or developer-rendered billing choice + * (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+) */ enableBillingProgramAndroid?: (BillingProgramAndroid | null); } @@ -652,12 +708,19 @@ export interface InstallmentPlanDetailsAndroid { /** * Parameters for launching an external link (Android) - * Used with launchExternalLink to initiate external offer or app install flows + * Used with launchExternalLink to initiate external offer, app install, or + * developer-rendered Billing Choice flows * Available in Google Play Billing Library 8.2.0+ */ export interface LaunchExternalLinkParamsAndroid { - /** The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) */ + /** The billing program (EXTERNAL_CONTENT_LINK, EXTERNAL_OFFER, or BILLING_CHOICE) */ billingProgram: BillingProgramAndroid; + /** + * External transaction token for a developer-rendered Billing Choice external-link + * flow. Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). Generate it with createBillingProgramReportingDetailsAndroid. + */ + externalTransactionToken?: (string | null); /** The external link launch mode */ launchMode: ExternalLinkLaunchModeAndroid; /** The type of the external link */ @@ -720,6 +783,8 @@ export interface Mutation { * Returns external transaction token needed for reporting external transactions. * developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, * native Android defaults it to IN_APP. + * The Billing Choice extension is available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ @@ -754,7 +819,10 @@ export interface Mutation { */ isBillingProgramAvailableAndroid: Promise; /** - * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). + * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+), + * including developer-rendered Billing Choice external-link flows. + * Billing Choice availability: OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). * Replaces the deprecated showExternalOfferInformationDialog API. * Shows Play Store dialog and optionally launches external URL. * Throws OpenIapError.NotPrepared if billing client not ready. @@ -807,8 +875,9 @@ export interface Mutation { */ showAlternativeBillingDialogAndroid: Promise; /** - * Show Google's information dialog for a Billing Choice external transaction. - * Available in Google Play Billing Library 9.1.0+. + * Show Google's mandatory information dialog before a developer-rendered, + * in-app Billing Choice screen. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android */ @@ -822,7 +891,8 @@ export interface Mutation { showExternalPurchaseCustomLinkNoticeIOS: Promise; /** * Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. - * Available in Google Play Billing Library 4.1.0+. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). * Returns a response code and, when the subscription status changes, the related purchase token. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-in-app-messages-android @@ -1309,6 +1379,7 @@ export interface PurchaseAndroid extends PurchaseCommon { signatureAndroid?: (string | null); /** Store where purchase was made */ store: IapStore; + /** Unix timestamp in milliseconds since January 1, 1970 UTC. */ transactionDate: number; transactionId?: (string | null); } @@ -1333,6 +1404,7 @@ export interface PurchaseCommon { quantity: number; /** Store where purchase was made */ store: IapStore; + /** Unix timestamp in milliseconds since January 1, 1970 UTC. */ transactionDate: number; } @@ -1390,6 +1462,7 @@ export interface PurchaseIOS extends PurchaseCommon { store: IapStore; storefrontCountryCodeIOS?: (string | null); subscriptionGroupIdIOS?: (string | null); + /** Unix timestamp in milliseconds since January 1, 1970 UTC. */ transactionDate: number; transactionId: string; transactionReasonIOS?: (string | null); @@ -1473,7 +1546,7 @@ export interface Query { getAvailablePurchases: Promise; /** * Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. - * Available in Google Play Billing Library 9.1.0+. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client is not ready. * See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android */ @@ -1667,9 +1740,9 @@ export interface RentalDetailsAndroid { export interface RequestPurchaseAndroidProps { /** - * Developer billing option parameters for external payments flow (8.3.0+). - * When provided, the purchase flow will show a side-by-side choice between - * Google Play Billing and the developer's external payment option. + * Developer billing option parameters for external payments and Billing Choice. + * Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ developerBillingOption?: (DeveloperBillingOptionParamsAndroid | null); /** @@ -1754,9 +1827,9 @@ export type RequestPurchaseResult = Purchase | Purchase[] | null; export interface RequestSubscriptionAndroidProps { /** - * Developer billing option parameters for external payments flow (8.3.0+). - * When provided, the purchase flow will show a side-by-side choice between - * Google Play Billing and the developer's external payment option. + * Developer billing option parameters for external payments and Billing Choice. + * Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ developerBillingOption?: (DeveloperBillingOptionParamsAndroid | null); /** @@ -1768,6 +1841,12 @@ export interface RequestSubscriptionAndroidProps { obfuscatedAccountId?: (string | null); /** Obfuscated profile ID */ obfuscatedProfileId?: (string | null); + /** + * Original external transaction ID for replacing a subscription that was + * purchased through developer billing. Available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). + */ + originalExternalTransactionId?: (string | null); /** Purchase token for upgrades/downgrades */ purchaseToken?: (string | null); /** @@ -1903,11 +1982,11 @@ export type SubResponseCodeAndroid = 'no-applicable-sub-response-code' | 'paymen export interface Subscription { /** - * Fires when a user selects developer billing in the External Payments flow (Android only) - * Triggered when the user chooses to pay via the developer's external payment option - * instead of Google Play Billing in the side-by-side choice dialog. - * Contains the externalTransactionToken needed to report the transaction. - * Available in Google Play Billing Library 8.3.0+ + * Fires when a user selects developer billing in an External Payments or + * Billing Choice flow (Android only). The payload can contain an external + * transaction token, link URI, original transaction ID, and selected products. + * Billing Choice payload fields are available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ developerProvidedBillingAndroid: DeveloperProvidedBillingDetailsAndroid; /** Fires when the App Store surfaces a promoted product (iOS only) */ diff --git a/libraries/react-native-iap/src/vega-adapter.ts b/libraries/react-native-iap/src/vega-adapter.ts index 9a6d2c83e..3ca42bcff 100644 --- a/libraries/react-native-iap/src/vega-adapter.ts +++ b/libraries/react-native-iap/src/vega-adapter.ts @@ -21,6 +21,7 @@ const IAPKIT_VERIFY_TIMEOUT_MS = 10_000; const MAX_IAPKIT_ERROR_DEPTH = 5; const MAX_PRODUCT_DATA_BATCH_SIZE = 100; const MAX_PURCHASE_UPDATE_PAGES = 100; +const NOTIFY_FULFILLMENT_ATTEMPT_TIMEOUT_MS = 2_000; const NOTIFY_FULFILLMENT_MAX_ATTEMPTS = 15; const NOTIFY_FULFILLMENT_RETRY_DELAY_MS = 1_000; const PURCHASE_UPDATES_MAX_ATTEMPTS = 5; @@ -207,6 +208,26 @@ function delay(ms: number): Promise { }); } +function withTimeout( + operation: Promise, + timeoutMs: number, + timeoutError: Error, +): Promise { + return new Promise((resolve, reject) => { + const timeoutId = setTimeout(() => reject(timeoutError), timeoutMs); + operation.then( + (value) => { + clearTimeout(timeoutId); + resolve(value); + }, + (error) => { + clearTimeout(timeoutId); + reject(error); + }, + ); + }); +} + function isSuccess( operation: ResponseOperation, responseCode: unknown, @@ -860,10 +881,17 @@ export function createVegaIapModule(service: VegaPurchasingService): RnIap { attempt <= NOTIFY_FULFILLMENT_MAX_ATTEMPTS; attempt += 1 ) { - const response = await service.notifyFulfillment({ - fulfillmentResult: FULFILLMENT_RESULT_FULFILLED, - receiptId: purchaseToken, - }); + const response = await withTimeout( + service.notifyFulfillment({ + fulfillmentResult: FULFILLMENT_RESULT_FULFILLED, + receiptId: purchaseToken, + }), + NOTIFY_FULFILLMENT_ATTEMPT_TIMEOUT_MS, + createVegaError( + ErrorCode.ServiceTimeout, + 'Amazon Vega notifyFulfillment timed out.', + ), + ); if (isSuccess('notify-fulfillment', response?.responseCode)) { return { responseCode: 0, @@ -872,7 +900,6 @@ export function createVegaIapModule(service: VegaPurchasingService): RnIap { purchaseToken, }; } - lastResponse = response; if (attempt < NOTIFY_FULFILLMENT_MAX_ATTEMPTS) { await delay(NOTIFY_FULFILLMENT_RETRY_DELAY_MS); @@ -909,7 +936,8 @@ export function createVegaIapModule(service: VegaPurchasingService): RnIap { const purchaseTimestamp = toTimestamp(receipt.purchaseDate); if ( options?.minPurchaseDateMs != null && - (purchaseTimestamp === 0 || purchaseTimestamp < options.minPurchaseDateMs) + (purchaseTimestamp === 0 || + purchaseTimestamp < options.minPurchaseDateMs) ) { continue; } @@ -1286,11 +1314,7 @@ export function createVegaIapModule(service: VegaPurchasingService): RnIap { if (!response.receipt) return []; cachedUserData = response.userData ?? cachedUserData; - const purchase = mapReceipt( - response.receipt, - fallbackProductType, - sku, - ); + const purchase = mapReceipt(response.receipt, fallbackProductType, sku); emitPurchaseUpdated(purchase); return [purchase]; } catch (error) { diff --git a/openiap-versions.json b/openiap-versions.json index 5a40ed41c..6217eb621 100644 --- a/openiap-versions.json +++ b/openiap-versions.json @@ -1,5 +1,5 @@ { - "spec": "2.0.3", + "spec": "2.1.0", "google": "2.3.0-rc.1", "apple": "2.2.5-rc.1" } diff --git a/packages/apple/Sources/Models/Types.swift b/packages/apple/Sources/Models/Types.swift index 742657cb0..500c35895 100644 --- a/packages/apple/Sources/Models/Types.swift +++ b/packages/apple/Sources/Models/Types.swift @@ -25,7 +25,7 @@ public enum AlternativeBillingModeAndroid: String, Codable, CaseIterable { } /// Play Billing choice image layout (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public enum BillingChoiceImageLayoutAndroid: String, Codable, CaseIterable { /// Rectangular image with a 4:1 aspect ratio. case rectangularFourByOne = "rectangular-four-by-one" @@ -36,7 +36,7 @@ public enum BillingChoiceImageLayoutAndroid: String, Codable, CaseIterable { } /// Choice screen renderer for Billing Choice availability (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public enum BillingChoiceScreenTypeAndroid: String, Codable, CaseIterable { /// Unspecified choice screen type. case unspecified = "unspecified" @@ -48,7 +48,8 @@ public enum BillingChoiceScreenTypeAndroid: String, Codable, CaseIterable { /// Billing program types for Google Play Billing Programs (Android) /// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, -/// BILLING_CHOICE added in 9.1.0. +/// BILLING_CHOICE added in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (requires Play Billing 9.1.0+). public enum BillingProgramAndroid: String, Codable, CaseIterable { /// Unspecified billing program. Do not use. case unspecified = "unspecified" @@ -71,7 +72,7 @@ public enum BillingProgramAndroid: String, Codable, CaseIterable { case externalPayments = "external-payments" /// Billing Choice program. /// Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. - /// Available in Google Play Billing Library 9.1.0+ + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). case billingChoice = "billing-choice" } @@ -90,7 +91,7 @@ public enum DeveloperBillingLaunchModeAndroid: String, Codable, CaseIterable { } /// Developer-provided billing destination type for Billing Program reporting details (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public enum DeveloperBillingTypeAndroid: String, Codable, CaseIterable { /// Unspecified developer billing type. Do not use. case developerBillingTypeUnspecified = "developer-billing-type-unspecified" @@ -299,8 +300,9 @@ public enum IapEvent: String, Codable, CaseIterable { case purchaseError = "purchase-error" case promotedProductIos = "promoted-product-ios" case userChoiceBillingAndroid = "user-choice-billing-android" - /// Fired when user selects developer-provided billing option in external payments flow. - /// Available on Android with Google Play Billing Library 8.3.0+ + /// Fired for External Payments (8.3.0+) and Google-rendered Billing Choice + /// developer billing selections on Android. Billing Choice is available in + /// OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). case developerProvidedBillingAndroid = "developer-provided-billing-android" /// Fired when an active subscription enters a billing-issue state that requires user attention. /// Cross-platform unification of StoreKit 2 Message.billingIssue (iOS 18+) and @@ -345,7 +347,8 @@ public enum IapStore: String, Codable, CaseIterable { } /// High-level in-app message category (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). public enum InAppMessageCategoryAndroid: String, Codable, CaseIterable { /// Unknown in-app message category. case unknownInAppMessageCategoryId = "unknown-in-app-message-category-id" @@ -354,7 +357,8 @@ public enum InAppMessageCategoryAndroid: String, Codable, CaseIterable { } /// Response code from Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). public enum InAppMessageResponseCodeAndroid: String, Codable, CaseIterable { /// Flow finished and no developer action is needed. case noActionNeeded = "no-action-needed" @@ -629,6 +633,7 @@ public protocol PurchaseCommon: Codable { var quantity: Int { get } /// Store where purchase was made var store: IapStore { get } + /// Unix timestamp in milliseconds since January 1, 1970 UTC. var transactionDate: Double { get } } @@ -653,6 +658,7 @@ public struct ActiveSubscription: Codable { /// Renewal information from StoreKit 2 (iOS only). Contains details about subscription renewal status, /// pending upgrades/downgrades, and auto-renewal preferences. public var renewalInfoIOS: RenewalInfoIOS? = nil + /// Unix timestamp in milliseconds since January 1, 1970 UTC. public var transactionDate: Double public var transactionId: String /// @deprecated iOS only - use daysUntilExpirationIOS instead. @@ -724,7 +730,7 @@ public struct AppTransaction: Codable { } /// Display information for developer-rendered Billing Choice screens (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public struct BillingChoiceInfoAndroid: Codable { /// URL for the Play Billing choice image matching the requested layout. public var playBillingChoiceImageUrl: String @@ -738,11 +744,13 @@ public struct BillingProgramAvailabilityResultAndroid: Codable { /// The billing program that was checked public var billingProgram: BillingProgramAndroid /// Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. public var choiceScreenType: BillingChoiceScreenTypeAndroid? = nil /// Whether the billing program is available for the user public var isAvailable: Bool /// Whether external-link payment is available for Billing Choice. /// Populated only for available BILLING_CHOICE results. + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. public var isExternalLinkAvailable: Bool? = nil } @@ -774,9 +782,26 @@ public struct BillingResultAndroid: Codable { /// Available in Google Play Billing Library 8.3.0+ public struct DeveloperProvidedBillingDetailsAndroid: Codable { /// External transaction token used to report transactions made through developer billing. - /// This token must be used when reporting the external transaction to Google Play. - /// Must be reported within 24 hours of the transaction. - public var externalTransactionToken: String + /// Nullable for flows such as external payments where no token is returned. + public var externalTransactionToken: String? = nil + /// URI to launch for an external-link Billing Choice flow, when provided by + /// Google Play. + public var linkUri: String? = nil + /// Original external transaction ID when replacing a subscription that was + /// purchased through developer billing. + public var originalExternalTransactionId: String? = nil + /// Products selected for the developer billing flow. + public var products: [DeveloperProvidedBillingProductAndroid] +} + +/// Product selected for developer-provided billing (Android 9.0+). +public struct DeveloperProvidedBillingProductAndroid: Codable { + /// Product identifier. + public var id: String + /// Subscription offer token, when applicable. + public var offerToken: String? = nil + /// Google Play product type (in-app or subscription). + public var type: ProductType } /// Discount amount details for one-time purchase offers (Android) @@ -950,7 +975,8 @@ public enum FetchProductsResult { } /// Result from showing Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). public struct InAppMessageResultAndroid: Codable { /// Purchase token returned when a subscription status changed. public var purchaseToken: String? = nil @@ -1233,6 +1259,7 @@ public struct PurchaseAndroid: Codable, PurchaseCommon { public var signatureAndroid: String? = nil /// Store where purchase was made public var store: IapStore + /// Unix timestamp in milliseconds since January 1, 1970 UTC. public var transactionDate: Double public var transactionId: String? = nil } @@ -1288,6 +1315,7 @@ public struct PurchaseIOS: Codable, PurchaseCommon { public var store: IapStore public var storefrontCountryCodeIOS: String? = nil public var subscriptionGroupIdIOS: String? = nil + /// Unix timestamp in milliseconds since January 1, 1970 UTC. public var transactionDate: Double public var transactionId: String public var transactionReasonIOS: String? = nil @@ -1629,7 +1657,7 @@ public struct AndroidSubscriptionOfferInput: Codable { } /// Parameters for showing a billing program information dialog (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public struct BillingProgramInformationDialogParamsAndroid: Codable { /// Billing program. Currently only BILLING_CHOICE is supported. public var billingProgram: BillingProgramAndroid @@ -1660,23 +1688,32 @@ public struct DeepLinkOptions: Codable { } } -/// Parameters for developer billing option in purchase flow (Android) -/// Used with BillingFlowParams to enable external payments flow -/// Available in Google Play Billing Library 8.3.0+ +/// Parameters for a developer billing option in a purchase flow (Android). +/// Used with BillingFlowParams for external payments (8.3.0+) and Billing Choice +/// (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+). +/// Only billingProgram is required; link fields are used when the selected program +/// links outside the app. public struct DeveloperBillingOptionParamsAndroid: Codable { - /// The billing program (should be EXTERNAL_PAYMENTS for external payments flow) + /// The billing program. Use EXTERNAL_PAYMENTS or BILLING_CHOICE. public var billingProgram: BillingProgramAndroid - /// The launch mode for the external payment link - public var launchMode: DeveloperBillingLaunchModeAndroid - /// The URI where the external payment will be processed - public var linkUri: String + /// A pre-generated external transaction token for a Billing Choice external-link + /// flow. Omit it when Google Play should provide the token in the callback. + public var externalTransactionToken: String? + /// The launch mode for the external payment link. + /// Required only when the selected billing program links outside the app. + public var launchMode: DeveloperBillingLaunchModeAndroid? + /// The URI where the external payment will be processed. + /// Required only when the selected billing program links outside the app. + public var linkUri: String? public init( billingProgram: BillingProgramAndroid, - launchMode: DeveloperBillingLaunchModeAndroid, - linkUri: String + externalTransactionToken: String? = nil, + launchMode: DeveloperBillingLaunchModeAndroid? = nil, + linkUri: String? = nil ) { self.billingProgram = billingProgram + self.externalTransactionToken = externalTransactionToken self.launchMode = launchMode self.linkUri = linkUri } @@ -1734,7 +1771,7 @@ public struct DiscountOfferInputIOS: Codable { } /// Parameters for fetching Billing Choice display information (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public struct GetBillingChoiceInfoParamsAndroid: Codable { /// Billing program. Currently only BILLING_CHOICE is supported. public var billingProgram: BillingProgramAndroid @@ -1755,7 +1792,8 @@ public struct GetBillingChoiceInfoParamsAndroid: Codable { } /// Parameters for showing Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). public struct InAppMessageParamsAndroid: Codable { /// In-app message categories to show. Defaults to transactional messages. public var categories: [InAppMessageCategoryAndroid]? @@ -1774,29 +1812,46 @@ public struct InitConnectionConfig: Codable { /// @deprecated Use enableBillingProgramAndroid instead. /// Use USER_CHOICE_BILLING for user choice billing, EXTERNAL_OFFER for alternative only. public var alternativeBillingModeAndroid: AlternativeBillingModeAndroid? + /// Billing Choice renderer configured in Play Console. Available in OpenIAP + /// Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). + /// GOOGLE_RENDERED registers the developer-provided billing listener so OpenIAP + /// can emit the selection event. DEVELOPER_RENDERED omits that listener so the + /// app can render its own choice screen and use the reporting/dialog/link APIs. + /// Must match choiceScreenType returned by isBillingProgramAvailableAndroid. + /// Defaults to GOOGLE_RENDERED. + public var billingChoiceScreenTypeAndroid: BillingChoiceScreenTypeAndroid? /// Enable a specific billing program for Android (7.0+) /// When set, enables the specified billing program for external transactions. /// - USER_CHOICE_BILLING: User can select between Google Play or alternative (7.0+) /// - EXTERNAL_CONTENT_LINK: Link to external content (8.2.0+) /// - EXTERNAL_OFFER: External offers for digital content (8.2.0+) /// - EXTERNAL_PAYMENTS: Developer provided billing, Japan only (8.3.0+) + /// - BILLING_CHOICE: Google-rendered or developer-rendered billing choice + /// (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+) public var enableBillingProgramAndroid: BillingProgramAndroid? public init( alternativeBillingModeAndroid: AlternativeBillingModeAndroid? = nil, + billingChoiceScreenTypeAndroid: BillingChoiceScreenTypeAndroid? = .googleRendered, enableBillingProgramAndroid: BillingProgramAndroid? = nil ) { self.alternativeBillingModeAndroid = alternativeBillingModeAndroid + self.billingChoiceScreenTypeAndroid = billingChoiceScreenTypeAndroid self.enableBillingProgramAndroid = enableBillingProgramAndroid } } /// Parameters for launching an external link (Android) -/// Used with launchExternalLink to initiate external offer or app install flows +/// Used with launchExternalLink to initiate external offer, app install, or +/// developer-rendered Billing Choice flows /// Available in Google Play Billing Library 8.2.0+ public struct LaunchExternalLinkParamsAndroid: Codable { - /// The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) + /// The billing program (EXTERNAL_CONTENT_LINK, EXTERNAL_OFFER, or BILLING_CHOICE) public var billingProgram: BillingProgramAndroid + /// External transaction token for a developer-rendered Billing Choice external-link + /// flow. Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). Generate it with createBillingProgramReportingDetailsAndroid. + public var externalTransactionToken: String? /// The external link launch mode public var launchMode: ExternalLinkLaunchModeAndroid /// The type of the external link @@ -1806,11 +1861,13 @@ public struct LaunchExternalLinkParamsAndroid: Codable { public init( billingProgram: BillingProgramAndroid, + externalTransactionToken: String? = nil, launchMode: ExternalLinkLaunchModeAndroid, linkType: ExternalLinkTypeAndroid, linkUri: String ) { self.billingProgram = billingProgram + self.externalTransactionToken = externalTransactionToken self.launchMode = launchMode self.linkType = linkType self.linkUri = linkUri @@ -1889,9 +1946,9 @@ public struct PurchaseUpdatedListenerOptions: Codable { } public struct RequestPurchaseAndroidProps: Codable { - /// Developer billing option parameters for external payments flow (8.3.0+). - /// When provided, the purchase flow will show a side-by-side choice between - /// Google Play Billing and the developer's external payment option. + /// Developer billing option parameters for external payments and Billing Choice. + /// Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). public var developerBillingOption: DeveloperBillingOptionParamsAndroid? /// Personalized offer flag. /// When true, indicates the price was customized for this user. @@ -2060,9 +2117,9 @@ public struct RequestPurchasePropsByPlatforms: Codable { } public struct RequestSubscriptionAndroidProps: Codable { - /// Developer billing option parameters for external payments flow (8.3.0+). - /// When provided, the purchase flow will show a side-by-side choice between - /// Google Play Billing and the developer's external payment option. + /// Developer billing option parameters for external payments and Billing Choice. + /// Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). public var developerBillingOption: DeveloperBillingOptionParamsAndroid? /// Personalized offer flag. /// When true, indicates the price was customized for this user. @@ -2071,6 +2128,10 @@ public struct RequestSubscriptionAndroidProps: Codable { public var obfuscatedAccountId: String? /// Obfuscated profile ID public var obfuscatedProfileId: String? + /// Original external transaction ID for replacing a subscription that was + /// purchased through developer billing. Available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). + public var originalExternalTransactionId: String? /// Purchase token for upgrades/downgrades public var purchaseToken: String? /// Replacement mode for subscription changes @@ -2089,6 +2150,7 @@ public struct RequestSubscriptionAndroidProps: Codable { isOfferPersonalized: Bool? = nil, obfuscatedAccountId: String? = nil, obfuscatedProfileId: String? = nil, + originalExternalTransactionId: String? = nil, purchaseToken: String? = nil, replacementMode: Int? = nil, skus: [String], @@ -2099,6 +2161,7 @@ public struct RequestSubscriptionAndroidProps: Codable { self.isOfferPersonalized = isOfferPersonalized self.obfuscatedAccountId = obfuscatedAccountId self.obfuscatedProfileId = obfuscatedProfileId + self.originalExternalTransactionId = originalExternalTransactionId self.purchaseToken = purchaseToken self.replacementMode = replacementMode self.skus = skus @@ -2700,6 +2763,7 @@ public enum Purchase: Codable, PurchaseCommon { } } + /// Unix timestamp in milliseconds since January 1, 1970 UTC. public var transactionDate: Double { switch self { case let .purchaseAndroid(value): @@ -2749,6 +2813,8 @@ public protocol MutationResolver { /// Returns external transaction token needed for reporting external transactions. /// developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, /// native Android defaults it to IN_APP. + /// The Billing Choice extension is available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android func createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid, developerBillingType: DeveloperBillingTypeAndroid?) async throws -> BillingProgramReportingDetailsAndroid @@ -2771,7 +2837,10 @@ public protocol MutationResolver { /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/is-billing-program-available-android func isBillingProgramAvailableAndroid(_ program: BillingProgramAndroid) async throws -> BillingProgramAvailabilityResultAndroid - /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). + /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+), + /// including developer-rendered Billing Choice external-link flows. + /// Billing Choice availability: OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). /// Replaces the deprecated showExternalOfferInformationDialog API. /// Shows Play Store dialog and optionally launches external URL. /// Throws OpenIapError.NotPrepared if billing client not ready. @@ -2807,8 +2876,9 @@ public protocol MutationResolver { /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android func showAlternativeBillingDialogAndroid() async throws -> Bool - /// Show Google's information dialog for a Billing Choice external transaction. - /// Available in Google Play Billing Library 9.1.0+. + /// Show Google's mandatory information dialog before a developer-rendered, + /// in-app Billing Choice screen. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android func showBillingProgramInformationDialogAndroid(_ params: BillingProgramInformationDialogParamsAndroid) async throws -> BillingResultAndroid @@ -2818,7 +2888,8 @@ public protocol MutationResolver { /// See: https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios func showExternalPurchaseCustomLinkNoticeIOS(_ noticeType: ExternalPurchaseCustomLinkNoticeTypeIOS) async throws -> ExternalPurchaseCustomLinkNoticeResultIOS /// Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. - /// Available in Google Play Billing Library 4.1.0+. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 + /// (upstream API available since Play Billing 4.1.0). /// Returns a response code and, when the subscription status changes, the related purchase token. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-in-app-messages-android @@ -2874,7 +2945,7 @@ public protocol QueryResolver { /// See: https://openiap.dev/docs/apis/get-available-purchases func getAvailablePurchases(_ options: PurchaseOptions?) async throws -> [Purchase] /// Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. - /// Available in Google Play Billing Library 9.1.0+. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client is not ready. /// See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android func getBillingChoiceInfoAndroid(_ params: GetBillingChoiceInfoParamsAndroid) async throws -> BillingChoiceInfoAndroid @@ -2928,11 +2999,11 @@ public protocol QueryResolver { /// GraphQL root subscription operations. public protocol SubscriptionResolver { - /// Fires when a user selects developer billing in the External Payments flow (Android only) - /// Triggered when the user chooses to pay via the developer's external payment option - /// instead of Google Play Billing in the side-by-side choice dialog. - /// Contains the externalTransactionToken needed to report the transaction. - /// Available in Google Play Billing Library 8.3.0+ + /// Fires when a user selects developer billing in an External Payments or + /// Billing Choice flow (Android only). The payload can contain an external + /// transaction token, link URI, original transaction ID, and selected products. + /// Billing Choice payload fields are available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). func developerProvidedBillingAndroid() async throws -> DeveloperProvidedBillingDetailsAndroid /// Fires when the App Store surfaces a promoted product (iOS only) func promotedProductIOS() async throws -> String diff --git a/packages/apple/Sources/OpenIapModule+ObjC.swift b/packages/apple/Sources/OpenIapModule+ObjC.swift index c78987275..3a72193c4 100644 --- a/packages/apple/Sources/OpenIapModule+ObjC.swift +++ b/packages/apple/Sources/OpenIapModule+ObjC.swift @@ -408,7 +408,7 @@ import StoreKit store: .apple, storefrontCountryCodeIOS: nil, subscriptionGroupIdIOS: nil, - transactionDate: Date().timeIntervalSince1970, + transactionDate: Date().milliseconds, transactionId: purchaseId, transactionReasonIOS: nil, webOrderLineItemIdIOS: nil diff --git a/packages/docs/openiap-versions.json b/packages/docs/openiap-versions.json index 5a40ed41c..6217eb621 100644 --- a/packages/docs/openiap-versions.json +++ b/packages/docs/openiap-versions.json @@ -1,5 +1,5 @@ { - "spec": "2.0.3", + "spec": "2.1.0", "google": "2.3.0-rc.1", "apple": "2.2.5-rc.1" } diff --git a/packages/docs/package.json b/packages/docs/package.json index 28144ed5e..d54992ede 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -1,7 +1,7 @@ { "name": "@hyodotdev/openiap-docs", "private": true, - "version": "2.0.3", + "version": "2.1.0", "type": "module", "scripts": { "dev": "bunx vite", diff --git a/packages/docs/public/llms-full.txt b/packages/docs/public/llms-full.txt index f59e4091c..aa595e6d3 100644 --- a/packages/docs/public/llms-full.txt +++ b/packages/docs/public/llms-full.txt @@ -3,7 +3,7 @@ > OpenIAP: Unified in-app purchase specification for iOS & Android > Documentation: https://openiap.dev > Quick Reference: https://openiap.dev/llms.txt -> Generated: 2026-07-08T06:25:10.082Z +> Generated: 2026-07-10T22:14:59.416Z ## Table of Contents 1. Installation @@ -1094,7 +1094,7 @@ val billingClient = BillingClient.newBuilder(context) .enableAutoServiceReconnection() .enableBillingProgram( EnableBillingProgramParams.newBuilder() - .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS) + .setBillingProgram(BillingClient.BillingProgram.EXTERNAL_PAYMENTS) .setDeveloperProvidedBillingListener(developerBillingListener) .build() ) @@ -1104,10 +1104,12 @@ val billingClient = BillingClient.newBuilder(context) ### DeveloperProvidedBillingListener ```kotlin -val developerBillingListener = DeveloperProvidedBillingListener { - userInitiatedBillingDetails -> - // User chose the developer-provided billing flow. - // Launch your external payment UI here. +val developerBillingListener = DeveloperProvidedBillingListener { details -> + // All nullable fields depend on the selected program and flow. + val token: String? = details.externalTransactionToken + val linkUri: String? = details.linkUri + val originalTransactionId: String? = details.originalExternalTransactionId + val products: List = details.products } ``` @@ -1118,8 +1120,11 @@ val params = BillingFlowParams.newBuilder() .setProductDetailsParamsList(listOf(productDetailsParams)) .enableDeveloperBillingOption( DeveloperBillingOptionParams.newBuilder() - .setBillingProgram(BillingProgram.EXTERNAL_PAYMENTS) - .setDeveloperProvidedBillingDetails(developerProvidedBillingDetails) + .setBillingProgram(BillingClient.BillingProgram.EXTERNAL_PAYMENTS) + .setLinkUri(Uri.parse("https://example.com/checkout")) + .setLaunchMode( + DeveloperBillingOptionParams.LaunchMode.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP + ) .build() ) .build() @@ -1131,17 +1136,33 @@ billingClient.launchBillingFlow(activity, params) | Type | Purpose | |------|---------| -| `DeveloperBillingOptionParams` | Configures developer-billing support on `BillingClient` | +| `DeveloperBillingOptionParams` | Configures developer billing on `BillingFlowParams` | | `DeveloperProvidedBillingListener` | Callback when user picks developer-provided billing | -| `DeveloperProvidedBillingDetails` | Billing details to report back for reconciliation | -| `BillingOption.EXTERNAL_PAYMENTS` | Purchase-flow flag requesting external payments | +| `DeveloperProvidedBillingDetails` | Nullable token/link/original-ID fields plus selected products | +| `BillingClient.BillingProgram.EXTERNAL_PAYMENTS` | External Payments program constant | -> **OpenIAP Note**: Exposed through the Android-specific `AlternativeBilling*` surface in OpenIAP. Enrolment with Google Play's External Payments program is required; availability is currently restricted to Japan. The Horizon flavor does NOT implement this. +> **OpenIAP Note**: Exposed through `enableBillingProgramAndroid`, +> `developerBillingOption`, and the developer-provided billing listener. +> Enrolment with Google Play's External Payments program is required; +> availability is currently restricted to Japan. Horizon and Amazon do not +> implement this Google Play program. ## Billing Choice (9.1+) -Billing Library 9.1 adds APIs for markets and programs where Google Play shows -the user a billing choice screen. +Billing Library 9.1 adds APIs for markets and programs where either Google Play +or the app renders a billing choice screen. + +### Integration Scenarios + +| Scenario | Choice renderer | Developer payment | BillingClient setup | Required flow | +|----------|-----------------|-------------------|---------------------|---------------| +| 1A | Google | In app | `EnableBillingProgramParams` with `DeveloperProvidedBillingListener` | Pass a minimal `DeveloperBillingOptionParams`; Play returns the token through the listener | +| 1B | Developer | In app | `EnableBillingProgramParams` without the listener | Fetch choice info, create an `IN_APP` token, show the information dialog, then render the choice UI | +| 2A | Google | External link | `EnableBillingProgramParams` with `DeveloperProvidedBillingListener` | Create an `EXTERNAL_LINK` token and pass it with the URI through `DeveloperBillingOptionParams` | +| 2B | Developer | External link | `EnableBillingProgramParams` without the listener | Fetch choice info, create an `EXTERNAL_LINK` token, render the choice UI, then pass the token to `launchExternalLink` | + +The setup must match `choiceScreenType` from Play Console. Registering the +listener in a developer-rendered integration is not equivalent to omitting it. | API / Type | Purpose | |------------|---------| @@ -1150,17 +1171,116 @@ the user a billing choice screen. | `GetBillingChoiceInfoParams` | Configures the billing-choice info request | | `BillingClient.showBillingProgramInformationDialog()` | Shows an information dialog for a billing program | | `BillingProgramInformationDialogParams` | Configures the information dialog | -| `ChoiceScreenType` | Selects the choice-screen type | +| `LaunchExternalLinkParams.setExternalTransactionToken()` | Supplies the pre-generated token for a developer-rendered external-link flow | +| `BillingProgramAvailabilityDetails.BillingChoiceAvailabilityDetails` | Returns choice-screen type and external-link availability | +| `DeveloperBillingOptionParams` | Selects in-app or external-link developer billing during purchase | +| `BillingProgramReportingDetailsParams.DeveloperBillingType` | Distinguishes `IN_APP` and `EXTERNAL_LINK` reporting | + +### Developer Billing Purchase Options + +Only `billingProgram` is required for an in-app Billing Choice flow: + +```kotlin +val inAppChoice = DeveloperBillingOptionParams.newBuilder() + .setBillingProgram(BillingClient.BillingProgram.BILLING_CHOICE) + .build() +``` + +For a Google-rendered external-link flow, also set the URI, launch mode, and the +pre-generated `EXTERNAL_LINK` transaction token: + +```kotlin +val externalLinkChoice = DeveloperBillingOptionParams.newBuilder() + .setBillingProgram(BillingClient.BillingProgram.BILLING_CHOICE) + .setLinkUri(Uri.parse("https://example.com/checkout")) + .setLaunchMode(DeveloperBillingOptionParams.LaunchMode.CALLER_WILL_LAUNCH_LINK) + .setExternalTransactionToken(preGeneratedToken) + .build() +``` + +### Developer-Rendered Choice Information + +```kotlin +val params = GetBillingChoiceInfoParams.newBuilder() + .setBillingProgram(BillingClient.BillingProgram.BILLING_CHOICE) + .setPlayBillingChoiceImageLayout( + GetBillingChoiceInfoParams.ImageLayout.RECTANGULAR_FOUR_BY_ONE + ) + .setUserLocale(Locale.forLanguageTag("en-US")) + .build() + +billingClient.getBillingChoiceInfoAsync(params) { result, info -> + if (result.responseCode == BillingClient.BillingResponseCode.OK) { + val imageUrl = info.playBillingChoiceImageUrl + val loyaltyText = info.playBillingLoyaltyInfo + } +} +``` + +Supported image layouts are `RECTANGULAR_FOUR_BY_ONE`, +`RECTANGULAR_THREE_BY_ONE`, and `RECTANGULAR_TWO_BY_TWO`. + +### Availability Details + +For `BILLING_CHOICE`, `BillingProgramAvailabilityDetails` can include: + +| Field | Meaning | +|-------|---------| +| `choiceScreenType` | `UNSPECIFIED`, `DEVELOPER_RENDERED`, or `GOOGLE_RENDERED` | +| `isExternalLinkAvailable` | Whether the user is eligible for an external-link option | + +### Information Dialog + +For developer-rendered in-app choice (scenario 1B), call +`showBillingProgramInformationDialog()` before showing the app's choice UI. It +is a UI-thread API and returns through its listener; it does not return a +synchronous `BillingResult`: + +```kotlin +val params = BillingProgramInformationDialogParams.newBuilder() + .setBillingProgram(BillingClient.BillingProgram.BILLING_CHOICE) + .setExternalTransactionToken(externalTransactionToken) + .build() + +billingClient.showBillingProgramInformationDialog(activity, params) { result -> + // Continue according to result.responseCode. +} +``` + +### Developer-Billed Subscription Replacement + +Use the original external transaction ID instead of an old Play purchase token +when replacing a subscription bought through developer billing: + +```kotlin +val updateParams = BillingFlowParams.SubscriptionUpdateParams.newBuilder() + .setOriginalExternalTransactionId(originalExternalTransactionId) + .build() +``` + +> **OpenIAP Note**: OpenIAP exposes these through `BILLING_CHOICE`, +> `getBillingChoiceInfoAndroid`, `showBillingProgramInformationDialogAndroid`, +> `launchExternalLinkAndroid`, `developerBillingOption`, +> `originalExternalTransactionId`, and the expanded developer-provided billing +> callback. Set `InitConnectionConfig.billingChoiceScreenTypeAndroid` to +> `GOOGLE_RENDERED` (default) or `DEVELOPER_RENDERED` so OpenIAP includes or +> omits the listener correctly. Play-only APIs return unsupported/default +> behavior on Horizon and Amazon. + +## In-App Billing Messages (4.1+) -> **OpenIAP gap**: No GraphQL/OpenIAP surface exists yet for Billing Choice -> info or billing-program information dialogs. Add schema types and Play-flavor -> implementations before advertising PBL 9.1 Billing Choice support. +`showInAppMessages()` must run on the UI thread. It returns a synchronous +`BillingResult` for submission errors and reports the user interaction through +`InAppMessageResponseListener`. ## PBL 9 Migration Guardrails - Replace removed APIs: `SkuDetails`, `SkuDetailsParams`, `SkuDetailsResponseListener`, `BillingClient.SkuType`, `querySkuDetailsAsync()`, no-argument `enablePendingPurchases()`, and string `queryPurchasesAsync()`. - Use `ProductDetails`, `QueryProductDetailsParams`, `BillingClient.ProductType`, parameterized `enablePendingPurchases(PendingPurchasesParams)`, and `queryPurchasesAsync(QueryPurchasesParams, ...)`. -- Handle `DeveloperProvidedBillingDetails.getLinkUri()` as nullable. +- Handle `DeveloperProvidedBillingDetails.getExternalTransactionToken()`, + `getLinkUri()`, and `getOriginalExternalTransactionId()` as nullable. +- Preserve every `DeveloperProvidedBillingDetails.Product` (`id`, `type`, and + nullable `offerToken`) from the callback. - Keep Horizon shared code on the Billing 7.0-compatible API subset; put PBL 8/9 code in Play-only sources or behind reflection. ## Best Practices @@ -1171,7 +1291,7 @@ the user a billing choice screen. 4. **Auto-reconnect is enabled by default** in OpenIAP when available (8.0+) 5. **Check product status codes** (8.0+) to understand why products weren't fetched 6. **Check isSuspended** (8.1+) before granting entitlements -7. **Handle Billing Choice separately** before claiming PBL 9.1 feature coverage +7. **Distinguish in-app and external-link Billing Choice** when configuring and reporting developer billing 8. **Cache product details** to avoid repeated queries @@ -1213,12 +1333,11 @@ The release notes call out a fix for querying subscription purchases with a single billing plan and dependencies on Horizon Platform SDK Kotlin `iap-kotlin` 0.2.0 and `core-kotlin` 0.2.0. -> **OpenIAP gap**: `packages/google` is still pinned to -> `horizon-billing-compatibility` 1.1.1. Upgrading to 2.0.0 should be tested -> separately with `:openiap:compileHorizonDebugKotlin` and -> subscription-purchase restore coverage. Play Billing 9.1.0 features remain -> Play-flavor-only because Horizon compatibility still targets the Billing 7.0 -> API surface. +OpenIAP uses `horizon-billing-compatibility` 2.0.0 and its transitive Horizon +Platform Kotlin SDK modules. The Horizon flavor is compiled and tested +separately, including subscription-purchase restore coverage. Play Billing +9.1.0 features remain Play-flavor-only because Horizon compatibility still +targets the Billing 7.0 API surface. ### APIs Available in Both (Safe to use in shared code) @@ -1280,6 +1399,10 @@ import com.meta.horizon.billingclient.api.* ### Important Notes +- Horizon Billing Compatibility 2.x reads the app id from Android manifest + meta-data key `com.meta.horizon.platform.HORIZON_APP_ID`. The older + `com.meta.horizon.platform.ovr.OCULUS_APP_ID` key is deprecated; OpenIAP also + accepts it and other historical keys only for migration compatibility. - Keep SKUs on Meta Horizon Developer Center same as Google Play Console product IDs - Only call `consumeAsync()` on consumable items - `acknowledgePurchase()` is no-op - no acknowledgement requirements diff --git a/packages/docs/public/llms.txt b/packages/docs/public/llms.txt index 4d2324059..4785818a8 100644 --- a/packages/docs/public/llms.txt +++ b/packages/docs/public/llms.txt @@ -3,7 +3,7 @@ > OpenIAP: Unified in-app purchase specification for iOS & Android > Documentation: https://openiap.dev > Full Reference: https://openiap.dev/llms-full.txt -> Generated: 2026-07-08T06:25:10.082Z +> Generated: 2026-07-10T22:14:59.416Z ## Installation diff --git a/packages/docs/src/lib/images.ts b/packages/docs/src/lib/images.ts index d662fbc76..2ad0c3c96 100644 --- a/packages/docs/src/lib/images.ts +++ b/packages/docs/src/lib/images.ts @@ -87,7 +87,7 @@ export const LIBRARIES: LibraryInfo[] = [ languagesDescription: 'Bare React Native implementation of OpenIAP specification (Nitro Modules)', setupDescription: - 'Bare React Native CLI projects (RN 0.79+). Built on Nitro Modules with the `useIAP` hook, error normalization, and full StoreKit 2 / Play Billing 8 coverage.', + 'Bare React Native CLI projects (RN 0.79+). Built on Nitro Modules with the `useIAP` hook, error normalization, and full StoreKit 2 / Play Billing 9.1 coverage.', installCommand: REACT_NATIVE_PACKAGE.installCommand, documentationUrl: 'https://openiap.dev/docs/setup/react-native', url: 'https://github.com/hyodotdev/openiap/tree/main/libraries/react-native-iap', diff --git a/packages/docs/src/lib/searchData.ts b/packages/docs/src/lib/searchData.ts index 96253cd76..5a82609a3 100644 --- a/packages/docs/src/lib/searchData.ts +++ b/packages/docs/src/lib/searchData.ts @@ -492,7 +492,7 @@ export const apiData: ApiItem[] = [ title: 'showBillingProgramInformationDialogAndroid', category: 'Android Specific', description: - 'Show Google Play Billing Choice information dialog for Google-rendered Billing Choice flows', + 'Show the mandatory Play information dialog before a developer-rendered in-app Billing Choice screen', parameters: 'params: BillingProgramInformationDialogParamsAndroid!', returns: 'BillingResultAndroid!', path: '/docs/apis/android/show-billing-program-information-dialog-android', diff --git a/packages/docs/src/pages/docs/android-setup.tsx b/packages/docs/src/pages/docs/android-setup.tsx index d5179b60e..592ac15fc 100644 --- a/packages/docs/src/pages/docs/android-setup.tsx +++ b/packages/docs/src/pages/docs/android-setup.tsx @@ -453,11 +453,14 @@ dependencies {

    • - Enable Billing Choice through{' '} - - enableBillingProgramAndroid + Enable Billing Choice in{' '} + + initConnection {' '} - before connecting. + with enableBillingProgramAndroid. Also set{' '} + billingChoiceScreenTypeAndroid to the renderer + configured in Play Console. It defaults to{' '} + GOOGLE_RENDERED.
    • Check availability and renderer type with{' '} @@ -482,13 +485,21 @@ dependencies { the developer billing type when required by your flow.
    • - For Google-rendered flows, show the Billing Choice information - dialog with{' '} + For developer-rendered in-app flows, create an IN_APP{' '} + reporting token and show the mandatory information dialog with{' '} showBillingProgramInformationDialogAndroid .
    • +
    • + For developer-rendered external-link flows, generate an{' '} + EXTERNAL_LINK token and pass it to{' '} + + launchExternalLinkAndroid + + . +

    Shows Google's billing program information dialog for Billing Choice. - Play Billing 9.1.0+. + Available in OpenIAP Spec 2.1.0 and openiap-google 2.3.0; + requires Play Billing 9.1.0+.

    Wraps{' '} - BillingClient.showBillingProgramInformationDialog(...). Use - this after obtaining a Billing Choice reporting token when Google - renders the Billing Choice screen. + BillingClient.showBillingProgramInformationDialog(...). For + a developer-rendered, in-app flow, call this after creating an{' '} + IN_APP reporting token and before showing your choice + screen. Google-rendered and external-link flows do not use this step.

    Signature

    diff --git a/packages/docs/src/pages/docs/apis/android/show-in-app-messages-android.tsx b/packages/docs/src/pages/docs/apis/android/show-in-app-messages-android.tsx index 00ce97cfc..562bf3c25 100644 --- a/packages/docs/src/pages/docs/apis/android/show-in-app-messages-android.tsx +++ b/packages/docs/src/pages/docs/apis/android/show-in-app-messages-android.tsx @@ -22,12 +22,26 @@ function ShowInAppMessagesAndroid() {

    diff --git a/packages/docs/src/pages/docs/apis/android/create-billing-program-reporting-details-android.tsx b/packages/docs/src/pages/docs/apis/android/create-billing-program-reporting-details-android.tsx index 458e77543..de8384fb9 100644 --- a/packages/docs/src/pages/docs/apis/android/create-billing-program-reporting-details-android.tsx +++ b/packages/docs/src/pages/docs/apis/android/create-billing-program-reporting-details-android.tsx @@ -31,8 +31,9 @@ function CreateBillingProgramReportingDetailsAndroid() { {' '} — returns the external transaction token to report a Developer-Provided Billing transaction. Play Billing 8.3.0+; the optional developer billing - type parameter is available for Billing Choice in Play Billing 9.1.0+. - See the{' '} + type parameter is available in OpenIAP Spec 2.1.0 and{' '} + openiap-google 2.3.0 for Billing Choice, which requires + Play Billing 9.1.0+. See the{' '}

    - Enables a billing program for Android (Billing Library 8.2.0+; Billing - Choice requires 9.1.0+). Pass it as the{' '} + Enables a billing program for Android. Billing Choice support starts in + OpenIAP Spec 2.1.0 and openiap-google 2.3.0 and requires + Play Billing 9.1.0+. Pass it as the{' '} enableBillingProgramAndroid {' '} @@ -38,7 +39,7 @@ function EnableBillingProgramAndroid() { InitConnectionConfig; under the hood it configures{' '} BillingClient.Builder.enableBillingPrograms(...) (Play Billing 8.2.0+). Use 'billing-choice' for Play Billing - 9.1.0 Billing Choice. See the{' '} + Billing Choice. See the{' '}

    Fetches Google Play Billing Choice display information for - developer-rendered choice screens. Play Billing 9.1.0+. + developer-rendered choice screens. Available in OpenIAP Spec 2.1.0 and{' '} + openiap-google 2.3.0; requires Play Billing 9.1.0+.

    Wraps BillingClient.getBillingChoiceInfoAsync(...). Call diff --git a/packages/docs/src/pages/docs/apis/android/is-billing-program-available-android.tsx b/packages/docs/src/pages/docs/apis/android/is-billing-program-available-android.tsx index 84c50cb61..818fc23b6 100644 --- a/packages/docs/src/pages/docs/apis/android/is-billing-program-available-android.tsx +++ b/packages/docs/src/pages/docs/apis/android/is-billing-program-available-android.tsx @@ -30,7 +30,9 @@ function IsBillingProgramAvailableAndroid() { BillingClient.isBillingProgramAvailableAsync(BillingProgram) {' '} — replaces isExternalOfferAvailableAsync. Play Billing - 8.2.0+; Billing Choice-specific fields require 9.1.0+. See the{' '} + 8.2.0+; Billing Choice fields are available in OpenIAP Spec 2.1.0 and{' '} + openiap-google 2.3.0 and require Play Billing 9.1.0+. See + the{' '} {' '} — replaces showExternalOfferInformationDialog. Shows the Play disclosure dialog and (optionally) launches the URL. Play Billing - 8.2.0+. See the{' '} + 8.2.0+. Billing Choice external-link flows require 9.1.0+. See the{' '} @@ -81,6 +82,7 @@ Task LaunchExternalLinkAndroidAsync(LaunchExternalLinkParamsAndroid @param // LaunchExternalLinkParamsAndroid: // - billingProgram: BillingProgramAndroid +// - externalTransactionToken: string? (Billing Choice external-link flow) // - launchMode: ExternalLinkLaunchModeAndroid // - linkType: ExternalLinkTypeAndroid // - linkUri: string`} @@ -113,8 +115,21 @@ Task LaunchExternalLinkAndroidAsync(LaunchExternalLinkParamsAndroid @param ) {' '} - — Billing program the link belongs to (e.g.{' '} - EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER). + — Billing program the link belongs to ( + EXTERNAL_CONTENT_LINK, EXTERNAL_OFFER, or{' '} + BILLING_CHOICE). + +

  • + externalTransactionToken{' '} + + (optional, string) + {' '} + — Pre-generated reporting token for a developer-rendered Billing + Choice external-link flow (scenario 2B). Generate it with{' '} + + createBillingProgramReportingDetailsAndroid + {' '} + using EXTERNAL_LINK, then pass the same token here.
  • launchMode{' '} @@ -143,8 +158,9 @@ Task LaunchExternalLinkAndroidAsync(LaunchExternalLinkParamsAndroid @param Returns

    - Promise<boolean> — true once the Play - disclosure dialog finished and (optionally) the URL was opened. + Promise<boolean> — true when Play + accepts the launch request and its disclosure/link flow completes + successfully.

    Example

    @@ -154,7 +170,8 @@ Task LaunchExternalLinkAndroidAsync(LaunchExternalLinkParamsAndroid @param {`openIapStore.launchExternalLink( activity, LaunchExternalLinkParamsAndroid( - billingProgram = BillingProgramAndroid.ExternalOffer, + billingProgram = BillingProgramAndroid.BillingChoice, + externalTransactionToken = reportingDetails.externalTransactionToken, launchMode = ExternalLinkLaunchModeAndroid.LaunchInExternalBrowserOrApp, linkType = ExternalLinkTypeAndroid.LinkToDigitalContentOffer, linkUri = "https://example.com/offer" @@ -165,7 +182,8 @@ Task LaunchExternalLinkAndroidAsync(LaunchExternalLinkParamsAndroid @param {`// kmp-iap (Android targets only — no-op on iOS) kmpIAP.launchExternalLinkAndroid( LaunchExternalLinkParamsAndroid( - billingProgram = BillingProgramAndroid.ExternalOffer, + billingProgram = BillingProgramAndroid.BillingChoice, + externalTransactionToken = reportingDetails.externalTransactionToken, launchMode = ExternalLinkLaunchModeAndroid.LaunchInExternalBrowserOrApp, linkType = ExternalLinkTypeAndroid.LinkToDigitalContentOffer, linkUri = "https://example.com/offer" @@ -178,7 +196,8 @@ import { launchExternalLinkAndroid } from 'expo-iap'; if (Platform.OS === 'android') { await launchExternalLinkAndroid({ - billingProgram: 'external-offer', + billingProgram: 'billing-choice', + externalTransactionToken: reportingDetails.externalTransactionToken, launchMode: 'launch-in-external-browser-or-app', linkType: 'link-to-digital-content-offer', linkUri: 'https://example.com/offer', @@ -189,7 +208,8 @@ if (Platform.OS === 'android') { {`if (Platform.isAndroid) { await FlutterInappPurchase.instance.launchExternalLinkAndroid( LaunchExternalLinkParamsAndroid( - billingProgram: BillingProgramAndroid.externalOffer, + billingProgram: BillingProgramAndroid.BillingChoice, + externalTransactionToken: reportingDetails.externalTransactionToken, launchMode: ExternalLinkLaunchModeAndroid.LaunchInExternalBrowserOrApp, linkType: ExternalLinkTypeAndroid.LinkToDigitalContentOffer, linkUri: 'https://example.com/offer', @@ -204,7 +224,8 @@ using OpenIap.Maui; await ((MutationResolver)OpenIapClient.Instance).LaunchExternalLinkAndroidAsync( new LaunchExternalLinkParamsAndroid { - BillingProgram = BillingProgramAndroid.ExternalOffer, + BillingProgram = BillingProgramAndroid.BillingChoice, + ExternalTransactionToken = reportingDetails.ExternalTransactionToken, LaunchMode = ExternalLinkLaunchModeAndroid.LaunchInExternalBrowserOrApp, LinkType = ExternalLinkTypeAndroid.LinkToDigitalContentOffer, LinkUri = "https://example.com/offer", @@ -213,7 +234,8 @@ await ((MutationResolver)OpenIapClient.Instance).LaunchExternalLinkAndroidAsync( gdscript: ( {`if iap.get_platform() == "Android": var params = LaunchExternalLinkParamsAndroid.new() - params.billing_program = BillingProgramAndroid.EXTERNAL_OFFER + params.billing_program = BillingProgramAndroid.BILLING_CHOICE + params.external_transaction_token = reporting_details.external_transaction_token params.launch_mode = ExternalLinkLaunchModeAndroid.LAUNCH_IN_EXTERNAL_BROWSER_OR_APP params.link_type = ExternalLinkTypeAndroid.LINK_TO_DIGITAL_CONTENT_OFFER params.link_uri = "https://example.com/offer" diff --git a/packages/docs/src/pages/docs/apis/android/show-billing-program-information-dialog-android.tsx b/packages/docs/src/pages/docs/apis/android/show-billing-program-information-dialog-android.tsx index 886cd901f..4ab661519 100644 --- a/packages/docs/src/pages/docs/apis/android/show-billing-program-information-dialog-android.tsx +++ b/packages/docs/src/pages/docs/apis/android/show-billing-program-information-dialog-android.tsx @@ -12,7 +12,7 @@ function ShowBillingProgramInformationDialogAndroid() {
    @@ -22,13 +22,15 @@ function ShowBillingProgramInformationDialogAndroid() {
  • %fFcK z5AjXC_gU}z`^$O%A@8-IcPY;vwKif}-o!%9JuXX=_=~YNF4}KNkeIu z3Qa#|6?QaM>_3|resx)DaEL>b^;b)@x(VWIac0m2|5cn5mP{ShLk(Xjx(>@18i(KV znbYuhqVw4Or08#UKPmc~-A{`CmP301_MD#p%;IC&zl$H`;rm0tgHOFg;;eD#`Kq$y zpz2?v*}poEe=Pme**906pEogqamHBIGU~4M;Iz2JiWQ7KoC)5iedvAVw;a8mm?v{9 zJ$zGyU$swJd(5{gS6VOuog?x0LjKF#iRd!s!PZt9D%w9Oy`9{@0k_$N+Ys^#Rs2JV_nfX{U;P z%$LDu()MuP2`q^wELr?FWNMJU51C%Wet3NM)i1EmyTmm})%&1=$)kV6cY#TKclj=G z6_dw;X$|XWWH0HT;|Enpn{SwHx@klDd%F3*hY5r9^CRjs`aVcspxPOvzsEbp`_ymM zE%jEjSG&3_Be;5&V{;Y#zVdw57nNNQtOoybCPFnhFYKqSme``i@dM<^WesY!n{_#P z#=Qa6myZiP<4O(oq7UK|d=H+)KJFncB}Q3IzaDhCE2@Eih+|-L9dS&-vD81080S#_ z3*Ax{W%XH|r9;_7>0QuuogY=Yl8kA*2s-KeVhTmG|$HN51s|7J=8H z)@`Nfb>_M)@iQiYlR{;e+ia-NKw!6UBkPw8zg*T3Fb-C5q#V+&FBmQ=lzrpG=cUg^ z%+avR7Vpjh_hPrize}U-?`S6o9AbmMNB4{GB6dvd!12)2;2n7{-zA^qPtuGzqqx|g(Q5A!YH_@5@-JM$4lS1X#%AF9^Bg&DJjdug=`<9yS1 z5`*(XZ;iOmaMDNWvixs=&ji-N4Le8k_W;KiGfv0{hp#afIhk}4_Lw^SQg4TPlz5Z$ zU*xOtc|(_`q6eEg(Su4a!K3Zzr4&<7M(f!ma8rex%eZqP`a0WOXJ^-I^w)3A)Bcum z8f&eVEMpvA%Y4LYQ&xa?y6~rybn;?t*=l5_$<%Gx=(Y>s_nqjwCSn2Ak4*>|w%Hi( zRm11PTQXnQ#J-BP(8-E9wfV)y+8O!(FueFV?UX=EX@5EE9Da~>w>^z@4i7N)FE23k zsg5XS@@3IXCaW+=cJggP2|%{!&k3dhx_k9sVR@R2Ke56Bk!Wko*!ioI;G_Pd&9=S*#DX<3r%H)_x2% zVUu{V=+KtZlj-AB`g#(5J`umSAOH?j9M4PJ5_1-QMyG7Co<%3gGxlwjcKrG&4%z$0 zntw+R2R|o2SB)dnH)V*|IZ^TzN7VzLZIStBt3Ih)XeIxBX1b8NGpSp1P)~~^FeE_> z4OyY7`q+CAk~tP_K6~xvv)69ERwMbOd{vCL{od`x40*3(8}s_i--EAG|kGNSd#CY*jV;5-!|}#`JA#>cz%^Gw z9G(K+TncXrHh)>J<^VQ_R%5}{ibH|j7tbESp8VqY_275t-od6>*F0T6#JAgBu7%vi zvj0f>DRt6s2l*Y8b5PzvJr3$~xcMdUOXSy!UvGYW`1MsV)LFPezX?o3ax6SX;!xJx z+t=62T26S?|N1U)6<<)J@HDJ$ir}d+K9Bzn<}dSWE_OOey`+K@V_mtmj$DJr(tpu0 zs%_0VQQ=9W9~%A9fI%~GHKf>tOQUZZeTF5G(IrRuhmp=Y>}bEEuQ85r@GW}nw-G-!=K3TKEwmJ!Z>)9p=&zcw zj$-_m==iKPCdrn)!ykG>7m!!RBm>sFJXNw+7(ZKJwU33uuHKs!&q2?z;CdUWjD4K! z?L3k4d}kiU*q5YuX}-hYB_$Va_&Ky6Zk_SUjp&kz)wJzi!CJqb;FbOizTfawl0Cj! z`F}kBWgVLuyA77JPm(J{?}?t0zL#hCYD=(9h8{BXPx;}#+MRr#JtuoY`A}bNfHrbi zPssmZG+tKlEvqVD+E(&l@4xh2U^vVMLl0mO99S?|{r71@w%TD3d^DPMD*V!hytC+# zDRd|v?{|Plkwtin0XJ)yL5=A?b6b{`!lgOIlRkePj+TqPQ^B0wDfp2b;%gj zf+?DwR!m;CZHyCF$vBa#;BjGb*{L%G^E*JZ$>cbzGI=WUL zdm#ibHrQSezO(9zGwO;3mybECEibw}vFBb*IKf->i}39{jW~tyGW#{~o%i6kdl*YK zx;QJ2cbD=`dfcMd%wL)9ChI5j-k57+ z{**G(ZVK(n`cfl?(sqWD)pjh|`n9Uxp^vupV-xim@JH?;u+vj;cr0avPcBn+2o93; z^^`Sylr~wnmy?)?l+C1!&|S`pHE8Z+{Nd5Z^4?y)M$t*mrH%CKta|#IZOfcxlc{s+ ziHV4xAoP*>C~0dC|2LYk5*h0(S8z&frp=eKe5hzViCm50_Z{N{p|$i`VEl&v0{=@+ zt-08lr{qofg48d5 z9{qI_7J=jU)X^Eeq`ct$Wy<0IU?1D)b7)&~|D4;DuZa>PVjp~l-%E^2cuvV(qxt@@ zG{3C(m3}{rew=kBV-EUn&@^)H@4qj&n4i@29OO1L=j2c^Ybr#a*>xT3NS9=Jdm(Rb zeGdJ)m^_xg6MN*&n;3DnN2HE4VaiPP6Yp+avlo%aXXd#k#oxQVJXL0%#x$|Rt@T9n zvG4`{-5SNioL#^=ccp)XCcgvr;)4&>+wpu_OE~pjelPOd%I`R0;FCxz`0eFa%Kz{N z2eE7iKD`s)-i43f10RF^@TH7t${hGJ9yO0?tXFa9&BE*Gr)5Kp@q(_?LB7t#vX#FLipTGxfJlHST=bEb|=c4UB(E;KOR>(q}U+ z8que|vhWf21G0AAkb|l8_ayp#BKS|;zDtOo>-Lx~?qzB}a| z=V0AMYWW@IQ?<~7d}z*h;oGNsY0K_D#T)Y7l0ZK-e}KHg_de2xUUp3Mo$C!fbW393 zW~u8UdF~ask!S0SK44XS>M%Z0CUe&w{Q&dVqIV=#;gy)AucslGTBiRXb4$v85`Q*h zq?_#VUn_PS6`yU*BXQJ$#4F~JO5aYcHSn53jG}&M>^iOefy_~;Ic~w9?3uIhmrFmF z@$NZdtOg$?>C=!8fnWB?UBvf{cx_xheaWXUWpXwIeUUhv!~wnpxAn|pNIX&er|r;N zY`MhR9QZYAPMdNID3`Cw4b+<{gKzAqC#E61D)m_9>fw7M#v${bMqTyngOPX8Qu&BG z%=cCBjJ+=jz$$b-jC3{Mq>OPkX_9{CBIh#c&j`NNt2OS@u2H|2{YIU|E;^+B1_x)d z8fzAm&easnIhSR;e?By?DoY7Q#q3wbqI--OdPF`WmK70WkN7?b-jKBlCU3QV6TWft z&6-oV8-9P_qC{jNRex34@g)79q`rKY!l&hXuHoI?bG)JJp~*V->7+f7AG*G`w)*** zV*{&+Rj*S#lcW={UbY$>z>~yjQdFE~;X-ZMI$}xHwpiCQtdqYPzrI@H`^14)6PFY| zdWM*&*x{krjeKwik1d%6?#_fy4EvO!PvH5UQO5XT&{`w@HxRxrk(es+VuO#`)=89; zcRX<{<){17{SNfScHp}fSiM*5&DEGQV63*u{nQkHlT+5YOPo~V%IW%G+FDL|RW>uD zwd^I775^afihZhl33}UT*NCkOJ_ZiU3;YRvIgdEfCGdYzFX9X6Sz<<;a{RgegmavM zYT~mJ=iW*@$w6E=5m{)BuYpH}3t*i94h2VoN0}$9V*h~nnQI%a3q0>SCn&nS9J?zq zciDrF4fF_2e?uP8V-H-^DJ@`Tq3kd(Qi}z=iVOmj`K6HfoqBNeQ(A^U&anT zi>)iP#YL;((P>9oanU6G=0teU**hruBZGQ6!(}z{61itASwH<&P4SM8dK#gnMQ@Q8 zv3W8Vd!m`=6TWw-Z(NSetC?@v4?R{OM>4+?t#@WIUn{t+dU!&>-DYnh=wjKMsCm8C zJfb&}(Hr>9epSEM(rZKfr<(J@QTD90tkB)6f3(;v>WJ1$k|&pM50OTHleVqcyzt8q z_(goFH2NfbZ^X&PZlo%EBl2Dk-2%u~!fa#TitJ%hIt925oifBf30g|ta^!EI8hd8w z&!Inlz~2@d_5-rATRqDhxv7(E zFLP(-2i?c}YF7iF(kb|>mOeV2w&a|hR(-T$ioYCvaUbh-4~qrak_89(;W z#@!DuPe9+uUdEyLiTAxN)A(c$#d&~Gx%H*nk;-0@E8zK7IT&roLB_?F42X=Rt1)gV zbT8+73A~@7ct1^_0{zAB8>>=dy`q(0_LKg>EOP)^_zvD#gRI1G9bW{JQ>Dgu;Vr@TJ|L@q}bvgJk`hO$!i(Gew?|%;c|Iq56NB=*^ z`7N>Ze<^%m>Hj~f=h*sRH_QJd{a=;Zs{h|+3>TsQ{ign(6{-KXkgw=!L;s%$d_`CP zc>RAVeJCpHqx_jKsW%q?FCfp)q5nTvVCnxp?dtz`%{-mze;0eDl-^H2MDHI7KUS5c z1v~OXEq}xqN5$6rqKiAy(@|sdR(m1kIvbyLWN)N=dve%XH{&PUI)+2rE=%p?dvYh= zlREzHirs#jtu)rGiN7|KyXe*UtZl7Z1iTh4qSmQJD>hgruuDzRZk%sW+=dA$w%sM}b}W~@E>9{VhN-0ud4TE;h%v$XNmW#_5&9DDHrs>cKRlszb~G2bZTb(tUdoOQ6rFdnTzCZoq^57Dn>jL!~`Z+XAG z;J!53ubif6P-2e5CV>AN8H4SouRdo+h4eR#{ys~;8q>7#7r4?Z_5yp@nbPbChl}oE zo=5us8g1TbgL|b3_u80n|LPF9djR)IjK}VxE%CKGvh|7UT%Kq@rG&mM!cW=hO4PIa zz+?ER)$H>Qz+<(@Pr8lICJT?zM_D`fJZDCHPZ_UcV8v=^Cj2o0-b!-`Z>8z8*iR=h zkwj?w0{m5J^4Et?NAlMi<&Vj{hOzHV_)C1g7YyHvv;2}<`Rf?PU;Eqm>*6u~a>ZZC zioaf%up0=`5q$$X*gmzGrcN6z08ndF?s zEl2V!u^)Lpp67DpK=y&3z`nAJIlJOB_BvkiYgtEmPSE3UF>VpwNYSewbS=vvzvuxs zZ5m}#nz!}QicWB)Gz+~p=4wUD(4odyJ6(U1GJ`1d%zwrb!?Kq{r=)8|a(@r;M^(1h zWXk5dh}CE4yC^4n7uKL}<@}De_EMX-9ibJ?bfu~?6%#1~Zy5B*(2x2Xz7an9Kf!xP zawzi+lUx}U%oBO$qbuaTq&=K-wTD>C8gNdW%`dv999<)N<1?qb*}E?cZrsfaMqwu? zBV+x!lo9GSWStk}MQvI_|nCosR{`!)>Cfr0bLB(5YdTlP)t$#uy6nwQ7>B}VlXa6LmGONpVZ ztGG_tB9R@jEfV)H;eC>2%d|E>H%ZCP4{f?eY?+F?8n$c&_-?ah5=((kX=}#*`0>Jz z%r64l`N5;jzFa>%xb_F9-~}2C*NRpQ`*T3nGfKZcxFrEvq*Vy)bAf%If<0A#p88I3 zk)OSGiZ1Y?aV8A%#y7$1RTh2b_XZCJeFXQH3`2&9ze*bp>aL>f$$|^;|K|k;jRc1) zhiXNN2e~ur1is5R;lCA(>7@Q!>~y1zCf*0=*JSj*to0ST3BBa}jtdmM*ncAQB9G{d znY2;&c^H{-H*aUZ+_Tu1I%k{BAWpGqqOuw3`t|gEtLl4-ezU*|-EM|Hkv1X?+6fOC zw0p+Vdv$Gg;_ui_-<$(&v?FG2(9WX0j zQiE#`K)VwhgPLDX<(v=RuK}MWtOL^N=a|1FLO&0(R1~!PS9V$!QvXc$xa6m>kDLCl z0N;iWma6CRP2_ezaEp8-Ir?BLl33fVjjKnN1SUC;Zo5Y-s;5l{ZB-Sg4WvfldzXzz1DdvIph zFImfwtP^`^rS;lj*CV5reKX?gBBS3~boO~#?c0cGI%D62&KCSqkLbo{S6TEn*2T-d zc#+q=;O7%)F8!Ek%B=KjH2oXz4z3-I&J43BIiG#6FJJ?O?<5YpSIKL#qM?lM>@*L7 z4_Tk_7In{bB{e?-9bU#qm41uPHfWx%zruH!OZtmR^Fj0b1RF(uiN%DG-<8CMto9sg z&jx3QQAX%}^MXD>$){wBy-)M0TYT&@`7YnA{;xweO%@bJuyWC+fG8#2kyu>~aY0cA&Wv*Ca{+8cv%?Cb3?9qqc?s4SZsd}|pG?6c1GgEyXXY0J`FDHY3@^Qwb>#uzABujKtR8gyblr+QAw1R1;e zIOC$6xgME^kuw`L&c?5D-IqH6+KT`3f0R*UCGI4(;^?KcsphOXt6pO1!mImvSB#Af z5hI_BOi7G9IkS=p_t8(D+gxSu3>?vzP<|E^Fsrq5_u>Iie8@{*A*%<5J zchH90{NBv>DrEHv+LU=XtN#K=XTD2^G$iItjC+%&_4MPD#V{MC9jsOpLGuFNdoUVo!WM9N{ zz1SCF&KV!c_qI9X3^iw*Kpbc_`X$>o7bo+@*^H5%88!|*##}M_#GIGeBy+{qxabvl zLUg{&Rn+jj23xldJtuzhl7ARJzlxc&=HOZAWcakQzc^jZA61k0V@oG;Zmh*uUl4a} zoD*!bee;ht$KWaYvr6x#=qx^3CT+o!+%eTwb}MDYr>Qf`m-IB^^)kmS_EvClAH10k zZw@i%i|>aw%Lk+hZ!XE9t%R$XFUGf$`C{zCu5I|O;vZPNC^(e*WDc=*zJWjCRq@5^ z1$K1j&%l4HO#a&>{C8Rm{#(L29lI`RkN=|cMf2bPBk#@QqbjoZ;oIFI>9C1pUxXwm z1l*M^7>7xHRbKs4NMf1mY4@Gz}^WDha6cy&BDEP!MMbFpj|$0^&Mj zf}@6UC4!_8%=$^_)XX=y+|L(=u zmqMpB@lV9%Sn=;Zytm`uEE9gmh=1^B5%{-_dijYK{Oe`Izn@cgzwPE5o@#+5!=iM+zEp)arCLw$G!jp@znbWgA+ubA`hxU$_W^J?|&Q$B|DkLEY@Sxl%8 z$M=HPR%zNf{wmmi=sTu-8tuN9^d%&3E#iJO;);u$l_QwDg!EQ zaN7N#Gam3Y5BQpQdLX}Y`m~YsV_7uGkr)0m`F;$ym z3SdkpiGK5}*vNj{;mLepgsEz8fVI6|q??xZFa{lC;5dd;J}_m3EW|0ri}sQY2d+NE z5iEjCp(AF1<^S70IIVpUKJ=D8V9e#*|F?|w|I)^uS_`hg7c<&8voJok#qqrZygb^t zAb(U%txEUb^-AY?-3K_+2V2R7ThTu8G=8FI{YGc}P1%r-h`X*d_J#a35^i3t|E@~F z-#6U{JvH+DKs$VqBd+T1x=jBoQTnkTc?{@JWX0L%EPeR`eL)_F35*kw@fnPXu1z^i09PK0AC}+oAw&eysYvwtaICC?*At&OTSWndMwASKYAhFAy%?{;Ud88{`{5i z_t2NV-&0?D3-PS;obZ|Iui~NQn8P*br+8=jS91O21J@4S`d9dehw}q6?u`6sDb9*+ z#+qQfSpa?Ff9_GpxHHKk4&5s8fVnaEU5fbNxo+hBbNVY$R*NaDZH{x+#+Mi5?WsU) z8gQjK4)J+f0pcT>7ZkqHkgZidN|lE)689w@aSgU3&sA5vnrl|ApU$`_`C==|b6kQJ z2tJ!2WP5vA#6;9-Z$_sYRe(TQ0S$2mRm#`_I;GWa1{k3TM{YXa( zk*iP9QagTlP5hwFQvqE_;YQ-cP93(%y&CB3Yr8f7zV}B%$AX;<{Wt&`!*?avTjR40 zct*W;EpTWpbUDfE!m&%%{CoxYE*iW=zoZ^3^oUXDR|xik_mSTmdyE?AuhKey|3w{( zfJ>kQ7%$>y1ipmnM6|xMtv^}YI!a7k$Ck+an8aP+DcV!`DRCX&iP(Z@ZQ9}W17d_j z@H$HS(dtv@wSI1`$0ncJ@iwv^?gh#`rSG7QW5N5?&_(wlUgl@~+VIMDkzl-m53<6_yEGliZW9||Gk_hb ze(PrN1kgO#^>5>v*^2YaXh*KW-b8thrccKjIT_#cn{?!1a>CB_DR>-lXA5LWYs@Qs z=CZ*jsJD||fhSaHo=m?3vcPUUd&{KZ2iv38QOr&qi$+*j{hF$+|SlQ z{zd(y5wvCe8?cy&SSZ@8K19D8`f9=RP=@O@AJ1O8`0hEwhA|9~-X;dUse zdT6DRnr6Y#Nr zoAVb}V&g(j9`ldpI>4_{Un0I^9hHnb@*_`CHuYU3M`GaxxgMT6sk=?MD4j2fvfPjg+ZnS-vmp?|Eh3Eud4dv;7-& zkQTgz>m=|NKAVsK`*3Bv&OXS&^aJ6U5q$R{-jyO&OvVtU8f);LAl_XGoSBFD zXPwo!&&0PI=a0~tqrU#uk$Nxmjj(4dLp$=AaqOSKj^aZZH`?DgKTofLt*idlQ95D< z6CtZL?ZGFtW|5>N96PAg4zy@`3?bypc ziuXsen{|wdo}ZX}m^}6|;Oa8q7Tf(JaJF>-=aew#ehK$#l9BJPys10ZE5CUL-!#ML zRISHft|$b)A*N2npBg7~?{G<4 z_aI~v;-uzbY-F-=1z<1eVKu(#F27N73+Z9TpJ@}lrrmv=OHc8}0AEv#9w;N|q9;eh z#z}g}e0fR6twl~r4>6vGexS!|z1DcrQ$Xf=xOHjy1po^GWb*{yMYsLWP zh5D~I;arQju_4;{kA5-w-;-VX7SL2dYpUSajQU7xn9~Syc%q_fcKW#!ec1`T7WBbu z(ueY){{25n9=`zeCmXa~-^p)%B8(bTPnDlmUMg+Yj z&HEX9TZ%r;g#SQe4)h;~XYgRq>}=%dBF)~#I!-g|@b?pS>>Nm+Dy$zHy(WDW<3e1} z;kn4qjq-;v-bUbi0CZX#Ea~)Hs8iD56GCvIJgv@h-TaaXA6q@dJ3q>H>ZeN!zHp>| zVt>(E|55vSs_f@es-JcJqxSRhF8a9>{J$J>@+SN^=Zr^f1%2f+9d%ZN#*s#9Zcp%! zz`4qt0+Bx$vcv?&OfJGaP=08k{D3j91a6K;xs||2uBS@iBz4=T1->R47jx`_=Y?U& zF}fQ(vR>LGa8>~GOgr%3D!aLHesKRj$fv~lgnUGqX(Z~S46qXTE84^Qwdy+uu8Gv) z=wC-#uvE}AoR7jWfhYHOq(~WPIN*UX^P2&n7hGF^dO`9D@CIRzB;J~^Dt-X4B7QL! z_U`A|mt^Bw^oclKg1SlP??yQX&KKH^+$sz4J?pL|jIlnL-(;8vv~!ded=zaj8!lxe zx2OZ>`QXYv#F%wnEZ~>|+8mB|KX8qyYr5?Ao+KehCJn`&U^#V8tybg$DMwx#z~M*q zfpgu0oIJ33)Dn(%8_uscZ2;YfF0XPPe!)DXVP4WRaaPr&^Yzp-0Lyt!opa%C(DM2p zLLSsCM_&JV-2{zmLVM(=+r%}+XvDSrEa1&qTJTN${{%AKXV*IPkNavt*&mrhUdeU8 z-t=aGa$QJ&$2@)ln!+>N*Rn3);48ci@dW?E>uH|gOT3~D0dv6kdE9djm7Pr0h5b)q zPj{HPZuox0i#EG@b)5fov_~3gFYiWt4RhG&cs~X6ReqNPu@({*mB7oDzqxRRyv#*Y zzL0a!xer`-gah9x-okcLE&bqnGB_rTxs+F|!&$syEz)i;%9=cfW#ds+(s0E4|ETE) zzkv++g%dI-^$(oeF^IH}@&20e=(Pp<<2MxQ%WoN@KUsVp?SOUK;-dBQQ7`R~l$95C zbkq&rbcR3qL`|=UOif%T9!QyhIayP|v(j+xMY{1do&vAwA&t} z1aM&sas?FPoCVMr?KoF^BKEEmkUumDIqUquZO%9SLg^!|^6$>$8ibz$%Y9fpR^Nej zSAk~%(0cZTc5lrwdRGH*mGj1 zXx~a*%nh4T!AT-#BXeC=$5GEY*tXSRpCE@m=xP_TM$bYyKYa>C-Wk^_?{}B!xoQggE{9><#O96xPB@9ZCEBfQ6^YjmMJi!9MA{*mpyPxhc?IV!AIEVC);v91R zTfr0C*T~!r-vIv9lVlF_RO3aw`-J2BLDrcS8_s8b4f+Q;IVfah*jqtImt2l#!uJle z1oWm#LoR=TSFsK5De2ln$d|5O;Zr{Y>D@|lzFWQZL0 z$MGA`o%T4=^i0})mw;z4`JI4MM(BQ&xKA@a7T>2DW5qSWFmSCDxQo45z@56)2j(~D zn%@*)?pBAs%RoORd{)5D1DyCtYsUE!F@R^EG=C4YbAx)G)mJ|Ep62g{=k%*oJcw`} z;cKUeJ!!{(>vf&JPEm&T`<^UeQnR5z`(+UT`nI=lTyGm)YL_1?(pu z(7uh_FDYF2@;o5L10KQJ6!WpRXnhCjve5r3MgO~|{p4+9P=5h%(4z~8qMr>t{Lg_d z06#9T>7CS@$n8<-1eRSDiA!e8N8Evyvj4H_~rxX z6W6ThgO*4eV^y|ikpEu5O6&uG$0mTsdViR=q#WOJy>kAiqP|w(1>+2}f&YpoFjorq zIvs#XHtIv1MO7i{<9F4FYiod9b2v|XMQ%yoP!j?;k64msczLvkQ*r)N_XuXB_p>>UX|h5ZqXiI&$6QJaMihZARQ*QfmOQLZE3W#sc*HssUPkF6grx z*ZsFb2VT|Nui!(Pbr-(jc$)#IHnc%F-J#&L$r*;z*%D5pP}itrt^SuEd+Lytwz-j? zFo5`{`Y#>ZA!8voiu7|UE0r-RBL_JAZ@BujXS%L!PjbPJ#O29rJjlA&{#Fot18{i)vD;^x zewj|-f9h(7e<}D_WkT8mNq=a_FiDdPN{3}NHq`8(PC1~BLzOB_!#2ottX-hCITq(-IpB&eVOn$u{|DVL%KZ%?_pTjOD>8(lYv|Rs1-^%#!Z$@gu z)>qz5;u7Ur%AJ}C6Z)DEKb}Q>axHPqCK)FSyh$=v;yGzZG+II2Z#=D+pcm}-^C;7J z+VArYR(OKB$m6oZ8J$j?h`w>3%uXj(pgifsc*NuF{Kt{$!~x`O;(D2l{^8vAME)-T z&dtI-*Io}?8$tgmwJSj#%5h33%qiTT>h-&eQJ#i zG}p+6g~+)y05sFoAsYb)t`Q$-mRuuJj`N^A^BtUm{)E>Ca{hyUWOWP6w9lbD*MV9W zt8h==YF!suJeLXUA`5&^1K*>MZwKVLEXuStSyrwIsY7#3OhS9)kLP#ed?Hsq=7sa4 z*1#gPXJ0FKi)X3E5|ouO@X}^4*M6em$NQ`7aJxdn&259*$6rg@@&@2mX@T1u)Iqpa z+Tcb!Yeu_2JtN`rIrM}u{L+l)@UFoEzspgNkVQB*m;CL z0N-@NCn^lNmzXZ}fgbz@IKMB3Fto`3Xe$~_hl=NEMxiK|BKjO_SwrO4g!w33!~0N5 zKT0(6P+rn=nb+_p*Z`Zs7unWz^t1g;6aU{CtUXc<{^`NGZ zJrnDq{Kt7qocNCT&$@^9WxY6$b~Sv*kn?w+t9&{6d75Lva(;UNaNr!uH55MQtQB-r z>i^u=!X6g-Rfhc`IgbfOmdLe|ZhSA`nQDBCE9?6bSJgIY@$D!l$0GB)a4hW4HuQ%$ zC}}i#j;b@&_*m4LZ0y2yCS>~kJ9_HWq1o@&j-EQ#5aIVM@V%v?yT007@7#Oh|CWk) zy+&N!`YLga(=P*jTPkAp1n}fLauOL2Rkd~sTYUF3s^*egvkT2BT)0}L_{S3%i3_+=0M-~cU1 zn|Uevlsc7tlDacvuQ#GjWryMY2J`-5^r54pn@*ZC9I*KneIqW=4htxtU&jAeW6M5yJ+`d%BG3B9zr~hqKC71> z(P;u!hfuFOv-%RYcMa;+P6%A`vY3-@I&_b1*;$GHLd2L9dgb^Rh;gPE6H$&Z|2?i8 zpO_2a;~b2abC-=ZN4=x;J<=CEJZohE`7&|FDbx}Jm5<^;5!QU`M4)8TmxL$jde^sNPN~I@!>L8 z8Shgj%4@<^@|yNXc}*{ImA#JllWugCO}xofcFnD>vcjdYe)2W8TZ*f~hmTMm8U&*odh+gy-B7d>QmEu*C(P2=w>tY<$8Rh;2gxd;#oLfqfN#b4nrC8wvPo} zrY|<^qM(7y^}PZzD(nk&TB9e3z0ydbzX1tI3 z*{2lL&$jJ-dKll+#wNedF#6y-@%14=P>$igIP=aaJ-iXNT=F_)--2FP<$iV? z&eZj+@2|OUD#6}ghf7<}xO(wUk9?PlwFQH=eD{~gcSU$dzX?&UHu9Yh@5pl-1*|OX z<2lB$e!>?8!90wc<7Mtrj{kJrb52wa9fkXsVr+_^e2H(!e+H+^d?2J_r&1ZZ+2KBVAxme%2DnoBwb0Myodh6L9k;ie*^B3uFKX-!uALuN5Ub;Yk z`^A3x*59sGrkJI1oj{m*+f2{s?U;Izzf6%^k{O`yA=jm_f;Qv7W zAEUoL1piONf9SVc7slu9`OLF^>%H-LjrYgrwGJxOw+?p%8%H^UU+l)SLdW4Ra=PPr zfxh)ZJio*dtf?rg-Q-NJt*I!*HK~^QE*kH51gqob);8RmQd{HtFn`nQ<>v-~=Zz0J zf?PL^OK=5T8Xv>e1v_V9a%rk6P@C)y}SJWCe_7L|~G_C)x zEXESTwptPcTN7-n^{DF+*cHWd*jB}J*j8V}^I?ZNKM&w}dz9y^@Z5vk*avUi0G}1? zL)p&k4%sS!XZ=mQv&JvN7cUfBxW^UF89E%kC|@|SU&VfdKNTLmV4SwWU3T_1w|2GZ9QAiQp-d{`pHcOj$FbmJ_SmiMD z4vBLdi+6!8;jGKyPV^DJRLEbC*gsd;zfbuS9lTNQ10Tt!jd9n6SG_4CK92cGojoq7 zdNTH)Z^Rz-t^W|d1V_T54(zdV z9T1N^XrJpf;2IUmM{Au&>zbG6U#5w;Vlhuzl3e#$x&B({)6{L1e0C%}>()AU_DAJ)Zw0@6W|gE>-{TsRN5sB? z^rKUJR7BSe2ht?2t zO#3=)se+#Qge<{t<#&mYoslPYTOsCW4CwMy%#V}b|4E*tUr9`th)WTaf`2B?GO0Qcg77?)jMvVWI_??Q5wMRu}( z=fQV#e+H~+=IL;V+`fEASn_>2-XCqfbj2U7v5zw` zPn5%s#2*!{Jr*3l5%ozwt5l-||8oVMBy9=X8gfrpd`$WpaNXMHV*&PNBtMh30?tM2 zynCA(uc~gVeDAF`-;-apHQrUUBL48$r6Ud(JrFn*vgW7m6>gk|7&viJQ_+%V+Hx;w zYO6ePkNI7J_^!2g3V6Kx`4;HkYEGHwNBwt0R$l4ET;RRE{lLeInkt`K*Vee`pKX;N zt9s89^;X83?StRuj!?Wo+6vhB6IB}~Zm^9_QQBzz+3~WwTS1c?o9uHXY>OOQ5qy<> z@Mm!YZye~SYKQg+w!u6t-O)}ia^_0@V1ao^c97o^ul}$6nzUBfQ9+Y_s4;16MP7*3 z{uzC=`j}I;r_5xLuiz6P=qz;hT>tp5!ueg}Ei#t99+lHQ2{B7+VbhreKaMAb{e=7^ z(sH^f^O)q!}*BxmK#ODbG6xc9lHW?>?DMQ>oH~;lHd2ub)cRc{@5~UecpPoaDC}nPq6}m1UGV$9 z3-bWjl`T~BD(7@E>ZE@03-E?ZOV%*rv zuc7{iy?mZ6I|^er_vz|1?B}a`dEPDQz_iV={t?&Xe4?|o`k~WkLn<%!ZH~=r#6FN4 z`#|om(C?O>x))6|c)W>=#3A1lEvW21 z(dJR%VpxXL{L`+5eZn^9tSb$&CEI9)oW!=jU8(Sq^M><9fQyvFX3b&W_)OwrkyzW5 zugpAM*UGu^O);aU%a2@Rvz8|1WN%5t6F5$Ty$JZ2>(%lqamKY9zLf6c z9sXReQy+SzOQ)}R7S3MH(C%7AR(JnC=ZqkkbvYTMJl~@6v`kT<6s`FMKFp>v2A=59gCMN8sK3CnZ@6I@^sau|&>2|Q z^WeM8b+8`mfbxi-5r~fw=Z_3H@;H?|lL;F7_3&#o`K$=!E$>aeAXNT5RS3F=nU=hIs%zDWKPDj1d zfMX+00uQ(pJYcZN1AZ41<^jF5?YS*6y7zZ6{t}e6@_>6`uWN7$|Aso{15`4?A$)-P zA-62ob2ju>`t1JjFX`t9&KkMnES<4hvp4gGnW;TNQMo(7&bMXZrj<8LFKk2J$SsNrzO zPa6Dq$3VuXKkpRb&&$}i6tRDwfwoBpV-Ej@eVMR7?}ccOvcPQcamc;GPw0H{EZrE7 zGUQQmol1S5>z*`+YoG6|Jf{;)EjU-qJ^fc|PLEDgk?`^8G_?gZ74gqq(bQt}mo#-T z>Pm{&5{dVZqCKlTvmp1_ad`>mP2qCO2yFuCfaDQpi1B20AMcpZb zJi!q|wE9HsmHI$`d{$hp0iXOiIxg>kJ%{UZIb@pBexMsduAv<#(U?7iexGvvt94D< zbq3@^bKlDEOV@(RkM&4+P1~CfaU!G%LT1xUUXH!J_gjvgZYkYt7GxOeLnmW?=*v$# zR1MY$O|kQT_TESG|EoYO4Ksi0-(kDz7f5B0N;5ihC6?1PQW zPRm--kA3bFEOSpfRyqV{Ce1Wy*@9tR(J~RYz`4H{@G)swm5^sak4Pg)%MM{K6fOJc z#x7{t@swwy&;NMLKl^i!3;Pd{7v>ElTq!%I8Z(kP|I&u0V1c=V{37PAj{7B()!cRO z%yW=CDG0qKA_iUYFwRp2=1cjzG>W-1`61#;dO|i_Eckve%7&pj$lvC?+FjRSXBZ6m z5czZ7@tqZ~bADz)uO!`^-Iw&Qr{No`1-->sXUA#v%yHgo$tyYyd=EJJfUgkr5PCWN z_LqP!5Wg3oFCpHH_$1m4$^>st>(rOQhz}Wweq=gQg`7zlleqW*>JYs6EXrA(%cbFa z%21T$r{G%wR}cIkG1hGFxZo6A3$Gg&yyrCO2Px+y4RurBK)ksLuhKZqSDHcDUC8@l z|G<>}@!xlr#9bd^QV64+Cut*?H+pu{1*RX8TYL0zl`EByIb1sKWi(C^vz{(BT z3bwRwHy;Mx0!OA5g0`QOyrLEGo_C?d8HFoK2D$la$}>GX!EBK^cj=fr%7DZ>?&nHd zaiZZv?3bkb>Bex3bHTxm`l+if!XB0T+Y;DKM{BNc%iB7j`#X#&Q#?VQv3x4l80U<9 zB@6TT(cZWb|A7B4<(o{(5zxUo{?>l7t!$K`uP<`|v#nonJxF^R-DST?d*%<<;7^z&fkA8o~0Yt zpxpn!-w`KpW{AJ*r%L_~o7PWOooOlBII7Mx%;C?Bi=58|ZPJ%=?efU^yyySXd_IAC zIiHob`MebUwa#M)?(Oq<5YLV}kB~{#JWf2ud3;&eax#q-2RqMWGupJz<7eVoy0Hi4 z{-=3#3=PfWh%V+a8*LqR9@89tBNp-(*6|R0Kg)R`=$z0^K?jpTD?p>LerI0-8-uyF zfv4u$mbSJKT~jmwG>7`{(dbhq=o9r)*em=u#~zuMCGuOyu-Lb%Dg=MTzE#~+@JC74 z5{;J;e<&~;_AQ}$!pn@!m_^c{Ji z)m}FbvI*(wub>fO8*-X)Mj2owczD?M{)K77vCnfk;)TBE9ATbs49#<1=Xt(N&NJtB z*20UhUXqQkFgDKZRVdev7*Oln7BtGawb*5&%&pYPy|%f{J|4cUuz8qzIL;*(wpcN* zN_W`>9k?s`^Vn5;ivf?pnW_u4?X<=Gt_z&ZMSET0q`O;r@gl5^c&rWRV#bl|F+ZRlwPw{m z2668sJ~wTRKF|)z_&VZQtvIpiS&0)PFn6Ty*|48dj*l~O0{!#O4lVknQ ze-d7UDkjo|cU?3e0%fCCdea=(&%?2j8O96f-y3Ly`$+*)_9o0ruO_`oHEzTEhVEgw zXA|xhM#4Q4&j@oLU~cM9kuV4U;eJ9{2<90^CF`}poVgB4q3?2j6x?^1H2sYOT$k7n z0e@4lb_iI9VSgBP66Wl)z$aWou)o%Xy^VIZK=v|a#VX2*hfO6Ivz8Q zT-aN<2aR>6_8(3HPANIoF)n1Yt#Ug~6?9M8Y@4Z{O1YNxN{ds2BM=%z7U|y{)j-Y1?-g%vn?Hm%s&Gg<7@8f+cbk0QhdURT==6)6ZMMgbAI-X=GpOI{w|0eqA7#xyOSciSB zzVw-Gjhb~*?>xz@a~htFgpbll?61&&bN=SAuSo76wUD0(V}`u3m+E`#q~1v#b1rgL zQBFa=Indg4BZ#>vLx1^fKAv%Hor?LB_?&1wfcN|H-OHF?>K7fzZ#4t$Yw$U|5&da~ z9ikQA$gvF)W3%e`d+>cpPB;IQ%`w9Ekc@g}ILGTHtB`XM<%uJ#uLL+q{QD4f(LW~j zdXH{}efD?>d!_G3hkc63xA7V3QgEj)Cv|)~oPWjKOo$3=>i8MP+o*$Z9sxLWAB%AI zVcpU%XXN!^7+d#YPXuha)}O%`W`Oq7XW$9oU>b0cyof#-)P1FWH>|VuA0S~`4*9b$ zV4^|)UaDZaDGbxW*J%EDd|R>#c8)>`&&_Phd6{0a#1mYFvSnzKahZf^PXSZ-HsG6~ zQ$2cFZb(ntX0=~V#e34VXg(iD($h}m+6QhdLHSSGVcQ0-T@G9$E`0|*$U1*DV~?HB z-NgA@I9BYlmkc-8%_g~Sh+97BZ`AMYbE^23S_^gmgWTLrcl>_C5FCp%2vc2JP=`&%GIK za!p(J-ES1nV7oy%C7&rj`~PC!9Wu{pAv(HcP;|VmMH^k=wXbJ+@i5ywI?k5!xcw2y z57j)@?2_|H9+VEBiJ~remh#tCdP0%#KbJg|Ykn>2<^0uv2U+#8o6t|>FCSWN=26K2 zjAns9{sLOU{zJYgrktLH=d@XpHj_qbj<8O~+!6GbXt3mt_%r4(3;7T1xjf=P>*Zt#=h=V<sh^ zjRVZp+Ltlb#{cPyG?304|Iy{>BbM-jBm%f+bd7`YtIV#5-m2w^}dh;guS5a>31sDK|H+z?wa>irfxgq|oK|jka`;1p$ymtFUF`m(9#Y)q1sT0`!h(OO3 zO?%<=5KXJnq#sdLw7tf7b3WRB?o8802-t(BO%LnNXNhO&h6m;TuQaU@eRn%f4$-uS z28L)_ot0OYqKz(TTCZcbUy*Ke-pf!Q^|SzTeoccf=wSH24~ERce9aEzy`k&UoKYi@Gh#1`hGe-9vlzVbtM~eOVn|M9~ zvAFi<8}U37b&2PQ=@s=LrguG_7yQ!s`&aOMU6kjwc;2zU^Y_HVsj7a&603gJ;Q2`h zI)A?c&)-ttTl(`To+H9?y9;iM^i5c>aEr@2|r16A^2DCi&cv&Xd^U*iL_8 z=8hws`FV+q=c!&j!Wz#LK~t1ocnQ~!TEJR6xkk7YSbX&kj?5EZh!VVQcTjcG`XIO#q z0oT-4Q{`Oygyg!%(cF9mR^6~Or2*xw_+?ZClvjlQ*mze#P+WMyRWfMxk*aG3J+-%*ybySi@> z_X);OTral4VpB#K78}I5+8IWM35z!Xi%OyEF@`cj*mnqvT+~C~OJr*ouo!5A#rNo! zr%xCbPvLv&C<+!&;GXiW6&BtQENHJxFbs1u~&SbXe`3DX7y}S*GM-QZ_hCn0EfOczbVHx9NUHSZEP?sfjp^nh&Kcb zGmW>KBt9|U41GE|PmKLgJ`f+FPLUg_O2V)SIIZvr$N3^35AvDg8^|W1Jfs(ya8qy` zhkN3p6^`X59ILVBL~dQcv0UI(hEb3DqQP;ki{J9hrA(nWcVIr*e(O)fD{*e5h%Gox zz%C5iA>uy6cpCMR_6)~049hfQhy|99i*FKz4Ym??K>u~O3{8b#@P#3F(*Q=C$7mk!5N>OV_i!9oR=b^SN&o|?FKlstwWzjeAd>Wn~N#0bsUh)7d;zKE9Lwl|l ztGq~=Psy9sTrc)-thov7@2t6A?C*{wrzSzZ-3ZQV?C!PIoa=if0y3FerGgkDBYHtK1bG$USfX>zwP2{rMSfTjRR_fc-qH{X^l-Fmo=c zt60CGK9Y=gw86OHuN9wls3|b$9DOb7u14%UWEl}V4_PJ@JMRbmqkX@AjAMHu=N$a2 z5_CxAYFdr5xq=sQ{U>8CApc?g%e)toCh)!peYNIiYhmsYL2o#RvP?PTyByFa@vS9a zTeNSR(f<_nttAIZv~R29%Zq!eZ;?+T#o<{$6m82rNZCH)G5fnxZmL24r!3^)=6IRo z`y;|8Zmxc${1Gz$M1qLv`~WneV++qb;@Ks!`r!(kT|GehS55&e_u2m6fMWl~ z=j$lf>C95n4bK1N;=Ax!s?plG&{Dtpe@T@3h0a#cQ|KbxyUa58EqPXe{mf*>7*MbJ z8Mu^-?--A}6>`#GlphRTCL84$mq56W))K{eRpd<_Xx9z=?*X{0`Wb7$SOq8Ek*D&z z{rC@kpxEsg)*a_d;+!mbeycjOdNAI_^9)J!E%J;8&3FyD_gh3g;q!$1E$w_BcWspK zj>mUL%GG9^#*}Q^a12^CB0)HlK@l4(9x@t~JtfrH9Y? zA*^5Q`G?H^QHeegu2^%ZI~#E@)S;N8A`Sb-l&vA>3VN1gK$lueI>$Vcd_T*4o`f^O zB+ri2znXveZP~Hd(TH30iHKIm2dHBw&b|79JnjhjE!N_!LfX3pjH*o-X(#*BOc;?~ z4L$}KEuHSsKWihLxE?c%l_s2i*9Dxu#5a_So)k1m>TcX`CydtO48zOtoM*8~8WV<( zIGYt~`$%UH9*L)SxE#pm;f7BO^1@qUoEKI?$JChfIKkNSu!3Bl zr+T*7%Sq`(m-isvKOZ=h?8p@Kne_EblofDo=p%8jAp96^kFsCkdk4;O$}T^RXF63){qyO-y#%oqk>|My>$8cu_Ijah zUx+@-oK^_jPF#mPCFCQotRAWF0lcj^&*!P=e}7!>5Ili!Cr?N+yr8dqA8@6%KZ3Ko zqLocY*~$2ZGWmYYAAKrFBe>7OdHvxb@}D%L74O3Nnv+Dn=E%GBcJ|dL@;0$;S(o5Ri_d4S7Li|+IhDu@`94d;oDpx;e_4*t zIUeG{@Wqkxay8`WY|I;Du*e?+Q_DmQUo~JX`y=ZT@F0z7Ryc5yzYy~%U|EqO^0lR7 z->L|4c%(sl05j{HkPfLFDct9Z1_$CEV+mCZhZP=#A^R7HyriU8LN*x5^Eap;^GpJV z(Fk2>CF%}TNE_WN92@v(SMV8%F;niUc3pi)`?%yu z_{4F&&}m#U547qVVNSduuB!6QfVH3r=nHJO+X_Wr5{++~X}i@DML$6YL_a|Xa!+znnhjUCXuwsTJLxb^0Imiq{wQq8 zC6HN&iwOc3|JVgCCK$iN*x0x8En{?>V|1Xrnj7Mro#tNA3D=~)pvr87jBl5Dj>vy7 z77yC7@}4j61@CcbL)pi}=p*rsIBdA11L+{|23|ZeF!hNjRz24RsmjY z>psjCzawv>Z{1^pwZ@V!miY^rEbtxAmlLM)0=2{wB!X)U`NP zD{l*6tRC<-@UXgUkApm{Zt9;M{_CN$JPTh#NtaTDeO~giB;#tdC1sqjK5{F@AZX~+ zJn*8t#A?B}m&r_z>x zkUEdzW$EB$%Erm><@!&*sT#Ir&S|vvIG3b>$%yy+LbOY|EZb#Y$tx(sJq%t=T2g@X zQYarP-%O5`Z7H3J|CzI1(Iopj#;vDl&{IJpU!6Qk@JQDC%J?~^%^taUE%ID6TT?vB z_diL~qv!jZSNVd{!fQ)bs*QP6FFaT z#@!V$(EY-?BG0_9sYqQ%nC&-d;#U*h0u4bI|c8FhphWf)J>luYwlKi ze-#{+jzqdsigGm-BlI$H9frNjRO3(hPucHzoMBNtCS{!uevMMDkonJgiLa_y^XRlJP@CUl4Ers{O1NZ+=gI9u#CI|`S3Ax`$iNv0X*dI66wXA* z$N#hOzmfjoU%@9IXCgcW`M-Wk>N@Okm98Ia@~zThdBj z`!cO`)egt@37}=vLq_4M&OLYnpJ{#18ZjD>d*sYu2>gXsO1G*6W0Y+X?Z&L zpDHeI*K=HYAV)h4`mrv6vxqlh4Jez)FISw0butF)r4YH13-mn$-nyCV_=r4`YiLZ; zI?_7g<6e^|TJs5Zg^!9Krhx8G06ZR9UKso+mV0JN?e(jj+fg6Rn-lz{_`ONmBlVc0 zqA>+|@e4G6t|RyUROI%(W{@X1N$?HQMyXenV?F{EPRJq2M$MRs>)_w8tjNY&*~ZeG z0=*3RDdxu(ed~lw_(XRNK2q=lE_Sb|cJ0d7;>*vizHe^rD%U6ZtCxO~@ABW1?}&HS zYQ4(OO?72Fz`W)KhdR)8EfKjQ_ckwEna+Mwhoa0;ZT9&;(CbNak48I>2xnJJgzWYd z;4J7##o0%tQ-Yqj61t=(ZqSoJMPI@DIEN3T?rK+((02l^zQ;(f5|2{<@uB*CCXQHh z`E-RNB9FF9mW2#cr6JxOwjq%Z=Cco^U&qntsnt$zZHKf}<2@AuWAbytE(T-!4r`$oX?+)TUeRNvD-t*MA$JM!M&?Fi z&VgP=!#{zyB0pN1sfS3JTg34LUm?F$WowDlL+a#Nn`y?IDC0&y=*!U^zf}AnD>tR% z7mpuv`Z@4(;^)HeRp9RHgxC6@YxMIjZslkh{gz<&f7g@;V58 zB~Ph$T_*MhmA!-Q1+eZ2N9qVptoQ1QU7>oaD?ZFubyrt>oF6djtFHJcKcL!xkDQJ^ z<+4xkf6>t|{+IkBY?}};w~fb#@w|S`9XJms!x&dl~&uw%5lXrv$otf|WQ! zhH}di+;fgtW(vwwS0uF4_WxSNWw80A7+2%j`if%wmwfga+y`96?U^Q@tpT4Uos+&Z z+(%3^>an+{^5QfKKFjA4XQJ_0;zWkxmo`2-3jObj&t8ppUGdpDco#miCEWgUJbx8D zNbY517&!t?$;NHsD))KRm;!NsHus|C-Y9X!?f64G=VUOhMg{aT$F_W9i?+RhSIl7{ zub9^{yjF~F_r_|qQ+hjUeFJ0knM1nirPE{e8OZhXKha>cPg#rW{L%a6JYNaPu&>leACmLoOBkllq!GFM>8X zX^=F~}v%0|7S)uyF z_*#PckA$zE*!u55{pqNGy};qlW4JohhUEJ^E2ao-&>qy)7_2x9J@lB*S!sxM=o-#jOiV|xnYrvADM<;bsFF4Az;J#|yAS7l#FF~*@h&bv%(zEs1OOnK9Y`((_C zif>hCzEL+MuLoTL$V&#>3k;&SVsh-;kwskp}KAB$@@^LdP3 z3D~x{T>5Rqt<$yjcj3ypp#p14#idvv^3w&Dt{Y|j9XzUUgQta7qewrr|a_SlVD z*=>Lm$8`m+QWsA!UPT={pv&IjO!NJsd8lJU~JVSPo7TSxzij~w@dfMZ|` z&m~MT?mWctNnGUq!v~0ajK)-O1rtdkq z2v-NL<8XE2Iu=(KuIJ+#gX?*?cEfcHuCaR27Dry|ngacT)p7dd0nWUli?qX&r{a2} z6ERz3YduRJ%r98_Kz@tseEh#3{}<)&8Ke2L_I{AB?Y%d@`MzUagVBJQ=bKNpC8Bp3^D zrYFCpo)w6jW$GBR-+?tV^sT~vb_cGopSi}jH}=(VEYGO7!%j{$tFyh_y4+k6rU!IPd0w2#<{c!TJYZ$+@qlEnE- zuYR~N*gQb*hug9qe5k1$ zX9Z^c{@u1}`20J{`uNvA)v*lrg5j0@kbfpgdw}&OeJy=&-$L2G;KA(seEe5B^})N< zc#@1O#q&gCKKe~Nz`t=nOUPA;#%uUb`vUUr*7DsexNq$b-qQelK3 zXXGmp{ygv%$@QOP!Z}*sR zT#I{-2YzKyVLAivv6nb}Kl=R!`ZlSjR-XZyHGHdiZshk{+jhPCUE3AFtphiBg3K4R z32@2IN}}xuIfrmA8*ri*@;cGJMY~oeezc*a;g^md?Ofc$V!!5NEzi5$p_g9m#MPyj zO-Js$AsX^D+>>uzV|xZMrZ)cD1%tE+hv#01HF*KnW)artIIPvNu!GZA&?$Tc3CjZD z_&|(hZk*;{>B{(4L(bv=#xvjL{&qKFDgwPT9!NZ1;(qII9RmI=(;sEZPkXpnd+~+a z9p#6bf=_lVTW~lo0^hGPVcrAZM$SEQFr$tEc%B6qHh<~S)mn0u_4M;RP40j6ce%b5 z{t2LYjN8DTY_SvTS?UY$XT$%i9MrcHjW+zJ|0LU>cux7M75BuY zN)wm7uPcp~z5y~LPz_zK_Gq#S4WBP&h zL1#JenMYS^PDtz8LXB=*xneUu<)fA8val zN*`j(KD?^>fcPPMAKo+j&<@;;G4b2Lvytc@+xMC6KaXeHB@Z=a{pp3a>Yj{G!upTW z<~RQ~*S~6WUFSCI%r=9THW%X=ahYwlnr%L0ZS&p6w&vge&{lKmgG~z_da_z+`bMTBs`*s@moZ0@B_*Tv9MEtkXjLUE@Xa@GJyTXqf@J$wI)4?4cao&0~n&3u! zr(FN&vq|R~ihw7?(F@;i%R2SDHt4BhjWDmc1|OaU_>M7Y*G}XN4!#%Hf+{OtDIV8l~b*D&uPV4(6XN$`VM&R=l&D(=PNn(M^*R2xGw8fdnlBFeM`b+ z*N4i+9$VS7WLY8Wz^?CL%rN#T&O=Nc#}^;D?-S~`w5^)wp#dJRnC*I3b?>s>2zWen z6nNYl9@8@w(q16oos2!o@V-(+eYMjaBXfm+q1@b{biVYe=?^L_x?&D$7e$}0=?drjdkT@oV(cn z%P^iqE||nF#|PO3Fj8Y{iPt7b7{>@0CnE-eW$ojz4y{i$9)Ysz9aRWbU^ieQ$Mrsj`$>W`3TUZDQXTay8DGf*xP; zcNwGUONPE6Vl-)Mmi|7R^IL?y5cVk8TB(0cL!T&5s+ixi@xJ_&aD3*MxS!Kq<}uRD z+(!Sxvw3Eo9q-pzPiE||hk1>FYtr7CY@E~2`G`lvX(k&NqD-|J`#S)8&&=hLBXZ3$ z_BUO`Xg&rU=05%W-ITX*h6VEDz^*LfH2;qB9N!$sQtH`8@hsV3pDD+@gYu&gJ79%R z%hpKvq;-N1&zP3*;khy+Ot=gHT&R~SxO|VgHA|kGr_d((v4Y7HxToF63Xf*y-X%Oj zd7f~-=m|2fjU5)@IB1!7cf5c_s*x{X0h$T&^(Tpx`nd_rxzN zTr}W`!h67UJ7Gk7$4h{X27Ix@X16Uyyr+N-;v8CtC&-O^c^D3(1RNsaHOz#~m=!MI-)*b8<-4|p$RS#I+DmQD^22RD&`;6}$FI~=!+awPxjg!kHdy(_ zCP^3eV7_@~LRN{koiSqM6N!M^+?=s_8(aw^LH~a$Y(9}^qt#9ASr|MI*Sq@^2CHE! zCaq2(od7R65?xx1`V?I%08NcXL*w3x#w${dyHK_ibZ8xNfRYYvM4x7ZZmRY*K{x3S zl4yJi{hV~;YQT;-culM}j67v)BJ$%Nf#zRt=^yd51o<>1-S2)x+W9GBm*__t$=_0q z%LqU8nKUrtf^feT9=YQs{ZwPH(taIdSSWI6CL6gJN5;X9p-1Zba9iJNkPlS!-O=NS zeSf}-zUP>IUjZA5f_JFjCw1NLx#;)PrvCZ}aDwwd+rvTP9qGI2JEHKo7xWk_?OU)q za-Dy=S+4VWC|ij=Am+U!-BjzG^?!}Je<_!1eK+J((loW!Utk|j5A%jefF;+qTI*Nh zUhxX+dd~{+1@g0GV{N9)b;tJpjymn@-5KHwGUr_%wu`kIZ0358OKbFX(?o7zz6Hcp>*mi?i{g4`ll#niy+RR)Jm*U(1c~wOqIexpJ^4 z>qbtqz%A|--q?$3r%Y)$*RjY^OP@>cy%*O`1I@@uYB+b=ZshAM(1H$}i>f7+pG$u% zDUV56Y%b(;A8@nrY;En4*62*+V!9Y`S2VDur@2Nq#U62uZhkX5eaS;zLNU`H$~w7xoo-)^iNbef}VyIFfZwT&?eh81X#oeB=sGE(kL2 z(RYLS?Q<^iZPq=pwL=qyPF2TzPT;BX9B||={s&|@;;(P>c``38cuxQ_s=L4)!i|~W zW%cL_^o}~_!YZMi0Q%LaFn-AMzfm9edWmm!X1z0)dxFE_fhSLUg7b5_<*9Y+J`=S3 z>IB`J1Dy-ys)YS^!)zaXO;U+#@DT9yja9UX_Tkng<^T$~Fs-&qnlrL0qW+ ztjFH>9=5)#dfE2{X5DMC4>oZMeX_^5&)*yq?)$mg_P{k~BOi5)zXtuW_Wcv&McQEU zp*G;C;zL(r?ki#M^n#Bl9z+@8oHsj$9YBr|tcyCOr- z$&1K8NPi~ImprHd{kF>CJ9erxif z1gs0vR{OfJ%i@0)W6m_L`a`pG1!rK5lP}Va0Kcc=>OW|Y%zO@Ze#<$bvtqU2Ca3#> zJp=I^^Y0tjP0t1GRq-*tOSJXk-t^V=U1;8$aWJr<%J*jM3(mk@KX+FjefC3~vlOEQ z_9)sgd_yE|(f_Fo{kHG@`vxAT{~6CqoV|69%L{wk%(J*Bkz`zld-^u5`n+SAw@F*? zyLYU)k1k`kS!anT+f(<6Z)M&C?*G#VCj)!_!?FLLXYT*|aL!62;6xvsiQNCk`kir> zV}0p#XW86aoMm%vcb3hX>B7|*-u;EjhfTVnN+TmGO=101up_y^*#_qM0Dwr$Vi_uB@4|9xBh zxms{5_QDqRs&0$-9&RI@!@lg^lGezW9Iid`8_J`bFO}==GwgwQ(SP#jIky++q=x~_ zqZ|1@t^_>Dvvjdv!G(hZ^4=OpNaj|aIYGeP&fPs2w8-wVF$=qC6s zb5APWe((j__Gu_{5IDlRNE7Th$9`4`8Y=NFLEv4Iai6Mpfvi{92++3I%q0_#?`B^; zUg`f4vVsraQC1*Ne-Pg(8K(gA5=|zEg>A>wr!DeKs&OaEQbwXIlaw5mWoCCFzkG~5 z(%eU88N%{%jDcrO90dKFF{K-9eo4lMsTzC>U?VYM>BSidThR_-d7&D!L(1n7uuPM% zob{sgf#?dB=UQOd0QrDz4n@7C*N)d`-Y`ZVD(w+b;Dubr7Fbzq>k+cw2Izd9VU=c_ zMOXn&GqH!OWWLgCqsw^@0ZydNz0t2m;DwA2NjAFUp1ur(-Ld!=wOVASf}BVm-ukyl z9&Xi3+4g?GiMGs`J0&gs39z#A@z;sp$Ax96>FAqPkG}!;zoPshF~5up;o=l<3FpE54Rvu0 zw~H(Ch~lc??nvMcdNWG&$m1+5{!s95%SO zBv|2|Zj83UeeMl}d!(E>$%J>24c>jxrd7_|jC-q``8V7X{`6sVBWFh^86UdLDxp&) z8|i@ivB>zd#h6nKuYh-?ocS!;v&;F_;#s2cBFZUvTjk7Kq5m{fw?vM`>=^8s^-1&J zg))bb<6Fg+(tbl8#(YexE|hka7m zN<$t-w2QdP)BIkvI~%#k?a!~q^Z&qRXn)SNb~t%JV`zZ${2> zdp-Gh{u;(d~1~FC*t`Z(f_0RL%86tYs(j~0W`CkG5w79 zBz~ED^Jiestt(#$9kG6D@7($w_n$MdH@^~B=n74>tQ&E;*4!f2@41(+_WZ4}W7cn2 zr#eTAb>4Nq6`#sI?3+=J`2zkVu0wU7xDMB+;#%!WhOcdg@kjh; zJYzD>1+3nZv@RFA{(9ICB%Vt@Tlx^QzU%O9D`*LQiCJd?zFmiSN7DM&cie$RzqQC`S5;+ZY3kvZ;2PQei4!V+z#svi6k{l^ z)vhEnrc92LFzLhRz>ReAoy;G=*o92!O6ky>Mw)ulIrN)`UPzs3JaneTpoh#K@CJOO zUx$A*^9QVhfAso_w9*Z$kvm`u@(6q>^9P&W%K z623elPW&?1FzmiOcAQtaF}Ow=z-K7`SpDej->Y?JjlHygbEGw?@`Et%##Ly~C*r(Q zO+N~$OVf{{0J`EPj3-4NYZKCGpU;N><5c$w4fz&IP*-7AdGU9! z_4vdZkg+3d=M?lm6Lt?Te2U({8JIpxj)pYN{lK(A(09P2Ag3db4CNcfHsSm{=wG6r zVvRG_le)7UyKf<7Mj2DS9DSz@_8RaMI66ELcCh8xOIV4$gdD8%P+zB*eMMRJbyKLX ztlO*?GIk#FMmz~UvF6u~3C9C=?oRwO)p)N+!sRRQg)sk=IwWJ{-ZbC0;63H0e&`$f zc(nN9Xm!18*0maSZTkOcyYBd?itT@QHzXURXH$uifMQTlQ3QhU$R>0P3Mh(&0G8Mr zRxBH031Hc)D0V|pvsZ&rgQDm&5ewEAg6%!^nP4GUF;cQf%o-PV`#&7mJAgB7(v4u- zI>Y>=k5}wZyKKJH@31%5ufAq{Q0w^&?uWzP9_k8WBa92yoEsqb2rEYz@e#vLM|vSY z*yGzDdB{D!sn%cJ3~>gW>_46hz_WT&tkDXS9V2*xcrV40wqW+N{*U>mpijDW6`mfK zF^u)S3+30PIfA9|F{RvcPnyuZlO_a>E(Nd5LEPFb2mG&KM|=K2GcCsmi1RO@dzp9J z{36i78)*HeAP`I%+xq&SMfWb7@AA|ZVqe1RI1|5zH&}anK^5%3RkgQ!tKPi3u*%sT z=XZ2*;Jv8o&4IO}-&;_apX_z!!k&)Ahf55j27QY2M@R4+Eet{E z-{OIx{^hxCepRd)eM9OyViAtz&EOI4h3tX)kj~U`)6vhgdy8{gxDR2P3$iKCyOS7G z&X;%}8uP$C9<9uy4Q=_ul@us}9PRotA+URZ5o{g~UEwim=)2r}DB|z$4Nig%I0SlQ zl4H;!wEE~LpC zQ8(_5<2(~*qGB$?@q=-7A28l3#3S~ioY5}%3-Xk0O|`uEMtxtpvwb>gnAY1Hd~L<` z0XOy%NW4LL3)5#A;*)l**UPbrvO^594evZl?hW`07dySXF#n!T8-=t@roh)(o(sGi za;s(OH{cD{;}<+}_C>2(_z6hN#r6-w9(b0u`=YUdi9*gP+p;c?LT8bl|5kZ?6(W4ed1CsOn$=&>8TCh0E61%_jOujVx94~&tl59u)*?Pveb!gCk; zxDow&CjJL$(}7N#hX3r(+!*PFywoarsXfq~g#MyjME6%A@}OS4?Q8$w$6KCHkY-IsTO6*G#jKYOn}V>J5o3F{RRDh(_H{1$CYmlx%X|#v z!@83mI{psuMN^kpX)>${f{qzhU(}g-Wa4=q;z z1LKtENPs+{Oat8k!e;XCVp3F2$nY($tiqYdR$_JJ&eHd+>BU*g@u$q)yZm_os=c z9QPRadl5IodPTM4W!4=u)O7G<8pB?M&MC&8Z42L67yf@5|Eb5^*pH`m*!ruCnw=}g z2GT(PX4^W^7U*8C6H%A2O*uj)(yTVfbjLoz*`=t{4$w`?nbae-Vy!vFx<}Mgt~oO= z8J-$b?vl_a>(Pf&Z@8@{lt)_JEb{PJH{z-L>?-`H{E`1I$A8Mva^O$Je}2h-Qhsh% zG>hhU>?fLDgEUI+{FFPX$EcsvtVJrF)YoYi^C7Lp_`kM&=^^xEByS2G%KoIRYW~cy zPC~sZkiXH`gX{U#xwXU0@xTpiU$ib5quQW#_k8GCDL-je1L(l9l;gxqrH?(({pI~p zwi+XjKzhnx4aU)O^o1R#Gu^`Lq)(7O$4{rrMLM1pAnIA6>S-KhX2+>#D&li&(HO7B zmDM^;)RpZ|vz|s>pGY#USdFu#XM?`fLv@hz62TwT`P5z7)|qZ4iTtvxvr#|NWjDqa z;&wSE$#^;73y}|WQ@nh(qg;+5$9IxXp3)J=A?~FZSC*k~a?$2F=$k^cnKId3^f}ss zIJA#*uM+F>wa7oy`V9Hw?4Mz;Vc#jwJNORorH2|d+#^?tc8)Q!fAZpqy`a_*q+yw{ z%K77c%6z)@Zd5tzR5`C9--<&}4*Y*u&iiD(IiYLoSN1Dm-ALBU`T$3Yq zoP>9d)8ylC!IKHl_36N5Qnp~1MVikJ;vS)FD+&MGk+vP_UII-%bM`b-;NO3hljjRl zhox8#z81!Oso=Q^=#+brj=UpzHq)wRoe_Q~!l`#;A4*yJ7I~~ho5_of*Gkzf_G+37`>q+F%eoInd0NPmz{!c+&sNXI_nQR;Nx0F|z z7r&L@8+94i#mJ-F$0WyjdDg=y@NW|^XJtrd%kQzuzfJU8ikMTAHZxc*bOPHj9sgO! zsd%!_E&x56T!{hlcI{DJN94l(n%g)&SbMkA>_?da{%h)M1gD93&VZ1?oSwwln2#T1 z9&4kyme*sDx2E|hq$53t520@#MmxvVx%YM`Jz3@U(gfzv#uwTo;~5iihQ^S z`m;he_KIg&{g5a7P|}2QEA#pUbMVbhc~?UY#zd}Z6BoYD_8=eb#b>^~QBTnxoK-E_ zQ*e-(WNVM+AqV17w`m?qQ*HYCYS~Wet7`?1WUDse9C?f_5p6;lqD?4+{G5$84MY2z zUFSc}yFxfNuS0(Jv&r4=*#}5H6JBqCyiXNtSCA9(@xRm@rU2o&w)+8YxLn&7Gp%CW z6Yw$knQM{XZ*E_@8t1$*4@v($*Y$Vo1LK)eTWocGFsiP}G3v^*o?Zr)CZ9cz@xf$TY1ZD3 zxpU(2cslW%jHiJ;_1V@<=nG<`bt%ySLwS95te18;YoT7W}iUc^~bZe zzfIpQa+=>FOzXRJ5wD}ZYkxINbFJ@!=qpWg1L;W5KS9qu>AT!G`Yu(_(-ELu?z8?< z*L{cl;_13)9UXPu0zp3qcrQ!vUbLS3$kq;hR?fS&c92$Ip-i@A#XPD1!g@~Y?(9A2 zIh>`3eO-}yF3Vbo{9^05@O)e9xh$&^bt(pau26N0)^i1yQO|KbMe4aFs5AB4Ge2NX z1|I0U%qhkYsq6M!-~r+Nn7yWME}v@k*Hzo&Xj{r6O#!1_%I`Ly5UKZCU^&Ix>~9lnE1FWS+B zF;M6m)SYv4;*;W}BB3XX2S`0xQdB7PWO0&L=*i-wLZK&%lM0lc%(9L~Us6wQ2gc#} zaD;fzum+1~x^<{{;_NUy_h`R#zBlSU=j0I`?Uz$vCp-c6!sB5#JT9>Nx5rhLQk|xws+Ph(cK|S^S^g-A&gv|qKydpfs zO2w0N(~)cb8{6~*^usvx$5`}B5&E_;Ap6xR`c=?K?e%QhPu_Flfeh0g*#sL0{i(lO zEzbaZWx=f0JZ0adee!nHk9sz5zsUJ1``~Bv%kHbxIsy8HI$!Qz$*^9)xAkaeqs`A6 zcrjRv{J77>Q2Rj7#5=KMBjz&AiI6e)T4SB|^-Z9mwzs_6GkoXid&n1lFXH}J>_PC) z#U6x0v5zG~+}XwZUsDl>7~`*vk-pYrQ5NOdq4t9oi1!TZL=nFr_?393h&d6~7d*7r zf3Cv3&}UWRe}+|vXI_%Fok+~axdi+4F3eGDiLv3c;ZXP7_eS_k9S)xg5e}b<{Sf{b z!YdhnyEj;X^#Go&-ZuY@K%2`jbLji=A^aRU2LWc^jB***y{xBcv^}xDZGK%PbO-jeu`MKeRPg9wIGlBeBwgm&6$nm1S9>v(EaVZnURFtPHpR%p@AdhTgGTN7?(nPmWpO+^2l;`B8ih29z*uy8+ zZZ$5D>71D4IKgN07@kgB~&oAPcM%Mv9ufg39Yc~%M z$TeNAb+J5|FZ<;a$f25(VO=J@l{B~ka?E>_?DZzyc#l#(XprH^6tsult2cbT%_h_* z7wb=p(025>xu^E)`+w*IUIW|FOQ?fvcdD98NxK@`?SNgW68Ct!aYjvE&)Sws_=jL_ zTc3+^1szZ>Y5y?j;I6=ZBW0rkn!vD%rA z_A$;p=q~or8r;vI?R`GXM`hZym}ygy7V9O7A87x|hMmsS8cK)y#VRus>BgW=Jfr(! z(Bs-J`W$4rHm+^XTrd6u{7T&_?_{;xk|hsv|7j)8tm}uf{3_v7!RIG9i-tHM?@oDc z8tJtD_`4e_ajs3}Z6CKxJp30yThgxPn|T4!4`(2II%_NWVJP?^)#2&T=1TZ$5Z8$G zaoSu1f0j(7)$PthyQOWMcRooQ`x^MLu+1;2Hb>gdW3+efHR7(B8r9xrobgoo{j)92 z-D_Li6>TkSxBKur8}goevL)~0k6S7a`c1TZ^d8z;10NOxb)^qgKa3rurL=EmTYJ-1 zdpm!>QnvGD_$VFIJ6V=oTZr!0Cvax2T|Sc0wn1oHpvT88fwzBdIiz>_ z!<36j*jN7EU8`D>eQhmy2&;VNn1JqUt-IvDW$Fl77Gp1Gee^tc z?Pb^?qzHaV%VQ(XrMHg_^z+l> zc9fq|#2DJym~B5>-kvx0M;gZZZ@`Q934Kf(HTzMX?=IKL*?0Q9_YCWkD-{13Da7#p z!Zl-I3(m5N!Fz10;_Lw zT=i^AInIWo-qK~K^uF(5X{XnDkuU$tv){|)T?F*Y5OQ0f#`K(l=KU}28PANuxmi!3 zpNJ>?paJIxdhIC|KGVF?89&(XD6sPbc`Y8V@LN3ov-6Sm6)izsOCs#e5|a~mECcQk zI0Lj0I0Llc+`xx3Txc`*AgwRS81{14MGZSAS}nuN*SEavZfwbD+}%*qX;ytogaEWy!O5Hhcp9Tk^|CEgtBD$*4d3w*+<~$B_lEI7H-Jpl*zxCeEKa0qL*Co@VOkg~(It!VK$##k5Ca zO%!42)}n?P7gn~U4_e=Ht<~I;fpa1~&{@-=vpmpQ^H9f3gi+szWl++S^!pBWe4VeI zJ{5{S@|&cGOfUb7@%7`o8cIH@YH9xET(P@h z1pdpu)cJ5M&9I(C8Jr6Rg`Ur_4ijx8AINxI=l0At0-o89Ksxr`?n#$VUxmIw`P&Zv zuw@DAGs7xx_&iYAvh$GjElZOdTXZ|y7D@UoKzS82ZV2=<(to0@l=a1)J$3e9s^!FY z@-6xFYs@S8U*ct)`HTNtPjq3dVjr`QcHlqbUh_xNunma6?r)CZn7Q(V1zlQOh;qg|XmhDHuoi^5M}02Vf-Zs`LfF(W@6!H>=b~NIMUZ{) zT8cFTd6S2|;5XWoYbQH`yf^Ce6CJ^z&;xq@ks|H}rXEmhY1O$X3wofwP^>$pS~p{F zTOQ~VUUy2h4nn@s_Sj}2cTz_a4`Yrt751e3^-~>fpP>$C`Un(1hREv4S=Jc6bu@4Q^9??4)@|Fte^Bj-B_pEvmL=? z_!|zo!fmD9gDs#giXmCXigfpoA#sv*a&0!JAMKm#~S!M z-iP$Qv!&1DU*N6c#G)!+V)v@z{DJPkusrE{n8;WA_I`@;<^AJ0(+THO%~?=THQQM`dYS9kDx<)-v|_)JRRsmkODkOW zjmjx-T-rF?H(KjeuF0>$en-A9K%VpkYQmamPWG}B8L#4wkyRD0r8wt5ze>|)P8`}? zY@^MYh{N`eYom?5TTI%VhxqG-t=MC&MLeNLas=L~&ou^`r^jgbG^C-vApakaGT2vR zE|q;E`by{yd2g~F*CTWX@)x=T`P2S+8QR`H3u}@y49b#+x~V_%YeZNR!epPydmgAW zq@GBzhNB)%l;2dA9O_r6>eu=b**A<^3!Y*fn~^8$9nDX)cWHiN9P-oWcs7-}W73TC z6xyHHH-WB*^ZAM1;Ks?`;HM~yX*aO$cNniU!$(7}fh8ghaR6yH2zBNf!Pl3_eIjgM z@C*aGk9Z`-YKAWX+sVA@ke3gBFl@))@xS))7-PYlWb<^4sa)42pL5N0E5e2~V!g$I?TK z5ubcBQt*utAkTb-a%k^ZhIEZCoC6F@#C6FV5SJK<{BpL)JKZ`N{F0nqaiYXj#2p$e4X%_cUTShF0k@BI17REz#9vK*tg=JdpZ32 zHo47hI#2VZA1vDb}laQcfA?Wff<&ibER$&x)t-SY^>^Yp^Hd zisqyzvI6T)U(?Nz+*RWN!*TxO?=LFM|6nF$=TvX-quUGfKb{I%1y8{P6Uo}$)5lf;^tI{{}<7`{Hd2f#gK;luF3JsCVP z#9jBqOza)$t=3(tjr@-5E{*+sQ@4WWxjt-g-FU>f;B_b)YcDu6J#y`ZVaDk(^1wK5 z9C--mh**m}z$^)+?-Q|hBhp_VCw;{b)5|$#PPTbkD1Ayq`fXGG4!neYLqU4i)U zc^zWr0Z(&Hp8A}+h4^dRlsCnCQ*;``U_4{>Htb7e+jERDpRw&+6B~(gi~r(URXBaW z9M|>STWI+9tHQZi_$A}##xDuKMEttomw+Gk-}taM$A>fEd4`ErfV8Bc_L`wM*T~;7bkejz05zleR=rqY%9Jmw>EDv+Xwu` zxl}_NbT87rP~rsERPBqM2lru+9!`vtF6*clUn7o+!L+A4_k8^58S8z zLHz@$W59>{M(1yU&*xp?^2BO0)D1c^y~~ zU^zH@C~$g=v<}?C=5@3VkCr(tXKu)0=zl>${`$Y#hl1{}fK~foAJKmLTdC1Hyg%~6 zT<;k6W8QT}ANP$$V0nA{usrB4cY%@5@P2sW?171S9uo4vSsjj z>_(dbuz>>?_%IK?m!m#d2NCbOOnkqd-}#Po)A3!rBm5N+uAXQk_N(QF+KBHS(86!L z5|eJ#hJUcMc_GbENjJZ{E|PAcJYJ8J$JRqbc?{5bG{woIE>0dNh4bj6^Khg^^dHYI z(ChFAz*eZ&+I3hzTUcWb%$C5(5hOuCv+5dUsK!^DQ@}eyVbNy;# zaNTGl0cRcleAm?SXP>>2_^z^t6K4?M{yUEm^f?Ri`yFpANr(Q}c^+_6BJO;zy0f9= zQmn`R{9#Ka?3KYJ=gAegZ))_JGo^+dRVv?8MvxI8)p$<^OSf|_c?6WOA=UJDPrOIG`x6Pl1{+x<_JsI~0ofJSno9u7zg)UDKexvX! z1+Uq8h2wCg^4GTO*#Vbz)YFg0h?j}x-P)WTMct%7o+~x;$uwu zw}@}86XdrXhx}H54CEPeG1z!_o$o-Mov6DDZAbu5!q=>`w*ubex;<2=``^M&bPda^0sEaceLxj}^XxDYm^! z=@#bzIzRFa$KiziWj?v!KkjwqoqpSkH z`mVjm0old=-x*G%ae+>t737n$%l1-6w}Up<3fiPwj|#ar~^GWc^li-y^@X$Npp{Mb_x&BDvDvyYB zxrzgx5plpvB91Xc^3Xa5?zeM*c21Osed#k2P(J+y6LG(t!`zJi-swujU4UIMcT0d> zop+PEKrg3Qcc2_B5j1mvR!(aO+Efm?-QvnUWRRoaUX1+{ z^&a@d(|3!u3a+~hg}h5%OtW&3N1kEyndCD1ApS+Q9Ak;m&nXCw!~Bzej-P_|2O`Z( z>`7meEzio+{K9>+L$0+LDG#pA_!-!Q2>qATc-g?sbx9cgXgx^Vg!Rj(oQhbPR%y+d(tl z(-Td{Z%RAT@pkNg;#!ZLj+l!pI;LA&zXX4XzL4u3A0rRaF*ybu|G@ab_GW^P-yzL| zc$R~X9^BzaotPo`RF8p?Jh|)qw=3~o_?%KUXnT6+pE!RBv}0ah2zqh7mg{0E)?e?) zu^^hana^97x;&k&ms94%SmaBSV{7A4=5fyn-zSUb>m&~d`+oI;4D?!r@eg`s3&xY9 zu~vEu*0MhZKd#347II8e`4~r=`N&6NevDI~hpQsb%eK%ZM0Q^Az>b}-xp#AJF#&FWcy}M|m`}>>j9R!^^&T@z%4I>iH-S@JmUdqmh9(0{S?<<>Ec}#VWK>>QU7fsFUam-_d3x_CwkGqT7Gb7pGnH z-}S}K|4)69;>I4mM5BhfO7OLzXjy!;Sr(#YiuHh^Wd?Y9HtO=qCipRf4~KnobKuy| zZvnsJ9yRbjv09UOQg@_VZ}{4mdJ~M{ns+A+sC~HWMUromFOqzl{PT?)c}7IqSw?_k z9RK${1^*R)o(KNSFEdQ?=vCm)*}Elw=EtDP-tcC75$|GkL2oBOr*?rJPlP^C!dT_T zSnf1QlNaqYDNZ-N;=J!<^KUkqoUCX9KNPbs=(2hN&e}qqut(GX+42-~6zGFBn(Cd- zgW*dq{R^eP63(OrZ?&FJIVXn6w5|r7X4~kr5Olgw(dhz3CwFgSamKllMh@uLf+E9Q zzy2>VPTJ*o^_zxir_*ofk7zk=n?Dh4o`ANG2Mxx77Gp7n6#*y6yDqgH&&By_VxISQ zocUG7k({G#rQPXOl*730+{pRW-q0KM4f9~F(ycj1o13b%Jf~ROAw!hy-~iBB(fjWx zQ_y=;nt80Icj3`y6XK8;HNAhqelgzfNP0h;Z!EF%C5)Aj1A<;Kj3dcOf2NIAWib5;W8hx(db!4qw7$Y#-eU! z6L``&+c))Q@ap!(*t>s^Hz>xOVm0Q}VqZ1mp^Ym+BO$-Ql^brsyc6TjBTmc#mUlC= zX8EQr<$Q8Zn%SCY_%qfWWont$<54VrO+8)mtC5rSNHfZDcu^nZH52vG@=ZLVWxE)% zK59TWStrN^>psO+cU@O`*I|Zrt*y>0QRg7mDZGCs4I}?@ygD-6C-r&^13kq(-qD!f zK86(n8@JAS4f27#EmP?C0Ia``^UDNaEQz()7sUGKz@A8apMbHFdN2T6B5#fg_*wT!J>r`Ck#rD@3_C*J##Tm3Lq4^4yPn zBj=3T#^|ta7wPD;l44E$+Q6A^MxTCcig z<~CsVoub`gyiPpAwsU{`xuOnS7tFAR*y_;g@@377piPD~2ecvG)VCxHDW$qplbA=*30+uiKfW&~(!>pI)WAA~zg2chls&HNGV?~40MCp&x(4}yOt z&!HB!=~CF7akmKhIJuPl;joTGzL7L{!L}jGVg8dC7x^>aWb5vRN$_b(hELN4@M#)^ z{JXBavtjayt6F|M;p3LBwQVS~^x@<|&VaMK?0>`Itg@Hq3AIt$&U>N!UFZ|)PW#xz zd3Q5pbr$Rnjb(3*YASnsRB@uSs(FPszl6M0R*SGYgkfK9**g4xbJT37qe|<0t>3w3 z=Rh63sACiA$a`cBw4(s+Fwl--w8OoB!M$4`>x1f!HWwL2uR|{=88JC|zr_WPexLc& z-LHbjynW5rP*?ds%X|X=Bfi&VnKhyB-A(X>irdrVJrN>ZX^#+}mLqRB`pFoCJ!P<; zi0^fMaL=*faeQ}IL(|7qp}TK$7V@6gsuts|k6IdWpLHm{H^aOQ@gwTt%{1@T<<<2x z4-5Uz?pSuNu_2UK-TocF54L|#F>`fZUXM8_^gl*A+$RyvH!Pc>HsfsT(0A_vW}42c zE~8@|2HE4rXhU!N_g>+=O4B>$)!R<%zUC>q+|tyJamU%?W_J9ZYAd%c&E#F)vJZR3 ziYxlK?&rH2mZ4uu#l6aHEyWiuY^dnEvZWTjjJ_V&jZ3x~u^DE!DzBL_!a9{hjZ-amJ#wUGd#xoe3O49Zx$Q^WymO;Y}TF z2|wVDPrEJQeXKLkW=5L~aqXR7NL!Q6V=eNq+Y*Xllfk>^71#}ElX@_igt@}_jpaRX zZX|G7SNH~Uj+>lo1UbjmbA|L1!gB?-JA@_FT=q@cSy2zRA?q_~QxN&@NE%MN7u(pG z&4vAL6d4=(J9@S51bvBFskeRTH^V39SN`1Mq2{63 zYb@+bXrtbD2HQim-S(i*;H6FKi*u#FkT^%Azub!#9bfxtkA(mIESKDCXO9EDZ|bv0 zYp|z}ba)heBI;J$mGg0bu5YNBfVy#y8GJA5=K|YT3~=G>W5)*Wjd}|_=tG(UtS7x( zHf=-&d<$^i?TDJ6t_}pgye6=$?DJ8}%f1+evo=PYiN3ADejt{!0BM#XANoo&AMO!i zUY8)e5?H&~Wein&Hr1JL8R8rmo*6@%5bYs66OcBuO3V$VjfDFOR2c4wkYVy2>loGU z6UK(l1a@HW@5?AJ8+GD7cb27Xz^se3#r3tO1EcUxqvb1DSL{(h{c6gtK)a^47JvuX zpR_~LZZHtvh#~ezo}#=-;qpphulyY4RASx1Uaw{AkoSNDk@qCFeSopS<2b3cBI)u# zo-KcwPU0$UC+w=qWBrLM9rP2ykNh?Wd0Y!zRlLAA3TMCO&$|%!Y|L~8W_NW~T@7ro zC)Gz&j2oan{pWC zcMvTH7g*BQNvx4Wk5Pxo_D1?5#KPmLm>1m#Tj90fhgN6mGq)!h)2YXp$DyEAG5jV= zU@vyJc{lcRWc>6Kc;G$69fbYdOyhQ>f6&j7`jZQK4E3rvYDY*JC>UWDp`QXC| zDCgD>3vt&A&vM7Sc9kPBT4y1D@!0X+gC zo=Eu#YmL+0M}sF$5j?SVF4mI5JORuAA6N46XLw$PHCXCxw-F@^XQq&1)zp1@dzL|C79=DcbC< zyp*Kj-Xhe0&|SC}Q_0GJTq!TNDcanF=U(WHYP-&GkBBcX^O4{Gr_T5k`R|j?fW1fQ zjIDDE;E!d~8DkXHzU+DJ+%ZUAIF;|3)if{AOx69QxBSWnH?wIj9Y*svv z9CorY`WDLdNMhC;W6WoI@7X%khuEnC>uRv`!H=#G>AbLYtrKfUo!dYYH=v#L@34SH z{BE;|xDI!HX0@`MFXx2Mswjc~nj4s!`xt?JBlfe#!N;LE#K(Psoo~Ujc#Z>hdyiE( z&^PsP)V&<^aBnXR!pG`)?+DDN@a_o~1~2d$Vx4Ui+5*l18{whO6h;& z;`rUIFbFIn?h-GagERh-J^}T)ep6APl5HI=+q!HBbT!`ldJBW|aCS~(dwV_aPz9e< z7vij)64nD)dLGIw*#zGs_@H4uc{<~Y@^N1()=x067-IhVwDSL99+xMWI_rPfN%DU(rlz+P;;AURug1)$y zP3JfKO|GkZtXas9<;?@%H2t)=p%i=c9jiWUsT=%r3-g#a$1s<}kIY%n*7DU((qGb| z{zmwppbjg6^#$Lk^M{t@=rb)7(bhEUofWb^^D!SP5&Ob5M<;BCj8zd!UO&ziD~L-CTUnhP*F{EAQE`|Kl!I zltG!FNdK7_^4{`PEP2niEi}UCr&`ZnwU9DQ? zCEW&tZcgwaX}nSNU52>BET8=$*8k{NA$hI^^o`(G+zGx6m{Z<4jJv=Tzg|nfLEu(t zx6u5WWgUz>dEe16#jgiN@$1hhzt(mp7I}kfABH*)i~JnTuZ>RJ1BbpV1|4|*!H(Sy zaUU7m-39UE^J}``*OL{$j*Q}0AJS4UYW}@Zyk}WkMSPD{j;H2V?(HM}%EY%ULBB2d z-z@AH+=DJ@@C4{AbWTM&aezPf$X@2j$af^@TETIr5qqv&peOD!I}YKO>F}IBG92e( zjYIfO9d3(12H~@izsScHpZ&NL;k{9xPVs^(d>@cI2446F<1P=j->h!=*UU$pMH8Dp5n3#TFce~A~K zM?cx|!u9CaczEF(luf+waVSlywG#g|UU-vzF2*pAbt2kL*|d-bvKN6DmV#ED;e`~o zJsK|*2)t0An={(H1L-whm<4`Nc)=fy7Y?nJcwrjy+grR)zdei>-ntA`dz4T?U%Q!VB9$6Rj^w;KSs0#K#LeF^-8iadgIS{2s;&)uH); z#0%9nyil#?2mbKifR-9z?;X2^E5ePJEsFBV?din#Xmx>)uF zdz@JI1^Pp!p?<&%)fz99O8Y`J?F)TIhwy^`(Xs;~@WM@JNxZN+j(uS}Wme$@DgUwY zLM!l4wEsu$mW2(oyH>O~ira*(;WxywV}_sbt}sKjvN6=t#;_f@nSRH>41Q%}@ZZ`i zJb(QObyAoiq(kbYjiK6RV~C+c`dVkOJsmMagbw*sl@B|GO^5Wgjz`*k!3OrZK|{XNECDFA<(@4HtRHv2PA&`UmD-(Kd!=&?Hi4 z#K#OjVl3N}-e^Lc{}wl##X5C@8@^Z`8#hcrx_!kB0h~+4`Su{tOw0XM+qB$E+NFSY z*jFs<46lg(lenQD`y>iC{0Z}(;fC(Wlei&U@$7z4JllZs?YLn9;@fe< z&3KRI*=XGGRcjbGP(R1#S&18lE1u1X;@R_1mK`_D5%0k0BEHAE6i>~w8aG@ZzDeBh z5B%R7+(14bA?*ecIA93EFV*2T+;Awucj$0wXAn5!AcV)l4eUqahMk~wr?_EVmrilR zYRKUK8*ae;yl&9TjvMN1xWRL*4L5w75rG>nJ451zPvhW*&6L@_zzshF7j=;T^>;Ot z;w;6c!5_7h;#@*vhDOA*V~4Ns9t%7C01Vw3cK8bQipCC2dx;&6XPfqb9o|vpM`MT4 zNV_lC;X#~9MeLA){?R&Q4#qQ$9Y!HM7IrB853$4j;8QzxI1Bw74?Cl2inDD2=j8U=R1xg(>@ zi`0CH*r5pgKL9cq3LV~5IXBCvzst?x&W*r8h68y~u|tFS{J!ZdbRF*A%E93mX&kc&Lz_%{tS zrTsh_JNy$gvFVNa&g>0eVm#X$-LV1jZ1}++Wq0t~><)g~9X0`vN824vV7(&ogJ0Pl zFlWL29~B||;191$W?N&BZeQ`kLpWcI_#u9qjnwQoKj= zZ8U!Pa7P$Fe2M(x^R2`W2a7gmTfL(A_Egf$wobu01!?(?i0`q^##8gH#t)~9ZxTPe zf&X#v1I`5!c87Y}9S%mm!z3PnP7>=B)m*2@MffE;T;hjn+8z2Le7g>}#ZN`J!Vlm* zVW$xB*^k5zo54Sw;)kLhcKlEuZFhJQau~u7@R!nl4X`QH?}gnV6eq&&ut54XIM4A- zZAJZnAN<lA?ta+B2FBPM#W55sC{}jdzSo_y>b-XHZ!ywc_;0Ewb2fqg7F%RWyzlNuN3*&}| z=K(jM4$7|~tbe0$gZ~kQ8?Z)P62q_IF+r~^>sip2w0;D2w(H+H_+DVc4Si5wJ8tNK zccFhl3-~pJaf6_>98WIZ9>xvxncp68!@Ht?vaRY@B5}hGq_yLQ7V(~8ohP0i>o3Xz zeK>7?4O#f6al`$mg>l0lh)W-VEYx4Gr;GzlL+cbuU(m1N1JEQ=U&OIFpv@m)9P3PH zyv^?yLifNAEJEJpIz@cEfV{cZz&d+bAIQATuOUL-Uwb?XFQ~LfBb|_U`ZYk_C(^G0 z^3E}<+yl{f}Ch@|H_`f%Jp)c}P>l6`q zAr;|jog#AlN4Q$2h=`wz@K|_({Ybp_7kdXVj!6B?rfjb2a>=j*)ZyF=KjsGv<4lOZm*f7FBFu#k15h~_7 zH!MRvs5jPpgF4tSLer7L7s{UnU#RKQ7b*fHR3aVu`54x}>@;!5U@m+g8CR4q*EYo* z<2hBn#t1s?K&0h;H^c}vI48CQI-{~IZN!>yMg(-->=>aGXQ&CDCm$<)aU8}i_Bs9R z4nlZknOK*IzzC&->HE0ndq;S_7x%4|(1!;Y;b!op#0WgABHbE~zN9{Q19!cxMEmU+ z;aQYTjKDEYrb)G~!2b%gZyqqhJ^0UdGfiK#o6l>J1{eYJT;coZr)}XJ&`M#1dag@o zI%tg0$UJ)(!(POlS8GuZq=#)nU<9N;)|{^9@)aoSFz`dg9m9wb>gmf+>B?x;`L({x z@eg+gpbjkWMet2DMqnN_;1P`x9{WXNG}6MnvVAG*K#Tyn*c!4e^b@{hera1svF>fCaH54dMd?{P}E?iaMmv{r(yq}hF_uU+5HWLtZM{T{obuDtukP<~{Icqd+{03Co2 z{In|+z>i_MptJ0=bN+BFDG+{->DE=q5Bj!R*%hiI?Fw1KkL(T6H+`*2L7(tFioYT) z$13ed_M>=Dx6T$%kF^8oW+{7u2Voi)+;gg&$I##L7sS~PKJ}p9#JZ&87|?MS=2x$| zaMzcCyDpS&AU1dl^swoM>UcJVcQIZ;Kj6%Rj{2b%-_~xvE+G0y`8k#X5Aa>v4{EU{ zt?UQ&v>!yz_DELjvHs&8g%r%&UQ@4mb;Mc6v9)Wa}ZO}o;Ht_&u zd+p}fvb_jrNf9e`B|X8fv>itvW z&cZvffSosM;o~TIlfHzR*6S?}-iwMoqM6o*$S*!`rU~B65N(DpuHenEPwoWL41J|} zvq-$-{BIH8V@<&m`&7kQ#~KSv7T+=j{i^X_(vLo(k_JzJ&Z4iS?Vy^rgAC+b1iJdD zbEGZ6PuoEsgkP=0r7gfu+d(&kx9MS;#R`s*5(k`oN-P{OJWw;hDR97h;IGQ3uLTak{g;$wo83U;fRBK0p>V)y3J0VD2MiDBy4i8S zEjWvcIG`PTqIJb2j7=H`3?RQt98hhy75t|-;6{{V#{px}m*l-S%Fa6r23 z>xu(tEAZzU$C^{s+`Iy19Rhx+xZ@Zb4oGj+bltI9;(!BC2Z;kxJK_N3QG@a|4tV6J zFb=rqa^iqf_J{*+TN)n+aNOs)k;_3>(%D3P?Yj0fw$+9M+^DM^2PEKK;(+u>9DsW3 zadyt{VH|J;@{6x)B@TF9^i5yuDM6nw4)_^q?Kq%Wyr)}diYLxGMLLZG`XG$$U?1N# zJ&Xf>LL82*eNb;*ztNzhzyY|wRpJ1t8;Aqm1U({kLu?zt+rUxr^uyorZSCer+1?`# z0R5z0Ak8|Kb%1=w!vQa0ZXJOGRNBEvN7)7)fCElzl{g?3I3Tucm*Y$?j)!j2Q{jNA zKWo{RIH2XSFb;T7^pnH^f8qbW;(%`+P&lA$dQ2R^ai2KgPxK#o^G7uY(0g;9$9Fpp zn2mbdall!4mpCBIn*s+2-jq0C?ba|3cpv%2=S_(N(h!Gxa@uPmZCK+-GaC-@iuX)w zwTSPrPQbGg?R3M2rE$PS@lE1@RrtR*I3NxA#=-%;5FQH$bVYb99FTzUSU7ckTD|{cQ{p=9f1VV9$1wwlx7sxe){s;S} zZbtp=Sb%E?8VlTel*9tr@PB!9UDt>;gcGNAzJ~A)V*E4<#uOVE>{M6n^ z>~-)*+6biI;!C1`vaKfsjl%P=?~&HNhR`J5Gptj@(_{TYS%_LgNX9pf5pJCtUPIV~ zxU|P7qdmHwLqXG6YY4A`CN_QHk7p;KE_e+X3p&H^j-xYb_+70bh<>x}jpVz{W>Bwe z268X7kaxL;a3t$vTSE{$DCYr~hYT^F!Q5M6g?iz0pwjk7x_woSHqIJCBl6@L!f)tH z^6S6VTtVZ7C-L2m7swm-H3af=G`}`-ZzO1>*ASljHN1vETo<2TD3 zr}joBAe?ImA{=%A5e~b-U&xnh2+{Fd5zaM)==khM;)VCYKb_)*q6D#quo_R`1%KFX zkSXj2<><2*b_4%j*bPE)>~;fR;@GN+#DuEyskFUjw)zqa@$RfDbrw}EbGoX0T??uz zaekHI@Q*5WdaEj2_l{bgG@`16`cl~!nnnvuQBV8AB}azr3)S=I9&1*h9ooK-f3mbM zti~KupSKWLXKWaQv)BSFj175s)~rhqwuV*U$x3{4HM_j_B-qlVhn>F;u*{Z72XhMF~Da*oW)R4 z)Mdjm)Nz@rUk2*M`lRD&*F}zD0(;ckY!VT=s1kY5Ceb6@PGOh89viVfA?jn(M|Y_D z0DlO5q|^V!Hh?avD1STX%DV8pGOkku&^FL?1ixn}x~1c(+hDg>Ov8Cvv{!5de`+1I zKgLRJuh@z3%CghBpTcjqSJVMx?c=(Iz$GUkKZ#4^d?^FG!7+w)?T0$91bsNRYyXCu zAV0(=7l+cNT7|3=;u~o1l3qs5Eb%VW{RFx&{RE@~EhF&BP|(tjPc%KW-J%-#)M8%+ zc_RgRvy8r)M{*QSsU2zdSN4Jm)O8oee#SRQ=K+ol4m<_k$C^gqTgltHoHw7B_KY7< z4(lPy>DAGufqZMgZ`!7D-e!p%X_KFMar;tTzlWh$?BhXGfBSflVokX(zFp%i)PZ)5 zi$Q<(#~GlT9lLP6D@X~iZ#3ZDZrAu2@5C~)AJBG%U&I=R=tJ4RhyD__ZH#1|aq)|^ zZQKsIAWpeV&?;=(SdFxH+s55D;JU!OyNOzT5KFGU(z zzeLdUOXzdnsh*9#qkSWmZlbN@4kdGY)=jZ(Ah&{7;_0WG$VYjl`CLdu;Uz^zFDQEUb!Fs5?Zg&He%N+lnZ{##8dOP zU9XJB*=xjx>=&(9lA5(%k+gsMqV}a*KzqvT35*B+=9{>xJq_4AhFWcALpI@t$dwh$rqV#FOnMKe}yplU*V| zX*VfGoM^krqtF|IA8a^iJ>qqbfotAG`0+a2hJ%RJzt`b5-1HK{PmO_tsu8|~`U-XH z6bFHh7<)|i56;IlV_~6jN~UAjPC{6x6Wd8Bj@@>m@sRHj+`D#&Z*&Jdlvq$zoah2R z^5TB(ga{nO{T(I15yU}#4-eT^{ExcQB5W%=Pn5Qmi2WTl|IEw4k9w{&QS1wk?Voui zuwah+?gry-tEJ%Z4_j(4`L!kY;yZCRP*qFQM<0oE!#STSK|H&S>ZNQfp}nC^(#8_n8wz|#>Ef4P`9^|d}hnK5iE z)%5drsQu+9s`5o1Jby~1eH&@_#m16@bF^r)t|0%T4V-WN_=BErrCVnj_N2@&U$vWn+=&N!V;G zOP`}I!kJviZ*OfZqrR6qpLUBQFO0CURBIbcleDqaYa7czvvV8E(I}rfyKsu6^$^g; zuCrUgn?9SLW+md=Z7eJCZkw})&yzs=we75W%BCXxVLS09G+%4kcJ_$VaoK^4ds79E^Du)XFz%`jvYoQ2Fx2i=RlE1#Zz_!1` z=BGKEGNx>@Qg6h@AJheN(dT=kJ5EPDo2?}z_sgVzMzsxx#E^SwYx$IUMA}*+elQ|C%Nhj`rI;p4naVg|9_Gk|dJ?-1br%r6^eR;&yAXKXoM+D{_L5Ai z`3ikWJ@AGL{uyXLNnp7(Z|0~cw`ez)(x~VkJquor~9cj>45g1_? z=0bLipy{CP9M>>U`e(rJYAxy^`r4;3Lh(rRM>UtKKv{2M+^t9w{uu%zz)!AK=XZA% z^+<~K67pktFM@A6_-P`Knss6SjHADm7>%}!gG=C_fjTHZ&5*8bf}dts*QQwe-xJ@C zaVW~B9b@DPl4gTI7rUO_3cj@aXH+1*-H!1n-i3b#=l~mrzz4#HA?PgoY*%yGhLMc; z@%5~G|4EQ~75o-9VegOv+Y-ZitNy&O$%O(+{WO+uHLZWn1}Y#Ki$pKBYZkBhpj8 z^TM`>2-!Xn{AR}iI_=v?N7)7)YHA?cv_Vj|*Pb6+wsUY+8Zli3>8bHQ_)Xd}C9M{L zR@zVVNI`dLb9ey%qiqh#Pcy`qkr*Jwy7q3#m#?{E`)AyWJc(WJL;q2p7oa_M-kgN* zb_@{2yWQTf9q+^d6*k@!wg$nQ($+8yys7;(=OBK3-jue6RYGrMTT7pf!~kC-t=-n} zPw}2wEGM+Ud6085%`i(#|j*@uKYv%1<)_1FS+k<)0CO0V)x${4*lP^yLUw z{uvSRA4Pbvv@=A+XFn1HT#CANiUC}>!wa;HHTDlifBi4VejjWH6-lG2$`=&m<817> z7~tnYAq-GIzifnAfja6nl;+8?Fu<@tO_{_1#gwswuK@-aMhs9N%SZDZU>f-?i~$-I z1~?1fGzOT7|1Y^b92dlXPRt#vX(u=bb2ZATIA;(0Io|?S5k8tO-b3TuFcWoHGwT}q zV)(T$hQa`$y&4$5{j?LjiL{0E=SDhWfcH^mrR&saA5Fiq6JYK-#2l;27kSX1Tcur# zw5wgGN*_)5{Ywns0R|Wrs8DsYV}LZAXGgvJ0C=Pp^`M=gag){)Y1XUcb%_D$BkTnG zhyf{We`0wic?s`UIfYr!PVgOG^41hdpP`+NzII1a(0S2B&3@}||0Ds6% zATdC--m8&)S9}a`2+Ae~$UjcfIS+KP>)GGHmv#*B1mfEo57z30ctsMj0BHq)jKSX?wwHQy0 z0Rs5XcCe2R6!I@IfE-8Ctbj->>-WjI8Uv(AAI$+$HxL7yPT7jk4Y4u6nds+u`r#CO zTYG+_Y%2`lx7h+>$hO1)4M***dMrZ9lmt1V?4_gWzxWgBz=1~^q=01q%g zY}xLIv(JbDo&fE%Y;OU-*)hOE&`M)~BLv+g2Dl&p<6wXgUn&d`;>&C9)EHn|%r%EH z({>(pE8guGU>n{g1_<+}zyN|bB?g!Z-qaXiHsZ(UO^E@j zgx<)u92^GtbnY~l{nyR%GuMv0Z+%r0ds(Fgq(X13E2XSE^@EN8Th7gz-jpZ5`4a+ zaljnR$714uZ($2SJx)U%)_fDGEB1&3kd8QDJ<6;s>l_CZs`5iPK&5>JX;(u>$UU3N z7ElHp@C|f@s+%1LcyK-)aR6;}T37tLQR|8{YYqARe~1HmBR@M1_$T_3y5J4WsaK*6 zb{sHhXdiJvf7VTOp>ROXNOQBA<8W{08yH_J?y%ti;08_C#Q})}UPOKZ2Y_!n*aDD84a(Oz;K*;n zIN-o@xL0G(I3R0rd>p`WpEzLnBuVFipo?AC{sO+VK)v-| zh@IbsaX=#C$JezI2TVno!~w?&`h;;nDbm_;z)j*k-TGa`_gD+@)HvX2{AWAZ$Nh!; zOB~=6;c3>>BCW&$4RiHg4TS@gZXgbrLD`DX4Y6^+O!RX+{V)yR)^3iJ?LFcE&`Web38uiYG5w)e+5X2b!Hfks-kH-q2oIN%P@ zO5=dRh(}$(^?>{Ee_wIHyhREJl*PsY9QTO>{OCXGfLqWWJ8zC>J#9E(2j1;Cpat&& z2iSO1-~hp!5(k_F-qbi?7UIX}O^E}Z5qcxrT2dK_1OA1yb{z1Tc+a#Zizn=rj7e1k$#eX+5%={KBh2$*slp&fZVUSPOb;cKpnUq0F1NM zZVTYMUJs~Hd%Ix^kbAp}BnEgFWk#xne$Wx?xWJs@IV#=h>?ge{<+wt!y9&yE4UKwnZ1#99yd8~Gg= zfc7Yv26tKEzg`c>W!=zjjtf<2H=oH!16pBjD)wdgX$#naIf}vn^4td1M;ZfM$vkcA z0fN@G+4LE}e$A2Q4{DCX^?<))Y~^}@z{$cE5MB>h^t8kPFCaf@3)u5|z!6`EF~ER1 z;q?H)H~LISX$$acTR`T*_!!_|luZmUY=WfOL7lwCJs^B; zgP^kuJLP+wpG4 z0KeniwjLmOGkQH>3V2gvfU^-lK5t44UZDL!ZSM|Eu@H1`vv4w*hGX z!tw=PtO;a}5NiZ?%@z>5PyxS)Ri0NeqO`fA(2H)AC( zSZzPgX~2*`%{rIZTQP%jckmThBN)Opf|$7A4B(vT^Iw-uyt~2sYgLQ4M{SFvqOD~r z;%Iy@1^>BEgnKCp*oQWZa2n=nF)>0B_EDftC!#)UW?d1fM~;$uBrZlkI@$^T&T?HR zi}eDp+B+f2w_$`4s{D{1QE8t;+SRU;TetIUr?QjPo(bWrk2QlK0q$L4{p_}aWSlKW zoUjmlq;<*0ue2^n6XUP)EsVekjwAMMp9K0@;Dkh!W5)>}qi-cn=#4!Rt_WMfP|5^w z!hlekR4WMDR-lbTu|Fam;gu@Q3bdVLNISwnuLzv*Gv+W6I6=`tO_Lo?`Bcko9^T@*bh5rO#nVPbc3IA3u;*#18|9plMH70<_fjgxAPp&;t{dZ$Y#U7!H1nz!EC$Dx{+h zNW~rp>Hzu{1i(MsH?{Ws*gC+C^UH`Q%0V-&0~)}Cc06$4+C*6or{D@8xV-qUaq@+GFY0e#ATz5wmA^XrkUgAG%VH|&^#{46m= zm|q2^5d13b3M0X<8dFR{{P_GTF~$8t$7EYKuZ+YLZ?P`6Gazckd!{v1JU!NjUG%#RS1duiqhsKNyAfWZ!)>^Nead~E#Zfq90m9FUfh%rA z`27f0*r5IAI*Z zc>bdpbAS;_d1e6Y2vabZQy4+)w}c%*?zfx^I|9}{#-R>8{}FOhuk8r4aqbh}HAcu0 zc7#Ow6o~!a`V7a_C^P!}M^V1S2(V)eF^^E?i#&XZ>WsK7>nWt=8F9o?dvpGy182=q z)=NPH=mxRZ`-6XJ-H>KIiEy=+;J5n}IQHGApqh4szd#o|K6nRxDeysz^B*ZQ#0Py* z2bm_-`W@+c{^KXWKs{ME(3(2y5z%)ZYbU}$E6i*2WnaOL@Ezti3Ll8`9rSsP8XpuR zjnTsxs?UEUU)+K)>}|EUhV>lARG#@LWPr8<+nJB^S4a#%d?IWI;FS*JKk~4j`Iz%h z+xUMr*AGr@eOiwF_1cf14z`2YkZEl@=z3fHu|ET4bL>C3NYW_{w6N>auR$}P?X0J} z5Z^xbFT}fCKgeh;x9^7(w3TD)=6{FB{vF5=S{>#X*r?a+U(!M7v&tj9@|qX<0^ zd%Qm${i}6ByP%!Jnjpebt+gnVXFb~Gc$pmM>uolJdgU8rlVfQ!coX^9WtsO{N6Ydk z@TVH<sax`{omvz zw9_40JCNf#?RBKz2lyU6zSECT^tBw{{j?iAiujY|cwJAs!7_Dj!vhGvUWa3R7vb6a`dxOZE+++3mne9urBfM??Sk$Ws^(zbn=XwLX zlE$^xx@LVQ@?Vy2z6YPXK|^|(Qun)2wgc&ttzF1#GTKSHv#jmlu}?Iu8-Vqhot8W2ik{ zgG%=_(y`ojml6EVWtcL3rscxB z_4ddKbbP0hn#JZ85M;9MoI*nr*0*WkuE+j%EB1IBm8lpLRPVzWakX@FZW$=t@>Al zqaPx0+6|aDl6M;iu-zHf7R)aw5A1vLC+Fpw_isWSvyzOV%$Iq7j{J1GFOiPgi&vX5E(~?8Wg;)?%L38_bt6q;;(sA)u*bRfGu!5m18W$1@Kl4`lxgM8W^9ya28<@XY^(on_8N_%`_jc_-ko2 zFKq^1Ca(z04nN|?0Zx-~iTS^UUVIBYI0toEg1s|2;3Lo>_{Ri|%`)WNp?0YGDe@s7 zINZLen~>%pq#;)J{km>+W0G&Qk>DFm+}S?H6>KhY1-GFL192^2@#Zl_!7W7?7Y}yP zZtZv14G?-WXO>|)(4X7Z8D%vwc4Qg?A2p(!CX};jLQ(MBgv;}jv7a$L$H@6a^n)+lt|!ng z-KMSR3-STm6l%{pN3i)_M{t{~hnbV?n|ck~v(6jb@~$`7jBi`;O|;3;U$zPL5^X~K z>)56q|Hs|C$46CN{r_iXxXk3nEmuHEP&DC=$W1^dL0dpUMeIfUl%P*7$i;iTmxZiPX%V$Jo9_-zZt&d`D|!rOYVVOL&gJ;@9zU4 zd*PgA+uZaLZ3wP}+e?SJ>B{ytGs&En?x&r*?OO65;cd$Lyq1u%9fw4y!K z|MdoAJ-nQHLhpL$3FcY4b{)@^Ki9iT>6#j|f^4NjPR2~l>5RE+u-38<8+T#jIoD~r zE7R_c?Du`D-^som&;*-HCBE=~JX7<{*BKZ3ca88NwvWwU$8VzN#(a?K+lsv8?5vD~ z%r)Qa#e8Dcn;BN`>t?-He)|iwtoq`Y$-E%*NziOpXni1c!IIB;c2|lqpFDP{F`vjd zOa0gRP3B0a=|@XWGWnj2Uv?id3;6-=WW517%6u5|1DLBc=(U9AlQiGm1GKHS>sz0G z3QRX-+UBG6j9~|d;Gs)9=)_06pSDEC()Vy3`ZKr`KIR|sdxtTvKELxZpB;V7PbvE# z?+!9PIzVf=+r-WfX=4Is?1Z29`RtjuHjr8459X6+B)^zEBTXfN>QUZcL4vUtD0Z;< z8?8_0+S==Hys5vxg@)*_kG@Pc`}r!*!u$CGzlps$mG8}cQhv`YDV}e0p9%>5$DzNc zM;Lu{=jeYM_VJ?7S9+PG?^n+lW4<@a=T+}a+p}u>G}dPRhB3VNsi*Xd+^;X#^iR$D zz3IRBgh$WQS_Dt%{`$lC>L+=J&q?Gq%hHsBe$1B;3k2qMZC%1te3CMaVV-so9eRoHn z+rET{NSmG(?hAHe&(@l2QkV`r2|dw)-_ZY5@J{4-oM++oUC(#rmz$WLrr{6aBb+e( z2TxDW{F`&z=5@<|P<^T%rf}dCSU(u7_w;G=BW}hAZ(;0|Z)e2b>m>Gm+p19PUFH2D z_O9~&SoRd&mgPgtVg8(@=1<-?6ES~&4sWtno-AV=Hdp!Rms*dQ{R;0BXAb9&lY00= zFH_DKp9?~mcIpMESNyv7?FJ@oQ8F|9xl58Xa~+eU=VAwzKlgB&X6P<{)*k47wllY7 z@4LAze|ayrrEn#2PJ42rM>G7nkLmOE_#a;)XR#Z}4>u}VdxE&XT2qwJ-cjg?oqkB! z6F1Ad(l{f8Oy$nVG3+Oa&+@zIjOe(B{|!H%BdR z)zRmOI~9+Ed{>%0ydnPur)XDrsO5KA3)DN@E%JQ_-zA5&mphf=dmPnjjg!F|=Yp=* zIF%af=Z%stgt*fSv?n>ql-`Ct{|V0}rh2#VhadPH-^DktXPlljKew*3?QRC2BiGv! zHxQiL1dpM3R38{_)0C(G$T)qmRGC2R+(D+tzS{d&<5M?)x%xox^1=i^R*{ zy&D}bE8yp=h*RxXd>OvwENDus=2qmjTcZNy&EeM4#gS=Pwm^W{1?FOH!<=bC*x zleJ`IoKy7gdd0Ko&j8=6^j~5ypF(@ns_%5fC8a;f#LwrV16QI8R}goZ<3%^3>d#8( zRH8rMgl?yM{%`i!Ejl1NB=3BZy;aF=>wvdSFW6MB*ukEK&4uQBAS=P5@V$QLbWL|Q zJ^0uqHs{WT4n7lmbgD5<_Z^~beB(eFeyV5mu3**3rr^da*9L6v)4^lt+xBZ)pWbNK zCOU^0Ysrmo+IMF^C%$sJ?_=sJohFW>a-039n|tAM2Ft$N+QSw4^%^;F7vARGv~aBV zp5fXy@tdUn4t^6}HmUVNy06CI#q`tDeO}rwh-lkow*BjFv|UFT&js4WudKSd`IQT_ zZ9U9(%XyxL98>X!r2Sb66VrY2Jl|g&$Q^@dEI>;_*x%9L@w=p=S$$c213_&LRwIG*@6b|ia_;P2rq!+Pi0w(ZA#*Parw-bWn}2sp}V0reL(TJAZUZpdNkC zEUpcf%{!>{Jc+(mldCm+OjnqF%@o>Q^mPJdG-Ty<*msYIhoj7c#~F*0_+l*){qIlz zKP4s=ZJejme{zlb8dz(bqW{jGvi=&#TE^w;IMza2+K{%0W6`$cnLb9`So-Z`{B=`4 zhj=y+ogZwD{bJ%sPa=nH==R-fYl9QYn}Q<8M#{;#9vkwrAwSWB-_P%8hZmZ%`6K1q z$>!CL7;um>RbYUNHR2}6)y*qRo_6qD@u^~~*ngC^H_e=c|9h^QF!<p(*TN$Iz)wtQ*C@ko84udrJ1*Y|3KO zhppSbz#kTUSR~JAGY9$Y{~z~bI}hIb-lz7N!8x{~b^BRE`M{Jp=-iy&x*r>H=-&5c zIE>%o+Z*jc(%cOw$P>>*`Kyy;B1>~cn+8$Yn42a8+PDU z|5JUJs{ib-nmkF&$Ht$XKL>yLy)^%gNjCpt-bwR1a<=wAj(>Bew|QZn_sj3I|8eWv zn`E!?RpzNzZkXWp!oR!|!2A7)UN8Kr&$mwUzINwiue`@V!#9!q-I=_%z`IHVYxzG@ zo$GA2;h$`B2v(I&lX122e^%HX{5^($r0(FaO9|~ma!xFpbM}n?UYp9d-;=TX1N($x zcVpRNmH$~TqNm_J?Np7HAD1K3uqHm&KvbK;jdE$3{GMV_BiaV$H z(oNbwrjE=NvWNNcg4U<~v?Fa6ggt+s=ViU`^*`?jOmp<9nl5)UHc_tdf8CEgf8JQ{ ztif7;^z`;ktb4Q3(`@wAIqZ#f%sG>k4?zFMf@Nj&%c;4i46$jqf5G_L(P7@%Fkf_i zhhRN&lk=Ic+qK)B{Wh%g+O_#N(++DimE(c6Tb-QGxES7r&rFTINpi~l6g+-J^8J|p z#$M=ok>>`% zy7%_tJpjB@>ykSMt(UcWA@yIkI~(mk;B5ci0mSXdPkVu9ejGG^)r-Y8`&XD0-Y0qffc)E4LDZw`CY@&>c|Ex-6k8OZ1G`~PL^?cvR zZ+p(`t;`W;G7w9>kw`mzeO{aQ&e5T7j(l4BqxaXNV)E zaZgL@f_mE9P9JPNHKrTSeA!EqGbWcYhL2Qb=|3U|&WoPu`rF9l?fgW2o>NonR~Zk^ zsvN0*dc#1ubJA5kw^>j2z^ySDKihZ*h{$y@a&73XwOF!uj_14sJfy#wrN4HEbG^jn zd&29K-kN^>O}%uHmwPyQ@Zo)i!`Ya3OPKsGVy{qSWyzlJUipq3kKJm@9$CxpNBJ&$ zkM+n?`XO>&FJ<|BnK@32PEnTMXGV?*bW5eIj1hG9yvh65C?o6WyBHG>bKePY_#?(; z5PT2mJ*)9~#$^JZWo%rGjq?UqyRmr?dJU}QhS)M1o3V3|gRQxBK^n2(XyYXG|H5D7 zIQ^x!F;078jMHDB9a-l?v(87w1 zVC0*Ld_}f{!({u3ygv_Koi{j5xf*<203CTg1HC^*Two)*e|u-TUuNolzNPyq`p>a} z&uj8pexDFcwu9T-KqvKIG3);UISa2Iz6MeL#`u?g3&$&;G4->xnyOwlv=}v!&&MnJr(goY`{n zPwZcRI1<*9z*85A7}n<)}{5YD{YUZdw zJK5dXDv)H#bFl$*waPgJ3!R*9?N_K_#>SkCdUul;NM~r^v8jfcC_z$WY| z#mL0w!7(X2Rm$?Y(JZU*m*4mEUG|0)Rzpk5j+L_DLIJ-C{%+uZJ$91J7;vt2;+No@ z*iBkiuD98o8||DAyPJN<^K=(DOkW#@S~zU*I}o}C4i9QP0al4Ts!y~oxEFieOTER; z_H(ARV`6IQiw0)Yy`8TxqfRj6wRms~x&9e>x6PZx0cF00-d|_~JdRp-vsw2&>iz+F zPl)GTEY?_I&tkhWckf}0?EELT_e2KRar77LRVZx8P}uNS(NELnFJ)Pm7-_ zpJ(yxDD>_JQ@@3L7BXMiiHqF}rY=qzSd`XJYng(-0v;X7W&CC$3#%`}gN&c_XA$j7 z+d-4x>xfl!#_x5}_+@N=6~^yqli#HuwDCK+JN%-n7QX{y@H-)lU$HM^A2-$44;}ag za=sH^aE#iEP4y*&J-dssxR`Z1esi+SNj>>(nEBbxXZ8E};zN4^Vq;4vKg8y0e0Z3) zAQgXWagwvh*$>PISH(7<^F#x5HrP`eH~y`4L4Rn;IY6;TnJ1c%$8mh5525q4%fLC& z(R6$}@r~%Gp3eBR+EW@m>;cGcPM0xHypd&Kow70Ji5sCMSl7Zl@g;b761+PF-W_G0 zI38o3c&UHeJn?nG7v_oW(COYh(S~1_vu28%E8ONYiPg&5W?GaolR{;TIcGfI1>=sY zd18Q1<_QDiIR9tr&g1Yb^Mt|xWbvUTH?jS2xuGW_wwLhX~Hw~7~qJ)EQE|Bd+hsbEhF<09vS#W!B$NLBdr zmgtP&1Xyz}bmjBX_vG9<_`~OHp0z-8(s^N64gO3<|Fip~6{UbbAK(YwY2uG7+@7%? z3x9IqLE0Dm5t$63FOS2^FTkNMKi680F<%&XY4ALO@@eq=#pmz~Zv~FDBAHvB6@K|H zK2nnK%jYZp(E7AG8^Pyvo_ztm*CO!pRq%2Xc$o^nC-6O@@(T|ZzbUjYZ5#aZ{!7|T zqHn_cVLtx~dCR#tOYS09)t{DD_N52=KBvq!%4`FtM1C?R5|8*9=NXP72eGNvH#0-~ zt@~g|l#)+UNLmg0V*#v9}S*e<1H#AoKMo&Rb@`5oDzeGS|0;FA*5%kce_I`X~*o%5aQ z?$UX@Yk}_`&K3;B_R4tY&w9$Rmr2fpF`>Qi+2lKNaem%=-ej-vuwBL1Gki}`)-$ps zkk7fpdVj6jS6DQ9bzsjDU(n`}7;A=a1$?o7o*2$gt;vr^`XKj6-6?YZRmG1|9x(3C zsX0;d@t$X6-^CW%chRXMzDwDv8=8~xGj8Sk2D^4-`^e%z;qr>$CgS|*j>2`$vQq(< z=Tu;dt#Dnu(w7Y1e^ORrYh|mZ`9%&_A%`jEZ~wt>8I<4ZkbMc`%=BlI&~f_k4SxI8 zP4{|d!K-z*GPkeVBMjwe@|ZcAo=4a6Bz^;Zi7Cjw?0{1LhfenfKt}2eAt1^5y`%v zllMvbaUr}558-jcXy>L?-^_bgS#j##RjKvvq2BkPTj*{fV=wVFiNP8BGU>h)=pWb@CxPRi|{48g1A6r9tS;uN%ihTbszHeQX)+}|)h)c3}qjCYT zzw+DX>66G`uwZXp+q;K?(A3Oa0IRqMaufN5^M+{sf3@nH&2o3-FJQxuXm7gAC&=Og zrElsi%wyp2W6J-hjI=M`7sG?d>JwEyL&Z|$yPW+J{)NV^{4WIOt@xt!-v@>g&pT}1 zlT!Iu+|at;dT!j4Qu$ae;rV8sf7+LGZ&&>f`{*|I(TPXBnTDQ#@z}ha4VkIh>195zP7&%vyIa z*DJCUJJ`0&c*l@~c|rDv%7_xV?=2{A$&p=GTu7oUGcfN;cZp zvh^g|7ryM!kl3)ohOgUpe};Zbob(v9zF^!ILqq!V1^(wNdk0RI{qIfh4V*0Vl++_H zd+AM?7wTnKfGt-U^{u*d%(}){3vb4I5ruA7Hgt07uh|#xc>k?6BwOLpl&i*EDwwBD z(m&!pmdJGwa$V95xjwt!l52)wC@gE*4q8 z$?pT&es2ax|3IvMv9cdSrh3`C^UaDXmVMaV5-6Q zK4{9Bi*T9-y=313?5xmEY`&*<`{ETP^Ea)ixMTI`N9Vhk7c-d;Y~Z}?l^p-(Z?O&R z@Busb@#I~KHgy)ksxw4$HaaPrsm=P*t@OdLPEp>lQT^WNT^ua?}jk1w# z{f4%bUr6~alxL6O4yofzDIB<$db9cLvT0MKkKtG&I(8m(&FiFZ~ zL@8HGxzi84&Yez8FTfvpc&K|yYMC`Q&6+KJXnseF(gsDeL1nKCd!Or z-`&r?dqsjLkd%2k`0gl8FXgvNe|hjW_M*qK7wxx|uB){@x^9R|yS>;}vTmtu?YdFB ziUXr4Gnc$kiDjpQEBwWQ(VW#-TV4~aEjbvJJ*GL7%b~pJw5NK_x<%Ei*G0-j&e05H z-Jh@Yu1zN1PW0iA_&|~R@XaXt@NSfHb10|Ac7)bq-D&mo%JtXxw)qQ(vUZoV;&!(m z`hIXve^u!U<2s`4Ze*kl9%cR!I~4tP!?%sNtE`>mj_3GM%Em5ceG-tIQ|u9KWsa!R zss`zcBu@r87#zxJp$&V)-XGw8@|zlWa2*PhAI5f-Bau>vD4S^xHxXnN9&0b*3%E#onv$|lN?DaLkB}B>wyb>b4?}HU z;h%k;O4(!kkhtT${M`j_&H*V!pV|jBerBKbk_Ayu@je!adS1+$K}4};m)ix@xyf@ z-}fWrD{Xv>Hbg$sj*B*i)5dID&YCK_t7s8_Ptr$``wN2A!bi{K^)fFE<-0rw^B2f@ z>dW9m_9Nu;rF@n%S@JoT&oVY5Zz&@@TXWs76L%lK@K&#ip6#z)GW z(fGJcJIb7-{|sz>n>~k7J+x%bT2wy5=iluBbN-8m1I2KH6|Jm?zoNpQ*GJwfL~ zv)8+rC$dk^DiSRFrHN(4wkjpIRmMEAh`$Bk)%MiXBKwht-pkhPMX!TVcKp|w%o$st zEi#m~B5R<^o9f4L7bMl!U&(WTZ?O8G(r(@qA44!n;Su|`3XhCEoJw;Kr&9KCX7|*R z4a_pj80R7=lc+msPyME48uc@$8D}OuiOOE0&CACez3|1mo@aW*7=wG%7^E>bKfUe) z=4Q)Y9unDewm@WGZOXpJjK?i9Wxp@8B;X2^1#=Pu!FMv7Oxb@uB>N8|=8-B>_SeZg z4eif<=v*(dm-)ex{ne)I4SkmU3dz2$Jd=6hf7Jij^RSX#{SXslOxbDuWzSv7en0wq zzQ&o9vJ3QK%o{J34bg9A-gvugs?Hs&%FpY#Bh46C`u?3>ZJ!T?eSU$@e-Cz@(Hx@< zHtfMYMNel;LURoFrd2#l>!J6TvFd96M|M&-c=1_cSXg_`$g+xp4I*jDyeHq_ZUuVaqh_-nm5<7MRG5xbIo&BgT( zJ$B!zAHH{AZ*7}1k#q3)zBi)7Lo{1socKH9|7uR<|2msjD!2pqsM#K0C+E2R<0YS&oZ}VWGdw>}itiJRm_E->(3arVUC=4u|Lfd0D*&gm z6Ecd#$GVBnLytc6UIAmf!Stby@>$wyu{Xc+Jaxo}lXfJY;bBc6vHi}@M_N3}9m4`LE{QlXkLxwtTR&nG=48PZQ103STQ6Cl-Q#Q>nStx`jK2ll5<+d)4$u z=7LT1QFMAb|3&Ujn{9X4+Mra{1{UUAj103iV{IT_Sk!I~G; zf5DozwULGK(QtT%rZrBi@~nfOtr8bdeCMk*4t!75bKqNIS~3nl9xHR#!se7Pe|-}E z`o{03n*MsS?{?ak^1b+f9k}e&(n9`v8UA{e=w0F;l)wJCiL(?ceS$tqd?eOdMaC>V z)**af4Bv7eGQ@XPU%?#mYZ!+#5^FKc+wJ4gd35^ZCw3i&L zUj=K7d`S{(XupQOBJub|%}Bl_Js z)4scTVNYTRy@)aNChp=Sen?&dki1A4FZInLo*^qCVuZ1$l z`2JI#3w}sE<2J>&jDg_7Ea-oocD}}%`f@MrcDfdO)^5|~J+m(Mf3mZ-uN$vruUYc9 zuf3P^z>?;iVehTWA&-La_oXA-S2&Ql@xD8oe{1q-+#5{s{fh6xGkYD4nj`m1_9eky z;Z0)Pl8=sjS=hwY@GSik-JGd-=3X@anFl6uwpSlu8@OgMZD&8QxYC6f6?1mu>>nlyNWn1eqZS$`7>MAFzg?^Rjz_Jn>R!xOYb#afgRbfr>oMACtMg7Lb^37jCl=pU->&SW z42sZY{T-c@QL-`o@46Q?<$u?`ZTR1%pCcpggmg*&icZR`>Et(J`!Q+T9kGA2R9p87%_||&3I`B@zNwS4HenoniUvUY3g>7ku=~txrZotOGr#(E*@dWn}a2W=M{0c2T_cbHd^pWx_ zzA*iYSJ3ej_!W`u9lIm?I-s6-U;%$m;d4oDgtnMqN+>2M&ofm_FvT|mo{V)sif;;^ zjdehZZyKKse>T~duYA_Dn06dKhr}M2UTRzfuOucLYg`_Qu~vS{j8~))ub33JR(=^d zG=%v`c2mYrBjafC>*En}ZDwwjv$J=Lk2)Z=NMvJo81d^jRQ%dFXR#W3A`dfu%{>?u zf2_-LPttXBECd6^&zE`n|0pkWM0aF&Ha>i;m_m45=MTt9`NEkht^=>r^qb+;N#6hP zxXw0sm2sJ4$ZYq%&mAxCt0^{P3YUlcx3G9lX@_`D9Pyl{2Rp=brb1JEd^4U?dXqLm z#dH2!$!CBslkqavL*4WBkKzN0eSZ~tlxD=e7)w(=o@x5IBA-M8?Lt$?94qt8iUv@5fndqqEVYNAO*{S__){MwMFF+T{J)+wU8l508Sm;%`K= zyH3}JecP`MW#7mT9ZPSJMd?l4?UXfQUnPqHzQ@%6=xfB-7}P!8`CT_K=pM_qv@Bx| z(5CB;B9n&TL!rI2PnGYb`R=l0@}JgT+Dx^VX6eb(oHG%OZ-+&FBCrU$7QWmJJqwF8 zIordYBJ)tCydQ1_Jc#dXl@%;{lk(lgqG)S?qh@TTJM-%KF=Y3Q!teCPwCZQpoe0D4 zJouHf`GQB5z3HahE->V_J16;xfGc@x(3Si?f5*bsma{_G)NJCqB}>cZz9BXTefvry z-f7w0OzbY%l%p}{i7%YuySIa^qT5<@IdxONV%S{x9B1kmd9l)su_f>33GSvf?0+Dn zUtc%n^vM|0=6YEAb$L|%vSczr=DK84zsz{d8_=zTj_8&61BK|MT-$mV& z%h_Pi8N{RTxz07@kvUcW1@f@sQ9a;K@aI{PMMOO6Df-f#cvLBM1#=u`JZd%HW&LuG z>U(soIh+2*@^QlBZxfBV3E%S^qrYXB==acHXNqAf*1o{o@F@MhLHf;}jCav90oQ+R z3@%B3JGgpLbC|8P?G0F194VK(#8#lciTTOe7f|yP&z@&~nq|r-G(Y7}MK@A>n@u^5 z>O@YlF}ZCnk9oEshOd5?!W3hl-rN^1)!Zs(Uzz2ZqK`mcA{*s9XQml)^o-Ysi5$C# z+23Z$wI~0(yYFbpGqODw?R^z7`vve~#q8(t*^1d;!)MW3(bXD0cQLuzGz{8fA|+)>*u2leeO)TYa8CJK#4kJe zTRang>j~NrybJ9$l2=r)?gY=<&zE2Q91v@sd|K&r+n%7(rFs>Ut<1`tqW=JyZO7MU zzMP+x;q*x?{w??wJ-^&Z6H6r z_<+~I%MdMH?UhOYGg>)27Ox#)4ZeUoW`|{eK<=tYuEcL)qkC6b`&GtWz${`;$^2eG zS;>hc`($+^xrgA?TBHthj^6OO<`w-@vCy0F7oZ_=#YEy|k`Mn=g-yIS34SFX(OoLO z*ZzG3))~rH2X`Be+Q^sg;GA*~@_6+mX3D!L9w08uIZL6Zd=t6nN}lQO^l-Oq=&c?3 zj5|h~leGngk81bH-S@q{$*<2n$d!)4jl;PY_D8v&GGI`V*3<31c)-A-hm+jiA)380 zQ=9o^8UEn;*isVm;_M1{p|s?5zTXgU)ZanewD3kbf9v$Q_)W?>DC=}+a~g<|%DvhK z#$khFP@@~!I&5xlK~iqByFCgV4wrt7w1iB&l zeorBjhx@dKq)XTCj-s_7oPXL`ZILz+EFLz+*pe{mjVKWDG= zBzk<}TDSK&cRNH*OB1yP&E$#{{f-lx;;zjA?wpb5fV&5?8gFDDB?EnM4j520aJk*v zjGjo&L7UCpk}LU+UNC%G(Z%OX9Zhj*+de@)Um|bOmn#moF6c)eowV6Lw??{eXJ11{ z%bH<8aJ=!e8>Y%^sqBi*-~@wkLBUWhFV5pSKU>t|^qby?@ze>}W^m7&s zANQcQ7~6jvI~hLgA#VNn?dUCjLp5rG9VpS>}<$N}su#+J$aL>in5}m-ZS>%#nLtQa9E;AL*;ikh#k$8@#ycO3}XWZO;KgI8_(x#%19mYU5uPr8NSL9zOM~@O=Y$gx+ADkp1+B`Cr9c5^&ZlkakFUvOS9 zR`#I3N#8P=rwo0JexJ$3{g@f#7aLBw*;((b8%~a~;p7+tN7kJGtouvhlXj!r-EpE@ zDZYNRQ5KeaY#;Y*gm3n-X*Zetih|R|-4E*yP-kbucyAN;{v4dsvV+5N|H(MZ^TdU; z!+lIy%WvZSH_j|~%Rc5_n$Z_OcU6Vw^`XP8GI&p&k4M~?Z z@3R|Y_ANDL>FvgB3S(ByzU~+3(i^-(Vq5R#SL95OjGL?(jB!ifIgN3XzH@eP>q&FG zrpkB`yA}U1j`^VF{s+`}eVg%Op4YR@v0BYpjBMs%XU?D^7wZ7-s_)LQWvqF}Ua)B) z`K!o3yWlXG(10CF8yTltx9vl|BGVN9WPKrW7Wr;)xEc$8U$|}%@|B!hB3mif;F#>Y z>$}Kyh0S}Pl5OW_3g4%_qqJeoE8Ujo+L_J!9{%^2=X3vLd3w%3o~@4b-Ik6Djyd~W z*6eb`#uai!ugT(kfaqu*__EE_rlT_UqN4}!)dgRspr^cZX6q^RNc2YZX&QPe{?P_U zM&lf8df)>ODm}d(J(V@vEK^TsqnDR(u4gsxDvBc}<{ai*@2Yxw{?q5V*4H}{IM`oTWHCAYUz0RSxYr% z$X;1yio}7r@1Cu{aEozgUFHuX*ROGp+Bmb+b~n)}^?J^1aU*BhYqicKkN~s@9J3J!=9a{x%7<^Tj7j%o>f0LO8vwb^*w!!`c>Kb zMOOVqQR=5etzWA3&6fI{lRZ}-YSrHuQNNIPPi;a+e#84%w!2#rK5@4sR?VK09NrMJwD7I_R&{`5F z+gg&`wwAtE+FC@eN=_M3`Q+UPIeInwz*)p-o6$cd=jsSPWt`55QQs49$~jYSuw3{i;l(ee&ynWYxFvUc1O~9@eqG(i6`FLr*-}`gW^+R{Q#q`l|Gb@}IIsiK>%1 z9otem#ntOt`}{OYE3){vs>!ey&e}V5YxMi9t#8iQJ;3R1c>>>7&Y8bQEJ@D596Qmo<=6{j zbPeBH?i1Vjf8-0!yPvqcW!uBVcJ`)$fbys^!*z7&hKg8Fmn3kvZj;Y zQ~54(t$%Zj%J=bgDJK|DS)nu2{GK4?!2MU`-B*;=-fDfiA6PCldRjDIn9BPlJ@Y3< z(74F_e)2kl#xQ>`^D>3mpjXO%@T?s^< zmsfKL@#Y8MJ)d)h_sM_G2Hzw9nM18L&7CaHI_?W=zHH6yCEtQK`|4cf6K5~T^Dh2| z-JAU_a#CFH@MdR{mvE@ovP8)y+4p_*KgIVw^*_~jllm`fr}k&1I<{rRi)gQfbw*1j zJU>Zn6KrUiZ_=E@|HasFA+nUdJjtIYNo$ekavm#Be(%rk%)`>hC;9WFYAy0ye!oP1 z$ImSs$nW(1N&Y;%lTx0`?=rsmw(uo-i_H$eV^&|z+2%3 z4sT)yp4#Sk@?2b;Yipk5gf{Ec{u1kOj$6G>>#6lqa}&=(pEGl(Z2w#9#ZHZT2wG)- zr_B{_{Z^ngPkIA7du-YSsVBLdG|$7+vhUUUYo3B>n#aT6s%bJV_SV*kDkny!O|7Me z@Si<`i?e%Z*EoAsrjuq49e#h3 zIF<)GJ5>D?-y8g2Jk&j<5Sr1(PjoAXHeH$86zNOM@uHlxUkGh~2bxjjPuVWzf4;j@ z`R5`3MW*~k?n6u-AGYLuz7e|^!v8&%yv;r+dE?7j@@BrO(k$RHsdEYbVS{#m5|L_#WgF@>(?ZSTxMMD8kF-QR|m# zr4FN?6#P2gVA|Q9DE0puqkiUesgIrZ()U^Q zvxao+|B;z3`K<9Q+qY~88?My$k&~FZzq9HWwAHuDD_ie(S+sTHVXacFvnpkswLL^5 zvm*}~G3r+hGh|SouD@#4uWnzzy?-0>RV(wT)0JYqgz~)sgp6 zG3wto#H^pFueRzhYG0rEMCK7S4=%E67tc8CxcvpUlx%gk~v$_bWBKXRo%eYJb}f3e8Gl8x%4#QFJ6 zmF=s&YJ+e2%(GYJKl81k!?`Z?U(IP?x22~_zNbw2_V@?N*A+v)^sk+KyTQXk_*L?4 z?n1t&&O*MleOV0S&i|W!!aKt({A#cNAsV?cXdJeO=HOQ? z8oXydJpK@(ad`|HSKC4~es0moia}#`3>uYYU(lzgEE>5nXw2Qrmm1$>rg&cWIpnZzsvYqyUgw{But z(3yWa=;Gbq`~3dkzLMHtPE%7bPCFfFgwLJ+7lT)ftO+h%))dU-9a=Wq8kL`};9yB0 zck~vO4>)sINx(C&B3NHi6D(VCASifBJN;eA*jHW>h+A6`9NveVdSFI~`0IT^ty><;CF0WwpWbVTXcqp}VW3BADno9Zcf4(fn4CR2!^#>p-xWTzN~$ zl{c!mB#`Jn9jrwsE6U4*6+fyC&KunnWDhcCK0Wp-eYW~jfwEfi8uLDi`X=%kC)Nj@ z=eQr6jeX_h_R`mATHg`(Exvb-E568W8}h-T^5Q^2i9fipxF%?;I!)i!2Fk9i2$p@X zCYV{%r24tB;zxmkQM@yqu~cQ~uSS0}x4ae1UtyGKfW9+#oXWdwv*o_*wDUd@@-B0x z?q!jc`n`H===V*G<@?~H@%$qF4nA-EYe`^FZ5uC{CGb-250<^P3%MUuyyU{mM)=D; zxQoBjyc4oGP*qVL^fc`XY8A$~6qtG{_Ti~`F<4f!i*m+qMtkG*8msNxNgJiAsZ zo^#QcJ##D6_`553A7>NqK=GI_J-lt+9~&H+!1a2CDt#!2B zX_Kk+BOiUrOsu6ZM!h{H#et10piK@(TN$(~3>}d1)yN6iHhvR2_T}=hzE)q{@pqfi z*D8N;z;h7$nOhso_y0AR3U3=$vtT5``H{iyMN&lhWgZsfdYuJMjn z)du}4NGJ>1@)?g^qQ~Wwq2Ebi4b}{~v>pauu^eG;Y`J&>AU>0pwHyLy? zOAOnt-xY4R7eyI2Lk@;+w%M)IvTK`RBN}{Gm7q_%u+fBir7KBKXrWxI#4;+i`tyuf z274_vH<44FXIWK4iM3X5($8zl%Q}?jdG5aYd(Ud*P;GzDU(u;L-=I?#ufJx|$vj`t zSqUA%eK)wDv%EOqMRqP^=L64tS5^dl;8|Q#Q?L=7T3S6tUrKJ0rQlQo{YgM(GFP~5 z#p|-bf03Qav)fcMzsg^JhkRGLLa*w{d1KBTud?akd0>YP#dq_Z3cN%4cPKxc_I3fGru}%@KS2A%v|mj7#k8MD`-!wKxv>TJ=fJ~C-n%D!3}7CTv(u6zdU2)^ zzx#}~j`6G?|0DCvM)D|e=?2Pb#H>$c5w|;+m>2WYGS*LCY;X3wir~JvwLw?a>0lhT zHwW8`!}e~$_Tu3y9=;NKYo*0DTN}T8_ZMh7f4lwgzryyzmqm7=9Iwnzi{Sfl+v;`l zUKSVSb2vAXL-`!a--4c6v~RJ+`IJ0zXN2f4pRMT!kx^~+rFt!OYN>M-b(Y%t_+&k| z8M(+DDYw@lSA(^#vi3SOyrwC*G+Z{- z&JgdyUm`xmJZz%2yn_6j&rN z9`uLu=w3ClB=9J>JqEiv1g`Z(j(zi7df$h&-F@x3FE2Ia-iQn&FR$Sj6d8GT8RKg5 z>^@GOT}w6}4Keg*zA2l6D6$EU6BOEs;d)L5cA(Qc(CHEA^k#HAKL2#E9Gxylr_0gl z1a!KI@$#e7mQExgpCr?!EPqD$%Vn&_!>{P`R+ArVZ)D_9Gaqjh8=DKS|7iOvHTj7% zz8_Oy37q>n11<H(=?9@M6W?l+3FV^|wEd zF;A2YGvp*dnC z;~;ZHF*fJNN8MFZ9`s*X8%(S^O}^|$18XbFgY#;41xFV*1;?0Ub{L!Jn|DdbUd7fW zceb)s?9;LfWjnc3L$-5}d9^biKN91^=b=^LUpD=9^;!;Z%>?~Y^Moq-)6 zQhD(8bu+MI3zxy}x?1F7`7C|xD_<6@UW#3aZzLG*tu9)(1|2w4+zxtU<8~ipdp5ZJ zXOm_mZa1GJ^t!}t-UF>LmVAWq`iJ=nx9hUBOZA^H#+~4HX`Ys#|LLiyxJ^!j3k0|8 zvg+gYHw>DkS@i~P{}}rSxBYfH0!`78x1dYgQ!JZ0leuwqCo=w}lF6CRjd#V6@rLfo zI7}Wtv}DYl)n#4D*d3=o981Re7aB4~W=kv?S6!gy#?i?5jACcIN&=h9UknzF-WA;J zKX68|v(DzR-RN}T!IHo%VsB2*Y38ny!0LIdRZ41t-W3PbT4~29?4G!u*nRxGwSh*z zKiF7O8ytZjm4FZ4L>)i8mB5=H-a1=b^Je&l9Wu$#Q$s(iWpAx_eEhNrvh6K5y#z3wdKd-UhVm_^F>((cOFh+T0;AznYn zkZ-BPuJ)qqk@5{&pOof#oO%|z9VL!ME|P2mgEJF!r$w{uLWRM*&TWfh?PD&?$(VvOR1!7T`uK!Ri0|S!|r1iA>H0r+1q)BXMM;qSp#~Zmf%y^0e{`Wj=N3XEbM3+9NVW$>RN7rT+}%HqYd3JM9W) zoKX55TW%I+*tuhqhpq}{-1K-y%;*MQR2I_@3ok|?-?b)A?6M{Lh&xptq90#1R_uH+ zHdahV7H5MMzcgt^Vnvps*Ev?yOYR-RuF2b&plgO*b4K$L{cXl15-UEVd|rNzeqmzU zo|{2qgkS^b3KR50-{JhQ+$Hl2SJeRH$lP~TL+-X(jFN%cWFHz4cfJf45X^BZ}d z$8!hIiFqXF@_Y}^7x6ro=XRdInc+yD$@9HDzlrBFdESHPS5w|WZ1<-8Df*3ko=us3 zlvzTV*_4T+%$deOuIXf)YBSDmoTkMXr&koc?u=8LjGscrYG2bcSr@E}K29U_r(6-^ zlt0QCr?Le7N7gu1ja1__hjEfKCgO)=FDnjYS5ySEm)8cfOAaDS_U~#df;r1s6E8c+ z+PiRFc2h}UJ8L3!)`c}t7SCi%JHzGU=%n~#UC|d>k@Uy&%-UaaBQse;zXo0iZtPRK z9ve3VZ@bg4SnWy-^*pmp3rE)vijAYc`HK44%WTtQ_H#>=e(uHAZpt5_Z(yti_r$Ns zVf=C!zZ}Ldhw;0G@tec=4QKp(jNfebONTRlJFJ)n<97@DsAp;?_xv&#c-E9IcGnF%3DfbK8%#SXo1{O645Qjf*(kln8DS@7V+=c~O3;4|4TWdg7-c7n zMaWJTAHW7muoL!8H&q-6t{%xANQGa?eF@*iPMpYgHD`oenWux@v5`@x?sP?4Xob@b zw~u>~mDooRT4Eo@T+p?BoK2fz8{aY8vuxx2fw67l3-m%T;B49o*}vJ|Yi9rUDP3#d zKV=t;?H?Ii%Py8MUhgnoIgFQ=@ma%o-NJYc$4=xNg4l(e(<@@U;u){Av5Dtjh;0)y zln$S{O_Z24BW)sE(d&jygz0l{%O-eF`7Y!aX%kjlLHStq4*hUx$Mt}k^F3n?8>vsw zgV&ojQg7JED~!LIOV058#{t&v;pab;AKu0Jk9=^efN_(#N3A_NKmSo#-0}QJWp~bh zxH(IZ#a^PcBe5s^fxKFC@NTrF!wTVLM{&fnCa4-)H@eYz!lmKf8S&Y}PHd~CcJkKE5@ zO>nzOGZHTbD|+3)i!j?h$^B&e3j<$7e6EEeR~!#Xd$;ZLo%O#U-Ol0?QN1 zf{FR3gQItq1V(e_X>Ahw88uC9`xzN>HmsO)Nk!`vjf6)738VeND=TV(#he#RG}q9E z?$|=QBWI~Xu{ZABxT`sv$Ns6&(21kF=1?vs}GN1J=`q&-c@+s_Jt-oT>Q$D3hFWjH} zONxR2-=%NjPnIYgX|HGD`Vm@hb+a9rV|JQtSaZxw`X6g8Df7|U^y6i-jge+QZivzk z{6_LikJGPUtSrAVhkh(U{=)?ekpF(o~ZRs+;Vr5?bbp7<7qxy>EvbfmLb9bWteP}YDaDL-r zrRR)=F()8HADDj&n7<#)-vQ>wSDgwRI8YKe&{Q5Q_SXbu&Pb$OQd3D_9+*7u(5_%D z<@!)=Y$}KmO!~gc%2KcbK!Lt<&r2j242U& z>mhix_KL&Lvn7?DIv1VV&EjV8*{v-r?udYE1qu z+rKO=w(WoK-%$R~nf#}k^1r+b`CId+Wj8X9j>dMP`NBi;Mb{e9wVmit0y@-$ zt~H@+CFq*?pGlPKgRWhLu3d$$y-T^ilpBYxjYHRtplgS0`Z}?V@Uvt|W#}Wi)(2hN zg09J4SjdOQF3$EGS=olz*!B?eIvZ>&GHFI)+s%qzH?S=Xhb|{q8!=S&*Du!N8Mnwe zyB)T%gZg4ss`um_)p%?e1QA5_k8wpC?#X!Pu{0><=>bf^`<2HTgNu&Aq>-#HwIoS=-&d z(aX5o$GyL^#kUgXiEQ|F!tXoq>xEx0{LY47!KgX#y90jZtW5mq;=l;*6K;mz&G0LD z=ZD|r@Y@8xf_K(gr~~j@4!;NBHvxVVsXL0gqu|#Mzg=P6n*$7tn~rS>#w}CxS?3t{ z?;!VZoO{gdgN1W(=tnFcXT-nhI4m;z@F)0_afs_;9NJ+Wb|hHWx;Hx34M*?d(7T=J z-DdP|GkSLgdM9{wC3;tb-X)-SmhSk`J3o3S*tZ3}yA{1Vgx(4ES@Y^a^sWNEJBZ#T zp?7`IyD{k981!xndiPb~-Gcv)jd!`o>}>FEhDkFL?}jUS-N3srY;utcP2pYrc>P_* ztW&(poT5L)7)71~P-~X_i3Z+z67^$}H%)xGstL-M`&CM8eU^J+KLDqlW%y3aNv^fT zVf*0QfGPVKBOhb5pD~JKj4WIk!5D33j5-^83tvW}I|=U7!CmN%AKmezJ97oIy0{16 z=ba@IE5Fdx=WnRFq;p(x(FY%W_*dP-4#$*-O#UrQ`64;?7^MCi%73oO|L@^V@Z`AC z?bz}U!;{iH^i=Sq@w4c762~}gW}M>DwGrr=;7C{V&^&Oa7Mw})v|+^-aApfQV`0i@ zbS(*8dly~Xg05{r*RB$r`igv~aX*QTC8Lqo*32Ni@-!N{SVu^c@{^gpeSW>C+-daVoEK%QM(5%cVo2anlXXr7p!aMRM2MvCx z({qZwwYBqSFRQpCF8@?uL~+S{&OF}{o-iL{Nb&0kB~mft6SUHIL`hs<_E_CKH#`~M32yU=X+kI)pmb#~F; zFuUd6^&n-pccB+i*F4BY&S7sxF7e1k;`#~5WjS)0i(HbB%NXSHC~~oEQf%*R?+ zTK49dr0i`6dZS|V?o)yN%S+~SPOo%nwLNqOZJD_b6Kzc*>ljNvOV~S2%p{jcQwet! zUkuhBAQoQRc`lJyKCt)sDGv^9eG0~UU)MMsj* zk$2INN70dY(UC3a$X7L|4_+S|W2PXNv%#3&Ce28U8LH@Y17pJQz;>-Ur@P1Lzh`_R zF@`-1V!V@eIgi~jr`A3b% zD6=0wXB-6UK2Ww8dps5I$Qe;M;D#cb5#@v-YF?p=T`S6)TVXapak>gzCn1~#gBgbfK7;F9V_ryQmdOEh9_g8j#=4X~GO`4H*elnq( zb{=MvA75qKdD&>ajB$vxbL_h`FMnEh)+XSGTAPrEJwgAS&_(x)plPj5{zQMRwaHMP ztMy3l4V|q=N;PtkDEx3I>01n5OS9xW4ES*u`kOhbIH0ZYlj~P+pn zJUfqPJz}=mgEo1GA#~#++Pl$gFEL7c>f99P?W3;`+pP!MjloUk7zox`>w)`2W02~r zrY#wR2F4)T8X$*0x#&|4eG-5FOwZpQe=4@_U#oQW%yoZ{Ni$OSr*&8N!}Mv8rTg5| z+Jh`2b>H&y)f|^UP9O547;_wX&XkVkC+WQ`9d%!-baZEuF~@nB<5rI<3G5r`56&*; zj>Lhme1yYx1$X!l1b5<>EG_5}^7#)~KL04*jRbaiSa&Tl&*Rtgo8+9`P90}%&rsga zuHy2`82>`}Xn>Dd@UaO#yel}1z}Y)5e7pl6`=KrQ2^2rjw(iO*-wOUL-)b&=$@<+3 zPleo>kvTAz&v%C1Co7LP=0LG8v8U@4=EcT%<&$?Ir$+dbb%o*w{w#i!FAIOx+G2$% zw;jk$c$E3jI^!=k{v(q&Yd$=k7<)cE_n$1c@0z@QM7tul-d)J8o$rjU%G`M8Bhlx^ zHOO~A<3ES-_c8vV+@_5GPR8HTJ7aCoGbGPibgdTohVBI*Uzt-SccsW!=E=x=0o~0R z@~00b;BPHv+KU|%z3hYg#H0z(J5ANCny=&N7>^qm3O@; ztnei1C+8}foKcqdm60d66aABT{X<~f-(xrJosAyf3bYor%c`~+fC|3c4Pj@a=X>!Z6EE5?WT7jw=mnS z%R_g>b{|<4!*-GH-<3}Z`O13sD&%`B^8G4&+)ti}ZM)w_7H4C-zc*<{+HRhr*SYOh z$=!Ry&MLF8vn<2TDzmf^`sa*AC$?LcmpMv*J`lrp%ee0;ck#=T^aRUxHBH&>ZhSzs z$CrO9ux4cO{Na7d?uakru1%A9wuWsCAedjI3^G9De#J8X9WsBN&AIAZ!8>REslaOZ%7L#q+T9Fa>TD!@sq@sdGYY;&!Izv{ z-2z{I;A;$gSvnHF?1YzIflpHJSMLe zt~AHT_6ain#d5vQ+n5S;m&vW?hsZHF`Hx!}y_yQAZboC7IBUq+xW3Fw0#eNpea zKws3EXvTjG`Z5N6>C5jgp)dW=mvQJz)U(i(KZL$)L0`mA_$tmpS3DjYccvnnv%#Hb zO`4IobH1Y2Iqt9@Lq5$mjBs43=J(31%;EYwj8Uh!Q#M?Ggt3U~Gk9zU?o=h|2d^-F zhI#{cet~|TG49lZJGCW&+c?vCxT!W+$C=K56!u(=PM#6=z}pshi+0}hZ1JbaY2Z&! z(@rk#!cJ5iF8>Vh=PQtBI0h{=`L!_U!?@TO#Ea(twpm19P~SyQZ92b$NMk&b->7x?{{8 z-=%BUa>k51H3?P0__EW%Wq!$(&wB=5WM6MgQ_#9cJi-bUTxf0f! zb+y$!L+efPpJcrvYXZ4fJcoP4Iou~EPC*XE-r;cy==Ihs&e1|Nx3K?HN4dUl^a|y2 zm;BKZS7}l-jdw5X;`37OIm@{#cXdhVuCm=K%U6_gR*s zKYsMbkNza0Kh~OcBzhuw?ub*=`OzOM?lYR_<~|>J346Bf^PxYYJL1nuj)A4<&K&xt z^bh^9^v|HzTYne*v1rzzKf7sX9QtGB5U(}!A|%;`CV9m1YYswR?z_vL;*#pM&@VpY zyanIVV`E8A(XT^-qQpVpHZ)a$%tsDYhP%;=inZRO-!Kp*CCCol(n6P(#m zO&qeCI3#))ekaz#md2mjRql@~%>SSBKm6`@xJ}Jk8N;TK*$CuV1kXF+c?NP!;F;X( z@gqk+a_n@k3prke%-%(gw<52qJ?cn!~XBgfsy@g?LKnpcsdznXWNAWQJNvNqQl z!s|ZRp}hB`FLHbdIrf96Yv4(Trr3u?qY^n*BFC}Fu@pIuLyj*Y$7_(|?a0wsFX+Un zxL+ypMzBa^DeI84y+e6xX>1!CschoR_a?44X-3*uN;hmw#ViavDb2!8j?HR)x>|Dm zVJELK-$&Y5*xp2CUVWzi=O1=lJ1Cl&J;e5iG4|0vwP<=A%JzQhG;FWC?@0nDD~qfD zIqykguC6?j_as%J4+Yqk?0-lOp?m+@F^ACq3;nF7pYlE^nTxOM*?unG)!UehhsVGT z_OX<%$eer)`hre%*f+nW91QlClY_yyFBaMx;N3oxNQE*Z61Xpm^XC8PnkKg4U;ngEc0;MH>@N`%3 zFz?J_-mM(RJF~2LSKi+vIFMj3=FYV-?~2bRu`$7wec*!+Ii2Z#<@Jxo#)J!z_1Vn3 zmzy*rF`=)b*ZI5~X}^cQZejxVyA3~}Q%uMlq91)I1}11d4NP$N(Lc6m=J!yTumK&C zGdWe(-5{`g33G>>k(qs9SJ2gmd<=|f{H?`-MxJd(Pr}dQ>;b!NZr%YokG!P(Ubdnp z=oxLiqcCz0KKz|WUjri>s4M3R)%#tk>!t2$>Z*G~@Uav=cJllR_=txOiAyEIM-$H^ zmxJXON<1?14$+z(hOP8KZn8!luP{0G8dd!IeemOgpE&xmpEi8(vj%=-E{}(wW$^R= z(e~}}Q59$ZXE%^+!W|NFL)iqxfDloO5(U{LfFU5-C|I%84QVx?Vynegsk$K+0wyuX zh*YiZg00Q2*_hVStG}8+#ehi++ZWraeY*ksHXua1h!W-U`#v*s&YnGIHW%9d!H3P6 zXYTXNbAN{N6fMJeMq)gpFrLvEPcObv9*kJFi@U^FG#>iz@v-H5<-fcx3&mLefPQFQ zjwz_S8SD21){o&X*6&`dUkAQlkM$dc z^&`FW7_8q%_(u5>G`%y?|MQJMT2UJtr!U9c&j+VnqD?bSXR`JNfzt;3`+TwBrIj4D z1$)phPP;Eq&weikPKN|eyT_>iK%0zra1CcT?Z^4*!M#oI_$C6ky})hwhBg=HCox~$ z5w|KTr|pSM2BQ6O!-ijkJC)u5CYq|`D=K^qnjN+g{rVc5KtB`E&(pvk&9~+ToT>5x zMcs$`(@|gRo8FS7c%!>lMfd+>_!Qi2t7mq}9|MFF0Bb^H zcux--3}?4Iw-vH5y-_z*T6{}Q zY`k5Fd7ls77Kk>@csq-=Hwe5n;MhnFZ=DybL9D+SZ!i5`L8 zXFS8t-8eh+=C=pyPCh*hPx2?QJpc6O_Y8{7dniGD0&jjVTT?#w?!=K#xNVc)VfffO zUM+xs8~dFUjP4I5kuMJ%-mEX{y^gmVbAczmL@5P2&{s!%Xn`Vr)+HciyiyC%Xc_MZ~bnegEu! z%9;?F9(}f$-j|%aCvoX9AApDpAU}bi8jqR{w3DlfH>Zz08ef3bIJmqPT+V7 z-}QL)uUJDfj?=z!c~fEklkcee?73#8>tdC@8`rBohzwEvD!gEv>JLY(>&vKI?D!Q2QJ2>br*ZM{mW(=x;Ue&oj~0SFu~H!9)eW z`8w$1+9?}XAsbiDP{)<+>Puncii}uJ_CVO3 z+a7jT_p&@5JKAf46}i4}_nQ6ip+AFuYl1Dgfv~H$Bis_;vb(un)+bl7^#o6W{!^^| zkK(w<%ag6;DZIP_u{JiRSzmC3jms(cA=XBIvN{|*M)bExzcknUrs`nn(LlJnql3*O zlv@+@K#$~gyd72`cM^;ZIx6SAScCFL=p`_}CjNd}Ye#jk8+)LwfeUT51RBF3tdnOJ zA5X>6nqVouwT|NZq%>il)*&CtEUcwyhiJkR=c09wBr|{TkYeGp_aWbPqK)5~#=C}M zBz^<n0fQ2gLgyA)>vr+qDB)SC;>ZT}SCCwcBTwPlK{FK0gTkR1QsQ?sFy z9=o-$PXVuV1Z`YpbG&uVuBgxTa(dGpm*IbJ&bjT>=4OnI_$d#y?NQVoyiZPZIt-W( z;xhezvBf>D#JTbw+i1@#-Dp=2#ZAOmQW5K(?)RW6-mnPrSf=`r@H!Vdt7M^+MZ$GaD9Re-~n(3$fn?zAx_1_nl5y%-(%hHect^{Bal?KFwY;CK3A#SKhIYA7QV#?l*)Ge?!fN^{BFbVefT{*;LK{7 zuPpJ*r#5)~IQ}imGd~gStl2#*FVc?9(2m{EjuI%MaXxC#dl%7&tS=#&C}9do2II+uq~w*z(i zK)Zi=^4u<^-gTy2tPO{WoWC&Yvi11{aGOhfRgyKN^* zrOLF2G?rT27w0O6A2@wOGH^5nI67RVI|H;q{T%Z=sVKXEH;~sS__Htel$^kvR?)d& zcf$(b=^JkLp+38hH5#jcFV|?P@ouRv;e2Qt>JNzzjd%6!LY-~Pt$b*7`}`hg9%}oe zU41XG_WR*G3pmY)$t!~&t!8c5W7Fl0ybVu=t8cT-dY{tw4QQi2L+R7*U7{O0AF-R) zkD7CEA>$(+80ws7xcb~Q-cGukqj^KpKO;AGaNj6zIMID3ytT19xE8dg7&I%Xwl{3> zok32PiMsCs*~n{itAnF&@P~6j^P9+K4IA(}=&;By0Xm$zK>kGCZbLTiI>3*;uOa+# z4Q%8D4_nTNiBB*+&Scnk--11*8g_EBeb-cPMgHVh!lOKA!cF(oqA%op2K}oA{Tt&& zu4veLni~V*Z;p=mGhf<>H+)BW!(-fM!gVv@cR0E!T!%Wd-#*f>jofXp=^59XaO1;= zt@Jb+M)AJ{7&8scSFC&fLkZlM0Qbe+zsG%Q!@X+9{Yr8N_9+hZvrsv33OM)~a97aI zX2rv3C*C|CqkcdC+;*bjnV_9(qG@NBk#=4Q+WB|8qCR_6qn+vgkzeAp^E()mpq+^6 zyB4%_qM)7W{ts}MCE`8_#k+j3S7y%LImLG1Fz$j+0CO@f&EIs+&S**~KA+Lf1{2In zC_f0AQqJxoYIg#39w~yROz^)RM>J(2=3I!m7hnzYK~vsnAUp`g7chEjZc{~@v?jQ# zqT1zjD$V~P?zkS{7V4cU2OVs9AagEwj%KArteY}cy$b6_>sf@k)7|dHymnk{J3zM1 z!)&ej{HU)vpP$N}9emj+aM&*kc%{G^> zL^;tF+QG z4lDp|GxCp1ui)q4=NOlc1Ij$$KzbDaScHAh_@To%_n)AgXkzbKJK~Hreu?U&Mb7pB z{8B8O{|xQXnzA$N7V~tCRkvcE#3v7g>vJ*B$(ZLu4A)72knSHR=J_4VJk!`bPlDGw z3^>B~B+Qk@unXs>oAJPDm}{#4Nz9ejzYqIB<@`)iea<8P8hB20KK{0|+e!aK{ZhSt zaUAfUuR6Q^6P#u3ob6#bi5%)M?C;~4_dgWnlK93C;wJfjkM-hw z5Al+zI5TPfU6r?;DivoYhuw*^eyM{#Ge)|@`75p;8i%nAk;n2SqK=Hm@<0!Gn*?|1 z`wci7^-0nEiU<5u#YUl<8x0-UMlNSEe^tz9K(LQU|$YdI6vee7m}=0m17+PIDHl^fTD=r!#N^run&Cebj8|7{5! zUUAlXU%erLD*{|B+&xz*qt^n5-DA~f7o0!6c8YW7#hCQF3i;B^^!friclMU~-ni%I zy?!EN?oR+uG_DY`P8oOxFYcus*Kt~>(ebu3oTjEg2JOK)+mI8Aq3 zL{~y>ELnRlwG{svSd4tCu7h$3y%NF5aw?FGhW3)iT_p5rKGMJCr!t!y*_b9Pjt{#P z<>m!S@`pR{Ki#eOVjK>v-gj>9{MA({b-uHF)j$)A3s`<7bk1bsaa56V*(|S7L2s zbo}(`|1ur-hN0j*|@ZXfloI3Kd2N`VVBs; zO1M4nQ+-_rX%EbG^&MvYS?z(Yv*$i${T0aiLZp8hYZ4NnpL z2>6sPM{BB@0sf&Pr#e{C)EKsT&M;qE?=jfpYTLu!W!z>*b}Sd{ge^6&V+Gp7&Mn-I z<%Z2G)DD{$;ygS#$HEoh=gA+Jc%7(z^3!yFh|1VlJN; zIsCr$@_bo2w|SBc?#H-~jrRlba!0;vl|g*a*T=HKbpYPXPhIwfmG9akftw1rnDPi{ zr%8W^xN*jdG-rjzs_W;)lt-Ee(jT7A6>VMMEZE1%3*g4#S8u2tEitEsb53okaAL=TMFV)nL%GPHR~q|GI0 zliJ$`ds_(iP!Y~u!%bM1OC#$-y4#xt+=|nH!+q3^`>32?3(?*ck@g7oY5{wabfLJD zstE21w0Tu@n+pIZ(^sB?Y|>8p%EGtDt;O~6=O}ffuz7w~REEg9g%gr;$a*ES&6XCKa zp6ey_J2sx%S4dAmI*B6K3#w`Y;T+iXdqy4&PlxS(dK=z1nu&K>XB}hjv=;RupBduE zavD3rj+QgXuZA~AU~eG1iS~A@*=D5WRHu6(AN9LYKMVEA|G|Ym$#1}kK11m9b-VJR z$DaRr3*@{**h5XG`=ZbOw9}?sNwQxr*4TlwE|cf-F`gY558aK-_Wp}_K zCw+stzjWPioe~oFmoiRWbj|tSU+uH_{naOY2iX0kTw%Gt_F*l4eIj%2>xVPvo)xxW z=u+y++{0D6&vxLxBD;Zhr#%k%lzwa;V?dXBu2se>S&o}%P3cbCfjdoW<8IWK;m}F! zeSf-CO^@*pj8Sna<29S?i7^+RIpG{WtL}3u~|8S#m#k=D_$U#=$rj($&0fx9V!_0>?;hQ&5lm zu8p`h41H?2_8EQ~ajjc|Yx}W(W?Y*F9E#ox=)EOy>457`b|hJw)EYE3intvv?Y{{1UUsd}ye|6<|b8o;d=I9R%s{2Z+Kx3Sjcs{p<{ZNN9e zEk?_rgQx#V|H1xV9nrZ{4Be4N_;2-h5h#+7e8?A?w%UtLcp6$C?_5K zJ+P4<1O1^K&mEw7fqNRl$DxxCz=v-g{LYpy^TYn$86Mp`cpZEI^E2z<*Wj*;#s5|S z-h8INb;^3CzaxSBI^YI#rhihI`5QXdpJNTbFrI6VIM=Rm>d*7|xlY5mPK>q3w$LK;6vI-9sXIt@*svVI5=Gr={y?wogwK zYnc#ZEj9W&ft?xBk4D?4+pv!3tEY{|JD&HPXw;jmFRR^*@tDxbPz>OV;jUl2O!1Pf z=`2pN5x=YR)0w{+(JdF^{mKn-qW#HP&!EkTXcPLKW(V5P^gol8i652t=ux&)4U$EioI;`C8sYmuJKAHEx* zkKdfZ@3L=2^hI5YGQ+_45q+HKzZdHwr;nV^bE2I1yq*|*-e`@_18pQ-k~iUDpT^^j zLtUa{#=1l0@euC}-C44_8u(w}NmCC4|I21)t6vBHKaTmV92LQTjrQ#!pBB{lI=eH{ z#GR4N?+ny&OX@J%Ha_3?l!309&wTw#m+zSpT4TavdY5e?(-}OmU-Jivd^7ufp1R{T z->0|O;Cn|ttgw0PA^9*4_AER6t;oj*{`Bzs+c-MkSBdtvuTp&5mXptHA?hH$?UsDs zsXPA2eDyqt<*L{zd_cxSpS?4}k3vRjo}Ql(CGS;1?@_+4G29dA47b(vhKqrRln0*V zy_^Q-pO<l!a?^etUKo#Xl@j7jHPS}r#5!ra&Feyjz2O9S47`GMC@ zq|e<7cwNpzt|4zFc+t&9UNp^r0qP8-UkTwncH=zKJ~YH-%-xB0G#)z%_0LDYBK0+a zpWVF}^Dgo=5xU7xJ$x#ks+bqc&*X;&d?vhM@*8l5{jcGWz#mVxu>WLp`w!EfEURU? zLT1!d2mP?WY=xip{+Y+aoOWg~+Ics05zBD)C}-U$5BX_7Su(n*@qY5p*8Qm9d(HBQ zAWkdyUY_ z6aEccdoG9L+T|FNj%%KaEV#D)6NYO(jkap|K>GcqD4WCV6vB^N&`u5JODI3sk502c zy(Hmc5#gap&v_Nv9MF#&_&_phIn{qPb8aH$sLQIMsVdoecEFw!kyX?DQ)#SZr_gLZ zFMO}1OUCc>Lxu$R60wyCr9vz8}OK>#sHWc@~4luNF4zV$k^2+-7a%Ns7Uf zEVb|?ceeefc#>l9Bujm_qrL5`lE9OUkn$w3^RW1M*w&eC$g^79rK@#YIxn|#+mZ3^ zs1Ghm1$xx~=Bp^c*T=z6qW~aqNG69*1~&V6>9_I{xY3?U8t6 z@*Ob77`tbF#QYPE42O^7MGi}hF=Q&(?lX0ns!i}+iiqL0ftGnd%M{QuqL<|RK>5F% zpi^G>KG3%o!E^DpCaH@c5AffUt?k+jegOFwTFXUjaegl1aiKFM9|^`=j&6cY4ZaX# zj!OD;sySMpt&+Le9x?b9Twv`pT{*z!=7L{GO?3(VX5(*_j6adX^72X6w#IQAXVjXs zM&=o5TQZIm-ZuF-)L7(EhyOL4BMWV{$JX)Q2zWDXJr%an*2NOI4*?gGwp#gE=*UK@ z-8f@e%6N4i;+$kLQe&aVG3wuBeC(cSoVI3ROoFyHE3PRP+S(Epv=wozJNHC*O`@&e zMj7`p5VX|<^EE1GJ_aJ*$yEMzDrY_hg+4|HP36~9IiuYRS!{8GseBR2iFTi#kHI1y z*JNsQHrmvE3^K^q{MmUupfSX2w-HS}kvaE+2aUA)TGfkn*#Vumkyg(T?X39X+^!zb z9gO`{kEjnG2{BvAw2xg`$XT{u#IW%1>1q~iQd#A$zHIzo@I&wzkJ=b-VC=`}k3I%{ zog}&qzX=EVFPP@^#lKMgDat|Tx0JpJYUiZe%c{HX5 zY8PXA(Ksgebm^G(i8khZggwArPyMu+>Q7;@1Buf5ZCd@~v?fJtO?piA*_yZ)NbCDh zUnY-{&&XGZUy7r6Wy*gs0Xm9dy3a@uI0+kv92U)uJNQJg3j1RI-=&sl`Qq5 zDSrWKA&Fk$J>+Kfnt&HaD-EyJ&{`H3SF0{ssK&Mxi z_6%)2(rJ?ON5DrZ$umEeoc~wD`YVbup4Q0hlVkMPp>i`%Xp9dr!kXK;L*e=@7j)X1 z&rt8j5j|5ka4ZM+D#d{e18+jU8Smqp1K(u2ZSy{5O4dJ7vQOhAaHl_xO}n}6jQbei zUhh)8qd496j8~T<-idUO=6FXl-PY_$M*Y*lshn;fkJvyEH$4gasreXi{ZkNYME?GV zVB_Sz{CGze-)LOrviQ8X*zwA-_!F|l692*G7ZUUHj#npQezG`_So3?x5YPF7nBT4# z^E1YCK7;wt7)Z7>+RJ9)JK4*qEHYOf%efu=0?8cp%g%21*p=~viQ}vS>`C0${n;6a z_R(5=iu=L59zn#m(0-fac+Kmf*-0N}d0@Ex>Q=EHWMkI(G`8Q|PD->=%LP+{c{ARH ztq1Kp#i^$Gk9@?}gUYJd-cwy3oB0E=9yib&0XvY*o7Qe2V5_ipZFVK^!~pBU@j#pr z0}j;0UXv~(@2cYf?)i7wx=^fYhJS)smrEk+QWuQ}JU`A@tVsy#V8nxcSPvQ(Ukkz; zz7|AV2bzBs#lgYHOS6q>eou7A*>L~#ch70QRa+HMe}lR2K9bnbIzF=U0soM|wE(U^9N>E$iDw5MG%KJrjL&Tuua3o@%lrj^ z2T^;j;ej!peft!C@4X(evB7UE1NUCEzrfR28=1erlBhkWI{&$Nb~aC!m}h9b`VQiW zV%&dG^VH6^@&5aonCJH`^R)U4ti+t?j@xCr|Bm)@d><&Dy=3Xo`~?;R-sCUPT!wjn z06FGy%$xZOc$3NYSGN~?bMp-m-lV^CWAGPU&UB89UV_)^&o_wpQsOzwkJSX*YT#Ghfp?;tj)i@&aV+V@`_;(p z;)G4G3c1@HPULI%o(>Mi9;m^)(QXUcCI4zK+9f-nQz`nKZ2uJ^ADq$lzXNm8Z2yEK zvG^k|#^=KLTo@m_G*FA->K@F zev!q`KIuONZ(66cq!`XV_j`E->!R7_qWwbo`M(L}bpCr{od5p(UKXP6zw7tX4L_GG z<$|cVZB5tUR2IBLcwzMIEHn5&YjDtmbd{lv+b@jJJguyPd^zFoV)S=*3Ax!*5b-A= zdSS$iHBGg_HTU2R5BMmrK^_sJ7j(`OLxZCgL&1@BtfNLBM)rdvZj8x|F?lg2H^!vn z3C3ik5nrG^!V~fhv!TpLBhDU+;K{!LXT%fa05`=P!hctC{+$v$NteJ)7ywU5CVCP6 z(|v}R07f4|0!LgE)YXUwB-w5t`k>|UG}4D7PL3mC=qq&`@k{`YXn8z2efU4DNd!kS zz@MfI-)YL_2_JrxM`#4qjS&L?8qokBYVZN$Bk?<_cvjL#BY6Fx(uf0?Lo_bLrV)Dq ztNA$>5uLy}kLl-J;L0=72+v00Z?!Rk8^j-Nh1^u!>Qr9_?N|!hu@tmJ)AKcIJ|Qiq zgOp!qT~kxIwx*NC1(07zvC!+e;b)nJcQA;)MC*ba{&6@z1L^g8FfX&M=aFO9JNthn zaNh)6EL{rmDs&dLe0b~(I>&I?$vr`BMNAi+L5a>NN~Vz6dWysu{4K_$pF!6+oI#SM zDVHqQ87;yYVfpaDr;rc7<|9Gp@92m9`zB2#-J6yxPw**P{r6Cp<_4X%G_PF>>h@sI z$&aE4cLw=I{0L(e{t$?ZNtO8SBcBD@mFd?9iYJr$J3%k~4*EPu{!WJcaRcSnsW$L7 zlt+io74bMna2}cO?{r0d0&!t?w`TD-Qt-PvKkK}Fe?LW==|DzH- z@qK8;r;r5hhk(;)?2BZZ@{A!_wE1z|uaHHXe_D5?x)`?5y~-H1-jI_;tHW#=z%A&; zn+se_H{M)^Itx+fanw1CJ~bX#tAl>J%1~z^>O77*=6=9`TIvw}f5&i6pm$_Gadb|g z3+kF)ksakj+As@w11=4O8v>o-hFM3$Gq9hU4{1YgHJ2xGx8-~^xY*nssM88rF$;CF zP{)h*6}0a~`(Ct9G+gFGnrt{T3H_Xz9E^{ANR4xe^hrg#6nj89 zR5NjpbAJ0zSVOCFA)TR5@Sa+yA1j9L( zz&WReb60Vk!#c;u!a3AoIEOkM=j3~1j0rx3_3p;Hle~Bs`|$zxrFXsZ^a|YZZp2^3 z;zu?ZaPpmpsQhgJp6~YAQ!$S_a=G=hs)#>q`wJ>wh4C~l#gGNeev6PA5X!aY4`p_j5*f5 zKTuwN>IZUCRE)h{;PNrxva!#2^r_K+KKvdChr6*SW}YhNsFeo%Spt^{xPkDI#r?)b z$Nhr8f}Un9@mI}REfZ9V(~804N8zQWYc%rsA78+E{8unO;;&qw9|~eGBQ`nC;~zhQ zxL@S+qTGcZg5f?Ob>suGM8r1n@9CP9^rhj_G!rh# zWaU~3j;uIh#ihq3a7BO{6fRkHO0dNUTnbH4pFunn;gUqBB*i78PU!-HOJ6nOlFMPh zB~Ifqur3jK*%)ig@u8!K<3rDR=#>6|y8o_DiP1Sl(7Dh=^1J9N8ynB*9Oe@z;S*QB zYL>67o|EaC7!QiJ89hYX%oa|!s$5y0hYlC>(P>UsTV;rl3juf_LH+eP{t>-RMxj^jum{G^D{p!e>- ziQED=F7HG<2i~ehJV^lWrgzdC^mucb-pD1LLUemm_4bGdFvop#9jgi6*o60(t2+@N zaxARBX%Al`Kkh4f^O0gs`peh<>u+226Z>#?#L7MJJmAfAwWP;-7pM}rMSvTEt^&4q zf&WUf`V3;EV(2QO@L#5@xL^{erT1V=f|hnEO1wo^kpUbH;S6eguF?1M&;JyDsWEbI z?WJ<^OO26x>km{;eyN)ZxL+#t5jzo&q3JVzMdjp|s^!jq73GH9TTLiG2p+qf*$qj@ z5>1QyjVZx-Z@`{5ya-znVmq{X?L?cgbREQhNqz0$$`%MsfN$4$ z&;0H<7xGNS_OYul;5z77v!mi7osKC&ZX`>>xxN14Ba zXkYVpxF2)ZXy7*hNAz;Ad4I2z&^h&=RvefqfqNWq{ow%FhPB-NoNr?|!2InFB6cZ; z4?vw!&eQlwqmS2DGdT_>#|(Q>aRrH6xAmk znio8y7C)=`f{jC68b3dy#4l>^A@%=ug{B9Ygtj%^h>^w+kC%cnCSwWt$ee!(cELWs z;e2`QBKF44<8C~Q5syi6@0%Sn_ooj&3USbPKSAqV-!Kaj~~TV*`IkG#q1 zQ({if4lt*`i8fc@y|5nK3G`-6j%f2&qHY}I<}&AnD&1+?x@h_7-q-3=Yys|&ZrmY7 zRNu5VbPitA#{V(;TFm<@7k#~K?2BRxBz^rttKW) z{|nmqkD*Q6LDXi0u}$#&?2Zp5tMf&huMN;-QtpeCs?d zPi82g5d2FdPo~DtoY`=_??f451S)yVo_0t6#SjajedD@Phkql^P=RNHdKmPwOi57_ z@YbS6%QRThshZ&)`eWqI^&oHR#*JF+>2Un!v8QH!sD9-V#EcTHh|Xj2*Wdn!Vjts| zAZE1KcL42eUzLcMQKBo>JQl|Lzn;agCi~NH2MmdJ-R|n6dxOWNM$;~x7VqY?D!M-& zb9x$QWJvwp>FPUzI@^|8V@{*nzn;t=K0P)0%>Pq8J?h zo!K*3Oe^deET*;oK0{2aSVL~l;O`SsUo2)7F|BQqv8)hdIZ5%Vn-=oeOfi;`Vy;uj zCqRo=HSJRYwNJ6C@k^yKv-7E(_{jKWJQulX&F5(SQ+#Ut^}ZtFl}s>n9wrI6UEnj3 zE1iwAoM5ph;k)>ruyJZJtfq0MY4yQpYB8u)qQ2cYPb~)3RNsO6vG}sD6JHi12K8l} zbi4l7*B?`?32|!!1FR!it0gb ziyep~GxKHO$)eyW2gZcm2EMG;)pzKy^&axz`#TtWeQmT%5BkY-Wvu489gKHjeF=Zt zz7zF^#J4=->ia$FY+G)9+upNVyk(E~oaqkM``^v`_v{trdrjqg2hKgQ4{JC5Su5?- z^mU*Wbq?FKC>mhSJHcS`FVSHf8f`@mLmF>ZBl57%jJ)wanbTwBw#c#85wuUKtqD4- zn?Ub7!mcJxx3Z4c1Y1Y(eC{6T-zle=E4L%8)QYz`K*Ny_BZzz$Vds&3VRsUz;jDj= z2RV7>@$vD`kc@@DdofVH3-TTJ;&A#-O#Tgx1Cn!soC<;=AHLWIf}1BycwYu3wv8T>Js(W1`-%XEfKD%xSJW zMcs)w8q#H&;}^{|SMymh#%)cX$mzfjF*cp%D)T{eHUC#0r#J18{b?n^<$DY|z}5E1 z8}*bo_}y;MRC=dAf#;bhH^JP%3SWJa>%&Kp8UKXoDC{3#T-c|`w7~LvYzj-s*4a{6H7!Q`{I&X*RtNA9=sMN~;f^Kw0YQ zvz2juin$-!qjCY80^YzDcU>UviN%4PmDdF9m7saZp`lDz6!6yP1(eLif#LX_a0U33 z=dTWwCdCJoLf9m(_RRmr_+bIZ6O=0>;}rd0{;<+_*XZE^PA@a(n(uxu-rS%ury{N} z8Rtv)7j3ze&4=gYh|Fh^7-I$bR)E&*W;qN}7%Xg{zod4&z|j=^?|2gZ7bty1YiYe0 zPC);{_)zFy{wCsnzADzyxPF|EA;0Z(e~##r@>nPdCB6p9J`r4&wtnCf9D5eBy=oJE z-)Gz_=wFO|(fOhJ7ijgtCpg~Z^?OA9zeV^~ypuUgT7MMk6Q5AUY*vJu+#b*eJ;)uz zCsb0die$)kDbU{x*K;|L&otu`;6F<=vS1p|RZ)rdIG?Zrxhihe^cgQ9g6)2!>bL}B}Da4lq@ zq^%v{8STfzcSBD&!g&Von$R2Ljp1d`6V8O5Z~^7K{Z@|Ji|?KIz8v3sp(7jv8gU=$ z--lSKG2Te-+u0o*;g8`f)d|0*0Q{O3z^_TmpL;LjtOBi zr-L7({VueBBlN0u(5o(huan*ee3^>j7v+F|)B^Z2d0MwVSK3-7jkVg2d^!W^7;l&4 z+{ymCm3G`LflC2gOxl6GdXzVTY*V_93TK_)BPr^gh?j~%JGzX%8#3B)d_1QemtssL z?>Lz+@LUV+IQqX_-g(`W!2ohe`$889 zo^GBbpLD8!i)iO0$xfTK9DLC^qp80K1l%sjP>#u*|1KB(fUbh}v9)O?Kjq0HmW+Q- zSG%EiB|qgu_@DfgUsx;jdX=!xZZ`TUlU^^<*9s<2X?gvuWBQsHQwroN2XcUsOh9sV z19EAfdPtx9$7L;etIW_Bw*{yAZx!{+4L(@hhM(H+TVv4IMoMn{HmVBvtE`_WxBRZGunGM(ZPFw-IWL&iG#%%`un2}ei5AwHLufY8_ zBwZ77`Z-Z&Tc`Ey*68+^FdJFsP}_$c+QHgSwAjczJB2=PC)ekBUJ`%5#Q%nFtB(2S zyu{bQ;}_+AQ@LN1+eJQBJI}}Jf&H(dKzzHC{DAoP=y`G5-#@V5Lt3}{U422++16>b z{h9QV%|b8P#q^RpFJ4<9KPk0 z`^lg`tyl;+sxJFsdC8dTTHq`qipJezLnLfh}6;B6f&3x z_314>2G=@MU5Gkl6P4;ykN2;KmC3cGxm$wWYy6R%!RsRLQP9~o%8(dCvm@WB&rct# z&<(RO=3iS2pwaq0KtmPv1j1X#j-T=RRib_-*7$R*F?0cSWzM{)`X3;NlcsxpMYORVd4`pj z;X6n5O*(!W>&pUe4rF;HVJY*)lg;Tz0`4T_b4Oeu(*^g4F@1ZjVNNmh_RneckD{Nu zptmn9%yS@rxvZ~;1?)EX2P&Jd_vOTZTPxsJz(3IOVw|c}cFwa^zKxvBc>$ZPAP~1D zpX>W83b?+1Tz+79B4n3(q2o{II)1Gly@l;~Md7CEyOei#`e$^D`v+xXpNmV%QTBwfcWS{p)yr{b z@;gX?Js|^pUMA$McwNrQg`5>-Pq>`h6Yj%!xIN)E*b`PE_jN*)J)zWKPoS8w?)R*8 zi@qO3JN1Yqi;4p%5PqBm;{A|f@pm!*TRD5~V4x$V!q{J_`2)i!D+FA8m|Z zp9X%nLgYYIRpsC zor^J43x5kYpT8Tq)7d#P!DM}M6`MQtA(ILCnndPMr0tLJ$>ejqLZ72vE_hmAE?INI zCmZ$*xo)mp8 zgB9+RzxJbptc=e0#Pn&-iNp&-&o)tAgcz_GI>_dMbdc?%I4}HHj7jjqh@t$FMF+X> zufT7t6X_s#K!>Kq8j|1Iw@}7oBwfOfFIai|m z;Q7YcXtpR*n>V6O-TsBUKB6l}L51OA#tq7CDFfV7XN|03*X;G;vEuJe`0fC~$_UE~wFv27mdoLO8;oQP`y zPqqT*DWY>$xZYK)jTVD*OtiBe{B#d!6wRxF`b7OVguf%_aW0hB|4^$BURsY=G3_(W z>!5%mUYfV*$)C;&d z|Dbie!PgLDJl_UfEPL9882B{u>4z_4rFf$R`tVlVi$*@pp2hjJ;W(F^Pb&eR z_GKUHNAYQ|8Tqu;!d8~;>RXSy(#V6*-RHsgHE6Fs+r+QsLN5&eW=5xSp%)ghHxAF~ zAlb~;9;+$Y+Sqvi0=x-%$(Y*U%kY;N;XV@{37U4SrZL>Ou032`do+A+Pff4}wyaT} zGhvo9aCB3+7k06Apv#&qjO=PP;3Y;m&xA*#elO}bp?)oRi6`%=4UTbfo7%_t-i+^c z_^#W-QeabSt$pt9)|%&FQ|k(}UZLC6mV-WOHnnEZ_HV9h3eP^)9&RR^8f<4;8~5c_ z2S36X$6$V29feds_qSZDh;q&-PY7i1^U8 zfHBj(!oOJe$Sr}p5^ynXZ&tqz*q0dHL)`R4b#r=5x;J2a=;)E0?p=d13AzWL^vf)C zZv@VK56%hM(IO~b{ICSGUrIhn%4K6-uN@_W0o^Oqlbts1)LUJx|7O@9^yteMe&q#R>d zFZ@F|os6FM%~Vcw5IEfpobC~8XIvYCk=;?0=ka%RM-|H7o!o?d-NtNof5e+YZ_IPY z+XFo>=I52;zA)x^3{?*N?j-c97MqV2Pq>=m36Yl!zUy^mu8Haiysc)o4^cd!8SWdu zir9yYcVB&w-k41G&&D|&lKi#W)pr5vZ0n?VBctUn&x5!#cMF;DLEM?Ug-T64X>)w2F>W&QnnsQm?9eLrFSrT5dHuz|fJbOP^ioq#@`oud3*tka>zoQ}SW zbvhK!e(P|%Ib77)Ecq%M_m-iK`~O^h57M}oPl`QmJJ;z%_xCl{-@QZauh-SLiuHFv z?EVU(bx8UdR1(xFuv?WWxrjqaP|qQj$&AnJ3>x4n0Qaq35q#Fy5Z@V}a&3NJg}s=s z^|dzqPKsXZLx~J7YVM2k`<^b&hh8b!KWnJ-N4*T1|6*HTeX$MtuIT$fA76G7AKz** zw$-L_t>)!X<0`?pR`PKr40T+n_sKgLR|&?ovY&Bnl=Qm_{oc;|J%Todgr}(Y4)wbV z{odYBzq_^d$UnpOZMBX4udkPVgms_p#JJY-aqSuExKOW|#&svgwYHyeWlQ>9hkozp z{r+^Q{i5De)bBd| z#0>}9q5nD)c8;tKD!C0|_dV_5P@q@S8`e!fDAgOn{`@6fUzDTirG`Jo;+e|HK5d(8 zEsxlzk^3l5QqJRvSpAACt>qE>F#4ZkEx$x`$BIv7`HzHgx$Sr#nCnsb+FfOx+i<=%J7#VPRv2Q%*uE`q2zxuBo2=$>V62T+$@&QUd3Q~9 zRJ@t{SWVE|3H>H=vpMhU;d5)p{Bt8?_2Taq=t^C^9pRRMA>M2t9cT>Qrct-N2s&RU z&XDl0Xm+%INxhx)$EbUy_+O9HhL2=u4Sz@3tn03r6|D=WJt|M)ZvojBDXL6wZF5KK zXrsoFpQ6q~|3&1ZV(_=f(ayW(3t`ghR$&}%*yk$frybriVcSWr=gm5@C0LroC8Cq!5M>0?L2Y>XOG9Y(_CdbTXq&IB)BMiL89hc5jl74o`yVk5_Tmcog&{o z(o>lAy=#WW*7ts2qVN6w|5)YT4HCHT0lh&_oc){cBTDXvDyRUa$vRMPv_WqBs5 zZ>I1Z&*rx#5VsH||7v-|o(ofcXvzVd;a~3HvKr~Qb@|tGDdb=Nb{KyraFYLF#LO1| zkNxSaxPrixC-MUYaU%oSl?4IU-Jbc*39f)^LQ=q)nIE_azc0pHpsvgjf&3A6e52o< z`HLnfft+hdZcIN#|Ceu7`mP&e3p{pqSe{wN@gna_DPpvm5JPw^#wGNJ$kjedbz>Z* zXNMu?EE8)%c{@}6@Bc~ozCso*r8q6fRXbUn)8O%=s*Lp=50bZwn7mEvlPP3v_=iH4?eA?bCwvx)3~hhPa&Jf4|FLNQ z3+zcsqO!{g|Ale`{9zVj$LIUBHWv8kIyV=yxckVMDRzy+Z543a;G^r@yp+9NErat2 zxD|+ZbZ%b8;}P{Wh_v^hfJ;H#qZ4-jo*3i1M;jk>8_w^*Cb`+8BmsLci`IOFuO|lF=RxsSs*~VWGJSXS-thK57H}&jV=m;I zfU^S{!uH}|sjesMVlktHzoxN&q1C?t{lGt=i0Ve2Ki>3sa}T#(-UAxWlxX!G=<6o*bxS^InS5L`1?)k(cW(pi z9r=B2F<`R9R4f%aVF(_C&u6{L|?h{s4Um@<10V>bba);8%G3 zL-r#kd(R!*-m?XLlD!A8D*4o$7H=VFKJ>4hiRezMz@sHX#+Xr4T|zmMKLl^D+h$MVyl9KPJ%RfA+Y|V0dVT=^e0WT@?9lP<{|E#zbwh zH%Boh<9l*sV>=Mdccc^n0zro@XyHu^3NI$VV~==+;i2R9**1*S{cJ9 zlqK0Cc%+q8h zesrX7%Brpn?hrBdQF@P>9;R#ZQJ$UBBw2h2^6Ol!&H~LVr(8Svsk&~&p~>M|PMnAi z0d?l9B+sxqwrlh{IpF2Yd1Mr0y^3qp;iwn=?P|R~(G{aZ7z}L`3wR@c0E^WqF zSxjj8FpjSm8}YRz$6}ZM25>6Y`+G?!TMvFk&nIvgcGM9O`?H%YY z$WgD^z`LoOY~;v|+D7fyqkM9t{I66_Hge!%H*m3sU@8GKB?9vfVCIm`HlD`~P(I3?*|p0V@51xz4=z75k2Pp0Lz|aG+I$slYJOuO+y_NCe+@TbZ7z+h4f!1X z9&j={G{q6q+hphBkmL3yvX{dCy2q~jG(V4hXTAZIdtrxu6Lx6iv8`;I=gvm#D01qQ zbNsz!{M71QeImjWO9UCU&1-%ubA1!I+6hz*|F6Z&BTW zwsO$caqNS!zcTcv@dhgaW8@7ES?(jnf4hV~{Qle4`{iZ{+;;(Yp1c8KeArzB9Y?CV z7qLt+c!Q`oC>d{XeH_1QW@3EA8z?OPe42$fD8{<<#~bu^o6~MH$`m+xc1iM9@8U7F|;jVY>P|jCoZd-f7-rKd_^4IBdpnf+Jp1e5I6P|(RUwgGdbv&tyPOyD^IH0H=57) zP0<(YgNzFG=x06i)*8~4H=zHVN*q5plx zIl1%roJ4FNVszz0n7_RVe~hwm2gY@3$)2!}nJM)3dFiTJg3Jbuk{zpJkYIA$Cd@l5pnee_X( zfAn2sgsTrOXExKn0B%U*f7sRc293XSw8f{)^Cf9ccHqBK$jS zEoif;I_QG0MX07dQYZfcmEMCNL~aG>9&Fb3wLJc=h(Aiparku5*k?w3DjG1y9^|25 za?315rM$hA57Au<-DaciUjqG#V(mlt=j`Z&@5pHG=U|+RyNB1;*1DYZC>4qd`kZXe zzo5ae^=iF9?~B%u)w4( z7;rK9!#&Y)YV6*1W^fwiO;w*qtQq0m`S6F?3cs^|g)s?P1wQ7JEi`I!yU>eB;&cA^ zmhijR-g7d+yhi0rpCHeFwFl+ruTS9lgw1h7O=wfsCyeL$yLxb^QoKPG@t(+Gb(M&P zV!Wp`e^;9SS+v9R@$<+?K1*R8q1()@*5eagwd@hukX zR%NZGsyHl5Qy5#xJ()^>f`s|&jYgHU3Ol*2aUJH^Uu@ai zhS;)-43a&BO<<>zSCPSG56Zd7_zL7)WdCOiUMHLLIiw3Khc6}36p~N2&a4Tp9o+=E zzdbx-%+c@y#B`C|PqAb(L64Z+@3Gn{DF$m)%jw`~(8uMVkG-IeuYlG(30gD8jhHcf zzY*U*#`kZ6)@bow6mO=*jFC(;%5^%J3w!BDHF%>Iw3^k;tq#t9C4jeSJMfmQA>NG1 zLW9e{IHJ-j3mw7T6pOz6eWR7WyuRN`Uk*y(egU|c^rg~5U+NSuqc3=uJynfEOjiv0 z(mYTc^wzUyS?p3X#-!61&jl9xvKi-;>D^6tAK}0?C`;)lE{onj&~@^r`ZERokPOkY zk>bsOKkWX`oIC1zBmPX4#;E3q`nyd14@%d)aW}iyNM@nf(idRA7rGMMYmiqetubyR z(I4gf2?0kKox*sHajrHhr-t7v;u#?9+YXZUIf|0bWsgo9O=z?1AVX_r;ac z{*R%)?7pBluQ%9zVLNc*65{LQ5sNBvGs0fpgSP3u(B6a#)$hUEah3B1dgIoZi_sI$ z?*r1SFuQqYO-W8o)BXE^Yg+=amqVY&?B&4qL~q1i{xJ66C|l53-3Ht;^J1Uuv*OAV z61aZ?u0I_z(c({$E2Izlc%iR@?KhM7G32UARj(Ss@x}aB1N3!K_#(@p^@lSYU%r8H z>G=0?!yGy%(CLx>E(BR!tN(RzCX99Y`5(NU`O6riS=R;oa&uYTh3d~0YuQHFv@389 zjP_-jJ%nr_4dR@T?StZv$rr)}+XvYkyeMvt|hs-Zxwd6c5mYmzKNZ|6$=iIu* zxmD8CEy#64xN|<|cC0wJmt$P|xmD6F=XMmE*hNe1A63A+-szhHNU~EopGb>L(>BrbjI-KOHktwyH5Ur^YMO~8IOd{ zI128SpG9y=yHAUn5N80{yeGFkT!r`%-499Jt8E?C!5+K^Q6B=>i4(yADdnGszv2aiKN$Lmp3Q#{5?kz$;8t%;n+(5Y3 zE8&~&YO~Ue4xbZz2w5JymcT)0n%a;k&%Zbr+HvV= zPCH)1_;ehEpOcw(%*49b;tKITOhF(!&Vlz~3Iooip83P#@&obPU4e_@;se7g^8;fi z7r?hQA)ril1;)j}r*$&?TSvqNlqvW<1^%t6@NXSs4>$@*{!5=r|Cf`0Yo-!->`{B( zD#)g*kRvP;@m(9@a+!X%l=&)WKp&jx-fyb~Tr2KCX{yKH#bTU6r?;`pug> z4$+a%Q{aG3b1=RH zS{ugpWxfOo`l6UCBQD>AHP&#M@H!SQN5xWMd^#<~7>%@aIohE8{0O`z>12(4eHnde z_`DEsMtnYO(cdZlwKRlWcQh% z+gm=|%VmP~u(veCtvc0E3H=e)nC!S1FUvJiA#zPriTEY{o#~HQt_kRmSgwiqn}q(T zEW%?N^+)fEzIvEXqRB6)u>Y7IjrK90L?thZzG`JoWx+ex_kSr$)pJ?+SAc&SJv7^N zZ^OFj{s&2N8eBnsj7hG(?;CJVqn8csHNmQCe>f-55pHM{^m18KcnjWjm>xLJWRaX2 zz|0DS%i)_xv3tJ8Ey3yV&D%1oBfJLh)MmlAhjbkM(a%tv194}B$Si<#qomb#*n{& zljKwAO?cR+)&Js+f8Up<6gJ|lP!jpN*A;{&a9{V91?n(-e;o61{msf(mZ7W+b%vqN z4~vEV5V~L1zIdB}?0MbLA+{dpzH3f;E4ml4$bQ(z0{o3@*!AkB z|J7>O+p(@%w?(-ctAmtFlHQmO)f{8CHI~C2d^Ek8?OqG~9L?Xv%t4N;2IvNfced>q zqek(<@L8tuDNWINC&_QvgFe_B*~?)wtUea5$U*;2eB4xrXrL_i*GNxiqn!$jiQcDn z&qRCo!bVpO8)A+avj=(So2pAN=KHD5Eac4U?g%iyJ|n!A!xA>ME=Pr3x1l+NuZSZ2 zrb~0HgQeB*H9p?Kasi-iUQ-2)K?=y+LPs&p~dsK^0PWMmicg^(7^X@;CqpP*$Mex<4gV@V3;5DrhFEcOKlj-U!ijH zgPw>scDwSbByBVThT^yAU9<*C`H!fad`xh^w25-kF=#pZUZ!&Lg~ol;BPoB8%E@lI zX%T;)+BC*(C_jiho%Dg_L-m73zQ`PATZ*2y2W{$hOXP|ylE5&1o`73%8oFTIkL3c+ zI6s2BU%;i%o8q`Ps|1{JzX)r-FoTRf*xgWCHTaeX;Lsn~_=f0f$!;$|Tw1s?pjK1TV{Acv}4K1Xks>}iB6~ECc4i&)A-+^Ga~2LH14yY@u)q^YJ)lO zIjI6KmlHT1UIQAl=AOo|@1D-^8qg-vmp9;UbvU8Z2}N|~{qdt3dt_ag0F#}(lT;>CdDGM@5Gy9r zt2UeB%ryU9jIV+i?@EH_3$&`@uy2?Wh~kqZ(zp!R!C`Vf@%5F1I-E6U3O z9+U$IWcpLs2l}eA;e$KPl}C9v6P=!t>EnK!ftc+XPaF78O?IT*Vg-gEhld0B+UJh)&fg=hSaSE~Z+Zi)kv(;*k8=P;VUSY}<-lOtscr zOu%~{Lsu}8<-8)iCp(cTzlw@a>%rII_vP;oDo$%Hvav zYe4$3{n$I~8{4Z-L=18?jN;z`7&Ff_T7rk$C2+O@@bKK8DNM&oGNGnpWw@wZz;Q8@ zrrwA+FxmSyW?Yon=KlOC$Hi}AY=U>HQ#>Ppi_x~Z|JjZAZQ|flc4$Oi>7fy-@jdS+ zP)6fRVebL*Jf`Jr>eFxMYSW|8*BBn8?f5nN%*^na27NZ z`qr*hhbO7e<7{u(lcrL=QaimT&h@RiIOku+*mWDUD_NzsI4?js1$f_I6@60~$+4tw zy$p39B7N%<`F*x0krx1c%Eo=8s9UAm83(U(jf#7(6mjpcEvpza^F_gL!Y%vPxi89F z=!?a@SIXnw*BkBtjb4@?t0}2MUSeOMI=E(CQ+WEZcG#6Uog~}gKs1uhxz>iv-iX{- zB_6bIwl`*DteUPS1$*Y8^<%ga9f$43xXkh0GTJx{ZRDU08Es5p>%wEPKgaKZXyd;m zxHf&al{WrU0yhb8{n5sAkY!@%Xu1@)z)RQ(*CJ+0rYAMyrA$Zjuag`viFW9C=}NTd zXnI?XG}5Z0c?#v{tD~X1L?e5c-jnNhhH4|nJ~wAU7AyE4D?MVia+LinY%SAtE=F6q z6Y(yLe;ltoL@_N@GdLf~=ts-xpdY+lF?1ru>pFQH6~4`!RUI6;E)bpxS$P!n4lLJp zM^iYrraj!Wtas3{RLS6>2BHJBS7tg;-D*8^yCiUr0dAl($KRHX_-JsROq@4oy4s1j zsPpB?R*3UfYdmkT(e}V+g670?d}aDea3+2Wd*ACPGPs^SB>H!yt4$&`wg#V%>C-~=eFy!Iv?$Bah|_q+#jDiy1RKOthF zDpqr!LL(niU&7yE{Vn!qNW2=}19}N{wk?;u!&)MAlqEt(i8zZ2EuLZ}#-YVj>=iK< zdwGn7&fo17@2~C`<@-(L`$c)DDDO0tck=T7Vi~qj&V;NHmYfODvo$+x!*qQgWNZGe zkMNHtT84KkOBCdRp*w|Q4&1%)^IzVC_k*BQ#W&VQg|v+Wtd1)ZN1*HeIy%D?qrh~T z*CX!Xp7!w7_DhQ`jYRuvt~LOqWV!G}e{?a&F?DbXIZwq3rD)V}44T_e|KV>!r4g zI$N{OlXQ}*L?`(-;Dz}vo!*a5@>_s6->X-)Snt)lByiIKHw2v|;^ZzQzPc;RovuEN zSU0*)%{ocY?=G30)2NfQeZuK?0mel1I|R8{X&Gj?Pq|L=?Cavq0Pwox_qG`DbZ4=9 z%xO3I5Aj$tAL_sc$aHi`B;#%pZwHukO!a^xIUaXpRQ~_L_<8oMhF>Y#V|OdYHQP8Y z_b}$^3<#aEb#`JB#u-Jll{(hvnd_9$uzE1N6MSY_l?g25UZGd6E zpeS#nelW(u<@(w+Qyw|0XO#I#m$ru5C%qi*)Nb6VJ(4jl1B0R?`_M+PSjRV@H`LFdH(t7qsak!+AN1gUr}{nC`mnVv zkk&u-2hl&pCE)(2`i}ok-J8cpRbGFTu?)VC{=5J?F0}LHgNzU3eEdH&%Jl% znLBqT3I2Yc_kI7E&)m85Jm;KeJI^`iIp;iN|J396S`F);M*VO$(d)=2iu|A_7LZL8 z_i)1(Me}t@fgJZFvxx?LUC2J_7!I50TlP20UJ>35ws-RO(SYrfw~wA%K3zJofZ`v6 zeO~r)c2K{rwxoJi9qvNw*j3f~A?y~{!4BE6_^3}nehfOBx7uOTbo9`ssh0QW1qLiH zU_mxH?6+y644t9zcE;DxcbeYzBF52*HDIK-m8rD8W40=`Owh&KGM_@-Jku}^zF}Yg zJ+OAZKtG3DI~qM$7p*SP>H)2G&`N7l@k_BD-V7g7@`-&PaA+MJ!#c`AJM`;yCva+O z2x}o|4H@~TJY`_-KlJy|HB@6z?tf73yw{LZT|=%6@sgjghF{->=8-u59BC}(H3 z+tROW!@0~pi^WayH?5WHj#amI!1rlb{Vrde=bUfqrPZx#t7YHtUAugT5)Uz3$h!Kf z)&%SWRU@ie>sw^s-HE$=^&LljNnXU5ji_#ISuFb+;Oj6l$=hR_$Qq1~UXJH=Qj(n= z26Jq(!Cbu2pxpSL&PDkC(ODJeuh>ZOzD$nyWQeN~uSK-zbD!(wc#WU){)&Cnxi~T~ z7k3N7)!bZE{1p>1U;YXihGh7nLcjdfxWEyulV23ysSp09*vz-V2J$0p)NfSYa%Rd3 zCYdSQC$JlyP3PBA(8dsy0r=`O>AkkXsgIu7{6fqU)S*v0T+U zVwB{ou5b43sy^mhVHWNkhH_SvUlAkRTZ%KL*~lg11-%r9)cjY)R&y=!8oXNu`p+%D zRysLz67Dxt?u6#o6RmX#?TbVEkn6V94cgbDeIKEH6g%3C_BEq@6gxTuaiWXShNCDm z0_~I0z6P`}8SVQ7?W@IqjiCJ=wC^&sPd3$VY(X38{EW`d=nQSdF0=<_rlWmHXx|dK zs&ypVSA+Jopnb|YTFpjkBb}p_;~eciw2|8Oq}nzuZ%-1|a=5V@`Tw(V`?=b-FF-eq zTWmMuM!JVJ$}ZvjwXxVS6z4rw_i^acdfrKK!DPdZ$M{}SjU2`pyLA}fk1@W97~fqO z-(47A8RJWFz)LWO$53V@#< zk7+)S+=cN(nHd=0WQ^}pxvF&(#`iId?r(U``$EYTX0#y9c3WDH@y`qqx=9qqPP9LhH^BQPUvGcF&1Q7A4C34mD}Ohf_Tjs zliYqWVi|DPrx)=GZHQaI`Jqhf?8GI|+0=EW@i)l5wK+DMSb@05VsC~b_cq3m+}rr5 zXF`zwc6V~p8A}x6DJ_Wip#4d?m%|I6dfLDDBd&$^q)g`>XRgb|{ja!}#(MOT$FV0h z8rhckJ!#>$ihN|VT=Nf-kH|)^6QhWQr|AG4X(ZY%@O*7AKt@+-*S)P(i7&?4Rjq*Bc#zR>KA0&EQP+ck zt<`Wn@V3?$jw$P*3u|B17Z6jDA7X3WioST`gd(FwfqqrCLY$^WC!;BL)|n_z_R|!s z1(qWa>wx;2=KId^Tz!)9f@CwL{xxd-GHxC8#P+JqdYnPgw-fpQ*zatizb!lcN_%!+=oJ>|6;VvDm~srcTcK0rL8q{Kl$;fM zy@K|V1e~c>L4Rn5{!lgi6JKJ(k%&4)b$wN9lKq^oW<*tMLyPQN0zISwdI;?`w9i-} zOVC~u>7L;+7(4ymso!7DqJQ-Bc$mRF_8FARM!D{IJF_E!ub&ClJK)Er&S~T_T8LOD z;_>=8sh;ro?~W>Sn$8gYbJ{+Zo6`!PKlWxo@5t59$q@T@hFd~;qJ0~DaOm!uzZmEp ze+N$g+HfQr%?2d?3>Un53ayQ;S>uB0yZVa6!#5+Jvl4qxYa_$GN~@23 zq>SpV#~y;5&Wheb`ouDf|^ z;Kx}j*mD%VYtIy$5DP?eR39H7ZjSPPoKw^}%IU`NyC1{NQN@pQ62?#S8L+9joxt~5 zZl}#^ERymbc^B2(PFvL6PD3WCv3a?eLm|Ed&};vq@My>z+und50prh~!WZCi#fJdr zXyES`i>_&?Ka-z>>F&?fx~q-&b4kzQ`e@Gy$D?Tu;hfIz_ZfyycUBCw=htv^MLR2) zaVQ3Uzek2eq9<2=GTQfd>#oq;5!U#_Vwr&O+ML#v9n@*8p$XAa|h7n z1YIQWz~(i_>J2_8r~wQb7bCwe5x6w@i$&QCiJA;IrdmOA80JL^;h&HXP&AjT_Ki!5^C4P`2cbR$I|&gJJr@J4+ZXPvhHdo^0&( z+CIBx-|^9!WfaY$vPL`5Q;)UZ_6|b5%Q&YQs4Zuk($^`X!#6 z0N)P{KE!D}!<~Bg|VGYRN8^r*ZPvdu`2mnw7iLiCA}`zcM0 zT^`{6&Mqv1o7cx z6z56(k?F2i`(r{#e^6|Y0QyO9P-M>M(Qcwc=?@zB4EFyBwLj=TMebALibyYiO6`v= z)JDMS)=mYwHlXZh;1?&m=@VrQsPluH|80ncqWRxle`xdnOU#dFu*cDSra5w_+9%(u zv9ItmGh73|K)Xqf*oQGz;`ax*lktw|Qu;x+2D*`d^}KBTjdtmYc)GJ|pgWzdHyX1P z;2Y@H-^-@2djdN2DewncCr-dHqy8Um6r}YmzeR8?L6;?Z&)KE@ut)UA8PEX4J4P|z z9%*Zl)ioSI1H|=>F-(KVeDqmY9lO1_}fA|O?w+(!Ffu{uT z$c{W4w9JyuF8!GV+E_f3=Ep;_$RXI+KdP_yO@(jHp~Xjii@@h8risZVMe+WaCd$uA zcM~pwA5FuOhF|+_A+Yl=ggtUKtoJQgIw@q>4 zJ@~&b{{I&H$+w7oB6&wU>rw3c)i?`)eIK?QJM8JhivFjcZ&+qYhw7?r1C+({==kH%1FMWN7(0R~e$^YiXL`jdUD96Ok8@<5i zT{l^7du+1oO-PizlRbs|@bThqcJGEs@_}b2$=MQ!mA|nh$lp~?lzp2f z%HLVygDvtD z(miC}*r|+nwppghrDn6-X1NaEf{b>udtJ4d%AM6Ut*Z|q=aAg&+j&&6HxEz5Stxv` z7T(?LJ0u_Tk*)bs#93e33|lkKMXN@B>tlQqb`8ciVau4Ate%15{IfP0d5}MB_U*1e z63BxLeyZJ{RIT#PWSrr&l;`PqXS}HK%*IkhPmDLO-PjI3OnlP~p1hNu!8aq>s%c;D zj&JTl89m?p-D{zIbB95>dr>ZuEY`Kd5_BI7U(^4@89Lry}W{-N-tWi(|C`+>d}e5|2Ct9_6igub>V0yzHy^pkQ-Cf!uzr zl7qdi;@yJH7OWxu|8@E5|0!qK|CP88hwz@r8aEcc1E(tniVuOe=38(l71rD4{dCuj zq66HGSi@-;2fx3NCk1!rSa2Usu+4KLXeND`{v(}-?$cR{x{7YV+tvrV|4KY|2YBo> z;<30}rBb~w25bI(;9@+M$w64}kdu`4uEp^XYTl$^!+>&WHK}4Lkso= z+&5hr51vXgCdGnT-D7d)lQ%_T}B(;;TdMpX(Z`T8A|tZ!~_dNj~I@hs?MRaZCw_V}g9x zSY=A|%ZHk5D8tUB_$^h#m!oRq-QatPkO^T6Yn00qm@Q0(Y`B8?D^;;GI3s^0*Pp4M z2Dme6U(OZ8>p)+({z{<#F3>*=^h%(g?ui@@`rY`w7W5~8{wmO)2>Ka4pkIcpO7tuN zoynlH1@sRApVj!b)-K4rjV+)*TwFizk94m}yXKG7@oIQ~r1<}j^?R{O``3pSUqT3o$;!F&=J=&oqqBB^aNV@OvG`ClTXQjqyps z_^|%Q_-OsT6ywu}bPKYhVti!y3egy8;|3k1@mq|KwvQ_MMh)iRV}|}j%)jmb#rdM_ z7GhVz-{XGJ0WqIiFA3allI*?~~ z6L@kF_$~2mC(7oj`{N&h$G`X4M~hbQX!CgRXq2IIl;`>XZ6id2rOy$u59^HjgX9rw z<Sa*ExB`lILhBs863 z4YzM<@3j4s=>V==aR+3D1;S|YmxyE3>m;dSpz8_-EKn0`ISlPfMDcuwd!^G)In z1~3^st{mc&#qE(`ax^-(Si}k8U~=WkQBIBolf&;cM~fGQgUOXEN4cjsn0}c8@5yd| zcIjWGAMP|^?>1u(w_q=if@}dFUaq3cNdhj_=h4-&E4~ngZ`(PvLj?I4gf&@YGfd(-nnElPn}S z@$Rt#XJt*nzQ?lU1K&6c4{pkkkFUy3{H~kFeh1&nWJtb&q!>b5NZ}Q3m}D9ybYNFcD)>f-xz^ z*nsCPeV@ryboNa9+VEz?K)`?L&v9D&dG(RyDM^vom&?!Y-(J!=W{ zMoqS$yLLxH?@X>iJOugKLf7-#;=1umx^i{s9;@FQUQ&4(wMmmjEPoE&8#Wu1`@XRo zU9W`l%NX!hz$`SbMV0}4-n7_|9$I_?b6^YjlJDHnSYa zTAnTt2H53j9}=nUhXg;x0C!v1uIzRMmKI)9lQEfdey^C!9kw6s_d zFUS3EcY%fxYNL>%*7}pAV$=L9C~Kt&nt}|D4QyG6_mQ2g(l?BGvn@c3v#E=PwtPl zepoQyJU|vI--GXQKYa7`tV+G9`g$>HJ>;cl^`d2MUn>C3&+Z8DUPpyhq(0b(9NFI@ z#%e73;RmfBoEPc(A=BRv*=j#1`R23T^QjNO%Z~%b(+R@1hmo7iO8g_5^tV2;(9ct7 zrsoQ0p-|a^_I*;|NKTgHHrYGxiZ^x6kHPq%3>!bZqj95hCMt(KgHzOfc|7R91w7_o z!1pY8jKdtO(og;j+3vT2zq>I!`m!>H3hk7;Dcijr^}d7;o2l}8*^)3_cC1ZAAL4rn za{gCNm1EMT$&Nq7%h8q7kn-)zwQr#N{*yj2$N!!yR>SE(`bJu$KJ zz5SzQ+OtXD9tV9p9sT|=Vi|7%-*aq_Qt4LCm}(WeYZvJH{1?dIrp>)~g6JmxnCX53 z^~&JKW{sw^lHTq8bl<|+nS-$R42CWqD>Atd>-~M)O~>RyJZrp?UvhxairyKl5&#&nHp8#k56=VY_0^i-v_^k6P_CB;c-ak&|uL>@& zKl53C<7DXxb1}}bQruN2PjsKxdC}GO&IeHc4>!h2>&@nT{aI623HoelCg{#Wzh&dz z1Et^UN{aH`7f+PxM?p7-jaA-i&wu%?BB_y`A;Gpf8|Oz`%{V_w!1+<4bo`nm=@@cs z9>s;lM@IF*c~W1gy(B8%wQ3B`lTvY>l!o)9u{ci}CpEs4FEzk7RJLS|tAE*lzBJAY zJaoRa0c+N^)x2j5zMV02j%1PBOD5)*fqrL6~B|STl`MKwbi*d#z z&aCRO&sH@^z9ZGm zzIy17GoU}x-Z>IB+lKn1KH58nQCZw?=R)iV#Xylvbr*C;=8KO!+*5H*H5EGlROtNN z`B-fgcRoh?|1i@!X1{=)qqeFk>^WF1e-1VT`#0U~P5V39aBMi^DpJq5C_l-|uyF;? zd8>Op#zn6y2bU4tSEGzx$LsfU==vFLP%aAPdU4i;oFo^JPPRM8lO@hQZfviGPPV%{ zAD@5iQ}*vZph?}o5zCkxVz2$O0qfD=tn0~#{W=!zz%)MVsz6{>cYgpR$Noh6#h;)A$FXVq{DYhNNaZ*?J%aPd!cGFMA>1o_2P1@fPFdlm8UL|8u~^$vgU?8xrT>YChB+e@@jrNMkRJ!>2TCj&{2fao$2xeosJXm! zXS2Tp+-}c5S3>t+HBMfQ{Y%;}?8!6r9rsK0g+IQC@^qp9m9tDO<|o~K4`4q@caR6| z$-(Exzd)H~lq(E*y4YT<>$~|XePbvm8Qa^$0@_D4I%WsxXk1`RFr;IK3L^!0+Q8HH zgQvN0j_Zw|C?6P#{W1Y(xQs{P>~_AoSF`VwGtZ&j${xzjZ)?@_+ucUzw`UP6_SHjN zzl1rz9S(Z*=eJ#`TNV<-g8hu`yU2sJh;*@J><587SZ!$gHj=Zry8+togdR^k5;l#% zod6%=c_;Q=@X8>6nsEE^4C%xoI_C|}g=ORRV{PB#?A49Mt_zjD&z3E|iT3FCJ=IfqhSdsqUqX#U2I^wxMkJ<(S3i3}CYTiz`=-a;f2A)~YmOt^j6nwD?#!m`Yn% zxpI^h2y{poptIo@B-;tQ_y#wzS(7ROl`{4Obd@9pq z@2&Wr*Hri$^k-XTitGifseoZ$H&HI?Gf6i0iIz*&mB^C@Oq9(7qU4DQ#q#`$>Vj)= zcjNqunu5s*CHQ`<;D!V{zSk7|40go%6>AG-B^2R%UBT>i^j%d@3|r#-iq!@CK-)>s zwlAx^@Z^y4!hN9YBDSZTr&jdjNiezLTJDUo3uG$_pPtKNXMi6y_vE z%NO^t;I7Ch`HGn)`GPF7+&;6Uvjd;@E>kCKx21pnWs?QD<3)2PY+JRrY`u_dYY)Ll$Cm##41(E$c+x;-glwvNB9Yo7%z6|e_ zwUOa3cMrX*%w#y|?5pV|vYA}y|NVFRP5+nRT%O6X7m9Q6-G+Bw@CK^$8p?F-7!}ce zuHScO5De^nyuEtfOQHMjM1yiuQ7+=XYw6GI)%^XT4^&u0?7y{wm+ileIgV`cDa@U- zpg|u;i~Tn!HeB-==VKIy{72b;vq7J#^CC8UF!o=?XI%3a&qm*vDvM!DERj9&S+FI- zRz09d_Vmw?qhP;|%_^2XnVGVXWtaP6-gz?9VNdiF?!aA`@AWsyAH?9!Pz&izxHA;r zWfjr+yW??Z=-V;*jL&d9f%d!7`S8g=>|+e*B0DzD6^}2lkAnTyB9^`#!|c0c$Nm9y zlJ7d*8Tyi2v4bvCY}tsPxKM;07x7owtln<{ubsun(tU~9?%%daBc@D!6=d(;S>Ra%qJm5O4g^yrA zzs@cXG@&m(!dZYi?(g-tU@b(+dx}l+r}0=5Gog2lH+8aa%!ki11!iNX@r8}OHXUON z8++p|G`8Dg)IL#c>~Cm&!j0+cXdmh8G^W%q2PN%nfW}j?vA>0Se4o(y`dg5Ng8V9& zPZ<0vEQ0t9=1-9QT=lCcL!T>mF$DWnXnXdDoc)~Tt11%mEux9##vxypHOR*kXH$Hh z79s{W5$R5iInHcx7-F=-=uSbr z+sHS+@qZNFt;Hn5hon)kXNTxcGUfo&op5f$-?v6FJf--L=|-CFv_Ci|aXS9r8%Z~^ zM6efX`qrnwi~Jv&U+Wma3}*|Yn8YsVTPLzeCWl?f67XB6yM6bMozBg`=a17VhZ!no>TabWRfhb z3F6NbQy7K)h2Ev&ot5|;;-EB}$@lXVn@R9o72Fgrua_rE4Cdh}gK}4)TqJpdblUIX zhjBU(YlwTu)w$@(7FQxx>I~Xp;Lj8^7mehIBy}!+0=oQigpe5`N5rGAv~#`vn14## z8FcJAKGuq4kMthv-{ICC7jp=CNo}VmTf83aG>SRY%S&2J86R`_>A#dU_hd*rmE4)`j;?V1 zxPGBs`ik9kO)`F#+o|@YmII#gFE(eiJf=zxm*1kl6uUF&4N80-$$M9*b0!b+yOQ6F zi%|s+(fnXe-&%rL>0-o6!w)9*+B3BF^||`>x%|WN2b$Z&BlP9<@a_y zYNrvO`0y)*Pmt^s+|E!wu^nwP;uAOGeNXtr+m_z(iC0jb=MxsnOO1AePt-n&c7spU zK979g;1jj)V{EW4{W)AB%^QtR=;zCE#KDB&6Nde$=MxX8eK{peUurr1?n8eW@rgWj z&YTaQ(0Hk4i!+nYxZ`57#nmpb4HEx>7(OFgoW9(Ym4QC&DxnzN{y2w1eD3mrka41! zuZj?5mnk;a34aG`U+}b8_&vm0rG0(kqyuU3(m}-M*2RvOw)B}GJ(pG>y?}EaEhe`g z`o?83@5#nD#hOHp$(;k-v*9Z-3%(MHoy`i_n)wCRSGNwo{$<~xUAuhDC(wmEqTuhB z2%iPYn@TeHu_MTbFgR>LujD~yyM=q9p4VQk>E1$p#pjUs+p_hq#IA7KCu>Zag z%In$<%6*4&;pBrZ$gcdk2Aj7|b^Y71{xNUE$mT)w)<`!0@Sn>1-vOHZ>))9YBAdVe z0+Y>g27uTn+zX<_&8ClgPd!tH&Wrn+u7d3y=hhzt$0{vF-INHj`4EynR~AdO&yd|^ z3t(t6_#D(_=k;XcuGmpP{)bbj+==vYuk*N_;|y`%pw@?M6LfCUll*;N#C8$BG8Lb8 zHqYAX9B+tkH1LJf8NMc+0dwCd*7Y>nvW%Ud2lAbsPpm7St4zy3)m~lQx;oMAn{sTI zZ*~1K7JC$jbutX+no|8yb`Nh^74GU?Q}44n&-tY0>ee;z1?qq=5XJiBAU-mjoI!E| z$r+`npM&}))b|3P6Zq`F=LA0Ff;#Lp7lq`{j6z@8Ou|*fvrgkVoJ_&)Tmn69pl37a zp?i-6&~F3%F3?Z#DYwcdv+3|=d=tF=fJgI*^fdk+i*KF}$Tt5(8PxUX(KO1ze>v8@ zeoe<2tm%sl%AI{aviw5xdTV9YUpk@dXgSZ>+P38>GK^!8IPDu{Z5!B34c9iGU$*s2 zWo-+f&A+zo1Gu%V$gQ8CPXalr$mW;<`89BcSAqYD))cJ4y2@MsLU+4R-%<{rPIV1d zlHJo)D7q4`{-Hx_ai65S|4yyn&TN`|Y-0DhIkbK4Tj0T1DR=Y=t2b(Unf|V}uW21o zuC^FKnqM5|j<$HaR0%u6)11!D-+K~nuG2i%?o#3NuxUCs4?~lsr*ZS`YIRQXI(L4A zd9UAJ$lpsp7k`C0rY{$5Q10e#=Axl2?NsNXbC4(@4(NPk>C4o4_#cdoe;x|`LS*R? z=qn?gd*5^a$Fj6XZKrFHxD@R?Us?M5FO>E6d`LS(W$ACxCL>w867PE=OCJ_`Crkea z&_&X&+1Tf8{A#hN;ctzxPx!)p`*S_AeX*` zJFOG&e|49Z7V=I1>{%5{B#fG`m|BV0l>SWL$-yO*KVRPnbc?({JeHuA< zwY~XSzzipAGW#^-=o1FH^%F40j8@JMq&KLqn1Xi}X1CT>|$24{xv1^f+GDoA>Wje+u(=3bSDMH(*S+(HTsv9e$w#a^)aKDBf8Z?)-(nvql?t@%CRdK)aJ?K%{kc%r z4lDBk>VQ5$vTD~-q4N}c11NsgRbi4{73hamR!L9mX3*-j#JN8NY-fxe<$hnVxngC3 zGai0%6|3-Um$$~lzjs}n?25O`&yi2>I;*?|zP>M{!q<00y!=m7GJjW1J`+ungbcRfzSX7@Ci9R#r?t zzSpTfy;D`6-YKe2uhs9h=qJhQJSWAnK4GD6@;W1VjJJ zW1AHn^2u17F`0|x{m8|~{4dwqr=zO0FOB zcl9FQkIS;2*_sL}t{mCs zv~pcLVqiy3hb=b)cH~U>uf{Mt@)X2K2$#c$54L0z#n{7++?MMsEMIAoyI@0Re2RnF zhH@?%+sYD|?8Z*`r&J7AayhoIL!4ihr?3)!D^A3KRunr6>tJ`T>>ne0E$}Hp|7}HG zvOPE8+Zi*F@fPQB>u2MjZz~|DM>*Y=9*ImJP7Tjzx7Tx4Rd1EV|2_w_T0H zoYL%NmtY-QVS_O`t7mt4gC-kja)Bm-Yr^@S6*TepzGeajtt*z#9slvT1_76L2G|$n zcsrTVeKWs6pX&MEHJd~E-Yo{@u0Xkne9vOpL%On---Pi!$8d%3IR}dsh=)60z8AMw z;d`S&m!Izm))2lIgZ>a=$p?M{i+3lxuomwwK*n%kPa_-J=G>?~bjE81yixe5e4=rI zvjBVoyecS%^>-AQu#bnc)6qDR{G+c!XWf)ng4UM<>w#cs zcDhpZoi^X+V63Unc{|-qybHJ9^!B#}=rjFVc*GUD7H&2uw-n_ftpx)+-EP67t_9a% z@trnfJDpwzFgo+T_A_NITnW1TYrzv8Vy7!XUm4ly&TRTWwbL~U!X>ok5kEUv{5{%f zWT!(rck{ZE(V2Im+Rn~^y#Rek?F_ZkMXPIS8`c2t8}l^U+7mmS>Fha{le?$BF{ge! zr?=BJEhH(A4ocYI4tbdmKFQ4jl&vf{hk&Z}wN%5gS06*7P&}WpxgZlDy z=$voCH-_pfd8{+s6V?B5&hT10J1d~^$YTCgWaDc<-;l3pcf5?oh0arqVEhpYtwb5_RpM^ZbF3Yf>PGr9uvihOg~Fw>MW1i!XA{`V-;A^W;|8mhn9W-ve&2BffT^ zJB6)z8gI%2ej{Mag={njvXOEw-yQ5#D(uTt*q7sb;Ppi;cK5%mt&}s8a_RIQ_B|@> z3>9`Jqq~^V{SAYC{&e50!ZrgY$r#ix^h|jbt+9x6jB(ByhV#*QEA1C+Hx4K(J2SBC zF03i|#r?!~jaPB+-xI)1&kT1QaK}4mPM;4WjhrJsm9OU3;zhnt=m zZs3bcRBtJ)xqRhc_f1-I0{-)topBdi1z}rv3E0mRu zJGXo;<{{=F<}t|v_znyA8x?LX2bZ21T)>R$ueN7^(jF`N(NuQVIEsS~!PCt;Y9?Hm zC(ATk>NCTY0$dj;xZ+Zsv*Ird?LRi|SZ86^Lxgt9YCCV#aHId|nc+?YZme^fGe-TV z={HvBH0{;(zPcsNzSSe!6&(k^CH!6kzjqtz@2swBopOwHpk{WjUuFH{(oK^76EkoX}xSYTpy81nJ0`3x7f%(i}*i{(95YbF9aK{9Lf&5pI zU=#qxCJlx|g<%^ae)n%>UuQ7jrymK1CR6hEvj?%psD1aNpH$fy^6E8ynNqvo<$la3 z$9Cd*sczbHo7CS6cPsVjKYDHhtWDTs@IA+|UEz(dqb$u;%4@X{cu4odS=VmCX<<3j z+94|`@ra}oA`d6ZAAV5Dcgg%S97%}H5yS_Q?VU;<%PjXY}zdSF#RQyo&2p71wL5U5Z>*&i*_9cAdbS;QR1f`i(w(3OJaY zhJK`Hw(oT#r~UjVwtKgZmS&ZfWgIQ^%xLLGZkzBEX_0lbNGdI}I9lkL(bA0^m);F6 z{QlHsiQhvqk2a^*F}#XwM|^G-{l@>7X>?ek*)yXhLU9@uYHi z=$YZ^M$XgY?QU(&B3#@$p227l#M3Q-IY`e8cMs&gzp?t^*I%T57{%%a`uh_4jsE^j zqXqp<&x{tG9H?(M$$=d>Ul~@E%$d@pCi6K^Pe45$ z=g)ytllgvzvfasiM;{55`JB&$%6$6`%H3yBE)IJT_I=n;0=Z@HHYnF+0PhZia(fNR z-DFViV}o+jP%g5Jm&9WKmt_i__d{+{WxQHJxRh*ljX8+V*oasfMK&`@I=QNmx7Ce@ zY<35DIOMxp!KT)C3=!9&KE>9Dkr9JnaPnQPU{_%{hlmdW2H9;G49KIA=}GyoOwxGm&f4 z5}Y%28YizAMBgcPI|gP)L+Nc_hp0YVx5Pht-*306_!Bw&^vv*+%mkYk!w=l?$)Wf^ z>JC5V@=0zkv$+PoM{})^)fL2}&1&26o}L+Ql9SST`^~Mee+A|?=6G1R7prhT=it&a zgG+KzhT5k7Xj7)rreGVG4p&KNK3;y!B&dD(mWB`OhMpNdl7%i)@sSPe^3Xnf=qL2y zk*8_=1@T!8xBAR*lk9_j4%ong+eNa^hgweCez>Cra?qlpJ}htE5jf_&oXFNh=q*@QVE@i7Hxhj!jS3jGmI z_Gu^BpizVQjyW|%<{5(ew6`3Goy%h&^W*@RCi4tLSzhKbI`7W~-=#f_mr+Wd4wZQ_ z49Z<)P;Qh#xlsn?E;J}N)Sz5~LAfl0awdav$tc$&nJ3t;1(|1rBJ;S0h_@rIE`nVv zNM_;eT9A8G7@i^G^#milT`LGiu-v1<@D33t0ES=g3AJkl!SKsH?CxSk?rFjrBDv?q z<(%B(yj&;uWV+veN|AGzT?^|g0rQFEp0_>@$UXE-b7m87*FsqVWi`3ykHF)XdxWbD z?ON9Z*M;}_?OO1MNHMf)IZ*C@+phI{o<7f&hBDFxz`IT@$NV+mqsr`VI=j|5jlTa) zyH*%E=|RwABqwbK4Uy!e$aby7fL#mYSOZwz1(drLb}jr~OTWQ;$79^-{RDh#a+3*T zuE|YCIa)(??_gZ_>2NJoaSc&%+3>B&Q3u(7nqD2654Jm8H|cQAQE^47xT0CR6uIhS z_Mc|g>OHPP9j<&8SI0+6A0EQDCTBIW|IWW%Lv^?YtGHT#gUMYOGkRwGW)I}9s-H;D ze>VirpC9Nq=8v1Bhn^WdJ&?o7x}hi7o{|)>Ut#WkMYt;ibNO@nohyi|G+OW%<%L;PSfM=ZfChK&Hj;oqtB;n`0*b-GyFY} z+Y)|4pZ`wR7Z0m_Fj9sKVRR&`bk}TmL9Bg9sUv(e;kLOo*90!R}WF;WB3)s+d}2zKX-#acy6n0$GB44 zFJN^A@zA>g9fO`3Zd&I#e);&!29)h$?F(m*4Thbh!v2(lP0s{75Bgf%Pz5%0i*bTU z=-(UI-~U0Gn}6eA(=(%cAYhO3(>+cPH)I{?#^XN(8|(Xd4YvBsVE16&PyY$y;ZfVQ zQp1gLqGyIXWS-Mp3yei~?UK}XE!AM7UG&UgLzj%ZQk`d*@A0EU=ULiMXxCb`T{mdB z(Jp#sxS?aljq#7y8U1)gn!op}aL03S>6yVD1h}*Pa6{%nB)C6U;aS!#EK3PQkkCw*3leAccc5aO`ul~t^{s)7kqz{Op$=QNA!B*wkJdN zMw3CgI)id)2IV#zluI%w_k=;Y6Ug1Ir?1+eT!%q9C(1?E8`DE<Wui0o@qRITRD}z z4`nr-aiyAXo#8?5UBzx4Y%71~3G)+oE%ob+@W&r)Xe<8|<-*y@&Da;`0x#LhAL4OB z?>DlQZvm{^c%0t!5L@{h8ovKUTX|4^RP1w_t^797%_s(j* z4ZN*9WWU*w=GOrUUJ_t=_a`uUl77e0Z}9z3wyUxR{-bBcQ+pt1J;>^7I!;;-{2zkp z=|KPT^n6XfLC;GZJ@m}z>4DreyBm6Ve%ED5_v;kY7w6y_IBE$8r z-Qx&0*Y42_w;=w|6j)RA%y9KUrX#+josV?w2whW=+MUAc2HM?^exu!=YqX%<^vq}p zk@14t9SP5m>xsqyp40Rjc>d1ep=X9CMCR)`o;Dqx|55R5vb|N#vqV{oS0r>4?Fd2PW|$=6g$bL8Q8uU1aYZi*mv8CdEx< zu$ZT^!NI-~bK$Q+^t}oC1o-AUR^qOOs3O^%i2GJlpIjlT1ivTZH+*qdM&p0n({h=o z&}uKiT?SG4rMNHGakb*3TgbOXxIk@7n)?CP7P>c2@zXsnnx80E%i=tvae>3c+Cq01 z&>gwdj%ckNemRzM;%2*ZRhp|nvsJKn#`U#7bk{4wLlkR01?!G{nGZk6^(k^lY4W?C zjuy~yTrI265yj|u5I!Z;_jES|(XtQaSfBcRgUR1TiIWQMQ^kk)6!hipV#Ky@@ zdM^5fm#JxPkxV@e{lR4F9g4k1FH@U2{}Z04te-{kR?7Loo8YI~GjH?J^S=}7IWuBt zrCj9QdUA#UKN-bOSj&$Qj6;dLB73N-*Eou#c!q=SCX9rG&O?-Ttm-w6V(GiDsU5ic zFd`1c--Oz+q}Mn~q%Rl_OE);Q`y~gu=k^-MMCl!dgYJ!t)K`=IeO1tF9FwFM7>?*} za9r!hk=tt=*Gkn4M@%<3Ci`*3_Zr7!>3)VIwi_H%{5ZbD+SBG(&(_Bj=~jlr+6|8D z{5ZboHID0~VumBG8yr*pINs?sj;Ycxh9kZk9Mk+bUg$NBX;NQ?BcU4{*ZXl)_Zr9b z(&+=V&J(-AG2M^j{$AslF8!O~Na_a13_p%rdyQj;^d7^3yZIun^O=4ew4e5F?#`6z z8IC^P;JCq$V_2_o+#s!IIQn*j<7a*xeS3}LXVSwAN55`x%<|(njXl42eKkueWjOkG zgJZTI$G>}xW41Jf;h@~;k$C$YKaTf$jbn~9is7JG*+@9%`f=3v8pm8ImEoY6@JKjr z^y66HYaBO9=a8G~$r*?_kBDQQAIHPJ#xYMiz;L96;BcPns%3XIBDRjsTY_bwoBTL$ z?={Ywqz@R*^bnlEIBxdinAmF^H%ko+2jxx*KR#WR1DKuHyVZnz{FzeQi>A(fFX7WC zOWOaksq?_A_@re^U%z4MJUC>Kbnq=x=Qr=*&gI-9sUvr=)UgBiB7Q)>i}8Di)bTNX ze?q@Yqz((7V@;hMpW^#-dN)z(NWgO+y!#5@|Dku2q>cf2PQ$zX`2L38T`P5D;duz& z9me;!^lmcXI~cy}?qn;~`F zig$P5-6eQ8ir&qXIu_vFop^U8-i@VqH%J|e@NOyIO~AWr=-tnxj{ETLLA)!$yUFx! zmejEv?^fX5G`yQh?`BIKm3X%b?`GrOJbE`r>R5+&kKx^|cy|ZAn=5s!$GZ)9w*c?% zq<1$0uer118NAx9KB>}v^uqzP{Xklp^flUla7emz5bgd3?N;VVhQH0qJjwL8m(7#h zEPq?s9Ldf0x0B6}+(G^}vbjO?PHmeqFEH=6qMa|QbHak>SoFtB_ccbF5G;CU3@eTwhT z=^f_8m3SVDcVFTAKlBcBVgjD8!MpwV{)XORPL$wzGTt4=_qX&8bK(SkPs8t-_?$)` zmrzWWAkL@ps*D#G(|F+>8?WJr|E;0BJo^NV*P)9^Kl2m{(Sl@7GD%S>W+`TnMH2cs z3*#@0W_gIac9@XM!zBH1r&&64hei5+UKD)6Ne6(8jy!3k6K?ycx^>wu*>~z_i*GOT z9M+kazryTeh_Pb!F|#m-Y)Z%rDN-&Zx?_=Y%hK8LAkYQ-+1O3yl*8r7MMg1ND-cUX zXU%lSslI$aly|aR{-}>RC;-N}<=29yNuX^aXei!KH370Bx^AV!9#?^HGHIc8z(m`kf$pOou;Pa@xA zitC)uwNQcK$ZPg_79a6#?w=^~a6Ev=!`TlwE`jbK7~uW~+F%3StvI(nJH4hg+YWdd zP0u&`>@$vWG-V&Qfu=T;Q*s6b`mO~q?V#;u+!vo=3((}6(tx>S3T&;gzt7H{Kt19ACR>u-|zFi$(+gh>Kb9dVLRv&{65|Ry6V(E%R!%& zkEr(*RqbN;DcIJa&+28L>!V%hcfO6L!xWQu26Kt0?GGGnYe1U=v>|_L+C1cqI6b|= zm*zaj?r3lwm3__z02-k0EhrO70WRKxtmII~@eO7d=y0u94MXLsPmJdBsVZe$a&}d><}7aTndD~XBNL!QnY+q8&H);}K|O7~|C8DR8vdct zP!yoSJ_NCOD*vH1MRS91%U-~ten9L+t<^NhPy5_7s+Zzli!?WsJD~$KywB0_CTOsM zhHV-RO=JDA=3Pm!lzwIF`ui@x3SKv_0+#bstU^b5fDZd5!Sp*$b_LP@JnDH)#EwF% ze|Z4Ey(GAv2Q={b@8a;^2K-LozX|x;TdG^@s+4(#349BIT<#NCgKnug)Q0MbhgGW>;e3$Lt$nQz}H;s*n<@yZF z$DtezDWJgv8v22TwxczzO>(`j9DAz?ywg@y-D+t@IcMaOpG zbI!M+uB!EO(6`~}E?-*15nnsxolStP$q>|MUdTE;?EQdE^SP*Db!*WK_}WcxVL6Gk z`OL;0^y=5$UXG@ntnZz(-UUrqPmR{5F@gC!SvN0rG{NIvEt8=4FJ`k}c% z@(YbqIo4G<))o0B@@;-V?K2u9!}?4{O>>8<|0|Bhn?a)kG|tuftZB4=4Ccks*ai46 zn?E}KI~%ZQ{@8{gk8g{FyRTY&ww=7JlCH`JbfbI&wKWQbC6c zbo2)uj**YGdKTA1b_#+dDq0zaT3oS&~f~%x}J&xW73ZK z&#ws@6Fb%l-=<@0l`&y!swuFh?4xvR5p$2P=S4l2stbGy8oZ$46OD$ZEB*80)&T@3 z%fH8aK!ca%UJ8uwF2JI`P}a50U-zayR96`j|C-i~$=e(qf2KaQIA_Tk9Yp~;da|Zp z0xUb|D8gDYjfBjPeTjUDgZOfvLyRwnThkjkda6N>4fL!5J=u@}|5aV@E7-NmcQ(=M zTdmH`a`daFFFMgTPRviezW95Bi8;E-oNb_AW{2pP4{r2zgR80b$oaWqT=4Gz#S88kFOrzovz@a16NX*!C&-BsOc zt5)<_?=D{73zZ>C0F%aN^WETeBV}J3`jT?u*}yLehNFF#&!dB(=ebvKbX^F#oS-X5 z>zg9JZvu1HMSX*L%=e8AaEO;Fb2f+T)8P4P#~kMC_2=+M1HTLSO~7A168pJa?`xA= z*gg`_brgMG@g)ze8A0uf92xbFVE?I6_TnJDrz-MX{dP@Y4etXy4`})KkC0`mt6DdM zkCsCZWU>r=>B-h$d-*-cdpy5}jE279+xJhvv|)_O>ucCJlYC+WUuO0De5BLqLuI^= zIGX-WeGHo31Wipx(9RawFJIyQxKpiUJvu?XxavtcF^Qlh&t-N<7q$Y#BmIV;ShMfsT7Y$L6oATieh-ntjMtt=cKx+l75Lc+B+j=VHKgf*#Gb;psr1 z9y>qz^A?W2>7dUJ`mWRZsVLA-JYRRw`qHhFDS#7LUqk)<%lEApywi^U=I7sd4*v+? zcL4t|4S&;R9GrmO$?!uL<>BP<_?vkAk=J)7hd&AUoxmSQ;{*A-e1z;PRoAJjz8d#( zDr?HIB$)4cbn`bFFm1G^h9UL@b!bhw>eTv6KZ0#0cziv&z53MZz&dXy`asixA2fM^ z?~}m1Mc;???S8KrasT7F}~3nKHL-i1K?`-rgHdbU2hsJeAf=! zkse=9+LWc?@Z^eZ9FEI59KRtPLxu0G25k!Ubuy#xl)M`H{u2ln`s)LRN3lJn0S}91 zMqmCM?^k3B-|ZyZAnUu}^R(XJ`Wi7VgsYyzb#_$%R|(-t7QQPBgR3Wf*GxEQK6p~a z#~B`FKI{V?ZLST&`%T5@JIJc~@qzwWD|Fa9?Sk+coqKBW98SzP!IcOuR{?#iKNAJ~Mr+YPZXE~KKf$#b$aU18 zE>-T|3%EAGJp?=HlOw8H_l}VKXA2JO|MnS>>zc8bB=d4eimKxU+dG>%xbFb29dJJb zTt;J4fJRShWWD6C92^;N9DuVOaM-=bBXKYCT^})-(bZht>KQ4sdzU@3j{oZT=kpxQ zrvTFln6gG&QA)4+?{N;+?*YpNSQ`P$wz#I%R#uOk&X8fDyOJ!zbb|=Cs1+QnUjvp0 zuyEgC+Ui93*4sjJItSz%%qf5=fOp-l^hMM zBNRC%oW3@agP8-EcEG#}FmsMpw>DMR`EsgS*tyRia9(p&v+R2SFdwL*{Z?5k0h<@a zlLqATbPjF;;5q=;2DqEQAM2M7!_|%B>Jp!HqHaIbCB3xtP(bhTLT7MR<1EVh3GAoJ z9B#whCAgdMP3Lq+2o~y_P@kvo_{soZ+>bJ}2iKt-?ZMx}o*6MVvm}lA+S5JPbg#&1 z#9G|HrH|-^zq8;>70W5U(vczFxf3~gkVhvA`Ks^A4dkkZuX|8jq~>q`^iZ?t+Hcu& z5Ps_A71QO15Kn2t9aqkUomQ}MjIpsw=f zab@O#`Q;UB3ch6bZYVzD|NN`s`@ZtOT^syymf+{@@Pj7*b-LG7$vd6x{uF()4Eq4x zYmo(?><5>aq!rtv^C{o-L-3O(pL6n`o`-VV)N*C;RkudlI}^!=drP1EJgl2CwT@PP z3d%o-a(kl{*zNHD_A>m64|^Kw48$ixaJHu7lZ{UnKAHHC4)Nwbx*sLe{UFARY$(gv zceeXJd_O1%qa7C&cizL^rMs7~?+o|d_-=yilq1B772x;9!bs5pAMjC#TfLv^)D(9v zK$&g0U!*&~ZpRO%&QjzZFa58H`J?OG*B9;Ei+eAr-+J1%htUTgVs1Lj=FU>&BQK3H zcaj{Shu!si^AmG%7m6bu<>vRzUu{t4ILhF@lpf<>zR)hYf%`0EBu9V1O*MDc8Nl@d z?lRnU=g35veSPzH8kE_u(q|Qf{$&UI=C>P^`JCYNkiIXePlf{DMdnT`)}_8bwozNr z&*&5N{ui3Z$~@xd&{)v%K48(gv|~8njWl=W8NtK&yHuEC0J98t_tJc(`9^o~X)p=i zD}dKY@U8&7tIVBK2;S96`GW?USiFaW_<-jkv8*^rEWJ8OoR2l5#7AVhX`Vf<;#n4h zK3#b`VlUEV$M?8fuEkkcRxvZb%$$_(Sa~bnr{Z%PK56*ef=`O9pUd}SE>nEoa@in55UNZU!e z)u~X~)k(6eBS9=D+0}lv_&U}%m9=gTmR(u>bAkF@I|Srbq?iZ9B*31@bPwdKhwg^B z{l4P*fn6+TQZnvi!k*D-r}^?M&T4WgC-wmMvl^Z@4UeLG050=MWcW-)A+ov+^0Htr zBw4#Q$J58IV`Hsidsy48`~0J#L`f}cc|O=1CCleK@qvkkC2Fkaqs>{mFSh0WYg zo0p>v&pd5^iy3UIntc`%>0jxC|T{GP{+r=55N*B8` zQl(3iy{b{ii#m^>j^3tU3)q@oT8VNbf6<;n^4C2mA5s3=5yRv!y62H#{0R9A>j-y+ zsIr$mL$pGMqFBRJ$X*{JMlG*U5Uocad0a1hX>o#dKL_Qc)^a%4{6&$MIs@_&*4EYj zSV6i&QM;#O722Z7OIXtbAHW?YD=NTuE6iBW6!(_yjzgIgRqoMbCA#~O{@3=GG{`w5 z`;fe&$vz|pIl!AA_LA(A?jA>d3fbo>_MPn>jc<};h|gWl-etN+vF{A`2=<-kz69Sr zk#Ah9u8>NRLoyHJP^P2*%Su&t3);WCr~fzLwYxE%u2ok`Bs)zpfV~~CX)k}$zn4db zyL_KrdW*pvEs@Nm=dWwtQ^u~0aBUIty{XE+j5dj-Tj>63vW;Y8{OF#UbhhXH4Kyt4 zVcRCr7|*hIzFwJfX0<_kY5;3)7+CxmUjaCD_na&CDyhx@&Le;`rW-gpfI+f|D|W23 z(*VXI4u;XZBYOG*#%Ts)oYW2&b@%lj=em>bI#%ZHEr6lPT1GHvf2J{c1i2|`pS~ac ztd*nOFf?yT{?g|98w>KK->elnU6ri`n=3ypaNu5ESLJ5~TPpWLml0%F$=853?47%XxX``R0iO!N7EgP9V~$WDzJ>KlWvxZQd*?M#!god3 z6Uav9MVoGU)I3oCZYJI_JSk!Dc&!Q^PrkTW!?QUU538RMS|59SqX7DfNT>1k5k;+j zlR^EQKz#$5WVZl1OcWdL>?g80M^idCA+n znO&s5f%!XW@X9fk+W9lv>vj9-LBP~x5aNM0z&wn3)V8a-wLA}Jgbj*6GJ}0g_Bk$v z91_MB@geHlQU5E{=lASgz@hDh9+aWIa0<%NUP!z%;$8^94cZ6EZhc1C2WtgaidahH zYReF>eOI~rG#mTi8qNlB8Rie4BTBpD_2FY$yls1+e}hlH3BLIhUyb-@=pfqqv?bQG3a}|V;q%AVrt2(= z6)=*S2clnXsy#jyxRkY70=UJ1Uj(23cNrf@gAARf$k4UcrZm3{&HHMQylUig@nd;l ztsWzM7~^lyhktMF!jD4{|WS1Wa1L zl=Tm_*zQ7o?|s zukBAxb$=2v#6KbL)eqo{-R)0W-utJJ&*lEXnx2;KzF?cOKfE8%(;5ZvGrHeUv1`*F zmCo|I3_^QIPg{l@IRmj5tT0FAJIr*qUMBc|mV29%$=ll;{}#^Cep9CV|0(>xH%6(i z@Ns2tA^ijo*!*1M;T8bSe1e?}*wE`s z`C|We( z+Yyr}mmRdI@1oRq@p9Py7DCSj z?>Juy+T180XG=+_RM4|-txFEvk-o6I;Ph?#=l z0)AhI-zNDW&O9M2HVQ?Cvf^&R7EQ7u?AKR{CovbPtko1BWLIYOCxzA*$S&>4BOMUF zOVQ#1t$t2${T~;-g?+??eZ-7?gmUd*FR@@BDG~O3uj)9=*5hFN2YjE>#bo5$BO8PM zj1~ILZeG99?0gTg`${O+P=@=-SCzd3{t=pfQ!Ai-?bt7ry@T|M4D215?i$P$qG4GS z^qc)z%@end%fq~? z`!s8us}JcSl$$CYx>2e-8Fgv@CA|8&4`8j*9)3T@oXWmqG3`0Gd?Na-1pQZxek_uH zT=X83sj1vTl%xIIYD50Iew#7{Q^s%~<}w?z>7irhpfU4Wlri^QCO)W*S!vJ5Ow&u* znAz1a^Q4QLJ&I0xK4X@rju~X|z?gx)z?cQ>vN`BKqG6jw8MFUM2sdV$PD=fr=6>^c zO1)*^A)(_#x}s8Ut6FX@bj85<1oXlr^f~SKimzNIgB@v{XspQ|Xawtrf1cZLR2#3k zVaCg4R>sRYQcTdsYjf~;vGKk+w7!kbx}1s18g-2pe?;H0HQp3l-^drO6z3Fe^@{9D zHXA!^EZ+Zzwkwa1syf?uva=`%34wq*K}A4`71@G-li(7mQl;X)+(AnRRN5+wfS*iA zKZq8PYelMU?Sxj%ObJFSR;;ZPv@KddKyjLhZpdsmT8Xh!x|%w)Wnd5Jx|-l_=vQn^>Q-noN^F51Xr1I`$zM}u zi@W&i1;ADMnj3-Z2QK}yTHs&Qa6@BTD{LtZh-on4(;YZ31{$}v8J~Llj$DQM0n~pT z^>rRTh&B{o3?fqWH7}rSHhoRXo-ph^5$S8a@pMK#O^4^$wU5ek419#MC$I**_QaK- zeHG54B=!Y$ztllfUlYOkCG{YEV{iQrY!x_PSf;-H%#!Pxb$DNsXQ$3soLx8%BRKn1 z{r6Cxb$RBw>-Rxj<{YoVxHdl1f6S_$+MdL^Ys4AY&|B9Naj*4@{S}zZ)91!ZLho~t z(AD&gor*oe*t^fTws2<4IP3mGH$;rgeDv9S$wNQ(;uT|fRvrtS&(&TFrtcMTHX^T~ zxDWAe=y$LN#9r}rOTQ0q%uwHtm^E>q4z>KMe$b=-9MAgAMq+|}HlJwqRP`G?>d#NF zkG&2Zasl@`?ohvFsQN9b^|P&G>XYgJM7<;BI&sEFim7+pR&MsS24g+*UiOgdQr5GV z-tpl_p6ZR*0a(((pO399UHMONQbzWv5x=UqkTQ${_<(edI z@?Pf}TJak1<-Q%RIi4e`zSIdi82z3$q1AWn#Aa}e5dlt_#agNuf&n?y_ z{B_6M_rM9(?br))ZFWyzoBx|$-=G~NaFVe|Dfz=z;u=*@<0 zX$w4@{XY2WR_8wW0PXNTpbvo$@o2>4eGo+4YP<2&p?}#7|KD}l{T#MvcyZvFz{A=vr5?zCBWSYqtF^f6ilAd<+$+ZG zBDY_{pER6xzzG9~y1|C6xJzw4Ts!8;o7y6uWcT}hNW;4icoE>ySGNW_TE3qh#abEC zQYPO0=KI-ttR?3<;Nd@gmxlSjz>EWv`9SI`?wnGzZtYFP5WWOq*-xdbT7a?%lwE+b zVU#sc)`v3sy}S_E>Rz6O^5l1SqYm{|H=thj^DMtzS4E%Bq&m~W_L&ywYkl$O1F!?Y zC(`B5>6SIrTN$qkS%dzUePaun<(bw?Khwe|;7sFt$MnBcdaAP6&FIG*+@0hV=ufZ@ zXU(D<_!H#hSWmz|i+FrLITz)49?#1RV(xY| zj*Ef8w#cu!F<75Ei@yV7HpY?v-;1@D!1zaWUBAF{9H zxpJ)Es`?Ec_3zD4-(Ml?n?tOhtNJY-^?#jSANM-+;=@@VzJXn=I#s{bqkcnrebIlj z(r*6@i)WM=Ki?54d_^YTLOmYFJoz(eFGOqy`2um5x$=w@VO`@65%D|U@H^JA+pln^ z?Qhp8Y+wD`Z7`7zVr2fkz~Kqr1-2j9GnRp`fcp zqibMx+t5EWoWB6a1P*oRvVQ~G`={Hzc+bW??%5|atltAG46J5g4PL%%3h!9KO9bQ{ zOAPRAQ+)VczfT|1Fzy3J1Q@?j^t3qiL^`l}tE z&RpOmfU{8Hv}ibevg7o8mGhgRv zSZ4q$0IV~C)y}VVk_Q~C;S2+g37p}ICM{=7qywMS!5U6~;Dmw0_#L^Xoje(luGz=B zkA~9)I1%7bhpzK`VlCSIo*!#56MvVhVSR<~abSG|y|vsQdVYqIw0PVPQ9gn4pP{_h ze))L5!#lo>vVwO+dGe0CI*JFX>)FmblK-^j;cbQ~c*o{)e_!jmKS_U758koaOHVEQ zQDKu&{-_@|N&d0MwsV^FtHC|yrQ>-AeIfri=WHW+1o)4+u(2%K2>ZuI+CQXE-)xql zEfZxz?K&Rmi)z9)^48A%s}1mRlWQs7+rKAKe}iXFsqGZ8U9B5CiOy# zh8oG09B1&GE5s+Veu&RLu{*?P|5!af%?W|z5_|?1pB=sSj>OiuV{~OBq zBIYgYCuDpB{hf1mHXEqa-I%w*)&sk6a53yqI2S^${tjV(!3%ozm%P@Z+w!CA1N*{0 zEjqw{7DN{fM?VkbL^%c=3y#5BjH$TfJ;>jk#79OOWt zU$A`3gzN4hyX_L#eL^|sRGPEm<7Z6oV)_4l=eW?CBPt`@hw)OB=Rtg$v#O(W;WsdQ*TIp!aVCdehp#N^hMu(T#IAX`)E0GyEZP?(|Yr7C|`YKWev_=j$e0Yo}kam$v98rZH)Dup{<>JG(~ z+3!JDL}yl98J)4FAR5~0OU~HgOI{z#kIsA(VY8<8B#}aV+-Dllx_=*I2mP zo6G)ReMNNs%qydOXD9TbFFEg1Uvhq%FS+0=>=(Q3lM370UTHvnQ0vycUp`cAV=hA* z&#nw@>`}QJ81&uTkV5|%h>zBTYcAGZihjC6oJ`?-`&XK;>r5g^crmXIvKVPZy z3o3Sae!Jgpzu4Qqm%IXOQNkVsUSXR7TAf&5W!LT>dlh3%`!e>;`loY`g5H~c|I{zh zUfCx$)BgWRob~l$+^PFkI;P&SmtM5(&l72XJ`48eGhu(82>Ww2?9WxvZ&642C^61~ zI&R+2jUH`%4{dz|T1H~sy4%7Y5xS+XaCQyCxx#pdM%cW4zMi%(ubcM%vD0nZOS0hg z7Fc7VjmJqW-mPA=4Ysj(9=mBH|1cUq)cdc*c+loM8SCg9tlvv~#t32?z6B1HMYy;z=8Gr|#W7&`37a-O|*WV>I1{cErAUB*VT*RLXr5KgPNieH8nq zHg(^m>V{-48cpBaJfy0$UEj?7wz4IYEY9TTt#Z75y#pHPPKNDazS9$`#?80QTc#yK)Zj&pc`)kTeS zOX@g_`hU$(-yALL2gk=+vUh7J9n1jAM(FD_OC`RvR?lU|B#!2MgI^nFRx{om&6Er|CLyE zYF=7W=OvqsMDxLdZoW5dy(`NjrB>4)GunDPoR<+^^Aa!7=0)9AWwBuxPtrh}fio|T zzf|)a`Tw1m7y2i(-!<)Xa!U|dy>3V8dK!~B@T?KAQys~Pl&GY+u{dQL1czn`SnH>it`A8A1*{Jh*OwIZs1Ftxtd zT^ND=Jn$)E1MFCJ+JoD5==iSRQ=>6%>h2qgHr#h#qhrTy9)kR)L-6LXmmN3ap%-wfvfJl{rIlmd)rYy z+xbL4QRS1;&QoK3igOC%T!(lz-X9(D)LuR*UG23GeY3+;2adwpPxnd51>K}$4`SM! zb4taS^^Gl=?f9&S_}{v+z3F#|^gCIo%7T~Vx-J3l$a5ux?9hy`mL$;J6c0u=H?-m zG8gxUITPrX?|VJ<5EqLssIwcQxjYdR+QRcjnDo*0~UMzEJac=`R%=Jlv>L$H(q|=J+UYBx$)u+dt+{R=4iYj@_2Riyw|#8 z+Do zuE=TY4ZE%T(C>FJw;ZQbA7!WPc9f;8iT%0FIKp%Op|={w`EM={6j{4~$+AVk)cF_n zOET2=i(Hb;vR{2>P!M7Iqj&HZ89&0$caD^?@$VW7y9m>yl zp={PWpe|3?^LR#bz1zG5^q#$}D#q0#$LfzCle|P<_=0uO;_BV!jp8MKiClcMVK0(r ze*f5456Uy=EQgOSZr?*G2AMH_vv=lQI?I4`8%b-!3W z%0YJ~{HeI#Lv|Ud&+8YP$N%F@5$~M~xrFz<)a5ZYuyrf%`;Ol?ryh@IK#fNmSEG$@ zF>chkgTktjIV^7kcY3Voef5g(uE6&@d4JW=TD z=74XY@1;0zkIr!3CWgxMI-YCI1&!joZcROJMg0?;`tDpKxF@$6#!j&!x| zRyb7(N2B+A&-yD3<7oDGTe<%j>!+%I(4+o^8S2MJ$ojB5&Q|qnJ?dZP)b|{(h&^85 zn=kBOye?Pmw5WDG=JzV6y_E6VHc*ZiWP}=p)2eW^@%n*N-;-XWx18TZv2{WR^j4^L z%6n&?-x*GODfA{zwa=|ntpN(BO5teq-so8$XH}(~pU6p8cU3=_T0bk#GqJ1Sc_{Pp z4*FKwBv%@yeFld6Sf?S*jB;fuc%BbnFI749+-Kk@U(r9_&M~a}V3TxmHI&6R{7#;O zpE^EFkh6R^2g$?G2i}o^AN{f9d6;*MIfb2E4ZLr0Z{q(u^YmP|($AiL==5_~w^{lx z-GH+Yyt?pDqF)dFcW7&eKa;R0!ly^%YnX;|l%Y+0zEO-k4DgG%3g3TGY>a*hzt1kK z0`Jx@cBv@WKX$SBMC_UPEQ?LS=UkNi9cX1P1?CH#SSnx;= z?c{CXYb0_>(5^^2Nw4(1LLO%L0I?r4MLWo?0G^`;W!&w2`y-jNZ4b`;!)fC}fsY&t zIq(bT{jHtLkJ#~9A+J+Rq{XYx9rbq@XbCNb zF9iA?+Gq27?Rf^|xIO~>ori%>e%f4uoDSg4$=A8ZF$UZ@g@;HtcvAA13&3A-Eq23N zWKNFfF!$s)|Blajd01mPf#kFJ&Kw;Z`3b%)j?V?)51(TELD#C}Q~15_$AzPEK=6ZY#->Jjnej#=q^epqpy_B|Q?Xeh#|2;)~=Au9zirpS#{XJlFeQ+M#Yc?D17+{HIoL|>L1U*!dzSg%8DTBdr?lCme!zw^}k#P<;LSPZt?+4-&1^?<)^ zHgNB%{jm!&m-I1{d*f)kEyxe>F*_6apSwu^C)e0>F89xpV}x9y%!2`6sVo5x`t}u6PPOS1bAY=zbO3%x`wHM!m^$YX z8+(oijcMb9G5Q2PNwYDZ?r{wrfREL#E|q4%6y)^i-elevA1`u)6kLGcyW;0U{B*<5 zWc(E2=X>};9+8;LBND#rj&UN72+r;Km}8z-Z$FRoDhK)U`8(ejD3p0b!YAP^g1ep{ z7ydcw@Vx=V`j~u=pit%$2_x3WEI1dx`Hr(o-i~*x@gC!+TV$;2 zTI9T5-qdDH!uz2&W{*`JrD5_+3jmWkKrs$gLo~ge^Y%>wJ}U0MAFtt*0>=anbJ!)e z*zdhoJcm4hoy$>ul!lcDtT3<`ry9cB_I$Uc9dpI=ZT^q-{>gV+f+**Hx8>U#ow55& z;D@K&3(UsN%Xcs)S;tJ=sK>oZOy;U{$0fh7VZIK`IOzPT8apk%qoa7Eof^(2;3R-^ zlfpSfJ?useYdx?GoIBSjEZ?E&VIS78)&R>7tn(CBi?cQ&1=(Xfey!oG1Wo`rW7~1G zSdk9mX?~{R+y)#IID>)H@G z`X0UsZBV|UUgHNSL%nc4%26+T1j=TWk?M{TG7@bwN-vCi^K8{x zAR}$l?NBNC?4~KbaNpRE8>Ec%h%F-ph>tVU$!AAhkIZK`1AQSat8kCc8^w5x+{(y- zcAjIKfwM8Ru@HXkxj4tDPo`hH^k4b+4YKZ@BIVEM1ajoXUw9kCI&b%|0g0beHKB`BYekLR6kP75R_Kc{R|>J4F;ui;3^lMX&$&L76iNzLnlSt1_l!e#JG> zTXL$Bp@OR94DjMJr`1%>N36p2;Pb9Wtiml1!dHA?PBetLf*I?4$(hF(8)hy(qH-|C z0OJn*d?Dg(WWF)l^;X+sPT8+s$bHV3GpA5z$NjsMSsn-9F%*9F@YS!$(B2Jdj=^KN z+w08yR;YvfwpW+V)%669-%0 z*fCa(c0a}5h7H$;JxCjF4nAqaowrx+G1YI$gK~dS-j(}nu-ymBGKV_$^zRJqgS~*pO}ia*T!mcQAfttm!s{aS(`MNCx508$|5EZhH*Y?r%R& zK9}(q-gEut_3}LNTHAsSk2AzgL+C*FA$Nn0TcFbj4Z0>e6MOG^?!AFUQN}^cKy1SG zLkpub5ub29;uDH+ZhP&sKijl;jlG)|eGJ&X(5rlfabUdAJ{7Z)zD9qCHW+Uvd;z@X zSnIF5jYgcS7jSPKK#T{@DC9VhIS)O~jD>6m=PuhB*+Dy_h{^Y(aNdRRPE?5FgZ=tl zXAWV1XWWSQ9Nu7$TS=C7=#P>*H{GJ4BXg27@P5?wL%T+2;ti?m@lI4d+NOU|DaXW5vF=y(gC6y*^!f?-o$yT($U%td zA7-sk^=nh>d&xoMUk)`U|2T|?l7IT3Ed%r7j>+!>-vPeWSEL|`ya4c+r$>K}Xw}Kfcg#U3%MYvziFJrMmZoVqQ-Koz4)vyTj81aKr~_H& z0u5&(a7^F~YsVSv;D|i#ne&NH&~Q!#P8c}-ffGh9i|`8MpXy}ZfRi?(ByUhhU7MEwNne1JOcccXIf zKPA8I!FS4UyHS?%+nXq#Reqb;yWOvcwtVq!=fEQ^@Oj&eu#n;4m)6IckN7#}dGhe> zY4(!g7ER7c8t)q43okCj8=M9B$!`iH=dS+#=DuG`x$Z_suG?nd&T!;9-iORJJ0SMO z3~BqK9}VO87fr+4o73{GC!zmU^2ASB2KFzODRRjY^eg%FuhRat7Gq@CavF88jrhHR z_k~ex?aIS@n8?c-!WbB}Io3?X9Fmv)4ax``!sXS;U*S9baXN~35OKTD+p+gHy^7XJ zpfw48b3N{M(mU8iFYH;u-UWGb3gk$ULw(V0zGyx9nXTZ(7-tW@y$1gaxv;B&eMq=n zjpR+l1^*ueZyoZ$JSGb!Z5%0d0>-b`>$nKjU}u&-EU-rNAYB<243uTw>M`6MSzF zd~c%%UTzjVokn6wT|4l=I|so#Z}PzVER>l(H7^RQ67~J0kGwMY4Zvl^fYwRy= zxbwi*7x8`2T|Fv`uxH(K`2xzbEZ%~#?LUruTnc=>?bGo)*ZBynbFORZA<;$tKUC3f_b`FCV{^}XEeh6 zuqyc`zQ1;$a5T=-5$3+CkbV};wE6V2W5Vj~aeYb2+xB?!jFS1_l)OD4hR06D+S%jLN3N6Dv(7s4 z>hn*~=g>OJVvs$j*l(43%*UV(+F5D0#JY&%bLQLQ5jM%Z#6c6p_vTyVWKoP6Mz zz!{=&S~Q#q*~iGxaK6CzFmRAZ!KTNNpJ>N~jL@DZAP!xDZV&o&y0aHsi3yy1;2f&_ z^oEA>0&wEM`2uH}p6ARfukEuan?Tv!D4R*1`YW)N%<}}w>oU*l9m+h?uaADs#9&@q z+_&(%>q(o{%5r}nYrGws=8kKF%_=3XP5Cyv{raA{Ps%nc9oYtPQDa^H&C>q!6#7D* zFx{_D<|Uhq|F5_G`ZnQykTGa>UNY!PpV%nnnzCa$zd}O3q2INno4hM&Ax)%>ygB)O(o8u=`SkS_?HujIRf3(ACgT5Uhj30f`2HAb)zMe;4G>mmQzS9@&SblEzy@fD-^yg}}`R-Jopw#z$*Z;urKXi{>M{|?i|4`121^k`hJ-y~X z8-5?o`4TVxLy3FG;m{2klzcpW6*BwtN&K6#;CrrD8~b$NGpDw*P4^(fs-3o)P|h zE6d}>*0XlJS-m}G-|fVheQo2e$C$a#VtvfG*0>%xZ{zU8x1@x>ZiSjV;m-#fMX|NU zrlZlO-@l9P zzKHos@%>AkuZApbW@>K)+Qj`Td;r~Z@!#|T{5Sf*d*ZFQ^a0$*-{Ax3w|xNpwhy4+ z_5ozRZ~6fGZ683t?E~nC58zKhZ$0-)L%K}oXCAf4@s#PB%fn-=x3Ldcw#ZkKVmlM{ zA4spCKrESo_j9D}Yn=6hs$cF=KboO_pg-$3m&fz1r&ax`)cTohXCrT4wxa}oWr35I z?J%L!HtyKc=C@;1{l--B)XtBNg4BU z#64_iV}Y+^%VEIx1D~>GyZ_rE`01UfVU+BVYeCFM5cyGjk^OB-&e3DATU|N0-Vs>gDfgqkE*rdm zt;2V}jxyxC8_^DJ4L?WOthR<+`JM#xfROK|tsz1^m)X-QXAH5?$GQe_fwV)EA)e-3 zEr$5>g4CP^%2(`O#1KD*`;_`G=4JTTYRLydCnIu_1c;Ble&E>-vnTAzpi2v-GVRZqtnWFOB9>l;=4P zeq#seZv_3+^G?Tn@*RZh@cBpZsEnlu;`@lCT=<ecweG+v9Aeh1@BP2 zgum?^XC8xC<*x8Ox5w=MFO0i6hodovk#};oKZM`SLGkgmcT|b^=3R(whTmXv_fYDX zC*p5L6ZuHoA=`{c((eG=LGXt;PR88@Mp+Xu*DPC9n|cR``Wu}3?l?iLiET!tglppS z@>WE^wbP>7NsVh1?fuzlPsIr)=l~#_b@9UFt=VrR|4%J^|HP(o_>+ZnX zHn1k#{v!9_4zvA5R_c0G_!w-@rndnn1DhIb9{0>I;47p%B_ zN9&AOn=gE5`qN7_Jf3ML@aQl9pZK0k)G$W@GYrhN3iA+rPfpcvjt5QzIQIePaCNaq zYj{0@7Y82osE4A9?XF=Q#PJ?6lhSPzc*AW_y0h|bM=y!RjI{0r)XYYRs%s6nE%UjpMch-k#w}$mk zU?qTcp`fXAK1^Ft$H>JSE~w-7VcHICrO$sB>E*o!_)kS%&h*#bOB%^KL>;h*e|)pyGl>aDu^HF#?rK1}cfYBFlUhh3f*HM)ey zFKWw4h8N#CF1&cfxYyd>v+Ec8+uc(3i0;>95AaaVdv<(xRlc45H2SM_{=%PW7yPMr z67SYU75&dXATM^pL|N{{cqv8+B$!}fv^aDgno4g z^ijeVuxOI8LFp}(Zs>Z>AFyWNlWl%^GW6ZEs*^v!?@yd;jQ*Ct-&UOr;&;ZQTw|BN zioaJN{|`PNN4e=f=xWb~?S2w`K5##U?0%>|^h6&R+dtK|0}K}OlhY6K-k^5_>7xFV zbdqk;&%Tt2&z$HY_?{1ATktDm9)TeI5o%D@-Ci!*<9Lm1mwOJeEyUBatzK-)_DKl4 zc-hD8c%%^9U+k+K`ME8}VE*vdiXH2(Vjl*GSpV0rk#B>LHuo5G*ngWQ$`2n?{yP9! z2Q-GRhEKW282kZkvHyqL7TeiD9sD$mHQEkNhwq0+JB?_kuO#2!pMtSj)t#pX?DV{VT0$8xRDd0E=Xv>tVQ>OGgTjRk1qwj3FM;cDZ1 zXoGVxr(O1R)}+^ZpGCaIz=O;dTw?oDxiG0GuhejN+vh_Ndztw@QgAC|evC_j%N%9q z9l%~;$5+_6tj9cL#61qULDV75Q$ce_*wv)>F2q*gTnOD`$5>!ry!T1FZJ=4aTWRl) zX=qEv-O2U_+Wo*;w?4G%9K4TFTv-qPgnMf}FnFdzUPQitN(=j4>@kJ$F7y$KZl8^_ zhdO`a{H?gMkvJZG{Pt=&C##SfPWazFUtGB9}D-opx&S7^aX#~znW(- z^c6eIN!7{jIHPE9?26AX^Ks6?r?ilNgB>=XpRhOb977z;hR}AH1uPk$FXPF&V-(o?|$0eug|5QVNduO_O#TxRQRtvro(T zU|Gv}bICDH<}vs@0NqS=wTN{x3-G_L{NI2k^GJN}#qUQqx#w>-=8t-^GckwelB?k} z2wTGe_!5=@E2lbHKbCr)EAe;a9awS|K7GhNfV~4>LZP37y{RB#+ltv2?6DTRFKTXx zFZ)4XLb*qW+Wp8hhMC51A;yid0KBv4XA$}ecUFeE%I91`hbQI=dRh0m^FHTdALasQ zUFZPrB%A)uoDKV~a`wAeUpaj%H)Wus%`VHk%}oRM^OaA^{hX=K^F9qk3rK50E_|PJ zle=v?f9|ZAX5rJAVK2O8w?9>#W7GOpk{1q*J+ksH9Ygpu9toeuBh%L178_%a$C_s! zPC_3t(I3KDMV+d<@1Y5kD?`)!3O+Rm{ZXiClFo)g=G|1ti2|H3M~m$R|)xvO);Ter~LH5<>R>+Sr^ci|sM zTNUgEBdlVaSu9&rm8!QB^|z$gPr%RL2$$M=L&M5b^@ASuw|mxKX&AYz-(2qhj`bzz z7wy-2)Zdw2KTca+yj<2d{nopxenV<~FTG<(2dU2N+KRlbf*Ie|y{{)?WkBMu#d zZoip_b)oc+GtnmGhBW=-D%gv5;?0&-h?6OSy-3$_hL6;9_Lh8>>L6|^N5k2J?{VP#3^*-K z%XYL@G_|#SvRU}L`ftSBJB@gU;8Vni#q=B^>A9Cbxzd@#1TYi86z`&O?Ny!HKIS!8 zgS5+b=AHXjHOzki(*TbUZ0~P6W}kBES{$7u*Bb3l`dWKN!+ac=eqb_Rhg=)O+v(JC z{D`$wbQ@?x$9q`ATLZiR@Wx0yzI~k zc=Lf523`-~9gbe`W({jPup+?v7H4#QcbRvF`oYBVwQZ4Eo7=(_ABguWs3Ts4_mXjr zTvUs4?z}TsYnT@TGY-u6ff>95xxf*l*no3|cIZCqR_wTV*4nl{!#20gUB~q(=h}%6 zO`Yo+4fk~5CV;ygxV0bRjcWKKw;UmHJHi>I;S2$ef&2Ms;P^og-=+#zz^}PNzQ-+e zV_9M-kJGUF0Lu?7>L2C$J1uR!7+tdKA$w?e+}8o%{Q`LA3e3a#>pC5~xc>@g|9%ck z6F5tNBWyv-8{5j4ZEb7#cz@eHnBP(8^V|x|!7}=CXP<-jHQd*M8wT!=f!pxaXt7sY z#oF+F)FAe1@7Q+s2W1$`;NH700ZZxp{*H3OmjGp{^Sc7&v+DdN9w~Hw%7>Tl3kyAs zU+DYbzfxkIhxo!IWJmYgCeZh##4M`!0)N5WoX{;vUxL1|9d}AT`E6UD=cgVByoU2; zAm1op-kJWff1oea=gmRRnG(puU*nuwv<2!&EOr6PjHJwx(^cj}asB@+ z{J#W#ti-4ndNRIC*H7sCAg2hMJ@g(@H+CRb=){D+4|!=84U%tW(xy+H8Rg4I|0r{L z{}^LSyZ$WkSsJ?mpYti}L2jFY@8sEj$j{+{dGcC*Le3206S=XY(;(;VyyL*? z*{pXY^nds}b1YsaKKsTl!RH+02UQY_0s2T(6Dn=SE+p+z(iP1+Z<;hOHf+%+=EUeWkBN zEE4<(q~8Ve%u?Pfi*X*;fmYJ#H4nwW&$bSa1)ZV4Kt{uw3{AJ=DqUl-9Qa}{RClY~ z?J+NR^ZyyvLALfQfyMclhqx@tokF*Bb~hPY>7wBVdp=6`A6#!v>Q*@z_lbLba4fDt zx!}bG(VgF*+$^l4i_eaRZo>NYD1Q;lLU+b-Tjep&nP}g^^)naP)S)fFrw2A^8Ap8R z1rG@y<)0+}ZNSBzX3Sze@v%m(|FB(;vCT*r(9g&SHjZY;SThT3B_r;~l6-&p9u zOQJLXhBIbOZZxz6xoYk}J}Bs|XRff{??wCD?X_soRwML7-tG6Z+h33KGqelwp^LlQ z`nuFJmSdE|F+zMa$7pH?^m4rn<=EVVvB9|(y3fvA3EEmeXdfHU_MMDl({`EM*O+ff z+pg}m?kb(O&30KYy40Q`O_a?igD$>nWv;=Ve-LrxxEsCJ=Leqr0Y(B59Qw+`(+it!*0#$lR14vczp(1exuX;q;G#C z$~o^x$orCW8CIAcG&4UF`3L%Hx%)HwFTUj5jW{E@o^!fdIpy%h#<~!{Qdj z)Nf6%AE*Ao7)|+qWx2n*^{%S#EA7zlDD?62DfMgD-b7iyC@kN)gHGilj)jT;h4DWh z{;tb4^D&M}?&rB@V12p$j)KS`*oxRl;n%Zv*^U6-nMtgDt}Svy_87luz*h49RABpo zO}`_oLm?Z^fN#K%meVr&?1IOIxoKaUPVe~|W&oH0U^0F)0-4sFwGKHjH-i`MTyD*= z8rCpinZTmluVkDO@W6W@^SiFrb%!& zVmR&j74HZgiTT~KrOgzwm+_ICci)A&3Dl+Bug}eUz*l_xYbZm$op(6-_UlnLE8kux zeSj6;&Yb#!Pf6hIN9gp*BPG_=h@H#e1DwLQD<9xryr=sBgCAce`Jkh0A7DTEcI;8d z2Uzj#{bFyTFQjEvp0R!b_|ir2%e`&4e(rZi&gdNBmrI}EUHEZwMwZ5IR`qc{(MC{| zA4t-dm_E9Vb-l+7#<-wLVz9N@jvEmcJ_X~cXJU#t9|NNNb z=@(+$$%|8_x`p!uUVN_j>=&CYKKsUQ!l!u8q=TG}kwW+-gGa8(K+>$Y& z4CRh@%5~VE1qFfRW~>$Q=F!rT$ZO&~PDU0?-dSpVcwZ9pkHCy99VK$~n=bx%)4dvh zjCmI84t~jQ{`kyyZT{GvcgY_sdp`3Hl*Zn>M6R0>@E7j6Q*<4Nbuhm=klavLx_48C z{%z85)cWCEDnAcm9R(cT%Y55uH*gwn?mZ@QBHyG}c{K56jg2!B^myTLd=}0OM1O?w znT>v_GJLy&?eSe;)#ekq{q}CC>o;cp;@rwe-HY%$ehIm)^YE?`{gQW%tIhG@`z!eV z>NsJ4vd1Y7UXE+D7;7|gT<-Sg@O!wRTI9qIEuL6eUx)X(3eKcGs;M@os;M^D*K{f9 z32~nOoqk6eA|B>g8IKY^#p;js%(6wbsduEPzbCzZoW8+`xfOS8_z0_;s^8#IKj~Tj zbHf}eb@Y*e);Cy-qWzZC`g^Z=D*DwWc+2y9Inn(KbEEs8F|02zo+0Kzs2Y)$SG%!b zQJS7UQkJTRT#os~-6P)C3!_~F^S6KDM6^+jwyL6guX(mHo_o#9Ez4KzsQs|1E!eaf zdfxqQ{_ZPw7!{3e<_(*X(;)l3JsWMPd;5oI!;dzor*Am<_8qmF@2tR_+}IY`3cc7e zJx_G{-E)nGIR%&jU{bbeU5-XSQ25ML( zz={BC6|icDA=d=#D7Ch}GqWAVC+sLZ3w0X1Yq$sTJr3MOz-`!!d%VKQs~5rVap?I2 z(Cf$T+|QZ%{q@DpoPP++1Tbf+ek0CH*^)Zb?{_tY^x-4`24Qm*% zu!lvg>MdQvJNo)%Je+Rh@SWp~l~C=BU-fg0)6Wik?H6b`Hv-25&L_Y*RGU&r!?^-DVc`5z(Nn9@(}9ot#Tw4J zz=;6oIpEX?+p-fw(9s(bXKFa3ffEPLAA#exajk}Y&vic!^EXe}xU%n`3Jtd$xC!7k z0JlZhxU$zhR;$|!b&b66l)Kaz`6`_`>%gXegoa}P#}Aya!l~78?7XwBxF@*A8}La# znlDg4fI2s$j=q<_zQ~c?xvwd^*Pt9__YlfvmE9)}PqVo#%;|51>7!!``5n1PN~~G; zz&8y!)7`m3VRuW(oumBh7d@IMa)p|?$f1|p8$Z38%sa#5Bk$yH-wmI7DR;aw&OEku zeDJth#J#>c&ODKyJ0OF+IL_>WzxU?vc8p{xe(%rUx8eWW$C-t-;~VQP8xvYQtTNcG zcKp5Y*`Iy2vh($ey;?8j!neMae*1p*2l9sFw@-b6^xNN#@tXr#pFV0ekjt3ElX`(g zZ2}=*)!(`{1tBk$ z`%CHnxw1OY$1*n_X9+qHqiZhxZj-qb7(JlF;M;PN{(hkUD~!v|?s7afLH?$lQN5qcID|#j#s=Zbe;_Zq=m2694iw-A zZ)G5+RlJ{pH!~KUjqjIB`z8FAcTnbq{zKR?Dc{qkX%^|5k^wnifbN!~ahRBnRO0amcx$33lBHXC+Jdzp>Ee@DqCL-u#3;^(cG_nvFth zAY_YbqXKc>$04_Dq4nZ#feU+25z7t=Bn$Wn`%E4_L)C!|jnMDR-gOqnw14a%#`+uB z=lK0weCOL49okwS&yzX(pUks$JE?OR{XT4;x&Oa&cPs417I<6pFQBCl?3Np`c0Jb9 z63{a8|B;sYZPh~eVg3zt(0=-So{XJvt?TRlAL$?s^p$3=Idd!MfQ>4+BTvRwxag<` z9q@$~=gfa|Uy+8{IR6+UX}$~^pz{pAo+slkTr`ybKhU7sr{1$0X?P1X&_2H_PsV4s zXfQwn&szEf{5QtoWSp_)dwI#PA!`Re%#-mNt~TlWzI%#ncRkK$z1<$H|0!r*e4?}$ zd(_>f>VjsT>pYu+IR6=!aj0ja8n3y#0#W)XnO~vpeK@0eN5S^rVCP)0?AWs!$XlU- zxzugKW+`-=BIg2Z|03tY5pOHqW)CYkFjv_Ar-3$U`qvfx;o3J1K9l*XPZT5I^Jd|(wy>@%6;QKG^^*MuO{D()`MGkH2&4R%)z61T8zDv{D zLsy4(ME_*pXvda)yTz_Q^*`v_V4h!NjSaNXuzxe&!#haGjePy5RmmHWL;1$9@V9|o zqoIO)ypfcTH$b{XXC8^qUirxzhZjX}=!4I)e3|RkqmSp>G_I#T_n3V6lnjwMZ9U44 zL0RMs5kB)M-?{mkfcqA8wsQXs%1<&sL}+M!vIugN*ZdsIHc*HAaMdBSLHn#(0esw< zq2c+`evP?$$zFpA_@l_2Vcv5!z#a#*iMNuz2Yd36O4t-VY0S6F&gmq5capZT7~2V; zkC>qAU#)TtNxER~&#;ERy3jrw6kRz(rJdVjezu`(5HT4XJJ0#?;E%-m8dx~QM;gxt zec&rXlk#P}gGU=L*!1jy-QApwb(LX^9@pqLr=ag^hF0#*P<9RJhW~^(d%ecgO*hI4 zAC}8OFZiF()mTrEo4nT3&xj45HDXWg1h#l1cN%cPPlcvq9TE5Hqbmy%+MbUOLXPO8 zt>D#1Tkbu-(C+utBCMnL%51*5zvP>dqboGMzvQov0}s6B8sr{78o8VM+2zXYa)|$( zZr6QK{VfN7v&%i$&n{<>=iXK>`Ms6o_hy6N!#fDpC5Rg}3nwBb2lCBvh}pRh?Nwh@ zS-%l)l@?av?>(E$LfA_Rzxql~k+8>G><{{ZWY`}S8f{|V4y>qb%s^WaX@j2_*TTpS*1}lQ z^*s7I@XTmvE7rM&sm}K=F906=ojSxrnL)(cfqsJL4!xY8+^ym1_Y*PgeX!nqJ%4`@ zO$Ny>gftmB+(kUs!(CVmJ1@Y-Um zX~<@!P4J_^|9^)y5=2?XCbH~hC`(!CrEhUp(hl#Nm<*s_v|XtjK8DCSbPVl$E6W4J zta6;?EL-I3o8k+T8Z+dJ(as=zU;@$yhQ1o?haZ3U;cvR$V*|z_VMu%0TF_+R4p*^8 zq(#`Ll&=N+VEhl`otVwAcdg5=@B1xqBR1|m!1V+7L(H+BU%@NKG0(sN%D#=VnQ|O2 z1Ge(BScLLISA#m#)oe#SF`ivAjHmx-IiAKz))v$i<5`tDp4oIgd|QqAnj{~2q~(Kd zt~^j;eQh0B{WbpX_Nm_H%Fm|qBF`835qb+h=G%TM^(?q2L~b@ec~sE18#;wnU{a=4 zdX{B|DCvl_n|KB*Id($@1ShA)UpRuS@3++ z51fqgs26-W+btFT)zq0yUn_kp=yNUC4sHD%%h{YG?nf`o3xWBOnyaHS%vD0@j01DM+YEi9z905rOrY-<_T}9eYq=j}&aJO5 zc}CclYp9Q{9ow$6bnC1Q4_oNlz*YNU2XNJX5Lmv`+p#*bM{Ut?;=tivc@^U*X>xEn zL(`KQRuiyHVEt8LRh2q4b)ZLY)Np)@zZ z4C-}pc3l*4&EZcq9PXDmaLCt|FLV6HQfwE?v)kE!tl?b?yaezT0cACr>nmD#Zn_zlD4f>IYDNBI@h=;uN%@&fI}0BhFluWN?SpR{ z z?TYS&q#HaId9u#ZJsZBhlusf{PmNOlSA(_9cR)EN3io>8LNBmBQrBy5LvC;B=jJMN z4a$I@S|91%drZ9t#zpx5`a_^?!IbLgT0z%oQR)L5JuuGz=A2Gq4hL_@yD)-WqnkXi zPG%oFf#nB|@HvBT-fj;ZKX7*1>r0;l>c{9u8L8`oF)STZguUY)=WZM$TlQ0RgIJf; zkEwOXaajm|{2yR!sH?jbI>N}((b2&g9_#RJVXmjI&X<@a=vxSOh$8r5Qdh3y@*WmB zOOfBR1~`p3_Z$;>KXi88xTL2fmcj9>%4fyFKSbHMRC@F zJ}+MJW6XUvUhzlv|95tRSG-x3wRyz`tW~*2Q+dUIM*sV~;@^O2^NP(zd4{<%p=aP+ z1&+5~0c~Qge9%Gc|IMcT3uUfTG1n)g*N-sgK%g)EUGb(^f9vn6etBwrx17cGPXDI( z(6#V?fJ|ij-4`XK+(q8RozLwmj3fRo_{$5>j)5~om$&G9!1qccoqUV)T;N4)ym7$u z1Mg$3Yqt-BkhLQ6Jx*l{{|?FrP(Fe3KKxI=?@t4+y6*>}oGxQA-r$?-{}fGL>x+JU zMGkx~;oG?|FS{pD4E0t&slf{gK0ZhL*z`GE#@@ex$wb z;pgYv@tA98-8;7E3eZj()~Cow%!fo7sWkS?dGi0z|l&R
    rT>VD7o)dYQ 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 (WWVk7 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

    Shows Google Play billing in-app messages, such as transactional - subscription updates. Play Billing 4.1.0+. + subscription updates. OpenIAP support starts in Spec 2.1.0 and{' '} + openiap-google 2.3.0. The upstream API is available in Play + Billing 4.1.0+; Play Billing 9.0+ also uses transactional messages for + pending subscription price-increase opt-ins.

    Wraps BillingClient.showInAppMessages(...). If the result is 'subscription-status-updated', use the returned{' '} purchaseToken to refresh the affected subscription state. + Google recommends checking transactional messages whenever the app + opens. This API implements the React Native request tracked in{' '} + + issue #221 + + .

    Signature

    @@ -140,12 +154,20 @@ function ShowInAppMessagesAndroid() { )`} ), typescript: ( - {`import { showInAppMessagesAndroid } from 'expo-iap'; + {`import { showInAppMessagesAndroid } from 'react-native-iap'; +// The same API is exported by expo-iap. if (Platform.OS === 'android') { const result = await showInAppMessagesAndroid({ categories: ['transactional'], }); + + if ( + result.responseCode === 'subscription-status-updated' && + result.purchaseToken + ) { + // Refresh this token through your subscription backend. + } }`} ), dart: ( diff --git a/packages/docs/src/pages/docs/apis/init-connection.tsx b/packages/docs/src/pages/docs/apis/init-connection.tsx index a4ac716c9..f5b6ea97c 100644 --- a/packages/docs/src/pages/docs/apis/init-connection.tsx +++ b/packages/docs/src/pages/docs/apis/init-connection.tsx @@ -109,7 +109,23 @@ function InitConnection() { connection time. EXTERNAL_CONTENT_LINK and{' '} EXTERNAL_OFFER require Billing 8.2.0+;{' '} EXTERNAL_PAYMENTS requires Billing 8.3.0+ (Japan only); - BILLING_CHOICE requires Billing 9.1.0+. + BILLING_CHOICE is available in OpenIAP Spec 2.1.0 /{' '} + openiap-google 2.3.0 and requires Billing 9.1.0+. + +
  • + billingChoiceScreenTypeAndroid{' '} + + (optional,{' '} + + BillingChoiceScreenTypeAndroid + + ) + {' '} + — OpenIAP Spec 2.1.0 / openiap-google 2.3.0. Requires + Play Billing 9.1.0+ and must match the Billing Choice renderer + configured in Play Console. Defaults to GOOGLE_RENDERED; + set DEVELOPER_RENDERED when your app owns the choice + screen.
  • @@ -143,6 +159,12 @@ await initConnection({ enableBillingProgramAndroid: 'external-offer', }); +// Developer-rendered Billing Choice (must match Play Console) +await initConnection({ + enableBillingProgramAndroid: 'billing-choice', + billingChoiceScreenTypeAndroid: 'developer-rendered', +}); + // --- Or via the useIAP() hook (also exported from react-native-iap) --- // useIAP auto-connects on mount and disconnects on unmount, so you almost // never need to call initConnection() yourself. Pass connection options @@ -167,10 +189,11 @@ try await OpenIapModule.shared.initConnection()`}
    {`// Standard connection openIapStore.initConnection() -// With alternative billing +// Developer-rendered Billing Choice openIapStore.initConnection( InitConnectionConfig( - alternativeBillingModeAndroid = AlternativeBillingModeAndroid.UserChoice + enableBillingProgramAndroid = BillingProgramAndroid.BillingChoice, + billingChoiceScreenTypeAndroid = BillingChoiceScreenTypeAndroid.DeveloperRendered ) )`} ), @@ -182,15 +205,20 @@ val kmpIAP = KmpIAP() // Standard connection kmpIAP.initConnection() -// With alternative billing +// Developer-rendered Billing Choice kmpIAP.initConnection( InitConnectionConfig( - alternativeBillingModeAndroid = AlternativeBillingModeAndroid.UserChoice + enableBillingProgramAndroid = BillingProgramAndroid.BillingChoice, + billingChoiceScreenTypeAndroid = BillingChoiceScreenTypeAndroid.DeveloperRendered ) )`} ), dart: ( - {`await FlutterInappPurchase.instance.initConnection();`} + {`await FlutterInappPurchase.instance.initConnection( + enableBillingProgramAndroid: BillingProgramAndroid.BillingChoice, + billingChoiceScreenTypeAndroid: + BillingChoiceScreenTypeAndroid.DeveloperRendered, +);`} ), csharp: ( {`using OpenIap; @@ -199,20 +227,22 @@ using OpenIap.Maui; // Standard connection await ((MutationResolver)OpenIapClient.Instance).InitConnectionAsync(); -// With alternative billing +// Developer-rendered Billing Choice await ((MutationResolver)OpenIapClient.Instance).InitConnectionAsync( new InitConnectionConfig { - EnableBillingProgramAndroid = BillingProgramAndroid.UserChoiceBilling, + EnableBillingProgramAndroid = BillingProgramAndroid.BillingChoice, + BillingChoiceScreenTypeAndroid = BillingChoiceScreenTypeAndroid.DeveloperRendered, });`} ), gdscript: ( {`# Standard connection var success = await iap.init_connection() -# With alternative billing (Android) +# Developer-rendered Billing Choice (Android) var config = InitConnectionConfig.new() -config.alternative_billing_mode_android = AlternativeBillingModeAndroid.USER_CHOICE +config.enable_billing_program_android = BillingProgramAndroid.BILLING_CHOICE +config.billing_choice_screen_type_android = BillingChoiceScreenTypeAndroid.DEVELOPER_RENDERED var success = await iap.init_connection(config)`} ), }} @@ -231,6 +261,10 @@ var success = await iap.init_connection(config)`} enableBillingProgramAndroid + , and{' '} + + billingChoiceScreenTypeAndroid + ).

    diff --git a/packages/docs/src/pages/docs/events.tsx b/packages/docs/src/pages/docs/events.tsx index cc8ef6bfb..c66955757 100644 --- a/packages/docs/src/pages/docs/events.tsx +++ b/packages/docs/src/pages/docs/events.tsx @@ -215,7 +215,8 @@ public enum IapEvent Fires when a user selects developer-provided billing in the - External Payments flow (8.3.0+, Japan only). + External Payments flow (8.3.0+) or Google-rendered Billing + Choice flow (9.1.0+). diff --git a/packages/docs/src/pages/docs/events/android/developer-provided-billing-listener-android.tsx b/packages/docs/src/pages/docs/events/android/developer-provided-billing-listener-android.tsx index 18697d4bd..0719c61cb 100644 --- a/packages/docs/src/pages/docs/events/android/developer-provided-billing-listener-android.tsx +++ b/packages/docs/src/pages/docs/events/android/developer-provided-billing-listener-android.tsx @@ -11,21 +11,26 @@ function DeveloperProvidedBillingListenerAndroid() {

    Android{' '} developerProvidedBillingListenerAndroid

    - Fired when a user selects developer-provided billing in the External - Payments flow on Android. This is different from User Choice Billing - - it presents a side-by-side choice dialog in the purchase flow itself. + Fired when a user selects developer-provided billing in an External + Payments or Billing Choice purchase flow. Billing Choice payload fields + are available in OpenIAP Spec 2.1.0 and openiap-google{' '} + 2.3.0, and require Play Billing 9.1.0+. Unlike User Choice Billing, this + event is tied to the developer billing option configured for the + purchase itself.

    - Note: Currently only available in Japan. + Eligibility: Availability depends on the enabled Google + Play billing program and market. External Payments launched in Japan; + Billing Choice has its own program eligibility.

    Listener Setup

    @@ -62,16 +67,32 @@ using OpenIap.Maui; // Observable callback approach. IDisposable subscription = OpenIapClient.Instance.DeveloperProvidedBillingAndroid.Subscribe(details => { - Console.WriteLine("External transaction token received; send it to your backend without logging it."); + Console.WriteLine($"Developer billing selected for {details.Products.Count} product(s)."); });`} ), }}

    Registers a listener for Developer Provided Billing events. This - listener is only triggered when the user selects the developer's payment - option (instead of Google Play) in the External Payments flow. + listener is triggered when the user selects the developer's payment + option instead of Google Play in an enabled developer billing program.

    +

    + React Native and Expo hook users can pass the same callback through{' '} + onDeveloperProvidedBillingAndroid. The hook also accepts{' '} + billingChoiceScreenTypeAndroid and returns the Billing + Choice Android APIs. +

    + {`const { + getBillingChoiceInfoAndroid, + showInAppMessagesAndroid, +} = useIAP({ + enableBillingProgramAndroid: 'billing-choice', + billingChoiceScreenTypeAndroid: 'google-rendered', + onDeveloperProvidedBillingAndroid: async (details) => { + await processDeveloperBilling(details); + }, +});`} {{ @@ -79,18 +100,18 @@ IDisposable subscription = OpenIapClient.Instance.DeveloperProvidedBillingAndroi {`import { developerProvidedBillingListenerAndroid } from 'expo-iap'; const subscription = developerProvidedBillingListenerAndroid(async (details) => { - console.log('User selected developer billing'); - console.log('External transaction token received; send it to your backend without logging it.'); - - // Process payment with your payment system + // Use products and linkUri to choose your in-app or external-link checkout. const paymentResult = await processPaymentWithYourGateway({ - token: details.externalTransactionToken, - // Your payment details + products: details.products, + linkUri: details.linkUri, }); if (paymentResult.success) { - // IMPORTANT: Report the token to Google Play within 24 hours - await reportExternalTransactionToGoogle(details.externalTransactionToken); + if (details.externalTransactionToken) { + await reportExternalTransactionToGoogle( + details.externalTransactionToken, + ); + } grantUserAccess(); } }); @@ -103,18 +124,16 @@ subscription.remove();`} // Using callback openIapStore.addDeveloperProvidedBillingListener { details -> - println("User selected developer billing") - println("External transaction token received; send it to your backend without logging it.") - lifecycleScope.launch { - // Process payment with your payment system val paymentResult = processPaymentWithYourGateway( - token = details.externalTransactionToken + products = details.products, + linkUri = details.linkUri ) if (paymentResult.success) { - // IMPORTANT: Report the token to Google Play within 24 hours - reportExternalTransactionToGoogle(details.externalTransactionToken) + details.externalTransactionToken?.let { token -> + reportExternalTransactionToGoogle(token) + } grantUserAccess() } } @@ -127,18 +146,16 @@ val kmpIAP = KmpIAP() // Using callback kmpIAP.addDeveloperProvidedBillingListener { details -> - println("User selected developer billing") - println("External transaction token received; send it to your backend without logging it.") - lifecycleScope.launch { - // Process payment with your payment system val paymentResult = processPaymentWithYourGateway( - token = details.externalTransactionToken + products = details.products, + linkUri = details.linkUri ) if (paymentResult.success) { - // IMPORTANT: Report the token to Google Play within 24 hours - reportExternalTransactionToGoogle(details.externalTransactionToken) + details.externalTransactionToken?.let { token -> + reportExternalTransactionToGoogle(token) + } grantUserAccess() } } @@ -150,17 +167,16 @@ kmpIAP.addDeveloperProvidedBillingListener { details -> // Android only (8.3.0+) - will not fire on iOS or older Android final subscription = FlutterInappPurchase.developerProvidedBillingStream .listen((details) async { - print('User selected developer billing'); - print('External transaction token received; send it to your backend without logging it.'); - - // Process payment with your payment system final paymentResult = await processPaymentWithYourGateway( - token: details.externalTransactionToken, + products: details.products, + linkUri: details.linkUri, ); if (paymentResult.success) { - // IMPORTANT: Report the token to Google Play within 24 hours - await reportExternalTransactionToGoogle(details.externalTransactionToken); + final token = details.externalTransactionToken; + if (token != null) { + await reportExternalTransactionToGoogle(token); + } grantUserAccess(); } }); @@ -174,16 +190,16 @@ using OpenIap.Maui; var subscription = OpenIapClient.Instance.DeveloperProvidedBillingAndroid.Subscribe(async details => { - Console.WriteLine("User selected developer billing"); - Console.WriteLine("External transaction token received; send it to your backend without logging it."); - var paymentResult = await ProcessPaymentWithYourGatewayAsync( - details.ExternalTransactionToken); + details.Products, + details.LinkUri); if (paymentResult.Success) { - // IMPORTANT: Report the token to Google Play within 24 hours. - await ReportExternalTransactionToGoogleAsync(details.ExternalTransactionToken); + if (details.ExternalTransactionToken is { Length: > 0 } token) + { + await ReportExternalTransactionToGoogleAsync(token); + } await GrantUserAccessAsync(); } }); @@ -199,7 +215,16 @@ subscription.Dispose();`} {{ typescript: ( {`interface DeveloperProvidedBillingDetailsAndroid { - externalTransactionToken: string; + externalTransactionToken?: string | null; + linkUri?: string | null; + originalExternalTransactionId?: string | null; + products: DeveloperProvidedBillingProductAndroid[]; +} + +interface DeveloperProvidedBillingProductAndroid { + id: string; + type: 'in-app' | 'subs'; + offerToken?: string | null; }`} ), swift: ( @@ -207,17 +232,26 @@ subscription.Dispose();`} ), kotlin: ( {`data class DeveloperProvidedBillingDetailsAndroid( - val externalTransactionToken: String + val externalTransactionToken: String?, + val linkUri: String?, + val originalExternalTransactionId: String?, + val products: List )`} ), kmp: ( {`data class DeveloperProvidedBillingDetailsAndroid( - val externalTransactionToken: String + val externalTransactionToken: String?, + val linkUri: String?, + val originalExternalTransactionId: String?, + val products: List )`} ), dart: ( {`class DeveloperProvidedBillingDetailsAndroid { - final String externalTransactionToken; + final String? externalTransactionToken; + final String? linkUri; + final String? originalExternalTransactionId; + final List products; }`} ), csharp: ( @@ -226,14 +260,19 @@ using OpenIap.Maui; public sealed record DeveloperProvidedBillingDetailsAndroid { - public required string ExternalTransactionToken { get; init; } + public string? ExternalTransactionToken { get; init; } + public string? LinkUri { get; init; } + public string? OriginalExternalTransactionId { get; init; } + public required IReadOnlyList Products { get; init; } }`} ), }}

    - externalTransactionToken - Token that must be reported - to Google Play within 24 hours after completing the payment + externalTransactionToken, linkUri, and{' '} + originalExternalTransactionId are nullable. The callback + always includes products; each item has an id,{' '} + type, and optional subscription offerToken.

    Comparison: User Choice vs Developer Provided Billing

    @@ -254,7 +293,10 @@ public sealed record DeveloperProvidedBillingDetailsAndroid Availability Eligible regions - Japan only + + Program and market eligibility; External Payments launched in + Japan, while Billing Choice uses separate eligibility. + When presented @@ -264,7 +306,7 @@ public sealed record DeveloperProvidedBillingDetailsAndroid UI Separate dialog before purchase - Side-by-side choice in purchase dialog + Program-specific in-app or external-link choice flow Event @@ -281,7 +323,8 @@ public sealed record DeveloperProvidedBillingDetailsAndroid AlternativeBillingModeAndroid.UserChoice - enableBillingProgram(EXTERNAL_PAYMENTS) +{' '} + enableBillingProgram(EXTERNAL_PAYMENTS) or{' '} + enableBillingProgram(BILLING_CHOICE) +{' '} developerBillingOption in requestPurchase @@ -298,19 +341,23 @@ public sealed record DeveloperProvidedBillingDetailsAndroid }} >

    - ⚠️ Important: The external transaction token MUST be - reported to Google Play within 24 hours using the{' '} - externaltransactions.createexternaltransaction API. - Failure to report tokens may result in account suspension. + Important: When Google Play returns an external + transaction token, send it to your backend and report the completed + external transaction within the applicable program deadline. Do not + log or expose the token.

    See{' '} - - External Payments documentation + + Billing Programs types + {' '} + and the{' '} + + external purchase guide {' '} - for complete implementation examples. + for setup and purchase examples.

    ); diff --git a/packages/docs/src/pages/docs/features/external-purchase.tsx b/packages/docs/src/pages/docs/features/external-purchase.tsx index 6cf6e7e62..e4b093f9c 100644 --- a/packages/docs/src/pages/docs/features/external-purchase.tsx +++ b/packages/docs/src/pages/docs/features/external-purchase.tsx @@ -1419,7 +1419,7 @@ func _ready() -> void: await iap.init_connection(config) # Set user choice billing listener (for alternative billing selection) - iap.user_choice_billing.connect(_on_user_choice_billing) + iap.user_choice_billing_android.connect(_on_user_choice_billing) iap.purchase_updated.connect(_on_purchase_updated) func _on_user_choice_billing(details: UserChoiceBillingDetails) -> void: @@ -1457,7 +1457,7 @@ func handle_user_choice_purchase(product_id: String) -> void: await iap.request_purchase(props) # If user selects Google Play -> purchase_updated signal - # If user selects alternative -> user_choice_billing signal`} + # If user selects alternative -> user_choice_billing_android signal`} ), }} @@ -2404,10 +2404,10 @@ func _ready() -> void: await iap.init_connection(null) # Step 1: Set up listener for when user selects developer billing - iap.developer_provided_billing.connect(_on_developer_provided_billing) + iap.developer_provided_billing_android.connect(_on_developer_provided_billing) iap.purchase_updated.connect(_on_purchase_updated) -func _on_developer_provided_billing(details: DeveloperProvidedBillingDetails) -> void: +func _on_developer_provided_billing(details: DeveloperProvidedBillingDetailsAndroid) -> void: print("User selected developer billing") print("External transaction token received; send it to your backend without logging it.") @@ -2454,7 +2454,7 @@ func handle_purchase_with_external_payments(product_id: String) -> void: await iap.request_purchase(props) # If user selects Google Play -> purchase_updated signal - # If user selects developer billing -> developer_provided_billing signal`} + # If user selects developer billing -> developer_provided_billing_android signal`} ), }} diff --git a/packages/docs/src/pages/docs/foundation/one-pager.tsx b/packages/docs/src/pages/docs/foundation/one-pager.tsx index 6b214cf75..8023c495d 100644 --- a/packages/docs/src/pages/docs/foundation/one-pager.tsx +++ b/packages/docs/src/pages/docs/foundation/one-pager.tsx @@ -191,7 +191,7 @@ function OnePager() { Reference implementations for Apple StoreKit 2 and Google Play - Billing 8.x + Billing 9.1.0 @@ -380,7 +380,7 @@ function OnePager() {
  • Store APIs Supported: Apple StoreKit 2, Google Play - Billing 8.x, Meta Horizon 1.1 + Billing 9.1.0, Meta Horizon 1.1
  • Sponsor: Meta (founding sponsor) @@ -440,7 +440,7 @@ function OnePager() {
  • Platform API churn: Both Apple (StoreKit 2) and - Google (Billing 8.x) have made breaking changes in recent years + Google (Billing 8.x/9.x) have made breaking changes in recent years
  • Security scrutiny: App store fraud and receipt diff --git a/packages/docs/src/pages/docs/kit-backend.tsx b/packages/docs/src/pages/docs/kit-backend.tsx index 14b1b5c68..2514ac1b7 100644 --- a/packages/docs/src/pages/docs/kit-backend.tsx +++ b/packages/docs/src/pages/docs/kit-backend.tsx @@ -177,6 +177,15 @@ function KitBackend() { verifyPurchaseWithProvider in the SDKs; the snippets below call it directly.

    +

    + A verification result and the IAPKit Purchases row are snapshots of + the store response at verification time. On Android, a valid new + purchase may first return pending-acknowledgment. Call{' '} + finishTransaction, then verify the same token again when + the purchase log must reflect entitled. Use subscription + status, entitlements, and store webhooks for current lifecycle state; + purchase snapshots otherwise change only when they are verified again. +

    For Fire OS and Vega OS, choose the Amazon branch and pass the Amazon receipt ID. The SDK resolves the Amazon user ID from the runtime when diff --git a/packages/docs/src/pages/docs/setup/godot.tsx b/packages/docs/src/pages/docs/setup/godot.tsx index 4e7e263a8..7c44ac9ef 100644 --- a/packages/docs/src/pages/docs/setup/godot.tsx +++ b/packages/docs/src/pages/docs/setup/godot.tsx @@ -45,7 +45,7 @@ function GodotSetup() {

  • iOS: Xcode 16+ (Swift 6.0+) with{' '} - iOS 15+ target + iOS 17+ target
  • Android: Android SDK with API level 24+ diff --git a/packages/docs/src/pages/docs/setup/store/horizon.tsx b/packages/docs/src/pages/docs/setup/store/horizon.tsx index 84a00db5c..f5e649781 100644 --- a/packages/docs/src/pages/docs/setup/store/horizon.tsx +++ b/packages/docs/src/pages/docs/setup/store/horizon.tsx @@ -44,18 +44,15 @@ function HorizonStoreSetup() { Horizon app id - Meta Horizon Developer Hub app record. In native Android this is - commonly injected as OCULUS_APP_ID or{' '} + Meta Horizon Developer Hub app record. Gradle projects commonly + expose it through a placeholder named{' '} HORIZON_APP_ID. Expo uses android.horizon.appId. Bare React Native and Flutter examples below use a Gradle property named{' '} horizonAppId and write Android manifest meta-data{' '} - com.meta.horizon.platform.ovr.OCULUS_APP_ID. - OpenIAP also accepts{' '} - com.meta.horizon.platform.ovr.HORIZON_APP_ID for - host apps that already use that key. + com.meta.horizon.platform.HORIZON_APP_ID. @@ -185,13 +182,13 @@ android { }`}

    Provide the app id in the Android manifest:

    {``}

    - If the host app already uses{' '} - com.meta.horizon.platform.ovr.HORIZON_APP_ID, OpenIAP can - read that key as well. Prefer OCULUS_APP_ID for new app - setup because the Expo plugin writes that key. + OpenIAP still reads the older ...ovr.OCULUS_APP_ID,{' '} + ...ovr.HORIZON_APP_ID, and{' '} + com.oculus.vr.APP_ID keys for migration. New setup should + use the Horizon 2.x canonical key above.

    @@ -250,7 +247,7 @@ android { } }`} {``} diff --git a/packages/docs/src/pages/docs/types/alternative-billing-types.tsx b/packages/docs/src/pages/docs/types/alternative-billing-types.tsx index 206c5589e..b47ce4f13 100644 --- a/packages/docs/src/pages/docs/types/alternative-billing-types.tsx +++ b/packages/docs/src/pages/docs/types/alternative-billing-types.tsx @@ -158,7 +158,23 @@ function AlternativeBillingTypes() { choice, EXTERNAL_OFFER for alternative only, or{' '} EXTERNAL_PAYMENTS for Japan external payments (8.3.0+). Use BILLING_CHOICE for Billing Choice - (9.1.0+). + (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; Play Billing + 9.1.0+). + + + + + + billingChoiceScreenTypeAndroid + + + + Billing Choice renderer in OpenIAP Spec 2.1.0 / openiap-google + 2.3.0 (Play Billing 9.1.0+). Defaults to{' '} + GOOGLE_RENDERED. Set{' '} + DEVELOPER_RENDERED when your app renders the choice + screen; this controls whether OpenIAP registers Play's + developer-provided billing listener. @@ -202,6 +218,12 @@ await initConnection({ enableBillingProgramAndroid: 'external-payments' }); +// Developer-rendered Billing Choice (must match Play Console, 9.1.0+) +await initConnection({ + enableBillingProgramAndroid: 'billing-choice', + billingChoiceScreenTypeAndroid: 'developer-rendered' +}); + // Standard billing (default) await initConnection();`} ), @@ -235,6 +257,14 @@ openIapStore.initConnection( ) ) +// Developer-rendered Billing Choice (must match Play Console, 9.1.0+) +openIapStore.initConnection( + InitConnectionConfig( + enableBillingProgramAndroid = BillingProgramAndroid.BillingChoice, + billingChoiceScreenTypeAndroid = BillingChoiceScreenTypeAndroid.DeveloperRendered + ) +) + // Standard billing (default) openIapStore.initConnection()`} ), @@ -254,6 +284,13 @@ await FlutterInappPurchase.instance.initConnection( enableBillingProgramAndroid: BillingProgramAndroid.ExternalPayments, ); +// Developer-rendered Billing Choice (must match Play Console, 9.1.0+) +await FlutterInappPurchase.instance.initConnection( + enableBillingProgramAndroid: BillingProgramAndroid.BillingChoice, + billingChoiceScreenTypeAndroid: + BillingChoiceScreenTypeAndroid.DeveloperRendered, +); + // Standard billing (default) await FlutterInappPurchase.instance.initConnection();`} ), @@ -282,6 +319,14 @@ await ((MutationResolver)OpenIapClient.Instance).InitConnectionAsync( EnableBillingProgramAndroid = BillingProgramAndroid.ExternalPayments, }); +// Developer-rendered Billing Choice (must match Play Console, 9.1.0+) +await ((MutationResolver)OpenIapClient.Instance).InitConnectionAsync( + new InitConnectionConfig + { + EnableBillingProgramAndroid = BillingProgramAndroid.BillingChoice, + BillingChoiceScreenTypeAndroid = BillingChoiceScreenTypeAndroid.DeveloperRendered, + }); + // Standard billing (default) await ((MutationResolver)OpenIapClient.Instance).InitConnectionAsync();`} ), @@ -299,6 +344,11 @@ await iap.init_connection(config) config.enable_billing_program_android = BillingProgramAndroid.EXTERNAL_PAYMENTS await iap.init_connection(config) +# Developer-rendered Billing Choice (must match Play Console, 9.1.0+) +config.enable_billing_program_android = BillingProgramAndroid.BILLING_CHOICE +config.billing_choice_screen_type_android = BillingChoiceScreenTypeAndroid.DEVELOPER_RENDERED +await iap.init_connection(config) + # Standard billing (default) await iap.init_connection()`} ), @@ -542,7 +592,7 @@ func _on_user_choice_billing(details: UserChoiceBillingDetails): if payment_result.success: grant_user_access() -iap.user_choice_billing.connect(_on_user_choice_billing) +iap.user_choice_billing_android.connect(_on_user_choice_billing) # Step 2: Initialize with user choice billing (recommended) var config = InitConnectionConfig.new() @@ -564,7 +614,7 @@ props.type = ProductType.SUBS await iap.request_purchase(props) # If user selects Google Play → purchase_updated signal fires -# If user selects alternative → user_choice_billing signal fires`} +# If user selects alternative → user_choice_billing_android signal fires`} ), }} diff --git a/packages/docs/src/pages/docs/types/billing-programs.tsx b/packages/docs/src/pages/docs/types/billing-programs.tsx index e69b6c5e7..020777593 100644 --- a/packages/docs/src/pages/docs/types/billing-programs.tsx +++ b/packages/docs/src/pages/docs/types/billing-programs.tsx @@ -25,7 +25,8 @@ function BillingPrograms() { Google Play Billing Library 8.2.0+ introduces the Billing Programs API, which provides a more structured approach to external offers and content links. Version 8.3.0 adds External Payments for Japan, and - 9.1.0 adds Billing Choice. + 9.1.0 adds Billing Choice. OpenIAP exposes Billing Choice in Spec + 2.1.0 and openiap-google 2.3.0.

    Identifiers for Play Billing programs. Android only ( @@ -579,8 +580,20 @@ function BillingPrograms() { - The billing program (EXTERNAL_CONTENT_LINK or{' '} - EXTERNAL_OFFER) + The billing program (EXTERNAL_CONTENT_LINK,{' '} + EXTERNAL_OFFER, or BILLING_CHOICE) + + + + + externalTransactionToken + + + string | null + + + Pre-generated token for a developer-rendered Billing Choice + external-link flow (9.1.0+) @@ -723,9 +736,12 @@ function BillingPrograms() { linkUri - string + string | null + + + URL for an external-link flow. Omit it for an in-app Billing + Choice flow. - URL where the external payment will be processed @@ -735,11 +751,32 @@ function BillingPrograms() { DeveloperBillingLaunchModeAndroid + | null + + + How to launch an external link. Omit it when no link is used. + + + + + externalTransactionToken + + + string | null + + + Optional pre-generated token for a Billing Choice external-link + flow. - How to launch the external payment link +

    + For an in-app Billing Choice flow, pass only{' '} + billingProgram: BILLING_CHOICE. Add linkUri,{' '} + launchMode, and optionally{' '} + externalTransactionToken only for an external-link flow. +

    DeveloperBillingLaunchModeAndroid @@ -775,7 +812,10 @@ function BillingPrograms() { DeveloperProvidedBillingDetailsAndroid -

    Details received when user selects developer billing (8.3.0+):

    +

    + Details received when a user selects developer billing (8.3.0+; + expanded in Billing 9.0 and 9.1): +

    @@ -789,13 +829,88 @@ function BillingPrograms() { + + + + + + + + + + + + + + + + + + + +
    externalTransactionToken + string | null + + Token used for external transaction reporting when one is + returned for the selected flow. +
    + linkUri + + string | null + Link for a Billing Choice external-link flow.
    + originalExternalTransactionId + + string | null + + Original developer-billed subscription transaction being + replaced. +
    + products + + DeveloperProvidedBillingProductAndroid[] + Products selected for the developer billing flow.
    + + + DeveloperProvidedBillingProductAndroid + + + + + + + + + + + + + + + + + + + + + +
    NameTypeSummary
    + id + string Google Play product identifier.
    - Token to report external transaction to Google (must report - within 24 hours) + type + + ProductType + + Normalized product type: IN_APP or{' '} + SUBS. +
    + offerToken + + string | null Subscription offer token, when applicable.
    @@ -1106,7 +1221,7 @@ func _on_developer_provided_billing(details: DeveloperProvidedBillingDetailsAndr print("External transaction token received; send it to your backend without logging it.") # Report token to Google via your backend within 24 hours -iap.developer_provided_billing.connect(_on_developer_provided_billing) +iap.developer_provided_billing_android.connect(_on_developer_provided_billing) # Check availability (Japan only) var result = await iap.is_billing_program_available_android( diff --git a/packages/docs/src/pages/docs/types/request-purchase-props.tsx b/packages/docs/src/pages/docs/types/request-purchase-props.tsx index 4c16b1a81..74ed16c4c 100644 --- a/packages/docs/src/pages/docs/types/request-purchase-props.tsx +++ b/packages/docs/src/pages/docs/types/request-purchase-props.tsx @@ -514,8 +514,11 @@ await iap.request_purchase(subs_props)`} developerBillingOption - Developer billing option params for the External - Payments flow (8.3.0+). See{' '} + Developer billing option params for External Payments or + Billing Choice. Billing Choice is available in OpenIAP + Spec 2.1.0 / openiap-google 2.3.0 and requires Play + Billing 9.1.0+. In-app flows require only{' '} + billingProgram. See{' '} DeveloperBillingOptionParamsAndroid @@ -624,6 +627,16 @@ await iap.request_purchase(subs_props)`} Existing subscription token for upgrade/downgrade + + + originalExternalTransactionId + + + Original transaction ID when replacing a subscription + purchased through developer billing (9.1.0+). Use this + instead of purchaseToken for that flow. + + @@ -659,8 +672,8 @@ await iap.request_purchase(subs_props)`} developerBillingOption - Developer billing option params (External Payments, - 8.3.0+). See{' '} + Developer billing option params for External Payments + (8.3.0+) or Billing Choice (9.1.0+). See{' '} DeveloperBillingOptionParamsAndroid diff --git a/packages/docs/src/pages/docs/updates/releases.tsx b/packages/docs/src/pages/docs/updates/releases.tsx index 3678b23d7..5702ca362 100644 --- a/packages/docs/src/pages/docs/updates/releases.tsx +++ b/packages/docs/src/pages/docs/updates/releases.tsx @@ -26,20 +26,21 @@ function Releases() { useScrollToHash(); const allNotes: Note[] = [ - // July 8, 2026 — Play Billing 9.1.0 Billing Choice support + // July 11, 2026 - Multi-store runtimes, Play Billing 9.1, and SDK parity { - id: 'play-billing-9-1-billing-choice-2026-07-08', - date: new Date('2026-07-08'), + id: 'multi-store-billing-9-1-sdk-release-2026-07-11', + date: new Date('2026-07-11'), element: (
    - July 8, 2026 — Play Billing 9.1.0 Billing Choice support + July 11, 2026 - Multi-store runtimes, Play Billing 9.1, and SDK + parity

    - Ships Google Play Billing Library 9.1.0 support across Android - implementations. The OpenIAP spec adds BILLING_CHOICE{' '} - plus Billing Choice display, dialog, reporting, and in-app message - types; framework packages expose the same Android APIs while Apple - remains behavior-compatible with the existing StoreKit surface. + Publishes the current multi-package release train with OpenIAP Spec + 2.1.0, Google Play Billing Library 9.1.0, Amazon Fire OS and Vega OS + integrations, IAPKit lifecycle fixes, and product metadata parity + across the framework SDKs. Fire OS and Vega OS remain experimental; + Apple adds compatibility fixes without changing its public purchase + API.

    +
    + Platform packages and IAPKit +
    • - Billing Choice —{' '} - BillingProgramAndroid.BILLING_CHOICE is available in - the Billing Programs API. Availability now reports{' '} - choiceScreenType and{' '} - isExternalLinkAvailable when Play returns Billing - Choice details. + OpenIAP Spec 2.1.0 - adds Amazon as a store and + IAPKit verification target, then adds Billing Choice, developer + billing, dialog, reporting, and in-app message contracts shared by + every generated SDK.
    • - New Android APIs —{' '} - - getBillingChoiceInfoAndroid - - ,{' '} - - showBillingProgramInformationDialogAndroid - - , and{' '} + openiap-google 2.3.0 - ships Play Billing 9.1.0 + with BILLING_CHOICE, renderer selection, Billing + Choice metadata and information dialog APIs, developer billing + reporting, and preserved subResponseCode errors.{' '} showInAppMessagesAndroid {' '} - are wired through native Android, React Native, Expo, Flutter, - KMP, Godot, and MAUI. + covers transactional and price-increase messages requested in{' '} + + issue #221 + + . +
    • +
    • + Android store runtimes - the same native package + family now targets Play, Meta Horizon, or Amazon Appstore by + flavor. Horizon uses Billing Compatibility SDK 2.0.0 and the + canonical com.meta.horizon.platform.HORIZON_APP_ID{' '} + key; historical keys remain readable for migration. Amazon + cancellation is delivered once as user-cancelled, and + Android callback continuations ignore duplicate completion + attempts.
    • - Reporting details —{' '} - createBillingProgramReportingDetailsAndroid now - accepts an optional developerBillingType so Billing - Choice flows can distinguish in-app developer billing from - external-link developer billing. + openiap-apple 2.2.5 - keeps newer StoreKit paths + available to Swift 5 language-mode apps when the compiler supports + them, aligns Xcode 26 signatures, and preserves pricing terms, + subscription details, offers, and debug metadata across bridges.
    • - Framework parity — generated types and wrapper - APIs are synced for React Native, Expo, Flutter, KMP, Godot, and - MAUI; Android non-Play variants return unsupported/default results - where Google Play Billing APIs are unavailable. + IAPKit - adds Amazon receipt validation and + end-to-end App Store Connect and Google Play catalog sync. Direct + Apple/Google verification now creates bindable subscription rows + for{' '} + + issue #209 + + ; iOS subscription responses expose stable{' '} + originalTransactionId identity from{' '} + + PR #214 + + . Purchase rows are documented as verification snapshots, while + subscription endpoints and webhooks remain the lifecycle source. +
    • +
    + +
    Framework libraries
    +
      +
    • + react-native-iap 15.4.0 - adds Fire OS and React + Native for Vega adapters, the complete Billing Choice and in-app + message surface, bounded Vega fulfillment timeouts, and Nitro + product metadata preservation. +
    • +
    • + expo-iap 4.4.0 - adds Fire OS and Vega modules, + the Billing 9.1 APIs, and config-plugin setup under{' '} + modules.amazon. The plugin writes canonical Horizon + metadata and migrates earlier app-id keys. +
    • +
    • + flutter_inapp_purchase 9.4.0 - adds Play, + Horizon, and Amazon Android builds plus the Billing 9.1 APIs, and + preserves standardized offers, pricing terms, discounts, + installment details, and per-product status during channel + decoding. +
    • +
    • + godot-iap 2.4.0 - adds the Play Billing Choice + APIs, reliable boolean launch results, and typed nested metadata + decoding. Amazon verification types are shared, but Godot does not + add a separate Fire OS runtime target in this release. +
    • +
    • + kmp-iap 2.4.0 - adds Play, Horizon, and Amazon + targets and the Billing 9.1 APIs, while preserving requested order + and rich metadata for mixed type: all product + queries. +
    • +
    • + OpenIap.Maui 1.2.1 - adds Play, Horizon, and + Amazon Android packaging plus the Billing 9.1 APIs. Horizon uses + the 2.0.0 compatibility runtime without pulling Google Billing + classes into the Horizon artifact. +
    • +
    + +
    + Documentation and release quality +
    +
      +
    • + Store setup and example coverage now includes Fire OS, Vega OS, + Horizon, Play, and Apple flows; duplicate example transaction + cleanup is suppressed after successful processing. CI also builds + store-specific KMP and MAUI variants and retries timing-only web + performance flakes without relaxing byte-size budgets. +
    • +
    • + Release history remains centralized here, with package-specific + sections for the changelog request in{' '} + + issue #206 + + . Package-local changelogs continue to point to this page and + package GitHub Releases.
    @@ -247,151 +362,6 @@ function Releases() { ), }, - // July 3, 2026 — Amazon config plugin option shape - { - id: 'amazon-config-plugin-option-shape-2026-07-03', - date: new Date('2026-07-03'), - element: ( -
    - - July 3, 2026 — Amazon config plugin option shape - - -

    - Publishes Expo prereleases that group optional store modules under{' '} - modules. Expo apps should configure{' '} - modules.amazon.fireOS and{' '} - modules.amazon.vegaOS; android.amazon{' '} - remains for Android-specific details such as optional Vega metadata - overrides. React Native remains a bare RN/Nitro package that selects - Fire OS through Android Gradle and Vega OS through a separate React - Native for Vega target. Amazon targets are available in the current{' '} - next / rc package versions while this - support remains experimental. -

    - - {`plugins: [ - [ - 'expo-iap', - { - modules: { - onside: true, - horizon: true, - amazon: { - fireOS: true, - vegaOS: true, - }, - }, - android: { - horizon: { - appId: 'YOUR_HORIZON_APP_ID', - }, - }, - }, - ], -]`} - -
      -
    • - Expo config plugin — expo-iap now - resolves Fire OS and Vega OS from modules.amazon, - resolves Horizon app ids from android.horizon.appId, - and derives Vega metadata from the Expo config unless{' '} - android.amazon.vegaOS overrides are provided. -
    • -
    • - React Native — react-native-iap{' '} - remains a bare React Native/Nitro package. Fire OS uses direct - Android Gradle flavor selection, and Vega uses a separate React - Native for Vega target with its own Kepler metadata. -
    • -
    • - Vega OS scope — Vega remains experimental and - limited to React Native for Vega / compatible Expo Vega targets. - Flutter, KMP, MAUI, and Godot do not expose a Kepler runtime - target. -
    • -
    • - Fire OS scope — Fire OS remains the Android{' '} - amazon flavor across native Android, Expo, React - Native, Flutter, KMP, and MAUI. Godot currently exposes shared - Amazon API payloads but no separate Fire OS flavor switch. -
    • -
    - -
    -
    Package Releases
    - -
    -
    - ), - }, - // July 2, 2026 — iOS cancellation error bridge hotfix { id: 'ios-cancellation-error-bridge-hotfix-2026-07-02', @@ -1737,171 +1707,6 @@ function Releases() { ), }, - // May 23, 2026 — Fire OS support - { - id: 'fireos-support-2026-05-23', - date: new Date('2026-05-23'), - element: ( -
    - - May 23, 2026 — Fire OS support - - -

    - Adds Amazon Fire OS support to OpenIAP. Starting with{' '} - openiap-google 2.3.0-rc.1, Android builds can target - Google Play, Meta Horizon, or Amazon Appstore from the same native - package family. The{' '} - OpenIAP Spec remains stable at 2.0.3; this rollout - adds the Fire OS runtime flavor, framework build flags, Amazon - Appstore receipt verification paths, and shared subscription state - mapping without publishing a spec prerelease. -

    - -
      -
    • - Amazon Fire OS flavor — native Android publishes{' '} - openiap-google-amazon, backed by the Amazon Appstore - SDK and selected with the amazon Gradle flavor. -
    • -
    • - Framework rollout — React Native, Expo, Flutter, - Godot, KMP, and MAUI releases include Fire OS metadata and build - integration alongside existing Play and Horizon support. -
    • -
    • - IAPKit verification — Amazon Appstore receipts - can be verified through IAPKit with userId and{' '} - receiptId, while the shared secret remains on the - server. -
    • -
    • - Shared subscription state — Fire OS subscriptions - flow through the same OpenIAP{' '} - - fetchProducts - - ,{' '} - - requestPurchase - - ,{' '} - - getActiveSubscriptions - - , and{' '} - - getAvailablePurchases - {' '} - lifecycle used by the other stores. The Amazon adapter hydrates - product type and subscription group metadata so app and framework - code do not need store-specific receipt alias handling. -
    • -
    • - Setup guide — see{' '} - Fire OS Setup{' '} - for Amazon App Tester, public key, and framework flag details. -
    • -
    - -
    -
    - Spec and Package Releases -
    - -
    -
    - ), - }, - // May 19, 2026 — Android Billing callback race hotfix { id: 'android-billing-callback-race-hotfix-2026-05-19', diff --git a/packages/docs/src/pages/home.tsx b/packages/docs/src/pages/home.tsx index dc5d092d9..8617ebbba 100644 --- a/packages/docs/src/pages/home.tsx +++ b/packages/docs/src/pages/home.tsx @@ -284,7 +284,7 @@ function Home() {
    100%

    Platform Features

    - Full access to StoreKit 2 and Play Billing v8 — no features + Full access to StoreKit 2 and Play Billing v9.1 — no features hidden or abstracted away

    @@ -327,7 +327,7 @@ function Home() {

    Future-Proof

    - As StoreKit 2, Android Billing v8, and new platforms emerge, + As StoreKit 2, Android Billing v9, and new platforms emerge, OpenIAP abstracts these changes behind a stable API.

    diff --git a/packages/docs/src/pages/introduction.tsx b/packages/docs/src/pages/introduction.tsx index 217211f1e..0e4605321 100644 --- a/packages/docs/src/pages/introduction.tsx +++ b/packages/docs/src/pages/introduction.tsx @@ -224,7 +224,7 @@ libraries/maui-iap/src/OpenIap.Maui/Types.cs # C# / MAUI types`} target="_blank" rel="noopener noreferrer" > - Play Billing v8 + Play Billing v9.1 . Supports Android 5.0+ (API 21+).

    @@ -632,7 +632,7 @@ await iap.end_connection()`} target="_blank" rel="noopener noreferrer" > - Play Billing v8 + Play Billing v9.1 API 21+ (5.0) diff --git a/packages/google/ALTERNATIVE_BILLING.md b/packages/google/ALTERNATIVE_BILLING.md index d7c68b710..46e4a8bc7 100644 --- a/packages/google/ALTERNATIVE_BILLING.md +++ b/packages/google/ALTERNATIVE_BILLING.md @@ -10,7 +10,7 @@ Alternative Billing Only allows you to use your own payment system instead of Go - ✅ Google Play Console enrollment in Alternative Billing program - ✅ Google approval (can take several weeks) -- ✅ Billing Library 6.2+ (this library uses 8.0.0) +- ✅ Billing Library 6.2+ (this library uses 9.1.0) - ✅ Country/region eligibility - ✅ Backend server for reporting transactions to Google Play @@ -308,7 +308,7 @@ See [AlternativeBillingScreen.kt](Example/src/main/java/dev/hyo/martie/screens/A ### "enableAlternativeBillingOnly() method not found" - **Cause**: Billing Library version < 6.2 -- **Fix**: Update to Billing Library 6.2+ (this library uses 8.0.0) +- **Fix**: Update to Billing Library 6.2+ (this library uses 9.1.0) ### "Google Play dialog appears instead of alternative billing" - **Cause**: `enableAlternativeBillingOnly()` not called on BillingClient diff --git a/packages/google/Example/build.gradle.kts b/packages/google/Example/build.gradle.kts index 07c579692..93b148aee 100644 --- a/packages/google/Example/build.gradle.kts +++ b/packages/google/Example/build.gradle.kts @@ -66,7 +66,7 @@ android { ?: "" buildConfigField("String", "HORIZON_APP_ID", "\"${appId}\"") // Ensure placeholder exists for all variants (play included) - manifestPlaceholders["OCULUS_APP_ID"] = appId + manifestPlaceholders["HORIZON_APP_ID"] = appId // IAPKit API Key for purchase verification val iapkitApiKey = localProperties.getProperty("iapkit.api.key") @@ -90,11 +90,11 @@ android { dimension = "platform" buildConfigField("String", "OPENIAP_STORE", "\"horizon\"") - // Dynamically inject OCULUS_APP_ID into AndroidManifest + // Dynamically inject the Horizon App ID into AndroidManifest val appId = localProperties.getProperty("EXAMPLE_HORIZON_APP_ID") ?: (project.findProperty("EXAMPLE_HORIZON_APP_ID") as String?) ?: "" - manifestPlaceholders["OCULUS_APP_ID"] = appId + manifestPlaceholders["HORIZON_APP_ID"] = appId } // Amazon flavor - Amazon Appstore SDK IAP diff --git a/packages/google/Example/src/main/AndroidManifest.xml b/packages/google/Example/src/main/AndroidManifest.xml index 8ac3a162c..96fd8c848 100644 --- a/packages/google/Example/src/main/AndroidManifest.xml +++ b/packages/google/Example/src/main/AndroidManifest.xml @@ -12,11 +12,8 @@ - + android:name="com.meta.horizon.platform.HORIZON_APP_ID" + android:value="${HORIZON_APP_ID}" /> - val purchases = withContext(Dispatchers.IO) { - ensureRegistered() - val androidArgs = props.toAndroidPurchaseArgs() - if (androidArgs.skus.isEmpty()) { - emitPurchaseErrorAndThrow(OpenIapError.EmptySkuList) - } - if (androidArgs.skus.size != 1) { - emitPurchaseErrorAndThrow( - OpenIapError.DeveloperError("Amazon Appstore SDK purchases one SKU at a time") - ) - } - - val sku = androidArgs.skus.first() - val response = runCatching { requestAmazonPurchase(sku) } - .getOrElse { error -> + val purchases = try { + withContext(Dispatchers.IO) { + ensureRegistered() + val androidArgs = props.toAndroidPurchaseArgs() + if (androidArgs.skus.isEmpty()) { + emitPurchaseErrorAndThrow(OpenIapError.EmptySkuList) + } + if (androidArgs.skus.size != 1) { emitPurchaseErrorAndThrow( - error.toOpenIapError("Amazon purchase request failed") + OpenIapError.DeveloperError("Amazon Appstore SDK purchases one SKU at a time") ) } - when (response.requestStatus) { - PurchaseResponse.RequestStatus.SUCCESSFUL -> { - val receipt = response.receipt ?: run { + + val sku = androidArgs.skus.first() + val response = runCatching { requestAmazonPurchase(sku) } + .getOrElse { error -> emitPurchaseErrorAndThrow( - OpenIapError.PurchaseFailed("Amazon purchase response did not include a receipt") + error.toOpenIapError("Amazon purchase request failed") ) } - if (!receipt.sku.isNullOrBlank() && receipt.sku != sku) { - OpenIapLog.w( - "Amazon receipt SKU '${receipt.sku}' differs from requested SKU '$sku'. " + - "Using the requested SKU for the OpenIAP purchase productId; " + - "align the Amazon catalog and App Tester data for restore and server verification.", - TAG + when (response.requestStatus) { + PurchaseResponse.RequestStatus.SUCCESSFUL -> { + val receipt = response.receipt ?: run { + emitPurchaseErrorAndThrow( + OpenIapError.PurchaseFailed("Amazon purchase response did not include a receipt") + ) + } + if (!receipt.sku.isNullOrBlank() && receipt.sku != sku) { + OpenIapLog.w( + "Amazon receipt SKU '${receipt.sku}' differs from requested SKU '$sku'. " + + "Using the requested SKU for the OpenIAP purchase productId; " + + "align the Amazon catalog and App Tester data for restore and server verification.", + TAG + ) + } + // This response is correlated by Amazon requestId, so the + // local request SKU is safe even when callbacks arrive out + // of order. + cacheReceiptProduct(receipt, receipt.productTypeOrNull(), sku) + val purchase = receipt.toPurchase( + productTypeOverride = receipt.productTypeOrNull(), + productIdOverride = sku ) + purchaseUpdateListeners.forEach { listener -> + runCatching { listener.onPurchaseUpdated(purchase) } + } + listOf(purchase) } - // This response is correlated by Amazon requestId, so the - // local request SKU is safe even when callbacks arrive out - // of order. - cacheReceiptProduct(receipt, receipt.productTypeOrNull(), sku) - val purchase = receipt.toPurchase( - productTypeOverride = receipt.productTypeOrNull(), - productIdOverride = sku - ) - purchaseUpdateListeners.forEach { listener -> - runCatching { listener.onPurchaseUpdated(purchase) } + PurchaseResponse.RequestStatus.ALREADY_PURCHASED -> { + val error = OpenIapError.ItemAlreadyOwned("Amazon reported the item is already purchased") + emitPurchaseErrorAndThrow(error) + } + PurchaseResponse.RequestStatus.INVALID_SKU -> { + val error = OpenIapError.SkuNotFound(sku) + emitPurchaseErrorAndThrow(error) + } + PurchaseResponse.RequestStatus.NOT_SUPPORTED -> { + val error = OpenIapError.FeatureNotSupported("Amazon Appstore IAP is not supported on this device") + emitPurchaseErrorAndThrow(error) + } + PurchaseResponse.RequestStatus.PENDING -> { + val error = OpenIapError.PurchaseDeferred + emitPurchaseErrorAndThrow(error) + } + PurchaseResponse.RequestStatus.FAILED -> { + val error = OpenIapError.UserCancelled("Amazon purchase failed or was cancelled") + emitPurchaseErrorAndThrow(error) } - listOf(purchase) - } - PurchaseResponse.RequestStatus.ALREADY_PURCHASED -> { - val error = OpenIapError.ItemAlreadyOwned("Amazon reported the item is already purchased") - emitPurchaseErrorAndThrow(error) - } - PurchaseResponse.RequestStatus.INVALID_SKU -> { - val error = OpenIapError.SkuNotFound(sku) - emitPurchaseErrorAndThrow(error) - } - PurchaseResponse.RequestStatus.NOT_SUPPORTED -> { - val error = OpenIapError.FeatureNotSupported("Amazon Appstore IAP is not supported on this device") - emitPurchaseErrorAndThrow(error) - } - PurchaseResponse.RequestStatus.PENDING -> { - val error = OpenIapError.PurchaseDeferred - emitPurchaseErrorAndThrow(error) - } - PurchaseResponse.RequestStatus.FAILED -> { - val error = OpenIapError.UserCancelled("Amazon purchase failed or was cancelled") - emitPurchaseErrorAndThrow(error) } } + } catch (_: OpenIapError) { + // The error was already published by emitPurchaseErrorAndThrow. + // Keep the request event-based, matching the Play implementation. + emptyList() } RequestPurchaseResultPurchases(purchases) } diff --git a/packages/google/openiap/src/horizon/java/dev/hyo/openiap/OpenIapModule.kt b/packages/google/openiap/src/horizon/java/dev/hyo/openiap/OpenIapModule.kt index 8b6e10283..8e8a7cfb6 100644 --- a/packages/google/openiap/src/horizon/java/dev/hyo/openiap/OpenIapModule.kt +++ b/packages/google/openiap/src/horizon/java/dev/hyo/openiap/OpenIapModule.kt @@ -2,6 +2,7 @@ package dev.hyo.openiap import android.app.Activity import android.content.Context +import android.os.Bundle import com.meta.horizon.billingclient.api.AcknowledgePurchaseParams import com.meta.horizon.billingclient.api.AlternativeBillingOnlyInformationDialogListener import com.meta.horizon.billingclient.api.AlternativeBillingOnlyReportingDetails @@ -52,6 +53,18 @@ import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicReference private const val TAG = "OpenIapModule" +private const val HORIZON_APP_ID_META_DATA = "com.meta.horizon.platform.HORIZON_APP_ID" +private val LEGACY_HORIZON_APP_ID_META_DATA = listOf( + "com.meta.horizon.platform.ovr.OCULUS_APP_ID", + "com.meta.horizon.platform.ovr.HORIZON_APP_ID", + "com.oculus.vr.APP_ID" +) + +internal fun resolveHorizonAppId(metaData: Bundle?): String? = + (listOf(HORIZON_APP_ID_META_DATA) + LEGACY_HORIZON_APP_ID_META_DATA) + .firstNotNullOfOrNull { key -> + metaData?.getString(key)?.takeIf { it.isNotBlank() } + } /** * OpenIapModule for Meta Horizon Billing @@ -60,8 +73,9 @@ private const val TAG = "OpenIapModule" * @param alternativeBillingMode Alternative billing mode (default: NONE) * @param userChoiceBillingListener Listener for user choice billing selection (optional) * - * Note: Oculus App ID is read from AndroidManifest.xml meta-data with key "com.oculus.vr.APP_ID" - * or "com.meta.horizon.platform.ovr.OCULUS_APP_ID". + * The Horizon App ID is read from AndroidManifest.xml meta-data. New apps should + * use "com.meta.horizon.platform.HORIZON_APP_ID"; legacy keys remain readable + * for migration compatibility. */ class OpenIapModule( private val context: Context, @@ -79,20 +93,18 @@ class OpenIapModule( private const val PURCHASE_QUERY_DELAY_MS = 500L } - // Read Oculus App ID from AndroidManifest.xml. + // Read the canonical Horizon 2.x key first, then migration-only legacy keys. private val appId: String? by lazy { try { val appInfo = context.packageManager.getApplicationInfo( context.packageName, android.content.pm.PackageManager.GET_META_DATA ) - val metaData = appInfo.metaData - val id = metaData?.getString("com.oculus.vr.APP_ID") - ?: metaData?.getString("com.meta.horizon.platform.ovr.OCULUS_APP_ID") - OpenIapLog.d("Read Oculus App ID from manifest: $id", TAG) + val id = resolveHorizonAppId(appInfo.metaData) + OpenIapLog.d("Read Horizon App ID from manifest: $id", TAG) id } catch (e: Exception) { - OpenIapLog.w("Failed to read Oculus App ID from AndroidManifest.xml: ${e.message}", TAG) + OpenIapLog.w("Failed to read Horizon App ID from AndroidManifest.xml: ${e.message}", TAG) null } } @@ -799,7 +811,8 @@ class OpenIapModule( }, launchExternalLinkAndroid = { params -> val activity = currentActivityRef?.get() ?: fallbackActivity - if (activity == null) false else launchExternalLink(activity, params) + ?: throw OpenIapError.MissingCurrentActivity + launchExternalLink(activity, params) }, requestPurchase = requestPurchase, restorePurchases = restorePurchases, @@ -809,25 +822,13 @@ class OpenIapModule( }, showBillingProgramInformationDialogAndroid = { params -> val activity = currentActivityRef?.get() ?: fallbackActivity - if (activity == null) { - BillingResultAndroid( - responseCode = 5, - debugMessage = "Missing current activity" - ) - } else { - showBillingProgramInformationDialog(activity, params) - } + ?: throw OpenIapError.MissingCurrentActivity + showBillingProgramInformationDialog(activity, params) }, showInAppMessagesAndroid = { params -> val activity = currentActivityRef?.get() ?: fallbackActivity - if (activity == null) { - InAppMessageResultAndroid( - responseCode = InAppMessageResponseCodeAndroid.NoActionNeeded, - purchaseToken = null - ) - } else { - showInAppMessages(activity, params) - } + ?: throw OpenIapError.MissingCurrentActivity + showInAppMessages(activity, params) }, validateReceipt = validateReceipt, verifyPurchase = verifyPurchase, @@ -1141,7 +1142,7 @@ class OpenIapModule( } override fun setDeveloperProvidedBillingListener(listener: dev.hyo.openiap.listener.DeveloperProvidedBillingListener?) { - // No-op: External Payments is a Google Play 8.3.0+ feature, not supported on Meta Horizon + // No-op: developer-provided billing programs are Google Play-only. OpenIapLog.w("setDeveloperProvidedBillingListener is not supported on Meta Horizon (no-op)", TAG) } @@ -1156,12 +1157,12 @@ class OpenIapModule( } override fun addDeveloperProvidedBillingListener(listener: OpenIapDeveloperProvidedBillingListener) { - // No-op: External Payments is a Google Play 8.3.0+ feature, not supported on Meta Horizon + // No-op: developer-provided billing programs are Google Play-only. OpenIapLog.w("addDeveloperProvidedBillingListener is not supported on Meta Horizon (no-op)", TAG) } override fun removeDeveloperProvidedBillingListener(listener: OpenIapDeveloperProvidedBillingListener) { - // No-op: External Payments is a Google Play 8.3.0+ feature, not supported on Meta Horizon + // No-op: developer-provided billing programs are Google Play-only. OpenIapLog.w("removeDeveloperProvidedBillingListener is not supported on Meta Horizon (no-op)", TAG) } @@ -1177,7 +1178,7 @@ class OpenIapModule( OpenIapLog.w("removeSubscriptionBillingIssueListener is not supported on Meta Horizon (no-op)", TAG) } - // Billing Programs (8.2.0+, EXTERNAL_PAYMENTS 8.3.0+) - Not supported on Horizon + // Google Play billing programs are not supported on Horizon. override suspend fun isBillingProgramAvailable(program: BillingProgramAndroid): BillingProgramAvailabilityResultAndroid { // No-op: Billing Programs is a Google Play 8.2.0+ feature, not supported on Meta Horizon OpenIapLog.w("isBillingProgramAvailable is not supported on Meta Horizon (no-op)", TAG) @@ -1191,11 +1192,9 @@ class OpenIapModule( program: BillingProgramAndroid, developerBillingType: DeveloperBillingTypeAndroid? ): BillingProgramReportingDetailsAndroid { - // No-op: Billing Programs is a Google Play 8.2.0+ feature, not supported on Meta Horizon - OpenIapLog.w("createBillingProgramReportingDetails is not supported on Meta Horizon (no-op)", TAG) - return BillingProgramReportingDetailsAndroid( - billingProgram = program, - externalTransactionToken = "" + OpenIapLog.w("createBillingProgramReportingDetails is not supported on Meta Horizon", TAG) + throw OpenIapError.FeatureNotSupported( + "Meta Horizon does not support Google Play Billing Program reporting details" ) } diff --git a/packages/google/openiap/src/horizon/java/dev/hyo/openiap/store/OpenIapStoreExtensions.kt b/packages/google/openiap/src/horizon/java/dev/hyo/openiap/store/OpenIapStoreExtensions.kt index 13cd28241..e67c3e07c 100644 --- a/packages/google/openiap/src/horizon/java/dev/hyo/openiap/store/OpenIapStoreExtensions.kt +++ b/packages/google/openiap/src/horizon/java/dev/hyo/openiap/store/OpenIapStoreExtensions.kt @@ -10,8 +10,9 @@ import dev.hyo.openiap.listener.UserChoiceBillingListener * Horizon-specific extensions for OpenIapStore * These constructors are only available in the Horizon flavor * - * Note: Oculus App ID is automatically read from AndroidManifest.xml meta-data - * with key "com.oculus.vr.APP_ID". Make sure it's properly configured via expo-iap plugin. + * The Horizon App ID is automatically read from AndroidManifest.xml meta-data + * using "com.meta.horizon.platform.HORIZON_APP_ID". Expo apps can configure it + * through the expo-iap config plugin. */ /** diff --git a/packages/google/openiap/src/main/java/dev/hyo/openiap/OpenIapProtocol.kt b/packages/google/openiap/src/main/java/dev/hyo/openiap/OpenIapProtocol.kt index a29b075aa..88cf15cf7 100644 --- a/packages/google/openiap/src/main/java/dev/hyo/openiap/OpenIapProtocol.kt +++ b/packages/google/openiap/src/main/java/dev/hyo/openiap/OpenIapProtocol.kt @@ -56,15 +56,15 @@ interface OpenIapProtocol { // Developer Provided Billing (Google Play Billing Library 8.3.0+) /** - * Set a legacy-style developer-provided billing listener for External Payments (8.3.0+ Japan only). - * This is called when user selects developer billing in the side-by-side choice dialog. + * Set a legacy-style listener for External Payments (8.3.0+) and + * Google-rendered Billing Choice (9.1.0+). * * @param listener Developer-provided billing listener or null to remove */ fun setDeveloperProvidedBillingListener(listener: DeveloperProvidedBillingListener?) /** * Add listener for developer-provided billing selection events. - * Called when user selects the developer's billing option in external payments flow. + * Called when the user selects the developer's option in an enabled billing program. */ fun addDeveloperProvidedBillingListener(listener: OpenIapDeveloperProvidedBillingListener) fun removeDeveloperProvidedBillingListener(listener: OpenIapDeveloperProvidedBillingListener) @@ -86,7 +86,7 @@ interface OpenIapProtocol { * Check if a billing program is available for this user/device. * Replaces checkAlternativeBillingAvailability() for external offers. * - * @param program The billing program to check (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) + * @param program The billing program to check, including BILLING_CHOICE on 9.1.0+ * @return Result containing availability information */ suspend fun isBillingProgramAvailable(program: BillingProgramAndroid): BillingProgramAvailabilityResultAndroid @@ -95,7 +95,7 @@ interface OpenIapProtocol { * Create reporting details for transactions made outside of Google Play Billing. * Replaces createAlternativeBillingReportingToken() for external offers. * - * @param program The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) + * @param program The billing program, including BILLING_CHOICE on 9.1.0+ * @return Reporting details containing the external transaction token */ suspend fun createBillingProgramReportingDetails( @@ -119,7 +119,8 @@ interface OpenIapProtocol { suspend fun getBillingChoiceInfo(params: GetBillingChoiceInfoParamsAndroid): BillingChoiceInfoAndroid /** - * Show the Billing Choice information dialog for an external transaction. + * Show the mandatory information dialog before a developer-rendered, + * in-app Billing Choice screen. */ suspend fun showBillingProgramInformationDialog( activity: Activity, diff --git a/packages/google/openiap/src/main/java/dev/hyo/openiap/OpenIapViewModel.kt b/packages/google/openiap/src/main/java/dev/hyo/openiap/OpenIapViewModel.kt index a96c1e18e..5a5454859 100644 --- a/packages/google/openiap/src/main/java/dev/hyo/openiap/OpenIapViewModel.kt +++ b/packages/google/openiap/src/main/java/dev/hyo/openiap/OpenIapViewModel.kt @@ -53,7 +53,7 @@ class OpenIapViewModel(app: Application) : AndroidViewModel(app) { ) RequestPurchaseProps( request = RequestPurchaseProps.Request.Purchase( - RequestPurchasePropsByPlatforms(android = android) + RequestPurchasePropsByPlatforms(google = android) ), type = type ) @@ -70,7 +70,7 @@ class OpenIapViewModel(app: Application) : AndroidViewModel(app) { ) RequestPurchaseProps( request = RequestPurchaseProps.Request.Subscription( - RequestSubscriptionPropsByPlatforms(android = android) + RequestSubscriptionPropsByPlatforms(google = android) ), type = type ) diff --git a/packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt b/packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt index df2924c86..b87944ae0 100644 --- a/packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt +++ b/packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt @@ -50,7 +50,7 @@ public enum class AlternativeBillingModeAndroid(val rawValue: String) { /** * Play Billing choice image layout (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ public enum class BillingChoiceImageLayoutAndroid(val rawValue: String) { /** @@ -83,7 +83,7 @@ public enum class BillingChoiceImageLayoutAndroid(val rawValue: String) { /** * Choice screen renderer for Billing Choice availability (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ public enum class BillingChoiceScreenTypeAndroid(val rawValue: String) { /** @@ -117,7 +117,8 @@ public enum class BillingChoiceScreenTypeAndroid(val rawValue: String) { /** * Billing program types for Google Play Billing Programs (Android) * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, - * BILLING_CHOICE added in 9.1.0. + * BILLING_CHOICE added in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ public enum class BillingProgramAndroid(val rawValue: String) { /** @@ -152,7 +153,7 @@ public enum class BillingProgramAndroid(val rawValue: String) { /** * Billing Choice program. * Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ BillingChoice("billing-choice"); @@ -215,7 +216,7 @@ public enum class DeveloperBillingLaunchModeAndroid(val rawValue: String) { /** * Developer-provided billing destination type for Billing Program reporting details (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ public enum class DeveloperBillingTypeAndroid(val rawValue: String) { /** @@ -560,8 +561,9 @@ public enum class IapEvent(val rawValue: String) { PromotedProductIos("promoted-product-ios"), UserChoiceBillingAndroid("user-choice-billing-android"), /** - * Fired when user selects developer-provided billing option in external payments flow. - * Available on Android with Google Play Billing Library 8.3.0+ + * Fired for External Payments (8.3.0+) and Google-rendered Billing Choice + * developer billing selections on Android. Billing Choice is available in + * OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ DeveloperProvidedBillingAndroid("developer-provided-billing-android"), /** @@ -708,7 +710,8 @@ public enum class IapStore(val rawValue: String) { /** * High-level in-app message category (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ public enum class InAppMessageCategoryAndroid(val rawValue: String) { /** @@ -735,7 +738,8 @@ public enum class InAppMessageCategoryAndroid(val rawValue: String) { /** * Response code from Play billing in-app messages (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ public enum class InAppMessageResponseCodeAndroid(val rawValue: String) { /** @@ -1453,6 +1457,9 @@ public interface PurchaseCommon { * Store where purchase was made */ val store: IapStore + /** + * Unix timestamp in milliseconds since January 1, 1970 UTC. + */ val transactionDate: Double } @@ -1483,6 +1490,9 @@ public data class ActiveSubscription( * pending upgrades/downgrades, and auto-renewal preferences. */ val renewalInfoIOS: RenewalInfoIOS? = null, + /** + * Unix timestamp in milliseconds since January 1, 1970 UTC. + */ val transactionDate: Double, val transactionId: String, /** @@ -1743,7 +1753,7 @@ public data class AppTransaction( /** * Display information for developer-rendered Billing Choice screens (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ public data class BillingChoiceInfoAndroid( /** @@ -1783,6 +1793,7 @@ public data class BillingProgramAvailabilityResultAndroid( val billingProgram: BillingProgramAndroid, /** * Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. */ val choiceScreenType: BillingChoiceScreenTypeAndroid? = null, /** @@ -1792,6 +1803,7 @@ public data class BillingProgramAvailabilityResultAndroid( /** * Whether external-link payment is available for Billing Choice. * Populated only for available BILLING_CHOICE results. + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. */ val isExternalLinkAvailable: Boolean? = null ) { @@ -1895,16 +1907,32 @@ public data class BillingResultAndroid( public data class DeveloperProvidedBillingDetailsAndroid( /** * External transaction token used to report transactions made through developer billing. - * This token must be used when reporting the external transaction to Google Play. - * Must be reported within 24 hours of the transaction. + * Nullable for flows such as external payments where no token is returned. */ - val externalTransactionToken: String + val externalTransactionToken: String? = null, + /** + * URI to launch for an external-link Billing Choice flow, when provided by + * Google Play. + */ + val linkUri: String? = null, + /** + * Original external transaction ID when replacing a subscription that was + * purchased through developer billing. + */ + val originalExternalTransactionId: String? = null, + /** + * Products selected for the developer billing flow. + */ + val products: List ) { companion object { fun fromJson(json: Map): DeveloperProvidedBillingDetailsAndroid { return DeveloperProvidedBillingDetailsAndroid( - externalTransactionToken = json["externalTransactionToken"] as? String ?: "", + externalTransactionToken = json["externalTransactionToken"] as? String, + linkUri = json["linkUri"] as? String, + originalExternalTransactionId = json["originalExternalTransactionId"] as? String, + products = (json["products"] as? List<*>)?.mapNotNull { (it as? Map)?.let { DeveloperProvidedBillingProductAndroid.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for DeveloperProvidedBillingProductAndroid") } ?: emptyList(), ) } } @@ -1912,6 +1940,45 @@ public data class DeveloperProvidedBillingDetailsAndroid( fun toJson(): Map = mapOf( "__typename" to "DeveloperProvidedBillingDetailsAndroid", "externalTransactionToken" to externalTransactionToken, + "linkUri" to linkUri, + "originalExternalTransactionId" to originalExternalTransactionId, + "products" to products.map { it.toJson() }, + ) +} + +/** + * Product selected for developer-provided billing (Android 9.0+). + */ +public data class DeveloperProvidedBillingProductAndroid( + /** + * Product identifier. + */ + val id: String, + /** + * Subscription offer token, when applicable. + */ + val offerToken: String? = null, + /** + * Google Play product type (in-app or subscription). + */ + val type: ProductType +) { + + companion object { + fun fromJson(json: Map): DeveloperProvidedBillingProductAndroid { + return DeveloperProvidedBillingProductAndroid( + id = json["id"] as? String ?: "", + offerToken = json["offerToken"] as? String, + type = (json["type"] as? String)?.let { ProductType.fromJson(it) } ?: ProductType.InApp, + ) + } + } + + fun toJson(): Map = mapOf( + "__typename" to "DeveloperProvidedBillingProductAndroid", + "id" to id, + "offerToken" to offerToken, + "type" to type.toJson(), ) } @@ -2421,7 +2488,8 @@ public data class FetchProductsResultSubscriptions(val value: List): DeveloperBillingOptionParamsAndroid? { val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified - val launchMode = (json["launchMode"] as? String)?.let { DeveloperBillingLaunchModeAndroid.fromJson(it) } ?: DeveloperBillingLaunchModeAndroid.Unspecified + val externalTransactionToken = json["externalTransactionToken"] as? String + val launchMode = (json["launchMode"] as? String)?.let { DeveloperBillingLaunchModeAndroid.fromJson(it) } val linkUri = json["linkUri"] as? String - if (linkUri == null) return null return DeveloperBillingOptionParamsAndroid( billingProgram = billingProgram, + externalTransactionToken = externalTransactionToken, launchMode = launchMode, linkUri = linkUri, ) @@ -4526,7 +4610,8 @@ public data class DeveloperBillingOptionParamsAndroid( fun toJson(): Map = mapOf( "billingProgram" to billingProgram.toJson(), - "launchMode" to launchMode.toJson(), + "externalTransactionToken" to externalTransactionToken, + "launchMode" to launchMode?.toJson(), "linkUri" to linkUri, ) } @@ -4582,7 +4667,7 @@ public data class DiscountOfferInputIOS( /** * Parameters for fetching Billing Choice display information (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ public data class GetBillingChoiceInfoParamsAndroid( /** @@ -4617,7 +4702,8 @@ public data class GetBillingChoiceInfoParamsAndroid( /** * Parameters for showing Play billing in-app messages (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ public data class InAppMessageParamsAndroid( /** @@ -4649,6 +4735,16 @@ public data class InitConnectionConfig( * Use USER_CHOICE_BILLING for user choice billing, EXTERNAL_OFFER for alternative only. */ val alternativeBillingModeAndroid: AlternativeBillingModeAndroid? = null, + /** + * Billing Choice renderer configured in Play Console. Available in OpenIAP + * Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). + * GOOGLE_RENDERED registers the developer-provided billing listener so OpenIAP + * can emit the selection event. DEVELOPER_RENDERED omits that listener so the + * app can render its own choice screen and use the reporting/dialog/link APIs. + * Must match choiceScreenType returned by isBillingProgramAvailableAndroid. + * Defaults to GOOGLE_RENDERED. + */ + val billingChoiceScreenTypeAndroid: BillingChoiceScreenTypeAndroid? = BillingChoiceScreenTypeAndroid.GoogleRendered, /** * Enable a specific billing program for Android (7.0+) * When set, enables the specified billing program for external transactions. @@ -4656,6 +4752,8 @@ public data class InitConnectionConfig( * - EXTERNAL_CONTENT_LINK: Link to external content (8.2.0+) * - EXTERNAL_OFFER: External offers for digital content (8.2.0+) * - EXTERNAL_PAYMENTS: Developer provided billing, Japan only (8.3.0+) + * - BILLING_CHOICE: Google-rendered or developer-rendered billing choice + * (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+) */ val enableBillingProgramAndroid: BillingProgramAndroid? = null ) { @@ -4663,6 +4761,7 @@ public data class InitConnectionConfig( fun fromJson(json: Map): InitConnectionConfig { return InitConnectionConfig( alternativeBillingModeAndroid = (json["alternativeBillingModeAndroid"] as? String)?.let { AlternativeBillingModeAndroid.fromJson(it) }, + billingChoiceScreenTypeAndroid = (json["billingChoiceScreenTypeAndroid"] as? String)?.let { BillingChoiceScreenTypeAndroid.fromJson(it) } ?: BillingChoiceScreenTypeAndroid.GoogleRendered, enableBillingProgramAndroid = (json["enableBillingProgramAndroid"] as? String)?.let { BillingProgramAndroid.fromJson(it) }, ) } @@ -4670,20 +4769,28 @@ public data class InitConnectionConfig( fun toJson(): Map = mapOf( "alternativeBillingModeAndroid" to alternativeBillingModeAndroid?.toJson(), + "billingChoiceScreenTypeAndroid" to billingChoiceScreenTypeAndroid?.toJson(), "enableBillingProgramAndroid" to enableBillingProgramAndroid?.toJson(), ) } /** * Parameters for launching an external link (Android) - * Used with launchExternalLink to initiate external offer or app install flows + * Used with launchExternalLink to initiate external offer, app install, or + * developer-rendered Billing Choice flows * Available in Google Play Billing Library 8.2.0+ */ public data class LaunchExternalLinkParamsAndroid( /** - * The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) + * The billing program (EXTERNAL_CONTENT_LINK, EXTERNAL_OFFER, or BILLING_CHOICE) */ val billingProgram: BillingProgramAndroid, + /** + * External transaction token for a developer-rendered Billing Choice external-link + * flow. Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). Generate it with createBillingProgramReportingDetailsAndroid. + */ + val externalTransactionToken: String? = null, /** * The external link launch mode */ @@ -4700,12 +4807,14 @@ public data class LaunchExternalLinkParamsAndroid( companion object { fun fromJson(json: Map): LaunchExternalLinkParamsAndroid? { val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified + val externalTransactionToken = json["externalTransactionToken"] as? String val launchMode = (json["launchMode"] as? String)?.let { ExternalLinkLaunchModeAndroid.fromJson(it) } ?: ExternalLinkLaunchModeAndroid.Unspecified val linkType = (json["linkType"] as? String)?.let { ExternalLinkTypeAndroid.fromJson(it) } ?: ExternalLinkTypeAndroid.Unspecified val linkUri = json["linkUri"] as? String if (linkUri == null) return null return LaunchExternalLinkParamsAndroid( billingProgram = billingProgram, + externalTransactionToken = externalTransactionToken, launchMode = launchMode, linkType = linkType, linkUri = linkUri, @@ -4715,6 +4824,7 @@ public data class LaunchExternalLinkParamsAndroid( fun toJson(): Map = mapOf( "billingProgram" to billingProgram.toJson(), + "externalTransactionToken" to externalTransactionToken, "launchMode" to launchMode.toJson(), "linkType" to linkType.toJson(), "linkUri" to linkUri, @@ -4838,9 +4948,9 @@ public data class PurchaseUpdatedListenerOptions( public data class RequestPurchaseAndroidProps( /** - * Developer billing option parameters for external payments flow (8.3.0+). - * When provided, the purchase flow will show a side-by-side choice between - * Google Play Billing and the developer's external payment option. + * Developer billing option parameters for external payments and Billing Choice. + * Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ val developerBillingOption: DeveloperBillingOptionParamsAndroid? = null, /** @@ -5058,9 +5168,9 @@ public data class RequestPurchasePropsByPlatforms( public data class RequestSubscriptionAndroidProps( /** - * Developer billing option parameters for external payments flow (8.3.0+). - * When provided, the purchase flow will show a side-by-side choice between - * Google Play Billing and the developer's external payment option. + * Developer billing option parameters for external payments and Billing Choice. + * Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ val developerBillingOption: DeveloperBillingOptionParamsAndroid? = null, /** @@ -5076,6 +5186,12 @@ public data class RequestSubscriptionAndroidProps( * Obfuscated profile ID */ val obfuscatedProfileId: String? = null, + /** + * Original external transaction ID for replacing a subscription that was + * purchased through developer billing. Available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). + */ + val originalExternalTransactionId: String? = null, /** * Purchase token for upgrades/downgrades */ @@ -5105,6 +5221,7 @@ public data class RequestSubscriptionAndroidProps( val isOfferPersonalized = json["isOfferPersonalized"] as? Boolean val obfuscatedAccountId = json["obfuscatedAccountId"] as? String val obfuscatedProfileId = json["obfuscatedProfileId"] as? String + val originalExternalTransactionId = json["originalExternalTransactionId"] as? String val purchaseToken = json["purchaseToken"] as? String val replacementMode = (json["replacementMode"] as? Number)?.toInt() val skus = (json["skus"] as? List<*>)?.mapNotNull { it as? String } @@ -5116,6 +5233,7 @@ public data class RequestSubscriptionAndroidProps( isOfferPersonalized = isOfferPersonalized, obfuscatedAccountId = obfuscatedAccountId, obfuscatedProfileId = obfuscatedProfileId, + originalExternalTransactionId = originalExternalTransactionId, purchaseToken = purchaseToken, replacementMode = replacementMode, skus = skus, @@ -5130,6 +5248,7 @@ public data class RequestSubscriptionAndroidProps( "isOfferPersonalized" to isOfferPersonalized, "obfuscatedAccountId" to obfuscatedAccountId, "obfuscatedProfileId" to obfuscatedProfileId, + "originalExternalTransactionId" to originalExternalTransactionId, "purchaseToken" to purchaseToken, "replacementMode" to replacementMode, "skus" to skus, @@ -5765,6 +5884,8 @@ public interface MutationResolver { * Returns external transaction token needed for reporting external transactions. * developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, * native Android defaults it to IN_APP. + * The Billing Choice extension is available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ @@ -5799,7 +5920,10 @@ public interface MutationResolver { */ suspend fun isBillingProgramAvailableAndroid(program: BillingProgramAndroid): BillingProgramAvailabilityResultAndroid /** - * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). + * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+), + * including developer-rendered Billing Choice external-link flows. + * Billing Choice availability: OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). * Replaces the deprecated showExternalOfferInformationDialog API. * Shows Play Store dialog and optionally launches external URL. * Throws OpenIapError.NotPrepared if billing client not ready. @@ -5851,8 +5975,9 @@ public interface MutationResolver { */ suspend fun showAlternativeBillingDialogAndroid(): Boolean /** - * Show Google's information dialog for a Billing Choice external transaction. - * Available in Google Play Billing Library 9.1.0+. + * Show Google's mandatory information dialog before a developer-rendered, + * in-app Billing Choice screen. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android */ @@ -5866,7 +5991,8 @@ public interface MutationResolver { suspend fun showExternalPurchaseCustomLinkNoticeIOS(noticeType: ExternalPurchaseCustomLinkNoticeTypeIOS): ExternalPurchaseCustomLinkNoticeResultIOS /** * Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. - * Available in Google Play Billing Library 4.1.0+. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). * Returns a response code and, when the subscription status changes, the related purchase token. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-in-app-messages-android @@ -5950,7 +6076,7 @@ public interface QueryResolver { suspend fun getAvailablePurchases(options: PurchaseOptions? = null): List /** * Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. - * Available in Google Play Billing Library 9.1.0+. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client is not ready. * See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android */ @@ -6036,11 +6162,11 @@ public interface QueryResolver { */ public interface SubscriptionResolver { /** - * Fires when a user selects developer billing in the External Payments flow (Android only) - * Triggered when the user chooses to pay via the developer's external payment option - * instead of Google Play Billing in the side-by-side choice dialog. - * Contains the externalTransactionToken needed to report the transaction. - * Available in Google Play Billing Library 8.3.0+ + * Fires when a user selects developer billing in an External Payments or + * Billing Choice flow (Android only). The payload can contain an external + * transaction token, link URI, original transaction ID, and selected products. + * Billing Choice payload fields are available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ suspend fun developerProvidedBillingAndroid(): DeveloperProvidedBillingDetailsAndroid /** diff --git a/packages/google/openiap/src/main/java/dev/hyo/openiap/helpers/CommonHelpers.kt b/packages/google/openiap/src/main/java/dev/hyo/openiap/helpers/CommonHelpers.kt index 56c83e45d..9d0ff8188 100644 --- a/packages/google/openiap/src/main/java/dev/hyo/openiap/helpers/CommonHelpers.kt +++ b/packages/google/openiap/src/main/java/dev/hyo/openiap/helpers/CommonHelpers.kt @@ -1,6 +1,7 @@ package dev.hyo.openiap.helpers import dev.hyo.openiap.AndroidSubscriptionOfferInput +import dev.hyo.openiap.BillingProgramAndroid import dev.hyo.openiap.DeveloperBillingOptionParamsAndroid import dev.hyo.openiap.ErrorCode import dev.hyo.openiap.OpenIapError @@ -85,6 +86,7 @@ internal data class AndroidPurchaseArgs( val obfuscatedProfileId: String?, val offerToken: String?, val purchaseToken: String?, + val originalExternalTransactionId: String?, val replacementMode: Int?, val subscriptionOffers: List?, val subscriptionProductReplacementParams: SubscriptionProductReplacementParamsAndroid?, @@ -93,6 +95,25 @@ internal data class AndroidPurchaseArgs( val useAlternativeBilling: Boolean? ) +internal fun resolveLegacySubscriptionReplacementMode( + purchaseToken: String?, + originalExternalTransactionId: String?, + replacementMode: Int?, + hasProductLevelReplacementParams: Boolean = false +): Int? = if (hasProductLevelReplacementParams) null else replacementMode ?: 5.takeIf { + !purchaseToken.isNullOrBlank() && originalExternalTransactionId.isNullOrBlank() +} + +internal fun resolveBillingProgramsForConnection( + pendingPrograms: Set, + configuredProgram: BillingProgramAndroid? +): Set = buildSet { + addAll(pendingPrograms.filterNot { it == BillingProgramAndroid.Unspecified }) + configuredProgram + ?.takeUnless { it == BillingProgramAndroid.Unspecified } + ?.let(::add) +} + /** * Extension function to convert RequestPurchaseProps to AndroidPurchaseArgs. * Shared between Play and Horizon flavors. @@ -110,6 +131,7 @@ internal fun RequestPurchaseProps.toAndroidPurchaseArgs(): AndroidPurchaseArgs { obfuscatedProfileId = params.obfuscatedProfileId, offerToken = params.offerToken, purchaseToken = null, + originalExternalTransactionId = null, replacementMode = null, subscriptionOffers = null, subscriptionProductReplacementParams = null, @@ -134,6 +156,7 @@ internal fun RequestPurchaseProps.toAndroidPurchaseArgs(): AndroidPurchaseArgs { obfuscatedProfileId = params.obfuscatedProfileId, offerToken = null, purchaseToken = params.purchaseToken, + originalExternalTransactionId = params.originalExternalTransactionId, replacementMode = params.replacementMode, subscriptionOffers = params.subscriptionOffers, subscriptionProductReplacementParams = params.subscriptionProductReplacementParams, diff --git a/packages/google/openiap/src/main/java/dev/hyo/openiap/listener/DeveloperProvidedBillingListener.kt b/packages/google/openiap/src/main/java/dev/hyo/openiap/listener/DeveloperProvidedBillingListener.kt index f25261ad9..9c24fa0ac 100644 --- a/packages/google/openiap/src/main/java/dev/hyo/openiap/listener/DeveloperProvidedBillingListener.kt +++ b/packages/google/openiap/src/main/java/dev/hyo/openiap/listener/DeveloperProvidedBillingListener.kt @@ -1,28 +1,34 @@ package dev.hyo.openiap.listener +import dev.hyo.openiap.DeveloperProvidedBillingProductAndroid + /** - * Developer-provided billing details when user selects developer billing in External Payments flow. - * Available in Google Play Billing Library 8.3.0+ (Japan only). + * Developer-provided billing details when the user selects developer billing. + * Available for External Payments (8.3.0+) and Billing Choice (9.1.0+). */ data class DeveloperProvidedBillingDetails( /** - * External transaction token to be reported to Google within 24 hours + * External transaction token, when supplied by Google Play. */ - val externalTransactionToken: String + val externalTransactionToken: String?, + /** URI for an external-link flow, when supplied by Google Play. */ + val linkUri: String? = null, + /** Original external transaction ID for a subscription replacement. */ + val originalExternalTransactionId: String? = null, + /** Products selected for developer-provided billing. */ + val products: List = emptyList() ) /** - * Listener for developer-provided billing selection in External Payments flow. + * Listener for developer-provided billing selection in an enabled billing program. * Called when user selects the developer's billing option (instead of Google Play) - * in the side-by-side choice dialog during purchase. - * - * This is only available in Japan and requires Google Play Billing Library 8.3.0+. + * in the applicable purchase flow. */ fun interface DeveloperProvidedBillingListener { /** * Called when user selects developer-provided billing * - * @param details Developer-provided billing details including external transaction token + * @param details Developer-provided billing details for the selected flow */ fun onUserSelectedDeveloperBilling(details: DeveloperProvidedBillingDetails) } diff --git a/packages/google/openiap/src/main/java/dev/hyo/openiap/listener/OpenIapListener.kt b/packages/google/openiap/src/main/java/dev/hyo/openiap/listener/OpenIapListener.kt index 9d18e556a..ec3442764 100644 --- a/packages/google/openiap/src/main/java/dev/hyo/openiap/listener/OpenIapListener.kt +++ b/packages/google/openiap/src/main/java/dev/hyo/openiap/listener/OpenIapListener.kt @@ -41,13 +41,12 @@ fun interface OpenIapUserChoiceBillingListener { /** * Listener for Developer Provided Billing selection (Android) - * Fires when user selects developer-provided billing option in the external payments flow. - * Available in Google Play Billing Library 8.3.0+ + * Fires for External Payments (8.3.0+) and Google-rendered Billing Choice (9.1.0+). */ fun interface OpenIapDeveloperProvidedBillingListener { /** * Called when user selects developer-provided billing - * @param details The developer provided billing details containing the external transaction token + * @param details The developer-provided billing details for the selected flow */ fun onDeveloperProvidedBilling(details: DeveloperProvidedBillingDetailsAndroid) } diff --git a/packages/google/openiap/src/main/java/dev/hyo/openiap/store/OpenIapStore.kt b/packages/google/openiap/src/main/java/dev/hyo/openiap/store/OpenIapStore.kt index dc01405f7..d4447147d 100644 --- a/packages/google/openiap/src/main/java/dev/hyo/openiap/store/OpenIapStore.kt +++ b/packages/google/openiap/src/main/java/dev/hyo/openiap/store/OpenIapStore.kt @@ -191,8 +191,8 @@ class OpenIapStore(private val module: OpenIapProtocol) { } /** - * Set a developer-provided billing listener for External Payments (8.3.0+ Japan only). - * This is called when user selects developer billing in the side-by-side choice dialog. + * Set a developer-provided billing listener for External Payments (8.3.0+) + * and Google-rendered Billing Choice (9.1.0+). * * @param listener Developer-provided billing listener or null to remove */ @@ -580,7 +580,8 @@ class OpenIapStore(private val module: OpenIapProtocol) { module.getBillingChoiceInfo(params) /** - * Show the Billing Choice information dialog for an external transaction (Play Billing 9.1.0+). + * Show the mandatory information dialog before a developer-rendered, + * in-app Billing Choice screen (Play Billing 9.1.0+). * * @see https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android */ @@ -602,10 +603,10 @@ class OpenIapStore(private val module: OpenIapProtocol) { module.showInAppMessages(activity, params) /** - * Enable a billing program for external content links or external offers (8.2.0+). + * Enable a billing program for the next connection (8.2.0+; Billing Choice 9.1.0+). * This should be called BEFORE initConnection to configure the BillingClient. * - * @param program The billing program to enable (ExternalOffer or ExternalContentLink) + * @param program The billing program to enable */ fun enableBillingProgram(program: BillingProgramAndroid) { // Use reflection to call enableBillingProgram on the module diff --git a/packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt b/packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt index ce86cec93..5595358b5 100644 --- a/packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt +++ b/packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt @@ -10,9 +10,14 @@ import com.android.billingclient.api.BillingClientStateListener import com.android.billingclient.api.BillingConfig import com.android.billingclient.api.BillingConfigResponseListener import com.android.billingclient.api.BillingFlowParams +import com.android.billingclient.api.BillingProgramAvailabilityDetails +import com.android.billingclient.api.BillingProgramReportingDetailsParams import com.android.billingclient.api.BillingResult import com.android.billingclient.api.ConsumeParams +import com.android.billingclient.api.GetBillingChoiceInfoParams import com.android.billingclient.api.GetBillingConfigParams +import com.android.billingclient.api.InAppMessageParams +import com.android.billingclient.api.InAppMessageResult import com.android.billingclient.api.PendingPurchasesParams import com.android.billingclient.api.ProductDetails import com.android.billingclient.api.Purchase as BillingPurchase @@ -58,6 +63,8 @@ import dev.hyo.openiap.helpers.queryProductDetails import dev.hyo.openiap.helpers.queryProductDetailsWithStatus import dev.hyo.openiap.helpers.queryPurchases import dev.hyo.openiap.helpers.resolveBasePlanIdForOfferToken +import dev.hyo.openiap.helpers.resolveBillingProgramsForConnection +import dev.hyo.openiap.helpers.resolveLegacySubscriptionReplacementMode import dev.hyo.openiap.helpers.resumeGuard import dev.hyo.openiap.helpers.restorePurchases as restorePurchasesHelper import dev.hyo.openiap.helpers.toAndroidPurchaseArgs @@ -73,6 +80,7 @@ import dev.hyo.openiap.utils.BillingConverters.unavailableInAppProduct import dev.hyo.openiap.utils.BillingConverters.unavailableSubscriptionProduct import dev.hyo.openiap.utils.fromBillingState import dev.hyo.openiap.utils.toActiveSubscription +import dev.hyo.openiap.utils.toOpenIapBillingResult import dev.hyo.openiap.utils.verifyPurchaseWithGooglePlay import dev.hyo.openiap.utils.verifyPurchaseWithIapkit import kotlinx.coroutines.CancellationException @@ -191,17 +199,11 @@ class OpenIapModule( .setDebugMessage(message) .build() - private fun BillingResult.toOpenIapBillingResult(): BillingResultAndroid = - BillingResultAndroid( - responseCode = responseCode, - debugMessage = debugMessage - ) - private fun billingProgramToConstant(program: BillingProgramAndroid): Int = when (program) { - BillingProgramAndroid.ExternalContentLink -> 1 - BillingProgramAndroid.ExternalOffer -> 3 - BillingProgramAndroid.ExternalPayments -> 4 - BillingProgramAndroid.BillingChoice -> 5 + BillingProgramAndroid.ExternalContentLink -> BillingClient.BillingProgram.EXTERNAL_CONTENT_LINK + BillingProgramAndroid.ExternalOffer -> BillingClient.BillingProgram.EXTERNAL_OFFER + BillingProgramAndroid.ExternalPayments -> BillingClient.BillingProgram.EXTERNAL_PAYMENTS + BillingProgramAndroid.BillingChoice -> BillingClient.BillingProgram.BILLING_CHOICE BillingProgramAndroid.UserChoiceBilling -> throw IllegalArgumentException("USER_CHOICE_BILLING uses AlternativeBillingMode, not BillingProgram API") BillingProgramAndroid.Unspecified -> @@ -216,46 +218,75 @@ class OpenIapModule( } private fun billingChoiceImageLayoutConstant(layout: BillingChoiceImageLayoutAndroid): String = when (layout) { - BillingChoiceImageLayoutAndroid.RectangularFourByOne -> "RECTANGULAR_FOUR_BY_ONE" - BillingChoiceImageLayoutAndroid.RectangularThreeByOne -> "RECTANGULAR_THREE_BY_ONE" - BillingChoiceImageLayoutAndroid.RectangularTwoByTwo -> "RECTANGULAR_TWO_BY_TWO" + BillingChoiceImageLayoutAndroid.RectangularFourByOne -> + GetBillingChoiceInfoParams.ImageLayout.RECTANGULAR_FOUR_BY_ONE + BillingChoiceImageLayoutAndroid.RectangularThreeByOne -> + GetBillingChoiceInfoParams.ImageLayout.RECTANGULAR_THREE_BY_ONE + BillingChoiceImageLayoutAndroid.RectangularTwoByTwo -> + GetBillingChoiceInfoParams.ImageLayout.RECTANGULAR_TWO_BY_TWO } private fun developerBillingTypeConstant( program: BillingProgramAndroid, developerBillingType: DeveloperBillingTypeAndroid? ): Int? = when (developerBillingType) { - DeveloperBillingTypeAndroid.InApp -> 1 - DeveloperBillingTypeAndroid.ExternalLink -> 2 + DeveloperBillingTypeAndroid.InApp -> + BillingProgramReportingDetailsParams.DeveloperBillingType.IN_APP + DeveloperBillingTypeAndroid.ExternalLink -> + BillingProgramReportingDetailsParams.DeveloperBillingType.EXTERNAL_LINK DeveloperBillingTypeAndroid.DeveloperBillingTypeUnspecified, null -> - if (program == BillingProgramAndroid.BillingChoice) 1 else null + if (program == BillingProgramAndroid.BillingChoice) { + BillingProgramReportingDetailsParams.DeveloperBillingType.IN_APP + } else { + null + } } private fun billingChoiceScreenTypeFromConstant(value: Int?): BillingChoiceScreenTypeAndroid? = when (value) { - 0 -> BillingChoiceScreenTypeAndroid.Unspecified - 1 -> BillingChoiceScreenTypeAndroid.DeveloperRendered - 2 -> BillingChoiceScreenTypeAndroid.GoogleRendered + BillingProgramAvailabilityDetails.BillingChoiceAvailabilityDetails.ChoiceScreenType.UNSPECIFIED -> + BillingChoiceScreenTypeAndroid.Unspecified + BillingProgramAvailabilityDetails.BillingChoiceAvailabilityDetails.ChoiceScreenType.DEVELOPER_RENDERED -> + BillingChoiceScreenTypeAndroid.DeveloperRendered + BillingProgramAvailabilityDetails.BillingChoiceAvailabilityDetails.ChoiceScreenType.GOOGLE_RENDERED -> + BillingChoiceScreenTypeAndroid.GoogleRendered else -> null } private fun inAppMessageCategoryToConstant(category: InAppMessageCategoryAndroid): Int = when (category) { - InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId -> 0 - InAppMessageCategoryAndroid.Transactional -> 2 + InAppMessageCategoryAndroid.UnknownInAppMessageCategoryId -> + InAppMessageParams.InAppMessageCategoryId.UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID + InAppMessageCategoryAndroid.Transactional -> + InAppMessageParams.InAppMessageCategoryId.TRANSACTIONAL } private fun inAppMessageResponseCodeFromConstant(value: Int?): InAppMessageResponseCodeAndroid = when (value) { - 1 -> InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated + InAppMessageResult.InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED -> + InAppMessageResponseCodeAndroid.SubscriptionStatusUpdated else -> InAppMessageResponseCodeAndroid.NoActionNeeded } - // Billing programs enabled via enableBillingProgram (8.2.0+, EXTERNAL_PAYMENTS in 8.3.0+) + // Billing programs enabled via enableBillingProgram (8.2.0+ through Billing Choice 9.1.0+) private val enabledBillingPrograms = mutableSetOf() + private val pendingBillingPrograms = mutableSetOf() + private var billingChoiceScreenType = BillingChoiceScreenTypeAndroid.GoogleRendered override val initConnection: MutationInitConnectionHandler = { config -> + enabledBillingPrograms.clear() + enabledBillingPrograms.addAll( + resolveBillingProgramsForConnection( + pendingBillingPrograms, + config?.enableBillingProgramAndroid + ) + ) + pendingBillingPrograms.clear() + alternativeBillingMode = AlternativeBillingMode.NONE + billingChoiceScreenType = config?.billingChoiceScreenTypeAndroid + ?.takeUnless { it == BillingChoiceScreenTypeAndroid.Unspecified } + ?: BillingChoiceScreenTypeAndroid.GoogleRendered + // Handle enableBillingProgramAndroid (recommended, replaces alternativeBillingModeAndroid) config?.enableBillingProgramAndroid?.let { program -> OpenIapLog.d("Setting billing program from config: $program", TAG) - enabledBillingPrograms.add(program) // Map USER_CHOICE_BILLING to AlternativeBillingMode for backward compatibility when (program) { BillingProgramAndroid.UserChoiceBilling -> { @@ -299,6 +330,8 @@ class OpenIapModule( billingClient?.endConnection() productManager.clear() billingClient = null + enabledBillingPrograms.clear() + pendingBillingPrograms.clear() // Reset subscription-billing-issue dedupe state so a fresh // initConnection() can re-emit for previously-seen tokens. // Only clear the dedupe set — listeners persist across reconnects, @@ -656,7 +689,7 @@ class OpenIapModule( * Check if a billing program is available for this user/device (8.2.0+) * This is the new API that replaces checkAlternativeBillingAvailability for external offers. * - * @param program The billing program to check (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) + * @param program The billing program to check, including BILLING_CHOICE on 9.1.0+ * @return Result containing availability information */ override suspend fun isBillingProgramAvailable(program: BillingProgramAndroid): BillingProgramAvailabilityResultAndroid = withContext(Dispatchers.IO) { @@ -740,7 +773,7 @@ class OpenIapModule( * * Note: This method uses BillingProgramReportingDetailsParams which was introduced in 8.3.0. * - * @param program The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) + * @param program The billing program, including BILLING_CHOICE on 9.1.0+ * @return Reporting details containing the external transaction token */ override suspend fun createBillingProgramReportingDetails( @@ -858,7 +891,7 @@ class OpenIapModule( * @param params Parameters for the external link * @return true if launch was successful, false otherwise */ - override suspend fun launchExternalLink(activity: Activity, params: LaunchExternalLinkParamsAndroid): Boolean = withContext(Dispatchers.IO) { + override suspend fun launchExternalLink(activity: Activity, params: LaunchExternalLinkParamsAndroid): Boolean = withContext(Dispatchers.Main) { val client = billingClient ?: throw OpenIapError.NotPrepared if (!client.isReady) throw OpenIapError.NotPrepared @@ -904,6 +937,11 @@ class OpenIapModule( val setLinkUriMethod = builderClass.getMethod("setLinkUri", android.net.Uri::class.java) setLinkUriMethod.invoke(builder, android.net.Uri.parse(params.linkUri)) + params.externalTransactionToken?.takeIf { it.isNotBlank() }?.let { token -> + builderClass.getMethod("setExternalTransactionToken", String::class.java) + .invoke(builder, token) + } + // Build the params val buildMethod = builderClass.getMethod("build") val launchParams = buildMethod.invoke(builder) @@ -1019,12 +1057,13 @@ class OpenIapModule( } /** - * Show Billing Choice information dialog for an external transaction token (9.1.0+). + * Show the mandatory information dialog before a developer-rendered, + * in-app Billing Choice screen (9.1.0+). */ override suspend fun showBillingProgramInformationDialog( activity: Activity, params: BillingProgramInformationDialogParamsAndroid - ): BillingResultAndroid = withContext(Dispatchers.IO) { + ): BillingResultAndroid = withContext(Dispatchers.Main) { val client = billingClient ?: throw OpenIapError.NotPrepared if (!client.isReady) throw OpenIapError.NotPrepared @@ -1066,9 +1105,6 @@ class OpenIapModule( paramsClass, listenerClass ).invoke(client, activity, requestParams, listener) - ?.let { it as? BillingResult } - ?.takeIf { it.responseCode != BillingClient.BillingResponseCode.OK } - ?.let { resumer.resume(it.toOpenIapBillingResult()) } } catch (e: NoSuchMethodException) { OpenIapLog.e("showBillingProgramInformationDialog not found. Requires Billing Library 9.1.0+", e, TAG) resumer.resumeWithException(OpenIapError.FeatureNotSupported()) @@ -1088,7 +1124,7 @@ class OpenIapModule( override suspend fun showInAppMessages( activity: Activity, params: InAppMessageParamsAndroid? - ): InAppMessageResultAndroid = withContext(Dispatchers.IO) { + ): InAppMessageResultAndroid = withContext(Dispatchers.Main) { val client = billingClient ?: throw OpenIapError.NotPrepared if (!client.isReady) throw OpenIapError.NotPrepared @@ -1152,15 +1188,15 @@ class OpenIapModule( } /** - * Enable a billing program for external content links or external offers (8.2.0+) + * Enable a billing program for the next BillingClient connection (8.2.0+). * This should be called before initConnection to configure the BillingClient. * * @param program The billing program to enable */ fun enableBillingProgram(program: BillingProgramAndroid) { if (program != BillingProgramAndroid.Unspecified) { - enabledBillingPrograms.add(program) - OpenIapLog.d("Billing program enabled: $program", TAG) + pendingBillingPrograms.add(program) + OpenIapLog.d("Billing program queued for next connection: $program", TAG) } } @@ -1204,7 +1240,7 @@ class OpenIapModule( "• Wait for Google approval\n" + "• Test with license tester accounts\n\n" + "Current mode: ALTERNATIVE_ONLY\n" + - "Library: Billing 8.1.0" + "Library: Billing 9.1.0" ) for (listener in purchaseErrorListeners) { runCatching { listener.onPurchaseError(err) } } @@ -1452,11 +1488,15 @@ class OpenIapModule( OpenIapLog.d("==========================================", TAG) } - // For subscription upgrades/downgrades, purchaseToken and obfuscatedProfileId are mutually exclusive - if (androidArgs.type == ProductQueryType.Subs && !androidArgs.purchaseToken.isNullOrBlank()) { + val hasSubscriptionUpdateSource = + !androidArgs.purchaseToken.isNullOrBlank() || + !androidArgs.originalExternalTransactionId.isNullOrBlank() + + // Subscription replacements identify the original purchase with either a + // Play purchase token or a developer-billing transaction ID. + if (androidArgs.type == ProductQueryType.Subs && hasSubscriptionUpdateSource) { // This is a subscription upgrade/downgrade - do not set obfuscatedProfileId OpenIapLog.d("=== Subscription Upgrade Flow ===", TAG) - OpenIapLog.d(" - Old Token: ${androidArgs.purchaseToken}", TAG) OpenIapLog.d(" - Target SKUs: ${androidArgs.skus}", TAG) OpenIapLog.d(" - Replacement mode: ${androidArgs.replacementMode}", TAG) OpenIapLog.d(" - Product Details Count: ${paramsList.size}", TAG) @@ -1465,16 +1505,26 @@ class OpenIapModule( } val updateParamsBuilder = BillingFlowParams.SubscriptionUpdateParams.newBuilder() - .setOldPurchaseToken(androidArgs.purchaseToken) + androidArgs.purchaseToken?.takeIf { it.isNotBlank() }?.let { + updateParamsBuilder.setOldPurchaseToken(it) + } + androidArgs.originalExternalTransactionId?.takeIf { it.isNotBlank() }?.let { + updateParamsBuilder.setOriginalExternalTransactionId(it) + } - // Set replacement mode - this is critical for upgrades - // Note: setSubscriptionReplacementMode() is deprecated in Billing 8.1.0 - // in favor of SubscriptionProductReplacementParams for per-product control. - // However, for single-product upgrades, the legacy API still works. - val replacementMode = androidArgs.replacementMode ?: 5 // Default to CHARGE_FULL_PRICE - @Suppress("DEPRECATION") - updateParamsBuilder.setSubscriptionReplacementMode(replacementMode) - OpenIapLog.d(" - Final replacement mode: $replacementMode", TAG) + // Developer-billed replacements use only the original external + // transaction ID unless the caller explicitly supplies a mode. + val replacementMode = resolveLegacySubscriptionReplacementMode( + androidArgs.purchaseToken, + androidArgs.originalExternalTransactionId, + androidArgs.replacementMode, + androidArgs.subscriptionProductReplacementParams != null + ) + replacementMode?.let { mode -> + @Suppress("DEPRECATION") + updateParamsBuilder.setSubscriptionReplacementMode(mode) + OpenIapLog.d(" - Final replacement mode: $mode", TAG) + } val updateParams = updateParamsBuilder.build() flowBuilder.setSubscriptionUpdateParams(updateParams) @@ -2096,7 +2146,7 @@ class OpenIapModule( } catch (e: NoSuchMethodException) { OpenIapLog.e("✗ enableAlternativeBillingOnly() method not found", e, TAG) OpenIapLog.e("This method requires Billing Library 6.2+", tag = TAG) - OpenIapLog.e("Current library version: 8.1.0", tag = TAG) + OpenIapLog.e("Current library version: 9.1.0", tag = TAG) OpenIapLog.e("Alternative billing will NOT work - standard Google Play billing will be used", tag = TAG) } catch (e: Exception) { OpenIapLog.e("✗ Failed to enable alternative billing only: ${e.javaClass.simpleName}: ${e.message}", e, TAG) @@ -2105,7 +2155,7 @@ class OpenIapModule( } } - // Enable billing programs (8.2.0+, EXTERNAL_PAYMENTS in 8.3.0+) + // Enable billing programs (8.2.0+ through Billing Choice 9.1.0+) if (enabledBillingPrograms.isNotEmpty()) { OpenIapLog.d("=== BILLING PROGRAMS INITIALIZATION ===", TAG) for (program in enabledBillingPrograms) { @@ -2121,8 +2171,12 @@ class OpenIapModule( else -> billingProgramToConstant(program) } - // EXTERNAL_PAYMENTS and BILLING_CHOICE can return developer-provided billing selections. - if (program == BillingProgramAndroid.ExternalPayments || program == BillingProgramAndroid.BillingChoice) { + val needsDeveloperListener = + program == BillingProgramAndroid.ExternalPayments || + (program == BillingProgramAndroid.BillingChoice && + billingChoiceScreenType != BillingChoiceScreenTypeAndroid.DeveloperRendered) + + if (needsDeveloperListener) { try { enableBillingProgramWithDeveloperListener(builder, program, programConstant) OpenIapLog.d("✓ Billing program enabled with developer listener: $program", TAG) @@ -2131,6 +2185,15 @@ class OpenIapModule( } catch (e: Exception) { OpenIapLog.w("✗ Failed to enable billing program $program: ${e.message}", TAG) } + } else if (program == BillingProgramAndroid.BillingChoice) { + try { + enableBillingProgramWithoutDeveloperListener(builder, program, programConstant) + OpenIapLog.d("✓ Developer-rendered Billing Choice enabled without developer listener", TAG) + } catch (e: NoSuchMethodException) { + OpenIapLog.w("✗ EnableBillingProgramParams not found for $program", TAG) + } catch (e: Exception) { + OpenIapLog.w("✗ Failed to enable billing program $program: ${e.message}", TAG) + } } else { // For other programs, use the simpler enableBillingProgram method try { @@ -2215,7 +2278,8 @@ class OpenIapModule( } /** - * Set legacy-style developer-provided billing listener for External Payments (8.3.0+ Japan only). + * Set the legacy-style developer-provided billing listener for External Payments + * (8.3.0+) and Google-rendered Billing Choice (9.1.0+). * @param listener Developer-provided billing listener or null to remove */ override fun setDeveloperProvidedBillingListener(listener: dev.hyo.openiap.listener.DeveloperProvidedBillingListener?) { @@ -2303,43 +2367,69 @@ class OpenIapModule( val billingDetails = args?.get(0) OpenIapLog.d("DeveloperProvidedBillingDetails: $billingDetails", TAG) - // Extract external transaction token try { val detailsClass = billingDetails?.javaClass - val tokenMethod = detailsClass?.getMethod("getExternalTransactionToken") - val externalToken = tokenMethod?.invoke(billingDetails) as? String - - if (externalToken != null) { - OpenIapLog.d("External transaction token: $externalToken", TAG) + val externalToken = (detailsClass + ?.getMethod("getExternalTransactionToken") + ?.invoke(billingDetails) as? String) + ?.takeIf { it.isNotBlank() } + val linkUri = (detailsClass + ?.getMethod("getLinkUri") + ?.invoke(billingDetails) as? String) + ?.takeIf { it.isNotBlank() } + val originalExternalTransactionId = (detailsClass + ?.getMethod("getOriginalExternalTransactionId") + ?.invoke(billingDetails) as? String) + ?.takeIf { it.isNotBlank() } + val products = (detailsClass + ?.getMethod("getProducts") + ?.invoke(billingDetails) as? List<*>) + .orEmpty() + .mapNotNull { product -> + val productClass = product?.javaClass ?: return@mapNotNull null + val id = productClass.getMethod("getId").invoke(product) as? String + ?: return@mapNotNull null + val type = when (productClass.getMethod("getType").invoke(product) as? String) { + BillingClient.ProductType.INAPP -> ProductType.InApp + BillingClient.ProductType.SUBS -> ProductType.Subs + else -> return@mapNotNull null + } + DeveloperProvidedBillingProductAndroid( + id = id, + offerToken = (productClass.getMethod("getOfferToken") + .invoke(product) as? String)?.takeIf { it.isNotBlank() }, + type = type + ) + } - // Create DeveloperProvidedBillingDetailsAndroid for the event - val details = DeveloperProvidedBillingDetailsAndroid( - externalTransactionToken = externalToken - ) + val details = DeveloperProvidedBillingDetailsAndroid( + externalTransactionToken = externalToken, + linkUri = linkUri, + originalExternalTransactionId = originalExternalTransactionId, + products = products + ) - // Notify legacy-style listener (set via constructor or setDeveloperProvidedBillingListener) - developerProvidedBillingListener?.let { legacyListener -> - try { - legacyListener.onUserSelectedDeveloperBilling( - dev.hyo.openiap.listener.DeveloperProvidedBillingDetails( - externalTransactionToken = externalToken - ) + developerProvidedBillingListener?.let { legacyListener -> + try { + legacyListener.onUserSelectedDeveloperBilling( + dev.hyo.openiap.listener.DeveloperProvidedBillingDetails( + externalTransactionToken = externalToken, + linkUri = linkUri, + originalExternalTransactionId = originalExternalTransactionId, + products = products ) - } catch (e: Exception) { - OpenIapLog.w("Legacy DeveloperProvidedBilling listener error: ${e.message}", TAG) - } + ) + } catch (e: Exception) { + OpenIapLog.w("Legacy DeveloperProvidedBilling listener error: ${e.message}", TAG) } + } - // Notify all DeveloperProvidedBilling listeners (added via addDeveloperProvidedBillingListener) - for (listener in developerProvidedBillingListeners) { - try { - listener.onDeveloperProvidedBilling(details) - } catch (e: Exception) { - OpenIapLog.w("DeveloperProvidedBilling listener error: ${e.message}", TAG) - } + for (listener in developerProvidedBillingListeners) { + try { + listener.onDeveloperProvidedBilling(details) + } catch (e: Exception) { + OpenIapLog.w("DeveloperProvidedBilling listener error: ${e.message}", TAG) } - } else { - OpenIapLog.w("Failed to extract external transaction token", TAG) } } catch (e: Exception) { OpenIapLog.e("Error processing developer billing details", e, TAG) @@ -2375,6 +2465,25 @@ class OpenIapModule( OpenIapLog.d("=== END BILLING PROGRAM INITIALIZATION WITH DEVELOPER LISTENER ===", TAG) } + /** Enable developer-rendered Billing Choice without a selection listener. */ + private fun enableBillingProgramWithoutDeveloperListener( + builder: BillingClient.Builder, + program: BillingProgramAndroid, + programConstant: Int + ) { + val enableParamsClass = Class.forName("com.android.billingclient.api.EnableBillingProgramParams") + val enableParamsBuilderClass = Class.forName("com.android.billingclient.api.EnableBillingProgramParams\$Builder") + val enableBuilder = enableParamsClass.getMethod("newBuilder").invoke(null) + + enableParamsBuilderClass.getMethod("setBillingProgram", Int::class.javaPrimitiveType) + .invoke(enableBuilder, programConstant) + val enableParams = enableParamsBuilderClass.getMethod("build").invoke(enableBuilder) + builder.javaClass.getMethod("enableBillingProgram", enableParamsClass) + .invoke(builder, enableParams) + + OpenIapLog.d("Billing program enabled without developer listener: $program", TAG) + } + /** * Apply DeveloperBillingOptionParams to BillingFlowParams builder. * This enables the side-by-side choice between Google Play and developer billing. @@ -2395,6 +2504,7 @@ class OpenIapModule( DeveloperBillingLaunchModeAndroid.LaunchInExternalBrowserOrApp -> 1 DeveloperBillingLaunchModeAndroid.CallerWillLaunchLink -> 2 DeveloperBillingLaunchModeAndroid.Unspecified -> throw IllegalArgumentException("Cannot use UNSPECIFIED launch mode") + null -> null } // Build DeveloperBillingOptionParams using reflection @@ -2408,13 +2518,20 @@ class OpenIapModule( val setBillingProgramMethod = developerBillingBuilderClass.getMethod("setBillingProgram", Int::class.javaPrimitiveType) setBillingProgramMethod.invoke(developerBillingBuilder, billingProgramConstant) - // Set link URI (must use android.net.Uri, not String) - val setLinkUriMethod = developerBillingBuilderClass.getMethod("setLinkUri", android.net.Uri::class.java) - setLinkUriMethod.invoke(developerBillingBuilder, android.net.Uri.parse(params.linkUri)) + params.linkUri?.takeIf { it.isNotBlank() }?.let { linkUri -> + developerBillingBuilderClass.getMethod("setLinkUri", android.net.Uri::class.java) + .invoke(developerBillingBuilder, android.net.Uri.parse(linkUri)) + } - // Set launch mode - val setLaunchModeMethod = developerBillingBuilderClass.getMethod("setLaunchMode", Int::class.javaPrimitiveType) - setLaunchModeMethod.invoke(developerBillingBuilder, launchModeConstant) + launchModeConstant?.let { launchMode -> + developerBillingBuilderClass.getMethod("setLaunchMode", Int::class.javaPrimitiveType) + .invoke(developerBillingBuilder, launchMode) + } + + params.externalTransactionToken?.takeIf { it.isNotBlank() }?.let { token -> + developerBillingBuilderClass.getMethod("setExternalTransactionToken", String::class.java) + .invoke(developerBillingBuilder, token) + } // Build the developer billing params val buildMethod = developerBillingBuilderClass.getMethod("build") @@ -2430,10 +2547,13 @@ class OpenIapModule( OpenIapLog.d("✓ DeveloperBillingOption applied successfully", TAG) } catch (e: NoSuchMethodException) { OpenIapLog.w("DeveloperBillingOption not found. Requires Billing Library 8.3.0+", TAG) + throw OpenIapError.FeatureNotSupported() } catch (e: ClassNotFoundException) { OpenIapLog.w("DeveloperBillingOptionParams class not found. Requires Billing Library 8.3.0+", TAG) + throw OpenIapError.FeatureNotSupported() } catch (e: Exception) { OpenIapLog.e("Failed to apply DeveloperBillingOption: ${e.message}", e, TAG) + throw e } } } diff --git a/packages/google/openiap/src/play/java/dev/hyo/openiap/utils/BillingResultConverters.kt b/packages/google/openiap/src/play/java/dev/hyo/openiap/utils/BillingResultConverters.kt new file mode 100644 index 000000000..058558de0 --- /dev/null +++ b/packages/google/openiap/src/play/java/dev/hyo/openiap/utils/BillingResultConverters.kt @@ -0,0 +1,23 @@ +package dev.hyo.openiap.utils + +import com.android.billingclient.api.BillingClient +import com.android.billingclient.api.BillingResult +import dev.hyo.openiap.BillingResultAndroid +import dev.hyo.openiap.SubResponseCodeAndroid + +internal fun Int.toOpenIapSubResponseCode(): SubResponseCodeAndroid? = when (this) { + BillingClient.OnPurchasesUpdatedSubResponseCode.NO_APPLICABLE_SUB_RESPONSE_CODE -> + SubResponseCodeAndroid.NoApplicableSubResponseCode + BillingClient.OnPurchasesUpdatedSubResponseCode.PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS -> + SubResponseCodeAndroid.PaymentDeclinedDueToInsufficientFunds + BillingClient.OnPurchasesUpdatedSubResponseCode.USER_INELIGIBLE -> + SubResponseCodeAndroid.UserIneligible + else -> null +} + +internal fun BillingResult.toOpenIapBillingResult(): BillingResultAndroid = + BillingResultAndroid( + responseCode = responseCode, + debugMessage = debugMessage, + subResponseCode = onPurchasesUpdatedSubResponseCode.toOpenIapSubResponseCode() + ) diff --git a/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingChoiceAndroidTypesTest.kt b/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingChoiceAndroidTypesTest.kt index d53109b25..38e2c4d53 100644 --- a/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingChoiceAndroidTypesTest.kt +++ b/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingChoiceAndroidTypesTest.kt @@ -1,6 +1,9 @@ package dev.hyo.openiap +import dev.hyo.openiap.helpers.resolveBillingProgramsForConnection +import dev.hyo.openiap.helpers.resolveLegacySubscriptionReplacementMode import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull import org.junit.Test class BillingChoiceAndroidTypesTest { @@ -28,6 +31,36 @@ class BillingChoiceAndroidTypesTest { ) } + @Test + fun `Billing Choice connection config defaults and serializes renderer`() { + assertEquals( + BillingChoiceScreenTypeAndroid.GoogleRendered, + InitConnectionConfig().billingChoiceScreenTypeAndroid + ) + assertEquals( + BillingChoiceScreenTypeAndroid.DeveloperRendered, + InitConnectionConfig.fromJson( + mapOf("billingChoiceScreenTypeAndroid" to "developer-rendered") + ).billingChoiceScreenTypeAndroid + ) + } + + @Test + fun `Billing Choice external link preserves reporting token`() { + val params = LaunchExternalLinkParamsAndroid.fromJson( + mapOf( + "billingProgram" to "billing-choice", + "externalTransactionToken" to "external-token", + "launchMode" to "launch-in-external-browser-or-app", + "linkType" to "link-to-digital-content-offer", + "linkUri" to "https://example.com/checkout" + ) + )!! + + assertEquals(BillingProgramAndroid.BillingChoice, params.billingProgram) + assertEquals("external-token", params.externalTransactionToken) + } + @Test fun `Developer billing type serializes correctly`() { assertEquals( @@ -51,4 +84,109 @@ class BillingChoiceAndroidTypesTest { InAppMessageResponseCodeAndroid.fromJson("subscription-status-updated") ) } + + @Test + fun `developer billing option supports in-app and external-link Billing Choice`() { + val inApp = DeveloperBillingOptionParamsAndroid.fromJson( + mapOf("billingProgram" to "billing-choice") + )!! + assertEquals(BillingProgramAndroid.BillingChoice, inApp.billingProgram) + assertNull(inApp.linkUri) + assertNull(inApp.launchMode) + assertNull(inApp.externalTransactionToken) + + val externalLink = DeveloperBillingOptionParamsAndroid.fromJson( + mapOf( + "billingProgram" to "billing-choice", + "externalTransactionToken" to "external-token", + "launchMode" to "caller-will-launch-link", + "linkUri" to "https://example.com/checkout" + ) + )!! + assertEquals("external-token", externalLink.externalTransactionToken) + assertEquals( + DeveloperBillingLaunchModeAndroid.CallerWillLaunchLink, + externalLink.launchMode + ) + } + + @Test + fun `developer provided billing details preserve nullable fields and products`() { + val details = DeveloperProvidedBillingDetailsAndroid.fromJson( + mapOf( + "externalTransactionToken" to null, + "linkUri" to "https://example.com/checkout", + "originalExternalTransactionId" to "original-external-id", + "products" to listOf( + mapOf( + "id" to "premium_monthly", + "type" to "subs", + "offerToken" to "offer-token" + ) + ) + ) + ) + + assertNull(details.externalTransactionToken) + assertEquals("https://example.com/checkout", details.linkUri) + assertEquals("original-external-id", details.originalExternalTransactionId) + assertEquals(ProductType.Subs, details.products.single().type) + assertEquals("offer-token", details.products.single().offerToken) + } + + @Test + fun `developer billed replacement does not inject a Play replacement mode`() { + assertNull( + resolveLegacySubscriptionReplacementMode( + purchaseToken = null, + originalExternalTransactionId = "original-external-id", + replacementMode = null + ) + ) + assertEquals( + 5, + resolveLegacySubscriptionReplacementMode( + purchaseToken = "play-purchase-token", + originalExternalTransactionId = null, + replacementMode = null + ) + ) + assertEquals( + 3, + resolveLegacySubscriptionReplacementMode( + purchaseToken = null, + originalExternalTransactionId = "original-external-id", + replacementMode = 3 + ) + ) + assertNull( + resolveLegacySubscriptionReplacementMode( + purchaseToken = "play-purchase-token", + originalExternalTransactionId = null, + replacementMode = 3, + hasProductLevelReplacementParams = true + ) + ) + } + + @Test + fun `pre-init billing programs survive connection config reset`() { + assertEquals( + setOf(BillingProgramAndroid.ExternalOffer), + resolveBillingProgramsForConnection( + pendingPrograms = setOf(BillingProgramAndroid.ExternalOffer), + configuredProgram = null + ) + ) + assertEquals( + setOf( + BillingProgramAndroid.ExternalOffer, + BillingProgramAndroid.BillingChoice + ), + resolveBillingProgramsForConnection( + pendingPrograms = setOf(BillingProgramAndroid.ExternalOffer), + configuredProgram = BillingProgramAndroid.BillingChoice + ) + ) + } } diff --git a/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingLibraryClassPathTest.kt b/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingLibraryClassPathTest.kt index 1daf9482d..f51cd0a4f 100644 --- a/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingLibraryClassPathTest.kt +++ b/packages/google/openiap/src/test/java/dev/hyo/openiap/BillingLibraryClassPathTest.kt @@ -1,6 +1,8 @@ package dev.hyo.openiap +import com.android.billingclient.api.BillingClient import org.junit.Assert.assertNotNull +import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Assert.fail import org.junit.Test @@ -143,6 +145,15 @@ class BillingLibraryClassPathTest { ) } + @Test + fun `SubscriptionUpdateParams Builder supports external transaction replacement`() { + assertClassHasMethod( + "com.android.billingclient.api.BillingFlowParams\$SubscriptionUpdateParams\$Builder", + "setOriginalExternalTransactionId", + String::class.java + ) + } + // ============================================================================ // MARK: - AlternativeBillingOnlyAvailabilityListener (Billing Library 6.0+) // Used in: OpenIapModule.checkAlternativeBillingAvailability() @@ -411,6 +422,15 @@ class BillingLibraryClassPathTest { ) } + @Test + fun `LaunchExternalLinkParams Builder supports Billing Choice transaction token`() { + assertClassHasMethod( + "com.android.billingclient.api.LaunchExternalLinkParams\$Builder", + "setExternalTransactionToken", + String::class.java + ) + } + @Test fun `LaunchExternalLinkParams Builder has build method`() { assertClassHasMethod( @@ -493,6 +513,18 @@ class BillingLibraryClassPathTest { ) } + @Test + fun `EnableBillingProgramParams allows developer-rendered Billing Choice without listener`() { + val paramsClass = Class.forName("com.android.billingclient.api.EnableBillingProgramParams") + val builderClass = Class.forName("com.android.billingclient.api.EnableBillingProgramParams\$Builder") + val builder = paramsClass.getMethod("newBuilder").invoke(null) + + builderClass.getMethod("setBillingProgram", Int::class.javaPrimitiveType) + .invoke(builder, BillingClient.BillingProgram.BILLING_CHOICE) + + assertNotNull(builderClass.getMethod("build").invoke(builder)) + } + @Test fun `BillingProgramInformationDialogParams class path and builder methods exist`() { assertClassExists("com.android.billingclient.api.BillingProgramInformationDialogParams", "9.1.0+") @@ -604,6 +636,21 @@ class BillingLibraryClassPathTest { ) } + @Test + fun `DeveloperProvidedBillingDetails exposes Billing Choice fields`() { + val className = "com.android.billingclient.api.DeveloperProvidedBillingDetails" + assertClassHasMethod(className, "getExternalTransactionToken") + assertClassHasMethod(className, "getLinkUri") + assertClassHasMethod(className, "getOriginalExternalTransactionId") + assertClassHasMethod(className, "getProducts") + + val productClassName = + "com.android.billingclient.api.DeveloperProvidedBillingDetails\$Product" + assertClassHasMethod(productClassName, "getId") + assertClassHasMethod(productClassName, "getType") + assertClassHasMethod(productClassName, "getOfferToken") + } + // ============================================================================ // MARK: - EnableBillingProgramParams (Billing Library 8.3.0+) // Used in: OpenIapModule.enableExternalPaymentsProgram() @@ -723,6 +770,15 @@ class BillingLibraryClassPathTest { ) } + @Test + fun `DeveloperBillingOptionParams Builder has setExternalTransactionToken method`() { + assertClassHasMethod( + "com.android.billingclient.api.DeveloperBillingOptionParams\$Builder", + "setExternalTransactionToken", + String::class.java + ) + } + @Test fun `DeveloperBillingOptionParams Builder has build method`() { assertClassHasMethod( @@ -885,6 +941,7 @@ class BillingLibraryClassPathTest { listenerClass ) assertNotNull("showBillingProgramInformationDialog method should exist", method) + assertEquals(Void.TYPE, method.returnType) } catch (e: ClassNotFoundException) { fail("Class not found: ${e.message}") } catch (e: NoSuchMethodException) { @@ -909,6 +966,7 @@ class BillingLibraryClassPathTest { listenerClass ) assertNotNull("showInAppMessages method should exist", method) + assertEquals(com.android.billingclient.api.BillingResult::class.java, method.returnType) } catch (e: ClassNotFoundException) { fail("Class not found: ${e.message}") } catch (e: NoSuchMethodException) { diff --git a/packages/google/openiap/src/testHorizon/java/dev/hyo/openiap/HorizonAppIdMetadataTest.kt b/packages/google/openiap/src/testHorizon/java/dev/hyo/openiap/HorizonAppIdMetadataTest.kt new file mode 100644 index 000000000..e0bb6b642 --- /dev/null +++ b/packages/google/openiap/src/testHorizon/java/dev/hyo/openiap/HorizonAppIdMetadataTest.kt @@ -0,0 +1,54 @@ +package dev.hyo.openiap + +import android.os.Bundle +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +@RunWith(RobolectricTestRunner::class) +@Config(manifest = Config.NONE, sdk = [29]) +class HorizonAppIdMetadataTest { + + @Test + fun `canonical Horizon 2 key takes precedence over legacy metadata`() { + val metaData = Bundle().apply { + putString("com.meta.horizon.platform.HORIZON_APP_ID", "canonical") + putString("com.meta.horizon.platform.ovr.OCULUS_APP_ID", "legacy") + } + + assertEquals("canonical", resolveHorizonAppId(metaData)) + } + + @Test + fun `blank canonical key falls back through every historical key`() { + val legacyKeys = listOf( + "com.meta.horizon.platform.ovr.OCULUS_APP_ID", + "com.meta.horizon.platform.ovr.HORIZON_APP_ID", + "com.oculus.vr.APP_ID" + ) + + legacyKeys.forEach { legacyKey -> + val metaData = Bundle().apply { + putString("com.meta.horizon.platform.HORIZON_APP_ID", "") + putString(legacyKey, legacyKey) + } + + assertEquals(legacyKey, resolveHorizonAppId(metaData)) + } + } + + @Test + fun `missing or blank Horizon metadata resolves to null`() { + assertNull(resolveHorizonAppId(null)) + assertNull( + resolveHorizonAppId( + Bundle().apply { + putString("com.meta.horizon.platform.HORIZON_APP_ID", "") + } + ) + ) + } +} diff --git a/packages/google/openiap/src/testPlay/java/dev/hyo/openiap/utils/BillingResultConvertersTest.kt b/packages/google/openiap/src/testPlay/java/dev/hyo/openiap/utils/BillingResultConvertersTest.kt new file mode 100644 index 000000000..3bcb9cb22 --- /dev/null +++ b/packages/google/openiap/src/testPlay/java/dev/hyo/openiap/utils/BillingResultConvertersTest.kt @@ -0,0 +1,36 @@ +package dev.hyo.openiap.utils + +import com.android.billingclient.api.BillingClient +import com.android.billingclient.api.BillingResult +import dev.hyo.openiap.SubResponseCodeAndroid +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Test + +class BillingResultConvertersTest { + @Test + fun `maps every Play Billing 9_1 sub-response code`() { + val expected = mapOf( + BillingClient.OnPurchasesUpdatedSubResponseCode.NO_APPLICABLE_SUB_RESPONSE_CODE to + SubResponseCodeAndroid.NoApplicableSubResponseCode, + BillingClient.OnPurchasesUpdatedSubResponseCode.PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS to + SubResponseCodeAndroid.PaymentDeclinedDueToInsufficientFunds, + BillingClient.OnPurchasesUpdatedSubResponseCode.USER_INELIGIBLE to + SubResponseCodeAndroid.UserIneligible + ) + + expected.forEach { (nativeCode, openIapCode) -> + val result = BillingResult.newBuilder() + .setResponseCode(BillingClient.BillingResponseCode.ERROR) + .setOnPurchasesUpdatedSubResponseCode(nativeCode) + .build() + + assertEquals(openIapCode, result.toOpenIapBillingResult().subResponseCode) + } + } + + @Test + fun `unknown sub-response code remains absent`() { + assertNull(Int.MAX_VALUE.toOpenIapSubResponseCode()) + } +} diff --git a/packages/gql/CONVENTION.md b/packages/gql/CONVENTION.md index 8316ee4d4..75526b70b 100644 --- a/packages/gql/CONVENTION.md +++ b/packages/gql/CONVENTION.md @@ -42,6 +42,16 @@ This repo standardizes schema and identifier naming to improve clarity across pl - Example: `type: ProductQueryType = inApp`. - Document defaults in the field description if behavior matters. +## API Availability Comments + +- Lead with the OpenIAP release that exposes the API, then state the upstream + platform requirement as compatibility context. +- Android example: `Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +(requires Play Billing 9.1.0+).` +- Do not document a new OpenIAP field only as `Play Billing 9.1.0+`; consumers + need the spec and platform-package versions to know which SDK release contains + it. + ## Unions - Cross‑platform unions combine platform types (e.g., `Product = ProductAndroid | ProductIOS`). diff --git a/packages/gql/codegen/plugins/csharp.ts b/packages/gql/codegen/plugins/csharp.ts index 6e9a62754..b6f62fc4f 100644 --- a/packages/gql/codegen/plugins/csharp.ts +++ b/packages/gql/codegen/plugins/csharp.ts @@ -446,7 +446,7 @@ export class CSharpPlugin extends CodegenPlugin { return `new List<${itemType}> { ${items.join(', ')} }`; } if (type.kind === 'enum' && typeof defaultValue === 'string') { - return `${type.name}.${this.enumValueCase(defaultValue)}`; + return `global::${NAMESPACE}.${type.name}.${this.enumValueCase(defaultValue)}`; } if (type.kind === 'scalar') { if (typeof defaultValue === 'string') return this.csharpStringLiteral(defaultValue); diff --git a/packages/gql/codegen/plugins/gdscript.ts b/packages/gql/codegen/plugins/gdscript.ts index df93b40fb..8b583222c 100644 --- a/packages/gql/codegen/plugins/gdscript.ts +++ b/packages/gql/codegen/plugins/gdscript.ts @@ -124,6 +124,30 @@ export class GDScriptPlugin extends CodegenPlugin { } } + private getSchemaDefaultValue(field: IRField): string | null { + if (field.defaultValue === undefined || field.defaultValue === null) { + return null; + } + + if (field.type.kind === 'enum' && typeof field.defaultValue === 'string') { + return `${field.type.name}.${this.enumValueCase(field.defaultValue)}`; + } + + if (field.type.kind === 'scalar') { + if (typeof field.defaultValue === 'string') { + return JSON.stringify(field.defaultValue); + } + if ( + typeof field.defaultValue === 'number' || + typeof field.defaultValue === 'boolean' + ) { + return String(field.defaultValue); + } + } + + return null; + } + private getGdscriptFieldName(fieldName: string, typeName: string | null = null): string { if (typeName) { const key = `${typeName}.${fieldName}`; @@ -607,8 +631,11 @@ export class GDScriptPlugin extends CodegenPlugin { } const gdType = this.mapType(field.type); const fieldName = this.getGdscriptFieldName(field.name, irInput.name); + const schemaDefaultValue = this.getSchemaDefaultValue(field); const defaultValue = this.getDefaultValue(field.type); - if (field.type.nullable && this.isNullableScalar(field.type)) { + if (schemaDefaultValue !== null) { + this.emit(`\tvar ${fieldName}: ${gdType} = ${schemaDefaultValue}`); + } else if (field.type.nullable && this.isNullableScalar(field.type)) { this.emit(`\tvar ${fieldName}: Variant = null`); } else if (defaultValue !== null) { this.emit(`\tvar ${fieldName}: ${gdType} = ${defaultValue}`); diff --git a/packages/gql/package.json b/packages/gql/package.json index 5188b57cc..bde9d1a11 100644 --- a/packages/gql/package.json +++ b/packages/gql/package.json @@ -1,6 +1,6 @@ { "name": "@hyodotdev/openiap-gql", - "version": "2.0.3", + "version": "2.1.0", "type": "module", "main": "src/generated/types.ts", "exports": { diff --git a/packages/gql/src/api-android.graphql b/packages/gql/src/api-android.graphql index 424e10eaa..8cc98ce64 100644 --- a/packages/gql/src/api-android.graphql +++ b/packages/gql/src/api-android.graphql @@ -3,12 +3,14 @@ extend type Query { """ Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. - Available in Google Play Billing Library 9.1.0+. + OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). Throws OpenIapError.NotPrepared if billing client is not ready. See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android """ # Future - getBillingChoiceInfoAndroid(params: GetBillingChoiceInfoParamsAndroid!): BillingChoiceInfoAndroid! + getBillingChoiceInfoAndroid( + params: GetBillingChoiceInfoParamsAndroid! + ): BillingChoiceInfoAndroid! } extend type Mutation { @@ -64,7 +66,9 @@ extend type Mutation { See: https://openiap.dev/docs/apis/android/is-billing-program-available-android """ # Future - isBillingProgramAvailableAndroid(program: BillingProgramAndroid!): BillingProgramAvailabilityResultAndroid! + isBillingProgramAvailableAndroid( + program: BillingProgramAndroid! + ): BillingProgramAvailabilityResultAndroid! """ Create the reporting payload Google requires after a Developer-Provided Billing transaction (Play Billing 8.3.0+). @@ -72,6 +76,8 @@ extend type Mutation { Returns external transaction token needed for reporting external transactions. developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, native Android defaults it to IN_APP. + The Billing Choice extension is available in OpenIAP Spec 2.1.0 / + openiap-google 2.3.0 (requires Play Billing 9.1.0+). Throws OpenIapError.NotPrepared if billing client not ready. See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android """ @@ -82,7 +88,10 @@ extend type Mutation { ): BillingProgramReportingDetailsAndroid! """ - Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). + Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+), + including developer-rendered Billing Choice external-link flows. + Billing Choice availability: OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + (requires Play Billing 9.1.0+). Replaces the deprecated showExternalOfferInformationDialog API. Shows Play Store dialog and optionally launches external URL. Throws OpenIapError.NotPrepared if billing client not ready. @@ -92,21 +101,27 @@ extend type Mutation { launchExternalLinkAndroid(params: LaunchExternalLinkParamsAndroid!): Boolean! """ - Show Google's information dialog for a Billing Choice external transaction. - Available in Google Play Billing Library 9.1.0+. + Show Google's mandatory information dialog before a developer-rendered, + in-app Billing Choice screen. + OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). Throws OpenIapError.NotPrepared if billing client not ready. See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android """ # Future - showBillingProgramInformationDialogAndroid(params: BillingProgramInformationDialogParamsAndroid!): BillingResultAndroid! + showBillingProgramInformationDialogAndroid( + params: BillingProgramInformationDialogParamsAndroid! + ): BillingResultAndroid! """ Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. - Available in Google Play Billing Library 4.1.0+. + OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 + (upstream API available since Play Billing 4.1.0). Returns a response code and, when the subscription status changes, the related purchase token. Throws OpenIapError.NotPrepared if billing client not ready. See: https://openiap.dev/docs/apis/android/show-in-app-messages-android """ # Future - showInAppMessagesAndroid(params: InAppMessageParamsAndroid): InAppMessageResultAndroid! + showInAppMessagesAndroid( + params: InAppMessageParamsAndroid + ): InAppMessageResultAndroid! } diff --git a/packages/gql/src/codegen-defaults.test.ts b/packages/gql/src/codegen-defaults.test.ts index ed0293d10..1b683f49a 100644 --- a/packages/gql/src/codegen-defaults.test.ts +++ b/packages/gql/src/codegen-defaults.test.ts @@ -1,7 +1,8 @@ import { describe, expect, it } from "vitest"; import { CSharpPlugin } from "../codegen/plugins/csharp"; +import { GDScriptPlugin } from "../codegen/plugins/gdscript"; import { KotlinPlugin } from "../codegen/plugins/kotlin"; -import type { IRField, IRSchema, IRType } from "../codegen/core/types"; +import type { IREnum, IRField, IRSchema, IRType } from "../codegen/core/types"; const stringType: IRType = { kind: "scalar", name: "String", nullable: false }; const floatType: IRType = { kind: "scalar", name: "Float", nullable: false }; @@ -15,9 +16,9 @@ function field(name: string, type: IRType, defaultValue?: unknown): IRField { }; } -function schema(fields: IRField[]): IRSchema { +function schema(fields: IRField[], enums: IREnum[] = []): IRSchema { return { - enums: [], + enums, interfaces: [], objects: [], inputs: [ @@ -72,4 +73,48 @@ describe("codegen defaults", () => { expect(output).toContain("val wholeWeight: Double = 0.0"); expect(output).toContain("val fractionalWeight: Double = 1.5,"); }); + + it("emits GraphQL enum defaults as GDScript field initializers", () => { + const rendererEnum: IREnum = { + name: "Renderer", + isErrorCode: false, + values: [ + { + name: "UNSPECIFIED", + rawValue: "unspecified", + legacyAliases: [], + }, + { + name: "GOOGLE_RENDERED", + rawValue: "google-rendered", + legacyAliases: [], + }, + ], + }; + const rendererType: IRType = { + kind: "enum", + name: "Renderer", + nullable: true, + }; + const output = new GDScriptPlugin({ outputPath: "types.gd" }).generate( + schema( + [field("renderer", rendererType, "GOOGLE_RENDERED")], + [rendererEnum], + ), + ); + + expect(output).toContain( + "var renderer: Renderer = Renderer.GOOGLE_RENDERED", + ); + + const csharpOutput = new CSharpPlugin({ outputPath: "Types.cs" }).generate( + schema( + [field("renderer", rendererType, "GOOGLE_RENDERED")], + [rendererEnum], + ), + ); + expect(csharpOutput).toContain( + "public Renderer? Renderer { get; init; } = global::OpenIap.Renderer.GoogleRendered;", + ); + }); }); diff --git a/packages/gql/src/event.graphql b/packages/gql/src/event.graphql index e0d12f89f..8fa60e2ae 100644 --- a/packages/gql/src/event.graphql +++ b/packages/gql/src/event.graphql @@ -22,11 +22,11 @@ extend type Subscription { """ userChoiceBillingAndroid: UserChoiceBillingDetails! """ - Fires when a user selects developer billing in the External Payments flow (Android only) - Triggered when the user chooses to pay via the developer's external payment option - instead of Google Play Billing in the side-by-side choice dialog. - Contains the externalTransactionToken needed to report the transaction. - Available in Google Play Billing Library 8.3.0+ + Fires when a user selects developer billing in an External Payments or + Billing Choice flow (Android only). The payload can contain an external + transaction token, link URI, original transaction ID, and selected products. + Billing Choice payload fields are available in OpenIAP Spec 2.1.0 / + openiap-google 2.3.0 (requires Play Billing 9.1.0+). """ developerProvidedBillingAndroid: DeveloperProvidedBillingDetailsAndroid! """ diff --git a/packages/gql/src/generated/Types.cs b/packages/gql/src/generated/Types.cs index 9acce4555..9b60900f3 100644 --- a/packages/gql/src/generated/Types.cs +++ b/packages/gql/src/generated/Types.cs @@ -79,7 +79,7 @@ public static class AlternativeBillingModeAndroidExtensions } /// Play Billing choice image layout (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). [JsonConverter(typeof(BillingChoiceImageLayoutAndroidJsonConverter))] public enum BillingChoiceImageLayoutAndroid { @@ -134,7 +134,7 @@ public static class BillingChoiceImageLayoutAndroidExtensions } /// Choice screen renderer for Billing Choice availability (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). [JsonConverter(typeof(BillingChoiceScreenTypeAndroidJsonConverter))] public enum BillingChoiceScreenTypeAndroid { @@ -190,7 +190,8 @@ public static class BillingChoiceScreenTypeAndroidExtensions /// Billing program types for Google Play Billing Programs (Android) /// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, -/// BILLING_CHOICE added in 9.1.0. +/// BILLING_CHOICE added in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (requires Play Billing 9.1.0+). [JsonConverter(typeof(BillingProgramAndroidJsonConverter))] public enum BillingProgramAndroid { @@ -215,7 +216,7 @@ public enum BillingProgramAndroid ExternalPayments, /// Billing Choice program. /// Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. - /// Available in Google Play Billing Library 9.1.0+ + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). BillingChoice } @@ -329,7 +330,7 @@ public static class DeveloperBillingLaunchModeAndroidExtensions } /// Developer-provided billing destination type for Billing Program reporting details (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). [JsonConverter(typeof(DeveloperBillingTypeAndroidJsonConverter))] public enum DeveloperBillingTypeAndroid { @@ -947,8 +948,9 @@ public enum IapEvent PurchaseError, PromotedProductIOS, UserChoiceBillingAndroid, - /// Fired when user selects developer-provided billing option in external payments flow. - /// Available on Android with Google Play Billing Library 8.3.0+ + /// Fired for External Payments (8.3.0+) and Google-rendered Billing Choice + /// developer billing selections on Android. Billing Choice is available in + /// OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). DeveloperProvidedBillingAndroid, /// Fired when an active subscription enters a billing-issue state that requires user attention. /// Cross-platform unification of StoreKit 2 Message.billingIssue (iOS 18+) and @@ -1209,7 +1211,8 @@ public static class IapStoreExtensions } /// High-level in-app message category (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). [JsonConverter(typeof(InAppMessageCategoryAndroidJsonConverter))] public enum InAppMessageCategoryAndroid { @@ -1259,7 +1262,8 @@ public static class InAppMessageCategoryAndroidExtensions } /// Response code from Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). [JsonConverter(typeof(InAppMessageResponseCodeAndroidJsonConverter))] public enum InAppMessageResponseCodeAndroid { @@ -2578,6 +2582,7 @@ public interface PurchaseCommon int Quantity { get; } /// Store where purchase was made IapStore Store { get; } + /// Unix timestamp in milliseconds since January 1, 1970 UTC. double TransactionDate { get; } } @@ -2648,6 +2653,7 @@ public sealed record ActiveSubscription /// pending upgrades/downgrades, and auto-renewal preferences. [JsonPropertyName("renewalInfoIOS")] public RenewalInfoIOS? RenewalInfoIOS { get; init; } + /// Unix timestamp in milliseconds since January 1, 1970 UTC. [JsonPropertyName("transactionDate")] public required double TransactionDate { get; init; } [JsonPropertyName("transactionId")] @@ -2753,7 +2759,7 @@ public sealed record AppTransaction } /// Display information for developer-rendered Billing Choice screens (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public sealed record BillingChoiceInfoAndroid { /// URL for the Play Billing choice image matching the requested layout. @@ -2772,6 +2778,7 @@ public sealed record BillingProgramAvailabilityResultAndroid [JsonPropertyName("billingProgram")] public required BillingProgramAndroid BillingProgram { get; init; } /// Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. [JsonPropertyName("choiceScreenType")] public BillingChoiceScreenTypeAndroid? ChoiceScreenType { get; init; } /// Whether the billing program is available for the user @@ -2779,6 +2786,7 @@ public sealed record BillingProgramAvailabilityResultAndroid public required bool IsAvailable { get; init; } /// Whether external-link payment is available for Billing Choice. /// Populated only for available BILLING_CHOICE results. + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. [JsonPropertyName("isExternalLinkAvailable")] public bool? IsExternalLinkAvailable { get; init; } } @@ -2819,10 +2827,34 @@ public sealed record BillingResultAndroid public sealed record DeveloperProvidedBillingDetailsAndroid { /// External transaction token used to report transactions made through developer billing. - /// This token must be used when reporting the external transaction to Google Play. - /// Must be reported within 24 hours of the transaction. + /// Nullable for flows such as external payments where no token is returned. [JsonPropertyName("externalTransactionToken")] - public required string ExternalTransactionToken { get; init; } + public string? ExternalTransactionToken { get; init; } + /// URI to launch for an external-link Billing Choice flow, when provided by + /// Google Play. + [JsonPropertyName("linkUri")] + public string? LinkUri { get; init; } + /// Original external transaction ID when replacing a subscription that was + /// purchased through developer billing. + [JsonPropertyName("originalExternalTransactionId")] + public string? OriginalExternalTransactionId { get; init; } + /// Products selected for the developer billing flow. + [JsonPropertyName("products")] + public required IReadOnlyList Products { get; init; } +} + +/// Product selected for developer-provided billing (Android 9.0+). +public sealed record DeveloperProvidedBillingProductAndroid +{ + /// Product identifier. + [JsonPropertyName("id")] + public required string Id { get; init; } + /// Subscription offer token, when applicable. + [JsonPropertyName("offerToken")] + public string? OfferToken { get; init; } + /// Google Play product type (in-app or subscription). + [JsonPropertyName("type")] + public required ProductType Type { get; init; } } /// Discount amount details for one-time purchase offers (Android) @@ -3057,7 +3089,8 @@ public sealed record FetchProductsResultProducts(IReadOnlyList? Value) public sealed record FetchProductsResultSubscriptions(IReadOnlyList? Value) : FetchProductsResult; /// Result from showing Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). public sealed record InAppMessageResultAndroid { /// Purchase token returned when a subscription status changed. @@ -3178,7 +3211,7 @@ public sealed record ProductAndroid : Product, ProductCommon [JsonPropertyName("oneTimePurchaseOfferDetailsAndroid")] public IReadOnlyList? OneTimePurchaseOfferDetailsAndroid { get; init; } [JsonPropertyName("platform")] - public IapPlatform Platform { get; init; } = IapPlatform.Android; + public IapPlatform Platform { get; init; } = global::OpenIap.IapPlatform.Android; [JsonPropertyName("price")] public double? Price { get; init; } /// Product-level status code indicating fetch result (Android 8.0+) @@ -3199,7 +3232,7 @@ public sealed record ProductAndroid : Product, ProductCommon [JsonPropertyName("title")] public required string Title { get; init; } [JsonPropertyName("type")] - public ProductType Type { get; init; } = ProductType.InApp; + public ProductType Type { get; init; } = global::OpenIap.ProductType.InApp; } /// One-time purchase offer details (Android). @@ -3272,7 +3305,7 @@ public sealed record ProductIOS : Product, ProductCommon [JsonPropertyName("jsonRepresentationIOS")] public required string JsonRepresentationIOS { get; init; } [JsonPropertyName("platform")] - public IapPlatform Platform { get; init; } = IapPlatform.IOS; + public IapPlatform Platform { get; init; } = global::OpenIap.IapPlatform.IOS; [JsonPropertyName("price")] public double? Price { get; init; } /// iOS 26.4+ subscription pricing terms, including billing plan metadata for @@ -3291,7 +3324,7 @@ public sealed record ProductIOS : Product, ProductCommon [JsonPropertyName("title")] public required string Title { get; init; } [JsonPropertyName("type")] - public ProductType Type { get; init; } = ProductType.InApp; + public ProductType Type { get; init; } = global::OpenIap.ProductType.InApp; [JsonPropertyName("typeIOS")] public required ProductTypeIOS TypeIOS { get; init; } } @@ -3323,7 +3356,7 @@ public sealed record ProductSubscriptionAndroid : ProductSubscription, ProductCo [JsonPropertyName("oneTimePurchaseOfferDetailsAndroid")] public IReadOnlyList? OneTimePurchaseOfferDetailsAndroid { get; init; } [JsonPropertyName("platform")] - public IapPlatform Platform { get; init; } = IapPlatform.Android; + public IapPlatform Platform { get; init; } = global::OpenIap.IapPlatform.Android; [JsonPropertyName("price")] public double? Price { get; init; } /// Product-level status code indicating fetch result (Android 8.0+) @@ -3344,7 +3377,7 @@ public sealed record ProductSubscriptionAndroid : ProductSubscription, ProductCo [JsonPropertyName("title")] public required string Title { get; init; } [JsonPropertyName("type")] - public ProductType Type { get; init; } = ProductType.Subs; + public ProductType Type { get; init; } = global::OpenIap.ProductType.Subs; } /// Subscription offer details (Android). @@ -3403,7 +3436,7 @@ public sealed record ProductSubscriptionIOS : ProductSubscription, ProductCommon [JsonPropertyName("jsonRepresentationIOS")] public required string JsonRepresentationIOS { get; init; } [JsonPropertyName("platform")] - public IapPlatform Platform { get; init; } = IapPlatform.IOS; + public IapPlatform Platform { get; init; } = global::OpenIap.IapPlatform.IOS; [JsonPropertyName("price")] public double? Price { get; init; } /// iOS 26.4+ subscription pricing terms, including billing plan metadata for @@ -3428,7 +3461,7 @@ public sealed record ProductSubscriptionIOS : ProductSubscription, ProductCommon [JsonPropertyName("title")] public required string Title { get; init; } [JsonPropertyName("type")] - public ProductType Type { get; init; } = ProductType.Subs; + public ProductType Type { get; init; } = global::OpenIap.ProductType.Subs; [JsonPropertyName("typeIOS")] public required ProductTypeIOS TypeIOS { get; init; } } @@ -3485,6 +3518,7 @@ public sealed record PurchaseAndroid : Purchase, PurchaseCommon /// Store where purchase was made [JsonPropertyName("store")] public required IapStore Store { get; init; } + /// Unix timestamp in milliseconds since January 1, 1970 UTC. [JsonPropertyName("transactionDate")] public required double TransactionDate { get; init; } [JsonPropertyName("transactionId")] @@ -3585,6 +3619,7 @@ public sealed record PurchaseIOS : Purchase, PurchaseCommon public string? StorefrontCountryCodeIOS { get; init; } [JsonPropertyName("subscriptionGroupIdIOS")] public string? SubscriptionGroupIdIOS { get; init; } + /// Unix timestamp in milliseconds since January 1, 1970 UTC. [JsonPropertyName("transactionDate")] public required double TransactionDate { get; init; } [JsonPropertyName("transactionId")] @@ -4079,12 +4114,12 @@ public sealed record AndroidSubscriptionOfferInput } /// Parameters for showing a billing program information dialog (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public sealed record BillingProgramInformationDialogParamsAndroid { /// Billing program. Currently only BILLING_CHOICE is supported. [JsonPropertyName("billingProgram")] - public BillingProgramAndroid BillingProgram { get; init; } = BillingProgramAndroid.BillingChoice; + public BillingProgramAndroid BillingProgram { get; init; } = global::OpenIap.BillingProgramAndroid.BillingChoice; /// External transaction token returned by the Billing Choice reporting-details flow. [JsonPropertyName("externalTransactionToken")] public required string ExternalTransactionToken { get; init; } @@ -4100,20 +4135,28 @@ public sealed record DeepLinkOptions public string? PackageNameAndroid { get; init; } } -/// Parameters for developer billing option in purchase flow (Android) -/// Used with BillingFlowParams to enable external payments flow -/// Available in Google Play Billing Library 8.3.0+ +/// Parameters for a developer billing option in a purchase flow (Android). +/// Used with BillingFlowParams for external payments (8.3.0+) and Billing Choice +/// (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+). +/// Only billingProgram is required; link fields are used when the selected program +/// links outside the app. public sealed record DeveloperBillingOptionParamsAndroid { - /// The billing program (should be EXTERNAL_PAYMENTS for external payments flow) + /// The billing program. Use EXTERNAL_PAYMENTS or BILLING_CHOICE. [JsonPropertyName("billingProgram")] public required BillingProgramAndroid BillingProgram { get; init; } - /// The URI where the external payment will be processed + /// The URI where the external payment will be processed. + /// Required only when the selected billing program links outside the app. [JsonPropertyName("linkUri")] - public required string LinkUri { get; init; } - /// The launch mode for the external payment link + public string? LinkUri { get; init; } + /// The launch mode for the external payment link. + /// Required only when the selected billing program links outside the app. [JsonPropertyName("launchMode")] - public required DeveloperBillingLaunchModeAndroid LaunchMode { get; init; } + public DeveloperBillingLaunchModeAndroid? LaunchMode { get; init; } + /// A pre-generated external transaction token for a Billing Choice external-link + /// flow. Omit it when Google Play should provide the token in the callback. + [JsonPropertyName("externalTransactionToken")] + public string? ExternalTransactionToken { get; init; } } public sealed record DiscountOfferInputIOS @@ -4136,27 +4179,28 @@ public sealed record DiscountOfferInputIOS } /// Parameters for fetching Billing Choice display information (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public sealed record GetBillingChoiceInfoParamsAndroid { /// Billing program. Currently only BILLING_CHOICE is supported. [JsonPropertyName("billingProgram")] - public BillingProgramAndroid BillingProgram { get; init; } = BillingProgramAndroid.BillingChoice; + public BillingProgramAndroid BillingProgram { get; init; } = global::OpenIap.BillingProgramAndroid.BillingChoice; /// Desired Play Billing choice image layout. [JsonPropertyName("playBillingChoiceImageLayout")] - public BillingChoiceImageLayoutAndroid PlayBillingChoiceImageLayout { get; init; } = BillingChoiceImageLayoutAndroid.RectangularFourByOne; + public BillingChoiceImageLayoutAndroid PlayBillingChoiceImageLayout { get; init; } = global::OpenIap.BillingChoiceImageLayoutAndroid.RectangularFourByOne; /// BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. [JsonPropertyName("userLocale")] public string? UserLocale { get; init; } } /// Parameters for showing Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). public sealed record InAppMessageParamsAndroid { /// In-app message categories to show. Defaults to transactional messages. [JsonPropertyName("categories")] - public IReadOnlyList? Categories { get; init; } = new List { InAppMessageCategoryAndroid.Transactional }; + public IReadOnlyList? Categories { get; init; } = new List { global::OpenIap.InAppMessageCategoryAndroid.Transactional }; } /// Connection initialization configuration @@ -4174,16 +4218,28 @@ public sealed record InitConnectionConfig /// - EXTERNAL_CONTENT_LINK: Link to external content (8.2.0+) /// - EXTERNAL_OFFER: External offers for digital content (8.2.0+) /// - EXTERNAL_PAYMENTS: Developer provided billing, Japan only (8.3.0+) + /// - BILLING_CHOICE: Google-rendered or developer-rendered billing choice + /// (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+) [JsonPropertyName("enableBillingProgramAndroid")] public BillingProgramAndroid? EnableBillingProgramAndroid { get; init; } + /// Billing Choice renderer configured in Play Console. Available in OpenIAP + /// Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). + /// GOOGLE_RENDERED registers the developer-provided billing listener so OpenIAP + /// can emit the selection event. DEVELOPER_RENDERED omits that listener so the + /// app can render its own choice screen and use the reporting/dialog/link APIs. + /// Must match choiceScreenType returned by isBillingProgramAvailableAndroid. + /// Defaults to GOOGLE_RENDERED. + [JsonPropertyName("billingChoiceScreenTypeAndroid")] + public BillingChoiceScreenTypeAndroid? BillingChoiceScreenTypeAndroid { get; init; } = global::OpenIap.BillingChoiceScreenTypeAndroid.GoogleRendered; } /// Parameters for launching an external link (Android) -/// Used with launchExternalLink to initiate external offer or app install flows +/// Used with launchExternalLink to initiate external offer, app install, or +/// developer-rendered Billing Choice flows /// Available in Google Play Billing Library 8.2.0+ public sealed record LaunchExternalLinkParamsAndroid { - /// The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) + /// The billing program (EXTERNAL_CONTENT_LINK, EXTERNAL_OFFER, or BILLING_CHOICE) [JsonPropertyName("billingProgram")] public required BillingProgramAndroid BillingProgram { get; init; } /// The external link launch mode @@ -4195,6 +4251,11 @@ public sealed record LaunchExternalLinkParamsAndroid /// The URI where the content will be accessed from [JsonPropertyName("linkUri")] public required string LinkUri { get; init; } + /// External transaction token for a developer-rendered Billing Choice external-link + /// flow. Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). Generate it with createBillingProgramReportingDetailsAndroid. + [JsonPropertyName("externalTransactionToken")] + public string? ExternalTransactionToken { get; init; } } public sealed record ProductRequest @@ -4202,7 +4263,7 @@ public sealed record ProductRequest [JsonPropertyName("skus")] public required IReadOnlyList Skus { get; init; } [JsonPropertyName("type")] - public ProductQueryType? Type { get; init; } = ProductQueryType.InApp; + public ProductQueryType? Type { get; init; } = global::OpenIap.ProductQueryType.InApp; } /// JWS promotional offer input for iOS 15+ (StoreKit 2, WWDC 2025). @@ -4270,9 +4331,9 @@ public sealed record RequestPurchaseAndroidProps /// to apply a discount offer to the purchase. [JsonPropertyName("offerToken")] public string? OfferToken { get; init; } - /// Developer billing option parameters for external payments flow (8.3.0+). - /// When provided, the purchase flow will show a side-by-side choice between - /// Google Play Billing and the developer's external payment option. + /// Developer billing option parameters for external payments and Billing Choice. + /// Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). [JsonPropertyName("developerBillingOption")] public DeveloperBillingOptionParamsAndroid? DeveloperBillingOption { get; init; } } @@ -4359,6 +4420,11 @@ public sealed record RequestSubscriptionAndroidProps /// Purchase token for upgrades/downgrades [JsonPropertyName("purchaseToken")] public string? PurchaseToken { get; init; } + /// Original external transaction ID for replacing a subscription that was + /// purchased through developer billing. Available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). + [JsonPropertyName("originalExternalTransactionId")] + public string? OriginalExternalTransactionId { get; init; } /// Replacement mode for subscription changes /// @deprecated Use subscriptionProductReplacementParams instead for item-level replacement (8.1.0+) [JsonPropertyName("replacementMode")] @@ -4370,9 +4436,9 @@ public sealed record RequestSubscriptionAndroidProps /// Use this instead of replacementMode for item-level replacement [JsonPropertyName("subscriptionProductReplacementParams")] public SubscriptionProductReplacementParamsAndroid? SubscriptionProductReplacementParams { get; init; } - /// Developer billing option parameters for external payments flow (8.3.0+). - /// When provided, the purchase flow will show a side-by-side choice between - /// Google Play Billing and the developer's external payment option. + /// Developer billing option parameters for external payments and Billing Choice. + /// Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). [JsonPropertyName("developerBillingOption")] public DeveloperBillingOptionParamsAndroid? DeveloperBillingOption { get; init; } } @@ -4636,6 +4702,8 @@ public interface MutationResolver /// Returns external transaction token needed for reporting external transactions. /// developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, /// native Android defaults it to IN_APP. + /// The Billing Choice extension is available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android Task CreateBillingProgramReportingDetailsAndroidAsync(BillingProgramAndroid program, DeveloperBillingTypeAndroid? developerBillingType = null); @@ -4664,7 +4732,10 @@ public interface MutationResolver /// See: https://openiap.dev/docs/apis/android/is-billing-program-available-android Task IsBillingProgramAvailableAndroidAsync(BillingProgramAndroid program); - /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). + /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+), + /// including developer-rendered Billing Choice external-link flows. + /// Billing Choice availability: OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). /// Replaces the deprecated showExternalOfferInformationDialog API. /// Shows Play Store dialog and optionally launches external URL. /// Throws OpenIapError.NotPrepared if billing client not ready. @@ -4708,8 +4779,9 @@ public interface MutationResolver /// See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android Task ShowAlternativeBillingDialogAndroidAsync(); - /// Show Google's information dialog for a Billing Choice external transaction. - /// Available in Google Play Billing Library 9.1.0+. + /// Show Google's mandatory information dialog before a developer-rendered, + /// in-app Billing Choice screen. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android Task ShowBillingProgramInformationDialogAndroidAsync(BillingProgramInformationDialogParamsAndroid @params); @@ -4721,7 +4793,8 @@ public interface MutationResolver Task ShowExternalPurchaseCustomLinkNoticeIOSAsync(ExternalPurchaseCustomLinkNoticeTypeIOS noticeType); /// Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. - /// Available in Google Play Billing Library 4.1.0+. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 + /// (upstream API available since Play Billing 4.1.0). /// Returns a response code and, when the subscription status changes, the related purchase token. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-in-app-messages-android @@ -4790,7 +4863,7 @@ public interface QueryResolver Task> GetAvailablePurchasesAsync(PurchaseOptions? options = null); /// Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. - /// Available in Google Play Billing Library 9.1.0+. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client is not ready. /// See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android Task GetBillingChoiceInfoAndroidAsync(GetBillingChoiceInfoParamsAndroid @params); @@ -4859,11 +4932,11 @@ public interface QueryResolver /// GraphQL root subscription operations. public interface SubscriptionResolver { - /// Fires when a user selects developer billing in the External Payments flow (Android only) - /// Triggered when the user chooses to pay via the developer's external payment option - /// instead of Google Play Billing in the side-by-side choice dialog. - /// Contains the externalTransactionToken needed to report the transaction. - /// Available in Google Play Billing Library 8.3.0+ + /// Fires when a user selects developer billing in an External Payments or + /// Billing Choice flow (Android only). The payload can contain an external + /// transaction token, link URI, original transaction ID, and selected products. + /// Billing Choice payload fields are available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). Task DeveloperProvidedBillingAndroidAsync(); /// Fires when the App Store surfaces a promoted product (iOS only) diff --git a/packages/gql/src/generated/Types.kt b/packages/gql/src/generated/Types.kt index 6d0447e66..4ef581957 100644 --- a/packages/gql/src/generated/Types.kt +++ b/packages/gql/src/generated/Types.kt @@ -49,7 +49,7 @@ public enum class AlternativeBillingModeAndroid(val rawValue: String) { /** * Play Billing choice image layout (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ public enum class BillingChoiceImageLayoutAndroid(val rawValue: String) { /** @@ -82,7 +82,7 @@ public enum class BillingChoiceImageLayoutAndroid(val rawValue: String) { /** * Choice screen renderer for Billing Choice availability (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ public enum class BillingChoiceScreenTypeAndroid(val rawValue: String) { /** @@ -116,7 +116,8 @@ public enum class BillingChoiceScreenTypeAndroid(val rawValue: String) { /** * Billing program types for Google Play Billing Programs (Android) * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, - * BILLING_CHOICE added in 9.1.0. + * BILLING_CHOICE added in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ public enum class BillingProgramAndroid(val rawValue: String) { /** @@ -151,7 +152,7 @@ public enum class BillingProgramAndroid(val rawValue: String) { /** * Billing Choice program. * Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ BillingChoice("billing-choice") @@ -214,7 +215,7 @@ public enum class DeveloperBillingLaunchModeAndroid(val rawValue: String) { /** * Developer-provided billing destination type for Billing Program reporting details (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ public enum class DeveloperBillingTypeAndroid(val rawValue: String) { /** @@ -606,8 +607,9 @@ public enum class IapEvent(val rawValue: String) { PromotedProductIos("promoted-product-ios"), UserChoiceBillingAndroid("user-choice-billing-android"), /** - * Fired when user selects developer-provided billing option in external payments flow. - * Available on Android with Google Play Billing Library 8.3.0+ + * Fired for External Payments (8.3.0+) and Google-rendered Billing Choice + * developer billing selections on Android. Billing Choice is available in + * OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ DeveloperProvidedBillingAndroid("developer-provided-billing-android"), /** @@ -764,7 +766,8 @@ public enum class IapStore(val rawValue: String) { /** * High-level in-app message category (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ public enum class InAppMessageCategoryAndroid(val rawValue: String) { /** @@ -791,7 +794,8 @@ public enum class InAppMessageCategoryAndroid(val rawValue: String) { /** * Response code from Play billing in-app messages (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ public enum class InAppMessageResponseCodeAndroid(val rawValue: String) { /** @@ -1576,6 +1580,9 @@ public interface PurchaseCommon { * Store where purchase was made */ val store: IapStore + /** + * Unix timestamp in milliseconds since January 1, 1970 UTC. + */ val transactionDate: Double } @@ -1606,6 +1613,9 @@ public data class ActiveSubscription( * pending upgrades/downgrades, and auto-renewal preferences. */ val renewalInfoIOS: RenewalInfoIOS? = null, + /** + * Unix timestamp in milliseconds since January 1, 1970 UTC. + */ val transactionDate: Double, val transactionId: String, /** @@ -1866,7 +1876,7 @@ public data class AppTransaction( /** * Display information for developer-rendered Billing Choice screens (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ public data class BillingChoiceInfoAndroid( /** @@ -1906,6 +1916,7 @@ public data class BillingProgramAvailabilityResultAndroid( val billingProgram: BillingProgramAndroid, /** * Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. */ val choiceScreenType: BillingChoiceScreenTypeAndroid? = null, /** @@ -1915,6 +1926,7 @@ public data class BillingProgramAvailabilityResultAndroid( /** * Whether external-link payment is available for Billing Choice. * Populated only for available BILLING_CHOICE results. + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. */ val isExternalLinkAvailable: Boolean? = null ) { @@ -2018,16 +2030,32 @@ public data class BillingResultAndroid( public data class DeveloperProvidedBillingDetailsAndroid( /** * External transaction token used to report transactions made through developer billing. - * This token must be used when reporting the external transaction to Google Play. - * Must be reported within 24 hours of the transaction. + * Nullable for flows such as external payments where no token is returned. */ - val externalTransactionToken: String + val externalTransactionToken: String? = null, + /** + * URI to launch for an external-link Billing Choice flow, when provided by + * Google Play. + */ + val linkUri: String? = null, + /** + * Original external transaction ID when replacing a subscription that was + * purchased through developer billing. + */ + val originalExternalTransactionId: String? = null, + /** + * Products selected for the developer billing flow. + */ + val products: List ) { companion object { fun fromJson(json: Map): DeveloperProvidedBillingDetailsAndroid { return DeveloperProvidedBillingDetailsAndroid( - externalTransactionToken = json["externalTransactionToken"] as? String ?: "", + externalTransactionToken = json["externalTransactionToken"] as? String, + linkUri = json["linkUri"] as? String, + originalExternalTransactionId = json["originalExternalTransactionId"] as? String, + products = (json["products"] as? List<*>)?.mapNotNull { (it as? Map)?.let { DeveloperProvidedBillingProductAndroid.fromJson(it) } ?: throw IllegalArgumentException("Missing required object for DeveloperProvidedBillingProductAndroid") } ?: emptyList(), ) } } @@ -2035,6 +2063,45 @@ public data class DeveloperProvidedBillingDetailsAndroid( fun toJson(): Map = mapOf( "__typename" to "DeveloperProvidedBillingDetailsAndroid", "externalTransactionToken" to externalTransactionToken, + "linkUri" to linkUri, + "originalExternalTransactionId" to originalExternalTransactionId, + "products" to products.map { it.toJson() }, + ) +} + +/** + * Product selected for developer-provided billing (Android 9.0+). + */ +public data class DeveloperProvidedBillingProductAndroid( + /** + * Product identifier. + */ + val id: String, + /** + * Subscription offer token, when applicable. + */ + val offerToken: String? = null, + /** + * Google Play product type (in-app or subscription). + */ + val type: ProductType +) { + + companion object { + fun fromJson(json: Map): DeveloperProvidedBillingProductAndroid { + return DeveloperProvidedBillingProductAndroid( + id = json["id"] as? String ?: "", + offerToken = json["offerToken"] as? String, + type = (json["type"] as? String)?.let { ProductType.fromJson(it) } ?: ProductType.InApp, + ) + } + } + + fun toJson(): Map = mapOf( + "__typename" to "DeveloperProvidedBillingProductAndroid", + "id" to id, + "offerToken" to offerToken, + "type" to type.toJson(), ) } @@ -2544,7 +2611,8 @@ public data class FetchProductsResultSubscriptions(val value: List): DeveloperBillingOptionParamsAndroid? { val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified - val launchMode = (json["launchMode"] as? String)?.let { DeveloperBillingLaunchModeAndroid.fromJson(it) } ?: DeveloperBillingLaunchModeAndroid.Unspecified + val externalTransactionToken = json["externalTransactionToken"] as? String + val launchMode = (json["launchMode"] as? String)?.let { DeveloperBillingLaunchModeAndroid.fromJson(it) } val linkUri = json["linkUri"] as? String - if (linkUri == null) return null return DeveloperBillingOptionParamsAndroid( billingProgram = billingProgram, + externalTransactionToken = externalTransactionToken, launchMode = launchMode, linkUri = linkUri, ) @@ -4649,7 +4733,8 @@ public data class DeveloperBillingOptionParamsAndroid( fun toJson(): Map = mapOf( "billingProgram" to billingProgram.toJson(), - "launchMode" to launchMode.toJson(), + "externalTransactionToken" to externalTransactionToken, + "launchMode" to launchMode?.toJson(), "linkUri" to linkUri, ) } @@ -4705,7 +4790,7 @@ public data class DiscountOfferInputIOS( /** * Parameters for fetching Billing Choice display information (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ public data class GetBillingChoiceInfoParamsAndroid( /** @@ -4740,7 +4825,8 @@ public data class GetBillingChoiceInfoParamsAndroid( /** * Parameters for showing Play billing in-app messages (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ public data class InAppMessageParamsAndroid( /** @@ -4772,6 +4858,16 @@ public data class InitConnectionConfig( * Use USER_CHOICE_BILLING for user choice billing, EXTERNAL_OFFER for alternative only. */ val alternativeBillingModeAndroid: AlternativeBillingModeAndroid? = null, + /** + * Billing Choice renderer configured in Play Console. Available in OpenIAP + * Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). + * GOOGLE_RENDERED registers the developer-provided billing listener so OpenIAP + * can emit the selection event. DEVELOPER_RENDERED omits that listener so the + * app can render its own choice screen and use the reporting/dialog/link APIs. + * Must match choiceScreenType returned by isBillingProgramAvailableAndroid. + * Defaults to GOOGLE_RENDERED. + */ + val billingChoiceScreenTypeAndroid: BillingChoiceScreenTypeAndroid? = BillingChoiceScreenTypeAndroid.GoogleRendered, /** * Enable a specific billing program for Android (7.0+) * When set, enables the specified billing program for external transactions. @@ -4779,6 +4875,8 @@ public data class InitConnectionConfig( * - EXTERNAL_CONTENT_LINK: Link to external content (8.2.0+) * - EXTERNAL_OFFER: External offers for digital content (8.2.0+) * - EXTERNAL_PAYMENTS: Developer provided billing, Japan only (8.3.0+) + * - BILLING_CHOICE: Google-rendered or developer-rendered billing choice + * (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+) */ val enableBillingProgramAndroid: BillingProgramAndroid? = null ) { @@ -4786,6 +4884,7 @@ public data class InitConnectionConfig( fun fromJson(json: Map): InitConnectionConfig { return InitConnectionConfig( alternativeBillingModeAndroid = (json["alternativeBillingModeAndroid"] as? String)?.let { AlternativeBillingModeAndroid.fromJson(it) }, + billingChoiceScreenTypeAndroid = (json["billingChoiceScreenTypeAndroid"] as? String)?.let { BillingChoiceScreenTypeAndroid.fromJson(it) } ?: BillingChoiceScreenTypeAndroid.GoogleRendered, enableBillingProgramAndroid = (json["enableBillingProgramAndroid"] as? String)?.let { BillingProgramAndroid.fromJson(it) }, ) } @@ -4793,20 +4892,28 @@ public data class InitConnectionConfig( fun toJson(): Map = mapOf( "alternativeBillingModeAndroid" to alternativeBillingModeAndroid?.toJson(), + "billingChoiceScreenTypeAndroid" to billingChoiceScreenTypeAndroid?.toJson(), "enableBillingProgramAndroid" to enableBillingProgramAndroid?.toJson(), ) } /** * Parameters for launching an external link (Android) - * Used with launchExternalLink to initiate external offer or app install flows + * Used with launchExternalLink to initiate external offer, app install, or + * developer-rendered Billing Choice flows * Available in Google Play Billing Library 8.2.0+ */ public data class LaunchExternalLinkParamsAndroid( /** - * The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) + * The billing program (EXTERNAL_CONTENT_LINK, EXTERNAL_OFFER, or BILLING_CHOICE) */ val billingProgram: BillingProgramAndroid, + /** + * External transaction token for a developer-rendered Billing Choice external-link + * flow. Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). Generate it with createBillingProgramReportingDetailsAndroid. + */ + val externalTransactionToken: String? = null, /** * The external link launch mode */ @@ -4823,12 +4930,14 @@ public data class LaunchExternalLinkParamsAndroid( companion object { fun fromJson(json: Map): LaunchExternalLinkParamsAndroid? { val billingProgram = (json["billingProgram"] as? String)?.let { BillingProgramAndroid.fromJson(it) } ?: BillingProgramAndroid.Unspecified + val externalTransactionToken = json["externalTransactionToken"] as? String val launchMode = (json["launchMode"] as? String)?.let { ExternalLinkLaunchModeAndroid.fromJson(it) } ?: ExternalLinkLaunchModeAndroid.Unspecified val linkType = (json["linkType"] as? String)?.let { ExternalLinkTypeAndroid.fromJson(it) } ?: ExternalLinkTypeAndroid.Unspecified val linkUri = json["linkUri"] as? String if (linkUri == null) return null return LaunchExternalLinkParamsAndroid( billingProgram = billingProgram, + externalTransactionToken = externalTransactionToken, launchMode = launchMode, linkType = linkType, linkUri = linkUri, @@ -4838,6 +4947,7 @@ public data class LaunchExternalLinkParamsAndroid( fun toJson(): Map = mapOf( "billingProgram" to billingProgram.toJson(), + "externalTransactionToken" to externalTransactionToken, "launchMode" to launchMode.toJson(), "linkType" to linkType.toJson(), "linkUri" to linkUri, @@ -4961,9 +5071,9 @@ public data class PurchaseUpdatedListenerOptions( public data class RequestPurchaseAndroidProps( /** - * Developer billing option parameters for external payments flow (8.3.0+). - * When provided, the purchase flow will show a side-by-side choice between - * Google Play Billing and the developer's external payment option. + * Developer billing option parameters for external payments and Billing Choice. + * Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ val developerBillingOption: DeveloperBillingOptionParamsAndroid? = null, /** @@ -5181,9 +5291,9 @@ public data class RequestPurchasePropsByPlatforms( public data class RequestSubscriptionAndroidProps( /** - * Developer billing option parameters for external payments flow (8.3.0+). - * When provided, the purchase flow will show a side-by-side choice between - * Google Play Billing and the developer's external payment option. + * Developer billing option parameters for external payments and Billing Choice. + * Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ val developerBillingOption: DeveloperBillingOptionParamsAndroid? = null, /** @@ -5199,6 +5309,12 @@ public data class RequestSubscriptionAndroidProps( * Obfuscated profile ID */ val obfuscatedProfileId: String? = null, + /** + * Original external transaction ID for replacing a subscription that was + * purchased through developer billing. Available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). + */ + val originalExternalTransactionId: String? = null, /** * Purchase token for upgrades/downgrades */ @@ -5228,6 +5344,7 @@ public data class RequestSubscriptionAndroidProps( val isOfferPersonalized = json["isOfferPersonalized"] as? Boolean val obfuscatedAccountId = json["obfuscatedAccountId"] as? String val obfuscatedProfileId = json["obfuscatedProfileId"] as? String + val originalExternalTransactionId = json["originalExternalTransactionId"] as? String val purchaseToken = json["purchaseToken"] as? String val replacementMode = (json["replacementMode"] as? Number)?.toInt() val skus = (json["skus"] as? List<*>)?.mapNotNull { it as? String } @@ -5239,6 +5356,7 @@ public data class RequestSubscriptionAndroidProps( isOfferPersonalized = isOfferPersonalized, obfuscatedAccountId = obfuscatedAccountId, obfuscatedProfileId = obfuscatedProfileId, + originalExternalTransactionId = originalExternalTransactionId, purchaseToken = purchaseToken, replacementMode = replacementMode, skus = skus, @@ -5253,6 +5371,7 @@ public data class RequestSubscriptionAndroidProps( "isOfferPersonalized" to isOfferPersonalized, "obfuscatedAccountId" to obfuscatedAccountId, "obfuscatedProfileId" to obfuscatedProfileId, + "originalExternalTransactionId" to originalExternalTransactionId, "purchaseToken" to purchaseToken, "replacementMode" to replacementMode, "skus" to skus, @@ -5888,6 +6007,8 @@ public interface MutationResolver { * Returns external transaction token needed for reporting external transactions. * developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, * native Android defaults it to IN_APP. + * The Billing Choice extension is available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ @@ -5922,7 +6043,10 @@ public interface MutationResolver { */ suspend fun isBillingProgramAvailableAndroid(program: BillingProgramAndroid): BillingProgramAvailabilityResultAndroid /** - * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). + * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+), + * including developer-rendered Billing Choice external-link flows. + * Billing Choice availability: OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). * Replaces the deprecated showExternalOfferInformationDialog API. * Shows Play Store dialog and optionally launches external URL. * Throws OpenIapError.NotPrepared if billing client not ready. @@ -5974,8 +6098,9 @@ public interface MutationResolver { */ suspend fun showAlternativeBillingDialogAndroid(): Boolean /** - * Show Google's information dialog for a Billing Choice external transaction. - * Available in Google Play Billing Library 9.1.0+. + * Show Google's mandatory information dialog before a developer-rendered, + * in-app Billing Choice screen. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android */ @@ -5989,7 +6114,8 @@ public interface MutationResolver { suspend fun showExternalPurchaseCustomLinkNoticeIOS(noticeType: ExternalPurchaseCustomLinkNoticeTypeIOS): ExternalPurchaseCustomLinkNoticeResultIOS /** * Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. - * Available in Google Play Billing Library 4.1.0+. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). * Returns a response code and, when the subscription status changes, the related purchase token. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-in-app-messages-android @@ -6073,7 +6199,7 @@ public interface QueryResolver { suspend fun getAvailablePurchases(options: PurchaseOptions? = null): List /** * Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. - * Available in Google Play Billing Library 9.1.0+. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client is not ready. * See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android */ @@ -6159,11 +6285,11 @@ public interface QueryResolver { */ public interface SubscriptionResolver { /** - * Fires when a user selects developer billing in the External Payments flow (Android only) - * Triggered when the user chooses to pay via the developer's external payment option - * instead of Google Play Billing in the side-by-side choice dialog. - * Contains the externalTransactionToken needed to report the transaction. - * Available in Google Play Billing Library 8.3.0+ + * Fires when a user selects developer billing in an External Payments or + * Billing Choice flow (Android only). The payload can contain an external + * transaction token, link URI, original transaction ID, and selected products. + * Billing Choice payload fields are available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ suspend fun developerProvidedBillingAndroid(): DeveloperProvidedBillingDetailsAndroid /** diff --git a/packages/gql/src/generated/Types.swift b/packages/gql/src/generated/Types.swift index 742657cb0..500c35895 100644 --- a/packages/gql/src/generated/Types.swift +++ b/packages/gql/src/generated/Types.swift @@ -25,7 +25,7 @@ public enum AlternativeBillingModeAndroid: String, Codable, CaseIterable { } /// Play Billing choice image layout (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public enum BillingChoiceImageLayoutAndroid: String, Codable, CaseIterable { /// Rectangular image with a 4:1 aspect ratio. case rectangularFourByOne = "rectangular-four-by-one" @@ -36,7 +36,7 @@ public enum BillingChoiceImageLayoutAndroid: String, Codable, CaseIterable { } /// Choice screen renderer for Billing Choice availability (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public enum BillingChoiceScreenTypeAndroid: String, Codable, CaseIterable { /// Unspecified choice screen type. case unspecified = "unspecified" @@ -48,7 +48,8 @@ public enum BillingChoiceScreenTypeAndroid: String, Codable, CaseIterable { /// Billing program types for Google Play Billing Programs (Android) /// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, -/// BILLING_CHOICE added in 9.1.0. +/// BILLING_CHOICE added in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (requires Play Billing 9.1.0+). public enum BillingProgramAndroid: String, Codable, CaseIterable { /// Unspecified billing program. Do not use. case unspecified = "unspecified" @@ -71,7 +72,7 @@ public enum BillingProgramAndroid: String, Codable, CaseIterable { case externalPayments = "external-payments" /// Billing Choice program. /// Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. - /// Available in Google Play Billing Library 9.1.0+ + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). case billingChoice = "billing-choice" } @@ -90,7 +91,7 @@ public enum DeveloperBillingLaunchModeAndroid: String, Codable, CaseIterable { } /// Developer-provided billing destination type for Billing Program reporting details (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public enum DeveloperBillingTypeAndroid: String, Codable, CaseIterable { /// Unspecified developer billing type. Do not use. case developerBillingTypeUnspecified = "developer-billing-type-unspecified" @@ -299,8 +300,9 @@ public enum IapEvent: String, Codable, CaseIterable { case purchaseError = "purchase-error" case promotedProductIos = "promoted-product-ios" case userChoiceBillingAndroid = "user-choice-billing-android" - /// Fired when user selects developer-provided billing option in external payments flow. - /// Available on Android with Google Play Billing Library 8.3.0+ + /// Fired for External Payments (8.3.0+) and Google-rendered Billing Choice + /// developer billing selections on Android. Billing Choice is available in + /// OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). case developerProvidedBillingAndroid = "developer-provided-billing-android" /// Fired when an active subscription enters a billing-issue state that requires user attention. /// Cross-platform unification of StoreKit 2 Message.billingIssue (iOS 18+) and @@ -345,7 +347,8 @@ public enum IapStore: String, Codable, CaseIterable { } /// High-level in-app message category (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). public enum InAppMessageCategoryAndroid: String, Codable, CaseIterable { /// Unknown in-app message category. case unknownInAppMessageCategoryId = "unknown-in-app-message-category-id" @@ -354,7 +357,8 @@ public enum InAppMessageCategoryAndroid: String, Codable, CaseIterable { } /// Response code from Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). public enum InAppMessageResponseCodeAndroid: String, Codable, CaseIterable { /// Flow finished and no developer action is needed. case noActionNeeded = "no-action-needed" @@ -629,6 +633,7 @@ public protocol PurchaseCommon: Codable { var quantity: Int { get } /// Store where purchase was made var store: IapStore { get } + /// Unix timestamp in milliseconds since January 1, 1970 UTC. var transactionDate: Double { get } } @@ -653,6 +658,7 @@ public struct ActiveSubscription: Codable { /// Renewal information from StoreKit 2 (iOS only). Contains details about subscription renewal status, /// pending upgrades/downgrades, and auto-renewal preferences. public var renewalInfoIOS: RenewalInfoIOS? = nil + /// Unix timestamp in milliseconds since January 1, 1970 UTC. public var transactionDate: Double public var transactionId: String /// @deprecated iOS only - use daysUntilExpirationIOS instead. @@ -724,7 +730,7 @@ public struct AppTransaction: Codable { } /// Display information for developer-rendered Billing Choice screens (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public struct BillingChoiceInfoAndroid: Codable { /// URL for the Play Billing choice image matching the requested layout. public var playBillingChoiceImageUrl: String @@ -738,11 +744,13 @@ public struct BillingProgramAvailabilityResultAndroid: Codable { /// The billing program that was checked public var billingProgram: BillingProgramAndroid /// Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. public var choiceScreenType: BillingChoiceScreenTypeAndroid? = nil /// Whether the billing program is available for the user public var isAvailable: Bool /// Whether external-link payment is available for Billing Choice. /// Populated only for available BILLING_CHOICE results. + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. public var isExternalLinkAvailable: Bool? = nil } @@ -774,9 +782,26 @@ public struct BillingResultAndroid: Codable { /// Available in Google Play Billing Library 8.3.0+ public struct DeveloperProvidedBillingDetailsAndroid: Codable { /// External transaction token used to report transactions made through developer billing. - /// This token must be used when reporting the external transaction to Google Play. - /// Must be reported within 24 hours of the transaction. - public var externalTransactionToken: String + /// Nullable for flows such as external payments where no token is returned. + public var externalTransactionToken: String? = nil + /// URI to launch for an external-link Billing Choice flow, when provided by + /// Google Play. + public var linkUri: String? = nil + /// Original external transaction ID when replacing a subscription that was + /// purchased through developer billing. + public var originalExternalTransactionId: String? = nil + /// Products selected for the developer billing flow. + public var products: [DeveloperProvidedBillingProductAndroid] +} + +/// Product selected for developer-provided billing (Android 9.0+). +public struct DeveloperProvidedBillingProductAndroid: Codable { + /// Product identifier. + public var id: String + /// Subscription offer token, when applicable. + public var offerToken: String? = nil + /// Google Play product type (in-app or subscription). + public var type: ProductType } /// Discount amount details for one-time purchase offers (Android) @@ -950,7 +975,8 @@ public enum FetchProductsResult { } /// Result from showing Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). public struct InAppMessageResultAndroid: Codable { /// Purchase token returned when a subscription status changed. public var purchaseToken: String? = nil @@ -1233,6 +1259,7 @@ public struct PurchaseAndroid: Codable, PurchaseCommon { public var signatureAndroid: String? = nil /// Store where purchase was made public var store: IapStore + /// Unix timestamp in milliseconds since January 1, 1970 UTC. public var transactionDate: Double public var transactionId: String? = nil } @@ -1288,6 +1315,7 @@ public struct PurchaseIOS: Codable, PurchaseCommon { public var store: IapStore public var storefrontCountryCodeIOS: String? = nil public var subscriptionGroupIdIOS: String? = nil + /// Unix timestamp in milliseconds since January 1, 1970 UTC. public var transactionDate: Double public var transactionId: String public var transactionReasonIOS: String? = nil @@ -1629,7 +1657,7 @@ public struct AndroidSubscriptionOfferInput: Codable { } /// Parameters for showing a billing program information dialog (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public struct BillingProgramInformationDialogParamsAndroid: Codable { /// Billing program. Currently only BILLING_CHOICE is supported. public var billingProgram: BillingProgramAndroid @@ -1660,23 +1688,32 @@ public struct DeepLinkOptions: Codable { } } -/// Parameters for developer billing option in purchase flow (Android) -/// Used with BillingFlowParams to enable external payments flow -/// Available in Google Play Billing Library 8.3.0+ +/// Parameters for a developer billing option in a purchase flow (Android). +/// Used with BillingFlowParams for external payments (8.3.0+) and Billing Choice +/// (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+). +/// Only billingProgram is required; link fields are used when the selected program +/// links outside the app. public struct DeveloperBillingOptionParamsAndroid: Codable { - /// The billing program (should be EXTERNAL_PAYMENTS for external payments flow) + /// The billing program. Use EXTERNAL_PAYMENTS or BILLING_CHOICE. public var billingProgram: BillingProgramAndroid - /// The launch mode for the external payment link - public var launchMode: DeveloperBillingLaunchModeAndroid - /// The URI where the external payment will be processed - public var linkUri: String + /// A pre-generated external transaction token for a Billing Choice external-link + /// flow. Omit it when Google Play should provide the token in the callback. + public var externalTransactionToken: String? + /// The launch mode for the external payment link. + /// Required only when the selected billing program links outside the app. + public var launchMode: DeveloperBillingLaunchModeAndroid? + /// The URI where the external payment will be processed. + /// Required only when the selected billing program links outside the app. + public var linkUri: String? public init( billingProgram: BillingProgramAndroid, - launchMode: DeveloperBillingLaunchModeAndroid, - linkUri: String + externalTransactionToken: String? = nil, + launchMode: DeveloperBillingLaunchModeAndroid? = nil, + linkUri: String? = nil ) { self.billingProgram = billingProgram + self.externalTransactionToken = externalTransactionToken self.launchMode = launchMode self.linkUri = linkUri } @@ -1734,7 +1771,7 @@ public struct DiscountOfferInputIOS: Codable { } /// Parameters for fetching Billing Choice display information (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). public struct GetBillingChoiceInfoParamsAndroid: Codable { /// Billing program. Currently only BILLING_CHOICE is supported. public var billingProgram: BillingProgramAndroid @@ -1755,7 +1792,8 @@ public struct GetBillingChoiceInfoParamsAndroid: Codable { } /// Parameters for showing Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). public struct InAppMessageParamsAndroid: Codable { /// In-app message categories to show. Defaults to transactional messages. public var categories: [InAppMessageCategoryAndroid]? @@ -1774,29 +1812,46 @@ public struct InitConnectionConfig: Codable { /// @deprecated Use enableBillingProgramAndroid instead. /// Use USER_CHOICE_BILLING for user choice billing, EXTERNAL_OFFER for alternative only. public var alternativeBillingModeAndroid: AlternativeBillingModeAndroid? + /// Billing Choice renderer configured in Play Console. Available in OpenIAP + /// Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). + /// GOOGLE_RENDERED registers the developer-provided billing listener so OpenIAP + /// can emit the selection event. DEVELOPER_RENDERED omits that listener so the + /// app can render its own choice screen and use the reporting/dialog/link APIs. + /// Must match choiceScreenType returned by isBillingProgramAvailableAndroid. + /// Defaults to GOOGLE_RENDERED. + public var billingChoiceScreenTypeAndroid: BillingChoiceScreenTypeAndroid? /// Enable a specific billing program for Android (7.0+) /// When set, enables the specified billing program for external transactions. /// - USER_CHOICE_BILLING: User can select between Google Play or alternative (7.0+) /// - EXTERNAL_CONTENT_LINK: Link to external content (8.2.0+) /// - EXTERNAL_OFFER: External offers for digital content (8.2.0+) /// - EXTERNAL_PAYMENTS: Developer provided billing, Japan only (8.3.0+) + /// - BILLING_CHOICE: Google-rendered or developer-rendered billing choice + /// (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+) public var enableBillingProgramAndroid: BillingProgramAndroid? public init( alternativeBillingModeAndroid: AlternativeBillingModeAndroid? = nil, + billingChoiceScreenTypeAndroid: BillingChoiceScreenTypeAndroid? = .googleRendered, enableBillingProgramAndroid: BillingProgramAndroid? = nil ) { self.alternativeBillingModeAndroid = alternativeBillingModeAndroid + self.billingChoiceScreenTypeAndroid = billingChoiceScreenTypeAndroid self.enableBillingProgramAndroid = enableBillingProgramAndroid } } /// Parameters for launching an external link (Android) -/// Used with launchExternalLink to initiate external offer or app install flows +/// Used with launchExternalLink to initiate external offer, app install, or +/// developer-rendered Billing Choice flows /// Available in Google Play Billing Library 8.2.0+ public struct LaunchExternalLinkParamsAndroid: Codable { - /// The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) + /// The billing program (EXTERNAL_CONTENT_LINK, EXTERNAL_OFFER, or BILLING_CHOICE) public var billingProgram: BillingProgramAndroid + /// External transaction token for a developer-rendered Billing Choice external-link + /// flow. Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). Generate it with createBillingProgramReportingDetailsAndroid. + public var externalTransactionToken: String? /// The external link launch mode public var launchMode: ExternalLinkLaunchModeAndroid /// The type of the external link @@ -1806,11 +1861,13 @@ public struct LaunchExternalLinkParamsAndroid: Codable { public init( billingProgram: BillingProgramAndroid, + externalTransactionToken: String? = nil, launchMode: ExternalLinkLaunchModeAndroid, linkType: ExternalLinkTypeAndroid, linkUri: String ) { self.billingProgram = billingProgram + self.externalTransactionToken = externalTransactionToken self.launchMode = launchMode self.linkType = linkType self.linkUri = linkUri @@ -1889,9 +1946,9 @@ public struct PurchaseUpdatedListenerOptions: Codable { } public struct RequestPurchaseAndroidProps: Codable { - /// Developer billing option parameters for external payments flow (8.3.0+). - /// When provided, the purchase flow will show a side-by-side choice between - /// Google Play Billing and the developer's external payment option. + /// Developer billing option parameters for external payments and Billing Choice. + /// Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). public var developerBillingOption: DeveloperBillingOptionParamsAndroid? /// Personalized offer flag. /// When true, indicates the price was customized for this user. @@ -2060,9 +2117,9 @@ public struct RequestPurchasePropsByPlatforms: Codable { } public struct RequestSubscriptionAndroidProps: Codable { - /// Developer billing option parameters for external payments flow (8.3.0+). - /// When provided, the purchase flow will show a side-by-side choice between - /// Google Play Billing and the developer's external payment option. + /// Developer billing option parameters for external payments and Billing Choice. + /// Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). public var developerBillingOption: DeveloperBillingOptionParamsAndroid? /// Personalized offer flag. /// When true, indicates the price was customized for this user. @@ -2071,6 +2128,10 @@ public struct RequestSubscriptionAndroidProps: Codable { public var obfuscatedAccountId: String? /// Obfuscated profile ID public var obfuscatedProfileId: String? + /// Original external transaction ID for replacing a subscription that was + /// purchased through developer billing. Available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). + public var originalExternalTransactionId: String? /// Purchase token for upgrades/downgrades public var purchaseToken: String? /// Replacement mode for subscription changes @@ -2089,6 +2150,7 @@ public struct RequestSubscriptionAndroidProps: Codable { isOfferPersonalized: Bool? = nil, obfuscatedAccountId: String? = nil, obfuscatedProfileId: String? = nil, + originalExternalTransactionId: String? = nil, purchaseToken: String? = nil, replacementMode: Int? = nil, skus: [String], @@ -2099,6 +2161,7 @@ public struct RequestSubscriptionAndroidProps: Codable { self.isOfferPersonalized = isOfferPersonalized self.obfuscatedAccountId = obfuscatedAccountId self.obfuscatedProfileId = obfuscatedProfileId + self.originalExternalTransactionId = originalExternalTransactionId self.purchaseToken = purchaseToken self.replacementMode = replacementMode self.skus = skus @@ -2700,6 +2763,7 @@ public enum Purchase: Codable, PurchaseCommon { } } + /// Unix timestamp in milliseconds since January 1, 1970 UTC. public var transactionDate: Double { switch self { case let .purchaseAndroid(value): @@ -2749,6 +2813,8 @@ public protocol MutationResolver { /// Returns external transaction token needed for reporting external transactions. /// developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, /// native Android defaults it to IN_APP. + /// The Billing Choice extension is available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android func createBillingProgramReportingDetailsAndroid(program: BillingProgramAndroid, developerBillingType: DeveloperBillingTypeAndroid?) async throws -> BillingProgramReportingDetailsAndroid @@ -2771,7 +2837,10 @@ public protocol MutationResolver { /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/is-billing-program-available-android func isBillingProgramAvailableAndroid(_ program: BillingProgramAndroid) async throws -> BillingProgramAvailabilityResultAndroid - /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). + /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+), + /// including developer-rendered Billing Choice external-link flows. + /// Billing Choice availability: OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). /// Replaces the deprecated showExternalOfferInformationDialog API. /// Shows Play Store dialog and optionally launches external URL. /// Throws OpenIapError.NotPrepared if billing client not ready. @@ -2807,8 +2876,9 @@ public protocol MutationResolver { /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android func showAlternativeBillingDialogAndroid() async throws -> Bool - /// Show Google's information dialog for a Billing Choice external transaction. - /// Available in Google Play Billing Library 9.1.0+. + /// Show Google's mandatory information dialog before a developer-rendered, + /// in-app Billing Choice screen. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android func showBillingProgramInformationDialogAndroid(_ params: BillingProgramInformationDialogParamsAndroid) async throws -> BillingResultAndroid @@ -2818,7 +2888,8 @@ public protocol MutationResolver { /// See: https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios func showExternalPurchaseCustomLinkNoticeIOS(_ noticeType: ExternalPurchaseCustomLinkNoticeTypeIOS) async throws -> ExternalPurchaseCustomLinkNoticeResultIOS /// Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. - /// Available in Google Play Billing Library 4.1.0+. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 + /// (upstream API available since Play Billing 4.1.0). /// Returns a response code and, when the subscription status changes, the related purchase token. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-in-app-messages-android @@ -2874,7 +2945,7 @@ public protocol QueryResolver { /// See: https://openiap.dev/docs/apis/get-available-purchases func getAvailablePurchases(_ options: PurchaseOptions?) async throws -> [Purchase] /// Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. - /// Available in Google Play Billing Library 9.1.0+. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client is not ready. /// See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android func getBillingChoiceInfoAndroid(_ params: GetBillingChoiceInfoParamsAndroid) async throws -> BillingChoiceInfoAndroid @@ -2928,11 +2999,11 @@ public protocol QueryResolver { /// GraphQL root subscription operations. public protocol SubscriptionResolver { - /// Fires when a user selects developer billing in the External Payments flow (Android only) - /// Triggered when the user chooses to pay via the developer's external payment option - /// instead of Google Play Billing in the side-by-side choice dialog. - /// Contains the externalTransactionToken needed to report the transaction. - /// Available in Google Play Billing Library 8.3.0+ + /// Fires when a user selects developer billing in an External Payments or + /// Billing Choice flow (Android only). The payload can contain an external + /// transaction token, link URI, original transaction ID, and selected products. + /// Billing Choice payload fields are available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). func developerProvidedBillingAndroid() async throws -> DeveloperProvidedBillingDetailsAndroid /// Fires when the App Store surfaces a promoted product (iOS only) func promotedProductIOS() async throws -> String diff --git a/packages/gql/src/generated/types.dart b/packages/gql/src/generated/types.dart index 6d9814f67..4dce97a37 100644 --- a/packages/gql/src/generated/types.dart +++ b/packages/gql/src/generated/types.dart @@ -45,7 +45,7 @@ enum AlternativeBillingModeAndroid { } /// Play Billing choice image layout (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). enum BillingChoiceImageLayoutAndroid { /// Rectangular image with a 4:1 aspect ratio. RectangularFourByOne('rectangular-four-by-one'), @@ -74,7 +74,7 @@ enum BillingChoiceImageLayoutAndroid { } /// Choice screen renderer for Billing Choice availability (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). enum BillingChoiceScreenTypeAndroid { /// Unspecified choice screen type. Unspecified('unspecified'), @@ -104,7 +104,8 @@ enum BillingChoiceScreenTypeAndroid { /// Billing program types for Google Play Billing Programs (Android) /// Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, -/// BILLING_CHOICE added in 9.1.0. +/// BILLING_CHOICE added in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (requires Play Billing 9.1.0+). enum BillingProgramAndroid { /// Unspecified billing program. Do not use. Unspecified('unspecified'), @@ -127,7 +128,7 @@ enum BillingProgramAndroid { ExternalPayments('external-payments'), /// Billing Choice program. /// Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. - /// Available in Google Play Billing Library 9.1.0+ + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). BillingChoice('billing-choice'); const BillingProgramAndroid(this.value); @@ -188,7 +189,7 @@ enum DeveloperBillingLaunchModeAndroid { } /// Developer-provided billing destination type for Billing Program reporting details (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). enum DeveloperBillingTypeAndroid { /// Unspecified developer billing type. Do not use. DeveloperBillingTypeUnspecified('developer-billing-type-unspecified'), @@ -517,8 +518,9 @@ enum IapEvent { PurchaseError('purchase-error'), PromotedProductIOS('promoted-product-ios'), UserChoiceBillingAndroid('user-choice-billing-android'), - /// Fired when user selects developer-provided billing option in external payments flow. - /// Available on Android with Google Play Billing Library 8.3.0+ + /// Fired for External Payments (8.3.0+) and Google-rendered Billing Choice + /// developer billing selections on Android. Billing Choice is available in + /// OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). DeveloperProvidedBillingAndroid('developer-provided-billing-android'), /// Fired when an active subscription enters a billing-issue state that requires user attention. /// Cross-platform unification of StoreKit 2 Message.billingIssue (iOS 18+) and @@ -655,7 +657,8 @@ enum IapStore { } /// High-level in-app message category (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). enum InAppMessageCategoryAndroid { /// Unknown in-app message category. UnknownInAppMessageCategoryId('unknown-in-app-message-category-id'), @@ -680,7 +683,8 @@ enum InAppMessageCategoryAndroid { } /// Response code from Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). enum InAppMessageResponseCodeAndroid { /// Flow finished and no developer action is needed. NoActionNeeded('no-action-needed'), @@ -1373,6 +1377,7 @@ abstract class PurchaseCommon { int get quantity; /// Store where purchase was made IapStore get store; + /// Unix timestamp in milliseconds since January 1, 1970 UTC. double get transactionDate; } @@ -1414,6 +1419,7 @@ class ActiveSubscription { /// Renewal information from StoreKit 2 (iOS only). Contains details about subscription renewal status, /// pending upgrades/downgrades, and auto-renewal preferences. final RenewalInfoIOS? renewalInfoIOS; + /// Unix timestamp in milliseconds since January 1, 1970 UTC. final double transactionDate; final String transactionId; /// @deprecated iOS only - use daysUntilExpirationIOS instead. @@ -1672,7 +1678,7 @@ class AppTransaction { } /// Display information for developer-rendered Billing Choice screens (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). class BillingChoiceInfoAndroid { const BillingChoiceInfoAndroid({ required this.playBillingChoiceImageUrl, @@ -1713,11 +1719,13 @@ class BillingProgramAvailabilityResultAndroid { /// The billing program that was checked final BillingProgramAndroid billingProgram; /// Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. final BillingChoiceScreenTypeAndroid? choiceScreenType; /// Whether the billing program is available for the user final bool isAvailable; /// Whether external-link payment is available for Billing Choice. /// Populated only for available BILLING_CHOICE results. + /// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. final bool? isExternalLinkAvailable; factory BillingProgramAvailabilityResultAndroid.fromJson(Map json) { @@ -1811,17 +1819,30 @@ class BillingResultAndroid { /// Available in Google Play Billing Library 8.3.0+ class DeveloperProvidedBillingDetailsAndroid { const DeveloperProvidedBillingDetailsAndroid({ - required this.externalTransactionToken, + this.externalTransactionToken, + this.linkUri, + this.originalExternalTransactionId, + required this.products, }); /// External transaction token used to report transactions made through developer billing. - /// This token must be used when reporting the external transaction to Google Play. - /// Must be reported within 24 hours of the transaction. - final String externalTransactionToken; + /// Nullable for flows such as external payments where no token is returned. + final String? externalTransactionToken; + /// URI to launch for an external-link Billing Choice flow, when provided by + /// Google Play. + final String? linkUri; + /// Original external transaction ID when replacing a subscription that was + /// purchased through developer billing. + final String? originalExternalTransactionId; + /// Products selected for the developer billing flow. + final List products; factory DeveloperProvidedBillingDetailsAndroid.fromJson(Map json) { return DeveloperProvidedBillingDetailsAndroid( - externalTransactionToken: json['externalTransactionToken'] as String, + externalTransactionToken: json['externalTransactionToken'] as String?, + linkUri: json['linkUri'] as String?, + originalExternalTransactionId: json['originalExternalTransactionId'] as String?, + products: (json['products'] as List).map((e) => DeveloperProvidedBillingProductAndroid.fromJson(e as Map)).toList(), ); } @@ -1829,6 +1850,42 @@ class DeveloperProvidedBillingDetailsAndroid { return { '__typename': 'DeveloperProvidedBillingDetailsAndroid', 'externalTransactionToken': externalTransactionToken, + 'linkUri': linkUri, + 'originalExternalTransactionId': originalExternalTransactionId, + 'products': products.map((e) => e.toJson()).toList(), + }; + } +} + +/// Product selected for developer-provided billing (Android 9.0+). +class DeveloperProvidedBillingProductAndroid { + const DeveloperProvidedBillingProductAndroid({ + required this.id, + this.offerToken, + required this.type, + }); + + /// Product identifier. + final String id; + /// Subscription offer token, when applicable. + final String? offerToken; + /// Google Play product type (in-app or subscription). + final ProductType type; + + factory DeveloperProvidedBillingProductAndroid.fromJson(Map json) { + return DeveloperProvidedBillingProductAndroid( + id: json['id'] as String, + offerToken: json['offerToken'] as String?, + type: ProductType.fromJson(json['type'] as String), + ); + } + + Map toJson() { + return { + '__typename': 'DeveloperProvidedBillingProductAndroid', + 'id': id, + 'offerToken': offerToken, + 'type': type.toJson(), }; } } @@ -2326,7 +2383,8 @@ class FetchProductsResultSubscriptions extends FetchProductsResult { } /// Result from showing Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). class InAppMessageResultAndroid { const InAppMessageResultAndroid({ this.purchaseToken, @@ -3154,6 +3212,7 @@ class PurchaseAndroid extends Purchase implements PurchaseCommon { final String? signatureAndroid; /// Store where purchase was made final IapStore store; + /// Unix timestamp in milliseconds since January 1, 1970 UTC. final double transactionDate; final String? transactionId; final bool? isAlternativeBilling; @@ -3347,6 +3406,7 @@ class PurchaseIOS extends Purchase implements PurchaseCommon { final IapStore store; final String? storefrontCountryCodeIOS; final String? subscriptionGroupIdIOS; + /// Unix timestamp in milliseconds since January 1, 1970 UTC. final double transactionDate; final String transactionId; final String? transactionReasonIOS; @@ -4506,7 +4566,7 @@ class AndroidSubscriptionOfferInput { } /// Parameters for showing a billing program information dialog (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). class BillingProgramInformationDialogParamsAndroid { const BillingProgramInformationDialogParamsAndroid({ this.billingProgram = BillingProgramAndroid.BillingChoice, @@ -4559,35 +4619,45 @@ class DeepLinkOptions { } } -/// Parameters for developer billing option in purchase flow (Android) -/// Used with BillingFlowParams to enable external payments flow -/// Available in Google Play Billing Library 8.3.0+ +/// Parameters for a developer billing option in a purchase flow (Android). +/// Used with BillingFlowParams for external payments (8.3.0+) and Billing Choice +/// (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+). +/// Only billingProgram is required; link fields are used when the selected program +/// links outside the app. class DeveloperBillingOptionParamsAndroid { const DeveloperBillingOptionParamsAndroid({ required this.billingProgram, - required this.launchMode, - required this.linkUri, + this.externalTransactionToken, + this.launchMode, + this.linkUri, }); - /// The billing program (should be EXTERNAL_PAYMENTS for external payments flow) + /// The billing program. Use EXTERNAL_PAYMENTS or BILLING_CHOICE. final BillingProgramAndroid billingProgram; - /// The launch mode for the external payment link - final DeveloperBillingLaunchModeAndroid launchMode; - /// The URI where the external payment will be processed - final String linkUri; + /// A pre-generated external transaction token for a Billing Choice external-link + /// flow. Omit it when Google Play should provide the token in the callback. + final String? externalTransactionToken; + /// The launch mode for the external payment link. + /// Required only when the selected billing program links outside the app. + final DeveloperBillingLaunchModeAndroid? launchMode; + /// The URI where the external payment will be processed. + /// Required only when the selected billing program links outside the app. + final String? linkUri; factory DeveloperBillingOptionParamsAndroid.fromJson(Map json) { return DeveloperBillingOptionParamsAndroid( billingProgram: BillingProgramAndroid.fromJson(json['billingProgram'] as String), - launchMode: DeveloperBillingLaunchModeAndroid.fromJson(json['launchMode'] as String), - linkUri: json['linkUri'] as String, + externalTransactionToken: json['externalTransactionToken'] as String?, + launchMode: json['launchMode'] != null ? DeveloperBillingLaunchModeAndroid.fromJson(json['launchMode'] as String) : null, + linkUri: json['linkUri'] as String?, ); } Map toJson() { return { 'billingProgram': billingProgram.toJson(), - 'launchMode': launchMode.toJson(), + 'externalTransactionToken': externalTransactionToken, + 'launchMode': launchMode?.toJson(), 'linkUri': linkUri, }; } @@ -4635,7 +4705,7 @@ class DiscountOfferInputIOS { } /// Parameters for fetching Billing Choice display information (Android) -/// Available in Google Play Billing Library 9.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). class GetBillingChoiceInfoParamsAndroid { const GetBillingChoiceInfoParamsAndroid({ this.billingProgram = BillingProgramAndroid.BillingChoice, @@ -4668,7 +4738,8 @@ class GetBillingChoiceInfoParamsAndroid { } /// Parameters for showing Play billing in-app messages (Android) -/// Available in Google Play Billing Library 4.1.0+ +/// Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +/// (upstream API available since Play Billing 4.1.0). class InAppMessageParamsAndroid { const InAppMessageParamsAndroid({ this.categories = const [InAppMessageCategoryAndroid.Transactional], @@ -4694,6 +4765,7 @@ class InAppMessageParamsAndroid { class InitConnectionConfig { const InitConnectionConfig({ this.alternativeBillingModeAndroid, + this.billingChoiceScreenTypeAndroid = BillingChoiceScreenTypeAndroid.GoogleRendered, this.enableBillingProgramAndroid, }); @@ -4702,17 +4774,28 @@ class InitConnectionConfig { /// @deprecated Use enableBillingProgramAndroid instead. /// Use USER_CHOICE_BILLING for user choice billing, EXTERNAL_OFFER for alternative only. final AlternativeBillingModeAndroid? alternativeBillingModeAndroid; + /// Billing Choice renderer configured in Play Console. Available in OpenIAP + /// Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). + /// GOOGLE_RENDERED registers the developer-provided billing listener so OpenIAP + /// can emit the selection event. DEVELOPER_RENDERED omits that listener so the + /// app can render its own choice screen and use the reporting/dialog/link APIs. + /// Must match choiceScreenType returned by isBillingProgramAvailableAndroid. + /// Defaults to GOOGLE_RENDERED. + final BillingChoiceScreenTypeAndroid? billingChoiceScreenTypeAndroid; /// Enable a specific billing program for Android (7.0+) /// When set, enables the specified billing program for external transactions. /// - USER_CHOICE_BILLING: User can select between Google Play or alternative (7.0+) /// - EXTERNAL_CONTENT_LINK: Link to external content (8.2.0+) /// - EXTERNAL_OFFER: External offers for digital content (8.2.0+) /// - EXTERNAL_PAYMENTS: Developer provided billing, Japan only (8.3.0+) + /// - BILLING_CHOICE: Google-rendered or developer-rendered billing choice + /// (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+) final BillingProgramAndroid? enableBillingProgramAndroid; factory InitConnectionConfig.fromJson(Map json) { return InitConnectionConfig( alternativeBillingModeAndroid: json['alternativeBillingModeAndroid'] != null ? AlternativeBillingModeAndroid.fromJson(json['alternativeBillingModeAndroid'] as String) : null, + billingChoiceScreenTypeAndroid: json['billingChoiceScreenTypeAndroid'] != null ? BillingChoiceScreenTypeAndroid.fromJson(json['billingChoiceScreenTypeAndroid'] as String) : BillingChoiceScreenTypeAndroid.GoogleRendered, enableBillingProgramAndroid: json['enableBillingProgramAndroid'] != null ? BillingProgramAndroid.fromJson(json['enableBillingProgramAndroid'] as String) : null, ); } @@ -4720,24 +4803,31 @@ class InitConnectionConfig { Map toJson() { return { 'alternativeBillingModeAndroid': alternativeBillingModeAndroid?.toJson(), + 'billingChoiceScreenTypeAndroid': billingChoiceScreenTypeAndroid?.toJson(), 'enableBillingProgramAndroid': enableBillingProgramAndroid?.toJson(), }; } } /// Parameters for launching an external link (Android) -/// Used with launchExternalLink to initiate external offer or app install flows +/// Used with launchExternalLink to initiate external offer, app install, or +/// developer-rendered Billing Choice flows /// Available in Google Play Billing Library 8.2.0+ class LaunchExternalLinkParamsAndroid { const LaunchExternalLinkParamsAndroid({ required this.billingProgram, + this.externalTransactionToken, required this.launchMode, required this.linkType, required this.linkUri, }); - /// The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) + /// The billing program (EXTERNAL_CONTENT_LINK, EXTERNAL_OFFER, or BILLING_CHOICE) final BillingProgramAndroid billingProgram; + /// External transaction token for a developer-rendered Billing Choice external-link + /// flow. Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). Generate it with createBillingProgramReportingDetailsAndroid. + final String? externalTransactionToken; /// The external link launch mode final ExternalLinkLaunchModeAndroid launchMode; /// The type of the external link @@ -4748,6 +4838,7 @@ class LaunchExternalLinkParamsAndroid { factory LaunchExternalLinkParamsAndroid.fromJson(Map json) { return LaunchExternalLinkParamsAndroid( billingProgram: BillingProgramAndroid.fromJson(json['billingProgram'] as String), + externalTransactionToken: json['externalTransactionToken'] as String?, launchMode: ExternalLinkLaunchModeAndroid.fromJson(json['launchMode'] as String), linkType: ExternalLinkTypeAndroid.fromJson(json['linkType'] as String), linkUri: json['linkUri'] as String, @@ -4757,6 +4848,7 @@ class LaunchExternalLinkParamsAndroid { Map toJson() { return { 'billingProgram': billingProgram.toJson(), + 'externalTransactionToken': externalTransactionToken, 'launchMode': launchMode.toJson(), 'linkType': linkType.toJson(), 'linkUri': linkUri, @@ -4889,9 +4981,9 @@ class RequestPurchaseAndroidProps { required this.skus, }); - /// Developer billing option parameters for external payments flow (8.3.0+). - /// When provided, the purchase flow will show a side-by-side choice between - /// Google Play Billing and the developer's external payment option. + /// Developer billing option parameters for external payments and Billing Choice. + /// Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). final DeveloperBillingOptionParamsAndroid? developerBillingOption; /// Personalized offer flag. /// When true, indicates the price was customized for this user. @@ -5089,6 +5181,7 @@ class RequestSubscriptionAndroidProps { this.isOfferPersonalized, this.obfuscatedAccountId, this.obfuscatedProfileId, + this.originalExternalTransactionId, this.purchaseToken, this.replacementMode, required this.skus, @@ -5096,9 +5189,9 @@ class RequestSubscriptionAndroidProps { this.subscriptionProductReplacementParams, }); - /// Developer billing option parameters for external payments flow (8.3.0+). - /// When provided, the purchase flow will show a side-by-side choice between - /// Google Play Billing and the developer's external payment option. + /// Developer billing option parameters for external payments and Billing Choice. + /// Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). final DeveloperBillingOptionParamsAndroid? developerBillingOption; /// Personalized offer flag. /// When true, indicates the price was customized for this user. @@ -5107,6 +5200,10 @@ class RequestSubscriptionAndroidProps { final String? obfuscatedAccountId; /// Obfuscated profile ID final String? obfuscatedProfileId; + /// Original external transaction ID for replacing a subscription that was + /// purchased through developer billing. Available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). + final String? originalExternalTransactionId; /// Purchase token for upgrades/downgrades final String? purchaseToken; /// Replacement mode for subscription changes @@ -5126,6 +5223,7 @@ class RequestSubscriptionAndroidProps { isOfferPersonalized: json['isOfferPersonalized'] as bool?, obfuscatedAccountId: json['obfuscatedAccountId'] as String?, obfuscatedProfileId: json['obfuscatedProfileId'] as String?, + originalExternalTransactionId: json['originalExternalTransactionId'] as String?, purchaseToken: json['purchaseToken'] as String?, replacementMode: json['replacementMode'] as int?, skus: (json['skus'] as List).map((e) => e as String).toList(), @@ -5140,6 +5238,7 @@ class RequestSubscriptionAndroidProps { 'isOfferPersonalized': isOfferPersonalized, 'obfuscatedAccountId': obfuscatedAccountId, 'obfuscatedProfileId': obfuscatedProfileId, + 'originalExternalTransactionId': originalExternalTransactionId, 'purchaseToken': purchaseToken, 'replacementMode': replacementMode, 'skus': skus, @@ -5757,6 +5856,7 @@ sealed class Purchase implements PurchaseCommon { /// Store where purchase was made @override IapStore get store; + /// Unix timestamp in milliseconds since January 1, 1970 UTC. @override double get transactionDate; @@ -5815,6 +5915,8 @@ abstract class MutationResolver { /// Returns external transaction token needed for reporting external transactions. /// developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, /// native Android defaults it to IN_APP. + /// The Billing Choice extension is available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android Future createBillingProgramReportingDetailsAndroid({ @@ -5840,6 +5942,7 @@ abstract class MutationResolver { /// See: https://openiap.dev/docs/apis/init-connection Future initConnection({ AlternativeBillingModeAndroid? alternativeBillingModeAndroid, + BillingChoiceScreenTypeAndroid? billingChoiceScreenTypeAndroid, BillingProgramAndroid? enableBillingProgramAndroid, }); /// Check whether a billing program (e.g., External Payments) is available for the current user. @@ -5849,13 +5952,17 @@ abstract class MutationResolver { /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/is-billing-program-available-android Future isBillingProgramAvailableAndroid(BillingProgramAndroid program); - /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). + /// Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+), + /// including developer-rendered Billing Choice external-link flows. + /// Billing Choice availability: OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + /// (requires Play Billing 9.1.0+). /// Replaces the deprecated showExternalOfferInformationDialog API. /// Shows Play Store dialog and optionally launches external URL. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/launch-external-link-android Future launchExternalLinkAndroid({ required BillingProgramAndroid billingProgram, + String? externalTransactionToken, required ExternalLinkLaunchModeAndroid launchMode, required ExternalLinkTypeAndroid linkType, required String linkUri, @@ -5890,8 +5997,9 @@ abstract class MutationResolver { /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-alternative-billing-dialog-android Future showAlternativeBillingDialogAndroid(); - /// Show Google's information dialog for a Billing Choice external transaction. - /// Available in Google Play Billing Library 9.1.0+. + /// Show Google's mandatory information dialog before a developer-rendered, + /// in-app Billing Choice screen. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android Future showBillingProgramInformationDialogAndroid({ @@ -5904,7 +6012,8 @@ abstract class MutationResolver { /// See: https://openiap.dev/docs/apis/ios/show-external-purchase-custom-link-notice-ios Future showExternalPurchaseCustomLinkNoticeIOS(ExternalPurchaseCustomLinkNoticeTypeIOS noticeType); /// Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. - /// Available in Google Play Billing Library 4.1.0+. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 + /// (upstream API available since Play Billing 4.1.0). /// Returns a response code and, when the subscription status changes, the related purchase token. /// Throws OpenIapError.NotPrepared if billing client not ready. /// See: https://openiap.dev/docs/apis/android/show-in-app-messages-android @@ -5980,7 +6089,7 @@ abstract class QueryResolver { bool? onlyIncludeActiveItemsIOS, }); /// Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. - /// Available in Google Play Billing Library 9.1.0+. + /// OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). /// Throws OpenIapError.NotPrepared if billing client is not ready. /// See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android Future getBillingChoiceInfoAndroid({ @@ -6042,11 +6151,11 @@ abstract class QueryResolver { /// GraphQL root subscription operations. abstract class SubscriptionResolver { - /// Fires when a user selects developer billing in the External Payments flow (Android only) - /// Triggered when the user chooses to pay via the developer's external payment option - /// instead of Google Play Billing in the side-by-side choice dialog. - /// Contains the externalTransactionToken needed to report the transaction. - /// Available in Google Play Billing Library 8.3.0+ + /// Fires when a user selects developer billing in an External Payments or + /// Billing Choice flow (Android only). The payload can contain an external + /// transaction token, link URI, original transaction ID, and selected products. + /// Billing Choice payload fields are available in OpenIAP Spec 2.1.0 / + /// openiap-google 2.3.0 (requires Play Billing 9.1.0+). Future developerProvidedBillingAndroid(); /// Fires when the App Store surfaces a promoted product (iOS only) Future promotedProductIOS(); @@ -6101,11 +6210,13 @@ typedef MutationFinishTransactionHandler = Future Function({ }); typedef MutationInitConnectionHandler = Future Function({ AlternativeBillingModeAndroid? alternativeBillingModeAndroid, + BillingChoiceScreenTypeAndroid? billingChoiceScreenTypeAndroid, BillingProgramAndroid? enableBillingProgramAndroid, }); typedef MutationIsBillingProgramAvailableAndroidHandler = Future Function(BillingProgramAndroid program); typedef MutationLaunchExternalLinkAndroidHandler = Future Function({ required BillingProgramAndroid billingProgram, + String? externalTransactionToken, required ExternalLinkLaunchModeAndroid launchMode, required ExternalLinkTypeAndroid linkType, required String linkUri, diff --git a/packages/gql/src/generated/types.gd b/packages/gql/src/generated/types.gd index 769c5d933..28193ce4e 100644 --- a/packages/gql/src/generated/types.gd +++ b/packages/gql/src/generated/types.gd @@ -21,7 +21,7 @@ enum AlternativeBillingModeAndroid { ALTERNATIVE_ONLY = 2, } -## Play Billing choice image layout (Android) Available in Google Play Billing Library 9.1.0+ +## Play Billing choice image layout (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). enum BillingChoiceImageLayoutAndroid { ## Rectangular image with a 4:1 aspect ratio. RECTANGULAR_FOUR_BY_ONE = 0, @@ -31,7 +31,7 @@ enum BillingChoiceImageLayoutAndroid { RECTANGULAR_TWO_BY_TWO = 2, } -## Choice screen renderer for Billing Choice availability (Android) Available in Google Play Billing Library 9.1.0+ +## Choice screen renderer for Billing Choice availability (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). enum BillingChoiceScreenTypeAndroid { ## Unspecified choice screen type. UNSPECIFIED = 0, @@ -41,7 +41,7 @@ enum BillingChoiceScreenTypeAndroid { GOOGLE_RENDERED = 2, } -## Billing program types for Google Play Billing Programs (Android) Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, BILLING_CHOICE added in 9.1.0. +## Billing program types for Google Play Billing Programs (Android) Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, BILLING_CHOICE added in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). enum BillingProgramAndroid { ## Unspecified billing program. Do not use. UNSPECIFIED = 0, @@ -53,7 +53,7 @@ enum BillingProgramAndroid { EXTERNAL_OFFER = 3, ## External Payments program (Japan only). Allows presenting a side-by-side choice between Google Play Billing and developer's external payment option. Users can choose to complete the purchase on the developer's website. Available in Google Play Billing Library 8.3.0+ EXTERNAL_PAYMENTS = 4, - ## Billing Choice program. Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. Available in Google Play Billing Library 9.1.0+ + ## Billing Choice program. Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). BILLING_CHOICE = 5, } @@ -67,7 +67,7 @@ enum DeveloperBillingLaunchModeAndroid { CALLER_WILL_LAUNCH_LINK = 2, } -## Developer-provided billing destination type for Billing Program reporting details (Android) Available in Google Play Billing Library 9.1.0+ +## Developer-provided billing destination type for Billing Program reporting details (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). enum DeveloperBillingTypeAndroid { ## Unspecified developer billing type. Do not use. DEVELOPER_BILLING_TYPE_UNSPECIFIED = 0, @@ -176,7 +176,7 @@ enum IapEvent { PURCHASE_ERROR = 1, PROMOTED_PRODUCT_IOS = 2, USER_CHOICE_BILLING_ANDROID = 3, - ## Fired when user selects developer-provided billing option in external payments flow. Available on Android with Google Play Billing Library 8.3.0+ + ## Fired for External Payments (8.3.0+) and Google-rendered Billing Choice developer billing selections on Android. Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). DEVELOPER_PROVIDED_BILLING_ANDROID = 4, ## Fired when an active subscription enters a billing-issue state that requires user attention. Cross-platform unification of StoreKit 2 Message.billingIssue (iOS 18+) and Play Billing 8.1+ isSuspended. NOT emitted on the Horizon flavor, whose Billing Compatibility SDK implements only the Play Billing 7.0 API surface. SUBSCRIPTION_BILLING_ISSUE = 5, @@ -217,7 +217,7 @@ enum IapStore { AMAZON = 4, } -## High-level in-app message category (Android) Available in Google Play Billing Library 4.1.0+ +## High-level in-app message category (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (upstream API available since Play Billing 4.1.0). enum InAppMessageCategoryAndroid { ## Unknown in-app message category. UNKNOWN_IN_APP_MESSAGE_CATEGORY_ID = 0, @@ -225,7 +225,7 @@ enum InAppMessageCategoryAndroid { TRANSACTIONAL = 1, } -## Response code from Play billing in-app messages (Android) Available in Google Play Billing Library 4.1.0+ +## Response code from Play billing in-app messages (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (upstream API available since Play Billing 4.1.0). enum InAppMessageResponseCodeAndroid { ## Flow finished and no developer action is needed. NO_ACTION_NEEDED = 0, @@ -436,6 +436,7 @@ class ActiveSubscription: var days_until_expiration_ios: Variant = null var transaction_id: String = "" var purchase_token: Variant = null + ## Unix timestamp in milliseconds since January 1, 1970 UTC. var transaction_date: float = 0.0 var base_plan_id_android: Variant = null ## Required for subscription upgrade/downgrade on Android @@ -732,7 +733,7 @@ class AppTransaction: dict["originalPlatform"] = original_platform return dict -## Display information for developer-rendered Billing Choice screens (Android) Available in Google Play Billing Library 9.1.0+ +## Display information for developer-rendered Billing Choice screens (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). class BillingChoiceInfoAndroid: ## URL for the Play Billing choice image matching the requested layout. var play_billing_choice_image_url: String = "" @@ -865,17 +866,85 @@ class BillingResultAndroid: ## Details provided when user selects developer billing option (Android) Received via DeveloperProvidedBillingListener callback Available in Google Play Billing Library 8.3.0+ class DeveloperProvidedBillingDetailsAndroid: ## External transaction token used to report transactions made through developer billing. - var external_transaction_token: String = "" + var external_transaction_token: Variant = null + ## URI to launch for an external-link Billing Choice flow, when provided by + var link_uri: Variant = null + ## Original external transaction ID when replacing a subscription that was + var original_external_transaction_id: Variant = null + ## Products selected for the developer billing flow. + var products: Array[DeveloperProvidedBillingProductAndroid] = [] static func from_dict(data: Dictionary) -> DeveloperProvidedBillingDetailsAndroid: var obj = DeveloperProvidedBillingDetailsAndroid.new() if data.has("externalTransactionToken") and data["externalTransactionToken"] != null: obj.external_transaction_token = data["externalTransactionToken"] + if data.has("linkUri") and data["linkUri"] != null: + obj.link_uri = data["linkUri"] + if data.has("originalExternalTransactionId") and data["originalExternalTransactionId"] != null: + obj.original_external_transaction_id = data["originalExternalTransactionId"] + if data.has("products") and data["products"] != null: + if data["products"] is Array: + var arr: Array[DeveloperProvidedBillingProductAndroid] = [] + for item in data["products"]: + if item is Dictionary: + arr.append(DeveloperProvidedBillingProductAndroid.from_dict(item)) + elif item is DeveloperProvidedBillingProductAndroid: + arr.append(item) + obj.products = arr return obj func to_dict() -> Dictionary: var dict = {} - dict["externalTransactionToken"] = external_transaction_token + if external_transaction_token != null: + dict["externalTransactionToken"] = external_transaction_token + if link_uri != null: + dict["linkUri"] = link_uri + if original_external_transaction_id != null: + dict["originalExternalTransactionId"] = original_external_transaction_id + if products != null: + var arr = [] + for item in products: + if item != null and item.has_method("to_dict"): + arr.append(item.to_dict()) + else: + arr.append(item) + dict["products"] = arr + else: + dict["products"] = null + return dict + +## Product selected for developer-provided billing (Android 9.0+). +class DeveloperProvidedBillingProductAndroid: + ## Product identifier. + var id: String = "" + ## Google Play product type (in-app or subscription). + var type: ProductType + ## Subscription offer token, when applicable. + var offer_token: Variant = null + + static func from_dict(data: Dictionary) -> DeveloperProvidedBillingProductAndroid: + var obj = DeveloperProvidedBillingProductAndroid.new() + if data.has("id") and data["id"] != null: + obj.id = data["id"] + if data.has("type") and data["type"] != null: + var enum_str = data["type"] + if enum_str is String and PRODUCT_TYPE_FROM_STRING.has(enum_str): + obj.type = PRODUCT_TYPE_FROM_STRING[enum_str] + else: + obj.type = enum_str + if data.has("offerToken") and data["offerToken"] != null: + obj.offer_token = data["offerToken"] + return obj + + func to_dict() -> Dictionary: + var dict = {} + dict["id"] = id + if PRODUCT_TYPE_VALUES.has(type): + dict["type"] = PRODUCT_TYPE_VALUES[type] + else: + dict["type"] = type + if offer_token != null: + dict["offerToken"] = offer_token return dict ## Discount amount details for one-time purchase offers (Android) Available in Google Play Billing Library 7.0+ @@ -1304,7 +1373,7 @@ class ExternalPurchaseNoticeResultIOS: dict["externalPurchaseToken"] = external_purchase_token return dict -## Result from showing Play billing in-app messages (Android) Available in Google Play Billing Library 4.1.0+ +## Result from showing Play billing in-app messages (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (upstream API available since Play Billing 4.1.0). class InAppMessageResultAndroid: ## Response code for the in-app messaging flow. var response_code: InAppMessageResponseCodeAndroid @@ -2356,6 +2425,7 @@ class PurchaseAndroid: var product_id: String = "" var ids: Array[String] = [] var transaction_id: Variant = null + ## Unix timestamp in milliseconds since January 1, 1970 UTC. var transaction_date: float = 0.0 var purchase_token: Variant = null ## Store where purchase was made @@ -2559,6 +2629,7 @@ class PurchaseIOS: var id: String = "" var product_id: String = "" var ids: Array[String] = [] + ## Unix timestamp in milliseconds since January 1, 1970 UTC. var transaction_date: float = 0.0 var purchase_token: Variant = null ## Store where purchase was made @@ -3953,10 +4024,10 @@ class AndroidSubscriptionOfferInput: dict["offerToken"] = offer_token return dict -## Parameters for showing a billing program information dialog (Android) Available in Google Play Billing Library 9.1.0+ +## Parameters for showing a billing program information dialog (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). class BillingProgramInformationDialogParamsAndroid: ## Billing program. Currently only BILLING_CHOICE is supported. - var billing_program: BillingProgramAndroid + var billing_program: BillingProgramAndroid = BillingProgramAndroid.BILLING_CHOICE ## External transaction token returned by the Billing Choice reporting-details flow. var external_transaction_token: String = "" @@ -4005,14 +4076,16 @@ class DeepLinkOptions: dict["packageNameAndroid"] = package_name_android return dict -## Parameters for developer billing option in purchase flow (Android) Used with BillingFlowParams to enable external payments flow Available in Google Play Billing Library 8.3.0+ +## Parameters for a developer billing option in a purchase flow (Android). Used with BillingFlowParams for external payments (8.3.0+) and Billing Choice (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+). Only billingProgram is required; link fields are used when the selected program links outside the app. class DeveloperBillingOptionParamsAndroid: - ## The billing program (should be EXTERNAL_PAYMENTS for external payments flow) + ## The billing program. Use EXTERNAL_PAYMENTS or BILLING_CHOICE. var billing_program: BillingProgramAndroid - ## The URI where the external payment will be processed - var link_uri: String = "" - ## The launch mode for the external payment link + ## The URI where the external payment will be processed. + var link_uri: Variant = null + ## The launch mode for the external payment link. var launch_mode: DeveloperBillingLaunchModeAndroid + ## A pre-generated external transaction token for a Billing Choice external-link + var external_transaction_token: Variant = null static func from_dict(data: Dictionary) -> DeveloperBillingOptionParamsAndroid: var obj = DeveloperBillingOptionParamsAndroid.new() @@ -4030,6 +4103,8 @@ class DeveloperBillingOptionParamsAndroid: obj.launch_mode = DEVELOPER_BILLING_LAUNCH_MODE_ANDROID_FROM_STRING[enum_str] else: obj.launch_mode = enum_str + if data.has("externalTransactionToken") and data["externalTransactionToken"] != null: + obj.external_transaction_token = data["externalTransactionToken"] return obj func to_dict() -> Dictionary: @@ -4046,6 +4121,8 @@ class DeveloperBillingOptionParamsAndroid: dict["launchMode"] = DEVELOPER_BILLING_LAUNCH_MODE_ANDROID_VALUES[launch_mode] else: dict["launchMode"] = launch_mode + if external_transaction_token != null: + dict["externalTransactionToken"] = external_transaction_token return dict class DiscountOfferInputIOS: @@ -4088,12 +4165,12 @@ class DiscountOfferInputIOS: dict["timestamp"] = timestamp return dict -## Parameters for fetching Billing Choice display information (Android) Available in Google Play Billing Library 9.1.0+ +## Parameters for fetching Billing Choice display information (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). class GetBillingChoiceInfoParamsAndroid: ## Billing program. Currently only BILLING_CHOICE is supported. - var billing_program: BillingProgramAndroid + var billing_program: BillingProgramAndroid = BillingProgramAndroid.BILLING_CHOICE ## Desired Play Billing choice image layout. - var play_billing_choice_image_layout: BillingChoiceImageLayoutAndroid + var play_billing_choice_image_layout: BillingChoiceImageLayoutAndroid = BillingChoiceImageLayoutAndroid.RECTANGULAR_FOUR_BY_ONE ## BCP 47 locale tag. If omitted, Play Billing uses the user's default locale. var user_locale: Variant = null @@ -4131,7 +4208,7 @@ class GetBillingChoiceInfoParamsAndroid: dict["userLocale"] = user_locale return dict -## Parameters for showing Play billing in-app messages (Android) Available in Google Play Billing Library 4.1.0+ +## Parameters for showing Play billing in-app messages (Android) Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (upstream API available since Play Billing 4.1.0). class InAppMessageParamsAndroid: ## In-app message categories to show. Defaults to transactional messages. var categories: Array[InAppMessageCategoryAndroid] = [] @@ -4139,13 +4216,14 @@ class InAppMessageParamsAndroid: static func from_dict(data: Dictionary) -> InAppMessageParamsAndroid: var obj = InAppMessageParamsAndroid.new() if data.has("categories") and data["categories"] != null: - var arr: Array[InAppMessageCategoryAndroid] = [] - for item in data["categories"]: - if item is String and IN_APP_MESSAGE_CATEGORY_ANDROID_FROM_STRING.has(item): - arr.append(IN_APP_MESSAGE_CATEGORY_ANDROID_FROM_STRING[item]) - else: - arr.append(item) - obj.categories = arr + if data["categories"] is Array: + var arr: Array[InAppMessageCategoryAndroid] = [] + for item in data["categories"]: + if item is String and IN_APP_MESSAGE_CATEGORY_ANDROID_FROM_STRING.has(item): + arr.append(IN_APP_MESSAGE_CATEGORY_ANDROID_FROM_STRING[item]) + elif item is int: + arr.append(item) + obj.categories = arr return obj func to_dict() -> Dictionary: @@ -4166,6 +4244,8 @@ class InitConnectionConfig: var alternative_billing_mode_android: AlternativeBillingModeAndroid ## Enable a specific billing program for Android (7.0+) var enable_billing_program_android: BillingProgramAndroid + ## Billing Choice renderer configured in Play Console. Available in OpenIAP + var billing_choice_screen_type_android: BillingChoiceScreenTypeAndroid = BillingChoiceScreenTypeAndroid.GOOGLE_RENDERED static func from_dict(data: Dictionary) -> InitConnectionConfig: var obj = InitConnectionConfig.new() @@ -4181,6 +4261,12 @@ class InitConnectionConfig: obj.enable_billing_program_android = BILLING_PROGRAM_ANDROID_FROM_STRING[enum_str] else: obj.enable_billing_program_android = enum_str + if data.has("billingChoiceScreenTypeAndroid") and data["billingChoiceScreenTypeAndroid"] != null: + var enum_str = data["billingChoiceScreenTypeAndroid"] + if enum_str is String and BILLING_CHOICE_SCREEN_TYPE_ANDROID_FROM_STRING.has(enum_str): + obj.billing_choice_screen_type_android = BILLING_CHOICE_SCREEN_TYPE_ANDROID_FROM_STRING[enum_str] + else: + obj.billing_choice_screen_type_android = enum_str return obj func to_dict() -> Dictionary: @@ -4195,11 +4281,16 @@ class InitConnectionConfig: dict["enableBillingProgramAndroid"] = BILLING_PROGRAM_ANDROID_VALUES[enable_billing_program_android] else: dict["enableBillingProgramAndroid"] = enable_billing_program_android + if billing_choice_screen_type_android != null: + if BILLING_CHOICE_SCREEN_TYPE_ANDROID_VALUES.has(billing_choice_screen_type_android): + dict["billingChoiceScreenTypeAndroid"] = BILLING_CHOICE_SCREEN_TYPE_ANDROID_VALUES[billing_choice_screen_type_android] + else: + dict["billingChoiceScreenTypeAndroid"] = billing_choice_screen_type_android return dict -## Parameters for launching an external link (Android) Used with launchExternalLink to initiate external offer or app install flows Available in Google Play Billing Library 8.2.0+ +## Parameters for launching an external link (Android) Used with launchExternalLink to initiate external offer, app install, or developer-rendered Billing Choice flows Available in Google Play Billing Library 8.2.0+ class LaunchExternalLinkParamsAndroid: - ## The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) + ## The billing program (EXTERNAL_CONTENT_LINK, EXTERNAL_OFFER, or BILLING_CHOICE) var billing_program: BillingProgramAndroid ## The external link launch mode var launch_mode: ExternalLinkLaunchModeAndroid @@ -4207,6 +4298,8 @@ class LaunchExternalLinkParamsAndroid: var link_type: ExternalLinkTypeAndroid ## The URI where the content will be accessed from var link_uri: String = "" + ## External transaction token for a developer-rendered Billing Choice external-link + var external_transaction_token: Variant = null static func from_dict(data: Dictionary) -> LaunchExternalLinkParamsAndroid: var obj = LaunchExternalLinkParamsAndroid.new() @@ -4230,6 +4323,8 @@ class LaunchExternalLinkParamsAndroid: obj.link_type = enum_str if data.has("linkUri") and data["linkUri"] != null: obj.link_uri = data["linkUri"] + if data.has("externalTransactionToken") and data["externalTransactionToken"] != null: + obj.external_transaction_token = data["externalTransactionToken"] return obj func to_dict() -> Dictionary: @@ -4251,11 +4346,13 @@ class LaunchExternalLinkParamsAndroid: dict["linkType"] = link_type if link_uri != null: dict["linkUri"] = link_uri + if external_transaction_token != null: + dict["externalTransactionToken"] = external_transaction_token return dict class ProductRequest: var skus: Array[String] = [] - var type: ProductQueryType + var type: ProductQueryType = ProductQueryType.IN_APP static func from_dict(data: Dictionary) -> ProductRequest: var obj = ProductRequest.new() @@ -4312,6 +4409,7 @@ class PurchaseInput: var id: String = "" var product_id: String = "" var ids: Array[String] = [] + ## Unix timestamp in milliseconds since January 1, 1970 UTC. var transaction_date: float = 0.0 var purchase_token: Variant = null ## Store where purchase was made @@ -4451,7 +4549,7 @@ class RequestPurchaseAndroidProps: var is_offer_personalized: Variant = null ## Offer token for one-time purchase discounts (7.0+). var offer_token: Variant = null - ## Developer billing option parameters for external payments flow (8.3.0+). + ## Developer billing option parameters for external payments and Billing Choice. var developer_billing_option: DeveloperBillingOptionParamsAndroid static func from_dict(data: Dictionary) -> RequestPurchaseAndroidProps: @@ -4555,7 +4653,7 @@ class RequestPurchaseProps: ## Per-platform subscription request props var request_subscription: RequestSubscriptionPropsByPlatforms ## Explicit purchase type hint (defaults to in-app) - var type: ProductQueryType + var type: ProductQueryType = ProductQueryType.IN_APP ## @deprecated Use enableBillingProgramAndroid in InitConnectionConfig instead. var use_alternative_billing: Variant = null @@ -4672,13 +4770,15 @@ class RequestSubscriptionAndroidProps: var is_offer_personalized: Variant = null ## Purchase token for upgrades/downgrades var purchase_token: Variant = null + ## Original external transaction ID for replacing a subscription that was + var original_external_transaction_id: Variant = null ## Replacement mode for subscription changes var replacement_mode: Variant = null ## Subscription offers var subscription_offers: Array[AndroidSubscriptionOfferInput] = [] ## Product-level replacement parameters (8.1.0+) var subscription_product_replacement_params: SubscriptionProductReplacementParamsAndroid - ## Developer billing option parameters for external payments flow (8.3.0+). + ## Developer billing option parameters for external payments and Billing Choice. var developer_billing_option: DeveloperBillingOptionParamsAndroid static func from_dict(data: Dictionary) -> RequestSubscriptionAndroidProps: @@ -4698,6 +4798,8 @@ class RequestSubscriptionAndroidProps: obj.is_offer_personalized = data["isOfferPersonalized"] if data.has("purchaseToken") and data["purchaseToken"] != null: obj.purchase_token = data["purchaseToken"] + if data.has("originalExternalTransactionId") and data["originalExternalTransactionId"] != null: + obj.original_external_transaction_id = data["originalExternalTransactionId"] if data.has("replacementMode") and data["replacementMode"] != null: obj.replacement_mode = data["replacementMode"] if data.has("subscriptionOffers") and data["subscriptionOffers"] != null: @@ -4733,6 +4835,8 @@ class RequestSubscriptionAndroidProps: dict["isOfferPersonalized"] = is_offer_personalized if purchase_token != null: dict["purchaseToken"] = purchase_token + if original_external_transaction_id != null: + dict["originalExternalTransactionId"] = original_external_transaction_id if replacement_mode != null: dict["replacementMode"] = replacement_mode if subscription_offers != null: @@ -6644,7 +6748,7 @@ class Mutation: const return_type = "BillingProgramReportingDetailsAndroid" const is_array = false - ## Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). + ## Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+), class launchExternalLinkAndroidField: const name = "launchExternalLinkAndroid" const snake_name = "launch_external_link_android" @@ -6664,7 +6768,7 @@ class Mutation: const return_type = "Boolean" const is_array = false - ## Show Google's information dialog for a Billing Choice external transaction. + ## Show Google's mandatory information dialog before a developer-rendered, class showBillingProgramInformationDialogAndroidField: const name = "showBillingProgramInformationDialogAndroid" const snake_name = "show_billing_program_information_dialog_android" @@ -7002,7 +7106,7 @@ static func create_billing_program_reporting_details_android_args(program: Billi args["developerBillingType"] = developer_billing_type return args -## Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). +## Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+), static func launch_external_link_android_args(params: LaunchExternalLinkParamsAndroid) -> Dictionary: var args = {} if params != null: @@ -7012,7 +7116,7 @@ static func launch_external_link_android_args(params: LaunchExternalLinkParamsAn args["params"] = params return args -## Show Google's information dialog for a Billing Choice external transaction. +## Show Google's mandatory information dialog before a developer-rendered, static func show_billing_program_information_dialog_android_args(params: BillingProgramInformationDialogParamsAndroid) -> Dictionary: var args = {} if params != null: diff --git a/packages/gql/src/generated/types.ts b/packages/gql/src/generated/types.ts index 8e553b2a7..e36ce758d 100644 --- a/packages/gql/src/generated/types.ts +++ b/packages/gql/src/generated/types.ts @@ -26,6 +26,7 @@ export interface ActiveSubscription { * pending upgrades/downgrades, and auto-renewal preferences. */ renewalInfoIOS?: (RenewalInfoIOS | null); + /** Unix timestamp in milliseconds since January 1, 1970 UTC. */ transactionDate: number; transactionId: string; /** @@ -119,13 +120,13 @@ export interface AppTransaction { /** * Play Billing choice image layout (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export type BillingChoiceImageLayoutAndroid = 'rectangular-four-by-one' | 'rectangular-three-by-one' | 'rectangular-two-by-two'; /** * Display information for developer-rendered Billing Choice screens (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export interface BillingChoiceInfoAndroid { /** URL for the Play Billing choice image matching the requested layout. */ @@ -136,14 +137,15 @@ export interface BillingChoiceInfoAndroid { /** * Choice screen renderer for Billing Choice availability (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export type BillingChoiceScreenTypeAndroid = 'unspecified' | 'developer-rendered' | 'google-rendered'; /** * Billing program types for Google Play Billing Programs (Android) * Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, - * BILLING_CHOICE added in 9.1.0. + * BILLING_CHOICE added in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ export type BillingProgramAndroid = 'unspecified' | 'user-choice-billing' | 'external-content-link' | 'external-offer' | 'external-payments' | 'billing-choice'; @@ -154,20 +156,24 @@ export type BillingProgramAndroid = 'unspecified' | 'user-choice-billing' | 'ext export interface BillingProgramAvailabilityResultAndroid { /** The billing program that was checked */ billingProgram: BillingProgramAndroid; - /** Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. */ + /** + * Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. + */ choiceScreenType?: (BillingChoiceScreenTypeAndroid | null); /** Whether the billing program is available for the user */ isAvailable: boolean; /** * Whether external-link payment is available for Billing Choice. * Populated only for available BILLING_CHOICE results. + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. */ isExternalLinkAvailable?: (boolean | null); } /** * Parameters for showing a billing program information dialog (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export interface BillingProgramInformationDialogParamsAndroid { /** Billing program. Currently only BILLING_CHOICE is supported. */ @@ -222,22 +228,35 @@ export interface DeepLinkOptions { export type DeveloperBillingLaunchModeAndroid = 'unspecified' | 'launch-in-external-browser-or-app' | 'caller-will-launch-link'; /** - * Parameters for developer billing option in purchase flow (Android) - * Used with BillingFlowParams to enable external payments flow - * Available in Google Play Billing Library 8.3.0+ + * Parameters for a developer billing option in a purchase flow (Android). + * Used with BillingFlowParams for external payments (8.3.0+) and Billing Choice + * (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+). + * Only billingProgram is required; link fields are used when the selected program + * links outside the app. */ export interface DeveloperBillingOptionParamsAndroid { - /** The billing program (should be EXTERNAL_PAYMENTS for external payments flow) */ + /** The billing program. Use EXTERNAL_PAYMENTS or BILLING_CHOICE. */ billingProgram: BillingProgramAndroid; - /** The launch mode for the external payment link */ - launchMode: DeveloperBillingLaunchModeAndroid; - /** The URI where the external payment will be processed */ - linkUri: string; + /** + * A pre-generated external transaction token for a Billing Choice external-link + * flow. Omit it when Google Play should provide the token in the callback. + */ + externalTransactionToken?: (string | null); + /** + * The launch mode for the external payment link. + * Required only when the selected billing program links outside the app. + */ + launchMode?: (DeveloperBillingLaunchModeAndroid | null); + /** + * The URI where the external payment will be processed. + * Required only when the selected billing program links outside the app. + */ + linkUri?: (string | null); } /** * Developer-provided billing destination type for Billing Program reporting details (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export type DeveloperBillingTypeAndroid = 'developer-billing-type-unspecified' | 'in-app' | 'external-link'; @@ -249,10 +268,31 @@ export type DeveloperBillingTypeAndroid = 'developer-billing-type-unspecified' | export interface DeveloperProvidedBillingDetailsAndroid { /** * External transaction token used to report transactions made through developer billing. - * This token must be used when reporting the external transaction to Google Play. - * Must be reported within 24 hours of the transaction. + * Nullable for flows such as external payments where no token is returned. */ - externalTransactionToken: string; + externalTransactionToken?: (string | null); + /** + * URI to launch for an external-link Billing Choice flow, when provided by + * Google Play. + */ + linkUri?: (string | null); + /** + * Original external transaction ID when replacing a subscription that was + * purchased through developer billing. + */ + originalExternalTransactionId?: (string | null); + /** Products selected for the developer billing flow. */ + products: DeveloperProvidedBillingProductAndroid[]; +} + +/** Product selected for developer-provided billing (Android 9.0+). */ +export interface DeveloperProvidedBillingProductAndroid { + /** Product identifier. */ + id: string; + /** Subscription offer token, when applicable. */ + offerToken?: (string | null); + /** Google Play product type (in-app or subscription). */ + type: ProductType; } /** @@ -557,7 +597,7 @@ export type FetchProductsResult = ProductOrSubscription[] | Product[] | ProductS /** * Parameters for fetching Billing Choice display information (Android) - * Available in Google Play Billing Library 9.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ export interface GetBillingChoiceInfoParamsAndroid { /** Billing program. Currently only BILLING_CHOICE is supported. */ @@ -579,13 +619,15 @@ export type IapkitPurchaseState = 'entitled' | 'pending-acknowledgment' | 'pendi /** * High-level in-app message category (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ export type InAppMessageCategoryAndroid = 'unknown-in-app-message-category-id' | 'transactional'; /** * Parameters for showing Play billing in-app messages (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ export interface InAppMessageParamsAndroid { /** In-app message categories to show. Defaults to transactional messages. */ @@ -594,13 +636,15 @@ export interface InAppMessageParamsAndroid { /** * Response code from Play billing in-app messages (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ export type InAppMessageResponseCodeAndroid = 'no-action-needed' | 'subscription-status-updated'; /** * Result from showing Play billing in-app messages (Android) - * Available in Google Play Billing Library 4.1.0+ + * Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). */ export interface InAppMessageResultAndroid { /** Purchase token returned when a subscription status changed. */ @@ -618,6 +662,16 @@ export interface InitConnectionConfig { * Use USER_CHOICE_BILLING for user choice billing, EXTERNAL_OFFER for alternative only. */ alternativeBillingModeAndroid?: (AlternativeBillingModeAndroid | null); + /** + * Billing Choice renderer configured in Play Console. Available in OpenIAP + * Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). + * GOOGLE_RENDERED registers the developer-provided billing listener so OpenIAP + * can emit the selection event. DEVELOPER_RENDERED omits that listener so the + * app can render its own choice screen and use the reporting/dialog/link APIs. + * Must match choiceScreenType returned by isBillingProgramAvailableAndroid. + * Defaults to GOOGLE_RENDERED. + */ + billingChoiceScreenTypeAndroid?: (BillingChoiceScreenTypeAndroid | null); /** * Enable a specific billing program for Android (7.0+) * When set, enables the specified billing program for external transactions. @@ -625,6 +679,8 @@ export interface InitConnectionConfig { * - EXTERNAL_CONTENT_LINK: Link to external content (8.2.0+) * - EXTERNAL_OFFER: External offers for digital content (8.2.0+) * - EXTERNAL_PAYMENTS: Developer provided billing, Japan only (8.3.0+) + * - BILLING_CHOICE: Google-rendered or developer-rendered billing choice + * (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+) */ enableBillingProgramAndroid?: (BillingProgramAndroid | null); } @@ -652,12 +708,19 @@ export interface InstallmentPlanDetailsAndroid { /** * Parameters for launching an external link (Android) - * Used with launchExternalLink to initiate external offer or app install flows + * Used with launchExternalLink to initiate external offer, app install, or + * developer-rendered Billing Choice flows * Available in Google Play Billing Library 8.2.0+ */ export interface LaunchExternalLinkParamsAndroid { - /** The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) */ + /** The billing program (EXTERNAL_CONTENT_LINK, EXTERNAL_OFFER, or BILLING_CHOICE) */ billingProgram: BillingProgramAndroid; + /** + * External transaction token for a developer-rendered Billing Choice external-link + * flow. Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). Generate it with createBillingProgramReportingDetailsAndroid. + */ + externalTransactionToken?: (string | null); /** The external link launch mode */ launchMode: ExternalLinkLaunchModeAndroid; /** The type of the external link */ @@ -720,6 +783,8 @@ export interface Mutation { * Returns external transaction token needed for reporting external transactions. * developerBillingType is optional. When program is BILLING_CHOICE and developerBillingType is omitted, * native Android defaults it to IN_APP. + * The Billing Choice extension is available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/create-billing-program-reporting-details-android */ @@ -754,7 +819,10 @@ export interface Mutation { */ isBillingProgramAvailableAndroid: Promise; /** - * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+). + * Launch an external content/offer link from inside the Billing Programs flow (Play Billing 8.2.0+), + * including developer-rendered Billing Choice external-link flows. + * Billing Choice availability: OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). * Replaces the deprecated showExternalOfferInformationDialog API. * Shows Play Store dialog and optionally launches external URL. * Throws OpenIapError.NotPrepared if billing client not ready. @@ -807,8 +875,9 @@ export interface Mutation { */ showAlternativeBillingDialogAndroid: Promise; /** - * Show Google's information dialog for a Billing Choice external transaction. - * Available in Google Play Billing Library 9.1.0+. + * Show Google's mandatory information dialog before a developer-rendered, + * in-app Billing Choice screen. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-billing-program-information-dialog-android */ @@ -822,7 +891,8 @@ export interface Mutation { showExternalPurchaseCustomLinkNoticeIOS: Promise; /** * Overlay Play billing in-app messages, such as payment issues or subscription price-change confirmations. - * Available in Google Play Billing Library 4.1.0+. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 + * (upstream API available since Play Billing 4.1.0). * Returns a response code and, when the subscription status changes, the related purchase token. * Throws OpenIapError.NotPrepared if billing client not ready. * See: https://openiap.dev/docs/apis/android/show-in-app-messages-android @@ -1309,6 +1379,7 @@ export interface PurchaseAndroid extends PurchaseCommon { signatureAndroid?: (string | null); /** Store where purchase was made */ store: IapStore; + /** Unix timestamp in milliseconds since January 1, 1970 UTC. */ transactionDate: number; transactionId?: (string | null); } @@ -1333,6 +1404,7 @@ export interface PurchaseCommon { quantity: number; /** Store where purchase was made */ store: IapStore; + /** Unix timestamp in milliseconds since January 1, 1970 UTC. */ transactionDate: number; } @@ -1390,6 +1462,7 @@ export interface PurchaseIOS extends PurchaseCommon { store: IapStore; storefrontCountryCodeIOS?: (string | null); subscriptionGroupIdIOS?: (string | null); + /** Unix timestamp in milliseconds since January 1, 1970 UTC. */ transactionDate: number; transactionId: string; transactionReasonIOS?: (string | null); @@ -1473,7 +1546,7 @@ export interface Query { getAvailablePurchases: Promise; /** * Fetch Play Billing assets and loyalty text for developer-rendered Billing Choice screens. - * Available in Google Play Billing Library 9.1.0+. + * OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). * Throws OpenIapError.NotPrepared if billing client is not ready. * See: https://openiap.dev/docs/apis/android/get-billing-choice-info-android */ @@ -1667,9 +1740,9 @@ export interface RentalDetailsAndroid { export interface RequestPurchaseAndroidProps { /** - * Developer billing option parameters for external payments flow (8.3.0+). - * When provided, the purchase flow will show a side-by-side choice between - * Google Play Billing and the developer's external payment option. + * Developer billing option parameters for external payments and Billing Choice. + * Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ developerBillingOption?: (DeveloperBillingOptionParamsAndroid | null); /** @@ -1754,9 +1827,9 @@ export type RequestPurchaseResult = Purchase | Purchase[] | null; export interface RequestSubscriptionAndroidProps { /** - * Developer billing option parameters for external payments flow (8.3.0+). - * When provided, the purchase flow will show a side-by-side choice between - * Google Play Billing and the developer's external payment option. + * Developer billing option parameters for external payments and Billing Choice. + * Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + * (requires Play Billing 9.1.0+). */ developerBillingOption?: (DeveloperBillingOptionParamsAndroid | null); /** @@ -1768,6 +1841,12 @@ export interface RequestSubscriptionAndroidProps { obfuscatedAccountId?: (string | null); /** Obfuscated profile ID */ obfuscatedProfileId?: (string | null); + /** + * Original external transaction ID for replacing a subscription that was + * purchased through developer billing. Available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). + */ + originalExternalTransactionId?: (string | null); /** Purchase token for upgrades/downgrades */ purchaseToken?: (string | null); /** @@ -1903,11 +1982,11 @@ export type SubResponseCodeAndroid = 'no-applicable-sub-response-code' | 'paymen export interface Subscription { /** - * Fires when a user selects developer billing in the External Payments flow (Android only) - * Triggered when the user chooses to pay via the developer's external payment option - * instead of Google Play Billing in the side-by-side choice dialog. - * Contains the externalTransactionToken needed to report the transaction. - * Available in Google Play Billing Library 8.3.0+ + * Fires when a user selects developer billing in an External Payments or + * Billing Choice flow (Android only). The payload can contain an external + * transaction token, link URI, original transaction ID, and selected products. + * Billing Choice payload fields are available in OpenIAP Spec 2.1.0 / + * openiap-google 2.3.0 (requires Play Billing 9.1.0+). */ developerProvidedBillingAndroid: DeveloperProvidedBillingDetailsAndroid; /** Fires when the App Store surfaces a promoted product (iOS only) */ diff --git a/packages/gql/src/type-android.graphql b/packages/gql/src/type-android.graphql index 05f9ab939..a27655e79 100644 --- a/packages/gql/src/type-android.graphql +++ b/packages/gql/src/type-android.graphql @@ -348,6 +348,9 @@ type PurchaseAndroid implements PurchaseCommon { productId: String! ids: [String!] transactionId: String # Optional in Android unlike iOS + """ + Unix timestamp in milliseconds since January 1, 1970 UTC. + """ transactionDate: Float! purchaseToken: String """ @@ -432,9 +435,9 @@ input RequestPurchaseAndroidProps { """ offerToken: String """ - Developer billing option parameters for external payments flow (8.3.0+). - When provided, the purchase flow will show a side-by-side choice between - Google Play Billing and the developer's external payment option. + Developer billing option parameters for external payments and Billing Choice. + Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + (requires Play Billing 9.1.0+). """ developerBillingOption: DeveloperBillingOptionParamsAndroid } @@ -462,6 +465,12 @@ input RequestSubscriptionAndroidProps { """ purchaseToken: String """ + Original external transaction ID for replacing a subscription that was + purchased through developer billing. Available in OpenIAP Spec 2.1.0 / + openiap-google 2.3.0 (requires Play Billing 9.1.0+). + """ + originalExternalTransactionId: String + """ Replacement mode for subscription changes @deprecated Use subscriptionProductReplacementParams instead for item-level replacement (8.1.0+) """ @@ -476,9 +485,9 @@ input RequestSubscriptionAndroidProps { """ subscriptionProductReplacementParams: SubscriptionProductReplacementParamsAndroid """ - Developer billing option parameters for external payments flow (8.3.0+). - When provided, the purchase flow will show a side-by-side choice between - Google Play Billing and the developer's external payment option. + Developer billing option parameters for external payments and Billing Choice. + Billing Choice is available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + (requires Play Billing 9.1.0+). """ developerBillingOption: DeveloperBillingOptionParamsAndroid } @@ -685,7 +694,8 @@ type UserChoiceBillingDetails { """ Billing program types for Google Play Billing Programs (Android) Available in Google Play Billing Library 8.2.0+, EXTERNAL_PAYMENTS added in 8.3.0, -BILLING_CHOICE added in 9.1.0. +BILLING_CHOICE added in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +(requires Play Billing 9.1.0+). """ enum BillingProgramAndroid { """ @@ -720,14 +730,14 @@ enum BillingProgramAndroid { """ Billing Choice program. Allows presenting Google Play Billing alongside an alternative in-app billing system or external web link. - Available in Google Play Billing Library 9.1.0+ + Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). """ BILLING_CHOICE } """ Choice screen renderer for Billing Choice availability (Android) -Available in Google Play Billing Library 9.1.0+ +Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). """ enum BillingChoiceScreenTypeAndroid { """ @@ -746,7 +756,7 @@ enum BillingChoiceScreenTypeAndroid { """ Play Billing choice image layout (Android) -Available in Google Play Billing Library 9.1.0+ +Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). """ enum BillingChoiceImageLayoutAndroid { """ @@ -765,7 +775,7 @@ enum BillingChoiceImageLayoutAndroid { """ Parameters for fetching Billing Choice display information (Android) -Available in Google Play Billing Library 9.1.0+ +Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). """ input GetBillingChoiceInfoParamsAndroid { """ @@ -784,7 +794,7 @@ input GetBillingChoiceInfoParamsAndroid { """ Developer-provided billing destination type for Billing Program reporting details (Android) -Available in Google Play Billing Library 9.1.0+ +Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). """ enum DeveloperBillingTypeAndroid { """ @@ -803,7 +813,7 @@ enum DeveloperBillingTypeAndroid { """ Display information for developer-rendered Billing Choice screens (Android) -Available in Google Play Billing Library 9.1.0+ +Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). """ type BillingChoiceInfoAndroid { """ @@ -858,12 +868,13 @@ enum ExternalLinkTypeAndroid { """ Parameters for launching an external link (Android) -Used with launchExternalLink to initiate external offer or app install flows +Used with launchExternalLink to initiate external offer, app install, or +developer-rendered Billing Choice flows Available in Google Play Billing Library 8.2.0+ """ input LaunchExternalLinkParamsAndroid { """ - The billing program (EXTERNAL_CONTENT_LINK or EXTERNAL_OFFER) + The billing program (EXTERNAL_CONTENT_LINK, EXTERNAL_OFFER, or BILLING_CHOICE) """ billingProgram: BillingProgramAndroid! """ @@ -878,6 +889,12 @@ input LaunchExternalLinkParamsAndroid { The URI where the content will be accessed from """ linkUri: String! + """ + External transaction token for a developer-rendered Billing Choice external-link + flow. Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 + (requires Play Billing 9.1.0+). Generate it with createBillingProgramReportingDetailsAndroid. + """ + externalTransactionToken: String } """ @@ -912,18 +929,20 @@ type BillingProgramAvailabilityResultAndroid { billingProgram: BillingProgramAndroid! """ Billing Choice screen renderer. Populated only for available BILLING_CHOICE results. + Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. """ choiceScreenType: BillingChoiceScreenTypeAndroid """ Whether external-link payment is available for Billing Choice. Populated only for available BILLING_CHOICE results. + Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0. """ isExternalLinkAvailable: Boolean } """ Parameters for showing a billing program information dialog (Android) -Available in Google Play Billing Library 9.1.0+ +Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). """ input BillingProgramInformationDialogParamsAndroid { """ @@ -938,7 +957,8 @@ input BillingProgramInformationDialogParamsAndroid { """ High-level in-app message category (Android) -Available in Google Play Billing Library 4.1.0+ +Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +(upstream API available since Play Billing 4.1.0). """ enum InAppMessageCategoryAndroid { """ @@ -953,7 +973,8 @@ enum InAppMessageCategoryAndroid { """ Parameters for showing Play billing in-app messages (Android) -Available in Google Play Billing Library 4.1.0+ +Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +(upstream API available since Play Billing 4.1.0). """ input InAppMessageParamsAndroid { """ @@ -964,7 +985,8 @@ input InAppMessageParamsAndroid { """ Result from showing Play billing in-app messages (Android) -Available in Google Play Billing Library 4.1.0+ +Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +(upstream API available since Play Billing 4.1.0). """ type InAppMessageResultAndroid { """ @@ -979,7 +1001,8 @@ type InAppMessageResultAndroid { """ Response code from Play billing in-app messages (Android) -Available in Google Play Billing Library 4.1.0+ +Available in OpenIAP Spec 2.1.0 / openiap-google 2.3.0 +(upstream API available since Play Billing 4.1.0). """ enum InAppMessageResponseCodeAndroid { """ @@ -1018,23 +1041,32 @@ enum DeveloperBillingLaunchModeAndroid { } """ -Parameters for developer billing option in purchase flow (Android) -Used with BillingFlowParams to enable external payments flow -Available in Google Play Billing Library 8.3.0+ +Parameters for a developer billing option in a purchase flow (Android). +Used with BillingFlowParams for external payments (8.3.0+) and Billing Choice +(OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+). +Only billingProgram is required; link fields are used when the selected program +links outside the app. """ input DeveloperBillingOptionParamsAndroid { """ - The billing program (should be EXTERNAL_PAYMENTS for external payments flow) + The billing program. Use EXTERNAL_PAYMENTS or BILLING_CHOICE. """ billingProgram: BillingProgramAndroid! """ - The URI where the external payment will be processed + The URI where the external payment will be processed. + Required only when the selected billing program links outside the app. """ - linkUri: String! + linkUri: String """ - The launch mode for the external payment link + The launch mode for the external payment link. + Required only when the selected billing program links outside the app. """ - launchMode: DeveloperBillingLaunchModeAndroid! + launchMode: DeveloperBillingLaunchModeAndroid + """ + A pre-generated external transaction token for a Billing Choice external-link + flow. Omit it when Google Play should provide the token in the callback. + """ + externalTransactionToken: String } """ @@ -1045,10 +1077,41 @@ Available in Google Play Billing Library 8.3.0+ type DeveloperProvidedBillingDetailsAndroid { """ External transaction token used to report transactions made through developer billing. - This token must be used when reporting the external transaction to Google Play. - Must be reported within 24 hours of the transaction. + Nullable for flows such as external payments where no token is returned. """ - externalTransactionToken: String! + externalTransactionToken: String + """ + URI to launch for an external-link Billing Choice flow, when provided by + Google Play. + """ + linkUri: String + """ + Original external transaction ID when replacing a subscription that was + purchased through developer billing. + """ + originalExternalTransactionId: String + """ + Products selected for the developer billing flow. + """ + products: [DeveloperProvidedBillingProductAndroid!]! +} + +""" +Product selected for developer-provided billing (Android 9.0+). +""" +type DeveloperProvidedBillingProductAndroid { + """ + Product identifier. + """ + id: String! + """ + Google Play product type (in-app or subscription). + """ + type: ProductType! + """ + Subscription offer token, when applicable. + """ + offerToken: String } # Deprecated External Offers APIs (Google Play Billing Library 8.2.0) diff --git a/packages/gql/src/type-ios.graphql b/packages/gql/src/type-ios.graphql index 9b9093899..1404ffbdb 100644 --- a/packages/gql/src/type-ios.graphql +++ b/packages/gql/src/type-ios.graphql @@ -224,6 +224,7 @@ type PurchaseIOS implements PurchaseCommon { id: ID! productId: String! ids: [String!] + """Unix timestamp in milliseconds since January 1, 1970 UTC.""" transactionDate: Float! purchaseToken: String """ diff --git a/packages/gql/src/type.graphql b/packages/gql/src/type.graphql index e7f9cb59b..eed6aefd9 100644 --- a/packages/gql/src/type.graphql +++ b/packages/gql/src/type.graphql @@ -26,8 +26,9 @@ enum IapEvent { PromotedProductIOS UserChoiceBillingAndroid """ - Fired when user selects developer-provided billing option in external payments flow. - Available on Android with Google Play Billing Library 8.3.0+ + Fired for External Payments (8.3.0+) and Google-rendered Billing Choice + developer billing selections on Android. Billing Choice is available in + OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). """ DeveloperProvidedBillingAndroid """ @@ -71,6 +72,9 @@ interface PurchaseCommon { id: ID! productId: String! ids: [String!] + """ + Unix timestamp in milliseconds since January 1, 1970 UTC. + """ transactionDate: Float! """ Unified purchase token (iOS JWS, Android purchaseToken) @@ -188,6 +192,9 @@ input PurchaseInput { id: ID! productId: String! ids: [String!] + """ + Unix timestamp in milliseconds since January 1, 1970 UTC. + """ transactionDate: Float! purchaseToken: String """ @@ -446,6 +453,9 @@ type ActiveSubscription { daysUntilExpirationIOS: Float transactionId: String! purchaseToken: String + """ + Unix timestamp in milliseconds since January 1, 1970 UTC. + """ transactionDate: Float! basePlanIdAndroid: String """ @@ -793,8 +803,20 @@ input InitConnectionConfig { - EXTERNAL_CONTENT_LINK: Link to external content (8.2.0+) - EXTERNAL_OFFER: External offers for digital content (8.2.0+) - EXTERNAL_PAYMENTS: Developer provided billing, Japan only (8.3.0+) + - BILLING_CHOICE: Google-rendered or developer-rendered billing choice + (OpenIAP Spec 2.1.0 / openiap-google 2.3.0; requires Play Billing 9.1.0+) """ enableBillingProgramAndroid: BillingProgramAndroid + """ + Billing Choice renderer configured in Play Console. Available in OpenIAP + Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+). + GOOGLE_RENDERED registers the developer-provided billing listener so OpenIAP + can emit the selection event. DEVELOPER_RENDERED omits that listener so the + app can render its own choice screen and use the reporting/dialog/link APIs. + Must match choiceScreenType returned by isBillingProgramAvailableAndroid. + Defaults to GOOGLE_RENDERED. + """ + billingChoiceScreenTypeAndroid: BillingChoiceScreenTypeAndroid = GOOGLE_RENDERED # Note: enableAutoServiceReconnection is always enabled internally (Billing 8.0+) - # since OpenIAP uses Billing Library 8.3.0+ + # OpenIAP Spec 2.1.0 / openiap-google 2.3.0 (requires Play Billing 9.1.0+) } diff --git a/packages/kit/src/content/faq.md b/packages/kit/src/content/faq.md index d2d384f08..1b5295c78 100644 --- a/packages/kit/src/content/faq.md +++ b/packages/kit/src/content/faq.md @@ -2,7 +2,7 @@ ## When should I perform receipt validation? -Run validation immediately after your app receives a purchase receipt and again at any time the purchase state matters—unlocking premium content, restoring purchases on a new device, or reconciling renewals. IAPKit is designed to handle both real-time checks and scheduled re-validations so you can catch subscriptions that lapse, refunds, or revoked purchases without waiting for user reports. +Run validation immediately after your app receives a purchase receipt and again at any time the purchase state matters - unlocking premium content, restoring purchases on a new device, or reconciling renewals. A Purchases row records the store state observed by its latest verification; it is not a live subscription watcher. Use subscription webhooks and entitlement endpoints for lifecycle state, and schedule revalidation when a current purchase snapshot is required. On Android, verify the purchase, finish it, then verify the token again when the Purchases log must reflect the completed acknowledgment. ## Why should I perform receipt validation? diff --git a/packages/kit/src/pages/auth/organization/project/PurchasesTable.tsx b/packages/kit/src/pages/auth/organization/project/PurchasesTable.tsx index 0a279539d..bc56c5385 100644 --- a/packages/kit/src/pages/auth/organization/project/PurchasesTable.tsx +++ b/packages/kit/src/pages/auth/organization/project/PurchasesTable.tsx @@ -127,8 +127,8 @@ export function PurchasesTable({ - - + + diff --git a/packages/kit/src/pages/auth/organization/project/purchase-detail.tsx b/packages/kit/src/pages/auth/organization/project/purchase-detail.tsx index dc1284508..5e63cc48d 100644 --- a/packages/kit/src/pages/auth/organization/project/purchase-detail.tsx +++ b/packages/kit/src/pages/auth/organization/project/purchase-detail.tsx @@ -272,7 +272,9 @@ export default function PurchaseDetail() {

    {"Receipt details"}

    - {"Inspect every data point we captured for this validated purchase."} + { + "Inspect the latest store verification snapshot. Subscription lifecycle state is tracked separately." + }

    @@ -280,7 +282,7 @@ export default function PurchaseDetail() {

    - {"Status"} + {"Validity"}

    -

    {"State"}

    +

    + {"Verified state"} +

    {(() => { const { label, variant } = getPurchaseStateDisplay( diff --git a/packages/kit/src/pages/auth/organization/project/purchases.tsx b/packages/kit/src/pages/auth/organization/project/purchases.tsx index 274cc6ee3..6ed9e30df 100644 --- a/packages/kit/src/pages/auth/organization/project/purchases.tsx +++ b/packages/kit/src/pages/auth/organization/project/purchases.tsx @@ -311,7 +311,9 @@ export default function ProjectPurchases() {

    {"Purchases"}

    - {"View all verified purchase records."} + { + "View store states captured by each purchase's latest verification. Use Subscriptions for live lifecycle state." + }

    diff --git a/packages/kit/src/pages/docs/sections/api.tsx b/packages/kit/src/pages/docs/sections/api.tsx index e1bf8fcb5..a2fc2e5a0 100644 --- a/packages/kit/src/pages/docs/sections/api.tsx +++ b/packages/kit/src/pages/docs/sections/api.tsx @@ -125,11 +125,23 @@ export default function ApiReferencePage() {

    Your app can unlock local premium state, or your backend can grant its own entitlement, when isValid === true. state{" "} - carries the harmonized lifecycle position across all supported stores, + carries the harmonized store state observed by this verification call, and productId is the product id verified by the upstream store. For Meta Horizon, productId is the SKU IAPKit checked.

    + +

    + Calling finishTransaction updates the app and store; it + does not mutate an earlier IAPKit response. On Android, verify first, + finish the valid purchase, then verify the token again if the + Purchases log must reflect ENTITLED instead of{" "} + PENDING_ACKNOWLEDGMENT. Use subscription status, + entitlements, and store webhooks for current subscription lifecycle + state. Periodically reverify purchases when their latest store state + matters. +

    +

    If your own backend keeps an entitlement ledger, do not trust a client-provided product id. Send expectedProductId with the diff --git a/scripts/audit-non-godot-parity.mjs b/scripts/audit-non-godot-parity.mjs index 9888bc082..ae33ec2d7 100644 --- a/scripts/audit-non-godot-parity.mjs +++ b/scripts/audit-non-godot-parity.mjs @@ -1,99 +1,99 @@ #!/usr/bin/env node -import fs from 'node:fs'; -import path from 'node:path'; -import {fileURLToPath} from 'node:url'; +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; -const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); const failures = []; -const EXPO_EXAMPLE_ROOT = 'libraries/expo-iap/example'; +const EXPO_EXAMPLE_ROOT = "libraries/expo-iap/example"; const parityCoveredLibraries = new Set([ - 'expo-iap', - 'flutter_inapp_purchase', - 'kmp-iap', - 'maui-iap', - 'react-native-iap', + "expo-iap", + "flutter_inapp_purchase", + "kmp-iap", + "maui-iap", + "react-native-iap", ]); const parityExcludedLibraries = new Set([ // Godot is intentionally excluded until its example parity is brought back // into the same automated build/test lane as the other SDK examples. - 'godot-iap', + "godot-iap", ]); const featureSpecs = { - 'all-products': {}, - 'purchase-flow': {}, - 'subscription-flow': {}, - 'available-purchases': {}, - 'offer-code': {}, - 'alternative-billing': {}, - 'webhook-stream': {}, + "all-products": {}, + "purchase-flow": {}, + "subscription-flow": {}, + "available-purchases": {}, + "offer-code": {}, + "alternative-billing": {}, + "webhook-stream": {}, }; const operationParityRegistry = { Mutation: [ - 'acknowledgePurchaseAndroid', - 'beginRefundRequestIOS', - 'checkAlternativeBillingAvailabilityAndroid', - 'clearTransactionIOS', - 'consumePurchaseAndroid', - 'createAlternativeBillingTokenAndroid', - 'createBillingProgramReportingDetailsAndroid', - 'deepLinkToSubscriptions', - 'endConnection', - 'finishTransaction', - 'initConnection', - 'isBillingProgramAvailableAndroid', - 'launchExternalLinkAndroid', - 'presentCodeRedemptionSheetIOS', - 'presentExternalPurchaseLinkIOS', - 'presentExternalPurchaseNoticeSheetIOS', - 'requestPurchase', - 'requestPurchaseOnPromotedProductIOS', - 'restorePurchases', - 'showAlternativeBillingDialogAndroid', - 'showBillingProgramInformationDialogAndroid', - 'showExternalPurchaseCustomLinkNoticeIOS', - 'showInAppMessagesAndroid', - 'showManageSubscriptionsIOS', - 'syncIOS', - 'validateReceipt', - 'verifyPurchase', - 'verifyPurchaseWithProvider', + "acknowledgePurchaseAndroid", + "beginRefundRequestIOS", + "checkAlternativeBillingAvailabilityAndroid", + "clearTransactionIOS", + "consumePurchaseAndroid", + "createAlternativeBillingTokenAndroid", + "createBillingProgramReportingDetailsAndroid", + "deepLinkToSubscriptions", + "endConnection", + "finishTransaction", + "initConnection", + "isBillingProgramAvailableAndroid", + "launchExternalLinkAndroid", + "presentCodeRedemptionSheetIOS", + "presentExternalPurchaseLinkIOS", + "presentExternalPurchaseNoticeSheetIOS", + "requestPurchase", + "requestPurchaseOnPromotedProductIOS", + "restorePurchases", + "showAlternativeBillingDialogAndroid", + "showBillingProgramInformationDialogAndroid", + "showExternalPurchaseCustomLinkNoticeIOS", + "showInAppMessagesAndroid", + "showManageSubscriptionsIOS", + "syncIOS", + "validateReceipt", + "verifyPurchase", + "verifyPurchaseWithProvider", ], Query: [ - 'canPresentExternalPurchaseNoticeIOS', - 'currentEntitlementIOS', - 'fetchProducts', - 'getActiveSubscriptions', - 'getAllTransactionsIOS', - 'getAppTransactionIOS', - 'getAvailablePurchases', - 'getBillingChoiceInfoAndroid', - 'getExternalPurchaseCustomLinkTokenIOS', - 'getPendingTransactionsIOS', - 'getPromotedProductIOS', - 'getReceiptDataIOS', - 'getStorefront', - 'getStorefrontIOS', - 'getTransactionJwsIOS', - 'hasActiveSubscriptions', - 'isEligibleForExternalPurchaseCustomLinkIOS', - 'isEligibleForIntroOfferIOS', - 'isTransactionVerifiedIOS', - 'latestTransactionIOS', - 'subscriptionStatusIOS', - 'validateReceiptIOS', + "canPresentExternalPurchaseNoticeIOS", + "currentEntitlementIOS", + "fetchProducts", + "getActiveSubscriptions", + "getAllTransactionsIOS", + "getAppTransactionIOS", + "getAvailablePurchases", + "getBillingChoiceInfoAndroid", + "getExternalPurchaseCustomLinkTokenIOS", + "getPendingTransactionsIOS", + "getPromotedProductIOS", + "getReceiptDataIOS", + "getStorefront", + "getStorefrontIOS", + "getTransactionJwsIOS", + "hasActiveSubscriptions", + "isEligibleForExternalPurchaseCustomLinkIOS", + "isEligibleForIntroOfferIOS", + "isTransactionVerifiedIOS", + "latestTransactionIOS", + "subscriptionStatusIOS", + "validateReceiptIOS", ], Subscription: [ - 'developerProvidedBillingAndroid', - 'promotedProductIOS', - 'purchaseError', - 'purchaseUpdated', - 'subscriptionBillingIssue', - 'userChoiceBillingAndroid', + "developerProvidedBillingAndroid", + "promotedProductIOS", + "purchaseError", + "purchaseUpdated", + "subscriptionBillingIssue", + "userChoiceBillingAndroid", ], }; @@ -109,7 +109,7 @@ function abs(relativePath) { } function read(relativePath) { - return fs.readFileSync(abs(relativePath), 'utf8'); + return fs.readFileSync(abs(relativePath), "utf8"); } function readJson(relativePath) { @@ -127,7 +127,7 @@ function fail(message) { function listDirectories(relativePath) { if (!exists(relativePath)) return []; return fs - .readdirSync(abs(relativePath), {withFileTypes: true}) + .readdirSync(abs(relativePath), { withFileTypes: true }) .filter((entry) => entry.isDirectory()) .map((entry) => entry.name) .sort(); @@ -180,12 +180,21 @@ function expectOptionalIncludes(relativePath, needles, label = relativePath) { expectIncludes(relativePath, needles, label); } -function expectOptionalNotIncludes(relativePath, needles, label = relativePath) { +function expectOptionalNotIncludes( + relativePath, + needles, + label = relativePath, +) { if (!exists(relativePath)) return; expectNotIncludes(relativePath, needles, label); } -function expectSameFile(sourcePath, targetPath, label = targetPath, normalize = (value) => value) { +function expectSameFile( + sourcePath, + targetPath, + label = targetPath, + normalize = (value) => value, +) { expectFile(sourcePath); expectFile(targetPath); if (!exists(sourcePath) || !exists(targetPath)) return; @@ -196,7 +205,11 @@ function expectSameFile(sourcePath, targetPath, label = targetPath, normalize = } } -function expectSymlinkTarget(relativePath, expectedTarget, label = relativePath) { +function expectSymlinkTarget( + relativePath, + expectedTarget, + label = relativePath, +) { expectFile(relativePath); if (!exists(relativePath)) return; const stat = fs.lstatSync(abs(relativePath)); @@ -217,22 +230,28 @@ function expectSameSet(label, ssotValues, registryValues) { const stale = [...registry].filter((value) => !ssot.has(value)).sort(); if (missing.length > 0) { - fail(`${label} missing parity registry coverage: ${missing.join(', ')}`); + fail(`${label} missing parity registry coverage: ${missing.join(", ")}`); } if (stale.length > 0) { - fail(`${label} parity registry has stale entries: ${stale.join(', ')}`); + fail(`${label} parity registry has stale entries: ${stale.join(", ")}`); } } function uniqueMatches(text, regex) { - return [...new Set([...text.matchAll(regex)].map((match) => match[1]))].sort(); + return [ + ...new Set([...text.matchAll(regex)].map((match) => match[1])), + ].sort(); } function discoverExpoProductIds() { - const constantsPath = rel(EXPO_EXAMPLE_ROOT, 'src/utils/constants.ts'); + const constantsPath = rel(EXPO_EXAMPLE_ROOT, "src/utils/constants.ts"); expectFile(constantsPath); if (!exists(constantsPath)) return []; - const ids = [...new Set(read(constantsPath).match(/dev\.hyo\.martie\.[A-Za-z0-9._-]+/g) ?? [])].sort(); + const ids = [ + ...new Set( + read(constantsPath).match(/dev\.hyo\.martie\.[A-Za-z0-9._-]+/g) ?? [], + ), + ].sort(); if (ids.length === 0) { fail(`${constantsPath} does not declare any SSOT example product IDs`); } @@ -240,25 +259,27 @@ function discoverExpoProductIds() { } function discoverExpoRoutes() { - const appDir = rel(EXPO_EXAMPLE_ROOT, 'app'); + const appDir = rel(EXPO_EXAMPLE_ROOT, "app"); if (!exists(appDir)) { fail(`missing Expo SSOT app directory: ${appDir}`); return []; } return fs - .readdirSync(abs(appDir), {withFileTypes: true}) - .filter((entry) => entry.isFile() && entry.name.endsWith('.tsx')) - .map((entry) => entry.name.replace(/\.tsx$/, '')) - .filter((route) => !['_layout', 'index', '+not-found'].includes(route)) + .readdirSync(abs(appDir), { withFileTypes: true }) + .filter((entry) => entry.isFile() && entry.name.endsWith(".tsx")) + .map((entry) => entry.name.replace(/\.tsx$/, "")) + .filter((route) => !["_layout", "index", "+not-found"].includes(route)) .sort(); } function parseGeneratedOperations(kind) { - const sourcePath = 'packages/gql/src/generated/types.ts'; + const sourcePath = "packages/gql/src/generated/types.ts"; expectFile(sourcePath); if (!exists(sourcePath)) return []; - const match = read(sourcePath).match(new RegExp(`export interface ${kind} \\{([\\s\\S]*?)\\n\\}`)); + const match = read(sourcePath).match( + new RegExp(`export interface ${kind} \\{([\\s\\S]*?)\\n\\}`), + ); if (!match) { fail(`${sourcePath} is missing export interface ${kind}`); return []; @@ -269,18 +290,20 @@ function parseGeneratedOperations(kind) { } function escapeRegExp(value) { - return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } function getTopLevelConstDeclaration(text, constName) { const match = new RegExp( `(^|\\n)(?:export\\s+)?const\\s+${escapeRegExp(constName)}\\b`, ).exec(text); - if (!match) return ''; + if (!match) return ""; const start = match.index + match[1].length; const rest = text.slice(start + 1); - const next = /\n(?:export\s+)?(?:const|function|class|type|interface)\s/.exec(rest); + const next = /\n(?:export\s+)?(?:const|function|class|type|interface)\s/.exec( + rest, + ); const end = next ? start + 1 + next.index : text.length; return text.slice(start, end); } @@ -297,20 +320,22 @@ function hasTypeScriptFieldBinding(text, operation, fieldType) { } function expectTypeScriptFieldBindings(label, files, kind) { - const text = files.map((file) => read(file)).join('\n'); + const text = files.map((file) => read(file)).join("\n"); const fieldType = `${kind}Field`; const missing = parseGeneratedOperations(kind).filter( (operation) => !hasTypeScriptFieldBinding(text, operation, fieldType), ); if (missing.length > 0) { - fail(`${label} missing ${fieldType} bindings: ${missing.join(', ')}`); + fail(`${label} missing ${fieldType} bindings: ${missing.join(", ")}`); } } function extractBetween(text, startMarker, endMarker) { const start = text.indexOf(startMarker); - if (start < 0) return ''; - const end = endMarker ? text.indexOf(endMarker, start + startMarker.length) : -1; + if (start < 0) return ""; + const end = endMarker + ? text.indexOf(endMarker, start + startMarker.length) + : -1; return text.slice(start, end < 0 ? text.length : end); } @@ -320,16 +345,21 @@ function expectFlutterHandlers(kind, block) { return; } const missing = parseGeneratedOperations(kind).filter( - (operation) => !new RegExp(`\\b${escapeRegExp(operation)}\\s*:`).test(block), + (operation) => + !new RegExp(`\\b${escapeRegExp(operation)}\\s*:`).test(block), ); if (missing.length > 0) { - fail(`Flutter ${kind}Handlers missing generated operations: ${missing.join(', ')}`); + fail( + `Flutter ${kind}Handlers missing generated operations: ${missing.join(", ")}`, + ); } } function parseGodotOperationFields() { const fields = []; - const lines = read('libraries/godot-iap/addons/godot-iap/types.gd').split('\n'); + const lines = read("libraries/godot-iap/addons/godot-iap/types.gd").split( + "\n", + ); let section = null; let current = null; @@ -360,9 +390,9 @@ function parseGodotOperationFields() { current = { section, className: fieldMatch[1], - name: '', - snakeName: '', - returnType: '', + name: "", + snakeName: "", + returnType: "", isArray: false, }; continue; @@ -370,16 +400,20 @@ function parseGodotOperationFields() { if (!current) continue; - const stringConstMatch = line.match(/^\t\tconst (name|snake_name|return_type) = "([^"]+)"$/); + const stringConstMatch = line.match( + /^\t\tconst (name|snake_name|return_type) = "([^"]+)"$/, + ); if (stringConstMatch) { - if (stringConstMatch[1] === 'name') current.name = stringConstMatch[2]; - if (stringConstMatch[1] === 'snake_name') current.snakeName = stringConstMatch[2]; - if (stringConstMatch[1] === 'return_type') current.returnType = stringConstMatch[2]; + if (stringConstMatch[1] === "name") current.name = stringConstMatch[2]; + if (stringConstMatch[1] === "snake_name") + current.snakeName = stringConstMatch[2]; + if (stringConstMatch[1] === "return_type") + current.returnType = stringConstMatch[2]; continue; } const isArrayMatch = line.match(/^\t\tconst is_array = (true|false)$/); - if (isArrayMatch) current.isArray = isArrayMatch[1] === 'true'; + if (isArrayMatch) current.isArray = isArrayMatch[1] === "true"; } flush(); @@ -388,88 +422,96 @@ function parseGodotOperationFields() { function parseGodotWrapperFunctions() { const functions = new Map(); - const source = read('libraries/godot-iap/addons/godot-iap/godot_iap.gd'); + const source = read("libraries/godot-iap/addons/godot-iap/godot_iap.gd"); for (const match of source.matchAll( /^func\s+([A-Za-z_][A-Za-z0-9_]*)\([^)]*\)\s*(?:->\s*([^:]+))?:/gm, )) { - functions.set(match[1], (match[2] ?? '').trim()); + functions.set(match[1], (match[2] ?? "").trim()); } return functions; } function expectedGodotReturnAnnotation(field) { - if (field.isArray) return 'Array'; - if (field.returnType === 'Boolean') return 'bool'; - if (field.returnType === 'String') return 'String'; - if (field.returnType === 'Int') return 'int'; - if (field.returnType === 'Float') return 'float'; - return 'Variant'; + if (field.isArray) return "Array"; + if (field.returnType === "Boolean") return "bool"; + if (field.returnType === "String") return "String"; + if (field.returnType === "Int") return "int"; + if (field.returnType === "Float") return "float"; + return "Variant"; } function checkFrameworkOperationBindings() { - for (const kind of ['Query', 'Mutation']) { + for (const kind of ["Query", "Mutation"]) { expectTypeScriptFieldBindings( `React Native ${kind}`, - ['libraries/react-native-iap/src/index.ts'], + ["libraries/react-native-iap/src/index.ts"], kind, ); expectTypeScriptFieldBindings( `Expo ${kind}`, [ - 'libraries/expo-iap/src/index.ts', - 'libraries/expo-iap/src/modules/android.ts', - 'libraries/expo-iap/src/modules/ios.ts', + "libraries/expo-iap/src/index.ts", + "libraries/expo-iap/src/modules/android.ts", + "libraries/expo-iap/src/modules/ios.ts", ], kind, ); } - const flutter = read('libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart'); + const flutter = read( + "libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart", + ); expectFlutterHandlers( - 'Query', + "Query", extractBetween( flutter, - 'gentype.QueryHandlers get queryHandlers', - 'gentype.MutationLaunchExternalLinkAndroidHandler', + "gentype.QueryHandlers get queryHandlers", + "gentype.MutationLaunchExternalLinkAndroidHandler", ), ); expectFlutterHandlers( - 'Mutation', + "Mutation", extractBetween( flutter, - 'gentype.MutationHandlers get mutationHandlers', - 'gentype.SubscriptionHandlers get subscriptionHandlers', + "gentype.MutationHandlers get mutationHandlers", + "gentype.SubscriptionHandlers get subscriptionHandlers", ), ); expectFlutterHandlers( - 'Subscription', + "Subscription", extractBetween( flutter, - 'gentype.SubscriptionHandlers get subscriptionHandlers', - '\n}', + "gentype.SubscriptionHandlers get subscriptionHandlers", + "\n}", ), ); const godotFunctions = parseGodotWrapperFunctions(); for (const field of parseGodotOperationFields()) { - if (field.name === '_placeholder') continue; + if (field.name === "_placeholder") continue; const actual = godotFunctions.get(field.snakeName); if (!actual) { - fail(`Godot wrapper missing generated ${field.section} operation ${field.name} (${field.snakeName})`); + fail( + `Godot wrapper missing generated ${field.section} operation ${field.name} (${field.snakeName})`, + ); continue; } - if (field.snakeName === 'fetch_products' && actual === 'Array') { + if (field.snakeName === "fetch_products" && actual === "Array") { continue; } const expected = expectedGodotReturnAnnotation(field); - if (expected === 'Array') { - if (!actual.startsWith('Array')) { - fail(`Godot wrapper ${field.snakeName} should return Array for ${field.returnType}, got ${actual || '(none)'}`); + if (expected === "Array") { + if (!actual.startsWith("Array")) { + fail( + `Godot wrapper ${field.snakeName} should return Array for ${field.returnType}, got ${actual || "(none)"}`, + ); } } else if (actual !== expected) { - fail(`Godot wrapper ${field.snakeName} should return ${expected} for ${field.returnType}, got ${actual || '(none)'}`); + fail( + `Godot wrapper ${field.snakeName} should return ${expected} for ${field.returnType}, got ${actual || "(none)"}`, + ); } } } @@ -491,29 +533,37 @@ function parseKotlinResolverOperations(relativePath, kind) { function kmpGeneratedKotlin(text) { if (!/\bpackage io\.github\.hyochan\.kmpiap\.openiap\b/.test(text)) { - const lines = text.split('\n'); + const lines = text.split("\n"); let lastFileAnnotation = -1; for (let i = 0; i < lines.length; i++) { - if (lines[i].startsWith('@file:')) lastFileAnnotation = i; + if (lines[i].startsWith("@file:")) lastFileAnnotation = i; } if (lastFileAnnotation >= 0) { - lines.splice(lastFileAnnotation + 1, 0, '', 'package io.github.hyochan.kmpiap.openiap'); + lines.splice( + lastFileAnnotation + 1, + 0, + "", + "package io.github.hyochan.kmpiap.openiap", + ); } else { - lines.unshift('package io.github.hyochan.kmpiap.openiap', ''); + lines.unshift("package io.github.hyochan.kmpiap.openiap", ""); } - text = lines.join('\n'); + text = lines.join("\n"); } return text.replace( /(\n\s*\w+\([^)]*\))\n\n(\s+companion object)/g, - '$1;\n\n$2', + "$1;\n\n$2", ); } function checkLibraryCoverageRegistry() { - const discovered = listDirectories('libraries'); + const discovered = listDirectories("libraries"); for (const library of discovered) { - if (parityCoveredLibraries.has(library) || parityExcludedLibraries.has(library)) { + if ( + parityCoveredLibraries.has(library) || + parityExcludedLibraries.has(library) + ) { continue; } fail( @@ -530,62 +580,180 @@ function checkLibraryCoverageRegistry() { } function checkExpoSsotRegistry() { - expectSameSet('Expo example route', discoverExpoRoutes(), routes); + expectSameSet("Expo example route", discoverExpoRoutes(), routes); if (requiredIds.length === 0) { - fail('Expo example product ID registry is empty'); + fail("Expo example product ID registry is empty"); + } +} + +function checkE2eExampleIds() { + const workflowPath = ".claude/commands/e2e-tests.md"; + const workflow = read(workflowPath); + const expoSection = extractBetween( + workflow, + "## Expo Checks", + "## React Native Checks", + ); + const normalTargets = extractBetween( + expoSection, + "Example tests, normal Android build, and launch smoke:", + "VegaOS/Kepler path:", + ); + const vegaTarget = extractBetween(expoSection, "VegaOS/Kepler path:", null); + + for (const expected of [ + "shell monkey -p dev.hyo.martie 1", + "dev.hyo.martie", + "-workspace ios/ExpoIAPExample.xcworkspace", + "-scheme ExpoIAPExample", + "Debug-iphoneos/ExpoIAPExample.app", + ]) { + if (!normalTargets.includes(expected)) { + fail(`Expo E2E normal targets are missing ${JSON.stringify(expected)}`); + } + } + if (normalTargets.includes("dev.hyo.openiap.expo.example")) { + fail( + "Expo E2E normal targets must use dev.hyo.martie, not the Vega package ID", + ); + } + for (const staleName of [ + "ios/expoiapexample.xcworkspace", + "-scheme expoiapexample", + "Debug-iphoneos/expoiapexample.app", + ]) { + if (normalTargets.includes(staleName)) { + fail( + `Expo E2E normal targets must not use stale Xcode name ${JSON.stringify(staleName)}`, + ); + } + } + for (const expected of [ + "dev.hyo.openiap.expo.example.main", + "bun run run:vega:firetv", + ]) { + if (!vegaTarget.includes(expected)) { + fail(`Expo E2E Vega target is missing ${JSON.stringify(expected)}`); + } + } + + const mauiSection = extractBetween( + workflow, + "## MAUI Checks", + "## Godot Checks", + ); + for (const expected of [ + "-p:EmbedAssembliesIntoApk=true", + 'adb -s "$ANDROID_SERIAL" uninstall dev.hyo.martie', + 'adb -s "$ANDROID_SERIAL" install --no-incremental -r', + 'adb -s "$ANDROID_SERIAL" shell monkey -p dev.hyo.martie 1', + 'adb -s "$FIREOS_SERIAL" uninstall dev.hyo.martie', + 'adb -s "$FIREOS_SERIAL" install --no-incremental -r', + "bin/stores/amazon/Debug/net9.0-android/dev.hyo.martie-Signed.apk", + 'adb -s "$FIREOS_SERIAL" shell monkey -p dev.hyo.martie 1', + "-p:RuntimeIdentifier=ios-arm64", + "bin/Debug/net9.0-ios/ios-arm64/OpenIap.Maui.Example.app", + "xcrun devicectl device process launch", + ]) { + if (!mauiSection.includes(expected)) { + fail(`MAUI E2E device targets are missing ${JSON.stringify(expected)}`); + } + } + if (/ANDROID_SERIAL="\$[^\"]+"\s+dotnet build/.test(mauiSection)) { + fail( + "MAUI E2E must select Android devices with adb -s, not ANDROID_SERIAL", + ); } + if (/dotnet build\s+-t:Run\s+-f net9\.0-ios/.test(mauiSection)) { + fail("MAUI E2E must build ios-arm64 before installing with devicectl"); + } + + expectIncludes( + "libraries/godot-iap/Makefile", + ["@rm -rf $(IOS_EXPORT_DIR)", "@touch $(IOS_EXPORT_DIR)/.gdignore"], + "Godot iOS export isolation", + ); + expectIncludes( + "libraries/godot-iap/scripts/install-hooks.sh", + [ + 'git -C "$PROJECT_ROOT" rev-parse --show-toplevel', + 'if [ "$REPO_ROOT" != "$PROJECT_ROOT" ]', + 'git -C "$PROJECT_ROOT" rev-parse --git-path hooks', + ], + "Godot Git hook installation", + ); + expectNotIncludes( + "libraries/godot-iap/scripts/install-hooks.sh", + ['HOOKS_DIR="$PROJECT_ROOT/.git/hooks"'], + "Godot Git hook installation", + ); + expectIncludes( + "libraries/godot-iap/ios-gdextension/Package.swift", + [".iOS(.v17)"], + "Godot iOS deployment target", + ); + expectIncludes( + "libraries/godot-iap/Example/export_presets.cfg", + ['application/min_ios_version="17.0"'], + "Godot example iOS deployment target", + ); + expectIncludes( + "packages/docs/src/pages/docs/setup/godot.tsx", + ["iOS 17+ target"], + "Godot docs iOS deployment target", + ); } function checkGeneratedTypeSync() { expectSameFile( - 'packages/gql/src/generated/types.ts', - 'libraries/expo-iap/src/types.ts', - 'Expo generated TypeScript types', + "packages/gql/src/generated/types.ts", + "libraries/expo-iap/src/types.ts", + "Expo generated TypeScript types", ); expectSameFile( - 'packages/gql/src/generated/types.ts', - 'libraries/react-native-iap/src/types.ts', - 'React Native generated TypeScript types', + "packages/gql/src/generated/types.ts", + "libraries/react-native-iap/src/types.ts", + "React Native generated TypeScript types", ); expectSameFile( - 'packages/gql/src/webhook-client.ts', - 'libraries/expo-iap/src/webhook-client.ts', - 'Expo webhook client helper', + "packages/gql/src/webhook-client.ts", + "libraries/expo-iap/src/webhook-client.ts", + "Expo webhook client helper", ); expectSameFile( - 'packages/gql/src/webhook-client.ts', - 'libraries/react-native-iap/src/webhook-client.ts', - 'React Native webhook client helper', + "packages/gql/src/webhook-client.ts", + "libraries/react-native-iap/src/webhook-client.ts", + "React Native webhook client helper", ); expectSameFile( - 'packages/gql/src/kit-api.ts', - 'libraries/expo-iap/src/kit-api.ts', - 'Expo IAPKit API helper', + "packages/gql/src/kit-api.ts", + "libraries/expo-iap/src/kit-api.ts", + "Expo IAPKit API helper", ); expectSameFile( - 'packages/gql/src/kit-api.ts', - 'libraries/react-native-iap/src/kit-api.ts', - 'React Native IAPKit API helper', + "packages/gql/src/kit-api.ts", + "libraries/react-native-iap/src/kit-api.ts", + "React Native IAPKit API helper", ); expectSameFile( - 'packages/gql/src/generated/types.dart', - 'libraries/flutter_inapp_purchase/lib/types.dart', - 'Flutter generated Dart types', + "packages/gql/src/generated/types.dart", + "libraries/flutter_inapp_purchase/lib/types.dart", + "Flutter generated Dart types", ); expectSameFile( - 'packages/gql/src/generated/Types.swift', - 'packages/apple/Sources/Models/Types.swift', - 'Apple generated Swift types', + "packages/gql/src/generated/Types.swift", + "packages/apple/Sources/Models/Types.swift", + "Apple generated Swift types", ); expectSameFile( - 'packages/gql/src/generated/Types.cs', - 'libraries/maui-iap/src/OpenIap.Maui/Types.cs', - 'MAUI generated C# types', + "packages/gql/src/generated/Types.cs", + "libraries/maui-iap/src/OpenIap.Maui/Types.cs", + "MAUI generated C# types", ); expectSameFile( - 'packages/gql/src/generated/Types.kt', - 'libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt', - 'KMP generated Kotlin types', + "packages/gql/src/generated/Types.kt", + "libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt", + "KMP generated Kotlin types", kmpGeneratedKotlin, ); @@ -594,7 +762,7 @@ function checkGeneratedTypeSync() { `Google generated ${kind} operations`, parseGeneratedOperations(kind), parseKotlinResolverOperations( - 'packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt', + "packages/google/openiap/src/main/java/dev/hyo/openiap/Types.kt", kind, ), ); @@ -602,11 +770,11 @@ function checkGeneratedTypeSync() { } function checkGqlRuntimeExports() { - const packageJson = JSON.parse(read('packages/gql/package.json')); + const packageJson = JSON.parse(read("packages/gql/package.json")); const exports = packageJson.exports ?? {}; for (const [exportPath, filePath] of [ - ['./kit-api', './src/kit-api.ts'], - ['./webhook-client', './src/webhook-client.ts'], + ["./kit-api", "./src/kit-api.ts"], + ["./webhook-client", "./src/webhook-client.ts"], ]) { if (exports[exportPath] !== filePath) { fail( @@ -617,7 +785,9 @@ function checkGqlRuntimeExports() { } function checkOperationRegistry() { - for (const [kind, registeredOperations] of Object.entries(operationParityRegistry)) { + for (const [kind, registeredOperations] of Object.entries( + operationParityRegistry, + )) { expectSameSet( `GQL ${kind} operation`, parseGeneratedOperations(kind), @@ -628,16 +798,16 @@ function checkOperationRegistry() { function walk(dir, acc = []) { if (!fs.existsSync(dir)) return acc; - for (const entry of fs.readdirSync(dir, {withFileTypes: true})) { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { if ( - entry.name === 'node_modules' || - entry.name === '.gradle' || - entry.name === '.dart_tool' || - entry.name === 'build' || - entry.name === 'bin' || - entry.name === 'obj' || - entry.name === 'Pods' || - entry.name === 'DerivedData' + entry.name === "node_modules" || + entry.name === ".gradle" || + entry.name === ".dart_tool" || + entry.name === "build" || + entry.name === "bin" || + entry.name === "obj" || + entry.name === "Pods" || + entry.name === "DerivedData" ) { continue; } @@ -650,20 +820,22 @@ function walk(dir, acc = []) { function expectNoExampleStorefrontIOS() { const roots = [ - 'libraries/expo-iap/example', - 'libraries/react-native-iap/example', - 'libraries/flutter_inapp_purchase/example', - 'libraries/kmp-iap/example', - 'libraries/maui-iap/example', - 'packages/apple/Example', - 'packages/google/Example', + "libraries/expo-iap/example", + "libraries/react-native-iap/example", + "libraries/flutter_inapp_purchase/example", + "libraries/kmp-iap/example", + "libraries/maui-iap/example", + "packages/apple/Example", + "packages/google/Example", ]; for (const searchRoot of roots) { for (const file of walk(abs(searchRoot))) { if (!/\.(tsx?|dart|kt|swift|cs|xaml)$/.test(file)) continue; - const text = fs.readFileSync(file, 'utf8'); - if (text.includes('getStorefrontIOS(')) { - fail(`example uses getStorefrontIOS instead of getStorefront: ${path.relative(root, file)}`); + const text = fs.readFileSync(file, "utf8"); + if (text.includes("getStorefrontIOS(")) { + fail( + `example uses getStorefrontIOS instead of getStorefront: ${path.relative(root, file)}`, + ); } } } @@ -671,141 +843,209 @@ function expectNoExampleStorefrontIOS() { function checkExpoRouterExample(base, importSource) { for (const route of routes) { - expectFile(rel(base, 'app', `${route}.tsx`)); - } - expectIncludes(rel(base, 'app/_layout.tsx'), routes.map((route) => `name="${route}"`), `${base} layout`); - expectIncludes(rel(base, 'app/index.tsx'), routes.map((route) => `/${route}`), `${base} home`); - expectIncludes(rel(base, 'app/index.tsx'), ['getStorefront'], `${base} home`); - expectIncludes(rel(base, 'app/webhook-stream.tsx'), [ - 'connectWebhookStream', - 'Trigger test', - '/v1/webhooks/', - '/v1/webhooks/stream', - ], `${base} webhook`); - expectIncludes(rel(base, 'app/alternative-billing.tsx'), [ - 'isBillingProgramAvailableAndroid', - 'launchExternalLinkAndroid', - 'createBillingProgramReportingDetailsAndroid', - 'enableBillingProgramAndroid', - ], `${base} alternative billing`); - expectNotIncludes(rel(base, 'app/alternative-billing.tsx'), [ - 'checkAlternativeBillingAvailabilityAndroid', - 'createAlternativeBillingTokenAndroid', - ], `${base} alternative billing`); - expectIncludes(rel(base, importSource), requiredIds, `${base} product constants`); + expectFile(rel(base, "app", `${route}.tsx`)); + } + expectIncludes( + rel(base, "app/_layout.tsx"), + routes.map((route) => `name="${route}"`), + `${base} layout`, + ); + expectIncludes( + rel(base, "app/index.tsx"), + routes.map((route) => `/${route}`), + `${base} home`, + ); + expectIncludes(rel(base, "app/index.tsx"), ["getStorefront"], `${base} home`); + expectIncludes( + rel(base, "app/webhook-stream.tsx"), + [ + "connectWebhookStream", + "Trigger test", + "/v1/webhooks/", + "/v1/webhooks/stream", + ], + `${base} webhook`, + ); + expectIncludes( + rel(base, "app/alternative-billing.tsx"), + [ + "isBillingProgramAvailableAndroid", + "launchExternalLinkAndroid", + "createBillingProgramReportingDetailsAndroid", + "enableBillingProgramAndroid", + ], + `${base} alternative billing`, + ); + expectNotIncludes( + rel(base, "app/alternative-billing.tsx"), + [ + "checkAlternativeBillingAvailabilityAndroid", + "createAlternativeBillingTokenAndroid", + ], + `${base} alternative billing`, + ); + expectIncludes( + rel(base, importSource), + requiredIds, + `${base} product constants`, + ); } function checkReactNativeClassic() { - const base = 'libraries/react-native-iap/example'; + const base = "libraries/react-native-iap/example"; const screens = { - AllProducts: 'AllProducts', - PurchaseFlow: 'PurchaseFlow', - SubscriptionFlow: 'SubscriptionFlow', - AvailablePurchases: 'AvailablePurchases', - OfferCode: 'OfferCode', - AlternativeBilling: 'AlternativeBilling', - WebhookStream: 'WebhookStream', + AllProducts: "AllProducts", + PurchaseFlow: "PurchaseFlow", + SubscriptionFlow: "SubscriptionFlow", + AvailablePurchases: "AvailablePurchases", + OfferCode: "OfferCode", + AlternativeBilling: "AlternativeBilling", + WebhookStream: "WebhookStream", }; for (const [route, file] of Object.entries(screens)) { - expectFile(rel(base, 'screens', `${file}.tsx`)); - expectIncludes(rel(base, 'navigation/index.tsx'), [`name="${route}"`], `${base} navigation`); - } - expectIncludes(rel(base, 'screens/Home.tsx'), [ - 'All Products', - 'Purchase Flow', - 'Subscription Flow', - 'Available Purchases', - 'Offer Code', - 'Alternative Billing', - 'Webhook Stream', - ], `${base} home`); - expectIncludes(rel(base, 'screens/WebhookStream.tsx'), [ - 'connectWebhookStream', - 'Trigger test notification', - '/v1/webhooks/', - ], `${base} webhook`); - expectIncludes(rel(base, 'screens/AlternativeBilling.tsx'), [ - 'isBillingProgramAvailableAndroid', - 'launchExternalLinkAndroid', - 'createBillingProgramReportingDetailsAndroid', - 'enableBillingProgramAndroid', - ], `${base} alternative billing`); - expectIncludes(rel(base, 'src/utils/constants.ts'), requiredIds, `${base} product constants`); - expectIncludes(rel(base, '__tests__/screens/Home.test.tsx'), [ - 'All Products', - 'Alternative Billing', - 'Webhook Stream', - ], `${base} home tests`); - expectIncludes(rel(base, '__tests__/RnIap.test.tsx'), [ - 'getStorefront', - 'isBillingProgramAvailableAndroid', - 'launchExternalLinkAndroid', - 'createBillingProgramReportingDetailsAndroid', - ], `${base} API tests`); + expectFile(rel(base, "screens", `${file}.tsx`)); + expectIncludes( + rel(base, "navigation/index.tsx"), + [`name="${route}"`], + `${base} navigation`, + ); + } + expectIncludes( + rel(base, "screens/Home.tsx"), + [ + "All Products", + "Purchase Flow", + "Subscription Flow", + "Available Purchases", + "Offer Code", + "Alternative Billing", + "Webhook Stream", + ], + `${base} home`, + ); + expectIncludes( + rel(base, "screens/WebhookStream.tsx"), + ["connectWebhookStream", "Trigger test notification", "/v1/webhooks/"], + `${base} webhook`, + ); + expectIncludes( + rel(base, "screens/AlternativeBilling.tsx"), + [ + "isBillingProgramAvailableAndroid", + "launchExternalLinkAndroid", + "createBillingProgramReportingDetailsAndroid", + "enableBillingProgramAndroid", + ], + `${base} alternative billing`, + ); + expectIncludes( + rel(base, "src/utils/constants.ts"), + requiredIds, + `${base} product constants`, + ); + expectIncludes( + rel(base, "__tests__/screens/Home.test.tsx"), + ["All Products", "Alternative Billing", "Webhook Stream"], + `${base} home tests`, + ); + expectIncludes( + rel(base, "__tests__/RnIap.test.tsx"), + [ + "getStorefront", + "isBillingProgramAvailableAndroid", + "launchExternalLinkAndroid", + "createBillingProgramReportingDetailsAndroid", + ], + `${base} API tests`, + ); } function checkFlutter() { - const base = 'libraries/flutter_inapp_purchase/example'; + const base = "libraries/flutter_inapp_purchase/example"; const screenFiles = [ - 'all_products_screen.dart', - 'purchase_flow_screen.dart', - 'subscription_flow_screen.dart', - 'available_purchases_screen.dart', - 'offer_code_screen.dart', - 'alternative_billing_screen.dart', - 'webhook_stream_screen.dart', + "all_products_screen.dart", + "purchase_flow_screen.dart", + "subscription_flow_screen.dart", + "available_purchases_screen.dart", + "offer_code_screen.dart", + "alternative_billing_screen.dart", + "webhook_stream_screen.dart", ]; for (const file of screenFiles) { - expectFile(rel(base, 'lib/src/screens', file)); - } - expectIncludes(rel(base, 'lib/src/app.dart'), routes.map((route) => `/${route}`), `${base} routes`); - expectIncludes(rel(base, 'lib/src/screens/home_screen.dart'), [ - 'All Products', - 'Purchase Flow', - 'Subscription Flow', - 'Available Purchases', - 'Redeem Offer Code', - 'Alternative Billing', - 'Webhook Stream', - ], `${base} home`); - expectIncludes(rel(base, 'lib/src/screens/webhook_stream_screen.dart'), [ - 'connectWebhookStream', - 'Trigger test', - '/v1/webhooks/', - ], `${base} webhook`); - expectIncludes(rel(base, 'lib/src/screens/alternative_billing_screen.dart'), [ - 'isBillingProgramAvailableAndroid', - 'launchExternalLinkAndroid', - 'createBillingProgramReportingDetailsAndroid', - ], `${base} alternative billing`); - expectIncludes(rel(base, 'lib/src/constants.dart'), requiredIds, `${base} product constants`); - expectIncludes(rel(base, 'test/widget_test.dart'), [ - 'Webhook Stream', - 'Trigger test', - 'Alternative Billing', - ], `${base} widget tests`); - expectIncludes('libraries/flutter_inapp_purchase/lib/utils.dart', [ - 'compactJWS', - 'promotionalOfferJWS', - 'winBackOffer', - ], 'Flutter iOS purchase payload'); - expectIncludes('libraries/flutter_inapp_purchase/test/flutter_inapp_purchase_channel_test.dart', [ - 'sends advanced iOS subscription purchase fields', - 'one-time-offer-token', - 'uses Apple channel method on iOS', - 'deepLinkToSubscriptionsAndroid', - ], 'Flutter requestPurchase tests'); - expectIncludes('libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart', [ - "invokeMethod('deepLinkToSubscriptions')", - 'deepLinkToSubscriptionsAndroid', - ], 'Flutter deepLinkToSubscriptions bridge'); + expectFile(rel(base, "lib/src/screens", file)); + } + expectIncludes( + rel(base, "lib/src/app.dart"), + routes.map((route) => `/${route}`), + `${base} routes`, + ); + expectIncludes( + rel(base, "lib/src/screens/home_screen.dart"), + [ + "All Products", + "Purchase Flow", + "Subscription Flow", + "Available Purchases", + "Redeem Offer Code", + "Alternative Billing", + "Webhook Stream", + ], + `${base} home`, + ); + expectIncludes( + rel(base, "lib/src/screens/webhook_stream_screen.dart"), + ["connectWebhookStream", "Trigger test", "/v1/webhooks/"], + `${base} webhook`, + ); + expectIncludes( + rel(base, "lib/src/screens/alternative_billing_screen.dart"), + [ + "isBillingProgramAvailableAndroid", + "launchExternalLinkAndroid", + "createBillingProgramReportingDetailsAndroid", + ], + `${base} alternative billing`, + ); + expectIncludes( + rel(base, "lib/src/constants.dart"), + requiredIds, + `${base} product constants`, + ); + expectIncludes( + rel(base, "test/widget_test.dart"), + ["Webhook Stream", "Trigger test", "Alternative Billing"], + `${base} widget tests`, + ); + expectIncludes( + "libraries/flutter_inapp_purchase/lib/utils.dart", + ["compactJWS", "promotionalOfferJWS", "winBackOffer"], + "Flutter iOS purchase payload", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/test/flutter_inapp_purchase_channel_test.dart", + [ + "sends advanced iOS subscription purchase fields", + "one-time-offer-token", + "uses Apple channel method on iOS", + "deepLinkToSubscriptionsAndroid", + ], + "Flutter requestPurchase tests", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart", + [ + "invokeMethod('deepLinkToSubscriptions')", + "deepLinkToSubscriptionsAndroid", + ], + "Flutter deepLinkToSubscriptions bridge", + ); const flutterIosPlugin = - 'libraries/flutter_inapp_purchase/ios/flutter_inapp_purchase/Sources/flutter_inapp_purchase/FlutterInappPurchasePlugin.swift'; + "libraries/flutter_inapp_purchase/ios/flutter_inapp_purchase/Sources/flutter_inapp_purchase/FlutterInappPurchasePlugin.swift"; const flutterMacosPlugin = - 'libraries/flutter_inapp_purchase/macos/flutter_inapp_purchase/Sources/flutter_inapp_purchase/FlutterInappPurchasePlugin.swift'; + "libraries/flutter_inapp_purchase/macos/flutter_inapp_purchase/Sources/flutter_inapp_purchase/FlutterInappPurchasePlugin.swift"; const flutterSwiftPackagePaths = [ - 'libraries/flutter_inapp_purchase/ios/flutter_inapp_purchase/Package.swift', - 'libraries/flutter_inapp_purchase/macos/flutter_inapp_purchase/Package.swift', + "libraries/flutter_inapp_purchase/ios/flutter_inapp_purchase/Package.swift", + "libraries/flutter_inapp_purchase/macos/flutter_inapp_purchase/Package.swift", ]; for (const flutterSwiftPackage of flutterSwiftPackagePaths) { @@ -833,1728 +1073,3078 @@ function checkFlutter() { } } - expectIncludes(flutterIosPlugin, [ - 'case "deepLinkToSubscriptions"', - 'OpenIapModule.shared.deepLinkToSubscriptions(nil)', - ], 'Flutter iOS deepLinkToSubscriptions bridge'); - expectIncludes(flutterMacosPlugin, [ - 'case "setPurchaseUpdatedListenerOptions"', - 'case "deepLinkToSubscriptions"', - 'case "getAllTransactionsIOS"', - 'case "validateReceiptIOS", "verifyPurchase"', - 'case "verifyPurchaseWithProvider"', - 'case "isEligibleForExternalPurchaseCustomLinkIOS"', - 'case "getExternalPurchaseCustomLinkTokenIOS"', - 'case "showExternalPurchaseCustomLinkNoticeIOS"', - 'subscriptionBillingIssueListener', - ], 'Flutter macOS channel parity'); - expectIncludes( - 'libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt', + expectIncludes( + flutterIosPlugin, + [ + 'case "deepLinkToSubscriptions"', + "OpenIapModule.shared.deepLinkToSubscriptions(nil)", + ], + "Flutter iOS deepLinkToSubscriptions bridge", + ); + expectIncludes( + flutterMacosPlugin, + [ + 'case "setPurchaseUpdatedListenerOptions"', + 'case "deepLinkToSubscriptions"', + 'case "getAllTransactionsIOS"', + 'case "validateReceiptIOS", "verifyPurchase"', + 'case "verifyPurchaseWithProvider"', + 'case "isEligibleForExternalPurchaseCustomLinkIOS"', + 'case "getExternalPurchaseCustomLinkTokenIOS"', + 'case "showExternalPurchaseCustomLinkNoticeIOS"', + "subscriptionBillingIssueListener", + ], + "Flutter macOS channel parity", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt", ['"setPurchaseUpdatedListenerOptions" ->'], - 'Flutter Android purchase listener option no-op', + "Flutter Android purchase listener option no-op", + ); + expectNotIncludes( + "libraries/flutter_inapp_purchase/android/build.gradle", + ["com.android.billingclient:billing-ktx:"], + "Flutter Android must inherit Play Billing from openiap-google", ); - expectNotIncludes('libraries/flutter_inapp_purchase/android/build.gradle', [ - 'com.android.billingclient:billing-ktx:', - ], 'Flutter Android must inherit Play Billing from openiap-google'); for (const nativePlugin of [ - 'libraries/expo-iap/ios/ExpoIapModule.swift', + "libraries/expo-iap/ios/ExpoIapModule.swift", flutterIosPlugin, flutterMacosPlugin, ]) { - expectNotIncludes(nativePlugin, [ - 'OpenIapModule.shared.validateReceiptIOS', - 'OpenIapModule.shared.getStorefrontIOS()', - ], 'Flutter deprecated native OpenIAP calls'); - } - expectIncludes(flutterIosPlugin, [ - 'OpenIapModule.shared.requestPurchaseOnPromotedProductIOS()', - ], 'Flutter iOS promoted purchase bridge'); - expectIncludes(flutterMacosPlugin, [ - 'OpenIapModule.shared.requestPurchaseOnPromotedProductIOS()', - ], 'Flutter macOS promoted purchase bridge'); - expectIncludes('libraries/react-native-iap/ios/HybridRnIap.swift', [ - 'func buyPromotedProductIOS() throws -> Promise', - 'OpenIapModule.shared.requestPurchaseOnPromotedProductIOS()', - 'throw OpenIapException.from(purchaseError)', - ], 'RN iOS promoted purchase bridge'); - expectIncludes('libraries/expo-iap/ios/ExpoIapModule.swift', [ - 'throw IapException.from(error)', - 'code: .purchaseVerificationFailed', - 'OpenIapModule.shared.requestPurchaseOnPromotedProductIOS()', - 'try await OpenIapModule.shared.getStorefront()', - ], 'Expo iOS error/storefront bridge'); - expectIncludes('libraries/expo-iap/ios/onside/OnsideIapModule.swift', [ - 'AsyncFunction("setPurchaseUpdatedListenerOptions")', - 'AsyncFunction("getAvailableItems") { (alsoPublish: Bool, onlyIncludeActive: Bool)', - 'AsyncFunction("getStorefront")', - 'getOnsideStorefront()', - 'OnsideEvent.subscriptionBillingIssue.rawValue', - 'constants["ERROR_CODES"] = errorCodes', - ], 'Expo Onside root API bridge'); - expectNotIncludes('libraries/expo-iap/ios/onside/OnsideIapModule.swift', [ - 'private let encoder: JSONEncoder', - ], 'Expo Onside unused encoder cleanup'); - expectIncludes('libraries/expo-iap/src/index.ts', [ - 'nativeModule.USING_ONSIDE_SDK', - 'nativeModule.restorePurchases', - ], 'Expo Onside restore routing'); - expectIncludes('libraries/expo-iap/src/ExpoIapModule.ts', [ - "const ONSIDE_MARKETPLACE_ID = 'com.onside.marketplace-app'", - 'shouldUseOnsideModule()', - 'onsideModuleUnavailable', - 'return getExpoIapFallbackModule()?.[prop]', - ], 'Expo Onside native module proxy routing'); - expectIncludes('libraries/expo-iap/src/__tests__/ExpoIapModule.test.ts', [ - 're-resolves when Onside availability changes after initial access', - 'does not repeatedly load a missing ExpoIapOnside module', - 'surfaces non-missing ExpoIap fallback errors', - ], 'Expo Onside module proxy tests'); - expectNotIncludes('libraries/expo-iap/src/index.ts', [ - 'v3.1.0', - 'Unsupported Platform', - 'Platform not supported', - ], 'Expo public API warnings/errors must stay current and consistently phrased'); - expectNotIncludes('libraries/expo-iap/CLAUDE.md', [ - 'v2.9.0', - ], 'Expo package guidance must not reference past deprecation deadlines'); - expectIncludes('libraries/react-native-iap/src/__tests__/index.test.ts', [ - 'deepLinkToSubscriptions surfaces iOS native failures', - ], 'RN deepLinkToSubscriptions error tests'); - expectNotIncludes('libraries/react-native-iap/src/index.ts', [ - "RnIapConsole.warn('[deepLinkToSubscriptions] Failed on iOS:'", - 'getActiveSubscriptions_OLD', - 'v14.4.0', - ], 'RN deepLinkToSubscriptions error handling'); - expectNotIncludes('libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart', [ - "final androidProps = type == 'inapp'", - ], 'Flutter Android requestPurchase parser'); + expectNotIncludes( + nativePlugin, + [ + "OpenIapModule.shared.validateReceiptIOS", + "OpenIapModule.shared.getStorefrontIOS()", + ], + "Flutter deprecated native OpenIAP calls", + ); + } + expectIncludes( + flutterIosPlugin, + ["OpenIapModule.shared.requestPurchaseOnPromotedProductIOS()"], + "Flutter iOS promoted purchase bridge", + ); + expectIncludes( + flutterMacosPlugin, + ["OpenIapModule.shared.requestPurchaseOnPromotedProductIOS()"], + "Flutter macOS promoted purchase bridge", + ); + expectIncludes( + "libraries/react-native-iap/ios/HybridRnIap.swift", + [ + "func buyPromotedProductIOS() throws -> Promise", + "OpenIapModule.shared.requestPurchaseOnPromotedProductIOS()", + "throw OpenIapException.from(purchaseError)", + ], + "RN iOS promoted purchase bridge", + ); + expectIncludes( + "libraries/expo-iap/ios/ExpoIapModule.swift", + [ + "throw IapException.from(error)", + "code: .purchaseVerificationFailed", + "OpenIapModule.shared.requestPurchaseOnPromotedProductIOS()", + "try await OpenIapModule.shared.getStorefront()", + ], + "Expo iOS error/storefront bridge", + ); + expectIncludes( + "libraries/expo-iap/ios/onside/OnsideIapModule.swift", + [ + 'AsyncFunction("setPurchaseUpdatedListenerOptions")', + 'AsyncFunction("getAvailableItems") { (alsoPublish: Bool, onlyIncludeActive: Bool)', + 'AsyncFunction("getStorefront")', + "getOnsideStorefront()", + "OnsideEvent.subscriptionBillingIssue.rawValue", + 'constants["ERROR_CODES"] = errorCodes', + ], + "Expo Onside root API bridge", + ); + expectNotIncludes( + "libraries/expo-iap/ios/onside/OnsideIapModule.swift", + ["private let encoder: JSONEncoder"], + "Expo Onside unused encoder cleanup", + ); + expectIncludes( + "libraries/expo-iap/src/index.ts", + ["nativeModule.USING_ONSIDE_SDK", "nativeModule.restorePurchases"], + "Expo Onside restore routing", + ); + expectIncludes( + "libraries/expo-iap/src/ExpoIapModule.ts", + [ + "const ONSIDE_MARKETPLACE_ID = 'com.onside.marketplace-app'", + "shouldUseOnsideModule()", + "onsideModuleUnavailable", + "return getExpoIapFallbackModule()?.[prop]", + ], + "Expo Onside native module proxy routing", + ); + expectIncludes( + "libraries/expo-iap/src/__tests__/ExpoIapModule.test.ts", + [ + "re-resolves when Onside availability changes after initial access", + "does not repeatedly load a missing ExpoIapOnside module", + "surfaces non-missing ExpoIap fallback errors", + ], + "Expo Onside module proxy tests", + ); + expectNotIncludes( + "libraries/expo-iap/src/index.ts", + ["v3.1.0", "Unsupported Platform", "Platform not supported"], + "Expo public API warnings/errors must stay current and consistently phrased", + ); + expectNotIncludes( + "libraries/expo-iap/CLAUDE.md", + ["v2.9.0"], + "Expo package guidance must not reference past deprecation deadlines", + ); + expectIncludes( + "libraries/react-native-iap/src/__tests__/index.test.ts", + ["deepLinkToSubscriptions surfaces iOS native failures"], + "RN deepLinkToSubscriptions error tests", + ); + expectNotIncludes( + "libraries/react-native-iap/src/index.ts", + [ + "RnIapConsole.warn('[deepLinkToSubscriptions] Failed on iOS:'", + "getActiveSubscriptions_OLD", + "v14.4.0", + ], + "RN deepLinkToSubscriptions error handling", + ); + expectNotIncludes( + "libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart", + ["final androidProps = type == 'inapp'"], + "Flutter Android requestPurchase parser", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt", + [ + '"Invalid developerBillingOption: ${e.message}"', + '"Invalid subscriptionProductReplacementParams: ${e.message}"', + '"oldProductId and replacementMode are required"', + ], + "Flutter Android billing option validation", + ); + expectNotIncludes( + "libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt", + [ + 'OpenIapLog.w(TAG, "Failed to parse developerBillingOption:', + 'OpenIapLog.w(TAG, "Failed to parse subscriptionProductReplacementParams:', + ], + "Flutter Android billing option validation must not silently fall back", + ); } function checkKmp() { - const base = 'libraries/kmp-iap/example/composeApp/src'; + const base = "libraries/kmp-iap/example/composeApp/src"; for (const file of [ - 'AllProductsScreen.kt', - 'PurchaseFlowScreen.kt', - 'SubscriptionFlowScreen.kt', - 'AvailablePurchasesScreen.kt', - 'OfferCodeScreen.kt', - 'AlternativeBillingScreen.kt', - 'WebhookStreamScreen.kt', - 'ExampleProductIds.kt', - 'WebhookTestNotification.kt', + "AllProductsScreen.kt", + "PurchaseFlowScreen.kt", + "SubscriptionFlowScreen.kt", + "AvailablePurchasesScreen.kt", + "OfferCodeScreen.kt", + "AlternativeBillingScreen.kt", + "WebhookStreamScreen.kt", + "ExampleProductIds.kt", + "WebhookTestNotification.kt", ]) { - expectFile(rel(base, 'commonMain/kotlin/dev/hyo/martie/screens', file)); - } - for (const sourceSet of ['androidMain', 'iosMain', 'jvmMain']) { - expectFile(rel(base, `${sourceSet}/kotlin/dev/hyo/martie/screens/WebhookTestNotification.${sourceSet.replace('Main', '')}.kt`)); - } - expectIncludes(rel(base, 'commonMain/kotlin/dev/hyo/martie/navigation/Navigation.kt'), routes, 'KMP navigation'); - expectIncludes(rel(base, 'commonMain/kotlin/dev/hyo/martie/screens/HomeScreen.kt'), [ - 'All Products', - 'Purchase Flow', - 'Subscription Flow', - 'Available Purchases', - 'Offer Code', - 'Alternative Billing', - 'Webhook Stream', - 'getStorefront()', - ], 'KMP home'); - expectIncludes(rel(base, 'commonMain/kotlin/dev/hyo/martie/screens/WebhookStreamScreen.kt'), [ - 'connectWebhookStream', - 'triggerWebhookTestNotification', - 'Trigger test notification', - ], 'KMP webhook'); - expectIncludes(rel(base, 'commonMain/kotlin/dev/hyo/martie/screens/AlternativeBillingScreen.kt'), [ - 'isBillingProgramAvailableAndroid', - 'launchExternalLinkAndroid', - 'createBillingProgramReportingDetailsAndroid', - ], 'KMP alternative billing'); - expectIncludes(rel(base, 'commonMain/kotlin/dev/hyo/martie/screens/ExampleProductIds.kt'), requiredIds, 'KMP product constants'); - expectIncludes('libraries/kmp-iap/library/src/iosMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseIOS.kt', [ - 'requestPurchaseWithPayload(params.toJson().toObjCMap())', - 'requireIosSku(params)', - 'openIapModule.verifyPurchaseWithSku(sku)', - 'filterActiveSubscriptions(result, subscriptionIds)', - ], 'KMP iOS requestPurchase bridge'); - expectNotIncludes('libraries/kmp-iap/library/src/iosMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseIOS.kt', [ - 'TODO: iOS 15+/18+ options', - 'For now, return a basic result', - ], 'KMP iOS requestPurchase bridge'); - expectNotIncludes('libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt', [ - 'requestPurchaseOnPromotedProductIOS(): Boolean = false', - ], 'KMP Android promoted product bridge'); - expectIncludes('libraries/kmp-iap/example/gradle.properties', [ - 'kotlin.apple.xcodeCompatibility.nowarn=true', - ], 'KMP example Xcode compatibility warning suppression'); + expectFile(rel(base, "commonMain/kotlin/dev/hyo/martie/screens", file)); + } + for (const sourceSet of ["androidMain", "iosMain", "jvmMain"]) { + expectFile( + rel( + base, + `${sourceSet}/kotlin/dev/hyo/martie/screens/WebhookTestNotification.${sourceSet.replace("Main", "")}.kt`, + ), + ); + } + expectIncludes( + rel(base, "commonMain/kotlin/dev/hyo/martie/navigation/Navigation.kt"), + routes, + "KMP navigation", + ); + expectIncludes( + rel(base, "commonMain/kotlin/dev/hyo/martie/screens/HomeScreen.kt"), + [ + "All Products", + "Purchase Flow", + "Subscription Flow", + "Available Purchases", + "Offer Code", + "Alternative Billing", + "Webhook Stream", + "getStorefront()", + ], + "KMP home", + ); + expectIncludes( + rel( + base, + "commonMain/kotlin/dev/hyo/martie/screens/WebhookStreamScreen.kt", + ), + [ + "connectWebhookStream", + "triggerWebhookTestNotification", + "Trigger test notification", + ], + "KMP webhook", + ); + expectIncludes( + rel( + base, + "commonMain/kotlin/dev/hyo/martie/screens/AlternativeBillingScreen.kt", + ), + [ + "isBillingProgramAvailableAndroid", + "launchExternalLinkAndroid", + "createBillingProgramReportingDetailsAndroid", + ], + "KMP alternative billing", + ); + expectIncludes( + rel(base, "commonMain/kotlin/dev/hyo/martie/screens/ExampleProductIds.kt"), + requiredIds, + "KMP product constants", + ); + expectIncludes( + "libraries/kmp-iap/library/src/iosMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseIOS.kt", + [ + "requestPurchaseWithPayload(params.toJson().toObjCMap())", + "requireIosSku(params)", + "openIapModule.verifyPurchaseWithSku(sku)", + "filterActiveSubscriptions(result, subscriptionIds)", + ], + "KMP iOS requestPurchase bridge", + ); + expectNotIncludes( + "libraries/kmp-iap/library/src/iosMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseIOS.kt", + ["TODO: iOS 15+/18+ options", "For now, return a basic result"], + "KMP iOS requestPurchase bridge", + ); + expectNotIncludes( + "libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt", + ["requestPurchaseOnPromotedProductIOS(): Boolean = false"], + "KMP Android promoted product bridge", + ); + expectIncludes( + "libraries/kmp-iap/example/gradle.properties", + ["kotlin.apple.xcodeCompatibility.nowarn=true"], + "KMP example Xcode compatibility warning suppression", + ); } function checkApple() { - const base = 'packages/apple'; + const base = "packages/apple"; for (const file of [ - 'AllProductsView.swift', - 'PurchaseFlowScreen.swift', - 'SubscriptionFlowScreen.swift', - 'AvailablePurchasesScreen.swift', - 'OfferCodeScreen.swift', - 'AlternativeBillingScreen.swift', - 'WebhookStreamScreen.swift', + "AllProductsView.swift", + "PurchaseFlowScreen.swift", + "SubscriptionFlowScreen.swift", + "AvailablePurchasesScreen.swift", + "OfferCodeScreen.swift", + "AlternativeBillingScreen.swift", + "WebhookStreamScreen.swift", ]) { - expectFile(rel(base, 'Example/OpenIapExample/Screens', file)); - } - expectIncludes(rel(base, 'Example/OpenIapExample/Screens/HomeScreen.swift'), [ - 'AllProductsView', - 'PurchaseFlowScreen', - 'SubscriptionFlowScreen', - 'AvailablePurchasesScreen', - 'OfferCodeScreen', - 'AlternativeBillingScreen', - 'WebhookStreamScreen', - ], 'Apple home'); - expectIncludes(rel(base, 'Example/OpenIapExample/Screens/WebhookStreamScreen.swift'), [ - '/v1/webhooks/stream/', - 'Trigger Test', - '/v1/webhooks/', - ], 'Apple webhook'); - expectIncludes(rel(base, 'Sources/OpenIapProtocol.swift'), [ - 'func getStorefront()', - 'func canPresentExternalPurchaseNoticeIOS()', - 'func presentExternalPurchaseNoticeSheetIOS()', - 'func presentExternalPurchaseLinkIOS', - 'func isEligibleForExternalPurchaseCustomLinkIOS()', - 'func getExternalPurchaseCustomLinkTokenIOS', - 'func showExternalPurchaseCustomLinkNoticeIOS', - ], 'Apple protocol'); - expectIncludes(rel(base, 'Sources/OpenIapStore.swift'), [ - 'func getStorefront()', - 'deinit {', - 'module.removeListener(token)', - 'guard listenerTokens.isEmpty else { return }', - 'func canPresentExternalPurchaseNoticeIOS()', - 'func presentExternalPurchaseNoticeSheetIOS()', - 'func presentExternalPurchaseLinkIOS', - 'func isEligibleForExternalPurchaseCustomLinkIOS()', - 'func getExternalPurchaseCustomLinkTokenIOS', - 'func showExternalPurchaseCustomLinkNoticeIOS', - ], 'Apple store'); - expectIncludes(rel(base, 'Sources/OpenIapModule+ObjC.swift'), [ - 'func requestPurchaseWithPayload', - 'OpenIapSerialization.requestPurchaseProps(from: payload)', - 'func getStorefrontWithCompletion', - 'try await requestPurchaseOnPromotedProductIOS()', - ], 'Apple ObjC purchase bridge'); - expectIncludes(rel(base, 'Tests/OpenIapTests/VerifyPurchaseTests.swift'), [ - 'testStorefrontUsesUnifiedProtocolMethod', - 'getStorefrontCallCount', - ], 'Apple tests'); - expectIncludes(rel(base, 'Example/OpenIapExample/Screens/AllProductsView.swift'), requiredIds, 'Apple product constants'); + expectFile(rel(base, "Example/OpenIapExample/Screens", file)); + } + expectIncludes( + rel(base, "Example/OpenIapExample/Screens/HomeScreen.swift"), + [ + "AllProductsView", + "PurchaseFlowScreen", + "SubscriptionFlowScreen", + "AvailablePurchasesScreen", + "OfferCodeScreen", + "AlternativeBillingScreen", + "WebhookStreamScreen", + ], + "Apple home", + ); + expectIncludes( + rel(base, "Example/OpenIapExample/Screens/WebhookStreamScreen.swift"), + ["/v1/webhooks/stream/", "Trigger Test", "/v1/webhooks/"], + "Apple webhook", + ); + expectIncludes( + rel(base, "Sources/OpenIapProtocol.swift"), + [ + "func getStorefront()", + "func canPresentExternalPurchaseNoticeIOS()", + "func presentExternalPurchaseNoticeSheetIOS()", + "func presentExternalPurchaseLinkIOS", + "func isEligibleForExternalPurchaseCustomLinkIOS()", + "func getExternalPurchaseCustomLinkTokenIOS", + "func showExternalPurchaseCustomLinkNoticeIOS", + ], + "Apple protocol", + ); + expectIncludes( + rel(base, "Sources/OpenIapStore.swift"), + [ + "func getStorefront()", + "deinit {", + "module.removeListener(token)", + "guard listenerTokens.isEmpty else { return }", + "func canPresentExternalPurchaseNoticeIOS()", + "func presentExternalPurchaseNoticeSheetIOS()", + "func presentExternalPurchaseLinkIOS", + "func isEligibleForExternalPurchaseCustomLinkIOS()", + "func getExternalPurchaseCustomLinkTokenIOS", + "func showExternalPurchaseCustomLinkNoticeIOS", + ], + "Apple store", + ); + expectIncludes( + rel(base, "Sources/OpenIapModule+ObjC.swift"), + [ + "func requestPurchaseWithPayload", + "OpenIapSerialization.requestPurchaseProps(from: payload)", + "func getStorefrontWithCompletion", + "try await requestPurchaseOnPromotedProductIOS()", + ], + "Apple ObjC purchase bridge", + ); + expectIncludes( + rel(base, "Tests/OpenIapTests/VerifyPurchaseTests.swift"), + ["testStorefrontUsesUnifiedProtocolMethod", "getStorefrontCallCount"], + "Apple tests", + ); + expectIncludes( + rel(base, "Example/OpenIapExample/Screens/AllProductsView.swift"), + requiredIds, + "Apple product constants", + ); } function checkGoogle() { - const base = 'packages/google'; + const base = "packages/google"; for (const file of [ - 'AllProductsScreen.kt', - 'PurchaseFlowScreen.kt', - 'SubscriptionFlowScreen.kt', - 'AvailablePurchasesScreen.kt', - 'OfferCodeScreen.kt', - 'AlternativeBillingScreen.kt', - 'WebhookStreamScreen.kt', + "AllProductsScreen.kt", + "PurchaseFlowScreen.kt", + "SubscriptionFlowScreen.kt", + "AvailablePurchasesScreen.kt", + "OfferCodeScreen.kt", + "AlternativeBillingScreen.kt", + "WebhookStreamScreen.kt", ]) { - expectFile(rel(base, 'Example/src/main/java/dev/hyo/martie/screens', file)); - } - expectIncludes(rel(base, 'Example/src/main/java/dev/hyo/martie/screens/HomeScreen.kt'), [ - 'all_products', - 'purchase_flow', - 'subscription_flow', - 'available_purchases', - 'offer_code', - 'alternative_billing', - 'webhook_stream', - ], 'Google home'); - expectIncludes(rel(base, 'Example/src/main/java/dev/hyo/martie/screens/WebhookStreamScreen.kt'), [ - 'triggerTestNotification', - '/v1/webhooks/', - '/v1/webhooks/stream/', - ], 'Google webhook'); - for (const flavor of ['play', 'horizon']) { - expectIncludes(rel(base, `openiap/src/${flavor}/java/dev/hyo/openiap/OpenIapModule.kt`), [ - 'getStorefront = { getStorefront() }', - 'checkAlternativeBillingAvailabilityAndroid', - 'createAlternativeBillingTokenAndroid', - 'createBillingProgramReportingDetailsAndroid', - 'isBillingProgramAvailableAndroid', - 'launchExternalLinkAndroid', - 'showAlternativeBillingDialogAndroid', - ], `Google ${flavor} module handlers`); - } - expectIncludes(rel(base, 'Example/src/main/java/dev/hyo/martie/Constants.kt'), requiredIds, 'Google product constants'); - expectIncludes(rel(base, 'openiap/src/test/java/dev/hyo/openiap/BillingProgramAndroidTest.kt'), [ - 'external-offer', - 'external-payments', - ], 'Google Billing Programs tests'); + expectFile(rel(base, "Example/src/main/java/dev/hyo/martie/screens", file)); + } + expectIncludes( + rel(base, "Example/src/main/java/dev/hyo/martie/screens/HomeScreen.kt"), + [ + "all_products", + "purchase_flow", + "subscription_flow", + "available_purchases", + "offer_code", + "alternative_billing", + "webhook_stream", + ], + "Google home", + ); + expectIncludes( + rel( + base, + "Example/src/main/java/dev/hyo/martie/screens/WebhookStreamScreen.kt", + ), + ["triggerTestNotification", "/v1/webhooks/", "/v1/webhooks/stream/"], + "Google webhook", + ); + for (const flavor of ["play", "horizon", "amazon"]) { + expectIncludes( + rel(base, `openiap/src/${flavor}/java/dev/hyo/openiap/OpenIapModule.kt`), + [ + "getStorefront = { getStorefront() }", + "checkAlternativeBillingAvailabilityAndroid", + "createAlternativeBillingTokenAndroid", + "createBillingProgramReportingDetailsAndroid", + "getBillingChoiceInfoAndroid", + "isBillingProgramAvailableAndroid", + "launchExternalLinkAndroid", + "showAlternativeBillingDialogAndroid", + "showBillingProgramInformationDialogAndroid", + "showInAppMessagesAndroid", + ], + `Google ${flavor} module handlers`, + ); + } + expectIncludes( + rel(base, "Example/src/main/java/dev/hyo/martie/Constants.kt"), + requiredIds, + "Google product constants", + ); + expectIncludes( + rel( + base, + "openiap/src/test/java/dev/hyo/openiap/BillingProgramAndroidTest.kt", + ), + ["external-offer", "external-payments"], + "Google Billing Programs tests", + ); } function checkMaui() { - const base = 'libraries/maui-iap/example/OpenIap.Maui.Example'; + const base = "libraries/maui-iap/example/OpenIap.Maui.Example"; for (const page of [ - 'AllProductsPage', - 'PurchaseFlowPage', - 'SubscriptionFlowPage', - 'AvailablePurchasesPage', - 'OfferCodePage', - 'AlternativeBillingPage', - 'WebhookStreamPage', + "AllProductsPage", + "PurchaseFlowPage", + "SubscriptionFlowPage", + "AvailablePurchasesPage", + "OfferCodePage", + "AlternativeBillingPage", + "WebhookStreamPage", ]) { - expectFile(rel(base, 'Pages', `${page}.xaml`)); - expectFile(rel(base, 'Pages', `${page}.xaml.cs`)); - } - expectIncludes(rel(base, 'Pages/HomePage.xaml'), [ - 'All Products', - 'Purchase Flow', - 'Subscription Flow', - 'Available Purchases', - 'Offer Code', - 'Alternative Billing', - 'Webhook Stream', - ], 'MAUI home'); - expectIncludes(rel(base, 'AppShell.xaml.cs'), routes, 'MAUI routes'); - expectIncludes(rel(base, 'Pages/WebhookStreamPage.xaml.cs'), [ - 'ConnectWebhookStream', - 'TriggerButton', - '/v1/webhooks/', - ], 'MAUI webhook'); - expectIncludes(rel(base, 'Pages/AlternativeBillingPage.xaml.cs'), [ - 'IsBillingProgramAvailableAndroidAsync', - 'LaunchExternalLinkAndroidAsync', - 'CreateBillingProgramReportingDetailsAndroidAsync', - ], 'MAUI alternative billing'); - expectIncludes(rel(base, 'Constants.cs'), requiredIds, 'MAUI product constants'); - expectIncludes('libraries/maui-iap/src/OpenIap.Maui.Bindings.iOS/ApiDefinition.cs', [ - 'requestPurchaseWithPayload:completion:', - 'getStorefrontWithCompletion:', - ], 'MAUI iOS binding'); - expectIncludes('libraries/maui-iap/src/OpenIap.Maui/Platforms/iOS/OpenIapIOS.cs', [ - 'RequestPurchaseWithPayload', - 'RequestPurchasePayload', - '_module.GetStorefront(cb)', - 'GetActiveSubscriptionsAsync(subscriptionIds)', - ], 'MAUI iOS requestPurchase bridge'); - expectIncludes('libraries/maui-iap/src/OpenIap.Maui/Platforms/iOS/NSObjectJsonBridge.cs', [ - 'JsonObjectToDictionary', - ], 'MAUI iOS JSON bridge'); + expectFile(rel(base, "Pages", `${page}.xaml`)); + expectFile(rel(base, "Pages", `${page}.xaml.cs`)); + } + expectIncludes( + rel(base, "Pages/HomePage.xaml"), + [ + "All Products", + "Purchase Flow", + "Subscription Flow", + "Available Purchases", + "Offer Code", + "Alternative Billing", + "Webhook Stream", + ], + "MAUI home", + ); + expectIncludes(rel(base, "AppShell.xaml.cs"), routes, "MAUI routes"); + expectIncludes( + rel(base, "Pages/WebhookStreamPage.xaml.cs"), + ["ConnectWebhookStream", "TriggerButton", "/v1/webhooks/"], + "MAUI webhook", + ); + expectIncludes( + rel(base, "Pages/AlternativeBillingPage.xaml.cs"), + [ + "IsBillingProgramAvailableAndroidAsync", + "LaunchExternalLinkAndroidAsync", + "CreateBillingProgramReportingDetailsAndroidAsync", + ], + "MAUI alternative billing", + ); + expectIncludes( + rel(base, "Constants.cs"), + requiredIds, + "MAUI product constants", + ); + expectIncludes( + "libraries/maui-iap/src/OpenIap.Maui.Bindings.iOS/ApiDefinition.cs", + ["requestPurchaseWithPayload:completion:", "getStorefrontWithCompletion:"], + "MAUI iOS binding", + ); + expectIncludes( + "libraries/maui-iap/src/OpenIap.Maui/Platforms/iOS/OpenIapIOS.cs", + [ + "RequestPurchaseWithPayload", + "RequestPurchasePayload", + "_module.GetStorefront(cb)", + "GetActiveSubscriptionsAsync(subscriptionIds)", + ], + "MAUI iOS requestPurchase bridge", + ); + expectIncludes( + "libraries/maui-iap/src/OpenIap.Maui/Platforms/iOS/NSObjectJsonBridge.cs", + ["JsonObjectToDictionary"], + "MAUI iOS JSON bridge", + ); } function checkNativeApis() { - expectIncludes('libraries/react-native-iap/src/specs/RnIap.nitro.ts', [ - 'getStorefront(): Promise', - 'checkAlternativeBillingAvailabilityAndroid(): Promise', - 'createAlternativeBillingTokenAndroid', - 'isBillingProgramAvailableAndroid', - 'createBillingProgramReportingDetailsAndroid', - 'getBillingChoiceInfoAndroid', - 'launchExternalLinkAndroid', - 'showBillingProgramInformationDialogAndroid', - 'showInAppMessagesAndroid', - ], 'RN native spec'); - expectIncludes('libraries/expo-iap/src/index.ts', [ - 'getStorefront', - 'connectWebhookStream', - "export * from './modules/android';", - ], 'Expo API exports'); - expectIncludes('libraries/expo-iap/src/modules/android.ts', [ - 'getBillingChoiceInfoAndroid', - 'showBillingProgramInformationDialogAndroid', - 'showInAppMessagesAndroid', - ], 'Expo Android API exports'); - expectIncludes('libraries/flutter_inapp_purchase/lib/types.dart', [ - 'Future getStorefront()', - 'Future checkAlternativeBillingAvailabilityAndroid()', - 'Future createAlternativeBillingTokenAndroid()', - 'Future createBillingProgramReportingDetailsAndroid', - 'Future getBillingChoiceInfoAndroid', - 'Future isBillingProgramAvailableAndroid', - 'Future launchExternalLinkAndroid', - 'Future showBillingProgramInformationDialogAndroid', - 'Future showInAppMessagesAndroid', - ], 'Flutter generated API'); - expectIncludes('libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt', [ - 'suspend fun getStorefront(): String', - 'suspend fun checkAlternativeBillingAvailabilityAndroid(): Boolean', - 'suspend fun createAlternativeBillingTokenAndroid', - 'suspend fun createBillingProgramReportingDetailsAndroid', - 'suspend fun getBillingChoiceInfoAndroid', - 'suspend fun isBillingProgramAvailableAndroid', - 'suspend fun launchExternalLinkAndroid', - 'suspend fun showBillingProgramInformationDialogAndroid', - 'suspend fun showInAppMessagesAndroid', - ], 'KMP generated API'); -} - -function checkFrameworkDependencyHygiene() { - const versions = readJson('openiap-versions.json'); - const googleVersion = versions.google; - if (typeof googleVersion !== 'string' || googleVersion.length === 0) { - fail('openiap-versions.json is missing a google version'); - } - const googleBuildGradle = read('packages/google/openiap/build.gradle.kts'); - const googleCoroutineVersions = uniqueMatches( - googleBuildGradle, - /val\s+coroutinesVersion\s*=\s*"([^"]+)"/g, + expectIncludes( + "libraries/react-native-iap/src/specs/RnIap.nitro.ts", + [ + "getStorefront(): Promise", + "checkAlternativeBillingAvailabilityAndroid(): Promise", + "createAlternativeBillingTokenAndroid", + "isBillingProgramAvailableAndroid", + "createBillingProgramReportingDetailsAndroid", + "getBillingChoiceInfoAndroid", + "launchExternalLinkAndroid", + "showBillingProgramInformationDialogAndroid", + "showInAppMessagesAndroid", + ], + "RN native spec", ); - if (googleCoroutineVersions.length !== 1) { - fail( - `packages/google must use one Kotlinx Coroutines version, found: ${googleCoroutineVersions.join(', ') || '(none)'}`, - ); - } - const googleCoroutinesVersion = googleCoroutineVersions[0]; - - for (const [packagePath, versionKey] of [ - ['packages/gql/package.json', 'spec'], - ['packages/docs/package.json', 'spec'], - ['packages/google/package.json', 'google'], - ['packages/apple/package.json', 'apple'], - ]) { - const packageVersion = readJson(packagePath).version; - if (packageVersion !== versions[versionKey]) { - fail(`${packagePath} version ${packageVersion} must match openiap-versions.json ${versionKey} ${versions[versionKey]}`); - } - } - expectSymlinkTarget( - 'packages/apple/Sources/openiap-versions.json', - '../../../openiap-versions.json', - 'Apple package version SSOT link', + expectIncludes( + "libraries/expo-iap/src/index.ts", + [ + "getStorefront", + "connectWebhookStream", + "export * from './modules/android';", + ], + "Expo API exports", ); - expectSymlinkTarget( - 'packages/google/openiap-versions.json', - '../../openiap-versions.json', - 'Google package version SSOT link', + expectIncludes( + "libraries/expo-iap/src/modules/android.ts", + [ + "getBillingChoiceInfoAndroid", + "showBillingProgramInformationDialogAndroid", + "showInAppMessagesAndroid", + ], + "Expo Android API exports", ); - for (const libraryVersionLink of [ - 'libraries/react-native-iap/openiap-versions.json', - 'libraries/expo-iap/openiap-versions.json', - 'libraries/flutter_inapp_purchase/openiap-versions.json', - 'libraries/godot-iap/openiap-versions.json', - 'libraries/kmp-iap/openiap-versions.json', - 'libraries/maui-iap/openiap-versions.json', - ]) { - expectSymlinkTarget( - libraryVersionLink, - '../../openiap-versions.json', - `${libraryVersionLink} version SSOT link`, - ); - } - expectFile('packages/docs/openiap-versions.json'); - if ( - exists('packages/docs/openiap-versions.json') && - fs.lstatSync(abs('packages/docs/openiap-versions.json')).isSymbolicLink() - ) { - fail('packages/docs/openiap-versions.json must be a real file for Vercel deployment'); - } - expectSameFile( - 'openiap-versions.json', - 'packages/docs/openiap-versions.json', - 'Docs package version copy', + expectIncludes( + "libraries/flutter_inapp_purchase/lib/types.dart", + [ + "Future getStorefront()", + "Future checkAlternativeBillingAvailabilityAndroid()", + "Future createAlternativeBillingTokenAndroid()", + "Future createBillingProgramReportingDetailsAndroid", + "Future getBillingChoiceInfoAndroid", + "Future isBillingProgramAvailableAndroid", + "Future launchExternalLinkAndroid", + "Future showBillingProgramInformationDialogAndroid", + "Future showInAppMessagesAndroid", + ], + "Flutter generated API", ); - expectSymlinkTarget( - 'llms.txt', - 'packages/docs/public/llms.txt', - 'Root llms.txt', + expectIncludes( + "libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/openiap/Types.kt", + [ + "suspend fun getStorefront(): String", + "suspend fun checkAlternativeBillingAvailabilityAndroid(): Boolean", + "suspend fun createAlternativeBillingTokenAndroid", + "suspend fun createBillingProgramReportingDetailsAndroid", + "suspend fun getBillingChoiceInfoAndroid", + "suspend fun isBillingProgramAvailableAndroid", + "suspend fun launchExternalLinkAndroid", + "suspend fun showBillingProgramInformationDialogAndroid", + "suspend fun showInAppMessagesAndroid", + ], + "KMP generated API", ); - expectSymlinkTarget( - 'llms-full.txt', - 'packages/docs/public/llms-full.txt', - 'Root llms-full.txt', +} + +function checkBillingChoiceFieldBindings() { + expectIncludes( + "packages/docs/src/pages/docs/apis/android/show-billing-program-information-dialog-android.tsx", + [ + "a developer-rendered, in-app flow", + "Google-rendered and external-link flows do not use this step", + ], + "Billing Choice information dialog docs", ); - for (const docsLlmsFile of [ - 'packages/docs/public/llms.txt', - 'packages/docs/public/llms-full.txt', + expectNotIncludes( + "packages/docs/src/pages/docs/apis/android/show-billing-program-information-dialog-android.tsx", + [ + "for Google-rendered Billing Choice flows", + "when Google renders the Billing Choice screen", + ], + "Billing Choice information dialog docs", + ); + expectIncludes( + "libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AlternativeBillingScreen.kt", + [ + "BillingChoiceScreenTypeAndroid.DeveloperRendered", + "DeveloperBillingTypeAndroid.InApp", + "fun showAndroidBillingMessages()", + ], + "KMP Billing Choice example flow", + ); + expectNotIncludes( + "libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/AlternativeBillingScreen.kt", + [ + "val developerBillingType = if (availability.isExternalLinkAvailable == true)", + ], + "KMP Billing Choice example flow", + ); + expectIncludes( + ".claude/guides/05-google-package.md", + ["Play Billing 9.1.0", "Horizon SDK 2.0.0", "Amazon Appstore SDK 3.0.8"], + "Google package guide store versions", + ); + expectNotIncludes( + ".claude/guides/05-google-package.md", + ["Play Billing 8.x"], + "Google package guide current Play Billing version", + ); + expectIncludes( + "packages/docs/src/lib/images.ts", + ["Play Billing 9.1 coverage"], + "React Native docs current Play Billing coverage", + ); + expectNotIncludes( + "packages/docs/src/lib/images.ts", + ["Play Billing 8 coverage"], + "React Native docs stale Play Billing coverage", + ); + expectNotIncludes( + "packages/google/ALTERNATIVE_BILLING.md", + ["this library uses 8.0.0"], + "Google Play Billing runtime documentation", + ); + expectIncludes( + "packages/gql/src/api-android.graphql", + [ + "OpenIAP availability: Spec 2.1.0 / openiap-google 2.3.0", + "requires Play Billing 9.1.0+", + ], + "Billing Choice OpenIAP-first API availability", + ); + expectIncludes( + "packages/gql/src/type-android.graphql", + [ + "OpenIAP Spec 2.1.0 / openiap-google 2.3.0", + "upstream API available since Play Billing 4.1.0", + ], + "Billing Choice OpenIAP-first type availability", + ); + expectIncludes( + ".claude/commands/e2e-tests.md", + ["cd libraries/react-native-iap", "yarn specs", "yarn lint:tsc"], + "React Native E2E Nitro generation", + ); + expectIncludes( + "packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt", + [ + "billingChoiceScreenType = config?.billingChoiceScreenTypeAndroid", + "billingChoiceScreenType != BillingChoiceScreenTypeAndroid.DeveloperRendered", + "setOriginalExternalTransactionId", + "params.externalTransactionToken", + 'getMethod("getLinkUri")', + 'getMethod("getOriginalExternalTransactionId")', + 'getMethod("getProducts")', + "?.takeIf { it.isNotBlank() }", + "DeveloperProvidedBillingProductAndroid(", + "BillingClient.BillingProgram.BILLING_CHOICE", + "BillingProgramReportingDetailsParams.DeveloperBillingType.IN_APP", + "InAppMessageParams.InAppMessageCategoryId.TRANSACTIONAL", + "pendingBillingPrograms", + "resolveBillingProgramsForConnection(", + "resolveLegacySubscriptionReplacementMode(", + ], + "Google Billing Choice field bindings", + ); + expectIncludes( + "packages/google/openiap/src/horizon/java/dev/hyo/openiap/OpenIapModule.kt", + [ + "Meta Horizon does not support Google Play Billing Program reporting details", + "Meta Horizon does not support Google Play Billing Choice", + "Meta Horizon does not support Google Play billing in-app messages", + "throw OpenIapError.MissingCurrentActivity", + ], + "Horizon unsupported Google Billing APIs", + ); + expectNotIncludes( + "packages/google/openiap/src/horizon/java/dev/hyo/openiap/OpenIapModule.kt", + [ + 'externalTransactionToken = ""', + "InAppMessageResponseCodeAndroid.NoActionNeeded", + ], + "Horizon unsupported Google Billing APIs must not report success", + ); + expectIncludes( + "packages/google/openiap/src/play/java/dev/hyo/openiap/utils/BillingResultConverters.kt", + [ + "onPurchasesUpdatedSubResponseCode.toOpenIapSubResponseCode()", + "PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS", + "USER_INELIGIBLE", + ], + "Google BillingResult sub-response mapping", + ); + expectIncludes( + "packages/google/openiap/src/testPlay/java/dev/hyo/openiap/utils/BillingResultConvertersTest.kt", + [ + "maps every Play Billing 9_1 sub-response code", + "unknown sub-response code remains absent", + ], + "Google BillingResult sub-response tests", + ); + expectIncludes( + "packages/google/openiap/src/main/java/dev/hyo/openiap/helpers/CommonHelpers.kt", + [ + "!purchaseToken.isNullOrBlank() && originalExternalTransactionId.isNullOrBlank()", + "if (hasProductLevelReplacementParams) null else replacementMode", + "pendingPrograms.filterNot { it == BillingProgramAndroid.Unspecified }", + ], + "Google developer-billed subscription replacement mode", + ); + expectIncludes( + "packages/google/openiap/src/test/java/dev/hyo/openiap/BillingChoiceAndroidTypesTest.kt", + [ + "developer billed replacement does not inject a Play replacement mode", + "pre-init billing programs survive connection config reset", + ], + "Google Billing Choice replacement tests", + ); + expectNotIncludes( + "packages/google/openiap/src/main/java/dev/hyo/openiap/OpenIapViewModel.kt", + [ + "RequestPurchasePropsByPlatforms(android =", + "RequestSubscriptionPropsByPlatforms(android =", + ], + "Google ViewModel must use canonical google request fields", + ); + + expectIncludes( + "libraries/react-native-iap/src/specs/RnIap.nitro.ts", + [ + "originalExternalTransactionId?:", + "developerBillingOption?:", + "externalTransactionToken?: string | null;", + "subResponseCode?: SubResponseCodeAndroid | null;", + ], + "RN Billing Choice native spec fields", + ); + expectIncludes( + "libraries/react-native-iap/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt", + [ + "billingChoiceScreenTypeAndroid = configValue.billingChoiceScreenTypeAndroid", + "developerBillingOption = developerBillingOption", + "originalExternalTransactionId = androidRequest.originalExternalTransactionId", + "externalTransactionToken = params.externalTransactionToken.unwrapString()", + "linkUri = details.linkUri.wrapVariant()", + "originalExternalTransactionId = details.originalExternalTransactionId.wrapVariant()", + "products = details.products.map", + "subResponseCode = mapSubResponseCode(result.subResponseCode)", + ], + "RN Billing Choice Android bridge fields", + ); + expectIncludes( + "libraries/react-native-iap/src/__tests__/index.test.ts", + [ + "passes developer-rendered Billing Choice config to native", + "forwards Billing Choice external transaction token", + "originalExternalTransactionId", + "'no-applicable-sub-response-code'", + ], + "RN Billing Choice bridge tests", + ); + expectIncludes( + "libraries/react-native-iap/src/index.ts", + ["externalTransactionToken: params.externalTransactionToken"], + "RN Billing Choice public API fields", + ); + expectIncludes( + "libraries/react-native-iap/src/hooks/useIAP.ts", + [ + "billingChoiceScreenTypeAndroid?: BillingChoiceScreenTypeAndroid", + "developerProvidedBillingListenerAndroid", + "onDeveloperProvidedBillingAndroid", + "getBillingChoiceInfoAndroid?: QueryField<'getBillingChoiceInfoAndroid'>", + "showInAppMessagesAndroid?: MutationField<'showInAppMessagesAndroid'>", + ], + "RN Billing Choice hook wiring", + ); + expectIncludes( + "libraries/react-native-iap/src/__tests__/hooks/useIAP.android.test.ts", + [ + "passes the Billing Choice renderer to initConnection on Android", + "forwards developer-provided Billing Choice events from the hook", + "exposes all Billing Choice APIs through the hook", + ], + "RN Billing Choice hook tests", + ); + + expectIncludes( + "libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapModule.kt", + [ + "InitConnectionConfig.fromJson(it)", + "developerBillingOption = parsedParams.developerBillingOption", + "originalExternalTransactionId = parsedParams.originalExternalTransactionId", + "externalTransactionToken = externalTransactionToken", + "promise.resolve(result.toJson())", + ], + "Expo Billing Choice Android bridge fields", + ); + expectIncludes( + "libraries/expo-iap/android/src/main/java/expo/modules/iap/ExpoIapHelper.kt", + ["eventDeveloperProvidedBilling", "details.toJson()"], + "Expo Billing Choice event payload", + ); + expectIncludes( + "libraries/expo-iap/src/__tests__/index.test.ts", + [ + "forwards developer-rendered Billing Choice connection config", + "originalExternalTransactionId", + ], + "Expo Billing Choice public API tests", + ); + expectIncludes( + "libraries/expo-iap/src/modules/__tests__/android.test.ts", + [ + "forwards the Billing Choice external transaction token", + "subResponseCode: 'no-applicable-sub-response-code'", + ], + "Expo Billing Choice Android API tests", + ); + expectIncludes( + "libraries/expo-iap/src/useIAP.ts", + [ + "enableBillingProgramAndroid?: BillingProgramAndroid", + "billingChoiceScreenTypeAndroid?: BillingChoiceScreenTypeAndroid", + "developerProvidedBillingListenerAndroid", + "subscriptionBillingIssueListener", + "getBillingChoiceInfoAndroid: QueryField<'getBillingChoiceInfoAndroid'>", + "showInAppMessagesAndroid: MutationField<'showInAppMessagesAndroid'>", + ], + "Expo Billing Choice hook wiring", + ); + expectIncludes( + "libraries/expo-iap/src/__tests__/useIAP.test.tsx", + [ + "forwards renderer config and billing event callbacks", + "exposes all Billing Choice APIs through the hook", + ], + "Expo Billing Choice hook tests", + ); + + expectIncludes( + "libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart", + [ + "billingChoiceScreenTypeAndroid", + "payload['originalExternalTransactionId']", + "payload['developerBillingOption']", + "'externalTransactionToken': params.externalTransactionToken", + ], + "Flutter Billing Choice Dart bridge fields", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt", + [ + 'configMap["billingChoiceScreenTypeAndroid"]', + "originalExternalTransactionId = originalExternalTransactionId", + "developerBillingOption = developerBillingOption", + "externalTransactionToken = externalTransactionToken", + 'put("subResponseCode", result.subResponseCode?.toJson())', + ], + "Flutter Billing Choice Android bridge fields", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/test/flutter_inapp_purchase_channel_test.dart", + [ + "BillingChoiceScreenTypeAndroid.DeveloperRendered", + "'originalExternalTransactionId'", + "'externalTransactionToken'", + "details.products.single.id", + "SubResponseCodeAndroid.NoApplicableSubResponseCode", + ], + "Flutter Billing Choice channel tests", + ); + + expectIncludes( + "libraries/godot-iap/addons/godot-iap/godot_iap.gd", + [ + "func get_billing_choice_info_android(params) -> Variant:", + "func show_billing_program_information_dialog_android(params) -> Variant:", + "func show_in_app_messages_android(params = null) -> Variant:", + "initConnectionWithConfig", + '"originalExternalTransactionId"', + '"developerBillingOption"', + "JSON.stringify(params.to_dict())", + ], + "Godot Billing Choice wrapper fields", + ); + expectIncludes( + "libraries/godot-iap/android/src/main/java/dev/hyo/godotiap/GodotIap.kt", + [ + "fun getBillingChoiceInfoAndroid(paramsJson: String): String", + "fun showBillingProgramInformationDialogAndroid(paramsJson: String): String", + "fun showInAppMessagesAndroid(paramsJson: String): String", + "InitConnectionConfig.fromJson(", + "addDeveloperProvidedBillingListener", + "originalExternalTransactionId = params.originalExternalTransactionId", + "externalTransactionToken = externalTransactionToken", + 'emitSignal("developer_provided_billing", JSONObject(details.toJson()).toString())', + 'put("subResponseCode", result.subResponseCode?.toJson())', + ], + "Godot Billing Choice Android bridge fields", + ); + expectIncludes( + "libraries/godot-iap/Example/tests/test_godot_iap.gd", + [ + "billing_choice_screen_type_android", + "originalExternalTransactionId", + "developerBillingOption", + ], + "Godot Billing Choice wrapper tests", + ); + expectIncludes( + "packages/docs/src/pages/docs/types/billing-programs.tsx", + ["iap.developer_provided_billing_android.connect"], + "Godot developer-provided billing docs signal", + ); + expectIncludes( + "packages/docs/src/pages/docs/types/alternative-billing-types.tsx", + ["iap.user_choice_billing_android.connect"], + "Godot user choice billing docs signal", + ); + expectIncludes( + "packages/docs/src/pages/docs/features/external-purchase.tsx", + [ + "iap.user_choice_billing_android.connect", + "iap.developer_provided_billing_android.connect", + ], + "Godot external purchase docs signals", + ); + for (const path of [ + "packages/docs/src/pages/docs/types/billing-programs.tsx", + "packages/docs/src/pages/docs/types/alternative-billing-types.tsx", + "packages/docs/src/pages/docs/features/external-purchase.tsx", + ]) { + expectNotIncludes( + path, + [ + "iap.developer_provided_billing.connect", + "iap.user_choice_billing.connect", + ], + "Godot billing docs stale signals", + ); + } + + expectIncludes( + "libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt", + [ + "billingChoiceScreenType = config?.billingChoiceScreenTypeAndroid", + "includeDeveloperListener =", + "setOriginalExternalTransactionId", + "params.externalTransactionToken", + 'getMethod("getLinkUri")', + 'getMethod("getOriginalExternalTransactionId")', + 'getMethod("getProducts")', + "?.takeIf { it.isNotBlank() }", + "subResponseCode = onPurchasesUpdatedSubResponseCode.toOpenIapSubResponseCode()", + "BillingClient.BillingProgram.BILLING_CHOICE", + "BillingProgramReportingDetailsParams.DeveloperBillingType.IN_APP", + "InAppMessageParams.InAppMessageCategoryId.TRANSACTIONAL", + "hasProductLevelReplacementParams = subscriptionProductReplacementParams != null", + "continuation.resume(false)", + ], + "KMP Billing Choice Android bindings", + ); + expectIncludes( + "libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/Helper.kt", + [ + "OnPurchasesUpdatedSubResponseCode.NO_APPLICABLE_SUB_RESPONSE_CODE", + "OnPurchasesUpdatedSubResponseCode.PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS", + "OnPurchasesUpdatedSubResponseCode.USER_INELIGIBLE", + ], + "KMP BillingResult sub-response mapping", + ); + expectIncludes( + "libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/BillingResultMappingTest.kt", + [ + "maps every Play Billing 9_1 sub-response code", + "unknown sub-response code remains absent", + ], + "KMP BillingResult sub-response tests", + ); + expectIncludes( + "libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/AmazonInAppPurchaseAndroid.kt", + [ + 'failUnsupported("Google Play billing in-app messages are unavailable on $storeName.")', + ], + "KMP non-Play in-app message behavior", + ); + expectNotIncludes( + "libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/AmazonInAppPurchaseAndroid.kt", + ["InAppMessageResponseCodeAndroid.NoActionNeeded"], + "KMP non-Play in-app messages must not report success", + ); + expectIncludes( + "libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/UnsupportedGoogleApisTest.kt", + [ + "non-Play stores reject Google in-app messages", + "ErrorCode.FeatureNotSupported", + ], + "KMP non-Play in-app message tests", + ); + expectIncludes( + "libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/SubscriptionReplacementResolutionTest.kt", + [ + "legacy replacement mode follows native Google precedence", + "hasProductLevelReplacementParams = true", + ], + "KMP subscription replacement precedence tests", + ); + expectIncludes( + "packages/docs/src/pages/docs/updates/releases.tsx", + [ + "Horizon uses Billing Compatibility SDK 2.0.0", + "com.meta.horizon.platform.HORIZON_APP_ID", + ], + "Horizon 2.0 release notes", + ); + expectIncludes( + "packages/google/openiap/src/horizon/java/dev/hyo/openiap/OpenIapModule.kt", + [ + "com.meta.horizon.platform.HORIZON_APP_ID", + "com.meta.horizon.platform.ovr.OCULUS_APP_ID", + "com.meta.horizon.platform.ovr.HORIZON_APP_ID", + "com.oculus.vr.APP_ID", + "resolveHorizonAppId(appInfo.metaData)", + ], + "Horizon App ID canonical and migration keys", + ); + expectIncludes( + "packages/google/openiap/src/testHorizon/java/dev/hyo/openiap/HorizonAppIdMetadataTest.kt", + [ + "canonical Horizon 2 key takes precedence over legacy metadata", + "blank canonical key falls back through every historical key", + "missing or blank Horizon metadata resolves to null", + ], + "Horizon App ID metadata tests", + ); + expectIncludes( + "libraries/expo-iap/plugin/src/withIAP.ts", + [ + "com.meta.horizon.platform.HORIZON_APP_ID", + "LEGACY_HORIZON_APP_ID_META_DATA_NAMES", + ], + "Expo Horizon App ID canonical metadata", + ); + for (const file of [ + "packages/google/Example/src/main/AndroidManifest.xml", + "libraries/react-native-iap/example/android/app/src/main/AndroidManifest.xml", + "libraries/flutter_inapp_purchase/example/android/app/src/main/AndroidManifest.xml", + "packages/docs/src/pages/docs/setup/store/horizon.tsx", + ]) { + expectIncludes( + file, + ["com.meta.horizon.platform.HORIZON_APP_ID"], + "Horizon App ID canonical setup", + ); + expectNotIncludes( + file, + [ + "com.meta.horizon.platform.ovr.OCULUS_APP_ID", + "com.meta.horizon.platform.ovr.HORIZON_APP_ID", + ], + "Horizon setup must not recommend legacy metadata keys", + ); + } + expectNotIncludes( + "libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt", + ["Full implementation uses Google Play Billing Library 8.2.1"], + "KMP Play Billing runtime documentation", + ); + expectIncludes( + "libraries/kmp-iap/library/src/commonMain/kotlin/io/github/hyochan/kmpiap/dsl/PurchaseDsl.kt", + [ + "originalExternalTransactionId", + "developerBillingOption", + "subscriptionProductReplacementParams", + ], + "KMP Billing Choice purchase DSL fields", + ); + + expectIncludes( + "libraries/maui-iap/android/openiap/src/main/java/dev/hyo/openiap/maui/OpenIapMauiModule.kt", + [ + "fun getBillingChoiceInfoAndroid(paramsJson: String, callback: ResultCallback)", + "fun showBillingProgramInformationDialogAndroid(paramsJson: String, callback: ResultCallback)", + "fun showInAppMessagesAndroid(paramsJson: String?, callback: ResultCallback)", + "InitConnectionConfig.fromJson(parseMap(it))", + "RequestPurchaseProps.fromJson(parseMap(paramsJson))", + "LaunchExternalLinkParamsAndroid.fromJson(parseMap(paramsJson))", + "gson.toJson(details.toJson())", + "gson.toJson(module.showBillingProgramInformationDialog(activity, params).toJson())", + ], + "MAUI Billing Choice Kotlin JSON bridge", + ); + expectIncludes( + "libraries/maui-iap/src/OpenIap.Maui/Platforms/Android/OpenIapAndroid.Resolvers.cs", + [ + "GetBillingChoiceInfoAndroidAsync(GetBillingChoiceInfoParamsAndroid @params)", + "ShowBillingProgramInformationDialogAndroidAsync(BillingProgramInformationDialogParamsAndroid @params)", + "ShowInAppMessagesAndroidAsync(InAppMessageParamsAndroid? @params = null)", + "JsonSerializer.Serialize(config, JsonOptions.Default)", + "JsonSerializer.Serialize(@params, JsonOptions.Default)", + ], + "MAUI Billing Choice C# JSON bridge", + ); + expectIncludes( + "libraries/maui-iap/src/OpenIap.Maui/Platforms/Android/OpenIapAndroid.cs", + ["JsonSerializer.Deserialize"], + "MAUI Billing Choice event payload", + ); +} + +function checkFrameworkDependencyHygiene() { + const versions = readJson("openiap-versions.json"); + const googleVersion = versions.google; + if (typeof googleVersion !== "string" || googleVersion.length === 0) { + fail("openiap-versions.json is missing a google version"); + } + const googleBuildGradle = read("packages/google/openiap/build.gradle.kts"); + const googleCoroutineVersions = uniqueMatches( + googleBuildGradle, + /val\s+coroutinesVersion\s*=\s*"([^"]+)"/g, + ); + if (googleCoroutineVersions.length !== 1) { + fail( + `packages/google must use one Kotlinx Coroutines version, found: ${googleCoroutineVersions.join(", ") || "(none)"}`, + ); + } + const googleCoroutinesVersion = googleCoroutineVersions[0]; + + for (const [packagePath, versionKey] of [ + ["packages/gql/package.json", "spec"], + ["packages/docs/package.json", "spec"], + ["packages/google/package.json", "google"], + ["packages/apple/package.json", "apple"], + ]) { + const packageVersion = readJson(packagePath).version; + if (packageVersion !== versions[versionKey]) { + fail( + `${packagePath} version ${packageVersion} must match openiap-versions.json ${versionKey} ${versions[versionKey]}`, + ); + } + } + expectSymlinkTarget( + "packages/apple/Sources/openiap-versions.json", + "../../../openiap-versions.json", + "Apple package version SSOT link", + ); + expectSymlinkTarget( + "packages/google/openiap-versions.json", + "../../openiap-versions.json", + "Google package version SSOT link", + ); + for (const libraryVersionLink of [ + "libraries/react-native-iap/openiap-versions.json", + "libraries/expo-iap/openiap-versions.json", + "libraries/flutter_inapp_purchase/openiap-versions.json", + "libraries/godot-iap/openiap-versions.json", + "libraries/kmp-iap/openiap-versions.json", + "libraries/maui-iap/openiap-versions.json", + ]) { + expectSymlinkTarget( + libraryVersionLink, + "../../openiap-versions.json", + `${libraryVersionLink} version SSOT link`, + ); + } + expectFile("packages/docs/openiap-versions.json"); + if ( + exists("packages/docs/openiap-versions.json") && + fs.lstatSync(abs("packages/docs/openiap-versions.json")).isSymbolicLink() + ) { + fail( + "packages/docs/openiap-versions.json must be a real file for Vercel deployment", + ); + } + expectSameFile( + "openiap-versions.json", + "packages/docs/openiap-versions.json", + "Docs package version copy", + ); + expectSymlinkTarget( + "llms.txt", + "packages/docs/public/llms.txt", + "Root llms.txt", + ); + expectSymlinkTarget( + "llms-full.txt", + "packages/docs/public/llms-full.txt", + "Root llms-full.txt", + ); + for (const docsLlmsFile of [ + "packages/docs/public/llms.txt", + "packages/docs/public/llms-full.txt", ]) { expectFile(docsLlmsFile); - if (exists(docsLlmsFile) && fs.lstatSync(abs(docsLlmsFile)).isSymbolicLink()) { + if ( + exists(docsLlmsFile) && + fs.lstatSync(abs(docsLlmsFile)).isSymbolicLink() + ) { fail(`${docsLlmsFile} must be a real file for docs deployment`); } } - expectFile('packages/docs/src/generated/version-metadata.json'); - if (exists('packages/docs/src/generated/version-metadata.json')) { - const docsVersionMetadata = readJson('packages/docs/src/generated/version-metadata.json'); + expectFile("packages/docs/src/generated/version-metadata.json"); + if (exists("packages/docs/src/generated/version-metadata.json")) { + const docsVersionMetadata = readJson( + "packages/docs/src/generated/version-metadata.json", + ); const expectedDocsVersionMetadata = { - _generatedBy: 'scripts/sync-versions.sh', - expoPackageVersion: readJson('libraries/expo-iap/package.json').version, - reactNativePackageVersion: readJson('libraries/react-native-iap/package.json').version, - flutterPackageVersion: read('libraries/flutter_inapp_purchase/pubspec.yaml') + _generatedBy: "scripts/sync-versions.sh", + expoPackageVersion: readJson("libraries/expo-iap/package.json").version, + reactNativePackageVersion: readJson( + "libraries/react-native-iap/package.json", + ).version, + flutterPackageVersion: read( + "libraries/flutter_inapp_purchase/pubspec.yaml", + ) .match(/^version:\s*(.+)$/m)?.[1] ?.trim(), - godotPackageVersion: read('libraries/godot-iap/addons/godot-iap/plugin.cfg') + godotPackageVersion: read( + "libraries/godot-iap/addons/godot-iap/plugin.cfg", + ) .match(/^version="([^"]+)"$/m)?.[1] ?.trim(), - kmpPackageVersion: read('libraries/kmp-iap/gradle.properties') + kmpPackageVersion: read("libraries/kmp-iap/gradle.properties") .match(/^libraryVersion=(.+)$/m)?.[1] ?.trim(), - mauiPackageId: read('libraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csproj') + mauiPackageId: read( + "libraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csproj", + ) .match(/([^<]+)<\/PackageId>/)?.[1] ?.trim(), - mauiPackageVersion: read('libraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csproj') + mauiPackageVersion: read( + "libraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csproj", + ) .match(/([^<]+)<\/PackageVersion>/)?.[1] ?.trim(), - googleCompileSdk: read('packages/google/openiap/build.gradle.kts') - .match(/compileSdk\s*=\s*(\d+)/)?.[1], - googleMinSdk: read('packages/google/openiap/build.gradle.kts') - .match(/minSdk\s*=\s*(\d+)/)?.[1], - googlePlayBillingVersion: read('packages/google/openiap/build.gradle.kts') - .match(/val\s+playBillingVersion\s*=\s*"([^"]+)"/)?.[1], - kmpCompileSdk: read('libraries/kmp-iap/gradle/libs.versions.toml') - .match(/^android-compileSdk = "([^"]+)"/m)?.[1], - kmpMinSdk: read('libraries/kmp-iap/gradle/libs.versions.toml') - .match(/^android-minSdk = "([^"]+)"/m)?.[1], - kmpTargetSdk: read('libraries/kmp-iap/gradle/libs.versions.toml') - .match(/^android-targetSdk = "([^"]+)"/m)?.[1], + googleCompileSdk: read("packages/google/openiap/build.gradle.kts").match( + /compileSdk\s*=\s*(\d+)/, + )?.[1], + googleMinSdk: read("packages/google/openiap/build.gradle.kts").match( + /minSdk\s*=\s*(\d+)/, + )?.[1], + googlePlayBillingVersion: read( + "packages/google/openiap/build.gradle.kts", + ).match(/val\s+playBillingVersion\s*=\s*"([^"]+)"/)?.[1], + kmpCompileSdk: read("libraries/kmp-iap/gradle/libs.versions.toml").match( + /^android-compileSdk = "([^"]+)"/m, + )?.[1], + kmpMinSdk: read("libraries/kmp-iap/gradle/libs.versions.toml").match( + /^android-minSdk = "([^"]+)"/m, + )?.[1], + kmpTargetSdk: read("libraries/kmp-iap/gradle/libs.versions.toml").match( + /^android-targetSdk = "([^"]+)"/m, + )?.[1], }; - for (const [key, expectedValue] of Object.entries(expectedDocsVersionMetadata)) { + for (const [key, expectedValue] of Object.entries( + expectedDocsVersionMetadata, + )) { if (docsVersionMetadata[key] !== expectedValue) { - fail(`packages/docs/src/generated/version-metadata.json ${key} must be synced from SSOT metadata`); + fail( + `packages/docs/src/generated/version-metadata.json ${key} must be synced from SSOT metadata`, + ); } } } - expectIncludes('packages/apple/README.md', [ - '.package(url: "https://github.com/hyodotdev/openiap.git", from: "")', - "pod 'openiap', '~> '", - 'Use the latest version from the Swift Package / CocoaPods badges above.', - ], 'Apple README install version'); - expectIncludes('packages/google/README.md', [ - 'implementation("io.github.hyochan.openiap:openiap-google:")', - 'https://central.sonatype.com/artifact/io.github.hyochan.openiap/openiap-google', - ], 'Google README install version'); - expectIncludes('packages/docs/src/lib/versioning.ts', [ - "type VersionKey = 'spec' | 'google' | 'apple';", - "'spec'", - "'google'", - "'apple'", - "../generated/version-metadata.json", - 'expoPackageVersion', - 'reactNativePackageVersion', - 'godotPackageVersion', - 'EXPO_PACKAGE_VERSION', - 'REACT_NATIVE_PACKAGE_VERSION', - 'GODOT_PACKAGE_VERSION', - 'dependencyLine: `"expo-iap": "^${EXPO_PACKAGE_VERSION}"`', - ], 'docs versioning keys'); - expectNotIncludes('packages/docs/src/lib/versioning.ts', [ - '../../../../libraries/', - '../../../../packages/', - ], 'docs versioning must not import files outside packages/docs because Vercel uploads the docs package root'); - expectIncludes('packages/docs/src/lib/images.ts', [ - 'EXPO_PACKAGE.installCommand', - 'REACT_NATIVE_PACKAGE.installCommand', - 'GODOT_PACKAGE.releaseUrl', - ], 'docs library metadata must derive framework package versions from metadata'); - expectIncludes('packages/docs/src/pages/docs/setup/expo.tsx', [ - 'EXPO_PACKAGE.dependencyLine', - ], 'Expo docs package.json example must derive package version from package metadata'); - expectNotIncludes('packages/docs/src/pages/docs/setup/expo.tsx', [ - '"expo-iap": "latest"', - ], 'Expo docs package.json example must not use a floating latest version'); - expectIncludes('packages/docs/src/pages/docs/android-setup.tsx', [ - 'OPENIAP_VERSIONS.google', - ], 'Android setup docs install version'); - expectNotIncludes('packages/apple/README.md', [ - '$version', - `from: "${versions.apple}"`, - `pod 'openiap', '~> ${versions.apple}'`, - ], 'Apple README install version must not be inline hardcoded'); - expectNotIncludes('packages/google/README.md', [ - '$version', - `openiap-google:${versions.google}`, - ], 'Google README install version must not be inline hardcoded'); + expectIncludes( + "packages/apple/README.md", + [ + '.package(url: "https://github.com/hyodotdev/openiap.git", from: "")', + "pod 'openiap', '~> '", + "Use the latest version from the Swift Package / CocoaPods badges above.", + ], + "Apple README install version", + ); + expectIncludes( + "packages/google/README.md", + [ + 'implementation("io.github.hyochan.openiap:openiap-google:")', + "https://central.sonatype.com/artifact/io.github.hyochan.openiap/openiap-google", + ], + "Google README install version", + ); + expectIncludes( + "packages/docs/src/lib/versioning.ts", + [ + "type VersionKey = 'spec' | 'google' | 'apple';", + "'spec'", + "'google'", + "'apple'", + "../generated/version-metadata.json", + "expoPackageVersion", + "reactNativePackageVersion", + "godotPackageVersion", + "EXPO_PACKAGE_VERSION", + "REACT_NATIVE_PACKAGE_VERSION", + "GODOT_PACKAGE_VERSION", + 'dependencyLine: `"expo-iap": "^${EXPO_PACKAGE_VERSION}"`', + ], + "docs versioning keys", + ); + expectNotIncludes( + "packages/docs/src/lib/versioning.ts", + ["../../../../libraries/", "../../../../packages/"], + "docs versioning must not import files outside packages/docs because Vercel uploads the docs package root", + ); + expectIncludes( + "packages/docs/src/lib/images.ts", + [ + "EXPO_PACKAGE.installCommand", + "REACT_NATIVE_PACKAGE.installCommand", + "GODOT_PACKAGE.releaseUrl", + ], + "docs library metadata must derive framework package versions from metadata", + ); + expectIncludes( + "packages/docs/src/pages/docs/setup/expo.tsx", + ["EXPO_PACKAGE.dependencyLine"], + "Expo docs package.json example must derive package version from package metadata", + ); + expectNotIncludes( + "packages/docs/src/pages/docs/setup/expo.tsx", + ['"expo-iap": "latest"'], + "Expo docs package.json example must not use a floating latest version", + ); + expectIncludes( + "packages/docs/src/pages/docs/android-setup.tsx", + ["OPENIAP_VERSIONS.google"], + "Android setup docs install version", + ); + expectNotIncludes( + "packages/apple/README.md", + [ + "$version", + `from: "${versions.apple}"`, + `pod 'openiap', '~> ${versions.apple}'`, + ], + "Apple README install version must not be inline hardcoded", + ); + expectNotIncludes( + "packages/google/README.md", + ["$version", `openiap-google:${versions.google}`], + "Google README install version must not be inline hardcoded", + ); for (const localPathFile of [ - 'knowledge/internal/07-docs-consistency.md', - 'libraries/kmp-iap/example/run-ios.sh', + "knowledge/internal/07-docs-consistency.md", + "libraries/kmp-iap/example/run-ios.sh", ]) { - expectNotIncludes(localPathFile, [ - '/Users/', - '/home/', - 'C:\\', - ], 'tracked scripts/docs must not contain local absolute paths'); - } - expectOptionalNotIncludes('libraries/expo-iap/example/android/settings.gradle', [ - '/Users/', - '/home/', - 'C:\\', - ], 'tracked scripts/docs must not contain local absolute paths'); + expectNotIncludes( + localPathFile, + ["/Users/", "/home/", "C:\\"], + "tracked scripts/docs must not contain local absolute paths", + ); + } + expectOptionalNotIncludes( + "libraries/expo-iap/example/android/settings.gradle", + ["/Users/", "/home/", "C:\\"], + "tracked scripts/docs must not contain local absolute paths", + ); for (const canonicalUrlFile of [ - 'scripts/audit-docs.ts', - 'libraries/expo-iap/CLAUDE.md', - 'libraries/flutter_inapp_purchase/CLAUDE.md', - 'libraries/kmp-iap/CLAUDE.md', - 'libraries/react-native-iap/CLAUDE.md', - 'libraries/react-native-iap/src/index.ts', - 'libraries/react-native-iap/src/hooks/useIAP.ts', - 'libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart', - 'libraries/godot-iap/addons/godot-iap/godot_iap.gd', - 'libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt', - 'libraries/kmp-iap/library/src/iosMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseIOS.kt', - 'packages/apple/Sources/OpenIapModule.swift', - 'packages/google/openiap/src/main/java/dev/hyo/openiap/store/OpenIapStore.kt', + "scripts/audit-docs.ts", + "libraries/expo-iap/CLAUDE.md", + "libraries/flutter_inapp_purchase/CLAUDE.md", + "libraries/kmp-iap/CLAUDE.md", + "libraries/react-native-iap/CLAUDE.md", + "libraries/react-native-iap/src/index.ts", + "libraries/react-native-iap/src/hooks/useIAP.ts", + "libraries/flutter_inapp_purchase/lib/flutter_inapp_purchase.dart", + "libraries/godot-iap/addons/godot-iap/godot_iap.gd", + "libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt", + "libraries/kmp-iap/library/src/iosMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseIOS.kt", + "packages/apple/Sources/OpenIapModule.swift", + "packages/google/openiap/src/main/java/dev/hyo/openiap/store/OpenIapStore.kt", ]) { - expectNotIncludes(canonicalUrlFile, [ - 'https://www.openiap.dev', - ], `${canonicalUrlFile} must use canonical OpenIAP URLs`); - } - expectIncludes('packages/docs/src/lib/images.ts', [ - "documentationUrl: 'https://openiap.dev/docs/setup/expo'", - "documentationUrl: 'https://openiap.dev/docs/setup/react-native'", - "documentationUrl: 'https://openiap.dev/docs/setup/flutter'", - "documentationUrl: 'https://openiap.dev/docs/setup/kmp'", - "documentationUrl: 'https://openiap.dev/docs/setup/godot'", - ], 'docs library cards should point at OpenIAP setup docs'); - expectNotIncludes('packages/docs/src/lib/images.ts', [ - "documentationUrl: 'https://hyochan.github.io/expo-iap'", - "documentationUrl: 'https://hyochan.github.io/react-native-iap'", - "documentationUrl: 'https://hyochan.github.io/flutter_inapp_purchase'", - "documentationUrl: 'https://hyochan.github.io/kmp-iap'", - "documentationUrl: 'https://hyochan.github.io/godot-iap'", - ], 'docs library cards must not point at legacy standalone docs'); - expectIncludes('CHANGELOG.md', [ - 'https://openiap.dev/docs/updates/releases', - 'https://github.com/hyodotdev/openiap/releases', - ], 'root changelog should point at OpenIAP release SSOT'); - expectNotIncludes('CHANGELOG.md', [ - 'https://www.openiap.dev/docs/updates/notes', - ], 'root changelog must not point at redirected release notes URL'); - expectIncludes('libraries/expo-iap/README.md', [ - 'https://openiap.dev/frameworks/expo.svg', - 'https://openiap.dev/docs/setup/expo', - 'https://openiap.dev/docs/guides/ai-assistants', - 'https://openiap.dev/llms.txt', - 'https://openiap.dev/docs/setup/store/onside', - 'https://github.com/hyodotdev/openiap/discussions/categories/expo-iap', - 'https://openiap.dev/sponsors/nami.webp', - 'https://openiap.dev/sponsors/courier.webp', - ], 'Expo README docs links'); - expectIncludes('libraries/expo-iap/CONTRIBUTING.md', [ - 'https://openiap.dev/docs/setup/expo', - 'https://openiap.dev/docs/apis', - ], 'Expo contributing docs links'); - expectIncludes('libraries/expo-iap/src/index.ts', [ - 'https://openiap.dev/docs/apis/request-purchase', - ], 'Expo runtime docs links'); - expectIncludes('libraries/expo-iap/src/useIAP.ts', [ - 'https://openiap.dev/docs/setup/expo#useIAP-hook', - 'https://openiap.dev/docs/apis/request-purchase', - ], 'Expo useIAP docs links'); - expectNotIncludes('libraries/expo-iap/README.md', [ - '](https://hyochan.github.io/expo-iap', - 'https://hyochan.github.io/expo-iap/guides', - 'https://hyochan.github.io/expo-iap/llms', - 'https://hyochan.github.io/expo-iap/getting-started', - 'https://github.com/hyochan/expo-iap/discussions/143', - 'https://github.com/hyochan/react-native-iap/discussions/2754', - 'https://github.com/hyochan/react-native-iap/assets', - 'https://github.com/user-attachments/assets/319d8966-6839-498d-8ead-ce8cc72c3bca', - 'https://www.openiap.dev', - ], 'Expo README must not point at legacy standalone docs'); - expectIncludes('libraries/expo-iap/CHANGELOG.md', [ - 'https://openiap.dev/docs/updates/releases', - 'https://github.com/hyodotdev/openiap/releases?q=expo-iap&expanded=true', - ], 'Expo changelog release SSOT links'); - expectNotIncludes('libraries/expo-iap/CHANGELOG.md', [ - 'github.com/hyochan/expo-iap', - ], 'Expo changelog must not point at the legacy standalone repository'); + expectNotIncludes( + canonicalUrlFile, + ["https://www.openiap.dev"], + `${canonicalUrlFile} must use canonical OpenIAP URLs`, + ); + } + expectIncludes( + "packages/docs/src/lib/images.ts", + [ + "documentationUrl: 'https://openiap.dev/docs/setup/expo'", + "documentationUrl: 'https://openiap.dev/docs/setup/react-native'", + "documentationUrl: 'https://openiap.dev/docs/setup/flutter'", + "documentationUrl: 'https://openiap.dev/docs/setup/kmp'", + "documentationUrl: 'https://openiap.dev/docs/setup/godot'", + ], + "docs library cards should point at OpenIAP setup docs", + ); + expectNotIncludes( + "packages/docs/src/lib/images.ts", + [ + "documentationUrl: 'https://hyochan.github.io/expo-iap'", + "documentationUrl: 'https://hyochan.github.io/react-native-iap'", + "documentationUrl: 'https://hyochan.github.io/flutter_inapp_purchase'", + "documentationUrl: 'https://hyochan.github.io/kmp-iap'", + "documentationUrl: 'https://hyochan.github.io/godot-iap'", + ], + "docs library cards must not point at legacy standalone docs", + ); + expectIncludes( + "CHANGELOG.md", + [ + "https://openiap.dev/docs/updates/releases", + "https://github.com/hyodotdev/openiap/releases", + ], + "root changelog should point at OpenIAP release SSOT", + ); + expectNotIncludes( + "CHANGELOG.md", + ["https://www.openiap.dev/docs/updates/notes"], + "root changelog must not point at redirected release notes URL", + ); + expectIncludes( + "libraries/expo-iap/README.md", + [ + "https://openiap.dev/frameworks/expo.svg", + "https://openiap.dev/docs/setup/expo", + "https://openiap.dev/docs/guides/ai-assistants", + "https://openiap.dev/llms.txt", + "https://openiap.dev/docs/setup/store/onside", + "https://github.com/hyodotdev/openiap/discussions/categories/expo-iap", + "https://openiap.dev/sponsors/nami.webp", + "https://openiap.dev/sponsors/courier.webp", + ], + "Expo README docs links", + ); + expectIncludes( + "libraries/expo-iap/CONTRIBUTING.md", + ["https://openiap.dev/docs/setup/expo", "https://openiap.dev/docs/apis"], + "Expo contributing docs links", + ); + expectIncludes( + "libraries/expo-iap/src/index.ts", + ["https://openiap.dev/docs/apis/request-purchase"], + "Expo runtime docs links", + ); + expectIncludes( + "libraries/expo-iap/src/useIAP.ts", + [ + "https://openiap.dev/docs/setup/expo#useIAP-hook", + "https://openiap.dev/docs/apis/request-purchase", + ], + "Expo useIAP docs links", + ); + expectNotIncludes( + "libraries/expo-iap/README.md", + [ + "](https://hyochan.github.io/expo-iap", + "https://hyochan.github.io/expo-iap/guides", + "https://hyochan.github.io/expo-iap/llms", + "https://hyochan.github.io/expo-iap/getting-started", + "https://github.com/hyochan/expo-iap/discussions/143", + "https://github.com/hyochan/react-native-iap/discussions/2754", + "https://github.com/hyochan/react-native-iap/assets", + "https://github.com/user-attachments/assets/319d8966-6839-498d-8ead-ce8cc72c3bca", + "https://www.openiap.dev", + ], + "Expo README must not point at legacy standalone docs", + ); + expectIncludes( + "libraries/expo-iap/CHANGELOG.md", + [ + "https://openiap.dev/docs/updates/releases", + "https://github.com/hyodotdev/openiap/releases?q=expo-iap&expanded=true", + ], + "Expo changelog release SSOT links", + ); + expectNotIncludes( + "libraries/expo-iap/CHANGELOG.md", + ["github.com/hyochan/expo-iap"], + "Expo changelog must not point at the legacy standalone repository", + ); for (const expoDocsFile of [ - 'libraries/expo-iap/CONTRIBUTING.md', - 'libraries/expo-iap/src/index.ts', - 'libraries/expo-iap/src/useIAP.ts', - 'libraries/expo-iap/src/modules/android.ts', - 'libraries/expo-iap/src/modules/ios.ts', + "libraries/expo-iap/CONTRIBUTING.md", + "libraries/expo-iap/src/index.ts", + "libraries/expo-iap/src/useIAP.ts", + "libraries/expo-iap/src/modules/android.ts", + "libraries/expo-iap/src/modules/ios.ts", ]) { - expectNotIncludes(expoDocsFile, [ - 'hyochan.github.io/expo-iap', - 'https://www.openiap.dev', - ], `${expoDocsFile} must not point at legacy standalone docs`); - } - expectIncludes('libraries/react-native-iap/README.md', [ - 'https://openiap.dev/frameworks/react-native.webp', - 'https://openiap.dev/docs/setup/react-native', - 'https://openiap.dev/docs/guides/ai-assistants', - 'https://openiap.dev/llms.txt', - 'https://openiap.dev/docs/apis', - 'https://openiap.dev/docs/errors', - 'https://openiap.dev/sponsors/nami.webp', - 'https://openiap.dev/sponsors/courier.webp', - ], 'React Native README docs links'); - expectIncludes('libraries/react-native-iap/CONTRIBUTING.md', [ - 'https://openiap.dev/docs/setup/react-native', - ], 'React Native contributing docs links'); - expectNotIncludes('libraries/react-native-iap/README.md', [ - '](https://hyochan.github.io/react-native-iap', - 'https://hyochan.github.io/react-native-iap/docs', - 'https://hyochan.github.io/react-native-iap/llms', - 'https://github.com/hyochan/react-native-iap/assets', - 'https://github.com/user-attachments/assets/319d8966-6839-498d-8ead-ce8cc72c3bca', - 'https://www.openiap.dev', - ], 'React Native README must not point at legacy standalone docs'); - expectIncludes('libraries/react-native-iap/CHANGELOG.md', [ - 'https://openiap.dev/docs/updates/releases', - 'https://github.com/hyodotdev/openiap/releases?q=react-native-iap&expanded=true', - ], 'React Native changelog release SSOT links'); - expectNotIncludes('libraries/react-native-iap/CHANGELOG.md', [ - 'github.com/hyochan/react-native-iap', - ], 'React Native changelog must not point at the legacy standalone repository'); - expectNotIncludes('libraries/react-native-iap/CONTRIBUTING.md', [ - 'hyochan.github.io/react-native-iap', - 'Recent highlights (', - 'OpenIAP to `~>', - ], 'React Native contributing must not point at legacy standalone docs'); - expectIncludes('libraries/react-native-iap/scripts/ci-check.sh', [ - 'run_check()', - 'run_check "📦 Installing dependencies..."', - 'run_check "🧪 Running tests..."', - ], 'React Native local CI script should use shared check helper'); - expectNotIncludes('libraries/react-native-iap/scripts/ci-check.sh', [ - 'if [ $? -ne 0 ]; then', - ], 'React Native local CI script should not repeat exit-code checks'); - expectIncludes('libraries/flutter_inapp_purchase/README.md', [ - 'https://openiap.dev/frameworks/flutter.svg', - 'https://openiap.dev/docs/setup/flutter', - 'https://openiap.dev/docs/guides/ai-assistants', - 'https://openiap.dev/llms.txt', - ], 'Flutter README docs links'); - expectIncludes('libraries/flutter_inapp_purchase/CONTRIBUTING.md', [ - 'https://github.com/hyodotdev/openiap/discussions', - ], 'Flutter contributing discussion links'); - expectNotIncludes('libraries/flutter_inapp_purchase/README.md', [ - '](https://hyochan.github.io/flutter_inapp_purchase', - 'https://hyochan.github.io/flutter_inapp_purchase/docs', - 'https://hyochan.github.io/flutter_inapp_purchase/llms', - ], 'Flutter README must not point at legacy standalone docs'); - expectNotIncludes('libraries/flutter_inapp_purchase/CONTRIBUTING.md', [ - 'github.com/hyochan/openiap.dev', - ], 'Flutter contributing links must point at the monorepo'); - expectIncludes('libraries/flutter_inapp_purchase/CHANGELOG.md', [ - 'https://openiap.dev/docs/updates/releases', - 'https://github.com/hyodotdev/openiap/releases?q=flutter-iap&expanded=true', - ], 'Flutter changelog release SSOT links'); + expectNotIncludes( + expoDocsFile, + ["hyochan.github.io/expo-iap", "https://www.openiap.dev"], + `${expoDocsFile} must not point at legacy standalone docs`, + ); + } + expectIncludes( + "libraries/react-native-iap/README.md", + [ + "https://openiap.dev/frameworks/react-native.webp", + "https://openiap.dev/docs/setup/react-native", + "https://openiap.dev/docs/guides/ai-assistants", + "https://openiap.dev/llms.txt", + "https://openiap.dev/docs/apis", + "https://openiap.dev/docs/errors", + "https://openiap.dev/sponsors/nami.webp", + "https://openiap.dev/sponsors/courier.webp", + ], + "React Native README docs links", + ); + expectIncludes( + "libraries/react-native-iap/CONTRIBUTING.md", + ["https://openiap.dev/docs/setup/react-native"], + "React Native contributing docs links", + ); + expectNotIncludes( + "libraries/react-native-iap/README.md", + [ + "](https://hyochan.github.io/react-native-iap", + "https://hyochan.github.io/react-native-iap/docs", + "https://hyochan.github.io/react-native-iap/llms", + "https://github.com/hyochan/react-native-iap/assets", + "https://github.com/user-attachments/assets/319d8966-6839-498d-8ead-ce8cc72c3bca", + "https://www.openiap.dev", + ], + "React Native README must not point at legacy standalone docs", + ); + expectIncludes( + "libraries/react-native-iap/CHANGELOG.md", + [ + "https://openiap.dev/docs/updates/releases", + "https://github.com/hyodotdev/openiap/releases?q=react-native-iap&expanded=true", + ], + "React Native changelog release SSOT links", + ); + expectNotIncludes( + "libraries/react-native-iap/CHANGELOG.md", + ["github.com/hyochan/react-native-iap"], + "React Native changelog must not point at the legacy standalone repository", + ); + expectNotIncludes( + "libraries/react-native-iap/CONTRIBUTING.md", + [ + "hyochan.github.io/react-native-iap", + "Recent highlights (", + "OpenIAP to `~>", + ], + "React Native contributing must not point at legacy standalone docs", + ); + expectIncludes( + "libraries/react-native-iap/scripts/ci-check.sh", + [ + "run_check()", + 'run_check "📦 Installing dependencies..."', + 'run_check "🧪 Running tests..."', + ], + "React Native local CI script should use shared check helper", + ); + expectNotIncludes( + "libraries/react-native-iap/scripts/ci-check.sh", + ["if [ $? -ne 0 ]; then"], + "React Native local CI script should not repeat exit-code checks", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/README.md", + [ + "https://openiap.dev/frameworks/flutter.svg", + "https://openiap.dev/docs/setup/flutter", + "https://openiap.dev/docs/guides/ai-assistants", + "https://openiap.dev/llms.txt", + ], + "Flutter README docs links", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/CONTRIBUTING.md", + ["https://github.com/hyodotdev/openiap/discussions"], + "Flutter contributing discussion links", + ); + expectNotIncludes( + "libraries/flutter_inapp_purchase/README.md", + [ + "](https://hyochan.github.io/flutter_inapp_purchase", + "https://hyochan.github.io/flutter_inapp_purchase/docs", + "https://hyochan.github.io/flutter_inapp_purchase/llms", + ], + "Flutter README must not point at legacy standalone docs", + ); + expectNotIncludes( + "libraries/flutter_inapp_purchase/CONTRIBUTING.md", + ["github.com/hyochan/openiap.dev"], + "Flutter contributing links must point at the monorepo", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/CHANGELOG.md", + [ + "https://openiap.dev/docs/updates/releases", + "https://github.com/hyodotdev/openiap/releases?q=flutter-iap&expanded=true", + ], + "Flutter changelog release SSOT links", + ); expectNoMatch( - 'libraries/flutter_inapp_purchase/CHANGELOG.md', + "libraries/flutter_inapp_purchase/CHANGELOG.md", /^## 9\.[^\r\n]*\r?\n\r?\n- Initial release\r?$/m, - 'Flutter v9 changelog entries must not be placeholders', - ); - expectIncludes('.github/workflows/release-flutter.yml', [ - 'flutter-iap-$PREV_VERSION', - 'CONSOLIDATED_RELEASE_NOTES="https://openiap.dev/docs/updates/releases"', - ], 'Flutter release workflow should generate changelog entries from prefixed tags'); - expectIncludes('libraries/godot-iap/README.md', [ - 'https://openiap.dev/docs/setup/godot', - 'https://openiap.dev/docs/guides/ai-assistants', - 'https://openiap.dev/llms.txt', - 'https://openiap.dev/docs/apis', - 'https://openiap.dev/docs/example', - '[LICENSE](../../LICENSE)', - ], 'Godot README docs links'); - expectIncludes('libraries/godot-iap/CONTRIBUTING.md', [ - 'https://github.com/hyodotdev/openiap/issues', - 'https://openiap.dev/docs/setup/godot', - ], 'Godot contributing docs links'); - expectIncludes('libraries/godot-iap/EXAMPLES.md', [ - 'https://openiap.dev/docs/setup/godot', - 'https://openiap.dev/docs/apis', - ], 'Godot examples docs links'); + "Flutter v9 changelog entries must not be placeholders", + ); + expectIncludes( + ".github/workflows/release-flutter.yml", + [ + "flutter-iap-$PREV_VERSION", + 'CONSOLIDATED_RELEASE_NOTES="https://openiap.dev/docs/updates/releases"', + ], + "Flutter release workflow should generate changelog entries from prefixed tags", + ); + expectIncludes( + "libraries/godot-iap/README.md", + [ + "https://openiap.dev/docs/setup/godot", + "https://openiap.dev/docs/guides/ai-assistants", + "https://openiap.dev/llms.txt", + "https://openiap.dev/docs/apis", + "https://openiap.dev/docs/example", + "[LICENSE](../../LICENSE)", + ], + "Godot README docs links", + ); + expectIncludes( + "libraries/godot-iap/CONTRIBUTING.md", + [ + "https://github.com/hyodotdev/openiap/issues", + "https://openiap.dev/docs/setup/godot", + ], + "Godot contributing docs links", + ); + expectIncludes( + "libraries/godot-iap/EXAMPLES.md", + ["https://openiap.dev/docs/setup/godot", "https://openiap.dev/docs/apis"], + "Godot examples docs links", + ); for (const godotDocsFile of [ - 'libraries/godot-iap/README.md', - 'libraries/godot-iap/CONTRIBUTING.md', - 'libraries/godot-iap/EXAMPLES.md', + "libraries/godot-iap/README.md", + "libraries/godot-iap/CONTRIBUTING.md", + "libraries/godot-iap/EXAMPLES.md", ]) { - expectNotIncludes(godotDocsFile, [ - 'hyochan.github.io/godot-iap', - 'github.com/hyochan/godot-iap', - '[LICENSE](LICENSE)', - ], `${godotDocsFile} must not point at legacy standalone docs`); + expectNotIncludes( + godotDocsFile, + [ + "hyochan.github.io/godot-iap", + "github.com/hyochan/godot-iap", + "[LICENSE](LICENSE)", + ], + `${godotDocsFile} must not point at legacy standalone docs`, + ); } - const kmpVersion = read('libraries/kmp-iap/gradle.properties') + const kmpVersion = read("libraries/kmp-iap/gradle.properties") .match(/^libraryVersion=(.+)$/m)?.[1] ?.trim(); - const kmpLibraryVersions = read('libraries/kmp-iap/gradle/libs.versions.toml'); - const kmpKotlinVersion = kmpLibraryVersions.match(/^kotlin = "([^"]+)"/m)?.[1]; - const kmpGradleVersion = read('libraries/kmp-iap/gradle/wrapper/gradle-wrapper.properties') - .match(/gradle-([^-]+)-bin\.zip/)?.[1]; - const flutterVersion = read('libraries/flutter_inapp_purchase/pubspec.yaml') + const kmpLibraryVersions = read( + "libraries/kmp-iap/gradle/libs.versions.toml", + ); + const kmpKotlinVersion = + kmpLibraryVersions.match(/^kotlin = "([^"]+)"/m)?.[1]; + const kmpGradleVersion = read( + "libraries/kmp-iap/gradle/wrapper/gradle-wrapper.properties", + ).match(/gradle-([^-]+)-bin\.zip/)?.[1]; + const flutterVersion = read("libraries/flutter_inapp_purchase/pubspec.yaml") .match(/^version:\s*(.+)$/m)?.[1] ?.trim(); - const mauiVersion = read('libraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csproj') + const mauiVersion = read( + "libraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csproj", + ) .match(/([^<]+)<\/PackageVersion>/)?.[1] ?.trim(); - if (!kmpVersion) fail('libraries/kmp-iap/gradle.properties is missing libraryVersion'); - if (!flutterVersion) fail('libraries/flutter_inapp_purchase/pubspec.yaml is missing version'); - if (!mauiVersion) fail('OpenIap.Maui.csproj is missing PackageVersion'); + if (!kmpVersion) + fail("libraries/kmp-iap/gradle.properties is missing libraryVersion"); + if (!flutterVersion) + fail("libraries/flutter_inapp_purchase/pubspec.yaml is missing version"); + if (!mauiVersion) fail("OpenIap.Maui.csproj is missing PackageVersion"); if (flutterVersion) { - expectIncludes('packages/docs/src/lib/versioning.ts', [ - 'flutterPackageVersion', - 'FLUTTER_PACKAGE', - 'dependencyLine: `flutter_inapp_purchase: ^${FLUTTER_PACKAGE_VERSION}`', - ], 'docs Flutter package metadata must derive from generated docs metadata'); - expectIncludes('packages/docs/src/lib/images.ts', [ - 'FLUTTER_PACKAGE.installCommand', - ], 'docs Flutter library listing install command'); - expectIncludes('packages/docs/src/pages/docs/setup/flutter.tsx', [ - 'ANDROID_SDK', - 'FLUTTER_PACKAGE', - 'FLUTTER_PACKAGE.dependencyLine', - ], 'Flutter setup docs package metadata'); - expectIncludes('libraries/flutter_inapp_purchase/README.md', [ - 'flutter pub add flutter_inapp_purchase', - 'https://pub.dev/packages/flutter_inapp_purchase', - ], 'Flutter README should reference pub.dev without an inline version'); + expectIncludes( + "packages/docs/src/lib/versioning.ts", + [ + "flutterPackageVersion", + "FLUTTER_PACKAGE", + "dependencyLine: `flutter_inapp_purchase: ^${FLUTTER_PACKAGE_VERSION}`", + ], + "docs Flutter package metadata must derive from generated docs metadata", + ); + expectIncludes( + "packages/docs/src/lib/images.ts", + ["FLUTTER_PACKAGE.installCommand"], + "docs Flutter library listing install command", + ); + expectIncludes( + "packages/docs/src/pages/docs/setup/flutter.tsx", + ["ANDROID_SDK", "FLUTTER_PACKAGE", "FLUTTER_PACKAGE.dependencyLine"], + "Flutter setup docs package metadata", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/README.md", + [ + "flutter pub add flutter_inapp_purchase", + "https://pub.dev/packages/flutter_inapp_purchase", + ], + "Flutter README should reference pub.dev without an inline version", + ); for (const flutterDoc of [ - 'libraries/flutter_inapp_purchase/README.md', - 'packages/docs/src/pages/docs/setup/flutter.tsx', + "libraries/flutter_inapp_purchase/README.md", + "packages/docs/src/pages/docs/setup/flutter.tsx", ]) { - expectNotIncludes(flutterDoc, [ - `flutter_inapp_purchase: ^${flutterVersion}`, - ], 'Flutter install command version must not be inline hardcoded'); + expectNotIncludes( + flutterDoc, + [`flutter_inapp_purchase: ^${flutterVersion}`], + "Flutter install command version must not be inline hardcoded", + ); } for (const flutterPodspec of [ - 'libraries/flutter_inapp_purchase/ios/flutter_inapp_purchase.podspec', - 'libraries/flutter_inapp_purchase/macos/flutter_inapp_purchase.podspec', + "libraries/flutter_inapp_purchase/ios/flutter_inapp_purchase.podspec", + "libraries/flutter_inapp_purchase/macos/flutter_inapp_purchase.podspec", ]) { - expectIncludes(flutterPodspec, [ - 'pubspec_path', - 'pubspec_version', - 's.version = pubspec_version', - ], 'Flutter podspec version must derive from pubspec.yaml'); - expectNotIncludes(flutterPodspec, [ - "s.version = '0.0.1'", - ], 'Flutter podspec version must not drift from pubspec.yaml'); + expectIncludes( + flutterPodspec, + [ + "pubspec_path", + "pubspec_version", + "s.version = pubspec_version", + ], + "Flutter podspec version must derive from pubspec.yaml", + ); + expectNotIncludes( + flutterPodspec, + ["s.version = '0.0.1'"], + "Flutter podspec version must not drift from pubspec.yaml", + ); } - expectNotIncludes('libraries/flutter_inapp_purchase/ios/flutter_inapp_purchase.podspec', [ - 'http://example.com', - 'Your Company', - 'email@example.com', - ], 'Flutter iOS podspec metadata must not use placeholders'); + expectNotIncludes( + "libraries/flutter_inapp_purchase/ios/flutter_inapp_purchase.podspec", + ["http://example.com", "Your Company", "email@example.com"], + "Flutter iOS podspec metadata must not use placeholders", + ); } if (kmpVersion) { - expectIncludes('packages/docs/src/lib/versioning.ts', [ - 'kmpPackageVersion', - 'KMP_PACKAGE', - 'installCommand: `implementation("io.github.hyochan:kmp-iap:${KMP_PACKAGE_VERSION}")`', - ], 'docs KMP package metadata must derive from generated docs metadata'); - expectIncludes('packages/docs/src/lib/images.ts', [ - 'KMP_PACKAGE.installCommand', - ], 'docs KMP install command'); - expectIncludes('packages/docs/src/pages/docs/setup/kmp.tsx', [ - "LIBRARIES.find(({ name }) => name === 'kmp-iap')", - 'KMP_ANDROID_SDK', - 'KMP_INSTALL_COMMAND', - 'KMP_VERSION', - ], 'KMP setup docs install command'); - expectNotIncludes('packages/docs/src/pages/docs/setup/kmp.tsx', [ - '', - ], 'KMP setup docs install command must be copyable'); - expectIncludes('libraries/kmp-iap/README.md', [ - 'implementation("io.github.hyochan:kmp-iap:")', - 'https://central.sonatype.com/artifact/io.github.hyochan/kmp-iap', - 'https://openiap.dev/docs/setup/kmp', - 'https://openiap.dev/llms.txt', - 'license-Apache--2.0', - 'Apache License 2.0', - ], 'KMP README should reference Maven Central without an inline version'); - expectNotIncludes('libraries/kmp-iap/README.md', [ - `implementation("io.github.hyochan:kmp-iap:${kmpVersion}")`, - 'hyochan.github.io/kmp-iap', - 'license-MIT', - 'MIT License', - ], 'KMP README install command version must not be inline hardcoded'); - expectIncludes('libraries/kmp-iap/library/library.podspec', [ - 'gradle_properties_file', - 'libraryVersion=', - 'spec.version = library_version', - 'spec.source = { :git => \'https://github.com/hyodotdev/openiap.git\', :tag => "kmp-iap-#{library_version}" }', - "spec.authors = { 'Hyo Dev' => 'hyo@hyo.dev' }", - "spec.license = { :type => 'Apache-2.0', :file => '../LICENSE' }", - ], 'KMP podspec version'); - expectNotIncludes('libraries/kmp-iap/library/library.podspec', [ - `spec.version = '${kmpVersion}'`, - "spec.source = { :http=> ''}", - "spec.authors = ''", - "spec.license = ''", - ], 'KMP podspec version must derive from gradle.properties'); - expectIncludes('libraries/kmp-iap/library/build.gradle.kts', [ - 'fun dynamicKmpPodspec(): String', - 'tasks.matching { it.name == "podspec" }.configureEach', - 'projectDir.resolve("library.podspec").writeText(dynamicKmpPodspec())', - 'spec.version = library_version', - 'openiap_apple_version = openiap_versions[\'apple\']', - ], 'KMP podspec Gradle generator must preserve dynamic metadata'); - } - const kmpExampleVersions = read('libraries/kmp-iap/example/gradle/libs.versions.toml'); - const kmpExampleKotlinVersion = kmpExampleVersions.match(/^kotlin = "([^"]+)"/m)?.[1]; - const kmpCompileSdk = kmpExampleVersions.match(/^android-compileSdk = "([^"]+)"/m)?.[1]; - const kmpMinSdk = kmpExampleVersions.match(/^android-minSdk = "([^"]+)"/m)?.[1]; - const kmpTargetSdk = kmpExampleVersions.match(/^android-targetSdk = "([^"]+)"/m)?.[1]; + expectIncludes( + "packages/docs/src/lib/versioning.ts", + [ + "kmpPackageVersion", + "KMP_PACKAGE", + 'installCommand: `implementation("io.github.hyochan:kmp-iap:${KMP_PACKAGE_VERSION}")`', + ], + "docs KMP package metadata must derive from generated docs metadata", + ); + expectIncludes( + "packages/docs/src/lib/images.ts", + ["KMP_PACKAGE.installCommand"], + "docs KMP install command", + ); + expectIncludes( + "packages/docs/src/pages/docs/setup/kmp.tsx", + [ + "LIBRARIES.find(({ name }) => name === 'kmp-iap')", + "KMP_ANDROID_SDK", + "KMP_INSTALL_COMMAND", + "KMP_VERSION", + ], + "KMP setup docs install command", + ); + expectNotIncludes( + "packages/docs/src/pages/docs/setup/kmp.tsx", + [""], + "KMP setup docs install command must be copyable", + ); + expectIncludes( + "libraries/kmp-iap/README.md", + [ + 'implementation("io.github.hyochan:kmp-iap:")', + "https://central.sonatype.com/artifact/io.github.hyochan/kmp-iap", + "https://openiap.dev/docs/setup/kmp", + "https://openiap.dev/llms.txt", + "license-Apache--2.0", + "Apache License 2.0", + ], + "KMP README should reference Maven Central without an inline version", + ); + expectNotIncludes( + "libraries/kmp-iap/README.md", + [ + `implementation("io.github.hyochan:kmp-iap:${kmpVersion}")`, + "hyochan.github.io/kmp-iap", + "license-MIT", + "MIT License", + ], + "KMP README install command version must not be inline hardcoded", + ); + expectIncludes( + "libraries/kmp-iap/library/library.podspec", + [ + "gradle_properties_file", + "libraryVersion=", + "spec.version = library_version", + "spec.source = { :git => 'https://github.com/hyodotdev/openiap.git', :tag => \"kmp-iap-#{library_version}\" }", + "spec.authors = { 'Hyo Dev' => 'hyo@hyo.dev' }", + "spec.license = { :type => 'Apache-2.0', :file => '../LICENSE' }", + ], + "KMP podspec version", + ); + expectNotIncludes( + "libraries/kmp-iap/library/library.podspec", + [ + `spec.version = '${kmpVersion}'`, + "spec.source = { :http=> ''}", + "spec.authors = ''", + "spec.license = ''", + ], + "KMP podspec version must derive from gradle.properties", + ); + expectIncludes( + "libraries/kmp-iap/library/build.gradle.kts", + [ + "fun dynamicKmpPodspec(): String", + 'tasks.matching { it.name == "podspec" }.configureEach', + 'projectDir.resolve("library.podspec").writeText(dynamicKmpPodspec())', + "spec.version = library_version", + "openiap_apple_version = openiap_versions['apple']", + ], + "KMP podspec Gradle generator must preserve dynamic metadata", + ); + } + const kmpExampleVersions = read( + "libraries/kmp-iap/example/gradle/libs.versions.toml", + ); + const kmpExampleKotlinVersion = + kmpExampleVersions.match(/^kotlin = "([^"]+)"/m)?.[1]; + const kmpCompileSdk = kmpExampleVersions.match( + /^android-compileSdk = "([^"]+)"/m, + )?.[1]; + const kmpMinSdk = kmpExampleVersions.match( + /^android-minSdk = "([^"]+)"/m, + )?.[1]; + const kmpTargetSdk = kmpExampleVersions.match( + /^android-targetSdk = "([^"]+)"/m, + )?.[1]; if (!kmpKotlinVersion || !kmpGradleVersion) { - fail('KMP library must declare Kotlin and Gradle wrapper versions'); + fail("KMP library must declare Kotlin and Gradle wrapper versions"); } else if (kmpExampleKotlinVersion !== kmpKotlinVersion) { - fail(`KMP example Kotlin ${kmpExampleKotlinVersion} must match library Kotlin ${kmpKotlinVersion}`); + fail( + `KMP example Kotlin ${kmpExampleKotlinVersion} must match library Kotlin ${kmpKotlinVersion}`, + ); } else { - expectIncludes('packages/docs/src/pages/docs/setup/kmp.tsx', [ - `Kotlin ${kmpKotlinVersion}+`, - `Gradle ${kmpGradleVersion}+`, - 'JDK 17+', - ], 'KMP setup docs toolchain versions'); - expectIncludes('libraries/kmp-iap/example/composeApp/build.gradle.kts', [ - 'implementation(libs.kotlinx.coroutines.swing)', - ], 'KMP example desktop coroutines must use version catalog'); - expectIncludes('libraries/kmp-iap/example/gradle/libs.versions.toml', [ - 'kotlinx-coroutines-swing', - ], 'KMP example coroutines aliases must match root catalog naming'); - expectNotIncludes('libraries/kmp-iap/example/gradle/libs.versions.toml', [ - 'kotlinx-coroutinesSwing', - ], 'KMP example coroutines aliases must not use root-incompatible camel suffixes'); - expectNotIncludes('libraries/kmp-iap/example/composeApp/build.gradle.kts', [ - 'org.jetbrains.kotlinx:kotlinx-coroutines-swing:', - ], 'KMP example desktop coroutines must not hardcode Maven versions'); - expectIncludes('libraries/kmp-iap/CONTRIBUTING.md', [ - 'JDK 17 or higher', - 'https://github.com/hyodotdev/openiap/issues', - 'https://github.com/hyodotdev/openiap/discussions/categories/kmp-iap', - ], 'KMP contributing JDK requirement'); - expectNotIncludes('libraries/kmp-iap/CONTRIBUTING.md', [ - 'github.com/hyochan/kmp-iap', - 'github.com/hyochan/openiap.dev', - ], 'KMP contributing links must point at the monorepo'); - expectIncludes('libraries/kmp-iap/CHANGELOG.md', [ - 'https://github.com/hyodotdev/openiap/releases?q=kmp-iap&expanded=true', - ], 'KMP changelog release link'); - expectNotIncludes('libraries/kmp-iap/CHANGELOG.md', [ - 'github.com/hyochan/kmp-iap', - ], 'KMP changelog must not point at the legacy standalone repository'); + expectIncludes( + "packages/docs/src/pages/docs/setup/kmp.tsx", + [`Kotlin ${kmpKotlinVersion}+`, `Gradle ${kmpGradleVersion}+`, "JDK 17+"], + "KMP setup docs toolchain versions", + ); + expectIncludes( + "libraries/kmp-iap/example/composeApp/build.gradle.kts", + ["implementation(libs.kotlinx.coroutines.swing)"], + "KMP example desktop coroutines must use version catalog", + ); + expectIncludes( + "libraries/kmp-iap/example/gradle/libs.versions.toml", + ["kotlinx-coroutines-swing"], + "KMP example coroutines aliases must match root catalog naming", + ); + expectNotIncludes( + "libraries/kmp-iap/example/gradle/libs.versions.toml", + ["kotlinx-coroutinesSwing"], + "KMP example coroutines aliases must not use root-incompatible camel suffixes", + ); + expectNotIncludes( + "libraries/kmp-iap/example/composeApp/build.gradle.kts", + ["org.jetbrains.kotlinx:kotlinx-coroutines-swing:"], + "KMP example desktop coroutines must not hardcode Maven versions", + ); + expectIncludes( + "libraries/kmp-iap/CONTRIBUTING.md", + [ + "JDK 17 or higher", + "https://github.com/hyodotdev/openiap/issues", + "https://github.com/hyodotdev/openiap/discussions/categories/kmp-iap", + ], + "KMP contributing JDK requirement", + ); + expectNotIncludes( + "libraries/kmp-iap/CONTRIBUTING.md", + ["github.com/hyochan/kmp-iap", "github.com/hyochan/openiap.dev"], + "KMP contributing links must point at the monorepo", + ); + expectIncludes( + "libraries/kmp-iap/CHANGELOG.md", + ["https://github.com/hyodotdev/openiap/releases?q=kmp-iap&expanded=true"], + "KMP changelog release link", + ); + expectNotIncludes( + "libraries/kmp-iap/CHANGELOG.md", + ["github.com/hyochan/kmp-iap"], + "KMP changelog must not point at the legacy standalone repository", + ); } if (!kmpCompileSdk || !kmpMinSdk || !kmpTargetSdk) { - fail('KMP example libs.versions.toml must declare Android SDK versions'); + fail("KMP example libs.versions.toml must declare Android SDK versions"); } else { - expectIncludes('packages/docs/src/lib/versioning.ts', [ - 'kmpCompileSdk', - 'kmpMinSdk', - 'kmpTargetSdk', - 'export const KMP_ANDROID_SDK', - ], 'docs KMP Android SDK metadata must derive from generated docs metadata'); - expectIncludes('packages/docs/src/pages/docs/setup/kmp.tsx', [ - 'compileSdk = ${KMP_ANDROID_SDK.compileSdk}', - 'minSdk = ${KMP_ANDROID_SDK.minSdk}', - 'targetSdk = ${KMP_ANDROID_SDK.targetSdk}', - ], 'KMP setup docs Android SDK versions'); - expectNotIncludes('packages/docs/src/pages/docs/setup/kmp.tsx', [ - `compileSdk = ${kmpCompileSdk}`, - `minSdk = ${kmpMinSdk}`, - `targetSdk = ${kmpTargetSdk}`, - ], 'KMP setup docs Android SDK versions must not be inline hardcoded'); - } - expectIncludes('libraries/kmp-iap/gradle/libs.versions.toml', [ - 'compose-material-icons = "1.7.3"', - 'compose-material-icons-extended', - 'version.ref = "compose-material-icons"', - ], 'KMP root Compose icon dependency'); - expectIncludes('libraries/kmp-iap/example/gradle/libs.versions.toml', [ - 'compose-material-icons = "1.7.3"', - 'compose-material-icons-extended', - 'version.ref = "compose-material-icons"', - ], 'KMP standalone example Compose icon dependency'); - expectIncludes('libraries/kmp-iap/example/composeApp/build.gradle.kts', [ - 'libs.compose.material.icons.extended', - '-Xexpect-actual-classes', - ], 'KMP example Compose icon dependency'); - expectIncludes('libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/SubscriptionFlowScreen.kt', [ - 'List', - 'FetchProductsResultSubscriptions', - ], 'KMP example subscription product handling'); - expectNotIncludes('libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/SubscriptionFlowScreen.kt', [ - 'is ProductAndroid', - 'is ProductIOS', - ], 'KMP example subscription product handling must not type-check impossible product variants'); + expectIncludes( + "packages/docs/src/lib/versioning.ts", + [ + "kmpCompileSdk", + "kmpMinSdk", + "kmpTargetSdk", + "export const KMP_ANDROID_SDK", + ], + "docs KMP Android SDK metadata must derive from generated docs metadata", + ); + expectIncludes( + "packages/docs/src/pages/docs/setup/kmp.tsx", + [ + "compileSdk = ${KMP_ANDROID_SDK.compileSdk}", + "minSdk = ${KMP_ANDROID_SDK.minSdk}", + "targetSdk = ${KMP_ANDROID_SDK.targetSdk}", + ], + "KMP setup docs Android SDK versions", + ); + expectNotIncludes( + "packages/docs/src/pages/docs/setup/kmp.tsx", + [ + `compileSdk = ${kmpCompileSdk}`, + `minSdk = ${kmpMinSdk}`, + `targetSdk = ${kmpTargetSdk}`, + ], + "KMP setup docs Android SDK versions must not be inline hardcoded", + ); + } + expectIncludes( + "libraries/kmp-iap/gradle/libs.versions.toml", + [ + 'compose-material-icons = "1.7.3"', + "compose-material-icons-extended", + 'version.ref = "compose-material-icons"', + ], + "KMP root Compose icon dependency", + ); + expectIncludes( + "libraries/kmp-iap/example/gradle/libs.versions.toml", + [ + 'compose-material-icons = "1.7.3"', + "compose-material-icons-extended", + 'version.ref = "compose-material-icons"', + ], + "KMP standalone example Compose icon dependency", + ); + expectIncludes( + "libraries/kmp-iap/example/composeApp/build.gradle.kts", + ["libs.compose.material.icons.extended", "-Xexpect-actual-classes"], + "KMP example Compose icon dependency", + ); + expectIncludes( + "libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/SubscriptionFlowScreen.kt", + ["List", "FetchProductsResultSubscriptions"], + "KMP example subscription product handling", + ); + expectNotIncludes( + "libraries/kmp-iap/example/composeApp/src/commonMain/kotlin/dev/hyo/martie/screens/SubscriptionFlowScreen.kt", + ["is ProductAndroid", "is ProductIOS"], + "KMP example subscription product handling must not type-check impossible product variants", + ); if (mauiVersion) { - expectIncludes('packages/docs/src/lib/versioning.ts', [ - 'mauiPackageId', - 'mauiPackageVersion', - 'MAUI_PACKAGE', - 'installCommand: `dotnet add package ${MAUI_PACKAGE_ID}`', - 'packageReference: ``', - ], 'docs MAUI package metadata must derive from generated docs metadata'); - expectIncludes('packages/docs/src/lib/images.ts', [ - 'MAUI_PACKAGE', - 'installCommand: MAUI_PACKAGE.installCommand', - ], 'docs MAUI library listing install command'); - expectIncludes('packages/docs/src/pages/docs/setup/maui.tsx', [ - "import { MAUI_PACKAGE } from '../../../lib/versioning'", - 'MAUI_PACKAGE.installCommand', - 'MAUI_PACKAGE.packageReference', - 'MAUI_PACKAGE.versionedNugetUrl', - ], 'MAUI setup docs package metadata'); - expectIncludes('libraries/maui-iap/README.md', [ - 'dotnet add package OpenIap.Maui', - 'https://www.nuget.org/packages/OpenIap.Maui', - ], 'MAUI README should reference the NuGet package without an inline version'); + expectIncludes( + "packages/docs/src/lib/versioning.ts", + [ + "mauiPackageId", + "mauiPackageVersion", + "MAUI_PACKAGE", + "installCommand: `dotnet add package ${MAUI_PACKAGE_ID}`", + 'packageReference: ``', + ], + "docs MAUI package metadata must derive from generated docs metadata", + ); + expectIncludes( + "packages/docs/src/lib/images.ts", + ["MAUI_PACKAGE", "installCommand: MAUI_PACKAGE.installCommand"], + "docs MAUI library listing install command", + ); + expectIncludes( + "packages/docs/src/pages/docs/setup/maui.tsx", + [ + "import { MAUI_PACKAGE } from '../../../lib/versioning'", + "MAUI_PACKAGE.installCommand", + "MAUI_PACKAGE.packageReference", + "MAUI_PACKAGE.versionedNugetUrl", + ], + "MAUI setup docs package metadata", + ); + expectIncludes( + "libraries/maui-iap/README.md", + [ + "dotnet add package OpenIap.Maui", + "https://www.nuget.org/packages/OpenIap.Maui", + ], + "MAUI README should reference the NuGet package without an inline version", + ); for (const mauiInstallDoc of [ - 'packages/docs/src/lib/images.ts', - 'packages/docs/src/pages/docs/setup/maui.tsx', - 'libraries/maui-iap/README.md', + "packages/docs/src/lib/images.ts", + "packages/docs/src/pages/docs/setup/maui.tsx", + "libraries/maui-iap/README.md", ]) { - expectNotIncludes(mauiInstallDoc, [ - `OpenIap.Maui --version ${mauiVersion}`, - ], 'MAUI install command version must not be inline hardcoded'); + expectNotIncludes( + mauiInstallDoc, + [`OpenIap.Maui --version ${mauiVersion}`], + "MAUI install command version must not be inline hardcoded", + ); } for (const mauiPackageReferenceDoc of [ - 'packages/docs/src/pages/docs/setup/maui.tsx', - 'libraries/maui-iap/README.md', + "packages/docs/src/pages/docs/setup/maui.tsx", + "libraries/maui-iap/README.md", ]) { - expectNotIncludes(mauiPackageReferenceDoc, [ - ``, - ], 'MAUI PackageReference version must not be inline hardcoded'); + expectNotIncludes( + mauiPackageReferenceDoc, + [ + ``, + ], + "MAUI PackageReference version must not be inline hardcoded", + ); } } - expectIncludes('scripts/sync-versions.mjs', [ - 'openiap-versions.json', - './scripts/sync-versions.sh', - ], 'root version sync script'); - expectNotIncludes('scripts/sync-versions.mjs', [ - 'writeFileSync', - 'pkgJson.version', - 'const packages = [', - ], 'root version sync wrapper must delegate writes to scripts/sync-versions.sh'); - expectIncludes('scripts/sync-versions.sh', [ - 'set -euo pipefail', - 'sync_package_json_version "packages/gql/package.json" "spec"', - 'sync_package_json_version "packages/docs/package.json" "spec"', - 'sync_package_json_version "packages/google/package.json" "google"', - 'sync_package_json_version "packages/apple/package.json" "apple"', - ], 'shell version sync must update package metadata for release workflows'); - if (exists('packages/gql/package-lock.json')) { - fail('packages/gql must not keep a stale npm package-lock.json; Bun lockfiles are the package-manager SSOT'); - } - expectIncludes('packages/gql/README.md', [ - 'bun install --frozen-lockfile', - ], 'GQL README must document Bun installs'); - expectNotIncludes('packages/gql/README.md', [ - 'npm install', - ], 'GQL README must not document npm installs'); - expectIncludes('.gitignore', [ - 'package-lock.json', - ], 'root gitignore must prevent npm lockfile drift in Bun-managed packages'); + expectIncludes( + "scripts/sync-versions.mjs", + ["openiap-versions.json", "./scripts/sync-versions.sh"], + "root version sync script", + ); + expectNotIncludes( + "scripts/sync-versions.mjs", + ["writeFileSync", "pkgJson.version", "const packages = ["], + "root version sync wrapper must delegate writes to scripts/sync-versions.sh", + ); + expectIncludes( + "scripts/sync-versions.sh", + [ + "set -euo pipefail", + 'sync_package_json_version "packages/gql/package.json" "spec"', + 'sync_package_json_version "packages/docs/package.json" "spec"', + 'sync_package_json_version "packages/google/package.json" "google"', + 'sync_package_json_version "packages/apple/package.json" "apple"', + ], + "shell version sync must update package metadata for release workflows", + ); + if (exists("packages/gql/package-lock.json")) { + fail( + "packages/gql must not keep a stale npm package-lock.json; Bun lockfiles are the package-manager SSOT", + ); + } + expectIncludes( + "packages/gql/README.md", + ["bun install --frozen-lockfile"], + "GQL README must document Bun installs", + ); + expectNotIncludes( + "packages/gql/README.md", + ["npm install"], + "GQL README must not document npm installs", + ); + expectIncludes( + ".gitignore", + ["package-lock.json"], + "root gitignore must prevent npm lockfile drift in Bun-managed packages", + ); for (const bunPackageJson of [ - 'packages/gql/package.json', - 'packages/docs/package.json', - 'packages/google/package.json', - 'packages/apple/package.json', + "packages/gql/package.json", + "packages/docs/package.json", + "packages/google/package.json", + "packages/apple/package.json", ]) { - expectIncludes(bunPackageJson, [ - '"packageManager": "bun@1.3.13"', - ], `${bunPackageJson} package manager must match the monorepo Bun version`); + expectIncludes( + bunPackageJson, + ['"packageManager": "bun@1.3.13"'], + `${bunPackageJson} package manager must match the monorepo Bun version`, + ); } for (const bunWorkflow of [ - '.github/workflows/ci.yml', - '.github/workflows/ci-expo-iap.yml', - '.github/workflows/release-expo.yml', - '.github/workflows/release.yml', + ".github/workflows/ci.yml", + ".github/workflows/ci-expo-iap.yml", + ".github/workflows/release-expo.yml", + ".github/workflows/release.yml", ]) { - expectIncludes(bunWorkflow, [ - 'bun-version: 1.3.13', - ], `${bunWorkflow} must pin Bun to the monorepo packageManager version`); - expectNotIncludes(bunWorkflow, [ - 'bun-version: "1.1.38"', - 'bun-version: latest', - ], `${bunWorkflow} must not drift from the monorepo Bun version`); + expectIncludes( + bunWorkflow, + ["bun-version: 1.3.13"], + `${bunWorkflow} must pin Bun to the monorepo packageManager version`, + ); + expectNotIncludes( + bunWorkflow, + ['bun-version: "1.1.38"', "bun-version: latest"], + `${bunWorkflow} must not drift from the monorepo Bun version`, + ); } for (const bunInstallWorkflow of [ - '.github/workflows/ci.yml', - '.github/workflows/ci-expo-iap.yml', - '.github/workflows/release-expo.yml', - '.github/workflows/release.yml', + ".github/workflows/ci.yml", + ".github/workflows/ci-expo-iap.yml", + ".github/workflows/release-expo.yml", + ".github/workflows/release.yml", ]) { - expectIncludes(bunInstallWorkflow, [ - 'bun install --frozen-lockfile', - ], `${bunInstallWorkflow} must enforce lockfile installs`); - expectNotIncludes(bunInstallWorkflow, [ - 'run: bun install\n', - 'bun install && break', - ], `${bunInstallWorkflow} must not allow lockfile drift during installs`); - } - expectIncludes('packages/google/scripts/publish-local.sh', [ - '${openIapGroupId:-io.github.hyochan.openiap}:openiap-google', - ], 'Google publish-local coordinate hint'); - expectNotIncludes('packages/google/scripts/publish-local.sh', [ - '${openIapGroupId:-io.github.hyochan}:openiap-google', - ], 'Google publish-local coordinate hint must use published groupId'); - expectIncludes('packages/google/scripts/update-version.sh', [ - 'REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)"', - "jq --arg version \"$VERSION\" '.google = $version'", - 'data["google"] = os.environ["VERSION"]', - '"$REPO_ROOT/scripts/sync-versions.sh"', - 'packages/*/openiap-versions.json', - 'packages/gql/package.json packages/docs/package.json packages/google/package.json packages/apple/package.json', - ], 'Google update-version must preserve openiap-versions.json fields'); - expectNotIncludes('packages/google/scripts/update-version.sh', [ - 'cat > "$VERSIONS_FILE"', - '"spec": "$SPEC_VERSION"', - '"google": "$VERSION"', - 'sed -i', - ], 'Google update-version must not rewrite openiap-versions.json or use platform sed'); - expectIncludes('packages/apple/scripts/bump-version.sh', [ - 'REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)"', - "jq -er '.apple | select(type == \"string\" and length > 0)'", - 'python3 - "${VERSIONS_FILE}"', - 'raise SystemExit(f"missing apple in {path}")', - "jq --arg version \"$NEW_VERSION\" '.apple = $version'", - "data['apple'] = os.environ[\"VERSION\"]", - '"$REPO_ROOT/scripts/sync-versions.sh"', - 'packages/gql/package.json packages/docs/package.json packages/google/package.json packages/apple/package.json', - 'git commit -m "chore(apple): bump version to $NEW_VERSION"', - 'git pull --rebase origin main', - 'git push origin HEAD:main', - 'git ls-remote --exit-code --tags origin "refs/tags/$NEW_VERSION"', - ], 'Apple bump-version must preserve openiap-versions.json fields'); - expectNotIncludes('packages/apple/scripts/bump-version.sh', [ - 'openiap-apple.git', - 'sed -i', - 'chore: bump version', - 'git tag -d "$NEW_VERSION"', - ], 'Apple bump-version must use monorepo coordinates and conventional commits'); - expectIncludes('scripts/deploy.sh', [ - 'set -euo pipefail', - 'VERCEL_CLI_VERSION="54.0.0"', - 'npm install -g "vercel@$VERCEL_CLI_VERSION"', - 'if [ -z "${1:-}" ]; then', - 'if ! ./scripts/sync-versions.sh; then', - 'if ! bun run typecheck; then', - 'if ! bun run build; then', - 'if ! vercel --prod; then', - 'git commit -m "chore(spec): bump version to $VERSION"', - 'git pull --rebase origin main', - 'git push origin HEAD:main', - 'packages/gql/package.json packages/docs/package.json packages/google/package.json packages/apple/package.json', - ], 'deploy script commit message'); - expectNotIncludes('scripts/deploy.sh', [ - 'npm install -g vercel', - 'if [ $? -ne 0 ]; then', - ], 'deploy script must not install a floating Vercel CLI'); - expectIncludes('packages/docs/deploy.sh', [ - 'set -euo pipefail', - 'VERCEL_CLI_VERSION="54.0.0"', - 'npm install -g "vercel@$VERCEL_CLI_VERSION"', - 'if ! bun run typecheck; then', - 'if ! bun run build; then', - ], 'docs deploy script must be deterministic and preserve failure messages'); - expectNotIncludes('packages/docs/deploy.sh', [ - 'npm install -g vercel', - 'if [ $? -ne 0 ]; then', - ], 'docs deploy script must not install floating CLIs or bypass custom failure messages'); - expectIncludes('.github/workflows/release.yml', [ - 'git commit -m "chore(docs): bump version to $VERSION"', - "jq --arg version \"$VERSION\" '.spec = $version'", - 'git show HEAD:openiap-versions.json > /tmp/upstream-openiap-versions.json', - './scripts/sync-versions.sh', - 'packages/docs/src/generated/version-metadata.json', - 'if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then', - 'Tag $TAG_NAME already exists', - 'packages/gql/package.json packages/docs/package.json packages/google/package.json packages/apple/package.json', - ], 'docs release workflow commit message'); - expectNotIncludes('.github/workflows/release.yml', [ - 'git pull --rebase origin main || true', - ], 'docs release workflow must not hide version rebase conflicts'); + expectIncludes( + bunInstallWorkflow, + ["bun install --frozen-lockfile"], + `${bunInstallWorkflow} must enforce lockfile installs`, + ); + expectNotIncludes( + bunInstallWorkflow, + ["run: bun install\n", "bun install && break"], + `${bunInstallWorkflow} must not allow lockfile drift during installs`, + ); + } + expectIncludes( + "packages/google/scripts/publish-local.sh", + ["${openIapGroupId:-io.github.hyochan.openiap}:openiap-google"], + "Google publish-local coordinate hint", + ); + expectNotIncludes( + "packages/google/scripts/publish-local.sh", + ["${openIapGroupId:-io.github.hyochan}:openiap-google"], + "Google publish-local coordinate hint must use published groupId", + ); + expectIncludes( + "packages/google/scripts/update-version.sh", + [ + 'REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)"', + "jq --arg version \"$VERSION\" '.google = $version'", + 'data["google"] = os.environ["VERSION"]', + '"$REPO_ROOT/scripts/sync-versions.sh"', + "packages/*/openiap-versions.json", + "packages/gql/package.json packages/docs/package.json packages/google/package.json packages/apple/package.json", + ], + "Google update-version must preserve openiap-versions.json fields", + ); + expectNotIncludes( + "packages/google/scripts/update-version.sh", + [ + 'cat > "$VERSIONS_FILE"', + '"spec": "$SPEC_VERSION"', + '"google": "$VERSION"', + "sed -i", + ], + "Google update-version must not rewrite openiap-versions.json or use platform sed", + ); + expectIncludes( + "packages/apple/scripts/bump-version.sh", + [ + 'REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)"', + "jq -er '.apple | select(type == \"string\" and length > 0)'", + 'python3 - "${VERSIONS_FILE}"', + 'raise SystemExit(f"missing apple in {path}")', + "jq --arg version \"$NEW_VERSION\" '.apple = $version'", + "data['apple'] = os.environ[\"VERSION\"]", + '"$REPO_ROOT/scripts/sync-versions.sh"', + "packages/gql/package.json packages/docs/package.json packages/google/package.json packages/apple/package.json", + 'git commit -m "chore(apple): bump version to $NEW_VERSION"', + "git pull --rebase origin main", + "git push origin HEAD:main", + 'git ls-remote --exit-code --tags origin "refs/tags/$NEW_VERSION"', + ], + "Apple bump-version must preserve openiap-versions.json fields", + ); + expectNotIncludes( + "packages/apple/scripts/bump-version.sh", + [ + "openiap-apple.git", + "sed -i", + "chore: bump version", + 'git tag -d "$NEW_VERSION"', + ], + "Apple bump-version must use monorepo coordinates and conventional commits", + ); + expectIncludes( + "scripts/deploy.sh", + [ + "set -euo pipefail", + 'VERCEL_CLI_VERSION="54.0.0"', + 'npm install -g "vercel@$VERCEL_CLI_VERSION"', + 'if [ -z "${1:-}" ]; then', + "if ! ./scripts/sync-versions.sh; then", + "if ! bun run typecheck; then", + "if ! bun run build; then", + "if ! vercel --prod; then", + 'git commit -m "chore(spec): bump version to $VERSION"', + "git pull --rebase origin main", + "git push origin HEAD:main", + "packages/gql/package.json packages/docs/package.json packages/google/package.json packages/apple/package.json", + ], + "deploy script commit message", + ); + expectNotIncludes( + "scripts/deploy.sh", + ["npm install -g vercel", "if [ $? -ne 0 ]; then"], + "deploy script must not install a floating Vercel CLI", + ); + expectIncludes( + "packages/docs/deploy.sh", + [ + "set -euo pipefail", + 'VERCEL_CLI_VERSION="54.0.0"', + 'npm install -g "vercel@$VERCEL_CLI_VERSION"', + "if ! bun run typecheck; then", + "if ! bun run build; then", + ], + "docs deploy script must be deterministic and preserve failure messages", + ); + expectNotIncludes( + "packages/docs/deploy.sh", + ["npm install -g vercel", "if [ $? -ne 0 ]; then"], + "docs deploy script must not install floating CLIs or bypass custom failure messages", + ); + expectIncludes( + ".github/workflows/release.yml", + [ + 'git commit -m "chore(docs): bump version to $VERSION"', + "jq --arg version \"$VERSION\" '.spec = $version'", + "git show HEAD:openiap-versions.json > /tmp/upstream-openiap-versions.json", + "./scripts/sync-versions.sh", + "packages/docs/src/generated/version-metadata.json", + 'if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then', + "Tag $TAG_NAME already exists", + "packages/gql/package.json packages/docs/package.json packages/google/package.json packages/apple/package.json", + ], + "docs release workflow commit message", + ); + expectNotIncludes( + ".github/workflows/release.yml", + ["git pull --rebase origin main || true"], + "docs release workflow must not hide version rebase conflicts", + ); for (const releaseWorkflow of [ - '.github/workflows/release-apple.yml', - '.github/workflows/release-google.yml', + ".github/workflows/release-apple.yml", + ".github/workflows/release-google.yml", ]) { - expectIncludes(releaseWorkflow, [ - 'openiap-versions.json|packages/*/openiap-versions.json|packages/gql/package.json|packages/docs/package.json|packages/google/package.json|packages/apple/package.json', - 'git show HEAD:openiap-versions.json > /tmp/upstream-openiap-versions.json', - 'Re-sync package metadata and docs copy after merge', - './scripts/sync-versions.sh', - 'packages/docs/src/generated/version-metadata.json', - 'packages/gql/package.json packages/docs/package.json packages/google/package.json packages/apple/package.json', - ], `${releaseWorkflow} must commit package metadata synced from openiap-versions.json`); - expectNotIncludes(releaseWorkflow, [ - 'cp openiap-versions.json packages/docs/openiap-versions.json', - 'git show HEAD:"$conflict_file"', - '/tmp/theirs.json', - ], `${releaseWorkflow} must not only sync the docs copy after conflict resolution`); - } - expectIncludes('.github/workflows/release-apple.yml', [ - 'COCOAPODS_VERSION: 1.15.2', - 'gem install cocoapods -v "$COCOAPODS_VERSION"', - 'bare_exists=true', - 'bare_exists=false', - 'Checkout release tag (current version)', - 'LEGACY_TAG="apple-v$VERSION"', - "steps.check_tag.outputs.bare_exists != 'true'", - 'Cleaning up tag created by this run', - ], 'Apple release workflow must not delete pre-existing tags on validation failure'); - expectNotIncludes('.github/workflows/release-apple.yml', [ - 'gem install cocoapods\n', - ], 'Apple release workflow must pin CocoaPods'); - expectIncludes('.github/workflows/release-google.yml', [ - 'release:', - 'runs-on: ubuntu-latest', - './gradlew :openiap:assembleRelease --no-daemon --stacktrace', - 'artifacts=(openiap/build/outputs/aar/*.aar openiap/build/libs/*.jar)', - 'No Google release artifacts found', - 'cp "${artifacts[@]}" release-artifacts/', - 'Checkout release tag (current version)', - 'LEGACY_TAG="google-v$VERSION"', - 'HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" "https://repo1.maven.org/maven2/io/github/hyochan/openiap/openiap-google/$VERSION/" || true)', - 'HTTP_STATUS="${HTTP_STATUS:-000}"', - 'Unable to verify openiap-google $VERSION on Maven Central', - 'if gh release view "google-$VERSION" >/dev/null 2>&1; then', - 'gh release edit "google-$VERSION"', - 'gh release upload "google-$VERSION" $ARTIFACTS --clobber', - ], 'Google release workflow must not require a macOS runner'); + expectIncludes( + releaseWorkflow, + [ + "openiap-versions.json|packages/*/openiap-versions.json|packages/gql/package.json|packages/docs/package.json|packages/google/package.json|packages/apple/package.json", + "git show HEAD:openiap-versions.json > /tmp/upstream-openiap-versions.json", + "Re-sync package metadata and docs copy after merge", + "./scripts/sync-versions.sh", + "packages/docs/src/generated/version-metadata.json", + "packages/gql/package.json packages/docs/package.json packages/google/package.json packages/apple/package.json", + ], + `${releaseWorkflow} must commit package metadata synced from openiap-versions.json`, + ); + expectNotIncludes( + releaseWorkflow, + [ + "cp openiap-versions.json packages/docs/openiap-versions.json", + 'git show HEAD:"$conflict_file"', + "/tmp/theirs.json", + ], + `${releaseWorkflow} must not only sync the docs copy after conflict resolution`, + ); + } + expectIncludes( + ".github/workflows/release-apple.yml", + [ + "COCOAPODS_VERSION: 1.15.2", + 'gem install cocoapods -v "$COCOAPODS_VERSION"', + "bare_exists=true", + "bare_exists=false", + "Checkout release tag (current version)", + 'LEGACY_TAG="apple-v$VERSION"', + "steps.check_tag.outputs.bare_exists != 'true'", + "Cleaning up tag created by this run", + ], + "Apple release workflow must not delete pre-existing tags on validation failure", + ); + expectNotIncludes( + ".github/workflows/release-apple.yml", + ["gem install cocoapods\n"], + "Apple release workflow must pin CocoaPods", + ); + expectIncludes( + ".github/workflows/release-google.yml", + [ + "release:", + "runs-on: ubuntu-latest", + "./gradlew :openiap:assembleRelease --no-daemon --stacktrace", + "artifacts=(openiap/build/outputs/aar/*.aar openiap/build/libs/*.jar)", + "No Google release artifacts found", + 'cp "${artifacts[@]}" release-artifacts/', + "Checkout release tag (current version)", + 'LEGACY_TAG="google-v$VERSION"', + 'HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" "https://repo1.maven.org/maven2/io/github/hyochan/openiap/openiap-google/$VERSION/" || true)', + 'HTTP_STATUS="${HTTP_STATUS:-000}"', + "Unable to verify openiap-google $VERSION on Maven Central", + 'if gh release view "google-$VERSION" >/dev/null 2>&1; then', + 'gh release edit "google-$VERSION"', + 'gh release upload "google-$VERSION" $ARTIFACTS --clobber', + ], + "Google release workflow must not require a macOS runner", + ); for (const [frameworkReleaseWorkflow, tagCommand] of [ - ['.github/workflows/release-expo.yml', 'git tag -a "expo-iap-${NEW_VERSION}"'], - ['.github/workflows/release-react-native.yml', 'git tag -a "react-native-iap-${NEW_VERSION}"'], - ['.github/workflows/release-flutter.yml', 'git tag -a "flutter-iap-${NEW_VERSION}"'], - ['.github/workflows/release-godot.yml', 'git tag -a godot-iap-${{ steps.version.outputs.VERSION }}'], + [ + ".github/workflows/release-expo.yml", + 'git tag -a "expo-iap-${NEW_VERSION}"', + ], + [ + ".github/workflows/release-react-native.yml", + 'git tag -a "react-native-iap-${NEW_VERSION}"', + ], + [ + ".github/workflows/release-flutter.yml", + 'git tag -a "flutter-iap-${NEW_VERSION}"', + ], + [ + ".github/workflows/release-godot.yml", + "git tag -a godot-iap-${{ steps.version.outputs.VERSION }}", + ], ]) { - expectIncludes(frameworkReleaseWorkflow, [ - 'Check if release tag already exists', - 'Checkout release tag (current version)', - 'git checkout "$RELEASE_TAG"', - 'Use \'current\' to retry this version.', - 'Commit version update', - 'STASHED=false', - 'git stash push --include-untracked -m "release artifacts"', - 'git pull --rebase origin main', - 'if [ "$STASHED" = "true" ]; then', - 'git stash pop', - tagCommand, - 'git push origin HEAD:main --follow-tags', - ], `${frameworkReleaseWorkflow} must tag after rebasing the release commit`); - expectNotIncludes(frameworkReleaseWorkflow, [ - 'git stash --include-untracked', - 'git stash pop || true', - 'git push --follow-tags', - 'git tag -af', - 'git push origin "flutter-iap-${NEW_VERSION}" --force', - 'create_release:', - 'inputs.create_release', - ], `${frameworkReleaseWorkflow} must push tags from the rebased HEAD explicitly`); + expectIncludes( + frameworkReleaseWorkflow, + [ + "Check if release tag already exists", + "Checkout release tag (current version)", + 'git checkout "$RELEASE_TAG"', + "Use 'current' to retry this version.", + "Commit version update", + "STASHED=false", + 'git stash push --include-untracked -m "release artifacts"', + "git pull --rebase origin main", + 'if [ "$STASHED" = "true" ]; then', + "git stash pop", + tagCommand, + "git push origin HEAD:main --follow-tags", + ], + `${frameworkReleaseWorkflow} must tag after rebasing the release commit`, + ); + expectNotIncludes( + frameworkReleaseWorkflow, + [ + "git stash --include-untracked", + "git stash pop || true", + "git push --follow-tags", + "git tag -af", + 'git push origin "flutter-iap-${NEW_VERSION}" --force', + "create_release:", + "inputs.create_release", + ], + `${frameworkReleaseWorkflow} must push tags from the rebased HEAD explicitly`, + ); } for (const [npmReleaseWorkflow, npmPackage] of [ - ['.github/workflows/release-expo.yml', 'expo-iap'], - ['.github/workflows/release-react-native.yml', 'react-native-iap'], + [".github/workflows/release-expo.yml", "expo-iap"], + [".github/workflows/release-react-native.yml", "react-native-iap"], ]) { - expectIncludes(npmReleaseWorkflow, [ - 'Check if npm package already published', - 'npm install -g npm@11.5.1', - `npm view "${npmPackage}@$VERSION" version`, - `if NPM_OUTPUT=$(npm view "${npmPackage}@$VERSION" version 2>&1); then`, - "grep -qiE 'E404|404 Not Found'", - `npm view "${npmPackage}@$NEW_VERSION" gitHead`, - 'git cat-file -e "$PUBLISHED_GIT_HEAD^{commit}"', - "if: steps.check_npm.outputs.exists == 'false'", - ], `${npmReleaseWorkflow} must support npm release reruns`); - expectNotIncludes(npmReleaseWorkflow, [ - 'npm install -g npm@latest', - 'node-version: 20.x', - 'set +e', - 'NPM_STATUS=$?', - ], `${npmReleaseWorkflow} must not drift npm trusted-publishing CLI version`); - } - expectIncludes('scripts/verify-npm-consumer-install.mjs', [ - 'npm', - 'pack', - '--pack-destination', - '--ignore-scripts', - 'openiap-versions.json must be packed as a real file', - 'consumer install smoke test passed', - ], 'npm consumer install smoke helper'); + expectIncludes( + npmReleaseWorkflow, + [ + "Check if npm package already published", + "npm install -g npm@11.5.1", + `npm view "${npmPackage}@$VERSION" version`, + `if NPM_OUTPUT=$(npm view "${npmPackage}@$VERSION" version 2>&1); then`, + "grep -qiE 'E404|404 Not Found'", + `npm view "${npmPackage}@$NEW_VERSION" gitHead`, + 'git cat-file -e "$PUBLISHED_GIT_HEAD^{commit}"', + "if: steps.check_npm.outputs.exists == 'false'", + ], + `${npmReleaseWorkflow} must support npm release reruns`, + ); + expectNotIncludes( + npmReleaseWorkflow, + [ + "npm install -g npm@latest", + "node-version: 20.x", + "set +e", + "NPM_STATUS=$?", + ], + `${npmReleaseWorkflow} must not drift npm trusted-publishing CLI version`, + ); + } + expectIncludes( + "scripts/verify-npm-consumer-install.mjs", + [ + "npm", + "pack", + "--pack-destination", + "--ignore-scripts", + "openiap-versions.json must be packed as a real file", + "consumer install smoke test passed", + ], + "npm consumer install smoke helper", + ); for (const [packageJsonPath, packageName] of [ - ['libraries/expo-iap/package.json', 'expo-iap'], - ['libraries/react-native-iap/package.json', 'react-native-iap'], + ["libraries/expo-iap/package.json", "expo-iap"], + ["libraries/react-native-iap/package.json", "react-native-iap"], ]) { - expectIncludes(packageJsonPath, [ - '"verify:consumer-install"', - 'verify-npm-consumer-install.mjs', - `--package-name ${packageName}`, - '--required openiap-versions.json', - ], `${packageJsonPath} must expose npm consumer smoke test`); + expectIncludes( + packageJsonPath, + [ + '"verify:consumer-install"', + "verify-npm-consumer-install.mjs", + `--package-name ${packageName}`, + "--required openiap-versions.json", + ], + `${packageJsonPath} must expose npm consumer smoke test`, + ); } for (const [workflowPath, command] of [ - ['.github/workflows/ci-expo-iap.yml', 'bun run verify:consumer-install'], - ['.github/workflows/ci-react-native-iap.yml', 'yarn verify:consumer-install'], - ['.github/workflows/release-expo.yml', 'bun run verify:consumer-install --pack-ignore-scripts'], - ['.github/workflows/release-react-native.yml', 'verify:consumer-install --pack-ignore-scripts'], + [".github/workflows/ci-expo-iap.yml", "bun run verify:consumer-install"], + [ + ".github/workflows/ci-react-native-iap.yml", + "yarn verify:consumer-install", + ], + [ + ".github/workflows/release-expo.yml", + "bun run verify:consumer-install --pack-ignore-scripts", + ], + [ + ".github/workflows/release-react-native.yml", + "verify:consumer-install --pack-ignore-scripts", + ], ]) { - expectIncludes(workflowPath, [ - 'Consumer install smoke test', - command, - ], `${workflowPath} must run npm consumer smoke test`); - } - expectIncludes('.github/workflows/publish-flutter.yml', [ - 'Check if pub.dev package already published', - 'flutter-version: "3.41.9"', - 'HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}"', - 'HTTP_STATUS="${HTTP_STATUS:-000}"', - 'https://pub.dev/api/packages/flutter_inapp_purchase/versions/$VERSION', - "if: steps.check_pub.outputs.exists == 'false'", - ], 'Flutter publish workflow must support pub.dev release reruns'); + expectIncludes( + workflowPath, + ["Consumer install smoke test", command], + `${workflowPath} must run npm consumer smoke test`, + ); + } + expectIncludes( + ".github/workflows/publish-flutter.yml", + [ + "Check if pub.dev package already published", + 'flutter-version: "3.41.9"', + 'HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}"', + 'HTTP_STATUS="${HTTP_STATUS:-000}"', + "https://pub.dev/api/packages/flutter_inapp_purchase/versions/$VERSION", + "if: steps.check_pub.outputs.exists == 'false'", + ], + "Flutter publish workflow must support pub.dev release reruns", + ); for (const flutterWorkflow of [ - '.github/workflows/ci-flutter-inapp-purchase.yml', - '.github/workflows/release-flutter.yml', - '.github/workflows/publish-flutter.yml', + ".github/workflows/ci-flutter-inapp-purchase.yml", + ".github/workflows/release-flutter.yml", + ".github/workflows/publish-flutter.yml", ]) { - expectIncludes(flutterWorkflow, [ - 'flutter-version: "3.41.9"', - ], `${flutterWorkflow} must pin Flutter SDK`); - expectNotIncludes(flutterWorkflow, [ - 'flutter-version: "3.x"', - ], `${flutterWorkflow} must not float Flutter SDK`); + expectIncludes( + flutterWorkflow, + ['flutter-version: "3.41.9"'], + `${flutterWorkflow} must pin Flutter SDK`, + ); + expectNotIncludes( + flutterWorkflow, + ['flutter-version: "3.x"'], + `${flutterWorkflow} must not float Flutter SDK`, + ); } for (const releaseNotesWorkflow of [ - '.github/workflows/release-apple.yml', - '.github/workflows/release-google.yml', - '.github/workflows/release-kmp.yml', - '.github/workflows/release-maui.yml', - '.github/workflows/release-expo.yml', - '.github/workflows/release-react-native.yml', - '.github/workflows/release-flutter.yml', - '.github/workflows/release-godot.yml', + ".github/workflows/release-apple.yml", + ".github/workflows/release-google.yml", + ".github/workflows/release-kmp.yml", + ".github/workflows/release-maui.yml", + ".github/workflows/release-expo.yml", + ".github/workflows/release-react-native.yml", + ".github/workflows/release-flutter.yml", + ".github/workflows/release-godot.yml", ]) { - expectIncludes(releaseNotesWorkflow, [ - 'RELEASE_REF="HEAD"', - '..$RELEASE_REF', - ], `${releaseNotesWorkflow} release notes must use the release tag when it already exists`); + expectIncludes( + releaseNotesWorkflow, + ['RELEASE_REF="HEAD"', "..$RELEASE_REF"], + `${releaseNotesWorkflow} release notes must use the release tag when it already exists`, + ); } for (const xcodeReleaseWorkflow of [ - '.github/workflows/ci.yml', - '.github/workflows/ci-maui-iap.yml', - '.github/workflows/release-apple.yml', - '.github/workflows/release-kmp.yml', - '.github/workflows/release-maui.yml', + ".github/workflows/ci.yml", + ".github/workflows/ci-maui-iap.yml", + ".github/workflows/release-apple.yml", + ".github/workflows/release-kmp.yml", + ".github/workflows/release-maui.yml", ]) { - expectIncludes(xcodeReleaseWorkflow, [ - 'runs-on: macos-15', - 'XCODE_VERSION: 16.4', - 'maxim-lobanov/setup-xcode@v1', - 'xcode-version: ${{ env.XCODE_VERSION }}', - ], `${xcodeReleaseWorkflow} must pin the macOS/Xcode release image`); - expectNotIncludes(xcodeReleaseWorkflow, [ - 'runs-on: macos-latest', - 'sudo xcode-select -s /Applications/Xcode.app', - ], `${xcodeReleaseWorkflow} must not drift with macos-latest Xcode`); - } - expectIncludes('scripts/install-xcodegen.sh', [ - 'XCODEGEN_VERSION', - 'XCODEGEN_SHA256', - 'https://github.com/yonaskolb/XcodeGen/releases/download/${VERSION}/xcodegen.zip', - 'shasum -a 256 -c -', - 'install -m 0755', - 'GITHUB_PATH', - ], 'XcodeGen installer must pin release artifacts'); + expectIncludes( + xcodeReleaseWorkflow, + [ + "runs-on: macos-15", + "XCODE_VERSION: 16.4", + "maxim-lobanov/setup-xcode@v1", + "xcode-version: ${{ env.XCODE_VERSION }}", + ], + `${xcodeReleaseWorkflow} must pin the macOS/Xcode release image`, + ); + expectNotIncludes( + xcodeReleaseWorkflow, + ["runs-on: macos-latest", "sudo xcode-select -s /Applications/Xcode.app"], + `${xcodeReleaseWorkflow} must not drift with macos-latest Xcode`, + ); + } + expectIncludes( + "scripts/install-xcodegen.sh", + [ + "XCODEGEN_VERSION", + "XCODEGEN_SHA256", + "https://github.com/yonaskolb/XcodeGen/releases/download/${VERSION}/xcodegen.zip", + "shasum -a 256 -c -", + "install -m 0755", + "GITHUB_PATH", + ], + "XcodeGen installer must pin release artifacts", + ); for (const xcodegenWorkflow of [ - '.github/workflows/ci-maui-iap.yml', - '.github/workflows/release-maui.yml', + ".github/workflows/ci-maui-iap.yml", + ".github/workflows/release-maui.yml", ]) { - expectIncludes(xcodegenWorkflow, [ - 'XCODEGEN_VERSION: 2.45.4', - 'XCODEGEN_SHA256: 090ec29491aad50aec10631bf6e62253fed733c50f3aab0f5ffc86bc170bdbef', - 'bash scripts/install-xcodegen.sh "$XCODEGEN_VERSION"', - ], `${xcodegenWorkflow} must pin XcodeGen`); - expectNotIncludes(xcodegenWorkflow, [ - 'brew install xcodegen', - ], `${xcodegenWorkflow} must not float XcodeGen via Homebrew`); - } - expectIncludes('packages/apple/scripts/build-xcframework.sh', [ - 'scripts/install-xcodegen.sh ', - ], 'Apple xcframework script must point to pinned XcodeGen installer'); - expectIncludes('scripts/bump-version.mjs', [ - 'const currentVersion = versions[t];', - '${currentVersion} → ${newVersion}', - 'chore(version): bump to X.X.X', - "target === 'apple'", - "`google-${bumpedVersions.google}`", - "`docs-${bumpedVersions.spec}`", - ], 'root bump-version output'); - expectIncludes('knowledge/internal/06-git-deployment.md', [ - 'Creates Git tag `` (bare semver)', - 'Creates Git tag `google-`', - 'Create Git tag `docs-`', - ], 'release deployment docs tag conventions'); - expectNotIncludes('scripts/deploy.sh', [ - 'git commit -m "chore: bump spec', - ], 'deploy script commit message must be conventional'); - expectNotIncludes('.github/workflows/release.yml', [ - 'git commit -m "chore: bump docs', - ], 'docs release workflow commit message must be conventional'); - expectNotIncludes('scripts/bump-version.mjs', [ - 'chore: bump version', - '${versions[t]} → ${newVersion}', - 'git tag vX.X.X', - ], 'root bump-version output must be accurate and conventional'); - expectNotIncludes('knowledge/internal/06-git-deployment.md', [ - 'Creates Git tag `apple-v`', - 'Creates Git tag `google-v`', - 'Create Git tag `v`', - ], 'release deployment docs must not mention legacy tag creation'); + expectIncludes( + xcodegenWorkflow, + [ + "XCODEGEN_VERSION: 2.45.4", + "XCODEGEN_SHA256: 090ec29491aad50aec10631bf6e62253fed733c50f3aab0f5ffc86bc170bdbef", + 'bash scripts/install-xcodegen.sh "$XCODEGEN_VERSION"', + ], + `${xcodegenWorkflow} must pin XcodeGen`, + ); + expectNotIncludes( + xcodegenWorkflow, + ["brew install xcodegen"], + `${xcodegenWorkflow} must not float XcodeGen via Homebrew`, + ); + } + expectIncludes( + "packages/apple/scripts/build-xcframework.sh", + ["scripts/install-xcodegen.sh "], + "Apple xcframework script must point to pinned XcodeGen installer", + ); + expectIncludes( + "scripts/bump-version.mjs", + [ + "const currentVersion = versions[t];", + "${currentVersion} → ${newVersion}", + "chore(version): bump to X.X.X", + "target === 'apple'", + "`google-${bumpedVersions.google}`", + "`docs-${bumpedVersions.spec}`", + ], + "root bump-version output", + ); + expectIncludes( + "knowledge/internal/06-git-deployment.md", + [ + "Creates Git tag `` (bare semver)", + "Creates Git tag `google-`", + "Create Git tag `docs-`", + ], + "release deployment docs tag conventions", + ); + expectNotIncludes( + "scripts/deploy.sh", + ['git commit -m "chore: bump spec'], + "deploy script commit message must be conventional", + ); + expectNotIncludes( + ".github/workflows/release.yml", + ['git commit -m "chore: bump docs'], + "docs release workflow commit message must be conventional", + ); + expectNotIncludes( + "scripts/bump-version.mjs", + ["chore: bump version", "${versions[t]} → ${newVersion}", "git tag vX.X.X"], + "root bump-version output must be accurate and conventional", + ); + expectNotIncludes( + "knowledge/internal/06-git-deployment.md", + [ + "Creates Git tag `apple-v`", + "Creates Git tag `google-v`", + "Create Git tag `v`", + ], + "release deployment docs must not mention legacy tag creation", + ); for (const monorepoContribDoc of [ - 'packages/apple/CONTRIBUTING.md', - 'packages/google/CONTRIBUTING.md', - 'libraries/kmp-iap/CONTRIBUTING.md', + "packages/apple/CONTRIBUTING.md", + "packages/google/CONTRIBUTING.md", + "libraries/kmp-iap/CONTRIBUTING.md", ]) { - expectNotIncludes(monorepoContribDoc, [ - 'openiap-apple.git', - 'openiap-google.git', - 'github.com/hyodotdev/openiap-apple', - 'github.com/hyodotdev/openiap-google', - "git commit -m 'Add amazing feature'", - ], 'contributing docs must describe the monorepo workflow'); - } - expectNotIncludes('scripts/sync-versions.mjs', [ - "resolve(rootDir, 'versions.json')", - 'Read versions.json', - ], 'root version sync script must use openiap-versions.json'); - expectIncludes('scripts/bump-version.mjs', [ - 'openiap-versions.json', - ], 'root version bump script'); - expectNotIncludes('scripts/bump-version.mjs', [ - "resolve(rootDir, 'versions.json')", - 'Updated versions.json', - 'packages/ios/Sources/OpenIapVersion.swift', - 'public static let current', - ], 'root version bump script must not use obsolete version paths'); - expectNotIncludes('knowledge/internal/04-platform-packages.md', [ - 'change `"gql"` version', - 'update the `gql` field', - ], 'platform package docs must use openiap-versions.json spec key'); + expectNotIncludes( + monorepoContribDoc, + [ + "openiap-apple.git", + "openiap-google.git", + "github.com/hyodotdev/openiap-apple", + "github.com/hyodotdev/openiap-google", + "git commit -m 'Add amazing feature'", + ], + "contributing docs must describe the monorepo workflow", + ); + } + expectNotIncludes( + "scripts/sync-versions.mjs", + ["resolve(rootDir, 'versions.json')", "Read versions.json"], + "root version sync script must use openiap-versions.json", + ); + expectIncludes( + "scripts/bump-version.mjs", + ["openiap-versions.json"], + "root version bump script", + ); + expectNotIncludes( + "scripts/bump-version.mjs", + [ + "resolve(rootDir, 'versions.json')", + "Updated versions.json", + "packages/ios/Sources/OpenIapVersion.swift", + "public static let current", + ], + "root version bump script must not use obsolete version paths", + ); + expectNotIncludes( + "knowledge/internal/04-platform-packages.md", + ['change `"gql"` version', "update the `gql` field"], + "platform package docs must use openiap-versions.json spec key", + ); for (const dependencyFile of [ - '.github/workflows/release-godot.yml', - 'libraries/flutter_inapp_purchase/android/build.gradle', - 'libraries/godot-iap/addons/godot-iap/godot_iap_plugin.gd', - 'libraries/godot-iap/addons/godot-iap/android/GodotIap.gdap', - 'libraries/godot-iap/Makefile', - 'libraries/godot-iap/scripts/write-gdap.sh', + ".github/workflows/release-godot.yml", + "libraries/flutter_inapp_purchase/android/build.gradle", + "libraries/godot-iap/addons/godot-iap/godot_iap_plugin.gd", + "libraries/godot-iap/addons/godot-iap/android/GodotIap.gdap", + "libraries/godot-iap/Makefile", + "libraries/godot-iap/scripts/write-gdap.sh", ]) { - expectNotIncludes(dependencyFile, [ - 'com.android.billingclient:billing', - ], 'Framework libraries must inherit Play Billing from openiap-google'); - } - - expectIncludes('libraries/godot-iap/addons/godot-iap/godot_iap_plugin.gd', [ - 'ANDROID_GDAP_PATH', - '_read_android_remote_dependencies', - 'FileAccess.get_file_as_string(ANDROID_GDAP_PATH)', - ], 'Godot export plugin dependency source'); - expectNotIncludes('libraries/godot-iap/addons/godot-iap/godot_iap_plugin.gd', [ - 'openiap-google:', - 'kotlinx-coroutines-android:', - ], 'Godot export plugin must read dependency versions from GDAP'); - expectIncludes('libraries/godot-iap/ios-gdextension/Sources/GodotIap/GodotIap.swift', [ - 'ErrorCode.userCancelled.rawValue', - 'ErrorCode.developerError.rawValue', - 'ErrorCode.purchaseError.rawValue', - 'ErrorCode.syncError.rawValue', - '@available(*, deprecated, message: "Use promotedProductIOS signal with requestPurchase instead.")', - '@available(*, deprecated, message: "Use verifyPurchase instead.")', - ], 'Godot iOS purchase errors must emit OpenIAP error codes'); - expectNotIncludes('libraries/godot-iap/ios-gdextension/Sources/GodotIap/GodotIap.swift', [ - '"USER_CANCELLED"', - '"MISSING_SKU"', - '"PURCHASE_FAILED"', - '"RESTORE_FAILED"', - ], 'Godot iOS purchase errors must not emit legacy custom codes'); + expectNotIncludes( + dependencyFile, + ["com.android.billingclient:billing"], + "Framework libraries must inherit Play Billing from openiap-google", + ); + } + + expectIncludes( + "libraries/godot-iap/addons/godot-iap/godot_iap_plugin.gd", + [ + "ANDROID_GDAP_PATH", + "_read_android_remote_dependencies", + "FileAccess.get_file_as_string(ANDROID_GDAP_PATH)", + ], + "Godot export plugin dependency source", + ); + expectNotIncludes( + "libraries/godot-iap/addons/godot-iap/godot_iap_plugin.gd", + ["openiap-google:", "kotlinx-coroutines-android:"], + "Godot export plugin must read dependency versions from GDAP", + ); + expectIncludes( + "libraries/godot-iap/ios-gdextension/Sources/GodotIap/GodotIap.swift", + [ + "ErrorCode.userCancelled.rawValue", + "ErrorCode.developerError.rawValue", + "ErrorCode.purchaseError.rawValue", + "ErrorCode.syncError.rawValue", + '@available(*, deprecated, message: "Use promotedProductIOS signal with requestPurchase instead.")', + '@available(*, deprecated, message: "Use verifyPurchase instead.")', + ], + "Godot iOS purchase errors must emit OpenIAP error codes", + ); + expectNotIncludes( + "libraries/godot-iap/ios-gdextension/Sources/GodotIap/GodotIap.swift", + [ + '"USER_CANCELLED"', + '"MISSING_SKU"', + '"PURCHASE_FAILED"', + '"RESTORE_FAILED"', + ], + "Godot iOS purchase errors must not emit legacy custom codes", + ); if (googleVersion) { - expectIncludes('libraries/godot-iap/addons/godot-iap/android/GodotIap.gdap', [ - `io.github.hyochan.openiap:openiap-google:${googleVersion}`, - ], 'Godot Android GDAP OpenIAP dependency version'); + expectIncludes( + "libraries/godot-iap/addons/godot-iap/android/GodotIap.gdap", + [`io.github.hyochan.openiap:openiap-google:${googleVersion}`], + "Godot Android GDAP OpenIAP dependency version", + ); } if (googleCoroutinesVersion) { - expectIncludes('libraries/godot-iap/addons/godot-iap/android/GodotIap.gdap', [ - `org.jetbrains.kotlinx:kotlinx-coroutines-android:${googleCoroutinesVersion}`, - ], 'Godot Android GDAP coroutines dependency version'); - expectIncludes('libraries/godot-iap/scripts/write-gdap.sh', [ - 'set -euo pipefail', - 'GOOGLE_OPENIAP_BUILD=', - 'read_openiap_version()', - 'python3 - "$VERSIONS_FILE" "$1"', - 'OPENIAP_GOOGLE_VERSION="$(read_openiap_version google)"', - 'COROUTINES_VERSION=', - 'read_google_variable coroutinesVersion', - 'fallback_property kotlinxCoroutinesVersion', - 'remote=["io.github.hyochan.openiap:openiap-google:$OPENIAP_GOOGLE_VERSION", "org.jetbrains.kotlinx:kotlinx-coroutines-android:$COROUTINES_VERSION"]', - ], 'Godot GDAP dependency writer'); - expectIncludes('libraries/godot-iap/scripts/sync-versions.sh', [ - 'set -euo pipefail', - 'GOOGLE_OPENIAP_BUILD=', - 'read_openiap_version()', - 'python3 - "$VERSIONS_FILE" "$1"', - 'read_google_variable coroutinesVersion', - 'fallback_property kotlinxCoroutinesVersion', - ], 'Godot version sync must read coroutines from packages/google when available'); - expectIncludes('libraries/godot-iap/scripts/build_android.sh', [ - 'set -euo pipefail', - ], 'Godot Android build script must fail on unset vars and pipeline failures'); - expectIncludes('libraries/godot-iap/Makefile', [ - 'scripts/write-gdap.sh', - ], 'Godot Makefile must use shared GDAP writer'); - expectIncludes('libraries/godot-iap/Makefile', [ - 'gh release list --repo hyodotdev/openiap', - 'startswith("godot-iap-")', - 'RELEASE_VERSION = $(patsubst godot-iap-%,%,$(RELEASE_TAG))', - 'https://github.com/hyodotdev/openiap/releases/download/$(RELEASE_TAG)/$(RELEASE_ZIP_NAME)', - ], 'Godot Makefile release test target must use monorepo release assets'); - expectNotIncludes('libraries/godot-iap/Makefile', [ - 'hyochan/godot-iap', - 'github.com/hyochan/godot-iap/releases', - 'RELEASE_ZIP_NAME = godot-iap-$(RELEASE_TAG).zip', - ], 'Godot Makefile release test target must not use standalone release assets'); - expectIncludes('.github/workflows/release-godot.yml', [ - './scripts/write-gdap.sh dist/addons/godot-iap/android/GodotIap.gdap', - 'https://openiap.dev/docs/setup/godot', - 'https://openiap.dev/docs/apis', - 'https://openiap.dev/docs/updates/releases', - ], 'Godot release workflow must use shared GDAP writer'); - expectNotIncludes('.github/workflows/release-godot.yml', [ - 'https://www.openiap.dev', - ], 'Godot release workflow docs links must use canonical OpenIAP URLs'); - } - expectIncludes('libraries/kmp-iap/native/InAppPurchaseBridge/Package.swift', [ - 'resolveOpenIapAppleVersion()', - 'resolveOpenIapApplePackageVersion', - 'openiap-versions.json', - 'openIapApplePackageVersion', - ], 'KMP native bridge OpenIAP Apple dependency version'); - expectNotIncludes('libraries/kmp-iap/native/InAppPurchaseBridge/Package.swift', [ - 'from: "1.2.5"', - 'return "2.1.9"', - 'Version(2, 1, 9)', - ], 'KMP native bridge OpenIAP Apple dependency version'); - expectIncludes( - 'libraries/kmp-iap/native/InAppPurchaseBridge/Sources/InAppPurchaseBridge/InAppPurchaseBridge.swift', - ['@_exported import OpenIAP'], - 'KMP native bridge SwiftPM target source', - ); - expectIncludes('libraries/kmp-iap/library/build.gradle.kts', [ - 'val kmpRootDir = projectDir.parentFile', - 'kmpRootDir.resolve("gradle.properties")', - 'kmpRootDir.resolve("openiap-versions.json")', - 'missing openiap-versions.json', - "'$key' version missing in openiap-versions.json", - 'openIapVersion("apple")', - 'openIapVersion("google")', - 'project.findProperty("libraryVersion")', - 'GenerateKmpIapVersionTask', - 'generateKmpIapVersion', - ], 'KMP Gradle native dependency versions'); - expectNotIncludes('libraries/kmp-iap/library/build.gradle.kts', [ - '?: "1.2.5"', - '?: "1.2.10"', - '1.0.0-alpha02', - '1.0.0-alpha04', - 'openiap-versions.json with kmp-iap version', - 'tasks.withType', - 'DEBUG:', - 'First 50 chars', - ], 'KMP Gradle native dependency versions must not silently fallback'); - expectIncludes('libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt', [ - 'override fun getVersion(): String = kmpIapVersionString("Android")', - ], 'KMP Android runtime version'); - expectIncludes('libraries/kmp-iap/library/src/iosMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseIOS.kt', [ - 'override fun getVersion(): String = kmpIapVersionString("iOS")', - ], 'KMP iOS runtime version'); - expectNotIncludes('libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/Helper.kt', [ - 'ANDROID_VERSION', - '1.0.0-alpha02', - ], 'KMP Android runtime version must not be stale'); - expectNotIncludes('libraries/kmp-iap/library/src/iosMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseIOS.kt', [ - '1.0.0-rc.2', - ], 'KMP iOS runtime version must not be stale'); - expectNotIncludes('libraries/kmp-iap/README.md', [ - '1.0.0-rc.2', - '1.0.0-alpha02', - ], 'KMP README version examples must not be stale'); - expectIncludes('.github/workflows/release-kmp.yml', [ - 'Update release metadata', - 'Check if release tag already exists', - 'Checkout release tag (current version)', - 'git checkout "$RELEASE_TAG"', - 'libraryVersion=$ENV{VERSION}', - './scripts/update-readme-version.sh "$VERSION"', - 'git pull --rebase origin main', - 'git push origin HEAD:main', - 'https://repo1.maven.org/maven2/io/github/hyochan/kmp-iap/$VERSION/', - 'Unable to verify kmp-iap $VERSION on Maven Central', - "if: steps.check_maven.outputs.exists == 'false'", - 'Create and push tag', - 'git tag -a "$RELEASE_TAG" -m "Release $RELEASE_TAG"', - 'git push origin "$RELEASE_TAG"', - './gradlew :library:assembleRelease --no-daemon --stacktrace', - 'files: libraries/kmp-iap/release-artifacts.zip', - 'implementation("io.github.hyochan:kmp-iap:$VERSION")', - 'implementation \'io.github.hyochan:kmp-iap:$VERSION\'', - 'central.sonatype.com/artifact/io.github.hyochan/kmp-iap/$VERSION', - ], 'KMP release workflow metadata sync'); - expectNotIncludes('.github/workflows/release-kmp.yml', [ - 'create_release:', - 'inputs.create_release', - ], 'KMP release workflow must always create GitHub releases'); - expectIncludes('packages/docs/src/pages/docs/setup/kmp.tsx', [ - 'https://central.sonatype.com/artifact/io.github.hyochan/kmp-iap', - ], 'docs KMP Maven Central link'); - expectIncludes('packages/docs/src/lib/images.ts', [ - "documentationUrl: 'https://openiap.dev/docs/setup/kmp'", - ], 'KMP docs card should point at OpenIAP docs'); - expectNotIncludes('packages/docs/src/lib/images.ts', [ - "documentationUrl: 'https://hyochan.github.io/kmp-iap'", - ], 'KMP docs card must not point at the legacy standalone docs'); - expectIncludes('scripts/agent/compile-context.ts', [ - 'function readInstallationVersions()', - 'libraries/kmp-iap/gradle.properties', - 'libraries/godot-iap/addons/godot-iap/plugin.cfg', - 'libraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csproj', - '([^<]+)<\\/PackageId>', - 'flutter pub add flutter_inapp_purchase', - 'io.github.hyochan:kmp-iap:${versions.kmp}', - 'godot-iap-${versions.godot}.zip', - 'dotnet add package ${versions.mauiPackageId}', - 'Current NuGet package version: ${versions.maui}', - 'https://central.sonatype.com/artifact/io.github.hyochan/kmp-iap', - ], 'AI context compiler framework package versions'); - expectNotIncludes('scripts/agent/compile-context.ts', [ - 'flutter_inapp_purchase: ^${versions.flutter}', - 'io.github.hyochan:kmp-iap:', - 'OpenIap.Maui" Version="${versions.maui}"', - 'dotnet add package OpenIap.Maui', - ], 'AI context compiler install commands must not hardcode framework package versions'); - expectNotIncludes('.github/workflows/release-kmp.yml', [ - 'updatePodspecDependency', - 'updateReadmeVersion', - 'spec\\.version\\s+=', - 'library/library.podspec gradle.properties', - 'io.github.hyochan.openiap:kmp-iap', - 'central.sonatype.com/artifact/io.github.hyochan.openiap/kmp-iap', - 'git pull --rebase origin main || true', - 'git push || echo "No changes to commit"', - 'git stash --include-untracked || true', - 'cp library/build/outputs/aar/*.aar release-artifacts/ || true', - 'cp library/build/libs/*.jar release-artifacts/ || true', - ], 'KMP release workflow must not call removed tasks or publish wrong coordinates'); - expectIncludes('.github/workflows/release-kmp.yml', [ - 'artifacts=(library/build/outputs/aar/*.aar library/build/libs/*.jar)', - 'No KMP release artifacts found', - 'cp "${artifacts[@]}" release-artifacts/', - ], 'KMP release workflow must fail when release artifacts are missing'); - expectIncludes('.github/workflows/release-maui.yml', [ - '- name: Create and push tag', - 'if: success()', - 'git tag -a "maui-iap-$VERSION" -m "Release maui-iap $VERSION"', - ], 'MAUI release workflow must create tags before GitHub Release creation'); - expectNotIncludes('.github/workflows/release-maui.yml', [ - 'create_release:', - 'inputs.create_release', - ], 'MAUI release workflow must always create GitHub releases'); - expectNotIncludes('packages/docs/src/pages/docs/setup/kmp.tsx', [ - 'io.github.hyochan.kmpiap/library', - ], 'docs KMP Maven Central link must not use old coordinates'); - expectNotIncludes('scripts/agent/compile-context.ts', [ - 'flutter_inapp_purchase: ^5.0.0', - 'io.github.hyochan.kmpiap:library', - 'implementation("io.github.hyochan:kmp-iap:")', - 'OpenIap.Maui" Version="1.0.1', - ], 'AI context compiler framework package versions must not hardcode stale coordinates'); + expectIncludes( + "libraries/godot-iap/addons/godot-iap/android/GodotIap.gdap", + [ + `org.jetbrains.kotlinx:kotlinx-coroutines-android:${googleCoroutinesVersion}`, + ], + "Godot Android GDAP coroutines dependency version", + ); + expectIncludes( + "libraries/godot-iap/scripts/write-gdap.sh", + [ + "set -euo pipefail", + "GOOGLE_OPENIAP_BUILD=", + "read_openiap_version()", + 'python3 - "$VERSIONS_FILE" "$1"', + 'OPENIAP_GOOGLE_VERSION="$(read_openiap_version google)"', + "COROUTINES_VERSION=", + "read_google_variable coroutinesVersion", + "fallback_property kotlinxCoroutinesVersion", + 'remote=["io.github.hyochan.openiap:openiap-google:$OPENIAP_GOOGLE_VERSION", "org.jetbrains.kotlinx:kotlinx-coroutines-android:$COROUTINES_VERSION"]', + ], + "Godot GDAP dependency writer", + ); + expectIncludes( + "libraries/godot-iap/scripts/sync-versions.sh", + [ + "set -euo pipefail", + "GOOGLE_OPENIAP_BUILD=", + "read_openiap_version()", + 'python3 - "$VERSIONS_FILE" "$1"', + "read_google_variable coroutinesVersion", + "fallback_property kotlinxCoroutinesVersion", + ], + "Godot version sync must read coroutines from packages/google when available", + ); + expectIncludes( + "libraries/godot-iap/scripts/build_android.sh", + ["set -euo pipefail"], + "Godot Android build script must fail on unset vars and pipeline failures", + ); + expectIncludes( + "libraries/godot-iap/Makefile", + ["scripts/write-gdap.sh"], + "Godot Makefile must use shared GDAP writer", + ); + expectIncludes( + "libraries/godot-iap/Makefile", + [ + "gh release list --repo hyodotdev/openiap", + 'startswith("godot-iap-")', + "RELEASE_VERSION = $(patsubst godot-iap-%,%,$(RELEASE_TAG))", + "https://github.com/hyodotdev/openiap/releases/download/$(RELEASE_TAG)/$(RELEASE_ZIP_NAME)", + ], + "Godot Makefile release test target must use monorepo release assets", + ); + expectNotIncludes( + "libraries/godot-iap/Makefile", + [ + "hyochan/godot-iap", + "github.com/hyochan/godot-iap/releases", + "RELEASE_ZIP_NAME = godot-iap-$(RELEASE_TAG).zip", + ], + "Godot Makefile release test target must not use standalone release assets", + ); + expectIncludes( + ".github/workflows/release-godot.yml", + [ + "./scripts/write-gdap.sh dist/addons/godot-iap/android/GodotIap.gdap", + "https://openiap.dev/docs/setup/godot", + "https://openiap.dev/docs/apis", + "https://openiap.dev/docs/updates/releases", + ], + "Godot release workflow must use shared GDAP writer", + ); + expectNotIncludes( + ".github/workflows/release-godot.yml", + ["https://www.openiap.dev"], + "Godot release workflow docs links must use canonical OpenIAP URLs", + ); + } + expectIncludes( + "libraries/kmp-iap/native/InAppPurchaseBridge/Package.swift", + [ + "resolveOpenIapAppleVersion()", + "resolveOpenIapApplePackageVersion", + "openiap-versions.json", + "openIapApplePackageVersion", + ], + "KMP native bridge OpenIAP Apple dependency version", + ); + expectNotIncludes( + "libraries/kmp-iap/native/InAppPurchaseBridge/Package.swift", + ['from: "1.2.5"', 'return "2.1.9"', "Version(2, 1, 9)"], + "KMP native bridge OpenIAP Apple dependency version", + ); + expectIncludes( + "libraries/kmp-iap/native/InAppPurchaseBridge/Sources/InAppPurchaseBridge/InAppPurchaseBridge.swift", + ["@_exported import OpenIAP"], + "KMP native bridge SwiftPM target source", + ); + expectIncludes( + "libraries/kmp-iap/library/build.gradle.kts", + [ + "val kmpRootDir = projectDir.parentFile", + 'kmpRootDir.resolve("gradle.properties")', + 'kmpRootDir.resolve("openiap-versions.json")', + "missing openiap-versions.json", + "'$key' version missing in openiap-versions.json", + 'openIapVersion("apple")', + 'openIapVersion("google")', + 'project.findProperty("libraryVersion")', + "GenerateKmpIapVersionTask", + "generateKmpIapVersion", + ], + "KMP Gradle native dependency versions", + ); + expectNotIncludes( + "libraries/kmp-iap/library/build.gradle.kts", + [ + '?: "1.2.5"', + '?: "1.2.10"', + "1.0.0-alpha02", + "1.0.0-alpha04", + "openiap-versions.json with kmp-iap version", + "tasks.withType", + "DEBUG:", + "First 50 chars", + ], + "KMP Gradle native dependency versions must not silently fallback", + ); + expectIncludes( + "libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt", + ['override fun getVersion(): String = kmpIapVersionString("Android")'], + "KMP Android runtime version", + ); + expectIncludes( + "libraries/kmp-iap/library/src/iosMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseIOS.kt", + ['override fun getVersion(): String = kmpIapVersionString("iOS")'], + "KMP iOS runtime version", + ); + expectNotIncludes( + "libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/Helper.kt", + ["ANDROID_VERSION", "1.0.0-alpha02"], + "KMP Android runtime version must not be stale", + ); + expectNotIncludes( + "libraries/kmp-iap/library/src/iosMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseIOS.kt", + ["1.0.0-rc.2"], + "KMP iOS runtime version must not be stale", + ); + expectNotIncludes( + "libraries/kmp-iap/README.md", + ["1.0.0-rc.2", "1.0.0-alpha02"], + "KMP README version examples must not be stale", + ); + expectIncludes( + ".github/workflows/release-kmp.yml", + [ + "Update release metadata", + "Check if release tag already exists", + "Checkout release tag (current version)", + 'git checkout "$RELEASE_TAG"', + "libraryVersion=$ENV{VERSION}", + './scripts/update-readme-version.sh "$VERSION"', + "git pull --rebase origin main", + "git push origin HEAD:main", + "https://repo1.maven.org/maven2/io/github/hyochan/kmp-iap/$VERSION/", + "Unable to verify kmp-iap $VERSION on Maven Central", + "if: steps.check_maven.outputs.exists == 'false'", + "Create and push tag", + 'git tag -a "$RELEASE_TAG" -m "Release $RELEASE_TAG"', + 'git push origin "$RELEASE_TAG"', + "./gradlew :library:assembleRelease --no-daemon --stacktrace", + "files: libraries/kmp-iap/release-artifacts.zip", + 'implementation("io.github.hyochan:kmp-iap:$VERSION")', + "implementation 'io.github.hyochan:kmp-iap:$VERSION'", + "central.sonatype.com/artifact/io.github.hyochan/kmp-iap/$VERSION", + ], + "KMP release workflow metadata sync", + ); + expectNotIncludes( + ".github/workflows/release-kmp.yml", + ["create_release:", "inputs.create_release"], + "KMP release workflow must always create GitHub releases", + ); + expectIncludes( + "packages/docs/src/pages/docs/setup/kmp.tsx", + ["https://central.sonatype.com/artifact/io.github.hyochan/kmp-iap"], + "docs KMP Maven Central link", + ); + expectIncludes( + "packages/docs/src/lib/images.ts", + ["documentationUrl: 'https://openiap.dev/docs/setup/kmp'"], + "KMP docs card should point at OpenIAP docs", + ); + expectNotIncludes( + "packages/docs/src/lib/images.ts", + ["documentationUrl: 'https://hyochan.github.io/kmp-iap'"], + "KMP docs card must not point at the legacy standalone docs", + ); + expectIncludes( + "scripts/agent/compile-context.ts", + [ + "function readInstallationVersions()", + "libraries/kmp-iap/gradle.properties", + "libraries/godot-iap/addons/godot-iap/plugin.cfg", + "libraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csproj", + "([^<]+)<\\/PackageId>", + "flutter pub add flutter_inapp_purchase", + "io.github.hyochan:kmp-iap:${versions.kmp}", + "godot-iap-${versions.godot}.zip", + "dotnet add package ${versions.mauiPackageId}", + "Current NuGet package version: ${versions.maui}", + "https://central.sonatype.com/artifact/io.github.hyochan/kmp-iap", + ], + "AI context compiler framework package versions", + ); + expectNotIncludes( + "scripts/agent/compile-context.ts", + [ + "flutter_inapp_purchase: ^${versions.flutter}", + "io.github.hyochan:kmp-iap:", + 'OpenIap.Maui" Version="${versions.maui}"', + "dotnet add package OpenIap.Maui", + ], + "AI context compiler install commands must not hardcode framework package versions", + ); + expectNotIncludes( + ".github/workflows/release-kmp.yml", + [ + "updatePodspecDependency", + "updateReadmeVersion", + "spec\\.version\\s+=", + "library/library.podspec gradle.properties", + "io.github.hyochan.openiap:kmp-iap", + "central.sonatype.com/artifact/io.github.hyochan.openiap/kmp-iap", + "git pull --rebase origin main || true", + 'git push || echo "No changes to commit"', + "git stash --include-untracked || true", + "cp library/build/outputs/aar/*.aar release-artifacts/ || true", + "cp library/build/libs/*.jar release-artifacts/ || true", + ], + "KMP release workflow must not call removed tasks or publish wrong coordinates", + ); + expectIncludes( + ".github/workflows/release-kmp.yml", + [ + "artifacts=(library/build/outputs/aar/*.aar library/build/libs/*.jar)", + "No KMP release artifacts found", + 'cp "${artifacts[@]}" release-artifacts/', + ], + "KMP release workflow must fail when release artifacts are missing", + ); + expectIncludes( + ".github/workflows/release-maui.yml", + [ + "- name: Create and push tag", + "if: success()", + 'git tag -a "maui-iap-$VERSION" -m "Release maui-iap $VERSION"', + ], + "MAUI release workflow must create tags before GitHub Release creation", + ); + expectNotIncludes( + ".github/workflows/release-maui.yml", + ["create_release:", "inputs.create_release"], + "MAUI release workflow must always create GitHub releases", + ); + expectNotIncludes( + "packages/docs/src/pages/docs/setup/kmp.tsx", + ["io.github.hyochan.kmpiap/library"], + "docs KMP Maven Central link must not use old coordinates", + ); + expectNotIncludes( + "scripts/agent/compile-context.ts", + [ + "flutter_inapp_purchase: ^5.0.0", + "io.github.hyochan.kmpiap:library", + 'implementation("io.github.hyochan:kmp-iap:")', + 'OpenIap.Maui" Version="1.0.1', + ], + "AI context compiler framework package versions must not hardcode stale coordinates", + ); const kmpReadmeInjectedVersionSnippet = 'implementation("io.github.hyochan:kmp-iap:' + '$ENV{VERSION}")'; - expectIncludes('libraries/kmp-iap/scripts/update-readme-version.sh', [ - 'implementation("io.github.hyochan:kmp-iap:")', - 'https://central.sonatype.com/artifact/io.github.hyochan/kmp-iap', - ], 'KMP README version script'); - expectNotIncludes('libraries/kmp-iap/scripts/update-readme-version.sh', [ - 'perl -0pi', - kmpReadmeInjectedVersionSnippet, - 'sed -i', - 'based on local.properties', - ], 'KMP README version script must not inject release-specific versions'); + expectIncludes( + "libraries/kmp-iap/scripts/update-readme-version.sh", + [ + 'implementation("io.github.hyochan:kmp-iap:")', + "https://central.sonatype.com/artifact/io.github.hyochan/kmp-iap", + ], + "KMP README version script", + ); + expectNotIncludes( + "libraries/kmp-iap/scripts/update-readme-version.sh", + [ + "perl -0pi", + kmpReadmeInjectedVersionSnippet, + "sed -i", + "based on local.properties", + ], + "KMP README version script must not inject release-specific versions", + ); for (const generatedTypeScript of [ - 'libraries/kmp-iap/scripts/generate-types.sh', - 'libraries/godot-iap/scripts/generate-types.sh', + "libraries/kmp-iap/scripts/generate-types.sh", + "libraries/godot-iap/scripts/generate-types.sh", ]) { - expectIncludes(generatedTypeScript, [ - 'json.loads', - 'data.get("spec")', - "Error: 'spec' version missing in openiap-versions.json", - ], `${generatedTypeScript} must parse openiap-versions.json as JSON`); - expectNotIncludes(generatedTypeScript, [ - 'grep \'"spec"\'', - "sed 's/.*: *", - ], `${generatedTypeScript} must not parse JSON with grep/sed`); - } - expectIncludes('libraries/godot-iap/scripts/generate-types.sh', [ - 'ADDON_DIR="$REPO_ROOT/addons/godot-iap"', - 'EXAMPLE_ADDON_DIR="$REPO_ROOT/Example/addons/godot-iap"', - 'cp "$TEMP_DIR/types.gd" "$ADDON_DIR/types.gd"', - 'cp "$TEMP_DIR/types.gd" "$EXAMPLE_ADDON_DIR/types.gd"', - ], 'Godot generated types script must update the shipped addon and example'); - expectIncludes('libraries/kmp-iap/publish-local.sh', [ - "grep '^libraryVersion=' gradle.properties", - ], 'KMP publish-local version lookup'); - expectNotIncludes('libraries/kmp-iap/publish-local.sh', [ - "grep 'version = ' library/build.gradle.kts", - ], 'KMP publish-local version lookup must not read removed literal version'); - expectIncludes('libraries/kmp-iap/library/library.podspec', [ - 'missing openiap-versions.json', - "'apple' version missing in openiap-versions.json", - ], 'KMP podspec OpenIAP Apple dependency version'); - expectNotIncludes('libraries/kmp-iap/library/library.podspec', [ - "openiap_apple_version = '1.2.5'", - 'fallback version', - ], 'KMP podspec OpenIAP Apple dependency version'); - expectIncludes('libraries/kmp-iap/example/iosApp/iosApp.xcodeproj/project.pbxproj', [ - 'OPENIAP_APPLE_VERSION=', - '$OPENIAP_APPLE_VERSION', - ], 'KMP iOS example OpenIAP framework plist version'); - expectNotIncludes('libraries/kmp-iap/example/iosApp/iosApp.xcodeproj/project.pbxproj', [ - '1.2.5', - ], 'KMP iOS example OpenIAP framework plist version'); - expectIncludes('libraries/maui-iap/android/openiap/build.gradle.kts', [ - 'missing openiap-versions.json', - "'google' version missing in openiap-versions.json", - ], 'MAUI Android OpenIAP Google dependency version'); - expectNotIncludes('libraries/maui-iap/android/openiap/build.gradle.kts', [ - '?: "', - "?: '", - ], 'MAUI Android OpenIAP Google dependency version must not silently fallback'); - expectIncludes('packages/google/build.gradle.kts', [ - 'missing openiap-versions.json', - "'google' version missing in openiap-versions.json", - 'id("com.android.library") version "8.13.2"', - 'id("com.android.application") version "8.13.2"', - 'id("com.vanniktech.maven.publish") version "0.35.0"', - ], 'packages/google root OpenIAP version'); - expectIncludes('packages/google/gradle/wrapper/gradle-wrapper.properties', [ - 'gradle-8.13-all.zip', - ], 'packages/google Gradle wrapper must support Vanniktech 0.35.0'); - expectNotIncludes('packages/google/build.gradle.kts', [ - 'GQL_VERSION', - '"gql"', - 'Fallback', - 'id("com.vanniktech.maven.publish") version "0.29.0"', - 'id("com.vanniktech.maven.publish") version "0.34.0"', - 'id("com.vanniktech.maven.publish") version "0.36.0"', - ], 'packages/google root OpenIAP version'); - expectIncludes('packages/google/openiap/build.gradle.kts', [ - 'missing openiap-versions.json', - "'google' version missing in openiap-versions.json", - 'compilerOptions', - 'JvmTarget.JVM_17', - 'val horizonPlatformVersion =', - 'val horizonBillingCompatibilityVersion =', - 'publishToMavenCentral()', - ], 'packages/google module OpenIAP version and Kotlin compiler settings'); - expectNotIncludes('packages/google/openiap/build.gradle.kts', [ - '?: "1.0.0"', - 'kotlinOptions', - 'jvmTarget = "17"', - 'SonatypeHost.CENTRAL_PORTAL', - ], 'packages/google module OpenIAP version and Kotlin compiler settings'); + expectIncludes( + generatedTypeScript, + [ + "json.loads", + 'data.get("spec")', + "Error: 'spec' version missing in openiap-versions.json", + ], + `${generatedTypeScript} must parse openiap-versions.json as JSON`, + ); + expectNotIncludes( + generatedTypeScript, + ["grep '\"spec\"'", "sed 's/.*: *"], + `${generatedTypeScript} must not parse JSON with grep/sed`, + ); + } + expectIncludes( + "libraries/godot-iap/scripts/generate-types.sh", + [ + 'ADDON_DIR="$REPO_ROOT/addons/godot-iap"', + 'EXAMPLE_ADDON_DIR="$REPO_ROOT/Example/addons/godot-iap"', + 'cp "$TEMP_DIR/types.gd" "$ADDON_DIR/types.gd"', + 'cp "$TEMP_DIR/types.gd" "$EXAMPLE_ADDON_DIR/types.gd"', + ], + "Godot generated types script must update the shipped addon and example", + ); + expectIncludes( + "libraries/kmp-iap/publish-local.sh", + ["grep '^libraryVersion=' gradle.properties"], + "KMP publish-local version lookup", + ); + expectNotIncludes( + "libraries/kmp-iap/publish-local.sh", + ["grep 'version = ' library/build.gradle.kts"], + "KMP publish-local version lookup must not read removed literal version", + ); + expectIncludes( + "libraries/kmp-iap/library/library.podspec", + [ + "missing openiap-versions.json", + "'apple' version missing in openiap-versions.json", + ], + "KMP podspec OpenIAP Apple dependency version", + ); + expectNotIncludes( + "libraries/kmp-iap/library/library.podspec", + ["openiap_apple_version = '1.2.5'", "fallback version"], + "KMP podspec OpenIAP Apple dependency version", + ); + expectIncludes( + "libraries/kmp-iap/example/iosApp/iosApp.xcodeproj/project.pbxproj", + ["OPENIAP_APPLE_VERSION=", "$OPENIAP_APPLE_VERSION"], + "KMP iOS example OpenIAP framework plist version", + ); + expectNotIncludes( + "libraries/kmp-iap/example/iosApp/iosApp.xcodeproj/project.pbxproj", + ["1.2.5"], + "KMP iOS example OpenIAP framework plist version", + ); + expectIncludes( + "libraries/maui-iap/android/openiap/build.gradle.kts", + [ + "missing openiap-versions.json", + "'google' version missing in openiap-versions.json", + ], + "MAUI Android OpenIAP Google dependency version", + ); + expectNotIncludes( + "libraries/maui-iap/android/openiap/build.gradle.kts", + ['?: "', "?: '"], + "MAUI Android OpenIAP Google dependency version must not silently fallback", + ); + expectIncludes( + "packages/google/build.gradle.kts", + [ + "missing openiap-versions.json", + "'google' version missing in openiap-versions.json", + 'id("com.android.library") version "8.13.2"', + 'id("com.android.application") version "8.13.2"', + 'id("com.vanniktech.maven.publish") version "0.35.0"', + ], + "packages/google root OpenIAP version", + ); + expectIncludes( + "packages/google/gradle/wrapper/gradle-wrapper.properties", + ["gradle-8.13-all.zip"], + "packages/google Gradle wrapper must support Vanniktech 0.35.0", + ); + expectNotIncludes( + "packages/google/build.gradle.kts", + [ + "GQL_VERSION", + '"gql"', + "Fallback", + 'id("com.vanniktech.maven.publish") version "0.29.0"', + 'id("com.vanniktech.maven.publish") version "0.34.0"', + 'id("com.vanniktech.maven.publish") version "0.36.0"', + ], + "packages/google root OpenIAP version", + ); + expectIncludes( + "packages/google/openiap/build.gradle.kts", + [ + "missing openiap-versions.json", + "'google' version missing in openiap-versions.json", + "compilerOptions", + "JvmTarget.JVM_17", + "val horizonBillingCompatibilityVersion =", + "val horizonPlatformKotlinVersion =", + "val horizonSerializationVersion =", + "publishToMavenCentral()", + ], + "packages/google module OpenIAP version and Kotlin compiler settings", + ); + expectNotIncludes( + "packages/google/openiap/build.gradle.kts", + [ + '?: "1.0.0"', + "kotlinOptions", + 'jvmTarget = "17"', + "SonatypeHost.CENTRAL_PORTAL", + ], + "packages/google module OpenIAP version and Kotlin compiler settings", + ); const googleBillingVersions = uniqueMatches( googleBuildGradle, @@ -2562,497 +4152,748 @@ function checkFrameworkDependencyHygiene() { ); if (googleBillingVersions.length !== 1) { fail( - `packages/google must use one Play Billing version, found: ${googleBillingVersions.join(', ') || '(none)'}`, + `packages/google must use one Play Billing version, found: ${googleBillingVersions.join(", ") || "(none)"}`, + ); + } + const googleGsonVersions = uniqueMatches( + googleBuildGradle, + /com\.google\.code\.gson:gson:([0-9.]+)/g, + ); + if (googleGsonVersions.length !== 1) { + fail( + `packages/google must use one Gson version, found: ${googleGsonVersions.join(", ") || "(none)"}`, + ); + } + expectIncludes( + "packages/google/openiap/build.gradle.kts", + ["com.android.billingclient:billing:$playBillingVersion"], + "packages/google Play Billing dependency version", + ); + expectNotIncludes( + "packages/google/openiap/build.gradle.kts", + ["com.android.billingclient:billing-ktx:"], + "packages/google must not leak billing-ktx Kotlin metadata to consumers", + ); + expectNotIncludes( + "libraries/kmp-iap/library/build.gradle.kts", + ["com.android.billingclient:billing-ktx:"], + "KMP Android compile classpaths must use the Billing core artifact", + ); + expectNotIncludes( + "packages/google/openiap/src/main/java/dev/hyo/openiap/store/OpenIapStore.kt", + ["printStackTrace()"], + "Google production Store code must use structured logging", + ); + expectNotIncludes( + "packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt", + [ + "printStackTrace()", + "TODO: In production", + "alternativeBillingCallback?.onTokenCreated", + ], + "Google Play production module must use structured logging", + ); + const googleBuildRoot = read("packages/google/build.gradle.kts"); + const googleCompileSdk = googleBuildGradle.match( + /compileSdk\s*=\s*(\d+)/, + )?.[1]; + const googleMinSdk = googleBuildGradle.match(/minSdk\s*=\s*(\d+)/)?.[1]; + const googleAndroidGradlePluginVersion = googleBuildRoot.match( + /com\.android\.library"\) version "([^"]+)"/, + )?.[1]; + const googleKotlinVersion = googleBuildRoot.match( + /org\.jetbrains\.kotlin\.android"\) version "([^"]+)"/, + )?.[1]; + if (!googleCompileSdk) + fail("packages/google openiap build.gradle.kts must declare compileSdk"); + if (!googleMinSdk) + fail("packages/google openiap build.gradle.kts must declare minSdk"); + if (!googleAndroidGradlePluginVersion) + fail( + "packages/google build.gradle.kts must declare Android Gradle plugin version", + ); + if (!googleKotlinVersion) + fail( + "packages/google build.gradle.kts must declare Kotlin Android plugin version", + ); + if ( + googleCompileSdk && + googleMinSdk && + googleBillingVersions.length === 1 && + googleKotlinVersion + ) { + expectIncludes( + "packages/google/README.md", + [ + `API-${googleMinSdk}%2B`, + `api?level=${googleMinSdk}`, + `**Minimum SDK**: ${googleMinSdk}`, + `**Compile SDK**: ${googleCompileSdk}`, + `**Google Play Billing**: v${googleBillingVersions[0]}`, + `**Kotlin**: ${googleKotlinVersion}+`, + ], + "Google README requirements", + ); + expectIncludes( + "packages/google/Example/build.gradle.kts", + [ + "openIapBuildFile", + 'readOpenIapAndroidInt("compileSdk")', + 'readOpenIapAndroidInt("minSdk")', + 'readOpenIapDependencyVersion("androidx.core:core-ktx")', + 'readOpenIapDependencyVersion("androidx.lifecycle:lifecycle-runtime-ktx")', + 'readOpenIapDependencyVersion("androidx.lifecycle:lifecycle-viewmodel-ktx")', + 'readOpenIapDependencyVersion("junit:junit")', + "compileSdk = openIapCompileSdk", + "minSdk = openIapMinSdk", + "targetSdk = openIapTargetSdk", + 'implementation("androidx.core:core-ktx:$openIapCoreKtxVersion")', + 'implementation("androidx.lifecycle:lifecycle-runtime-ktx:$openIapLifecycleRuntimeVersion")', + 'implementation("androidx.lifecycle:lifecycle-viewmodel-compose:$openIapLifecycleViewModelVersion")', + 'testImplementation("junit:junit:$openIapJunitVersion")', + ], + "Google example overlapping Android versions must derive from openiap module", + ); + expectNotIncludes( + "packages/google/Example/build.gradle.kts", + [ + "compileSdk = 35", + "minSdk = 24", + "targetSdk = 35", + "androidx.core:core-ktx:1.13.1", + "androidx.lifecycle:lifecycle-runtime-ktx:2.8.7", + "androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7", + "junit:junit:4.13.2", + ], + "Google example overlapping Android versions must not drift from openiap module", + ); + expectIncludes( + "libraries/expo-iap/android/build.gradle", + [ + "openiap-android-sdk.gradle", + "resolvePackageJsonFile()", + "expoIapPackageVersion", + "version = expoIapPackageVersion", + "versionName = expoIapPackageVersion", + `openIapResolveAndroidSdkVersion('compileSdkVersion', 'compileSdk', ${googleCompileSdk})`, + `openIapResolveAndroidSdkVersion('minSdkVersion', 'minSdk', ${googleMinSdk})`, + `openIapResolveAndroidSdkVersion('targetSdkVersion', 'compileSdk', ${googleCompileSdk})`, + "compileSdk = openIapCompileSdkVersion", + "minSdk = openIapMinSdkVersion", + "targetSdk = openIapTargetSdkVersion", + ], + "Expo Android SDK versions must follow openiap-google", + ); + expectIncludes( + "libraries/expo-iap/android/openiap-android-sdk.gradle", + [ + "packages/google/openiap/build.gradle.kts", + "openIapResolveAndroidSdkVersion", + "rootProject.ext.has(extName)", + ], + "Expo Android SDK versions must derive from openiap-google when available", + ); + expectNotIncludes( + "libraries/expo-iap/android/build.gradle", + [ + 'safeExtGet("compileSdkVersion", 34)', + 'safeExtGet("targetSdkVersion", 34)', + "compileSdkVersion openIapCompileSdkVersion", + "minSdkVersion openIapMinSdkVersion", + "targetSdkVersion openIapTargetSdkVersion", + 'namespace "expo.modules.iap"', + "abortOnError false", + "versionCode 1", + 'versionName "0.1.0"', + "version = '0.1.0'", + 'versionName = "0.1.0"', + ], + "Expo Android SDK fallbacks must not lag openiap-google", + ); + expectOptionalNotIncludes( + "libraries/expo-iap/example/android/build.gradle", + ["url 'https://www.jitpack.io'"], + "Expo example root Gradle must avoid deprecated Groovy property syntax", + ); + expectOptionalIncludes( + "libraries/expo-iap/example/android/app/build.gradle", + [ + "compileSdk = rootProject.ext.compileSdkVersion", + "minSdk = rootProject.ext.minSdkVersion", + "targetSdk = rootProject.ext.targetSdkVersion", + "namespace =", + ], + "Expo example app Gradle SDK versions must use assignment syntax", + ); + expectOptionalNotIncludes( + "libraries/expo-iap/example/android/app/build.gradle", + [ + "ndkVersion rootProject.ext.ndkVersion", + "buildToolsVersion rootProject.ext.buildToolsVersion", + "compileSdk rootProject.ext.compileSdkVersion", + "namespace 'dev.hyo.martie'", + "applicationId 'dev.hyo.martie'", + "minSdkVersion rootProject.ext.minSdkVersion", + "targetSdkVersion rootProject.ext.targetSdkVersion", + "signingConfig signingConfigs.debug", + "shrinkResources enableShrinkResources.toBoolean()", + "crunchPngs enablePngCrunchInRelease.toBoolean()", + "useLegacyPackaging enableLegacyPackaging.toBoolean()", + "ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~'", + ], + "Expo example app Gradle must avoid deprecated Groovy property syntax", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/android/build.gradle", + [ + "locateGoogleRootBuildFile", + "readPubspecVersion", + "flutterPackageVersion", + "version = flutterPackageVersion", + "googlePluginVersion('com.android.library')", + "openIapAndroidGradlePluginVersion", + "openIapKotlinVersion", + "readRequiredAndroidGradleProperty", + "readRequiredAndroidGradleProperty(projectDir, 'openIapAndroidAnnotationVersion')", + 'classpath "com.android.tools.build:gradle:$androidGradlePluginVersion"', + "openiap-android-sdk.gradle", + `openIapResolveAndroidSdkVersion('compileSdkVersion', 'compileSdk', ${googleCompileSdk})`, + `openIapResolveAndroidSdkVersion('minSdkVersion', 'minSdk', ${googleMinSdk})`, + `openIapResolveAndroidSdkVersion('targetSdkVersion', 'compileSdk', ${googleCompileSdk})`, + "compileSdk = openIapCompileSdkVersion", + "minSdkVersion = openIapMinSdkVersion", + "targetSdkVersion = openIapTargetSdkVersion", + ], + "Flutter Android minSdk must follow openiap-google", + ); + expectNotIncludes( + "libraries/flutter_inapp_purchase/android/build.gradle", + [ + "namespace 'io.github.hyochan.flutter_inapp_purchase'", + "compileSdkVersion openIapCompileSdkVersion", + "minSdkVersion openIapMinSdkVersion", + "targetSdkVersion openIapTargetSdkVersion", + "com.android.tools.build:gradle:8.7.3", + "implementation 'androidx.annotation:annotation:1.6.0'", + "implementation files('jars/in-app-purchasing-2.0.76.jar')", + "openIapAmazonIapJarFile", + "version = '1.0-SNAPSHOT'", + ], + "Flutter Android Gradle must avoid deprecated Groovy property syntax", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/example/android/app/build.gradle", + [ + "openiap-android-sdk.gradle", + "compileSdk = openIapCompileSdkVersion", + "minSdkVersion = openIapMinSdkVersion", + "targetSdkVersion = openIapTargetSdkVersion", + "openIapResolveDependencyVersion('junit:junit', 'openIapJunitVersion')", + "openIapResolveDependencyVersion('androidx.test:runner', 'openIapAndroidTestRunnerVersion')", + "openIapResolveDependencyVersion('androidx.test.espresso:espresso-core', 'openIapEspressoCoreVersion')", + 'testImplementation "junit:junit:$openIapJunitVersion"', + 'androidTestImplementation "androidx.test:runner:$openIapAndroidTestRunnerVersion"', + 'androidTestImplementation "androidx.test.espresso:espresso-core:$openIapEspressoCoreVersion"', + "source = '../..'", + ], + "Flutter example Android minSdk must follow openiap-google", + ); + expectNotIncludes( + "libraries/flutter_inapp_purchase/example/android/app/build.gradle", + [ + "namespace 'dev.hyo.martie'", + "compileSdkVersion openIapCompileSdkVersion", + 'ndkVersion "27.0.12077973"', + 'applicationId "dev.hyo.martie"', + "minSdkVersion openIapMinSdkVersion", + "targetSdkVersion openIapTargetSdkVersion", + "testImplementation 'junit:junit:4.13.2'", + "androidTestImplementation 'androidx.test:runner:1.5.2'", + "androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'", + "signingConfig signingConfigs.debug", + "source '../..'", + ], + "Flutter example Android Gradle must avoid deprecated Groovy property syntax", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/example/android/build.gradle", + [ + "locateGoogleRootBuildFile", + "googlePluginVersion('com.android.application')", + "openIapAndroidGradlePluginVersion", + 'classpath "com.android.tools.build:gradle:$androidGradlePluginVersion"', + ], + "Flutter example root Gradle plugin version must derive from packages/google", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/example/android/settings.gradle", + [ + "resolutionStrategy", + "useVersion(androidGradlePluginVersion)", + "useVersion(kotlinPluginVersion)", + 'id "com.android.application" apply false', + 'id "org.jetbrains.kotlin.android" apply false', + ], + "Flutter example Android Gradle plugin version must derive from packages/google", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/android/gradle.properties", + [ + `openIapAndroidGradlePluginVersion=${googleAndroidGradlePluginVersion}`, + `openIapKotlinVersion=${googleKotlinVersion}`, + "openIapAndroidAnnotationVersion=", + "openIapJunitVersion=", + ], + "Flutter Android Gradle plugin fallback versions", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/example/android/gradle.properties", + [ + `openIapAndroidGradlePluginVersion=${googleAndroidGradlePluginVersion}`, + `openIapKotlinVersion=${googleKotlinVersion}`, + "openIapJunitVersion=", + "openIapAndroidTestRunnerVersion=", + "openIapEspressoCoreVersion=", + ], + "Flutter example Android Gradle plugin fallback versions", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/android/gradle/wrapper/gradle-wrapper.properties", + ["gradle-8.13-bin.zip"], + "Flutter standalone Android Gradle wrapper must support packages/google AGP", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/example/android/gradle/wrapper/gradle-wrapper.properties", + ["gradle-8.13-all.zip"], + "Flutter example Android Gradle wrapper must support packages/google AGP", + ); + expectIncludes( + "libraries/godot-iap/android/settings.gradle.kts", + [ + "googlePluginVersion(", + "googleRootBuildFile", + "configuredVersion(fallbackPropertyName)", + ], + "Godot Android Gradle plugin versions must derive from packages/google when available", + ); + expectIncludes( + "libraries/godot-iap/android/gradle.properties", + [ + `androidGradlePluginVersion=${googleAndroidGradlePluginVersion}`, + `kotlinVersion=${googleKotlinVersion}`, + ], + "Godot Android Gradle plugin fallback versions", + ); + expectIncludes( + "libraries/godot-iap/android/gradle/wrapper/gradle-wrapper.properties", + ["gradle-8.13-bin.zip"], + "Godot Android Gradle wrapper must support packages/google AGP", + ); + expectIncludes( + "libraries/godot-iap/android/build.gradle.kts", + [ + "googleOpenIapBuildFile", + 'readGoogleAndroidInt("compileSdk", "compileSdkVersion")', + 'readGoogleAndroidInt("minSdk", "minSdkVersion")', + 'readGoogleVariable("coroutinesVersion", "kotlinxCoroutinesVersion")', + "compileSdk = googleCompileSdk", + "minSdk = googleMinSdk", + 'implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$googleCoroutinesVersion")', + ], + "Godot Android SDK versions must derive from packages/google when available", + ); + expectNotIncludes( + "libraries/godot-iap/android/build.gradle.kts", + [ + "compileSdk = 35", + "minSdk = 24", + "val kotlinxCoroutinesVersion: String by project", + "kotlinx-coroutines-android:$kotlinxCoroutinesVersion", + ], + "Godot Android SDK versions must not drift from packages/google", + ); + expectNotIncludes( + "libraries/godot-iap/android/settings.gradle.kts", + [ + 'id("com.android.library") version "8.7.2"', + 'id("org.jetbrains.kotlin.android") version "2.2.0"', + ], + "Godot Android Gradle plugin versions must not drift from packages/google", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/android/openiap-android-sdk.gradle", + [ + "openIapFindGoogleOpenIapBuildFile", + "packages/google/openiap/build.gradle.kts", + "openIapResolveAndroidSdkVersion", + "openIapResolveDependencyVersion", + "openIapReadGoogleDependencyVersion", + "rootProject.ext.has(extName)", + ], + "Flutter Android SDK versions must derive from openiap-google when available", + ); + expectNotIncludes( + "libraries/flutter_inapp_purchase/example/android/app/src/main/AndroidManifest.xml", + ['package="dev.hyo.martie"'], + "Flutter example Android namespace must live in Gradle", + ); + expectNotIncludes( + "libraries/flutter_inapp_purchase/android/build.gradle", + ["com.android.tools.build:gradle:8.1.4"], + "Flutter standalone Android Gradle plugin must not lag compileSdk support", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt", + [ + '@Suppress("DEPRECATION")', + "val isAvailable = iap.checkAlternativeBillingAvailability()", + "val token = iap.createAlternativeBillingReportingToken()", + "val payload = JSONObject(e.toJSON())", + ], + "Flutter Android plugin must preserve legacy alternative billing handlers", + ); + expectNotIncludes( + "libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt", + [ + '@Deprecated("Deprecated channel endpoint; will be removed in 7.0.0")', + "will be removed in 7.0.0", + "removed in 7.0.0", + "when (e)", + ], + "Flutter Android plugin must not reintroduce avoidable Kotlin warnings", + ); + expectNotIncludes( + "libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/FlutterInappPurchasePlugin.kt", + ["AmazonInappPurchasePlugin", "com.amazon.venezia", "isAppInstalledFrom"], + "Flutter Android plugin must not expose standalone Amazon support", + ); + expectIncludes( + "libraries/react-native-iap/android/gradle.properties", + [`NitroIap_minSdkVersion=${googleMinSdk}`], + "React Native Android minSdk must follow openiap-google", + ); + expectIncludes( + "packages/docs/src/lib/versioning.ts", + [ + "googleCompileSdk", + "googleMinSdk", + "googlePlayBillingVersion", + "export const ANDROID_SDK", + "export const GOOGLE_PLAY_BILLING", + ], + "docs Android SDK metadata must derive from generated docs metadata", + ); + expectIncludes( + "packages/docs/src/pages/docs/setup/expo.tsx", + [ + "ANDROID_SDK", + "GOOGLE_PLAY_BILLING", + "GOOGLE_PLAY_BILLING.version", + "minSdkVersion {ANDROID_SDK.minSdk}+", + "compileSdkVersion {ANDROID_SDK.compileSdk}+", + ], + "Expo setup Android requirements", + ); + expectIncludes( + "packages/docs/src/pages/docs/setup/flutter.tsx", + [ + "ANDROID_SDK", + "minSdkVersion ${ANDROID_SDK.minSdk}", + "minSdk = ${ANDROID_SDK.minSdk}", + "compileSdkVersion ${ANDROID_SDK.compileSdk}", + "compileSdk = ${ANDROID_SDK.compileSdk}", + "targetSdkVersion ${ANDROID_SDK.targetSdk}", + "targetSdk = ${ANDROID_SDK.targetSdk}", + ], + "Flutter setup Android requirements", + ); + expectIncludes( + "packages/docs/src/pages/docs/setup/react-native.tsx", + [ + "ANDROID_SDK", + "GOOGLE_PLAY_BILLING", + "GOOGLE_PLAY_BILLING.version", + "minSdkVersion {ANDROID_SDK.minSdk}+", + "compileSdkVersion {ANDROID_SDK.compileSdk}+", + ], + "React Native setup Android requirements", + ); + expectIncludes( + "packages/docs/src/pages/docs/setup/store/horizon.tsx", + ["OPENIAP_VERSIONS", "OPENIAP_VERSIONS.google"], + "Horizon setup docs must use current openiap-google version metadata", + ); + expectNotIncludes( + "packages/docs/src/pages/docs/setup/store/horizon.tsx", + ["openiap-google@1.3.2"], + "Horizon setup docs must not hardcode stale openiap-google versions", + ); + expectNotIncludes( + "packages/docs/src/pages/docs/setup/react-native.tsx", + ["Google Play Billing 8.0+", "compileSdkVersion 34+"], + "React Native setup Android requirements must not use stale Google requirements", ); - } - const googleGsonVersions = uniqueMatches( - googleBuildGradle, - /com\.google\.code\.gson:gson:([0-9.]+)/g, - ); - if (googleGsonVersions.length !== 1) { - fail( - `packages/google must use one Gson version, found: ${googleGsonVersions.join(', ') || '(none)'}`, - ); - } - expectIncludes('packages/google/openiap/build.gradle.kts', [ - 'com.android.billingclient:billing-ktx:$playBillingVersion', - ], 'packages/google Play Billing dependency version'); - expectNotIncludes('packages/google/openiap/src/main/java/dev/hyo/openiap/store/OpenIapStore.kt', [ - 'printStackTrace()', - ], 'Google production Store code must use structured logging'); - expectNotIncludes('packages/google/openiap/src/play/java/dev/hyo/openiap/OpenIapModule.kt', [ - 'printStackTrace()', - 'TODO: In production', - 'alternativeBillingCallback?.onTokenCreated', - ], 'Google Play production module must use structured logging'); - const googleBuildRoot = read('packages/google/build.gradle.kts'); - const googleCompileSdk = googleBuildGradle.match(/compileSdk\s*=\s*(\d+)/)?.[1]; - const googleMinSdk = googleBuildGradle.match(/minSdk\s*=\s*(\d+)/)?.[1]; - const googleAndroidGradlePluginVersion = googleBuildRoot.match(/com\.android\.library"\) version "([^"]+)"/)?.[1]; - const googleKotlinVersion = googleBuildRoot.match(/org\.jetbrains\.kotlin\.android"\) version "([^"]+)"/)?.[1]; - if (!googleCompileSdk) fail('packages/google openiap build.gradle.kts must declare compileSdk'); - if (!googleMinSdk) fail('packages/google openiap build.gradle.kts must declare minSdk'); - if (!googleAndroidGradlePluginVersion) fail('packages/google build.gradle.kts must declare Android Gradle plugin version'); - if (!googleKotlinVersion) fail('packages/google build.gradle.kts must declare Kotlin Android plugin version'); - if (googleCompileSdk && googleMinSdk && googleBillingVersions.length === 1 && googleKotlinVersion) { - expectIncludes('packages/google/README.md', [ - `API-${googleMinSdk}%2B`, - `api?level=${googleMinSdk}`, - `**Minimum SDK**: ${googleMinSdk}`, - `**Compile SDK**: ${googleCompileSdk}`, - `**Google Play Billing**: v${googleBillingVersions[0]}`, - `**Kotlin**: ${googleKotlinVersion}+`, - ], 'Google README requirements'); - expectIncludes('packages/google/Example/build.gradle.kts', [ - 'openIapBuildFile', - 'readOpenIapAndroidInt("compileSdk")', - 'readOpenIapAndroidInt("minSdk")', - 'readOpenIapDependencyVersion("androidx.core:core-ktx")', - 'readOpenIapDependencyVersion("androidx.lifecycle:lifecycle-runtime-ktx")', - 'readOpenIapDependencyVersion("androidx.lifecycle:lifecycle-viewmodel-ktx")', - 'readOpenIapDependencyVersion("junit:junit")', - 'compileSdk = openIapCompileSdk', - 'minSdk = openIapMinSdk', - 'targetSdk = openIapTargetSdk', - 'implementation("androidx.core:core-ktx:$openIapCoreKtxVersion")', - 'implementation("androidx.lifecycle:lifecycle-runtime-ktx:$openIapLifecycleRuntimeVersion")', - 'implementation("androidx.lifecycle:lifecycle-viewmodel-compose:$openIapLifecycleViewModelVersion")', - 'testImplementation("junit:junit:$openIapJunitVersion")', - ], 'Google example overlapping Android versions must derive from openiap module'); - expectNotIncludes('packages/google/Example/build.gradle.kts', [ - 'compileSdk = 35', - 'minSdk = 24', - 'targetSdk = 35', - 'androidx.core:core-ktx:1.13.1', - 'androidx.lifecycle:lifecycle-runtime-ktx:2.8.7', - 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7', - 'junit:junit:4.13.2', - ], 'Google example overlapping Android versions must not drift from openiap module'); - expectIncludes('libraries/expo-iap/android/build.gradle', [ - 'openiap-android-sdk.gradle', - 'resolvePackageJsonFile()', - 'expoIapPackageVersion', - 'version = expoIapPackageVersion', - 'versionName = expoIapPackageVersion', - `openIapResolveAndroidSdkVersion('compileSdkVersion', 'compileSdk', ${googleCompileSdk})`, - `openIapResolveAndroidSdkVersion('minSdkVersion', 'minSdk', ${googleMinSdk})`, - `openIapResolveAndroidSdkVersion('targetSdkVersion', 'compileSdk', ${googleCompileSdk})`, - 'compileSdk = openIapCompileSdkVersion', - 'minSdk = openIapMinSdkVersion', - 'targetSdk = openIapTargetSdkVersion', - ], 'Expo Android SDK versions must follow openiap-google'); - expectIncludes('libraries/expo-iap/android/openiap-android-sdk.gradle', [ - 'packages/google/openiap/build.gradle.kts', - 'openIapResolveAndroidSdkVersion', - 'rootProject.ext.has(extName)', - ], 'Expo Android SDK versions must derive from openiap-google when available'); - expectNotIncludes('libraries/expo-iap/android/build.gradle', [ - 'safeExtGet("compileSdkVersion", 34)', - 'safeExtGet("targetSdkVersion", 34)', - 'compileSdkVersion openIapCompileSdkVersion', - 'minSdkVersion openIapMinSdkVersion', - 'targetSdkVersion openIapTargetSdkVersion', - 'namespace "expo.modules.iap"', - 'abortOnError false', - 'versionCode 1', - 'versionName "0.1.0"', - "version = '0.1.0'", - 'versionName = "0.1.0"', - ], 'Expo Android SDK fallbacks must not lag openiap-google'); - expectOptionalNotIncludes('libraries/expo-iap/example/android/build.gradle', [ - "url 'https://www.jitpack.io'", - ], 'Expo example root Gradle must avoid deprecated Groovy property syntax'); - expectOptionalIncludes('libraries/expo-iap/example/android/app/build.gradle', [ - 'compileSdk = rootProject.ext.compileSdkVersion', - 'minSdk = rootProject.ext.minSdkVersion', - 'targetSdk = rootProject.ext.targetSdkVersion', - 'namespace =', - ], 'Expo example app Gradle SDK versions must use assignment syntax'); - expectOptionalNotIncludes('libraries/expo-iap/example/android/app/build.gradle', [ - 'ndkVersion rootProject.ext.ndkVersion', - 'buildToolsVersion rootProject.ext.buildToolsVersion', - 'compileSdk rootProject.ext.compileSdkVersion', - "namespace 'dev.hyo.martie'", - "applicationId 'dev.hyo.martie'", - 'minSdkVersion rootProject.ext.minSdkVersion', - 'targetSdkVersion rootProject.ext.targetSdkVersion', - 'signingConfig signingConfigs.debug', - 'shrinkResources enableShrinkResources.toBoolean()', - 'crunchPngs enablePngCrunchInRelease.toBoolean()', - 'useLegacyPackaging enableLegacyPackaging.toBoolean()', - "ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~'", - ], 'Expo example app Gradle must avoid deprecated Groovy property syntax'); - expectIncludes('libraries/flutter_inapp_purchase/android/build.gradle', [ - 'locateGoogleRootBuildFile', - 'readPubspecVersion', - 'flutterPackageVersion', - 'version = flutterPackageVersion', - "googlePluginVersion('com.android.library')", - 'openIapAndroidGradlePluginVersion', - 'openIapKotlinVersion', - 'readRequiredAndroidGradleProperty', - "readRequiredAndroidGradleProperty(projectDir, 'openIapAndroidAnnotationVersion')", - 'classpath "com.android.tools.build:gradle:$androidGradlePluginVersion"', - 'openiap-android-sdk.gradle', - `openIapResolveAndroidSdkVersion('compileSdkVersion', 'compileSdk', ${googleCompileSdk})`, - `openIapResolveAndroidSdkVersion('minSdkVersion', 'minSdk', ${googleMinSdk})`, - `openIapResolveAndroidSdkVersion('targetSdkVersion', 'compileSdk', ${googleCompileSdk})`, - 'compileSdk = openIapCompileSdkVersion', - 'minSdkVersion = openIapMinSdkVersion', - 'targetSdkVersion = openIapTargetSdkVersion', - ], 'Flutter Android minSdk must follow openiap-google'); - expectNotIncludes('libraries/flutter_inapp_purchase/android/build.gradle', [ - "namespace 'io.github.hyochan.flutter_inapp_purchase'", - 'compileSdkVersion openIapCompileSdkVersion', - 'minSdkVersion openIapMinSdkVersion', - 'targetSdkVersion openIapTargetSdkVersion', - 'com.android.tools.build:gradle:8.7.3', - "implementation 'androidx.annotation:annotation:1.6.0'", - "implementation files('jars/in-app-purchasing-2.0.76.jar')", - 'openIapAmazonIapJarFile', - "version = '1.0-SNAPSHOT'", - ], 'Flutter Android Gradle must avoid deprecated Groovy property syntax'); - expectIncludes('libraries/flutter_inapp_purchase/example/android/app/build.gradle', [ - 'openiap-android-sdk.gradle', - 'compileSdk = openIapCompileSdkVersion', - 'minSdkVersion = openIapMinSdkVersion', - 'targetSdkVersion = openIapTargetSdkVersion', - "openIapResolveDependencyVersion('junit:junit', 'openIapJunitVersion')", - "openIapResolveDependencyVersion('androidx.test:runner', 'openIapAndroidTestRunnerVersion')", - "openIapResolveDependencyVersion('androidx.test.espresso:espresso-core', 'openIapEspressoCoreVersion')", - 'testImplementation "junit:junit:$openIapJunitVersion"', - 'androidTestImplementation "androidx.test:runner:$openIapAndroidTestRunnerVersion"', - 'androidTestImplementation "androidx.test.espresso:espresso-core:$openIapEspressoCoreVersion"', - "source = '../..'", - ], 'Flutter example Android minSdk must follow openiap-google'); - expectNotIncludes('libraries/flutter_inapp_purchase/example/android/app/build.gradle', [ - "namespace 'dev.hyo.martie'", - 'compileSdkVersion openIapCompileSdkVersion', - 'ndkVersion "27.0.12077973"', - 'applicationId "dev.hyo.martie"', - 'minSdkVersion openIapMinSdkVersion', - 'targetSdkVersion openIapTargetSdkVersion', - "testImplementation 'junit:junit:4.13.2'", - "androidTestImplementation 'androidx.test:runner:1.5.2'", - "androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'", - 'signingConfig signingConfigs.debug', - "source '../..'", - ], 'Flutter example Android Gradle must avoid deprecated Groovy property syntax'); - expectIncludes('libraries/flutter_inapp_purchase/example/android/build.gradle', [ - 'locateGoogleRootBuildFile', - "googlePluginVersion('com.android.application')", - 'openIapAndroidGradlePluginVersion', - 'classpath "com.android.tools.build:gradle:$androidGradlePluginVersion"', - ], 'Flutter example root Gradle plugin version must derive from packages/google'); - expectIncludes('libraries/flutter_inapp_purchase/example/android/settings.gradle', [ - 'resolutionStrategy', - 'useVersion(androidGradlePluginVersion)', - 'useVersion(kotlinPluginVersion)', - 'id "com.android.application" apply false', - 'id "org.jetbrains.kotlin.android" apply false', - ], 'Flutter example Android Gradle plugin version must derive from packages/google'); - expectIncludes('libraries/flutter_inapp_purchase/android/gradle.properties', [ - `openIapAndroidGradlePluginVersion=${googleAndroidGradlePluginVersion}`, - `openIapKotlinVersion=${googleKotlinVersion}`, - 'openIapAndroidAnnotationVersion=', - 'openIapJunitVersion=', - ], 'Flutter Android Gradle plugin fallback versions'); - expectIncludes('libraries/flutter_inapp_purchase/example/android/gradle.properties', [ - `openIapAndroidGradlePluginVersion=${googleAndroidGradlePluginVersion}`, - `openIapKotlinVersion=${googleKotlinVersion}`, - 'openIapJunitVersion=', - 'openIapAndroidTestRunnerVersion=', - 'openIapEspressoCoreVersion=', - ], 'Flutter example Android Gradle plugin fallback versions'); - expectIncludes('libraries/flutter_inapp_purchase/android/gradle/wrapper/gradle-wrapper.properties', [ - 'gradle-8.13-bin.zip', - ], 'Flutter standalone Android Gradle wrapper must support packages/google AGP'); - expectIncludes('libraries/flutter_inapp_purchase/example/android/gradle/wrapper/gradle-wrapper.properties', [ - 'gradle-8.13-all.zip', - ], 'Flutter example Android Gradle wrapper must support packages/google AGP'); - expectIncludes('libraries/godot-iap/android/settings.gradle.kts', [ - 'googlePluginVersion(', - 'googleRootBuildFile', - 'configuredVersion(fallbackPropertyName)', - ], 'Godot Android Gradle plugin versions must derive from packages/google when available'); - expectIncludes('libraries/godot-iap/android/gradle.properties', [ - `androidGradlePluginVersion=${googleAndroidGradlePluginVersion}`, - `kotlinVersion=${googleKotlinVersion}`, - ], 'Godot Android Gradle plugin fallback versions'); - expectIncludes('libraries/godot-iap/android/gradle/wrapper/gradle-wrapper.properties', [ - 'gradle-8.13-bin.zip', - ], 'Godot Android Gradle wrapper must support packages/google AGP'); - expectIncludes('libraries/godot-iap/android/build.gradle.kts', [ - 'googleOpenIapBuildFile', - 'readGoogleAndroidInt("compileSdk", "compileSdkVersion")', - 'readGoogleAndroidInt("minSdk", "minSdkVersion")', - 'readGoogleVariable("coroutinesVersion", "kotlinxCoroutinesVersion")', - 'compileSdk = googleCompileSdk', - 'minSdk = googleMinSdk', - 'implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$googleCoroutinesVersion")', - ], 'Godot Android SDK versions must derive from packages/google when available'); - expectNotIncludes('libraries/godot-iap/android/build.gradle.kts', [ - 'compileSdk = 35', - 'minSdk = 24', - 'val kotlinxCoroutinesVersion: String by project', - 'kotlinx-coroutines-android:$kotlinxCoroutinesVersion', - ], 'Godot Android SDK versions must not drift from packages/google'); - expectNotIncludes('libraries/godot-iap/android/settings.gradle.kts', [ - 'id("com.android.library") version "8.7.2"', - 'id("org.jetbrains.kotlin.android") version "2.2.0"', - ], 'Godot Android Gradle plugin versions must not drift from packages/google'); - expectIncludes('libraries/flutter_inapp_purchase/android/openiap-android-sdk.gradle', [ - 'openIapFindGoogleOpenIapBuildFile', - 'packages/google/openiap/build.gradle.kts', - 'openIapResolveAndroidSdkVersion', - 'openIapResolveDependencyVersion', - 'openIapReadGoogleDependencyVersion', - 'rootProject.ext.has(extName)', - ], 'Flutter Android SDK versions must derive from openiap-google when available'); - expectNotIncludes('libraries/flutter_inapp_purchase/example/android/app/src/main/AndroidManifest.xml', [ - 'package="dev.hyo.martie"', - ], 'Flutter example Android namespace must live in Gradle'); - expectNotIncludes('libraries/flutter_inapp_purchase/android/build.gradle', [ - 'com.android.tools.build:gradle:8.1.4', - ], 'Flutter standalone Android Gradle plugin must not lag compileSdk support'); - expectIncludes('libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt', [ - '@Suppress("DEPRECATION")', - 'val isAvailable = iap.checkAlternativeBillingAvailability()', - 'val token = iap.createAlternativeBillingReportingToken()', - 'val payload = JSONObject(e.toJSON())', - ], 'Flutter Android plugin must preserve legacy alternative billing handlers'); - expectNotIncludes('libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/AndroidInappPurchasePlugin.kt', [ - '@Deprecated("Deprecated channel endpoint; will be removed in 7.0.0")', - 'will be removed in 7.0.0', - 'removed in 7.0.0', - 'when (e)', - ], 'Flutter Android plugin must not reintroduce avoidable Kotlin warnings'); - expectNotIncludes('libraries/flutter_inapp_purchase/android/src/main/kotlin/io/github/hyochan/flutter_inapp_purchase/FlutterInappPurchasePlugin.kt', [ - 'AmazonInappPurchasePlugin', - 'com.amazon.venezia', - 'isAppInstalledFrom', - ], 'Flutter Android plugin must not expose standalone Amazon support'); - expectIncludes('libraries/react-native-iap/android/gradle.properties', [ - `NitroIap_minSdkVersion=${googleMinSdk}`, - ], 'React Native Android minSdk must follow openiap-google'); - expectIncludes('packages/docs/src/lib/versioning.ts', [ - 'googleCompileSdk', - 'googleMinSdk', - 'googlePlayBillingVersion', - 'export const ANDROID_SDK', - 'export const GOOGLE_PLAY_BILLING', - ], 'docs Android SDK metadata must derive from generated docs metadata'); - expectIncludes('packages/docs/src/pages/docs/setup/expo.tsx', [ - 'ANDROID_SDK', - 'GOOGLE_PLAY_BILLING', - 'GOOGLE_PLAY_BILLING.version', - 'minSdkVersion {ANDROID_SDK.minSdk}+', - 'compileSdkVersion {ANDROID_SDK.compileSdk}+', - ], 'Expo setup Android requirements'); - expectIncludes('packages/docs/src/pages/docs/setup/flutter.tsx', [ - 'ANDROID_SDK', - 'minSdkVersion ${ANDROID_SDK.minSdk}', - 'minSdk = ${ANDROID_SDK.minSdk}', - 'compileSdkVersion ${ANDROID_SDK.compileSdk}', - 'compileSdk = ${ANDROID_SDK.compileSdk}', - 'targetSdkVersion ${ANDROID_SDK.targetSdk}', - 'targetSdk = ${ANDROID_SDK.targetSdk}', - ], 'Flutter setup Android requirements'); - expectIncludes('packages/docs/src/pages/docs/setup/react-native.tsx', [ - 'ANDROID_SDK', - 'GOOGLE_PLAY_BILLING', - 'GOOGLE_PLAY_BILLING.version', - 'minSdkVersion {ANDROID_SDK.minSdk}+', - 'compileSdkVersion {ANDROID_SDK.compileSdk}+', - ], 'React Native setup Android requirements'); - expectIncludes('packages/docs/src/pages/docs/setup/store/horizon.tsx', [ - 'OPENIAP_VERSIONS', - 'OPENIAP_VERSIONS.google', - ], 'Horizon setup docs must use current openiap-google version metadata'); - expectNotIncludes('packages/docs/src/pages/docs/setup/store/horizon.tsx', [ - 'openiap-google@1.3.2', - ], 'Horizon setup docs must not hardcode stale openiap-google versions'); - expectNotIncludes('packages/docs/src/pages/docs/setup/react-native.tsx', [ - 'Google Play Billing 8.0+', - 'compileSdkVersion 34+', - ], 'React Native setup Android requirements must not use stale Google requirements'); for (const docsSetupFile of [ - 'packages/docs/src/pages/docs/setup/expo.tsx', - 'packages/docs/src/pages/docs/setup/flutter.tsx', - 'packages/docs/src/pages/docs/setup/react-native.tsx', + "packages/docs/src/pages/docs/setup/expo.tsx", + "packages/docs/src/pages/docs/setup/flutter.tsx", + "packages/docs/src/pages/docs/setup/react-native.tsx", ]) { - expectNotIncludes(docsSetupFile, [ - `Google Play Billing Library v${googleBillingVersions[0]}`, - `Google Play Billing ${googleBillingVersions[0]}+`, - `minSdkVersion ${googleMinSdk}+`, - `compileSdkVersion ${googleCompileSdk}+`, - `minSdkVersion ${googleMinSdk}`, - `compileSdkVersion ${googleCompileSdk}`, - `targetSdkVersion ${googleCompileSdk}`, - `minSdk = ${googleMinSdk}`, - `compileSdk = ${googleCompileSdk}`, - `targetSdk = ${googleCompileSdk}`, - ], `${docsSetupFile} Android SDK values must derive from versioning.ts`); + expectNotIncludes( + docsSetupFile, + [ + `Google Play Billing Library v${googleBillingVersions[0]}`, + `Google Play Billing ${googleBillingVersions[0]}+`, + `minSdkVersion ${googleMinSdk}+`, + `compileSdkVersion ${googleCompileSdk}+`, + `minSdkVersion ${googleMinSdk}`, + `compileSdkVersion ${googleCompileSdk}`, + `targetSdkVersion ${googleCompileSdk}`, + `minSdk = ${googleMinSdk}`, + `compileSdk = ${googleCompileSdk}`, + `targetSdk = ${googleCompileSdk}`, + ], + `${docsSetupFile} Android SDK values must derive from versioning.ts`, + ); } - expectIncludes('libraries/expo-iap/plugin/src/withLocalOpenIAP.ts', [ - 'resolveAndroidGradlePluginVersions(androidModulePath)', - 'relativeAndroidModulePath', - "new File(settingsDir, '${relativeAndroidModulePath}')", - 'projectDirPattern', - 'injectPluginManagement();', - 'readGradlePluginVersion(contents,', - 'setGradlePluginVersion(', - "vanniktechMavenPublish: '0.35.0'", - 'pluginVersions.vanniktechMavenPublish', - 'pluginVersions.kotlin', - ], 'Expo local OpenIAP plugin Gradle plugin versions'); - expectOptionalIncludes('libraries/expo-iap/plugin/build/withLocalOpenIAP.js', [ - 'relativeAndroidModulePath', - "new File(settingsDir, '${relativeAndroidModulePath}')", - 'projectDirPattern', - 'injectPluginManagement();', - ], 'Expo local OpenIAP plugin build output'); - expectNotIncludes('libraries/expo-iap/plugin/src/withLocalOpenIAP.ts', [ - 'version "0.29.0"', - "new File('${androidModulePath", - ], 'Expo local OpenIAP plugin Gradle plugin versions must not drift from packages/google'); - expectOptionalIncludes('libraries/expo-iap/example/android/settings.gradle', [ - 'id("com.vanniktech.maven.publish") version "0.35.0"', - 'id("org.jetbrains.kotlin.android") version "2.2.0"', - 'id("org.jetbrains.kotlin.plugin.compose") version "2.2.0"', - "project(':openiap-google').projectDir = new File(settingsDir, '../../../../packages/google/openiap')", - ], 'Expo example local OpenIAP plugin versions'); - expectOptionalNotIncludes('libraries/expo-iap/example/android/settings.gradle', [ - 'version "0.29.0"', - 'version "2.0.21"', - ], 'Expo example local OpenIAP plugin versions must not drift'); - expectIncludes('libraries/kmp-iap/gradle/libs.versions.toml', [ - 'vanniktech-publish = "0.35.0"', - ], 'KMP Vanniktech publish plugin version'); - expectIncludes('libraries/kmp-iap/example/gradle/libs.versions.toml', [ - 'vanniktech-publish = "0.35.0"', - ], 'KMP example Vanniktech publish plugin version'); - expectIncludes('libraries/kmp-iap/library/build.gradle.kts', [ - 'publishToMavenCentral()', - ], 'KMP Vanniktech publish target'); - expectIncludes('libraries/kmp-iap/library/build.gradle.kts', [ - 'url.set("https://github.com/hyodotdev/openiap/tree/main/libraries/kmp-iap")', - 'name.set("Apache License 2.0")', - 'url.set("https://www.apache.org/licenses/LICENSE-2.0")', - 'organization.set("hyodotdev")', - 'organizationUrl.set("https://github.com/hyodotdev")', - 'connection.set("scm:git:https://github.com/hyodotdev/openiap.git")', - 'developerConnection.set("scm:git:ssh://git@github.com/hyodotdev/openiap.git")', - 'tag.set("kmp-iap-$kmpIapLibraryVersion")', - 'url.set("https://github.com/hyodotdev/openiap/issues")', - ], 'KMP Maven metadata must point at the monorepo and local license'); - expectNotIncludes('libraries/kmp-iap/library/build.gradle.kts', [ - 'github.com/hyochan/kmp-iap', - 'name.set("MIT License")', - 'https://opensource.org/licenses/MIT', - 'tag.set("v$kmpIapLibraryVersion")', - ], 'KMP Maven metadata must not point at the legacy standalone repository'); - expectIncludes('libraries/kmp-iap/library/build.gradle.kts', [ - 'fun dynamicKmpPodspec(): String', - 'tasks.matching { it.name == "podspec" }.configureEach', - 'dynamicKmpPodspec()', - ], 'KMP CocoaPods generated podspec must be post-processed by Gradle'); - expectIncludes('libraries/kmp-iap/library/library.podspec', [ - 'gradle_properties_file', - 'libraryVersion=', - 'spec.version = library_version', - 'kmp-iap-#{library_version}', - ], 'KMP CocoaPods spec version must follow gradle.properties'); - expectNotIncludes('libraries/kmp-iap/library/library.podspec', [ - "spec.version = '2.2.8'", - "spec.source = { :http=> ''}", - "spec.authors = ''", - "spec.license = ''", - ], 'KMP CocoaPods spec version must not drift from gradle.properties'); - expectIncludes('libraries/kmp-iap/publish-local.sh', [ - 'set -euo pipefail', - 'read_prop()', - 'ORG_GRADLE_PROJECT_signingInMemoryKey', - 'ORG_GRADLE_PROJECT_signingInMemoryKeyFile', - ':library:publishAndReleaseToMavenCentral', - ], 'KMP local Maven Central publish script'); - expectNotIncludes('libraries/kmp-iap/publish-local.sh', [ - 'source local.properties', - '. local.properties', - ], 'KMP local Maven Central publish script must not source local.properties'); - expectIncludes('libraries/kmp-iap/scripts/publish-local.sh', [ - 'set -euo pipefail', - '-PlibraryVersion="$VERSION"', - ], 'KMP Maven Local publish script'); - expectIncludes('libraries/kmp-iap/scripts/build-all.sh', [ - 'set -euo pipefail', - ], 'KMP build-all script must fail on unset vars and pipeline failures'); - expectNotIncludes('libraries/kmp-iap/scripts/publish-local.sh', [ - 'echo "libraryVersion=$VERSION" > local.properties', - ], 'KMP Maven Local publish script must not overwrite local.properties'); - expectIncludes('libraries/kmp-iap/local.properties.template', [ - 'mavenCentralUsername=your-central-portal-username', - 'mavenCentralPassword=your-central-portal-password', - 'signingInMemoryKeyId=', - 'signingInMemoryKeyPassword=', - 'signingInMemoryKeyFile=', - ], 'KMP local.properties template'); - expectIncludes('libraries/kmp-iap/gradle.properties.template', [ - 'mavenCentralUsername=your-central-portal-username', - 'mavenCentralPassword=your-central-portal-password', - 'signingInMemoryKeyId=', - 'signingInMemoryKeyPassword=', - 'signingInMemoryKeyFile=', - ], 'KMP gradle.properties template'); + expectIncludes( + "libraries/expo-iap/plugin/src/withLocalOpenIAP.ts", + [ + "resolveAndroidGradlePluginVersions(androidModulePath)", + "relativeAndroidModulePath", + "new File(settingsDir, '${relativeAndroidModulePath}')", + "projectDirPattern", + "injectPluginManagement();", + "readGradlePluginVersion(contents,", + "setGradlePluginVersion(", + "vanniktechMavenPublish: '0.35.0'", + "pluginVersions.vanniktechMavenPublish", + "pluginVersions.kotlin", + ], + "Expo local OpenIAP plugin Gradle plugin versions", + ); + expectOptionalIncludes( + "libraries/expo-iap/plugin/build/withLocalOpenIAP.js", + [ + "relativeAndroidModulePath", + "new File(settingsDir, '${relativeAndroidModulePath}')", + "projectDirPattern", + "injectPluginManagement();", + ], + "Expo local OpenIAP plugin build output", + ); + expectNotIncludes( + "libraries/expo-iap/plugin/src/withLocalOpenIAP.ts", + ['version "0.29.0"', "new File('${androidModulePath"], + "Expo local OpenIAP plugin Gradle plugin versions must not drift from packages/google", + ); + expectOptionalIncludes( + "libraries/expo-iap/example/android/settings.gradle", + [ + 'id("com.vanniktech.maven.publish") version "0.35.0"', + 'id("org.jetbrains.kotlin.android") version "2.2.0"', + 'id("org.jetbrains.kotlin.plugin.compose") version "2.2.0"', + "project(':openiap-google').projectDir = new File(settingsDir, '../../../../packages/google/openiap')", + ], + "Expo example local OpenIAP plugin versions", + ); + expectOptionalNotIncludes( + "libraries/expo-iap/example/android/settings.gradle", + ['version "0.29.0"', 'version "2.0.21"'], + "Expo example local OpenIAP plugin versions must not drift", + ); + expectIncludes( + "libraries/kmp-iap/gradle/libs.versions.toml", + ['vanniktech-publish = "0.35.0"'], + "KMP Vanniktech publish plugin version", + ); + expectIncludes( + "libraries/kmp-iap/example/gradle/libs.versions.toml", + ['vanniktech-publish = "0.35.0"'], + "KMP example Vanniktech publish plugin version", + ); + expectIncludes( + "libraries/kmp-iap/library/build.gradle.kts", + ["publishToMavenCentral()"], + "KMP Vanniktech publish target", + ); + expectIncludes( + "libraries/kmp-iap/library/build.gradle.kts", + [ + 'url.set("https://github.com/hyodotdev/openiap/tree/main/libraries/kmp-iap")', + 'name.set("Apache License 2.0")', + 'url.set("https://www.apache.org/licenses/LICENSE-2.0")', + 'organization.set("hyodotdev")', + 'organizationUrl.set("https://github.com/hyodotdev")', + 'connection.set("scm:git:https://github.com/hyodotdev/openiap.git")', + 'developerConnection.set("scm:git:ssh://git@github.com/hyodotdev/openiap.git")', + 'tag.set("kmp-iap-$kmpIapLibraryVersion")', + 'url.set("https://github.com/hyodotdev/openiap/issues")', + ], + "KMP Maven metadata must point at the monorepo and local license", + ); + expectNotIncludes( + "libraries/kmp-iap/library/build.gradle.kts", + [ + "github.com/hyochan/kmp-iap", + 'name.set("MIT License")', + "https://opensource.org/licenses/MIT", + 'tag.set("v$kmpIapLibraryVersion")', + ], + "KMP Maven metadata must not point at the legacy standalone repository", + ); + expectIncludes( + "libraries/kmp-iap/library/build.gradle.kts", + [ + "fun dynamicKmpPodspec(): String", + 'tasks.matching { it.name == "podspec" }.configureEach', + "dynamicKmpPodspec()", + ], + "KMP CocoaPods generated podspec must be post-processed by Gradle", + ); + expectIncludes( + "libraries/kmp-iap/library/library.podspec", + [ + "gradle_properties_file", + "libraryVersion=", + "spec.version = library_version", + "kmp-iap-#{library_version}", + ], + "KMP CocoaPods spec version must follow gradle.properties", + ); + expectNotIncludes( + "libraries/kmp-iap/library/library.podspec", + [ + "spec.version = '2.2.8'", + "spec.source = { :http=> ''}", + "spec.authors = ''", + "spec.license = ''", + ], + "KMP CocoaPods spec version must not drift from gradle.properties", + ); + expectIncludes( + "libraries/kmp-iap/publish-local.sh", + [ + "set -euo pipefail", + "read_prop()", + "ORG_GRADLE_PROJECT_signingInMemoryKey", + "ORG_GRADLE_PROJECT_signingInMemoryKeyFile", + ":library:publishAndReleaseToMavenCentral", + ], + "KMP local Maven Central publish script", + ); + expectNotIncludes( + "libraries/kmp-iap/publish-local.sh", + ["source local.properties", ". local.properties"], + "KMP local Maven Central publish script must not source local.properties", + ); + expectIncludes( + "libraries/kmp-iap/scripts/publish-local.sh", + ["set -euo pipefail", '-PlibraryVersion="$VERSION"'], + "KMP Maven Local publish script", + ); + expectIncludes( + "libraries/kmp-iap/scripts/build-all.sh", + ["set -euo pipefail"], + "KMP build-all script must fail on unset vars and pipeline failures", + ); + expectNotIncludes( + "libraries/kmp-iap/scripts/publish-local.sh", + ['echo "libraryVersion=$VERSION" > local.properties'], + "KMP Maven Local publish script must not overwrite local.properties", + ); + expectIncludes( + "libraries/kmp-iap/local.properties.template", + [ + "mavenCentralUsername=your-central-portal-username", + "mavenCentralPassword=your-central-portal-password", + "signingInMemoryKeyId=", + "signingInMemoryKeyPassword=", + "signingInMemoryKeyFile=", + ], + "KMP local.properties template", + ); + expectIncludes( + "libraries/kmp-iap/gradle.properties.template", + [ + "mavenCentralUsername=your-central-portal-username", + "mavenCentralPassword=your-central-portal-password", + "signingInMemoryKeyId=", + "signingInMemoryKeyPassword=", + "signingInMemoryKeyFile=", + ], + "KMP gradle.properties template", + ); for (const staleKmpSigningFile of [ - 'libraries/kmp-iap/local.properties.template', - 'libraries/kmp-iap/gradle.properties.template', - 'libraries/kmp-iap/gradle.properties', + "libraries/kmp-iap/local.properties.template", + "libraries/kmp-iap/gradle.properties.template", + "libraries/kmp-iap/gradle.properties", ]) { - expectNotIncludes(staleKmpSigningFile, [ - 'signing.keyId', - 'signing.password', - 'signing.secretKeyRingFile', - 'signing.gnupg.keyName', - 'signing.gnupg.passphrase', - 'your-sonatype-username', - 'your-sonatype-password', - ], `${staleKmpSigningFile} must use current Vanniktech signing properties`); + expectNotIncludes( + staleKmpSigningFile, + [ + "signing.keyId", + "signing.password", + "signing.secretKeyRingFile", + "signing.gnupg.keyName", + "signing.gnupg.passphrase", + "your-sonatype-username", + "your-sonatype-password", + ], + `${staleKmpSigningFile} must use current Vanniktech signing properties`, + ); } - expectIncludes('packages/google/scripts/publish-local.sh', [ - ':openiap:publishAndReleaseToMavenCentral', - ], 'Google local publish Central Portal task'); - expectNotIncludes('libraries/kmp-iap/gradle/libs.versions.toml', [ - 'vanniktech-publish = "0.29.0"', - 'vanniktech-publish = "0.34.0"', - 'vanniktech-publish = "0.36.0"', - ], 'KMP Vanniktech publish plugin version must not use deprecated plugin'); - expectNotIncludes('libraries/kmp-iap/example/gradle/libs.versions.toml', [ - 'vanniktech-publish = "0.29.0"', - 'vanniktech-publish = "0.34.0"', - 'vanniktech-publish = "0.36.0"', - ], 'KMP example Vanniktech publish plugin version must not use deprecated plugin'); - expectNotIncludes('libraries/kmp-iap/library/build.gradle.kts', [ - 'SonatypeHost.CENTRAL_PORTAL', - '"sonatypeRepositoryId"', - '"sonatypeAutomaticRelease"', - ], 'KMP Vanniktech publish target must use Central Portal default API'); + expectIncludes( + "packages/google/scripts/publish-local.sh", + [":openiap:publishAndReleaseToMavenCentral"], + "Google local publish Central Portal task", + ); + expectNotIncludes( + "libraries/kmp-iap/gradle/libs.versions.toml", + [ + 'vanniktech-publish = "0.29.0"', + 'vanniktech-publish = "0.34.0"', + 'vanniktech-publish = "0.36.0"', + ], + "KMP Vanniktech publish plugin version must not use deprecated plugin", + ); + expectNotIncludes( + "libraries/kmp-iap/example/gradle/libs.versions.toml", + [ + 'vanniktech-publish = "0.29.0"', + 'vanniktech-publish = "0.34.0"', + 'vanniktech-publish = "0.36.0"', + ], + "KMP example Vanniktech publish plugin version must not use deprecated plugin", + ); + expectNotIncludes( + "libraries/kmp-iap/library/build.gradle.kts", + [ + "SonatypeHost.CENTRAL_PORTAL", + '"sonatypeRepositoryId"', + '"sonatypeAutomaticRelease"', + ], + "KMP Vanniktech publish target must use Central Portal default API", + ); for (const publishingFile of [ - 'libraries/kmp-iap/gradle.properties', - 'libraries/kmp-iap/publish-local.sh', - 'packages/google/scripts/publish-local.sh', + "libraries/kmp-iap/gradle.properties", + "libraries/kmp-iap/publish-local.sh", + "packages/google/scripts/publish-local.sh", ]) { - expectNotIncludes(publishingFile, [ - 'SONATYPE_HOST', - 'sonatypeHost', - 'sonatypeRepositoryId', - 'sonatypeAutomaticRelease', - 'SONATYPE_AUTOMATIC_RELEASE', - 'mavenCentralStagingProfileId', - 'sonatypeStagingProfileId', - 'ORG_GRADLE_PROJECT_mavenCentralPublishing', - 'ORG_GRADLE_PROJECT_signAllPublications', - ], `${publishingFile} must not use legacy Sonatype host properties`); + expectNotIncludes( + publishingFile, + [ + "SONATYPE_HOST", + "sonatypeHost", + "sonatypeRepositoryId", + "sonatypeAutomaticRelease", + "SONATYPE_AUTOMATIC_RELEASE", + "mavenCentralStagingProfileId", + "sonatypeStagingProfileId", + "ORG_GRADLE_PROJECT_mavenCentralPublishing", + "ORG_GRADLE_PROJECT_signAllPublications", + ], + `${publishingFile} must not use legacy Sonatype host properties`, + ); } } @@ -3060,9 +4901,13 @@ function checkFrameworkDependencyHygiene() { googleBuildGradle, /val\s+horizonBillingCompatibilityVersion\s*=\s*"([^"]+)"/g, ); - const horizonPlatformVersions = uniqueMatches( + const horizonPlatformKotlinVersions = uniqueMatches( + googleBuildGradle, + /val\s+horizonPlatformKotlinVersion\s*=\s*"([^"]+)"/g, + ); + const horizonSerializationVersions = uniqueMatches( googleBuildGradle, - /val\s+horizonPlatformVersion\s*=\s*"([^"]+)"/g, + /val\s+horizonSerializationVersion\s*=\s*"([^"]+)"/g, ); const amazonAppstoreSdkVersions = uniqueMatches( googleBuildGradle, @@ -3070,95 +4915,166 @@ function checkFrameworkDependencyHygiene() { ); if (horizonBillingVersions.length !== 1) { fail( - `packages/google must use one Horizon Billing Compatibility version, found: ${horizonBillingVersions.join(', ') || '(none)'}`, + `packages/google must use one Horizon Billing Compatibility version, found: ${horizonBillingVersions.join(", ") || "(none)"}`, + ); + } + if ( + horizonBillingVersions.length === 1 && + horizonBillingVersions[0] !== "2.0.0" + ) { + fail( + `packages/google must use latest audited Horizon Billing Compatibility 2.0.0, found: ${horizonBillingVersions[0]}`, + ); + } + if (horizonPlatformKotlinVersions.length !== 1) { + fail( + `packages/google must use one Horizon Platform Kotlin SDK version, found: ${horizonPlatformKotlinVersions.join(", ") || "(none)"}`, ); } - if (horizonPlatformVersions.length !== 1) { + if (horizonSerializationVersions.length !== 1) { fail( - `packages/google must use one Horizon Platform SDK version, found: ${horizonPlatformVersions.join(', ') || '(none)'}`, + `packages/google must use one Horizon serialization version, found: ${horizonSerializationVersions.join(", ") || "(none)"}`, ); } if (amazonAppstoreSdkVersions.length !== 1) { fail( - `packages/google must use one Amazon Appstore SDK version, found: ${amazonAppstoreSdkVersions.join(', ') || '(none)'}`, - ); - } - expectIncludes('packages/google/openiap/build.gradle.kts', [ - 'com.meta.horizon.platform.ovr:android-platform-sdk:$horizonPlatformVersion', - 'com.meta.horizon.billingclient.api:horizon-billing-compatibility:$horizonBillingCompatibilityVersion', - ], 'packages/google Horizon dependency versions'); - - const mauiProps = read('libraries/maui-iap/src/Directory.Build.props'); - const mauiBillingVersion = mauiProps.match(/([^<]+)<\/MauiPlayBillingVersion>/)?.[1]; - const mauiAmazonAppstoreSdkVersion = mauiProps.match(/([^<]+)<\/MauiAmazonAppstoreSdkVersion>/)?.[1]; - const mauiHorizonPlatformSdkVersion = mauiProps.match(/([^<]+)<\/MauiHorizonPlatformSdkVersion>/)?.[1]; - const mauiHorizonBillingCompatibilityVersion = mauiProps.match(/([^<]+)<\/MauiHorizonBillingCompatibilityVersion>/)?.[1]; - const mauiGsonVersion = mauiProps.match(/([^<]+)<\/MauiGsonVersion>/)?.[1]; - const mauiBillingClientNuGetVersion = mauiProps.match(/([^<]+)<\/MauiBillingClientNuGetVersion>/)?.[1]; - const mauiGoogleGsonNuGetVersion = mauiProps.match(/([^<]+)<\/MauiGoogleGsonNuGetVersion>/)?.[1]; - const mauiAndroidXActivityVersion = mauiProps.match(/([^<]+)<\/MauiAndroidXActivityVersion>/)?.[1]; - const mauiAndroidXFragmentVersion = mauiProps.match(/([^<]+)<\/MauiAndroidXFragmentVersion>/)?.[1]; - const mauiAndroidXLifecycleVersion = mauiProps.match(/([^<]+)<\/MauiAndroidXLifecycleVersion>/)?.[1]; - const mauiAndroidXSavedStateVersion = mauiProps.match(/([^<]+)<\/MauiAndroidXSavedStateVersion>/)?.[1]; - expectIncludes('scripts/sync-versions.sh', [ - 'sync_maui_android_versions', - 'packages/google/openiap/build.gradle.kts', - 'MauiPlayBillingVersion', - 'MauiAmazonAppstoreSdkVersion', - 'MauiHorizonPlatformSdkVersion', - 'MauiHorizonBillingCompatibilityVersion', - 'MauiBillingClientNuGetVersion', - 'MauiGoogleGsonNuGetVersion', - 'MauiAndroidXActivityVersion', - 'MauiAndroidXLifecycleVersion', - 'mauiGsonVersion', - ], 'root version sync must update MAUI Android dependency versions from packages/google'); - expectIncludes('libraries/maui-iap/src/Directory.Build.props', [ - 'Generated by scripts/sync-versions.sh', - 'MauiPlayBillingVersion', - 'MauiAmazonAppstoreSdkVersion', - 'MauiHorizonPlatformSdkVersion', - 'MauiHorizonBillingCompatibilityVersion', - 'MauiGsonVersion', - 'MauiBillingClientNuGetVersion', - 'MauiGoogleGsonNuGetVersion', - 'MauiAndroidXActivityVersion', - 'MauiAndroidXFragmentVersion', - 'MauiAndroidXLifecycleVersion', - 'MauiAndroidXSavedStateVersion', - ], 'MAUI Directory.Build.props must be generated by version sync'); + `packages/google must use one Amazon Appstore SDK version, found: ${amazonAppstoreSdkVersions.join(", ") || "(none)"}`, + ); + } + expectIncludes( + "packages/google/openiap/build.gradle.kts", + [ + "com.meta.horizon.billingclient.api:horizon-billing-compatibility:$horizonBillingCompatibilityVersion", + "com.meta.horizon.platform.sdk:$module:$horizonPlatformKotlinVersion", + "org.jetbrains.kotlinx:kotlinx-serialization-json:$horizonSerializationVersion", + ], + "packages/google Horizon dependency versions", + ); + expectNotIncludes( + "packages/google/openiap/build.gradle.kts", + ["com.meta.horizon.platform.ovr:android-platform-sdk"], + "packages/google Horizon 2.x must not ship the legacy OVR Platform SDK", + ); + + const mauiProps = read("libraries/maui-iap/src/Directory.Build.props"); + const mauiBillingVersion = mauiProps.match( + /([^<]+)<\/MauiPlayBillingVersion>/, + )?.[1]; + const mauiAmazonAppstoreSdkVersion = mauiProps.match( + /([^<]+)<\/MauiAmazonAppstoreSdkVersion>/, + )?.[1]; + const mauiHorizonBillingCompatibilityVersion = mauiProps.match( + /([^<]+)<\/MauiHorizonBillingCompatibilityVersion>/, + )?.[1]; + const mauiHorizonPlatformKotlinVersion = mauiProps.match( + /([^<]+)<\/MauiHorizonPlatformKotlinVersion>/, + )?.[1]; + const mauiHorizonSerializationNuGetVersion = mauiProps.match( + /([^<]+)<\/MauiHorizonSerializationNuGetVersion>/, + )?.[1]; + const mauiGsonVersion = mauiProps.match( + /([^<]+)<\/MauiGsonVersion>/, + )?.[1]; + const mauiBillingClientNuGetVersion = mauiProps.match( + /([^<]+)<\/MauiBillingClientNuGetVersion>/, + )?.[1]; + const mauiGoogleGsonNuGetVersion = mauiProps.match( + /([^<]+)<\/MauiGoogleGsonNuGetVersion>/, + )?.[1]; + const mauiAndroidXActivityVersion = mauiProps.match( + /([^<]+)<\/MauiAndroidXActivityVersion>/, + )?.[1]; + const mauiAndroidXFragmentVersion = mauiProps.match( + /([^<]+)<\/MauiAndroidXFragmentVersion>/, + )?.[1]; + const mauiAndroidXLifecycleVersion = mauiProps.match( + /([^<]+)<\/MauiAndroidXLifecycleVersion>/, + )?.[1]; + const mauiAndroidXSavedStateVersion = mauiProps.match( + /([^<]+)<\/MauiAndroidXSavedStateVersion>/, + )?.[1]; + expectIncludes( + "scripts/sync-versions.sh", + [ + "sync_maui_android_versions", + "packages/google/openiap/build.gradle.kts", + "MauiPlayBillingVersion", + "MauiAmazonAppstoreSdkVersion", + "MauiHorizonBillingCompatibilityVersion", + "MauiHorizonPlatformKotlinVersion", + "MauiHorizonSerializationNuGetVersion", + "MauiBillingClientNuGetVersion", + "MauiGoogleGsonNuGetVersion", + "MauiAndroidXActivityVersion", + "MauiAndroidXLifecycleVersion", + "mauiGsonVersion", + ], + "root version sync must update MAUI Android dependency versions from packages/google", + ); + expectIncludes( + "libraries/maui-iap/src/Directory.Build.props", + [ + "Generated by scripts/sync-versions.sh", + "MauiPlayBillingVersion", + "MauiAmazonAppstoreSdkVersion", + "MauiHorizonBillingCompatibilityVersion", + "MauiHorizonPlatformKotlinVersion", + "MauiHorizonSerializationNuGetVersion", + "MauiGsonVersion", + "MauiBillingClientNuGetVersion", + "MauiGoogleGsonNuGetVersion", + "MauiAndroidXActivityVersion", + "MauiAndroidXFragmentVersion", + "MauiAndroidXLifecycleVersion", + "MauiAndroidXSavedStateVersion", + ], + "MAUI Directory.Build.props must be generated by version sync", + ); if (!mauiBillingVersion) { - fail('MAUI Directory.Build.props must define MauiPlayBillingVersion'); + fail("MAUI Directory.Build.props must define MauiPlayBillingVersion"); } if (!mauiAmazonAppstoreSdkVersion) { - fail('MAUI Directory.Build.props must define MauiAmazonAppstoreSdkVersion'); - } - if (!mauiHorizonPlatformSdkVersion) { - fail('MAUI Directory.Build.props must define MauiHorizonPlatformSdkVersion'); + fail("MAUI Directory.Build.props must define MauiAmazonAppstoreSdkVersion"); } if (!mauiHorizonBillingCompatibilityVersion) { - fail('MAUI Directory.Build.props must define MauiHorizonBillingCompatibilityVersion'); + fail( + "MAUI Directory.Build.props must define MauiHorizonBillingCompatibilityVersion", + ); + } + if (!mauiHorizonPlatformKotlinVersion) { + fail( + "MAUI Directory.Build.props must define MauiHorizonPlatformKotlinVersion", + ); + } + if (!mauiHorizonSerializationNuGetVersion) { + fail( + "MAUI Directory.Build.props must define MauiHorizonSerializationNuGetVersion", + ); } if (!mauiGsonVersion) { - fail('MAUI Directory.Build.props must define MauiGsonVersion'); + fail("MAUI Directory.Build.props must define MauiGsonVersion"); } if (!mauiBillingClientNuGetVersion) { - fail('MAUI Directory.Build.props must define MauiBillingClientNuGetVersion'); + fail( + "MAUI Directory.Build.props must define MauiBillingClientNuGetVersion", + ); } if (!mauiGoogleGsonNuGetVersion) { - fail('MAUI Directory.Build.props must define MauiGoogleGsonNuGetVersion'); + fail("MAUI Directory.Build.props must define MauiGoogleGsonNuGetVersion"); } if (!mauiAndroidXActivityVersion) { - fail('MAUI Directory.Build.props must define MauiAndroidXActivityVersion'); + fail("MAUI Directory.Build.props must define MauiAndroidXActivityVersion"); } if (!mauiAndroidXFragmentVersion) { - fail('MAUI Directory.Build.props must define MauiAndroidXFragmentVersion'); + fail("MAUI Directory.Build.props must define MauiAndroidXFragmentVersion"); } if (!mauiAndroidXLifecycleVersion) { - fail('MAUI Directory.Build.props must define MauiAndroidXLifecycleVersion'); + fail("MAUI Directory.Build.props must define MauiAndroidXLifecycleVersion"); } if (!mauiAndroidXSavedStateVersion) { - fail('MAUI Directory.Build.props must define MauiAndroidXSavedStateVersion'); + fail( + "MAUI Directory.Build.props must define MauiAndroidXSavedStateVersion", + ); } if (googleBillingVersions.length === 1) { if (mauiBillingVersion !== googleBillingVersions[0]) { @@ -3176,19 +5092,36 @@ function checkFrameworkDependencyHygiene() { ); } } - if (amazonAppstoreSdkVersions.length === 1 && mauiAmazonAppstoreSdkVersion !== amazonAppstoreSdkVersions[0]) { + if ( + amazonAppstoreSdkVersions.length === 1 && + mauiAmazonAppstoreSdkVersion !== amazonAppstoreSdkVersions[0] + ) { fail( `MAUI Amazon Appstore SDK version ${mauiAmazonAppstoreSdkVersion} must match packages/google ${amazonAppstoreSdkVersions[0]}`, ); } - if (horizonPlatformVersions.length === 1 && mauiHorizonPlatformSdkVersion !== horizonPlatformVersions[0]) { + if ( + horizonBillingVersions.length === 1 && + mauiHorizonBillingCompatibilityVersion !== horizonBillingVersions[0] + ) { + fail( + `MAUI Horizon Billing Compatibility version ${mauiHorizonBillingCompatibilityVersion} must match packages/google ${horizonBillingVersions[0]}`, + ); + } + if ( + horizonPlatformKotlinVersions.length === 1 && + mauiHorizonPlatformKotlinVersion !== horizonPlatformKotlinVersions[0] + ) { fail( - `MAUI Horizon Platform SDK version ${mauiHorizonPlatformSdkVersion} must match packages/google ${horizonPlatformVersions[0]}`, + `MAUI Horizon Platform Kotlin SDK version ${mauiHorizonPlatformKotlinVersion} must match packages/google ${horizonPlatformKotlinVersions[0]}`, ); } - if (horizonBillingVersions.length === 1 && mauiHorizonBillingCompatibilityVersion !== horizonBillingVersions[0]) { + if ( + mauiHorizonSerializationNuGetVersion && + mauiHorizonSerializationNuGetVersion !== "1.11.0.1" + ) { fail( - `MAUI Horizon Billing Compatibility version ${mauiHorizonBillingCompatibilityVersion} must match packages/google ${horizonBillingVersions[0]}`, + `MAUI Horizon serialization NuGet version must use the audited 1.11.0.1 runtime, found: ${mauiHorizonSerializationNuGetVersion}`, ); } if (googleGsonVersions.length === 1) { @@ -3197,173 +5130,286 @@ function checkFrameworkDependencyHygiene() { `MAUI Android Gson Maven version ${mauiGsonVersion} must match packages/google ${googleGsonVersions[0]}`, ); } - const mauiAndroidGradleProperties = read('libraries/maui-iap/android/gradle.properties'); - const mauiAndroidGsonVersion = - mauiAndroidGradleProperties.match(/^mauiGsonVersion=(.+)$/m)?.[1]; + const mauiAndroidGradleProperties = read( + "libraries/maui-iap/android/gradle.properties", + ); + const mauiAndroidGsonVersion = mauiAndroidGradleProperties.match( + /^mauiGsonVersion=(.+)$/m, + )?.[1]; if (!mauiAndroidGsonVersion) { - fail('MAUI Android gradle.properties must define mauiGsonVersion'); + fail("MAUI Android gradle.properties must define mauiGsonVersion"); } else if (mauiAndroidGsonVersion !== googleGsonVersions[0]) { fail( `MAUI Android Gradle Gson version ${mauiAndroidGsonVersion} must match packages/google ${googleGsonVersions[0]}`, ); } } - expectIncludes('libraries/maui-iap/android/openiap/build.gradle.kts', [ - 'googleOpenIapBuildFile', - 'readGoogleAndroidInt("compileSdk")', - 'readGoogleAndroidInt("minSdk")', - 'readMauiAndroidMinSdk()', - 'readGoogleDependencyVersion("androidx.core:core-ktx")', - 'readGoogleVariable("coroutinesVersion")', - 'compileSdk = googleCompileSdk', - 'minSdk = maxOf(googleMinSdk, mauiAndroidMinSdk)', - 'openIapAndroidStore', - 'openiap-google-amazon', - 'openiap-google-horizon', - 'missingDimensionStrategy("platform", openIapAndroidStore)', - 'mauiGsonVersion', - 'implementation("androidx.core:core-ktx:$googleCoreKtxVersion")', - 'com.google.code.gson:gson:$gsonVersion', - 'implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$googleCoroutinesVersion")', - ], 'MAUI Android facade Gson dependency version'); - expectIncludes('libraries/maui-iap/android/settings.gradle.kts', [ - 'googleRootBuildFile', - 'googlePluginVersion("com.android.library")', - 'googlePluginVersion("org.jetbrains.kotlin.android")', - 'openiap-google-horizon', - 'openiap-google-amazon', - ], 'MAUI Android Gradle plugin versions must derive from packages/google'); - expectIncludes('libraries/maui-iap/android/build.gradle.kts', [ - 'id("com.android.library") apply false', - 'id("org.jetbrains.kotlin.android") apply false', - ], 'MAUI Android root Gradle plugins'); - expectNotIncludes('libraries/maui-iap/android/openiap/build.gradle.kts', [ - 'compileSdk = 35', - 'minSdk = 24', - 'androidx.core:core-ktx:1.13.1', - 'kotlinx-coroutines-android:1.9.0', - ], 'MAUI Android facade versions must derive from openiap-google and MAUI metadata'); + expectIncludes( + "libraries/maui-iap/android/openiap/build.gradle.kts", + [ + "googleOpenIapBuildFile", + 'readGoogleAndroidInt("compileSdk")', + 'readGoogleAndroidInt("minSdk")', + "readMauiAndroidMinSdk()", + 'readGoogleDependencyVersion("androidx.core:core-ktx")', + 'readGoogleVariable("coroutinesVersion")', + "compileSdk = googleCompileSdk", + "minSdk = maxOf(googleMinSdk, mauiAndroidMinSdk)", + "openIapAndroidStore", + "openiap-google-amazon", + "openiap-google-horizon", + 'missingDimensionStrategy("platform", openIapAndroidStore)', + "mauiGsonVersion", + 'implementation("androidx.core:core-ktx:$googleCoreKtxVersion")', + "com.google.code.gson:gson:$gsonVersion", + 'implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$googleCoroutinesVersion")', + ], + "MAUI Android facade Gson dependency version", + ); + expectIncludes( + "libraries/maui-iap/android/settings.gradle.kts", + [ + "googleRootBuildFile", + 'googlePluginVersion("com.android.library")', + 'googlePluginVersion("org.jetbrains.kotlin.android")', + "openiap-google-horizon", + "openiap-google-amazon", + ], + "MAUI Android Gradle plugin versions must derive from packages/google", + ); + expectIncludes( + "libraries/maui-iap/android/build.gradle.kts", + [ + 'id("com.android.library") apply false', + 'id("org.jetbrains.kotlin.android") apply false', + ], + "MAUI Android root Gradle plugins", + ); + expectNotIncludes( + "libraries/maui-iap/android/openiap/build.gradle.kts", + [ + "compileSdk = 35", + "minSdk = 24", + "androidx.core:core-ktx:1.13.1", + "kotlinx-coroutines-android:1.9.0", + ], + "MAUI Android facade versions must derive from openiap-google and MAUI metadata", + ); for (const mauiGradlePluginFile of [ - 'libraries/maui-iap/android/settings.gradle.kts', - 'libraries/maui-iap/android/build.gradle.kts', + "libraries/maui-iap/android/settings.gradle.kts", + "libraries/maui-iap/android/build.gradle.kts", ]) { - expectNotIncludes(mauiGradlePluginFile, [ - 'version "8.7.3"', - 'version "8.13.2"', - 'version "2.2.0"', - ], `${mauiGradlePluginFile} must not hardcode Google Gradle plugin versions`); - } - expectIncludes('libraries/maui-iap/src/OpenIap.Maui.Bindings.Android/OpenIap.Maui.Bindings.Android.csproj', [ - 'Xamarin.Android.Google.BillingClient', - 'Version="$(MauiBillingClientNuGetVersion)"', - 'GoogleGson', - 'Version="$(MauiGoogleGsonNuGetVersion)"', - 'Version="$(MauiKotlinStdLibVersion)"', - 'Version="$(MauiKotlinCoroutinesVersion)"', - 'OpenIapAndroidStore', - 'OpenIapGoogleAarFlavor', - 'openiap-$(OpenIapGoogleAarFlavor)-release.aar', - 'com.amazon.device:amazon-appstore-sdk', - 'Version="$(MauiAmazonAppstoreSdkVersion)"', - 'com.meta.horizon.platform.ovr:android-platform-sdk', - 'Version="$(MauiHorizonPlatformSdkVersion)"', - 'com.meta.horizon.billingclient.api:horizon-billing-compatibility', - 'Version="$(MauiHorizonBillingCompatibilityVersion)"', - ], 'MAUI Android binding dependency versions'); - expectNotIncludes('libraries/maui-iap/src/OpenIap.Maui.Bindings.Android/OpenIap.Maui.Bindings.Android.csproj', [ - 'Version="3.0.0"', - 'Version="3.1.8"', - 'Version="18.5.0"', - 'Version="18.9.0"', - 'Version="19.0.0"', - 'Version="18.2.0"', - ], 'MAUI Android binding Google Maven dependencies must use shared props'); - expectIncludes('libraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csproj', [ - 'net10.0', - 'net10.0-android', - 'net10.0-ios', - 'net10.0-maccatalyst', - 'Xamarin.Android.Google.BillingClient', - 'Version="$(MauiBillingClientNuGetVersion)"', - 'GoogleGson', - 'Version="$(MauiGoogleGsonNuGetVersion)"', - 'Xamarin.AndroidX.Activity.Ktx', - 'Version="$(MauiAndroidXActivityVersion)"', - 'Xamarin.AndroidX.Fragment.Ktx', - 'Version="$(MauiAndroidXFragmentVersion)"', - 'Xamarin.AndroidX.Lifecycle.Runtime.Ktx', - 'Version="$(MauiAndroidXLifecycleVersion)"', - 'Xamarin.AndroidX.SavedState.SavedState.Ktx', - 'Version="$(MauiAndroidXSavedStateVersion)"', - 'Version="$(MauiKotlinStdLibVersion)"', - 'Version="$(MauiKotlinCoroutinesVersion)"', - 'openiap-release.aar', - 'OpenIapAndroidStore', - 'OpenIapGoogleAarFlavor', - 'openiap-$(OpenIapGoogleAarFlavor)-release.aar', - 'com.amazon.device:amazon-appstore-sdk', - 'Version="$(MauiAmazonAppstoreSdkVersion)"', - 'com.meta.horizon.platform.ovr:android-platform-sdk', - 'Version="$(MauiHorizonPlatformSdkVersion)"', - 'com.meta.horizon.billingclient.api:horizon-billing-compatibility', - 'Version="$(MauiHorizonBillingCompatibilityVersion)"', - ], 'MAUI Android package dependency versions'); - expectNotIncludes('libraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csproj', [ - ''], + "generated MAUI dependency props must preserve store output isolation", + ); + expectNotIncludes( + "packages/apple/Sources/OpenIapModule+ObjC.swift", + ["transactionDate: Date().timeIntervalSince1970"], + "Apple Objective-C bridge transaction dates must use epoch milliseconds", + ); + expectNotIncludes( + "libraries/maui-iap/src/OpenIap.Maui/OpenIap.Maui.csproj", + [ + 'net9.0-* with net10.0-*', - ], 'MAUI setup docs must describe net10 and NuGet Google dependency shape'); - expectIncludes('libraries/flutter_inapp_purchase/android/settings.gradle', [ - "new File(settingsDir, '../../../packages/google/openiap')", - ], 'Flutter Android local OpenIAP module hint'); - expectNotIncludes('libraries/flutter_inapp_purchase/android/settings.gradle', [ - 'git clone https://github.com/hyodotdev/openiap-google', - '/path/to/openiap/packages/google/openiap', - 'switch dependency', - ], 'Flutter Android local OpenIAP module hint must match monorepo flow'); - expectIncludes('libraries/flutter_inapp_purchase/CONTRIBUTING.md', [ - "project(':openiap').projectDir = new File(settingsDir, '../../../packages/google/openiap')", - '`android/build.gradle` dependency changes are needed.', - ], 'Flutter local OpenIAP debugging docs'); - expectNotIncludes('libraries/flutter_inapp_purchase/CONTRIBUTING.md', [ - 'git clone https://github.com/hyodotdev/openiap-google', - 'debugImplementation project(":openiap")', - 'releaseImplementation "io.github.hyochan.openiap:openiap-google:${openiapGoogleVersion}"', - ], 'Flutter local OpenIAP debugging docs must match automatic local project selection'); + expectIncludes( + mauiWorkflow, + [ + 'dotnet-version: "10.0.x"', + "net10.0", + "net10.0-android", + "net10.0-ios", + "net10.0-maccatalyst", + ], + "MAUI workflows must validate net10 target frameworks", + ); + } + expectIncludes( + "packages/docs/src/pages/docs/setup/maui.tsx", + [ + ".NET 9 or .NET 10 SDK", + "Google Billing, Play", + "net10.0-ios;net10.0-android;net10.0-maccatalyst", + "Replace net9.0-* with net10.0-*", + ], + "MAUI setup docs must describe net10 and NuGet Google dependency shape", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/android/settings.gradle", + ["new File(settingsDir, '../../../packages/google/openiap')"], + "Flutter Android local OpenIAP module hint", + ); + expectNotIncludes( + "libraries/flutter_inapp_purchase/android/settings.gradle", + [ + "git clone https://github.com/hyodotdev/openiap-google", + "/path/to/openiap/packages/google/openiap", + "switch dependency", + ], + "Flutter Android local OpenIAP module hint must match monorepo flow", + ); + expectIncludes( + "libraries/flutter_inapp_purchase/CONTRIBUTING.md", + [ + "project(':openiap').projectDir = new File(settingsDir, '../../../packages/google/openiap')", + "`android/build.gradle` dependency changes are needed.", + ], + "Flutter local OpenIAP debugging docs", + ); + expectNotIncludes( + "libraries/flutter_inapp_purchase/CONTRIBUTING.md", + [ + "git clone https://github.com/hyodotdev/openiap-google", + 'debugImplementation project(":openiap")', + 'releaseImplementation "io.github.hyochan.openiap:openiap-google:${openiapGoogleVersion}"', + ], + "Flutter local OpenIAP debugging docs must match automatic local project selection", + ); for (const [label, filePath] of [ - ['React Native Android', 'libraries/react-native-iap/android/build.gradle'], - ['MAUI Android', 'libraries/maui-iap/android/openiap/build.gradle.kts'], - ['Godot Android GDAP', 'libraries/godot-iap/addons/godot-iap/android/GodotIap.gdap'], + ["React Native Android", "libraries/react-native-iap/android/build.gradle"], + ["MAUI Android", "libraries/maui-iap/android/openiap/build.gradle.kts"], + [ + "Godot Android GDAP", + "libraries/godot-iap/addons/godot-iap/android/GodotIap.gdap", + ], ]) { const coroutineVersions = uniqueMatches( read(filePath), /kotlinx-coroutines-android:([0-9.]+)/g, ); for (const version of coroutineVersions) { - if (googleCoroutineVersions.length === 1 && version !== googleCoroutineVersions[0]) { + if ( + googleCoroutineVersions.length === 1 && + version !== googleCoroutineVersions[0] + ) { fail( `${label} coroutines version ${version} must match packages/google ${googleCoroutineVersions[0]}`, ); @@ -3371,161 +5417,259 @@ function checkFrameworkDependencyHygiene() { } } if (googleCoroutineVersions.length === 1) { - expectIncludes('libraries/react-native-iap/android/gradle.properties', [ - `NitroIap_coroutinesVersion=${googleCoroutineVersions[0]}`, - 'NitroIap_playServicesBaseVersion=', - 'NitroIap_junitVersion=', - ], 'React Native Android coroutines fallback version'); - } - expectIncludes('libraries/react-native-iap/android/build.gradle', [ - 'googleRootBuildFile', - "googlePluginVersion('com.android.library')", - "googlePluginVersion('org.jetbrains.kotlin.android')", - 'NitroIap_androidGradlePluginVersion', - 'resolveOpenIapGoogleBuildFile()', - "readOpenIapGoogleVariable(googleOpenIapBuildFile, 'coroutinesVersion')", - "readOpenIapGoogleDependencyVersion(googleOpenIapBuildFile, 'junit:junit')", - 'def playServicesBaseVersion = getExtOrDefault("playServicesBaseVersion")', - 'def junitVersion = readOpenIapGoogleDependencyVersion', - 'implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"', - 'implementation "com.google.android.gms:play-services-base:$playServicesBaseVersion"', - 'testImplementation "junit:junit:$junitVersion"', - 'namespace = "com.margelo.nitro.iap"', - 'buildConfig = true', - 'prefab = true', - ], 'React Native Android Gradle versions and syntax'); - expectNotIncludes('libraries/react-native-iap/android/build.gradle', [ - 'com.android.tools.build:gradle:8.12.1', - 'org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.0', - "implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0'", - "implementation 'com.google.android.gms:play-services-base:18.5.0'", - "testImplementation 'junit:junit:4.13.2'", - 'namespace "com.margelo.nitro.iap"', - 'ndkVersion getExtOrDefault("ndkVersion")', - 'minSdkVersion getExtOrIntegerDefault("minSdkVersion")', - 'targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")', - 'buildConfig true', - 'prefab true', - ], 'React Native Android Gradle must avoid hardcoded drift and deprecated syntax'); - expectIncludes('libraries/react-native-iap/example/android/app/build.gradle', [ - 'ndkVersion = rootProject.ext.ndkVersion', - 'compileSdk = rootProject.ext.compileSdkVersion', - 'namespace = "dev.hyo.martie"', - 'signingConfig = signingConfigs.debug', - ], 'React Native example Android Gradle syntax'); - expectNotIncludes('libraries/react-native-iap/example/android/app/build.gradle', [ - 'ndkVersion rootProject.ext.ndkVersion', - 'compileSdk rootProject.ext.compileSdkVersion', - 'namespace "dev.hyo.martie"', - 'signingConfig signingConfigs.debug', - ], 'React Native example Android Gradle must avoid deprecated syntax'); + expectIncludes( + "libraries/react-native-iap/android/gradle.properties", + [ + `NitroIap_coroutinesVersion=${googleCoroutineVersions[0]}`, + "NitroIap_playServicesBaseVersion=", + "NitroIap_junitVersion=", + ], + "React Native Android coroutines fallback version", + ); + } + expectIncludes( + "libraries/react-native-iap/android/build.gradle", + [ + "googleRootBuildFile", + "googlePluginVersion('com.android.library')", + "googlePluginVersion('org.jetbrains.kotlin.android')", + "NitroIap_androidGradlePluginVersion", + "resolveOpenIapGoogleBuildFile()", + "readOpenIapGoogleVariable(googleOpenIapBuildFile, 'coroutinesVersion')", + "readOpenIapGoogleDependencyVersion(googleOpenIapBuildFile, 'junit:junit')", + 'def playServicesBaseVersion = getExtOrDefault("playServicesBaseVersion")', + "def junitVersion = readOpenIapGoogleDependencyVersion", + 'implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"', + 'implementation "com.google.android.gms:play-services-base:$playServicesBaseVersion"', + 'testImplementation "junit:junit:$junitVersion"', + 'namespace = "com.margelo.nitro.iap"', + "buildConfig = true", + "prefab = true", + ], + "React Native Android Gradle versions and syntax", + ); + expectNotIncludes( + "libraries/react-native-iap/android/build.gradle", + [ + "com.android.tools.build:gradle:8.12.1", + "org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.0", + "implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0'", + "implementation 'com.google.android.gms:play-services-base:18.5.0'", + "testImplementation 'junit:junit:4.13.2'", + 'namespace "com.margelo.nitro.iap"', + 'ndkVersion getExtOrDefault("ndkVersion")', + 'minSdkVersion getExtOrIntegerDefault("minSdkVersion")', + 'targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")', + "buildConfig true", + "prefab true", + ], + "React Native Android Gradle must avoid hardcoded drift and deprecated syntax", + ); + expectIncludes( + "libraries/react-native-iap/example/android/app/build.gradle", + [ + "ndkVersion = rootProject.ext.ndkVersion", + "compileSdk = rootProject.ext.compileSdkVersion", + 'namespace = "dev.hyo.martie"', + "signingConfig = signingConfigs.debug", + ], + "React Native example Android Gradle syntax", + ); + expectNotIncludes( + "libraries/react-native-iap/example/android/app/build.gradle", + [ + "ndkVersion rootProject.ext.ndkVersion", + "compileSdk rootProject.ext.compileSdkVersion", + 'namespace "dev.hyo.martie"', + "signingConfig signingConfigs.debug", + ], + "React Native example Android Gradle must avoid deprecated syntax", + ); for (const gradleFile of [ - 'libraries/expo-iap/android/build.gradle', - 'libraries/flutter_inapp_purchase/example/android/app/build.gradle', - 'libraries/flutter_inapp_purchase/android/build.gradle', - 'libraries/godot-iap/android/build.gradle.kts', - 'libraries/maui-iap/android/openiap/build.gradle.kts', - 'libraries/react-native-iap/android/build.gradle', - 'packages/google/Example/build.gradle.kts', - 'packages/google/openiap/build.gradle.kts', + "libraries/expo-iap/android/build.gradle", + "libraries/flutter_inapp_purchase/example/android/app/build.gradle", + "libraries/flutter_inapp_purchase/android/build.gradle", + "libraries/godot-iap/android/build.gradle.kts", + "libraries/maui-iap/android/openiap/build.gradle.kts", + "libraries/react-native-iap/android/build.gradle", + "packages/google/Example/build.gradle.kts", + "packages/google/openiap/build.gradle.kts", ]) { - expectIncludes(gradleFile, [ - 'compilerOptions', - 'JvmTarget.JVM_17', - ], `${gradleFile} Kotlin compiler target`); - expectNotIncludes(gradleFile, [ - 'kotlinOptions', - 'jvmTarget = "17"', - "jvmTarget = '17'", - ], `${gradleFile} Kotlin compiler target`); + expectIncludes( + gradleFile, + ["compilerOptions", "JvmTarget.JVM_17"], + `${gradleFile} Kotlin compiler target`, + ); + expectNotIncludes( + gradleFile, + ["kotlinOptions", 'jvmTarget = "17"', "jvmTarget = '17'"], + `${gradleFile} Kotlin compiler target`, + ); } for (const kotlinVersionFile of [ - 'libraries/expo-iap/plugin/src/withLocalOpenIAP.ts', - 'libraries/flutter_inapp_purchase/android/gradle.properties', - 'libraries/flutter_inapp_purchase/example/android/gradle.properties', - 'libraries/flutter_inapp_purchase/example/android/settings.gradle', - 'libraries/godot-iap/android/gradle.properties', - 'libraries/react-native-iap/android/gradle.properties', - 'libraries/react-native-iap/README.md', + "libraries/expo-iap/plugin/src/withLocalOpenIAP.ts", + "libraries/flutter_inapp_purchase/android/gradle.properties", + "libraries/flutter_inapp_purchase/example/android/gradle.properties", + "libraries/flutter_inapp_purchase/example/android/settings.gradle", + "libraries/godot-iap/android/gradle.properties", + "libraries/react-native-iap/android/gradle.properties", + "libraries/react-native-iap/README.md", ]) { - expectIncludes(kotlinVersionFile, [ - '2.2.0', - ], `${kotlinVersionFile} Kotlin version`); - expectNotIncludes(kotlinVersionFile, [ - '2.0.21', - '2.1.20', - '2.1.0', - ], `${kotlinVersionFile} Kotlin version`); + expectIncludes( + kotlinVersionFile, + ["2.2.0"], + `${kotlinVersionFile} Kotlin version`, + ); + expectNotIncludes( + kotlinVersionFile, + ["2.0.21", "2.1.20", "2.1.0"], + `${kotlinVersionFile} Kotlin version`, + ); } for (const kotlinVersionFile of [ - 'libraries/expo-iap/plugin/build/withLocalOpenIAP.js', + "libraries/expo-iap/plugin/build/withLocalOpenIAP.js", ]) { - expectOptionalIncludes(kotlinVersionFile, [ - '2.2.0', - ], `${kotlinVersionFile} Kotlin version`); - expectOptionalNotIncludes(kotlinVersionFile, [ - '2.0.21', - '2.1.20', - '2.1.0', - ], `${kotlinVersionFile} Kotlin version`); - } - expectIncludes('libraries/flutter_inapp_purchase/android/build.gradle', [ - "readRequiredAndroidGradleProperty(projectDir, 'openIapKotlinVersion')", - ], 'Flutter Android build.gradle must read Kotlin fallback from gradle.properties'); - expectIncludes('libraries/react-native-iap/android/build.gradle', [ - "configuredVersion('kotlinVersion', 'NitroIap_kotlinVersion')", - ], 'React Native Android build.gradle must read Kotlin fallback from gradle.properties'); - expectIncludes('packages/apple/Sources/OpenIapVersion.swift', [ - 'Bundle.module.url(forResource: "openiap-versions", withExtension: "json")', - 'cocoaPodsVersionURL()', - 'bundle.url(forResource: "OpenIAP", withExtension: "bundle")', - 'version(for: "apple")', - 'version(for: "spec")', - ], 'Apple OpenIAP runtime version'); - expectIncludes('packages/apple/openiap.podspec', [ - 's.resources', - 'Sources/openiap-versions.json', - 'openiap-versions.json', - ], 'Apple podspec version resource'); - expectNotIncludes('packages/apple/Sources/OpenIapVersion.swift', [ - '1.2.23', - '1.2.2', - 'static let current', - 'static let gqlVersion', - ], 'Apple OpenIAP runtime version'); - expectIncludes('packages/apple/wrapper/project.yml', [ - 'MARKETING_VERSION: "$(OPENIAP_MARKETING_VERSION)"', - ], 'Apple wrapper marketing version'); - expectIncludes('packages/apple/scripts/build-xcframework.sh', [ - 'openiap-versions.json', - 'read_openiap_version()', - 'python3 - "$VERSIONS_FILE" "$1"', - 'APPLE_VERSION="$(read_openiap_version apple)"', - 'OPENIAP_MARKETING_VERSION="${APPLE_VERSION}"', - ], 'Apple xcframework marketing version'); - expectIncludes('packages/apple/scripts/build-xcframework.sh', [ - 'EXPECTED_INSTALL_NAME="@rpath/OpenIAP.framework/OpenIAP"', - 'LD_DYLIB_INSTALL_NAME="${EXPECTED_INSTALL_NAME}"', - 'validate_install_names', - ], 'Apple xcframework install name'); - expectIncludes('packages/apple/wrapper/project.yml', [ - 'LD_DYLIB_INSTALL_NAME: "@rpath/$(EXECUTABLE_PATH)"', - ], 'Apple wrapper install name'); - expectNotIncludes('packages/apple/scripts/bump-version.sh', [ - 'OpenIapVersion.swift fallback', - 'Sources/OpenIapVersion.swift', - ], 'Apple bump-version should not edit runtime version source'); + expectOptionalIncludes( + kotlinVersionFile, + ["2.2.0"], + `${kotlinVersionFile} Kotlin version`, + ); + expectOptionalNotIncludes( + kotlinVersionFile, + ["2.0.21", "2.1.20", "2.1.0"], + `${kotlinVersionFile} Kotlin version`, + ); + } + expectIncludes( + "libraries/flutter_inapp_purchase/android/build.gradle", + ["readRequiredAndroidGradleProperty(projectDir, 'openIapKotlinVersion')"], + "Flutter Android build.gradle must read Kotlin fallback from gradle.properties", + ); + expectIncludes( + "libraries/react-native-iap/android/build.gradle", + ["configuredVersion('kotlinVersion', 'NitroIap_kotlinVersion')"], + "React Native Android build.gradle must read Kotlin fallback from gradle.properties", + ); + expectIncludes( + "packages/apple/Sources/OpenIapVersion.swift", + [ + 'Bundle.module.url(forResource: "openiap-versions", withExtension: "json")', + "cocoaPodsVersionURL()", + 'bundle.url(forResource: "OpenIAP", withExtension: "bundle")', + 'version(for: "apple")', + 'version(for: "spec")', + ], + "Apple OpenIAP runtime version", + ); + expectIncludes( + "packages/apple/openiap.podspec", + ["s.resources", "Sources/openiap-versions.json", "openiap-versions.json"], + "Apple podspec version resource", + ); + expectNotIncludes( + "packages/apple/Sources/OpenIapVersion.swift", + ["1.2.23", "1.2.2", "static let current", "static let gqlVersion"], + "Apple OpenIAP runtime version", + ); + expectIncludes( + "packages/apple/wrapper/project.yml", + ['MARKETING_VERSION: "$(OPENIAP_MARKETING_VERSION)"'], + "Apple wrapper marketing version", + ); + expectIncludes( + "packages/apple/scripts/build-xcframework.sh", + [ + "openiap-versions.json", + "read_openiap_version()", + 'python3 - "$VERSIONS_FILE" "$1"', + 'APPLE_VERSION="$(read_openiap_version apple)"', + 'OPENIAP_MARKETING_VERSION="${APPLE_VERSION}"', + ], + "Apple xcframework marketing version", + ); + expectIncludes( + "packages/apple/scripts/build-xcframework.sh", + [ + 'EXPECTED_INSTALL_NAME="@rpath/OpenIAP.framework/OpenIAP"', + 'LD_DYLIB_INSTALL_NAME="${EXPECTED_INSTALL_NAME}"', + "validate_install_names", + ], + "Apple xcframework install name", + ); + expectIncludes( + "packages/apple/wrapper/project.yml", + ['LD_DYLIB_INSTALL_NAME: "@rpath/$(EXECUTABLE_PATH)"'], + "Apple wrapper install name", + ); + expectNotIncludes( + "packages/apple/scripts/bump-version.sh", + ["OpenIapVersion.swift fallback", "Sources/OpenIapVersion.swift"], + "Apple bump-version should not edit runtime version source", + ); +} + +function checkReleaseNoteGroupingGuidance() { + expectIncludes( + ".codex/skills/generate-doc/SKILL.md", + [ + "## Multi-package Release Trains", + "project decision recorded from issue #206", + "Group notable changes under the affected platform package or framework", + ], + "generate-doc package-specific release guidance", + ); + expectIncludes( + "knowledge/internal/05-docs-patterns.md", + [ + "### Package-specific grouping for shared releases", + "package-specific changelog requirement", + "from issue #206 without duplicating release history", + 'Do not replace package-specific behavior with a generic "framework parity"', + ], + "internal package-specific release guidance", + ); + expectIncludes( + "packages/docs/src/pages/docs/updates/releases.tsx", + [ + "multi-store-billing-9-1-sdk-release-2026-07-11", + "Platform packages and IAPKit", + "Framework libraries", + "react-native-iap 15.4.0", + "expo-iap 4.4.0", + "flutter_inapp_purchase 9.4.0", + "godot-iap 2.4.0", + "kmp-iap 2.4.0", + "OpenIap.Maui 1.2.1", + "https://github.com/hyodotdev/openiap/issues/206", + ], + "current package-specific release note", + ); + expectNotIncludes( + "packages/docs/src/pages/docs/updates/releases.tsx", + [ + "amazon-config-plugin-option-shape-2026-07-03", + "fireos-support-2026-05-23", + "react-native-iap 15.4.0-rc.", + "expo-iap 4.4.0-rc.", + "flutter_inapp_purchase 9.4.0-rc.", + "godot-iap 2.4.0-rc.", + "kmp-iap 2.4.0-rc.", + "OpenIap.Maui 1.2.1-rc.", + ], + "current release note must contain stable package entries only", + ); } checkLibraryCoverageRegistry(); checkExpoSsotRegistry(); +checkE2eExampleIds(); checkGeneratedTypeSync(); checkGqlRuntimeExports(); checkOperationRegistry(); checkFrameworkOperationBindings(); -checkExpoRouterExample('libraries/expo-iap/example', 'src/utils/constants.ts'); +checkExpoRouterExample("libraries/expo-iap/example", "src/utils/constants.ts"); checkReactNativeClassic(); checkFlutter(); checkKmp(); @@ -3533,13 +5677,17 @@ checkApple(); checkGoogle(); checkMaui(); checkNativeApis(); +checkBillingChoiceFieldBindings(); checkFrameworkDependencyHygiene(); +checkReleaseNoteGroupingGuidance(); expectNoExampleStorefrontIOS(); if (failures.length > 0) { - console.error(`Non-Godot parity audit failed with ${failures.length} issue(s):`); + console.error( + `Non-Godot parity audit failed with ${failures.length} issue(s):`, + ); for (const failure of failures) console.error(`- ${failure}`); process.exit(1); } -console.log('Non-Godot example/API/test parity audit passed.'); +console.log("Non-Godot example/API/test parity audit passed."); diff --git a/scripts/sync-versions.sh b/scripts/sync-versions.sh index a3dc18081..930fa13f5 100755 --- a/scripts/sync-versions.sh +++ b/scripts/sync-versions.sh @@ -207,8 +207,8 @@ sync_maui_android_versions() { local play_billing_version local amazon_appstore_sdk_version - local horizon_platform_sdk_version local horizon_billing_compatibility_version + local horizon_platform_kotlin_version local gson_version play_billing_version=$(python3 - "$google_build" <<'PY' import re @@ -232,25 +232,25 @@ if not match: print(match.group(1)) PY ) - horizon_platform_sdk_version=$(python3 - "$google_build" <<'PY' + horizon_billing_compatibility_version=$(python3 - "$google_build" <<'PY' import re import sys text = open(sys.argv[1], encoding="utf-8").read() -match = re.search(r'val\s+horizonPlatformVersion\s*=\s*"([^"]+)"', text) +match = re.search(r'val\s+horizonBillingCompatibilityVersion\s*=\s*"([^"]+)"', text) if not match: - raise SystemExit("missing horizonPlatformVersion") + raise SystemExit("missing horizonBillingCompatibilityVersion") print(match.group(1)) PY ) - horizon_billing_compatibility_version=$(python3 - "$google_build" <<'PY' + horizon_platform_kotlin_version=$(python3 - "$google_build" <<'PY' import re import sys text = open(sys.argv[1], encoding="utf-8").read() -match = re.search(r'val\s+horizonBillingCompatibilityVersion\s*=\s*"([^"]+)"', text) +match = re.search(r'val\s+horizonPlatformKotlinVersion\s*=\s*"([^"]+)"', text) if not match: - raise SystemExit("missing horizonBillingCompatibilityVersion") + raise SystemExit("missing horizonPlatformKotlinVersion") print(match.group(1)) PY ) @@ -265,11 +265,11 @@ if not match: print(match.group(1)) PY ) - python3 - "$maui_props" "$play_billing_version" "$amazon_appstore_sdk_version" "$horizon_platform_sdk_version" "$horizon_billing_compatibility_version" "$gson_version" <<'PY' + python3 - "$maui_props" "$play_billing_version" "$amazon_appstore_sdk_version" "$horizon_billing_compatibility_version" "$horizon_platform_kotlin_version" "$gson_version" <<'PY' import re import sys -path, play_billing, amazon_appstore_sdk, horizon_platform_sdk, horizon_billing_compatibility, gson = sys.argv[1:] +path, play_billing, amazon_appstore_sdk, horizon_billing_compatibility, horizon_platform_kotlin, gson = sys.argv[1:] text = open(path, encoding="utf-8").read() preserved_property_names = [ "MauiBillingClientNuGetVersion", @@ -280,6 +280,7 @@ preserved_property_names = [ "MauiAndroidXSavedStateVersion", "MauiKotlinStdLibVersion", "MauiKotlinCoroutinesVersion", + "MauiHorizonSerializationNuGetVersion", ] preserved = {} for name in preserved_property_names: @@ -289,12 +290,14 @@ for name in preserved_property_names: preserved[name] = match.group(1) content = f""" + {play_billing} {amazon_appstore_sdk} - {horizon_platform_sdk} {horizon_billing_compatibility} + {horizon_platform_kotlin} + {preserved["MauiHorizonSerializationNuGetVersion"]} {gson} {preserved["MauiBillingClientNuGetVersion"]} {preserved["MauiGoogleGsonNuGetVersion"]} From f1dcbb56d8b4e204f5a19c418f5982fe7a539c74 Mon Sep 17 00:00:00 2001 From: Hyo Date: Sat, 11 Jul 2026 07:45:29 +0900 Subject: [PATCH 14/14] fix(wrappers): preserve billing payload compatibility Keep KMP developer billing payload extraction compatible with Billing 8.3 details and serialize nested Godot purchase parameters before crossing the native bridge. --- .../godot-iap/Example/tests/test_godot_iap.gd | 17 ++++ .../godot-iap/addons/godot-iap/godot_iap.gd | 10 ++- .../hyochan/kmpiap/InAppPurchaseAndroid.kt | 81 +++++++++---------- .../DeveloperProvidedBillingReflectionTest.kt | 67 +++++++++++++++ scripts/audit-non-godot-parity.mjs | 8 +- 5 files changed, 137 insertions(+), 46 deletions(-) create mode 100644 libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/DeveloperProvidedBillingReflectionTest.kt diff --git a/libraries/godot-iap/Example/tests/test_godot_iap.gd b/libraries/godot-iap/Example/tests/test_godot_iap.gd index 5c7201ab3..6794274f3 100644 --- a/libraries/godot-iap/Example/tests/test_godot_iap.gd +++ b/libraries/godot-iap/Example/tests/test_godot_iap.gd @@ -150,6 +150,23 @@ func test_billing_choice_android_payloads() -> void: _assert_equal(fake.last_purchase.get("originalExternalTransactionId"), "original-external-id", "Original external transaction ID should reach Android plugin") _assert_equal(fake.last_purchase.get("developerBillingOption", {}).get("billingProgram"), "billing-choice", "Developer billing option should reach Android plugin") + var replacement_params = Types.SubscriptionProductReplacementParamsAndroid.new() + replacement_params.old_product_id = "legacy-monthly" + replacement_params.replacement_mode = Types.SubscriptionReplacementModeAndroid.CHARGE_PRORATED_PRICE + var raw_option = Types.DeveloperBillingOptionParamsAndroid.new() + raw_option.billing_program = Types.BillingProgramAndroid.BILLING_CHOICE + GodotIapPlugin._request_purchase_raw({ + "type": "subs", + "requestSubscription": {"google": { + "skus": ["monthly_subscription"], + "subscriptionProductReplacementParams": replacement_params, + "developerBillingOption": raw_option, + }}, + }) + _assert_equal(fake.last_purchase.get("subscriptionProductReplacementParams", {}).get("oldProductId"), "legacy-monthly", "Replacement params objects should serialize to dictionaries") + _assert_equal(fake.last_purchase.get("subscriptionProductReplacementParams", {}).get("replacementMode"), "charge-prorated-price", "Replacement mode should preserve its serialized value") + _assert_equal(fake.last_purchase.get("developerBillingOption", {}).get("billingProgram"), "billing-choice", "Developer billing option objects should serialize to dictionaries") + GodotIapPlugin._native_plugin = null GodotIapPlugin._platform = "" GodotIapPlugin._is_connected = false diff --git a/libraries/godot-iap/addons/godot-iap/godot_iap.gd b/libraries/godot-iap/addons/godot-iap/godot_iap.gd index e01ca54b3..a935624e2 100644 --- a/libraries/godot-iap/addons/godot-iap/godot_iap.gd +++ b/libraries/godot-iap/addons/godot-iap/godot_iap.gd @@ -437,6 +437,12 @@ func _request_purchase_raw(args: Dictionary) -> Dictionary: "sku": google_props.get("skus", [])[0], "offerToken": str(offer_token), }] + var replacement_params = google_props.get("subscriptionProductReplacementParams", null) + if typeof(replacement_params) == TYPE_OBJECT and replacement_params.has_method("to_dict"): + replacement_params = replacement_params.to_dict() + var developer_billing_option = google_props.get("developerBillingOption", null) + if typeof(developer_billing_option) == TYPE_OBJECT and developer_billing_option.has_method("to_dict"): + developer_billing_option = developer_billing_option.to_dict() var params = { "type": purchase_type, "skus": google_props.get("skus", []), @@ -448,8 +454,8 @@ func _request_purchase_raw(args: Dictionary) -> Dictionary: "purchaseToken": google_props.get("purchaseToken", google_props.get("purchaseTokenAndroid", "")), "originalExternalTransactionId": google_props.get("originalExternalTransactionId", ""), "replacementMode": google_props.get("replacementMode", google_props.get("replacementModeAndroid", 0)), - "subscriptionProductReplacementParams": google_props.get("subscriptionProductReplacementParams", null), - "developerBillingOption": google_props.get("developerBillingOption", null), + "subscriptionProductReplacementParams": replacement_params, + "developerBillingOption": developer_billing_option, } var params_json = JSON.stringify(params) print("[GodotIap] Calling Android requestPurchase: type=", purchase_type, ", skus=", params["skus"].size(), ", subscriptionOffers=", params["subscriptionOffers"].size(), ", hasPurchaseToken=", not str(params["purchaseToken"]).is_empty()) diff --git a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt index b32167f30..46a26b0b0 100644 --- a/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt +++ b/libraries/kmp-iap/library/src/androidMain/kotlin/io/github/hyochan/kmpiap/InAppPurchaseAndroid.kt @@ -152,6 +152,42 @@ private fun logError(message: String, throwable: Throwable) { } } +private fun Any.invokeOptionalStringGetter(methodName: String): String? = + runCatching { javaClass.getMethod(methodName).invoke(this) as? String } + .getOrNull() + ?.takeIf { it.isNotBlank() } + +private fun Any.invokeOptionalListGetter(methodName: String): List<*> = + runCatching { javaClass.getMethod(methodName).invoke(this) as? List<*> } + .getOrNull() + .orEmpty() + +internal fun extractDeveloperProvidedBillingDetails( + details: Any +): DeveloperProvidedBillingDetailsAndroid { + val products = details.invokeOptionalListGetter("getProducts").mapNotNull { product -> + product ?: return@mapNotNull null + val id = product.invokeOptionalStringGetter("getId") ?: return@mapNotNull null + val type = when (product.invokeOptionalStringGetter("getType")) { + BillingClient.ProductType.INAPP -> ProductType.InApp + BillingClient.ProductType.SUBS -> ProductType.Subs + else -> return@mapNotNull null + } + DeveloperProvidedBillingProductAndroid( + id = id, + offerToken = product.invokeOptionalStringGetter("getOfferToken"), + type = type + ) + } + + return DeveloperProvidedBillingDetailsAndroid( + externalTransactionToken = details.invokeOptionalStringGetter("getExternalTransactionToken"), + linkUri = details.invokeOptionalStringGetter("getLinkUri"), + originalExternalTransactionId = details.invokeOptionalStringGetter("getOriginalExternalTransactionId"), + products = products + ) +} + internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLifecycleCallbacks { private var billingClient: BillingClient? = null @@ -2449,47 +2485,10 @@ internal class InAppPurchaseAndroid : KmpInAppPurchase, Application.ActivityLife arrayOf(listenerClass) ) { _, method, args -> if (method.name == "onUserSelectedDeveloperBilling") { - val details = args?.get(0) - if (details != null) { - try { - val detailsClass = details.javaClass - val token = (detailsClass.getMethod("getExternalTransactionToken") - .invoke(details) as? String)?.takeIf { it.isNotBlank() } - val linkUri = (detailsClass.getMethod("getLinkUri") - .invoke(details) as? String)?.takeIf { it.isNotBlank() } - val originalExternalTransactionId = (detailsClass - .getMethod("getOriginalExternalTransactionId") - .invoke(details) as? String)?.takeIf { it.isNotBlank() } - val products = (detailsClass.getMethod("getProducts") - .invoke(details) as? List<*>) - .orEmpty() - .mapNotNull { product -> - val productClass = product?.javaClass ?: return@mapNotNull null - val id = productClass.getMethod("getId").invoke(product) as? String - ?: return@mapNotNull null - val type = when (productClass.getMethod("getType").invoke(product) as? String) { - BillingClient.ProductType.INAPP -> ProductType.InApp - BillingClient.ProductType.SUBS -> ProductType.Subs - else -> return@mapNotNull null - } - DeveloperProvidedBillingProductAndroid( - id = id, - offerToken = (productClass.getMethod("getOfferToken") - .invoke(product) as? String)?.takeIf { it.isNotBlank() }, - type = type - ) - } - _developerProvidedBillingListener.tryEmit( - DeveloperProvidedBillingDetailsAndroid( - externalTransactionToken = token, - linkUri = linkUri, - originalExternalTransactionId = originalExternalTransactionId, - products = products - ) - ) - } catch (e: Exception) { - logError("Failed to extract developer billing details: ${e.message}", e) - } + args?.firstOrNull()?.let { details -> + _developerProvidedBillingListener.tryEmit( + extractDeveloperProvidedBillingDetails(details) + ) } } null diff --git a/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/DeveloperProvidedBillingReflectionTest.kt b/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/DeveloperProvidedBillingReflectionTest.kt new file mode 100644 index 000000000..f6c15fa4a --- /dev/null +++ b/libraries/kmp-iap/library/src/androidUnitTest/kotlin/io/github/hyochan/kmpiap/DeveloperProvidedBillingReflectionTest.kt @@ -0,0 +1,67 @@ +package io.github.hyochan.kmpiap + +import io.github.hyochan.kmpiap.openiap.ProductType +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNull + +class DeveloperProvidedBillingReflectionTest { + @Test + fun `billing 8_3 details emit even without external transaction token`() { + val details = extractDeveloperProvidedBillingDetails( + Billing83LikeDetails( + linkUri = "https://example.com/checkout", + originalExternalTransactionId = "external-123", + products = listOf( + Billing83LikeProduct( + id = "monthly", + offerToken = "offer-123", + type = "subs" + ) + ) + ) + ) + + assertNull(details.externalTransactionToken) + assertEquals("https://example.com/checkout", details.linkUri) + assertEquals("external-123", details.originalExternalTransactionId) + assertEquals(1, details.products.size) + assertEquals("monthly", details.products.single().id) + assertEquals("offer-123", details.products.single().offerToken) + assertEquals(ProductType.Subs, details.products.single().type) + } + + @Test + fun `missing optional detail getters do not suppress available fields`() { + val details = extractDeveloperProvidedBillingDetails(TokenOnlyDetails("token-123")) + + assertEquals("token-123", details.externalTransactionToken) + assertNull(details.linkUri) + assertNull(details.originalExternalTransactionId) + assertEquals(emptyList(), details.products) + } +} + +internal class Billing83LikeDetails( + private val linkUri: String, + private val originalExternalTransactionId: String, + private val products: List +) { + fun getLinkUri(): String = linkUri + fun getOriginalExternalTransactionId(): String = originalExternalTransactionId + fun getProducts(): List = products +} + +internal class Billing83LikeProduct( + private val id: String, + private val offerToken: String, + private val type: String +) { + fun getId(): String = id + fun getOfferToken(): String = offerToken + fun getType(): String = type +} + +internal class TokenOnlyDetails(private val token: String) { + fun getExternalTransactionToken(): String = token +} diff --git a/scripts/audit-non-godot-parity.mjs b/scripts/audit-non-godot-parity.mjs index ae33ec2d7..c1488e677 100644 --- a/scripts/audit-non-godot-parity.mjs +++ b/scripts/audit-non-godot-parity.mjs @@ -2004,9 +2004,11 @@ function checkBillingChoiceFieldBindings() { "includeDeveloperListener =", "setOriginalExternalTransactionId", "params.externalTransactionToken", - 'getMethod("getLinkUri")', - 'getMethod("getOriginalExternalTransactionId")', - 'getMethod("getProducts")', + 'invokeOptionalStringGetter("getExternalTransactionToken")', + 'invokeOptionalStringGetter("getLinkUri")', + 'invokeOptionalStringGetter("getOriginalExternalTransactionId")', + 'invokeOptionalListGetter("getProducts")', + "runCatching { javaClass.getMethod(methodName)", "?.takeIf { it.isNotBlank() }", "subResponseCode = onPurchasesUpdatedSubResponseCode.toOpenIapSubResponseCode()", "BillingClient.BillingProgram.BILLING_CHOICE",

    {"Status"}{"State"}{"Validity"}{"Verified state"} {"Store"} {"Product ID"} {"Request IP"}
  • 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 z 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 LRXy`R#Q*$1nbO7p literal 4209256 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 z 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í<9E%7?Sedo@MUGzCmosb9mnzTk`fx{z=>;Kk<*` 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