> For the complete documentation index, see [llms.txt](https://products.monterosa.co/mic/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://products.monterosa.co/mic/release-notes/sdk/android.md).

# Android

## v0.17.3

**Improvements**

* **InteractKit exposes connection state**\
  InteractKit now exposes the underlying WebSocket connection state through its `connect` field. In earlier 0.17 releases, this state was internal and not available through the public API. You can now observe reconnect cycles, show connectivity indicators, and gate logic on connection readiness by attaching a `ConnectKitListener` or collecting updates from `connect.stateFlow`.
* **Fullscreen orientation is now handled by the consumer**\
  The SDK no longer manages screen orientation when an Experience enters fullscreen. This behaviour previously added integration and cleanup overhead and prevented custom behaviour. Orientation changes are now delegated to the consumer, which gives you full control over this state.

## v0.17.2

**Fixes**

* **IndexOutOfBoundsException in Event under concurrent element mutations**\
  The fix introduced in 0.16.21 affecting Event concurrent element mutations which could result in **IndexOutOfBoundsExceptions** is now included in the 0.17.x release line.
* **RejectedExecutionException in DelayMessageQueue when `add()`/`start()` races with `stop()`**\
  The fix introduced in 0.16.21 affecting `DelayMessageQueue` `add()` and `start()` function calls which could result in **RejectedExecutionExceptions** is now included in the 0.17.x release line.

## v0.17.1

**Improvements**

* **Implicit IdentifyKit Cleanup**\
  IdentifyKit internally cleans up allocated resources when `purgeCore()` is invoked on a Core instance with an attached IdentifyKit.

**Fixes**

* **Session Signature Update Message**\
  The fix introduced in 0.16.20 affecting the session signature message format is now included in the 0.17.x release line.

## v0.17.0

**New Features**

* **InteractKit `logout()` must now be called explicitly.**\
  A new `logout()` method has been added to the InteractKitAPI interface; if your implementation of the interface doesn't already provide one you must add it.

**Improvements**

* **Session ID Persistence Across Reconnections**\
  ConnectKit now persists and reuses the session ID across WebSocket reconnections. This gives the backend continuity of context for a user session and avoids redundant session setup on transient disconnects.
* **View Providers are Parcelable Supported.**\
  `ExperienceConfiguration` now supports `loadingViewProvider` and `errorViewProvider` as properly-parcelled lambdas, so they survive process restoration via `ExperienceFragment`.
* **Replaced Gson Dependency with Kotlin Serialization**\
  `Gson` has been removed. All serialisation throughout the SDK now uses `kotlinx.serialization`. This reduces the SDK's dependency footprint and aligns with Kotlin-idiomatic tooling.
* **Replaced Netty Dependency with Ktor WebSocket**\
  `Netty` has been removed. The WebSocket transport layer in `ConnectKit` now uses Ktor (backed by OkHttp) instead of Netty. This significantly reduces the binary size of the SDK and eliminates a large, server-oriented dependency from an Android library.
* **Bumped SDK versions**
  * `targetSdk` and `compileSdk` updated to **36**.
  * SDK requires gradle `8.11.1+` and agp `8.9.1+`

**Breaking Change**

{% hint style="info" %}
These changes require updates to your integration code. Read the [Migration Guide](#migration-guide) for step-by-step instructions.
{% endhint %}

* **Removal of Deprecated Launcher API Overloads**

  The following deprecated API overloads have been removed: `getExperience()`, `getExperienceFragment()`, `getExperienceIntent()`, and `reload()`.
* **Removal of `ExperienceActivity` feature**.\
  The Activity-based experience host has been removed. Use `ExperienceView` directly inside your own Activity or use `ExperienceFragment`.
* **Package rename for IdentifyKit.**\
  Classes previously under `co.monterosa.identifykit` now live under `co.monterosa.sdk.identifykit` (consistent with the rest of the SDK).
* **InteractKit Callback Functions Are Now Suspend**

  The callback functions in InteractKit have been converted to suspend functions, as recommended for asynchronous operations. They can now be called within a coroutine scope.

#### **Migration Guide**

**ProGuard / R8**

No new consumer rules are required. The Ktor/OkHttp and kotlinx.serialization libraries include their own consumer rules. If you were previously adding manual rules for Gson or Netty, those can be removed.

**Remove Gson from your dependencies (if pulled in transitively)**

If your project depended on Gson only because the SDK pulled it in, you can now remove it:

```kotlin
// Remove if no longer needed elsewhere in your project
// implementation("com.google.gson:gson:x.x.x")
```

**Update IdentifyKit import paths and usages.**

* **Imports**

```kotlin
// Before (0.16.x)
import co.monterosa.identifykit.IdentifyKit

// After (0.17.0)
import co.monterosa.sdk.identifykit.IdentifyKit
```

* **Get `default` Instance**

```kotlin
// Before (0.16.x)
val identifyKit = IdentifyKit.default()

// After (0.17.0)
val identifyKit = IdentifyKit.default
```

* **`getSessionSignature` and `getUserData` calls.**

```kotlin
// Before (0.16.x)
identifyKit.getSessionSignature { result ->
    result.onSuccess { signature -> /* use signature */ }
    result.onFailure { error -> /* handle error */ }
}

// After (0.17.0)
lifecycleScope.launch {
    val result = identifyKit.getSessionSignature()
    result.onSuccess { signature -> /* use signature */ }
    result.onFailure { error -> /* handle error */ }
}
```

**Update InteractKit construction and callback calls.**

* **`getProject` call.**

```kotlin
// Before (0.16.x)
interactKit.getProject(context) { result ->
    result.onSuccess { project -> /* use project */ }
    result.onFailure { error -> /* handle error */ }
}

// After (0.17.0)
lifecycleScope.launch {
    try {
        val project = interactKit.getProject(context)
        // use project
    } catch (e: Exception) {
        // handle error
    }
}
```

* **`login` and `logout` calls.**

```kotlin
// Before (0.16.x)
interactKit.login(signature, completion = null)
interactKit.login(signature) { success -> }

// After (0.17.0)
interactKit.login(signature) { success -> }
interactKit.logout()
```

***

## v0.16.21

**Fixes**

* **IndexOutOfBoundsException in Event under concurrent element mutations**\
  Element lists were backed by plain `ArrayList` with no thread-safety guarantees. Under concurrent access this could produce an `IndexOutOfBoundsException`. Both lists are now backed by `CopyOnWriteArrayList`, and mutation paths take asnapshot for reads while writing directly to the live list.
* **RejectedExecutionException in DelayMessageQueue when `add()`/`start()` races with `stop()`**\
  The scheduled executor service field was not declared `@Volatile` with guard checks, so a `shutdownNow()` on one thread was not guaranteed to be visible to `add()` or `start()` on another. Fixed by marking the field `@Volatile`, capturing the reference once per call to avoid double-reads, and wrapping submission calls in a try/catch RejectedExecutionException to handle the residual race window safely.

## v0.16.20

**Fixes**

* **Incorrect Message Format on Session Signature Update**\
  When a session signature was refreshed, the message sent to the Experience contained a malformed payload. This caused any Experience functionality that depended on a valid signature to fail silently after the first signature refresh.\
  The message format has been corrected. Signature update messages are now delivered in the format the Experience expects, restoring reliable behaviour across the full authenticated session lifecycle.

**Improvements**

* **Explicit `destroy()` for IdentifyKit Cleanup**\
  IdentifyKit now exposes a `destroy()` method that consumers must call to release allocated resources.
* **Response Caching for `getSessionSignature()` and `getUserData()`**\
  Identify `getSessionSignature()` and `getUserData()` made extra network requests, even when the response was unlikely to changed. Both methods now cache these responses and reduces unnecessary round-trips to the Identify API.

## v0.16.19

**New Features**

* **Native share sheet support**\
  When an Experience triggers a share action, the SDK now automatically presents a native share sheet with the shared content. This behaviour is controlled by the `showsDefaultShareSheet` property in `ExperienceConfiguration` (defaults to `true`). When set to `false` the SDK skips the native share sheet, allowing you to handle sharing in your own way.
* **`onShare` listener callback**\
  A new `onShare(ExperienceView, ShareContent)` method has been added to `ExperienceViewListener`. This callback fires every time the Experience requests a share action, regardless of the `showsDefaultShareSheet` setting, giving you full visibility into share events.

**Fixes**

* **Concurrent modification crash for getElements in Events**\
  We've implemented a fix for the ConcurrentModificationException that occurs when different parts of our SDK attempt to read and modify the same Event's element list simultaneously. This fix includes the following key improvements:
  * **Thread-Safe Collection**: Upgraded the collection for the Elements to a thread-safe variant. This change is specifically designed to handle simultaneous reads and writes without conflicts.
  * **Snapshot Iteration Strategy**: Implemented a snapshot iteration method for elements, ensuring stability during concurrent operations.

***

## v0.16.18

**New Features**

* **Allows Popup Behaviour in Experience**\
  The SDK now facilitates popup windows within your Experience. Ideal for scenarios requiring secondary windows, these are triggered using the JavaScript `window.open()` function or similar variant.\
  It's crucial for these windows to ensure proper closure and, if applicable, data transfer back to the main Experience. Configuration is available through `ExperienceConfiguration`.

<pre class="language-kotlin"><code class="lang-kotlin">val config = ExperienceConfiguration(
<strong>  allowsPopupBehaviour: Boolean
</strong>)
Launcher.default.getExperience(context, config)
...
</code></pre>

***

## v0.16.17

**Fixes**

* **Concurrent modification crash for SDK listeners**\
  We've implemented a fix for the ConcurrentModificationException that occurs when different parts of our SDK attempt to read and modify the same list of listeners simultaneously. This fix includes the following key improvements:
  * **Thread-Safe Collection**: Upgraded the collection used by the MulticastListener class to a thread-safe variant. This change is specifically designed to handle simultaneous reads and writes without conflicts.
  * **Snapshot Iteration Strategy**: Implemented a snapshot iteration method for notifying listeners, ensuring stability during concurrent operations.
* **Error Handling Improvement in onFailloading Listener**\
  The `onFailloading` listener previously propagated all errors from the experience to the parent, aiding in debugging the client app. However, this verbosity was problematic. We have now refined this by restricting error propagation to only include issues related to experience loading failures. All other errors are logged to the console for debugging purposes, ensuring clearer communication with the parent app.

***

## v0.16.16

**Fixes**

* **Session persistance**\
  We’ve updated the default behaviour of **storage persistence** to be **enabled** by default. This change ensures consistent session maintenance, preventing disruptions caused by the operating system clearing webview data over time.

{% hint style="warning" %}
To ensure optimal performance and compatibility, please upgrade to JavaScript SDK version 0.18.4 and this corresponding Android SDK version to prevent any disruptions in user experience.
{% endhint %}

***

## v0.16.15

**Fixes**

* **Experience Cleanup**\
  We’ve improved how Experiences are cleaned up to ensure smoother transitions and prevent issues during re-initialisation.

***

## v0.16.14

**Fixes**

* **Opening links externally not handled for embedded iframes**\
  The opening links in an external app using the `launchesURLsWithBlankTargetToChrome` override now handles links from webpages or iframes embedded in an Experience.

**New features**

* **Background customisation**\
  The SDK now enables you to customise the background of an Experience to match overall app look. This can be configured via `ExperienceConfiguration`

<pre class="language-kotlin"><code class="lang-kotlin">val config = ExperienceConfiguration(
<strong>  backgroundColor: &#x3C;Int?>
</strong>)
Launcher.default.getExperience(context, config)
...
</code></pre>

***

## v0.16.13

**Fixes**

* **Crash on opening a URL when no browser installed**\
  Users whose device didn’t have a browser installed would crash when attempting to open a URL.We now avoid the crash, and notify about this occurrence with a listener so you can notify your user about the error if you chose to

```kotlin
class MyActivity : AppCompatActivity(), ExperienceViewListener {
    ...
    
    // The SDK provides this listener for errors and exceptions that occur 
    // during runtime, outside of the normal lifecycle events. 
    // Implementing this listener offers a strategic approach to error handling, 
    // allowing for the presentation of user-friendly messages to users.
    override fun onExperienceError(
        experienceView: ExperienceView,
        experienceViewException: ExperienceViewException
    ) {
        handleExperienceError()
    } 
}
```

**New Features**

* **Loading view timeout configuration**\
  SDK can optionally display a loading view while the Experience is loading. This view is removed when either of the two happens:

  * The Experience notifies the SDK that it has completed loading it’s UI.
  * A loading timeout has been reached.

  This version of the SDK adds a way to customise this timeout:

```kotlin
class MyActivity : AppCompatActivity(), ExperienceViewListener {
    ...
    
    // The SDK provides this listener for errors and exceptions that occur 
    // during runtime, outside of the normal lifecycle events. 
    // Implementing this listener offers a strategic approach to error handling, 
    // allowing for the presentation of user-friendly messages to users.
    override fun onExperienceError(
        experienceView: ExperienceView,
        experienceViewException: ExperienceViewException
    ) {
        handleExperienceError()
    } 
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://products.monterosa.co/mic/release-notes/sdk/android.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
