Android SDK — Release Notes
ai.revrag:embed-android · release history, newest first. Install the latest with implementation("ai.revrag:embed-android:1.2.1"); confirm the current version on Maven Central.
1.2.1: upgrading from 1.2.0
Upgrade
implementation("ai.revrag:embed-android:1.2.1")Drop-in. Nothing has been removed or changed in the public API, the dependencies are the same as 1.2.0, and so are the toolchain requirements (minSdk 24, compileSdk 34, Kotlin 2.0+, JDK 17). No code changes are needed.
As before, your repositories must include JitPack (maven("https://jitpack.io")), which the SDK's LiveKit dependency needs for its audio-routing library.
Fixed
Crash when a call starts: KotlinReflectionInternalError … requestFocus
Apps could crash when a call started, or when moving between screens during a call:
kotlin.reflect.jvm.internal.KotlinReflectionInternalError: Function 'requestFocus'
(JVM signature: requestFocus()Z) not resolved in class androidx.compose.foundation.…
at ai.revrag.embed.android.intelligence.UITreeCapture.extractStringValueIt needed all three of these:
- a release build minified with R8
- an app that includes
kotlin-reflect - Jetpack Compose foundation 1.9.0 or newer (Compose BOM 2025.08.00 or later)
When the SDK read the screen for the agent, it converted Compose's accessibility actions to text. On Compose 1.9+, that conversion throws under kotlin-reflect and R8. The SDK no longer converts them.
The bug has existed since 1.1.0 but only surfaced once an app moved to Compose 1.9. We verified the fix on a device: the same test app crashes on 1.2.0 and runs normally on 1.2.1.
R8 may rename the exception, for example to kotlinx.coroutines.CoroutinesInternalError after retracing. The message Function 'requestFocus' … not resolved is what identifies this crash.
Improved
Stability: SDK failures stay inside the SDK
1.2.0 kept failures inside the widget's own UI from reaching your app. 1.2.1 extends that to the other places where the SDK runs code on your app's threads. It also now catches JVM errors, not just exceptions, such as a NoSuchMethodError or NoClassDefFoundError from a library-version mismatch. When something fails, only that SDK feature stops; your app keeps running.
- Navigation: the SDK's listener on your
NavControllercan no longer throw into yournavigate()orpopBackStack()calls. - Lifecycle callbacks: the SDK's handling of these can no longer throw:
- fragment start and resume
- dialog dismissal
- Activity destruction
- the app going to the background
- back presses
- permission results
- scroll listeners
- Taps: the SDK's tap tracking can no longer throw into your touch handling.
- Background work: failures in the SDK's network requests, events, call handling and on-screen agent missions are contained.
- Mounting the widget: if
attachOverlayorEmbedProviderComposablefails to mount, your app keeps running without the widget.attachOverlaystill returns a handle, which safely does nothing. - Detaching:
detach()can no longer throw. - Initializing: calling
EmbedSDK.initializeoff the main thread no longer throws. The SDK now registers its app-lifecycle observer on the main thread itself. - Your listeners: an
onAvatarStatelistener that throws no longer stops your other listeners from being notified.
Calls
- If connecting fails with an unexpected error, the SDK now resets. Before, it could stay stuck in "connecting" and refuse every later call until the app restarted.
- If disconnecting fails when a call ends, the call state still resets.
- A failure while handling one in-call event no longer stops the SDK from handling the rest of the call's events, such as agent messages, captions and disconnects.
The on-screen agent
- Sliders: when the agent types a value into a slider, such as a loan-amount slider, the slider now moves to that value. It accepts
200000,2,00,000,₹2,00,000and1 500.50. Words such as "2 lakh" or "max" are refused cleanly, so the agent can retry with a number. Before, these steps always failed. - Message sending: if sending one message fails, later messages are no longer held up.
- Screen snapshots: if a snapshot fails, the SDK skips that snapshot instead of removing the widget.
Changed behaviour
- Click analytics
element_id.- A view's
tagis now used as its element ID only when the tag is aString. - Other tag objects, such as ViewHolders or lambdas, are skipped, and the next fallback (the view's resource ID name) is used.
- Before, any tag object was converted to text.
- Views with a content description are unaffected, because that is still checked first.
- A view's
- Debug-build logs. Each contained failure is logged in debug builds of your app, naming the SDK feature and the error's class, never its message or any user data. Filter with
adb logcat | grep RevragEmbed. Release builds still print nothing.
Known issue (also in earlier versions)
If your release build does not use Android's default ProGuard files (getDefaultProguardFile(...)) and your app does not include RecyclerView, R8 can fail with Missing class androidx.recyclerview.widget.RecyclerView. Add this to your ProGuard rules:
-dontwarn androidx.recyclerview.**1.2.0: upgrading from 1.1.0
Upgrade
implementation("ai.revrag:embed-android:1.2.0")Drop-in. Nothing has been removed or changed in the public API, and the toolchain requirements are the same as 1.1.0 (minSdk 24, compileSdk 34, Kotlin 2.0+, JDK 17). If your app doesn't use the new APIs below, no code changes are needed.
New
WebView pages as separate screens: setSubScreen
For apps that show a WebView with several pages on one screen or nav route (KYC, DigiLocker, eSign, partner pages). Each web page reaches the backend as its own screen, while the widget follows the route that hosts the WebView.
webViewClient = object : WebViewClient() {
override fun doUpdateVisitedHistory(view: WebView, url: String?, isReload: Boolean) {
if (!isReload) embedHandle?.setSubScreen(pageNameFor(url)) // no tokens, IDs or personal data
}
}- List the route that hosts the WebView in
allowedScreens, not the web pages. - Moving between pages doesn't flicker the widget or end a live call.
- Leaving the route clears the page name automatically.
- If you used
setCurrentScreenfor web pages, switch tosetSubScreen:setCurrentScreenreplaces the route, so an unlisted page name hid the widget.
embedHandle is the EmbedOverlayHandle returned by EmbedProvider.attachOverlay(...).
App version at initialization
EmbedSDK.initialize(context = this, apiKey = key, appVersion = "2.4.0") { result -> }Optional. Without it, the SDK keeps detecting your app's versionName, as in 1.1.0.
Improved
The on-screen agent
- It no longer targets controls hidden behind a bottom sheet or dialog.
- It detects disabled buttons and fields and won't tap or type into them.
- Custom views that expose themselves through accessibility are now visible to it.
- Field labels are linked to their fields, so it types into the right field.
- Guided tours skip a missing element instead of stopping, and highlights are centred.
- Highlights and taps on Compose bottom sheets and dialogs land in the right place.
Stability
- Bad configuration values from the backend can no longer crash your app (zero-length animations, oversized avatars, negative padding, empty charts).
- A failure inside the SDK stays inside it: the widget is removed and your app keeps running. Exceptions thrown in your own SDK listeners are isolated too.
- The SDK's screen cache has memory limits, and a leak that kept an Activity alive is fixed.
UI
- The microphone-permission explainer uses its own floating dialog theme, in light and dark. Under some app themes it used to open full-screen.
Changed behaviour
- Logs in debug builds of your app. The SDK now prints lifecycle logs (initialization,
screen changes, visibility decisions, call steps) when your app is a debug build. In
1.1.0 the published SDK printed nothing at all, which made integration hard to diagnose.
Filter with
adb logcat | grep RevragEmbed. These logs never include on-screen text or user data. - Release builds are unchanged: the SDK prints nothing.
Known limitations
setSubScreenis Android only; it isn't on iOS yet.- The agent still can't read or fill content inside a WebView.
- Two library warnings can appear in release logs and aren't SDK faults: Lottie ("You have N images…", from the avatar animation) and three SLF4J lines at startup.
More detail: the Android Integration Guide (setup, screen naming and WebView steps) and the Android Copilot Integration prompt (full 1.2.1 contract for AI coding agents).