# Android SDK - Changelog

All notable changes to the Glomo Android SDK.

## [2.1.0] - 2026-10-29

A feature release. No API changed and no existing code needs to move - `appColorScheme` is optional and defaulted. See the [Migration Guide](/platform/sdk/android-sdk/migration#v200-to-v210).

### Added

- **`GlomoPayConfig.appColorScheme`** (`GlomoColorScheme.AUTO` | `LIGHT` | `DARK`, default `AUTO`) provides the Glomo checkout page the preferred colour scheme. It requests rather than forces: the page decides, against your merchant dashboard settings.
  - `AUTO` follows your app's own appearance - `AppCompatDelegate.getDefaultNightMode()` where you have set one, then your theme's `isLightTheme`, then the device - so a light-only app on a dark device gets a light checkout whether or not it has ever called `setDefaultNightMode`.
- **`GlomoPayCheckoutHandle.setAppColorScheme(GlomoColorScheme)`** changes the scheme of a checkout that is already open. The page is told through the bridge rather than reloaded, so a payment in flight survives the change. A host night-mode change reaches an open checkout on its own while the scheme is `AUTO`.
- **`GlomoColorScheme` enum.**
- **`GlomoPayCheckoutActivity.EXTRA_HOST_THEME_IS_LIGHT`**, alongside the existing `EXTRA_*` constants.
  - `createIntent` sets it for you, resolved against the launching context's theme - that is how `AUTO` reads your app's appearance rather than the SDK Activity's own. You only need the constant if you build the launch Intent by hand; leave it off and `AUTO` falls through to the device configuration.


See [Dark mode](/platform/sdk/android-sdk/v2#dark-mode), and [Dark mode across the SDKs](/platform/sdk/dark-mode) for how the same property resolves on the other Glomo SDKs.

### Changed

- Improved SDK diagnostics and observability revamp to better assist merchants.
- Android WebView algorithmic darkening is now explicitly off on every page the SDK renders, including bank and 3DS pages. Previously the platform could invert a page that handles its own colours. Nothing to configure. On an Android 13 or later device whose system WebView is too old to support the setting, the SDK leaves darkening to the WebView rather than failing to open checkout.


### Binary compatibility

Adding `appColorScheme` to `GlomoPayConfig` rewrites its constructor, `copy`, `copyWith` and their `$default` bridges. **Source-compatible in both languages**: the parameter is defaulted and goes last, so Kotlin call sites compile unchanged, and the constructor and `copyWith` carry `@JvmOverloads` so Java's existing four-argument forms still resolve.

Any **pre-compiled** artifact linking against the 2.0.0 `$default` bridges must still be rebuilt. An ordinary app rebuilds from source and is unaffected; this matters only if you ship a library of your own that was compiled against 2.0.0 and is consumed as a binary.

Part of the [v2 documentation](/platform/sdk/android-sdk/v2).

## [2.0.0] - 2026-10-01

Upgrading from v1.0.0? See the [Migration Guide](/platform/sdk/android-sdk/migration). Every integration needs one change - the new required `onUserJourneyCompleted` callback - and the compiler points at it.

### Breaking

- **New required callback `onUserJourneyCompleted`.** Invoked when the user submits bank transfer details. This previously arrived as `onPaymentSuccess` with `paymentId` and `signature` both null - a payment reported as received that your backend had nothing to verify against. It now arrives as `onUserJourneyCompleted` with a `GlomoPayUserJourneyPayload` and **no longer reaches `onPaymentSuccess`**. It has no default implementation on purpose: the order decides server-side whether bank transfers are enabled, so a default body would let a host upgrade, keep compiling, and silently stop hearing about a journey it used to be told about.
- **`GlomoPaySdk.startCheckout` now returns a `GlomoPayCheckoutHandle`.** Retain it to dismiss that checkout programmatically with `close()`; the listener then receives `onPaymentTerminate(PROGRAMMATIC)` once. Ignoring the return value compiles unchanged.


### Added

- `onUserRefusedDevicePermissions` reports a permission the user refused, such as camera, instead of reporting the user's choice as an SDK error. The checkout stays open. It has a default implementation, so existing integrations keep compiling.
- Camera, gallery and file entry points for bank document uploads. Camera output is JPEG, limited to 2048 pixels per side at quality 85; picked documents are passed through unread and unlimited. The gallery uses the system photo picker on API 33 and later, falling back to the documents picker where it is unavailable.
- A recoverable 15-second warning when the checkout has not become interactive, raised as `ConnectionErrorType.TIMEOUT` with `shouldAutoClose = false`. The session stays alive.
- `ConnectionError` gained `errorCode` and `shouldAutoClose`.
- Localized error messages with Retry and Cancel controls on bank-flow errors.
- Camera captures now live in a per-checkout directory inside the app's cache directory, and opening a checkout sweeps any left behind by an earlier one. Photos abandoned by a crash, a process death or a kill mid-upload no longer stay on disk. A sweep failure never interrupts checkout.


### Changed

- **The `io.sentry:sentry` dependency is removed.** SDK error reports are now sent by a small internal client, so the SDK no longer adds a Sentry artifact to your dependency graph or conflicts with your own Sentry version or Gradle plugin. No public API change.
- `onEvent` is deprecated and will be removed in a future major version. It carries diagnostic events that are subject to change and were never part of the integration contract. SDK-originated events are now namespaced with a `glomo_android_sdk.` prefix; page events are still forwarded verbatim.
- The SDK supports and tests merchant applications targeting SDK 34 to 36, and the AAR declares `minCompileSdk 35`. `minSdk` is unchanged at 24.


### Fixed

- `onPaymentFailure` is delivered on the checkout's failure event instead of requiring a `signature` that a failure payload has never carried. The callback previously could not fire for a backend-confirmed decline in any release build.
- Order faults the backend answered reach `onSdkError` only. They no longer also deliver `onPaymentTerminate(CONNECTION_ERROR)`, which told hosts the network had failed when it had not. Any 2xx order response counts as the backend answering; a 2xx body that cannot be parsed is reported as a malformed response rather than a status error.
- Order detection fails explicitly instead of guessing the checkout host. Guessing Standard routed LRS traffic to the wrong host.
- A dark-mode toggle, locale change, font-size change or multi-window resize no longer ends a live payment. Only real process death reaches that path.
- An interrupted session now ends on recreation instead of silently replaying the checkout, and session listeners are released at completion.
- Merchant cookies, the process-wide WebView resource cache and the application's WebView debugging preference are preserved.
- Bank overlays close on Back, including predictive Back, and can be dismissed during a pending payment.
- External schemes are blocked in bank flows, popup URLs are validated, and an exception thrown from a merchant callback is isolated and reported by type and stack trace only, never by message.


Part of the [v2 documentation](/platform/sdk/android-sdk/v2).

## [1.0.0] - 2026-08-17

Initial stable release.

### Added

- Standard, LRS, and Subscriptions checkout flows
- Automatic order type detection
- Payment success/failure callbacks with signature verification
- Device security compliance (root/debugger detection for live keys)
- Mock mode (`test_` and `mock_` key prefixes)
- Connection error handling with recovery hints
- File upload support (system document picker)
- ProGuard/R8 consumer rules included
- LRS education carousel support above the secure bank flow
- Mixpanel analytics (SDK telemetry, not merchant-facing)
- Sentry error reporting (SDK telemetry, not merchant-facing)


### Fixed

- Fixed a WebView callback race that could leave checkout stuck behind the loading overlay


## Related

- [Android SDK v2 documentation](/platform/sdk/android-sdk/v2) - latest version (v2.1.0)
- [Dark mode across the SDKs](/platform/sdk/dark-mode) - what the automatic value resolves to on each Glomo SDK
- [Migration Guide (v1.0.0 to v2.0.0)](/platform/sdk/android-sdk/migration) - step-by-step upgrade instructions
- [Android SDK v1 (Archived)](/platform/sdk/android-sdk/v1) - previous version documentation (v1.0.0)
- [Android SDK overview](/platform/sdk/android-sdk)