Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
# Release Notes

## Unreleased
## 11.1.0 - August 5, 2025

### Changed

* Removed `AntiFraud` response in `JobStatus` calls
* Updated the `targetSdk` to 36 and updated the AGP version
* Replaced `enableAutoCapture` with the `AutoCapture` enum to give partners more control over document capture behavior
* Added `autoCaptureTimeout` to allow partners to configure the auto-capture timeout duration
* Upgraded Smile ID Android and iOS SDKs to version **v11.1.0**
* Bumped `compileSdkVersion` to 36 and resolved related build issues

### Changed

* Removed default `ConsentInformation` values, as the new SDK now supports null for this field

## 11.0.3 - July 11, 2025

Expand Down
2 changes: 1 addition & 1 deletion android/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ SmileId_minSdkVersion=21
SmileId_targetSdkVersion=36
SmileId_compileSdkVersion=36
SmileId_ndkversion=21.4.7075529
SmileId_androidVersion=11.0.5
SmileId_androidVersion=11.1.0
SmileId_kotlinCompilerExtensionVersion=1.5.11
15 changes: 15 additions & 0 deletions android/src/main/java/com/smileidentity/react/Mapper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.smileidentity.react
import androidx.compose.animation.core.rememberTransition
import com.facebook.react.bridge.ReadableMap
import com.smileidentity.models.AuthenticationRequest
import com.smileidentity.models.AutoCapture
import com.smileidentity.models.Config
import com.smileidentity.models.ConsentInformation
import com.smileidentity.models.ConsentedInformation
Expand Down Expand Up @@ -233,3 +234,17 @@ fun ReadableMap.toProductsConfigRequest(): ProductsConfigRequest {
}
)
}

fun String.toAutoCapture() : AutoCapture {
return when (this) {
"AutoCapture" -> AutoCapture.AutoCapture
"AutoCaptureOnly" -> AutoCapture.AutoCaptureOnly
"ManualCaptureOnly" -> AutoCapture.ManualCaptureOnly
else -> {
throw IllegalArgumentException(
"Invalid autoCapture value: $this. " +
"Expected 'AutoCapture', 'AutoCaptureOnly', or 'ManualCaptureOnly'."
)
}
}
}
Comment on lines +238 to +250
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: The function should handle null input gracefully since it's called with nullable strings. Consider returning a default value or making the parameter nullable to prevent runtime crashes. [possible issue, importance: 7]

Suggested change
fun String.toAutoCapture() : AutoCapture {
return when (this) {
"AutoCapture" -> AutoCapture.AutoCapture
"AutoCaptureOnly" -> AutoCapture.AutoCaptureOnly
"ManualCaptureOnly" -> AutoCapture.ManualCaptureOnly
else -> {
throw IllegalArgumentException(
"Invalid autoCapture value: $this. " +
"Expected 'AutoCapture', 'AutoCaptureOnly', or 'ManualCaptureOnly'."
)
}
}
}
fun String?.toAutoCapture() : AutoCapture {
return when (this) {
"AutoCapture" -> AutoCapture.AutoCapture
"AutoCaptureOnly" -> AutoCapture.AutoCaptureOnly
"ManualCaptureOnly" -> AutoCapture.ManualCaptureOnly
null -> AutoCapture.AutoCapture
else -> {
throw IllegalArgumentException(
"Invalid autoCapture value: $this. " +
"Expected 'AutoCapture', 'AutoCaptureOnly', or 'ManualCaptureOnly'."
)
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class SmileIdModule internal constructor(
try {
// Set wrapper info for React Native SDK
try {
val version = com.smileidentity.react.BuildConfig.SMILE_ID_VERSION
val version = BuildConfig.SMILE_ID_VERSION
SmileID.setWrapperInfo(WrapperSdkName.ReactNative, version)
} catch (e: Exception) {
// Fallback to default version if BuildConfig is not available
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,6 @@ class SmileIDBiometricKYCViewManager(
?: return view.emitFailure(IllegalArgumentException("idInfo is required to run Biometric KYC"))
val idInfo = idInfoMap.toIdInfo()
view.consentInformation = it.getMapOrDefault("consentInformation")?.toConsentInfo()
?: ConsentInformation(
consented = ConsentedInformation(
consentGrantedDate = getCurrentIsoTimestamp(),
personalDetails = false,
contactInformation = false,
documentInformation = false
),
)
view.extraPartnerParams = it.getImmutableMapOrDefault("extraPartnerParams")
view.userId = it.getStringOrDefault("userId")
view.jobId = it.getStringOrDefault("jobId")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ import com.facebook.react.bridge.ReadableMap
import com.facebook.react.module.annotations.ReactModule
import com.facebook.react.uimanager.SimpleViewManager
import com.facebook.react.uimanager.ThemedReactContext
import com.smileidentity.react.toAutoCapture
import com.smileidentity.react.utils.getBoolOrDefault
import com.smileidentity.react.utils.getIntOrDefault
import com.smileidentity.react.utils.getStringOrDefault
import com.smileidentity.react.views.SmileIDDocumentCaptureView
import com.smileidentity.react.views.SmileIDDocumentVerificationView
Expand All @@ -31,6 +33,8 @@ class SmileIDDocumentCaptureViewManager(
view.showConfirmation = it.getBoolOrDefault("showConfirmation", true)
view.allowGalleryUpload = it.getBoolOrDefault("allowGalleryUpload", false)
view.front = it.getBoolOrDefault("isDocumentFrontSide", true)
view.autoCaptureTimeout = it.getIntOrDefault("autoCaptureTimeout", null)
view.autoCapture = it.getStringOrDefault("autoCapture", null)?.toAutoCapture()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@ import com.facebook.react.bridge.ReadableMap
import com.facebook.react.module.annotations.ReactModule
import com.facebook.react.uimanager.SimpleViewManager
import com.facebook.react.uimanager.ThemedReactContext
import com.smileidentity.react.toAutoCapture
import com.smileidentity.react.utils.getBoolOrDefault
import com.smileidentity.react.utils.getFloatOrDefault
import com.smileidentity.react.utils.getImmutableMapOrDefault
import com.smileidentity.react.utils.getIntOrDefault
import com.smileidentity.react.utils.getStringOrDefault
import com.smileidentity.react.views.SmileIDDocumentVerificationView
import com.smileidentity.react.views.SmileIDEnhancedDocumentVerificationView
Expand All @@ -31,7 +33,8 @@ class SmileIDDocumentVerificationViewManager(
view.userId = it.getStringOrDefault("userId")
view.jobId = it.getStringOrDefault("jobId")
view.countryCode = countryCode
view.enableAutoCapture = it.getBoolOrDefault("enableAutoCapture", true)
view.autoCaptureTimeout = it.getIntOrDefault("autoCaptureTimeout", null)
view.autoCapture = it.getStringOrDefault("autoCapture", null)?.toAutoCapture()
view.allowAgentMode = it.getBoolOrDefault("allowAgentMode", false)
view.showAttribution = it.getBoolOrDefault("showAttribution", true)
view.captureBothSides = it.getBoolOrDefault("captureBothSides", false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,14 @@ import com.facebook.react.uimanager.SimpleViewManager
import com.facebook.react.uimanager.ThemedReactContext
import com.smileidentity.models.ConsentInformation
import com.smileidentity.models.ConsentedInformation
import com.smileidentity.react.toAutoCapture
import com.smileidentity.react.toConsentInfo
import com.smileidentity.react.toIdInfo
import com.smileidentity.react.utils.getBoolOrDefault
import com.smileidentity.react.utils.getCurrentIsoTimestamp
import com.smileidentity.react.utils.getFloatOrDefault
import com.smileidentity.react.utils.getImmutableMapOrDefault
import com.smileidentity.react.utils.getIntOrDefault
import com.smileidentity.react.utils.getMapOrDefault
import com.smileidentity.react.utils.getStringOrDefault
import com.smileidentity.react.views.SmileIDEnhancedDocumentVerificationView
Expand All @@ -37,19 +39,12 @@ class SmileIDEnhancedDocumentVerificationViewManager(
IllegalArgumentException("countryCode is required to run Enhanced Document Verification")
)
view.consentInformation = it.getMapOrDefault("consentInformation")?.toConsentInfo()
?: ConsentInformation(
consented = ConsentedInformation(
consentGrantedDate = getCurrentIsoTimestamp(),
personalDetails = false,
contactInformation = false,
documentInformation = false
),
)
view.extraPartnerParams = it.getImmutableMapOrDefault("extraPartnerParams")
view.userId = it.getStringOrDefault("userId")
view.jobId = it.getStringOrDefault("jobId")
view.countryCode = countryCode
view.enableAutoCapture = it.getBoolOrDefault("enableAutoCapture", true)
view.autoCaptureTimeout = it.getIntOrDefault("autoCaptureTimeout", null)
view.autoCapture = it.getStringOrDefault("autoCapture", null)?.toAutoCapture()
view.allowAgentMode = it.getBoolOrDefault("allowAgentMode", false)
view.showAttribution = it.getBoolOrDefault("showAttribution", true)
view.captureBothSides = it.getBoolOrDefault("captureBothSides", false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,6 @@ class SmileIDBiometricKYCView(context: ReactApplicationContext) : SmileIDView(co
emitFailure(IllegalArgumentException("idInfo is required for BiometricKYC"))
return
}
consentInformation ?: run {
emitFailure(IllegalArgumentException("consentInformation is required for BiometricKYC"))
return
}
composeView.apply {
val customViewModelStoreOwner = CustomViewModelStoreOwner()
setContent {
Expand All @@ -41,7 +37,7 @@ class SmileIDBiometricKYCView(context: ReactApplicationContext) : SmileIDView(co
showAttribution = showAttribution,
showInstructions = showInstructions,
extraPartnerParams = extraPartnerParams,
consentInformation = consentInformation!!,
consentInformation = consentInformation,
useStrictMode = useStrictMode ?: false,
) { res ->
when (res) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,24 @@ import com.smileidentity.compose.document.DocumentCaptureSide
import com.smileidentity.compose.theme.colorScheme
import com.smileidentity.compose.theme.typography
import com.smileidentity.metadata.LocalMetadataProvider
import com.smileidentity.models.AutoCapture
import com.smileidentity.react.results.DocumentCaptureResult
import com.smileidentity.react.utils.DocumentCaptureResultAdapter
import com.smileidentity.util.randomJobId
import timber.log.Timber
import java.io.File
import kotlin.time.Duration.Companion.seconds

class SmileIDDocumentCaptureView(context: ReactApplicationContext) : SmileIDView(context) {
var showConfirmation: Boolean = true
var front: Boolean = true
var allowGalleryUpload: Boolean = false
var idAspectRatio: Float? = null

var autoCaptureTimeout: Int? = null

var autoCapture: AutoCapture? = null

override fun renderContent() {
composeView.apply {
val customViewModelStoreOwner = CustomViewModelStoreOwner()
Expand Down Expand Up @@ -71,6 +77,8 @@ class SmileIDDocumentCaptureView(context: ReactApplicationContext) : SmileIDView
showAttribution = showAttribution,
allowGallerySelection = allowGalleryUpload,
showConfirmation = showConfirmation,
autoCaptureTimeout = autoCaptureTimeout?.seconds ?: 10.seconds,
autoCapture = autoCapture ?: AutoCapture.AutoCapture,
Comment on lines +80 to +81
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: The timeout conversion could fail if autoCaptureTimeout contains an invalid value. Add validation to ensure the timeout is within reasonable bounds before conversion. [general, importance: 6]

Suggested change
autoCaptureTimeout = autoCaptureTimeout?.seconds ?: 10.seconds,
autoCapture = autoCapture ?: AutoCapture.AutoCapture,
autoCaptureTimeout = autoCaptureTimeout?.let {
if (it > 0) it.seconds else 10.seconds
} ?: 10.seconds,
autoCapture = autoCapture ?: AutoCapture.AutoCapture,

showSkipButton = false,
instructionsHeroImage = hero,
instructionsTitleText = stringResource(instructionTitle),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,20 @@ import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
import com.facebook.react.bridge.ReactApplicationContext
import com.smileidentity.SmileID
import com.smileidentity.compose.DocumentVerification
import com.smileidentity.models.AutoCapture
import com.smileidentity.react.results.DocumentCaptureResult
import com.smileidentity.react.utils.DocumentCaptureResultAdapter
import com.smileidentity.results.SmileIDResult
import com.smileidentity.util.randomJobId
import com.smileidentity.util.randomUserId
import java.io.File
import kotlin.time.Duration.Companion.seconds

class SmileIDDocumentVerificationView(context: ReactApplicationContext) : SmileIDView(context) {
var countryCode: String? = null
var enableAutoCapture: Boolean = true

var autoCaptureTimeout: Int? = null
var autoCapture: AutoCapture? = null
var allowGalleryUpload: Boolean = false
var captureBothSides: Boolean = true
var bypassSelfieCaptureWithFilePath: String? = null
Expand All @@ -40,7 +44,8 @@ class SmileIDDocumentVerificationView(context: ReactApplicationContext) : SmileI
userId = userId ?: rememberSaveable { randomUserId() },
jobId = jobId ?: rememberSaveable { randomJobId() },
countryCode = countryCode!!,
enableAutoCapture = enableAutoCapture ?: true,
autoCaptureTimeout = autoCaptureTimeout?.seconds ?: 10.seconds,
autoCapture = autoCapture ?: AutoCapture.AutoCapture,
documentType = documentType,
idAspectRatio = idAspectRatio,
showAttribution = showAttribution,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,22 @@ import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
import com.facebook.react.bridge.ReactApplicationContext
import com.smileidentity.SmileID
import com.smileidentity.compose.EnhancedDocumentVerificationScreen
import com.smileidentity.models.AutoCapture
import com.smileidentity.models.ConsentInformation
import com.smileidentity.react.results.DocumentCaptureResult
import com.smileidentity.react.utils.DocumentCaptureResultAdapter
import com.smileidentity.results.SmileIDResult
import com.smileidentity.util.randomJobId
import com.smileidentity.util.randomUserId
import kotlin.time.Duration.Companion.seconds

class SmileIDEnhancedDocumentVerificationView(context: ReactApplicationContext) :
SmileIDView(context) {
var countryCode: String? = null
var enableAutoCapture: Boolean = true

var autoCaptureTimeout: Int? = null

var autoCapture: AutoCapture? = null
var allowGalleryUpload: Boolean = false
var captureBothSides: Boolean = true
var documentType: String? = null
Expand All @@ -29,12 +34,6 @@ class SmileIDEnhancedDocumentVerificationView(context: ReactApplicationContext)
emitFailure(IllegalArgumentException("countryCode is required for DocumentVerification"))
return
}

consentInformation ?: run {
emitFailure(IllegalArgumentException("consentInformation is required for DocumentVerification"))
return
}

composeView.apply {
val customViewModelStoreOwner = CustomViewModelStoreOwner()
setContent {
Expand All @@ -43,7 +42,8 @@ class SmileIDEnhancedDocumentVerificationView(context: ReactApplicationContext)
userId = userId ?: rememberSaveable { randomUserId() },
jobId = jobId ?: rememberSaveable { randomJobId() },
countryCode = countryCode!!,
enableAutoCapture = enableAutoCapture ?: true,
autoCaptureTimeout = autoCaptureTimeout?.seconds ?: 10.seconds,
autoCapture = autoCapture ?: AutoCapture.AutoCapture,
documentType = documentType,
idAspectRatio = idAspectRatio,
showAttribution = showAttribution,
Expand All @@ -53,7 +53,7 @@ class SmileIDEnhancedDocumentVerificationView(context: ReactApplicationContext)
allowGalleryUpload = allowGalleryUpload,
captureBothSides = captureBothSides,
extraPartnerParams = extraPartnerParams,
consentInformation = consentInformation!!,
consentInformation = consentInformation,
useStrictMode = useStrictMode ?: false,
) { res ->
when (res) {
Expand Down
4 changes: 2 additions & 2 deletions example/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ buildscript {
ext {
buildToolsVersion = "34.0.0"
minSdkVersion = 23
compileSdkVersion = 35
targetSdkVersion = 35
compileSdkVersion = 36
targetSdkVersion = 36
ndkVersion = "27.0.12077973"
kotlinVersion = "1.9.24"
kotlinCompilerExtensionVersion = "1.5.14"
Expand Down
Loading