Android DevApp v26.4.0
Compatibility
| Name | Version | Implementation |
|---|---|---|
| Compile SDK | 36 | compileSdk = q2libs.versions.compileSdk.get() |
| Target SDK | 36 | targetSdk = q2libs.versions.targetSdk.get() |
| Min SDK | 29 | minSdk = q2libs.versions.minSdk.get() |
| Android Gradle Plugin | 8.13.0 | id(q2libs.plugins.android.application) |
| Kotlin Gradle Plugin | 2.0.20 | id(q2libs.plugins.kotlin.android) |
| Google Services Plugin | 4.3.15 | id(q2libs.plugins.google.services) |
| Kotlin Serialization | 1.9.0 | id(q2libs.plugins.kotlin.serialization) |
Migration from 26.3.0 to 26.4.0
Version Updates
This release updates the Q2 SDK Interfaces library from 0.3.8 to 0.3.11 and upgrades Hilt from 2.52 to 2.57. The Hilt upgrade is a breaking change — any DevApp module AAR compiled against Hilt 2.52 must be recompiled against 2.57 before it is compatible with a 26.4.0 host app.
Library Version Changes
| Library | 26.3.0 Version | 26.4.0 Version | Impact |
|---|---|---|---|
| Q2 SDK Interfaces | 0.3.8 | 0.3.11 | Updated — See SDK interfaces section |
| Hilt / Dagger | 2.52 | 2.57 | Breaking — Module AARs must be recompiled |
Changes
Breaking: Modules built prior to 26.4.0 are not compatible with a 26.4.0 Q2 Mobile App. See Hilt Upgrade (2.52 → 2.57) for details.
All Q2 SDK interface changes in this release are additive and backward compatible. No existing implementations require modification.
The notable SDK interface additions are:
RDCRequesthas a new optionaladditionalConfigparameter (defaults toemptyMap()).RDCImageResult.Errorhas a new optionalerrorCodeparameter (defaults tonull). A companionErrorCodesobject provides standard error code constants.SdkUtilsexposes a newoAuthUtils: OAuthUtils?property for accessing OAuth token data post-authentication.
Hilt Upgrade (2.52 → 2.57)
Modules built prior to 26.4.0 are not compatible with a 26.4.0 Q2 Mobile App. To deploy your module to a 26.4.0 app, you must rebuild it using DevApp 26.4.0.
Hilt 2.57 changed the naming of the internal classes it generates for @HiltViewModel
ViewModels. Modules built with an earlier version contain classes with the old naming, which
the 26.4.0 app's Dagger component cannot resolve.
Symptom
Modules built with 26.3.0 or earlier will fail at compile time in the host app with errors like:
error: cannot find symbol
class MyViewModel_HiltModules_BindsModule_Binds_LazyMapKey
error: cannot find symbol
import com.example.mymodule.vm.MyViewModel_HiltModules_KeyModule_Provide_LazyMapKey;
Resolution
Rebuild your module using DevApp 26.4.0. There is no workaround — the incompatibility is in generated bytecode and cannot be resolved without a rebuild.
DevApp Hilt Requirement
The DevApp's application module now requires Hilt to compile and run your modules. Add the dependency by making the following changes.
Add the kapt plugin and uncomment the hilt plugin in the project's build.gradle file.
plugins {
...
alias q2libs.plugins.kotlin.kapt apply false
// Uncomment the following line
alias q2libs.plugins.hilt apply false
}
Add the Hilt and Kapt plugin to the devapp's build.gradle file and add Hilt dependencies
plugins {
alias q2libs.plugins.kotlin.kapt
alias q2libs.plugins.hilt
}
dependencies {
implementation q2libs.hilt
kapt q2libs.hilt.compiler
}
Add the HiltAndroidApp annotation to the application class.
package com.q2.devapp
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
class DevAppApplication : CoreApplication()
Q2 SDK Interfaces Changes
RDCImageResult — Structured Error Codes
RDCImageResult.Error now carries an optional errorCode alongside the existing exception:
sealed class RDCImageResult : Parcelable {
data class Error(
val exception: Exception? = null,
val errorCode: String? = null
) : RDCImageResult()
object ErrorCodes {
const val USER_CANCELLED = "USER_CANCELLED"
const val LICENSE_ERROR = "LICENSE_ERROR"
}
}
Both fields are optional — existing code that constructs or pattern-matches on Error requires no
changes. The ErrorCodes object provides well-known constants to check against errorCode without
hardcoding strings.
when (result) {
is RDCImageResult.Error -> when (result.errorCode) {
RDCImageResult.ErrorCodes.USER_CANCELLED -> { /* user backed out */ }
RDCImageResult.ErrorCodes.LICENSE_ERROR -> { /* camera SDK licensing issue */ }
else -> { /* inspect result.exception */ }
}
// ...
}
RDCRequest — Additional Configuration
A new optional additionalConfig parameter has been added to RDCRequest to allow passing
camera-module-specific key-value configuration:
data class RDCRequest(
val first: CheckSide,
val second: CheckSide? = null,
val cameraModuleName: String = "",
val additionalConfig: Map<String, Any> = emptyMap() // NEW — defaults to empty
)
Existing RDCRequest usages are unaffected. Pass entries here when the target camera module
requires additional configuration beyond the standard fields.
SdkUtils — OAuth ID Token Access
SdkUtils now exposes an oAuthUtils property for interacting with OAuth data after authentication.
The new OAuthUtils interface provides access to the ID token issued by the authorization server:
abstract class SdkUtils(...) : Parcelable {
/**
* Provides data and APIs related to OAuth logins. Null if the application
* does not use OAuth. If applicable, value will be available post auth.
*/
abstract val oAuthUtils: OAuthUtils?
}
/**
* Collection of APIs for interacting with OAuth.
*/
interface OAuthUtils {
/** The ID token provided by the authorization server. */
val idToken: String
}
This is null for non-OAuth apps. For OAuth apps, the value is available after authentication completes.
// Example: read the ID token from a module
val idToken = sdkUtils.oAuthUtils?.idToken
MethodModule — OAUTH_AUTHORIZATION_PARAMS Documentation Update
The documentation for the OAUTH_AUTHORIZATION_PARAMS MethodRequest type has been updated to
clarify the expected data format. No code changes — the behavior is unchanged from 26.3.0.
The expected return format from a module implementing this request:
{
"foo": "foo value"
}
See the 26.3.0 release notes for the full
MethodModule / MethodRequest reference.
Version Catalog
AndroidX Libraries
| Library | Version | Implementation |
|---|---|---|
| AndroidX Core KTX | 1.12.0 | implementation(q2libs.androidx.core.ktx) |
| AndroidX AppCompat | 1.6.1 | implementation(q2libs.androidx.appcompat) |
| AndroidX Activity KTX | 1.8.1 | implementation(q2libs.androidx.activity.ktx) |
| AndroidX Legacy Support | 1.0.0 | implementation(q2libs.androidx.legacy.support) |
| AndroidX Constraint Layout | 2.1.4 | implementation(q2libs.androidx.constraintlayout) |
| AndroidX CardView | 1.0.0 | implementation(q2libs.androidx.cardview) |
| AndroidX Local Broadcast Manager | 1.1.0 | implementation(q2libs.androidx.localbroadcastmanager) |
| AndroidX Percent Layout | 1.0.0 | implementation(q2libs.androidx.percentlayout) |
| AndroidX Biometric | 1.1.0 | implementation(q2libs.androidx.biometric) |
| AndroidX RecyclerView | 1.3.2 | implementation(q2libs.androidx.recyclerview) |
| AndroidX WebKit | 1.8.0 | implementation(q2libs.androidx.webkit) |
| AndroidX Media | 1.6.0 | implementation(q2libs.androidx.media) |
| AndroidX Browser | 1.8.0 | implementation(q2libs.androidx.browser) |
| AndroidX Grid Layout | 1.0.0 | implementation(q2libs.androidx.gridlayout) |
| AndroidX Preference | 1.2.1 | implementation(q2libs.androidx.preference) |
| AndroidX Security Crypto | 1.1.0-beta01 | implementation(q2libs.androidx.security.crypto) |
AndroidX Fragment
| Library | Version | Implementation |
|---|---|---|
| AndroidX Fragment | 1.7.0 | implementation(q2libs.androidx.fragment) |
| AndroidX Fragment KTX | 1.7.0 | implementation(q2libs.androidx.fragment.ktx) |
AndroidX Navigation
| Library | Version | Implementation |
|---|---|---|
| AndroidX Navigation Fragment KTX | 2.7.4 | implementation(q2libs.androidx.navigation.fragment.ktx) |
| AndroidX Navigation UI KTX | 2.7.4 | implementation(q2libs.androidx.navigation.ui.ktx) |
| AndroidX Navigation Compose | 2.8.9 | implementation(q2libs.androidx.navigation.compose) |
AndroidX Lifecycle
| Library | Version | Implementation |
|---|---|---|
| AndroidX Lifecycle Runtime KTX | 2.7.0 | implementation(q2libs.androidx.lifecycle.runtime.ktx) |
| AndroidX Lifecycle ViewModel KTX | 2.7.0 | implementation(q2libs.androidx.lifecycle.viewmodel.ktx) |
| AndroidX Lifecycle Process | 2.7.0 | implementation(q2libs.androidx.lifecycle.process) |
| AndroidX Lifecycle Compiler | 2.7.0 | kapt(q2libs.androidx.lifecycle.compiler) |
| AndroidX Lifecycle Extensions | 2.2.0 (Deprecated) | implementation(q2libs.androidx.lifecycle.extensions) |
| AndroidX Lifecycle ViewModel Compose | 2.7.0 | implementation(q2libs.androidx.lifecycle.viewmodel.compose) |
AndroidX Room
| Library | Version | Implementation |
|---|---|---|
| Room Runtime | 2.6.0 | implementation(q2libs.androidx.room.runtime) |
| Room Compiler | 2.6.0 | kapt(q2libs.androidx.room.compiler) |
| Room KTX | 2.6.0 | implementation(q2libs.androidx.room.ktx) |
AndroidX CameraX
| Library | Version | Implementation |
|---|---|---|
| CameraX Camera2 | 1.5.0 | implementation(q2libs.androidx.camera.camera2) |
| CameraX Lifecycle | 1.5.0 | implementation(q2libs.androidx.camera.lifecycle) |
| Camera View | 1.0.0-alpha22 | implementation(q2libs.androidx.camera.view) |
AndroidX Compose
| Library | Version | Implementation |
|---|---|---|
| Compose BOM | 2024.09.02 | implementation(platform(q2libs.androidx.compose.bom)) |
| Compose Foundation | - | implementation(q2libs.androidx.compose.foundation) |
| Compose UI | - | implementation(q2libs.androidx.compose.ui) |
| Compose UI Graphics | - | implementation(q2libs.androix.compose.ui.graphics) |
| Compose UI Tooling | - | implementation(q2libs.androix.compose.ui.tooling) |
| Compose UI Tooling Preview | - | implementation(q2libs.androix.compose.ui.tooling.preview) |
| Compose UI Test Manifest | - | implementation(q2libs.androix.compose.ui.test.manifest) |
| Compose UI Test JUnit4 | - | implementation(q2libs.androix.compose.ui.test.junit4) |
| Compose Runtime LiveData | - | implementation(q2libs.androidx.compose.runtime.livedata) |
| Material3 | - | implementation(q2libs.material3) |
| Material3 Adaptive | - | implementation(q2libs.androidx.compose.material3.adpative) |
| Activity Compose | 1.8.2 | implementation(q2libs.activity.compose) |
Google Libraries
| Library | Version | Implementation |
|---|---|---|
| Material | 1.10.0 | implementation(q2libs.google.material) |
| GSON | 2.10.1 | implementation(q2libs.google.gson) |
| Play Services Vision | 20.1.3 (Deprecated) | implementation(q2libs.google.play.services.vision) |
| ZXing Core | 3.5.1 | implementation(q2libs.google.zxing.core) |
| Age Signals | 0.0.1-beta02 | implementation(q2libs.google.age.signals) |
Firebase
| Library | Version | Implementation |
|---|---|---|
| Firebase Messaging | 23.3.0 | implementation(q2libs.google.firebase.messaging) |
| Firebase Messaging KTX | 23.3.0 | implementation(q2libs.google.firebase.messaging.ktx) |
| Firebase Instance ID | 21.1.0 | implementation(q2libs.google.firebase.iid) |
| Firebase Core | 21.1.1 | implementation(q2libs.google.firebase.core) |
| Firebase Crashlytics Build Tools | 2.9.9 | implementation(q2libs.google.firebase.crashlytics.buildtools) |
Kotlin & Jetbrains
| Library | Version | Implementation |
|---|---|---|
| Kotlinx Coroutines | 1.7.3 | implementation(q2libs.jetbrains.kotlinx.coroutines) |
| Jetbrains Annotations | 20.1.0 | implementation(q2libs.jetbrains.annotations) |
Networking
| Library | Version | Implementation |
|---|---|---|
| Retrofit2 | 2.9.0 | implementation(q2libs.retrofit2.retrofit) |
| Retrofit2 Converter GSON | 2.9.0 | implementation(q2libs.retrofit2.converter.gson) |
| Retrofit2 RxJava Adapter | 2.1.0 | implementation(q2libs.retrofit2.adapter.rxjava) |
| OkHttp3 | 4.10.0 | implementation(q2libs.okhttp3.okhttp) |
| OkHttp3 Logging Interceptor | 4.10.0 | implementation(q2libs.okhttp3.logging.interceptor) |
| RxAndroid | 1.2.0 | implementation(q2libs.reactivex.rxandroid) |
| Volley | 1.2.1 | implementation(q2libs.volley) |
Dependency Injection
| Library | Version | Implementation |
|---|---|---|
| Dagger | 2.57 | implementation(q2libs.dagger) |
| Dagger Compiler | 2.57 | kapt(q2libs.dagger.compiler) |
| Hilt | 2.57 | implementation(q2libs.hilt) |
| Hilt Compiler | 2.57 | kapt(q2libs.hilt.compiler) |
| Hilt Navigation Compose | 1.2.0 | implementation(q2libs.androidx.hilt.navigation.compose) |
| Glassfish Annotation | 10.0-b28 | implementation(q2libs.glassfish.annotation) |
Dependency Injection (Koin)
| Library | Version | Implementation |
|---|---|---|
| Koin Android | 3.4.3 | implementation(q2libs.koin.android) |
| Koin Core | 3.4.3 | implementation(q2libs.koin.core) |
| Koin AndroidX Compose | 3.5.0 | implementation(q2libs.koin.androidx.compose) |
Third-Party Libraries
| Library | Version | Implementation |
|---|---|---|
| EventBus | 3.3.1 | implementation(q2libs.eventbus) |
| EventBus Processor | 3.3.1 | kapt(q2libs.eventbus.processor) |
| Commons IO | 2.6 | implementation(q2libs.commons.io) |
| Picasso | 2.8 | implementation(q2libs.picasso) |
| Coil | 2.7.0 | implementation(q2libs.coil) |
| Timber | 5.0.1 | implementation(q2libs.timber) |
| Apache Commons Imaging | 1.0-alpha2 | implementation(q2libs.apache.commons.imaging) |
Q2 SDK Components
| Library | Version | Implementation |
|---|---|---|
| Q2 SDK Interfaces | 0.3.11 | implementation(q2libs.q2.sdk.interfaces) |
| Q2 UI Components | 0.1.1 | implementation(q2libs.q2.ui.components) |
Plugin Declarations
| Plugin | ID | Implementation |
|---|---|---|
| Android Application | com.android.application | id(q2libs.plugins.android.application) |
| Android Library | com.android.library | id(q2libs.plugins.android.library) |
| Kotlin Android | org.jetbrains.kotlin.android | id(q2libs.plugins.kotlin.android) |
| Kotlin Kapt | org.jetbrains.kotlin.kapt | id(q2libs.plugins.kotlin.kapt) |
| Compose Compiler | org.jetbrains.kotlin.plugin.compose | id(q2libs.plugins.compose.compiler) |
| Hilt | com.google.dagger.hilt.android | id(q2libs.plugins.hilt) |
| Kotlin Parcelize | org.jetbrains.kotlin.plugin.parcelize | id(q2libs.plugins.kotlin.parcelize) |
| Google Services | com.google.gms.google-services | id(q2libs.plugins.google.services) |
| Artifactory | com.jfrog.artifactory | id(q2libs.plugins.artifactory) |
| Kotlin Serialization | org.jetbrains.kotlin.plugin.serialization | id(q2libs.plugins.kotlin.serialization) |
Library Bundles
| Bundle | Libraries | Implementation |
|---|---|---|
| Dagger | dagger, glassfish-annotation | implementation(q2libs.bundles.dagger) |
| Retrofit2 | retrofit2-retrofit, retrofit2-converter-gson | implementation(q2libs.bundles.retrofit2) |
| Koin | koin-android, koin-core, koin-androidx-compose | implementation(q2libs.bundles.koin) |