Skip to main content

Android DevApp v26.4.0

Compatibility

NameVersionImplementation
Compile SDK36compileSdk = q2libs.versions.compileSdk.get()
Target SDK36targetSdk = q2libs.versions.targetSdk.get()
Min SDK29minSdk = q2libs.versions.minSdk.get()
Android Gradle Plugin8.13.0id(q2libs.plugins.android.application)
Kotlin Gradle Plugin2.0.20id(q2libs.plugins.kotlin.android)
Google Services Plugin4.3.15id(q2libs.plugins.google.services)
Kotlin Serialization1.9.0id(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

Library26.3.0 Version26.4.0 VersionImpact
Q2 SDK Interfaces0.3.80.3.11Updated — See SDK interfaces section
Hilt / Dagger2.522.57Breaking — 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:

  • RDCRequest has a new optional additionalConfig parameter (defaults to emptyMap()).
  • RDCImageResult.Error has a new optional errorCode parameter (defaults to null). A companion ErrorCodes object provides standard error code constants.
  • SdkUtils exposes a new oAuthUtils: OAuthUtils? property for accessing OAuth token data post-authentication.

Hilt Upgrade (2.52 → 2.57)

Module rebuild required

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.

build.gradle
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

devapp/build.gradle
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.

DevAppApplication.kt
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

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.8.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 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.0kapt(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.6.0implementation(q2libs.androidx.room.runtime)
Room Compiler2.6.0kapt(q2libs.androidx.room.compiler)
Room KTX2.6.0implementation(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.0.0-alpha22implementation(q2libs.androidx.camera.view)

AndroidX Compose

LibraryVersionImplementation
Compose BOM2024.09.02implementation(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 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.1-beta02implementation(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)
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.57implementation(q2libs.dagger)
Dagger Compiler2.57kapt(q2libs.dagger.compiler)
Hilt2.57implementation(q2libs.hilt)
Hilt Compiler2.57kapt(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.1kapt(q2libs.eventbus.processor)
Commons IO2.6implementation(q2libs.commons.io)
Picasso2.8implementation(q2libs.picasso)
Coil2.7.0implementation(q2libs.coil)
Timber5.0.1implementation(q2libs.timber)
Apache Commons Imaging1.0-alpha2implementation(q2libs.apache.commons.imaging)

Q2 SDK Components

LibraryVersionImplementation
Q2 SDK Interfaces0.3.11implementation(q2libs.q2.sdk.interfaces)
Q2 UI Components0.1.1implementation(q2libs.q2.ui.components)

Plugin Declarations

PluginIDImplementation
Android Applicationcom.android.applicationid(q2libs.plugins.android.application)
Android Librarycom.android.libraryid(q2libs.plugins.android.library)
Kotlin Androidorg.jetbrains.kotlin.androidid(q2libs.plugins.kotlin.android)
Kotlin Kaptorg.jetbrains.kotlin.kaptid(q2libs.plugins.kotlin.kapt)
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)

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)