Skip to main content

Android v26.9.0

Compatibility

NameVersionImplementation
Compile SDK36compileSdk = q2libs.versions.compileSdk.get()
Target SDK36targetSdk = q2libs.versions.targetSdk.get()
Min SDK29minSdk = q2libs.versions.minSdk.get()
Java / JVM21javaVersion = q2libs.versions.javaVersion
Gradle9.4.1gradle-wrapper.properties
Android Gradle Plugin9.1.0id(q2libs.plugins.android.application)
Kotlin Gradle Plugin2.3.20(built into AGP 9; no explicit plugin alias)
KSP2.3.6id(q2libs.plugins.ksp)
Google Services Plugin4.4.2id(q2libs.plugins.google.services)
Kotlin Serialization2.3.20id(q2libs.plugins.kotlin.serialization)

No toolchain bumps in this release — the table above is unchanged from 26.8.0.

Migration from 26.8.0 to 26.9.0

Doing a multi-version migration?

If you're jumping more than 2–3 versions at once, walking each version's migration notes individually can be tedious and error-prone. Consider the Large Version Migrations guide instead — it walks you through replacing your local DevApp with a fresh copy at the target tag and dropping your module back in, which atomically picks up every scaffolding change at once.

SdkModuleConfig.identifier is now nullable

SdkModuleConfig.identifier (and the mirrored SdkModuleInfo.identifier) changed from String to String?. Modules that do not require an identifier — for example, pure LifecycleModule or SecurityModule implementations that have no MethodModule or UIModule entry point — can now omit it from their sdk_modules entry in settings.json.

MethodModule and UIModule implementations are only reachable from the web layer via their identifier — omitting it silently disables routing to those modules. The app throws ClassNotFoundException at the web-side lookup for any identifier not registered by a module. Always declare an identifier for MethodModule and UIModule entries.

If your module reads sdkModuleConfig.identifier directly, handle the null case:

- val id: String = sdkModuleConfig.identifier
+ val id: String? = sdkModuleConfig.identifier

Java callers now receive @Nullable String and should null-check before use.

SdkUtils.currentUserId — synchronous property (deprecates the callback)

SdkUtils gains a synchronous currentUserId: String? property. It returns the authenticated user's ID immediately from in-memory state, with no network call and no callback plumbing.

abstract class SdkUtils(...) {
/** Authenticated user ID from in-memory state, or null if no user is authenticated. Synchronous — no network call. */
abstract val currentUserId: String?

@Deprecated(
message = "Use currentUserId property for synchronous cached access.",
replaceWith = ReplaceWith("currentUserId"),
level = DeprecationLevel.WARNING
)
abstract fun getCurrentUserId(callback: GetUserIdCallback)
// …
}

Migrate call sites from the callback form to the property. Kotlin:

- sdkUtils.getCurrentUserId(object : GetUserIdCallback {
- override fun value(userId: String?) {
- if (userId != null) doWork(userId)
- }
- })
+ sdkUtils.currentUserId?.let { doWork(it) }

Java (the property compiles down to a no-arg getCurrentUserId() getter, which overloads with the existing callback-taking method):

- sdkUtils.getCurrentUserId(userId -> {
- if (userId != null) doWork(userId);
- });
+ String userId = sdkUtils.getCurrentUserId();
+ if (userId != null) doWork(userId);

The callback overload is deprecated but still functional in 26.9.0, so this migration is optional for this release.

Why the change

The callback form implied an asynchronous fetch, but the value has always been read from an in-memory holder. Modules that were awaiting the callback (for example, on login response) could be delayed by unrelated coroutine scheduling. The property makes the synchronous nature explicit.


Version Updates

Library Version Changes

Library26.8.0 Version26.9.0 VersionImpact
Play Age Signals0.0.1-beta020.0.4Underlying Play Age Signals SDK bump; no API changes visible to partner modules
q2libs.coil.view (new alias)2.7.0Additive — new alias for io.coil-kt:coil alongside coil-compose

Underlying, non-partner-facing dependency bumps are intentionally omitted — they carry no interface or integration change for partner modules.


Version Catalog

AndroidX Libraries

LibraryVersionImplementation
AndroidX Core KTX1.12.0implementation(q2libs.androidx.core.ktx)
AndroidX AppCompat1.6.1implementation(q2libs.androidx.appcompat)
AndroidX Activity KTX1.8.1implementation(q2libs.androidx.activity.ktx)
AndroidX Legacy Support1.0.0implementation(q2libs.androidx.legacy.support)
AndroidX Constraint Layout2.1.4implementation(q2libs.androidx.constraintlayout)
AndroidX CardView1.0.0implementation(q2libs.androidx.cardview)
AndroidX Local Broadcast Manager1.1.0implementation(q2libs.androidx.localbroadcastmanager)
AndroidX Percent Layout1.0.0implementation(q2libs.androidx.percentlayout)
AndroidX Biometric1.1.0implementation(q2libs.androidx.biometric)
AndroidX RecyclerView1.3.2implementation(q2libs.androidx.recyclerview)
AndroidX WebKit1.14.0implementation(q2libs.androidx.webkit)
AndroidX Media1.6.0implementation(q2libs.androidx.media)
AndroidX Browser1.8.0implementation(q2libs.androidx.browser)
AndroidX Grid Layout1.0.0implementation(q2libs.androidx.gridlayout)
AndroidX Preference1.2.1implementation(q2libs.androidx.preference)
AndroidX Security Crypto1.1.0-beta01implementation(q2libs.androidx.security.crypto)
AndroidX ExifInterface1.4.2implementation(q2libs.androidx.exifinterface)
AndroidX Credentials (ref only)1.6.0(catalog version pin; no library alias yet)

AndroidX Fragment

LibraryVersionImplementation
AndroidX Fragment1.7.0implementation(q2libs.androidx.fragment)
AndroidX Fragment KTX1.7.0implementation(q2libs.androidx.fragment.ktx)

AndroidX Navigation

LibraryVersionImplementation
AndroidX Navigation Fragment KTX2.7.4implementation(q2libs.androidx.navigation.fragment.ktx)
AndroidX Navigation UI KTX2.7.4implementation(q2libs.androidx.navigation.ui.ktx)
AndroidX Navigation Compose2.8.9implementation(q2libs.androidx.navigation.compose)

AndroidX Lifecycle

LibraryVersionImplementation
AndroidX Lifecycle Runtime KTX2.7.0implementation(q2libs.androidx.lifecycle.runtime.ktx)
AndroidX Lifecycle ViewModel KTX2.7.0implementation(q2libs.androidx.lifecycle.viewmodel.ktx)
AndroidX Lifecycle Process2.7.0implementation(q2libs.androidx.lifecycle.process)
AndroidX Lifecycle Compiler2.7.0ksp(q2libs.androidx.lifecycle.compiler)
AndroidX Lifecycle Extensions2.2.0 (Deprecated)implementation(q2libs.androidx.lifecycle.extensions)
AndroidX Lifecycle ViewModel Compose2.7.0implementation(q2libs.androidx.lifecycle.viewmodel.compose)

AndroidX Room

LibraryVersionImplementation
Room Runtime2.8.4implementation(q2libs.androidx.room.runtime)
Room Compiler2.8.4ksp(q2libs.androidx.room.compiler)
Room KTX2.8.4implementation(q2libs.androidx.room.ktx)

AndroidX CameraX

LibraryVersionImplementation
CameraX Camera21.5.0implementation(q2libs.androidx.camera.camera2)
CameraX Lifecycle1.5.0implementation(q2libs.androidx.camera.lifecycle)
Camera View1.5.0implementation(q2libs.androidx.camera.view)

AndroidX Compose

LibraryVersionImplementation
Compose BOM2025.12.01implementation(platform(q2libs.androidx.compose.bom))
Compose Foundation-implementation(q2libs.androidx.compose.foundation)
Compose UI-implementation(q2libs.androidx.compose.ui)
Compose UI Graphics-implementation(q2libs.androidx.compose.ui.graphics)
Compose UI Tooling-implementation(q2libs.androidx.compose.ui.tooling)
Compose UI Tooling Preview-implementation(q2libs.androidx.compose.ui.tooling.preview)
Compose UI Test Manifest-implementation(q2libs.androidx.compose.ui.test.manifest)
Compose UI Test JUnit4-implementation(q2libs.androidx.compose.ui.test.junit4)
Compose Runtime LiveData-implementation(q2libs.androidx.compose.runtime.livedata)
Material Icons Core-implementation(q2libs.material.icons.core)
Material3-implementation(q2libs.material3)
Material3 Adaptive-implementation(q2libs.androidx.compose.material3.adpative)
Activity Compose1.8.2implementation(q2libs.activity.compose)

Google Libraries

LibraryVersionImplementation
Material1.10.0implementation(q2libs.google.material)
GSON2.10.1implementation(q2libs.google.gson)
Play Services Vision20.1.3 (Deprecated)implementation(q2libs.google.play.services.vision)
ZXing Core3.5.1implementation(q2libs.google.zxing.core)
Age Signals0.0.4implementation(q2libs.google.age.signals)

Firebase

LibraryVersionImplementation
Firebase Messaging23.3.0implementation(q2libs.google.firebase.messaging)
Firebase Messaging KTX23.3.0implementation(q2libs.google.firebase.messaging.ktx)
Firebase Instance ID21.1.0implementation(q2libs.google.firebase.iid)
Firebase Core21.1.1implementation(q2libs.google.firebase.core)
Firebase Crashlytics Build Tools2.9.9implementation(q2libs.google.firebase.crashlytics.buildtools)

Kotlin & Jetbrains

LibraryVersionImplementation
Kotlinx Coroutines1.7.3implementation(q2libs.jetbrains.kotlinx.coroutines)
Kotlinx Serialization JSON1.11.0implementation(q2libs.kotlinx.serialization)
Jetbrains Annotations20.1.0implementation(q2libs.jetbrains.annotations)

Networking

LibraryVersionImplementation
Retrofit22.9.0implementation(q2libs.retrofit2.retrofit)
Retrofit2 Converter GSON2.9.0implementation(q2libs.retrofit2.converter.gson)
Retrofit2 RxJava Adapter2.1.0implementation(q2libs.retrofit2.adapter.rxjava)
OkHttp34.10.0implementation(q2libs.okhttp3.okhttp)
OkHttp3 Logging Interceptor4.10.0implementation(q2libs.okhttp3.logging.interceptor)
RxAndroid1.2.0implementation(q2libs.reactivex.rxandroid)
Volley1.2.1implementation(q2libs.volley)

Dependency Injection

LibraryVersionImplementation
Dagger2.59.2implementation(q2libs.dagger)
Dagger Compiler2.59.2ksp(q2libs.dagger.compiler)
Hilt2.59.2implementation(q2libs.hilt)
Hilt Compiler2.59.2ksp(q2libs.hilt.compiler)
Hilt Navigation Compose1.2.0implementation(q2libs.androidx.hilt.navigation.compose)
Glassfish Annotation10.0-b28implementation(q2libs.glassfish.annotation)

Dependency Injection (Koin)

LibraryVersionImplementation
Koin Android3.4.3implementation(q2libs.koin.android)
Koin Core3.4.3implementation(q2libs.koin.core)
Koin AndroidX Compose3.5.0implementation(q2libs.koin.androidx.compose)

Third-Party Libraries

LibraryVersionImplementation
EventBus3.3.1implementation(q2libs.eventbus)
EventBus Processor3.3.1ksp(q2libs.eventbus.processor)
Commons IO2.6implementation(q2libs.commons.io)
Picasso2.8implementation(q2libs.picasso)
Coil Compose2.7.0implementation(q2libs.coil)
Coil View2.7.0implementation(q2libs.coil.view)
Timber5.0.1implementation(q2libs.timber)
Apache Commons Imaging1.0-alpha2implementation(q2libs.apache.commons.imaging)

Q2 SDK Components

LibraryCoordVersionImplementation
Q2 SDK Interfacescom.q2.msdk:sdk_interfacesq2Versionimplementation project(':sdk_interfaces')
Q2 UI Componentscom.q2:ui-components0.1.1implementation(q2libs.q2.ui.components)
Q2 Routing Service(local project, unpublished)q2Versionimplementation project(':modules:q2_routing_service')

Plugin Declarations

PluginIDImplementation
Android Applicationcom.android.applicationid(q2libs.plugins.android.application)
Android Librarycom.android.libraryid(q2libs.plugins.android.library)
KSPcom.google.devtools.kspid(q2libs.plugins.ksp)
Compose Compilerorg.jetbrains.kotlin.plugin.composeid(q2libs.plugins.compose.compiler)
Hiltcom.google.dagger.hilt.androidid(q2libs.plugins.hilt)
Kotlin Parcelizeorg.jetbrains.kotlin.plugin.parcelizeid(q2libs.plugins.kotlin.parcelize)
Google Servicescom.google.gms.google-servicesid(q2libs.plugins.google.services)
Artifactorycom.jfrog.artifactoryid(q2libs.plugins.artifactory)
Kotlin Serializationorg.jetbrains.kotlin.plugin.serializationid(q2libs.plugins.kotlin.serialization)
Dokkaorg.jetbrains.dokkaid(q2libs.plugins.dokka)

Library Bundles

BundleLibrariesImplementation
Daggerdagger, glassfish-annotationimplementation(q2libs.bundles.dagger)
Retrofit2retrofit2-retrofit, retrofit2-converter-gsonimplementation(q2libs.bundles.retrofit2)
Koinkoin-android, koin-core, koin-androidx-composeimplementation(q2libs.bundles.koin)