Skip to content

Re Org android sdk 🧱 #180

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 22 commits into from
Jun 18, 2025
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
2 changes: 1 addition & 1 deletion .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
- name: Install Dependencies
run: flutter pub get && cd sample && flutter pub get && cd ..
- name: Lint Flutter
run: flutter analyze
run: dart format . --set-exit-if-changed && flutter analyze
Android:
runs-on: ubuntu-latest
timeout-minutes: 10
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,15 @@ import android.app.Activity
import android.content.Context
import com.smileidentity.SmileID
import com.smileidentity.SmileIDOptIn
import com.smileidentity.flutter.enhanced.SmileIDSmartSelfieAuthenticationEnhanced
import com.smileidentity.flutter.enhanced.SmileIDSmartSelfieEnrollmentEnhanced
import com.smileidentity.flutter.products.biometric.SmileIDBiometricKYC
import com.smileidentity.flutter.products.capture.SmileIDDocumentCaptureView
import com.smileidentity.flutter.products.capture.SmileIDSmartSelfieCaptureView
import com.smileidentity.flutter.products.document.SmileIDDocumentVerification
import com.smileidentity.flutter.products.enhanceddocv.SmileIDEnhancedDocumentVerification
import com.smileidentity.flutter.products.enhancedselfie.SmileIDSmartSelfieAuthenticationEnhanced
import com.smileidentity.flutter.products.enhancedselfie.SmileIDSmartSelfieEnrollmentEnhanced
import com.smileidentity.flutter.products.selfie.SmileIDSmartSelfieAuthentication
import com.smileidentity.flutter.products.selfie.SmileIDSmartSelfieEnrollment
import com.smileidentity.metadata.models.WrapperSdkName
import com.smileidentity.networking.asFormDataPart
import com.smileidentity.networking.pollBiometricKycJobStatus
Expand Down Expand Up @@ -53,59 +60,63 @@ class SmileIDPlugin :
SmileIDApi,
ActivityAware {
private var activity: Activity? = null
private lateinit var appContext: Context
private lateinit var context: Context
private val scope: CoroutineScope = CoroutineScope(Dispatchers.IO)

override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
SmileIDApi.setUp(flutterPluginBinding.binaryMessenger, this)
appContext = flutterPluginBinding.applicationContext
context = flutterPluginBinding.applicationContext

// Set wrapper info for Flutter SDK
SmileID.setWrapperInfo(WrapperSdkName.Flutter, "11.0.1")

flutterPluginBinding.platformViewRegistry.registerViewFactory(
SmileIDDocumentVerification.VIEW_TYPE_ID,
SmileIDDocumentVerification.Factory(flutterPluginBinding.binaryMessenger),
SmileIDBiometricKYC.VIEW_TYPE_ID,
SmileIDBiometricKYC.createFactory(flutterPluginBinding.binaryMessenger),
)

flutterPluginBinding.platformViewRegistry.registerViewFactory(
SmileIDSmartSelfieEnrollment.VIEW_TYPE_ID,
SmileIDSmartSelfieEnrollment.Factory(flutterPluginBinding.binaryMessenger),
SmileIDDocumentVerification.VIEW_TYPE_ID,
SmileIDDocumentVerification.createFactory(flutterPluginBinding.binaryMessenger),
)

flutterPluginBinding.platformViewRegistry.registerViewFactory(
SmileIDSmartSelfieAuthentication.VIEW_TYPE_ID,
SmileIDSmartSelfieAuthentication.Factory(flutterPluginBinding.binaryMessenger),
SmileIDEnhancedDocumentVerification.VIEW_TYPE_ID,
SmileIDEnhancedDocumentVerification.createFactory(flutterPluginBinding.binaryMessenger),
)

flutterPluginBinding.platformViewRegistry.registerViewFactory(
SmileIDSmartSelfieEnrollmentEnhanced.VIEW_TYPE_ID,
SmileIDSmartSelfieEnrollmentEnhanced.Factory(flutterPluginBinding.binaryMessenger),
SmileIDSmartSelfieEnrollment.VIEW_TYPE_ID,
SmileIDSmartSelfieEnrollment.createFactory(flutterPluginBinding.binaryMessenger),
)

flutterPluginBinding.platformViewRegistry.registerViewFactory(
SmileIDSmartSelfieAuthenticationEnhanced.VIEW_TYPE_ID,
SmileIDSmartSelfieAuthenticationEnhanced.Factory(flutterPluginBinding.binaryMessenger),
SmileIDSmartSelfieAuthentication.VIEW_TYPE_ID,
SmileIDSmartSelfieAuthentication.createFactory(flutterPluginBinding.binaryMessenger),
)

flutterPluginBinding.platformViewRegistry.registerViewFactory(
SmileIDBiometricKYC.VIEW_TYPE_ID,
SmileIDBiometricKYC.Factory(flutterPluginBinding.binaryMessenger),
SmileIDSmartSelfieEnrollmentEnhanced.VIEW_TYPE_ID,
SmileIDSmartSelfieEnrollmentEnhanced.createFactory(
flutterPluginBinding.binaryMessenger,
),
)

flutterPluginBinding.platformViewRegistry.registerViewFactory(
SmileIDEnhancedDocumentVerification.VIEW_TYPE_ID,
SmileIDEnhancedDocumentVerification.Factory(flutterPluginBinding.binaryMessenger),
SmileIDSmartSelfieAuthenticationEnhanced.VIEW_TYPE_ID,
SmileIDSmartSelfieAuthenticationEnhanced.createFactory(
flutterPluginBinding.binaryMessenger,
),
)

flutterPluginBinding.platformViewRegistry.registerViewFactory(
SmileIDSmartSelfieCaptureView.VIEW_TYPE_ID,
SmileIDSmartSelfieCaptureView.Factory(flutterPluginBinding.binaryMessenger),
SmileIDSmartSelfieCaptureView.createFactory(flutterPluginBinding.binaryMessenger),
)

flutterPluginBinding.platformViewRegistry.registerViewFactory(
SmileIDDocumentCaptureView.VIEW_TYPE_ID,
SmileIDDocumentCaptureView.Factory(flutterPluginBinding.binaryMessenger),
SmileIDDocumentCaptureView.createFactory(flutterPluginBinding.binaryMessenger),
)
}

Expand All @@ -120,7 +131,7 @@ class SmileIDPlugin :
enableCrashReporting: Boolean,
) {
SmileID.initialize(
context = appContext,
context = context,
apiKey = apiKey,
config = config.toRequest(),
useSandbox = useSandbox,
Expand All @@ -134,7 +145,7 @@ class SmileIDPlugin :
enableCrashReporting: Boolean,
) {
SmileID.initialize(
context = appContext,
context = context,
config = config.toRequest(),
useSandbox = useSandbox,
enableCrashReporting = false,
Expand All @@ -143,7 +154,7 @@ class SmileIDPlugin :

override fun initialize(useSandbox: Boolean) {
SmileID.initialize(
context = appContext,
context = context,
useSandbox = useSandbox,
)
}
Expand Down Expand Up @@ -247,7 +258,7 @@ class SmileIDPlugin :
),
livenessImages =
livenessImages.map {
File(selfieImage).asFormDataPart(
File(it).asFormDataPart(
partName = "liveness_images",
mediaType = "image/jpeg",
)
Expand Down Expand Up @@ -284,7 +295,7 @@ class SmileIDPlugin :
),
livenessImages =
livenessImages.map {
File(selfieImage).asFormDataPart(
File(it).asFormDataPart(
partName = "liveness_images",
mediaType = "image/jpeg",
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.smileidentity.flutter
package com.smileidentity.flutter.products.biometric

import android.content.Context
import androidx.compose.runtime.Composable
Expand All @@ -7,15 +7,15 @@ import com.smileidentity.compose.BiometricKYC
import com.smileidentity.flutter.results.SmartSelfieCaptureResult
import com.smileidentity.flutter.utils.SelfieCaptureResultAdapter
import com.smileidentity.flutter.utils.getCurrentIsoTimestamp
import com.smileidentity.flutter.views.SmileComposablePlatformView
import com.smileidentity.flutter.views.SmileIDViewFactory
import com.smileidentity.models.ConsentInformation
import com.smileidentity.models.ConsentedInformation
import com.smileidentity.models.IdInfo
import com.smileidentity.results.SmileIDResult
import com.smileidentity.util.randomJobId
import com.smileidentity.util.randomUserId
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.StandardMessageCodec
import io.flutter.plugin.platform.PlatformView
import io.flutter.plugin.platform.PlatformViewFactory
import kotlinx.collections.immutable.toImmutableMap

Expand All @@ -27,6 +27,16 @@ internal class SmileIDBiometricKYC private constructor(
) : SmileComposablePlatformView(context, VIEW_TYPE_ID, viewId, messenger, args) {
companion object {
const val VIEW_TYPE_ID = "SmileIDBiometricKYC"

fun createFactory(messenger: BinaryMessenger): PlatformViewFactory =
SmileIDViewFactory(messenger = messenger) { context, args, messenger, viewId ->
SmileIDBiometricKYC(
context = context,
viewId = viewId,
messenger = messenger,
args = args,
)
}
}

@Composable
Expand Down Expand Up @@ -95,17 +105,4 @@ internal class SmileIDBiometricKYC private constructor(
}
}
}

class Factory(private val messenger: BinaryMessenger) :
PlatformViewFactory(StandardMessageCodec.INSTANCE) {
override fun create(context: Context, viewId: Int, args: Any?): PlatformView {
@Suppress("UNCHECKED_CAST")
return SmileIDBiometricKYC(
context,
viewId,
messenger,
args as Map<String, Any?>,
)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.smileidentity.flutter
package com.smileidentity.flutter.products.capture

import android.content.Context
import androidx.compose.foundation.layout.fillMaxSize
Expand All @@ -15,11 +15,11 @@ import com.smileidentity.compose.theme.colorScheme
import com.smileidentity.compose.theme.typography
import com.smileidentity.flutter.results.DocumentCaptureResult
import com.smileidentity.flutter.utils.DocumentCaptureResultAdapter
import com.smileidentity.flutter.views.SmileComposablePlatformView
import com.smileidentity.flutter.views.SmileIDViewFactory
import com.smileidentity.metadata.LocalMetadataProvider
import com.smileidentity.util.randomJobId
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.StandardMessageCodec
import io.flutter.plugin.platform.PlatformView
import io.flutter.plugin.platform.PlatformViewFactory
import java.io.File

Expand All @@ -31,6 +31,16 @@ internal class SmileIDDocumentCaptureView private constructor(
) : SmileComposablePlatformView(context, VIEW_TYPE_ID, viewId, messenger, args) {
companion object {
const val VIEW_TYPE_ID = "SmileIDDocumentCaptureView"

fun createFactory(messenger: BinaryMessenger): PlatformViewFactory =
SmileIDViewFactory(messenger = messenger) { context, args, messenger, viewId ->
SmileIDDocumentCaptureView(
context = context,
viewId = viewId,
messenger = messenger,
args = args,
)
}
}

@Composable
Expand Down Expand Up @@ -140,17 +150,4 @@ internal class SmileIDDocumentCaptureView private constructor(
onSuccessJson(it)
}
}

class Factory(private val messenger: BinaryMessenger) :
PlatformViewFactory(StandardMessageCodec.INSTANCE) {
override fun create(context: Context, viewId: Int, args: Any?): PlatformView {
@Suppress("UNCHECKED_CAST")
return SmileIDDocumentCaptureView(
context,
viewId,
messenger,
args as Map<String, Any?>,
)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.smileidentity.flutter
package com.smileidentity.flutter.products.capture

import android.content.Context
import android.graphics.BitmapFactory
Expand Down Expand Up @@ -32,15 +32,15 @@ import com.smileidentity.compose.selfie.SelfieCaptureScreen
import com.smileidentity.compose.selfie.SmartSelfieInstructionsScreen
import com.smileidentity.compose.theme.colorScheme
import com.smileidentity.compose.theme.typography
import com.smileidentity.flutter.views.SmileIDViewFactory
import com.smileidentity.flutter.views.SmileSelfieComposablePlatformView
import com.smileidentity.metadata.LocalMetadataProvider
import com.smileidentity.util.randomJobId
import com.smileidentity.util.randomUserId
import com.smileidentity.viewmodel.SelfieUiState
import com.smileidentity.viewmodel.SelfieViewModel
import com.smileidentity.viewmodel.viewModelFactory
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.StandardMessageCodec
import io.flutter.plugin.platform.PlatformView
import io.flutter.plugin.platform.PlatformViewFactory

internal class SmileIDSmartSelfieCaptureView private constructor(
Expand All @@ -51,6 +51,16 @@ internal class SmileIDSmartSelfieCaptureView private constructor(
) : SmileSelfieComposablePlatformView(context, VIEW_TYPE_ID, viewId, messenger, args) {
companion object {
const val VIEW_TYPE_ID = "SmileIDSmartSelfieCaptureView"

fun createFactory(messenger: BinaryMessenger): PlatformViewFactory =
SmileIDViewFactory(messenger = messenger) { context, args, messenger, viewId ->
SmileIDSmartSelfieCaptureView(
context = context,
viewId = viewId,
messenger = messenger,
args = args,
)
}
}

@OptIn(SmileIDOptIn::class)
Expand Down Expand Up @@ -102,13 +112,15 @@ internal class SmileIDSmartSelfieCaptureView private constructor(
) {
acknowledgedInstructions = true
}

uiState.processingState != null -> HandleProcessingState(viewModel)
uiState.selfieToConfirm != null ->
HandleSelfieConfirmation(
showConfirmationDialog,
uiState,
viewModel,
)

else -> RenderSelfieCaptureScreen(
userId,
jobId,
Expand Down Expand Up @@ -184,17 +196,4 @@ internal class SmileIDSmartSelfieCaptureView private constructor(
private fun HandleProcessingState(viewModel: SelfieViewModel) {
viewModel.onFinished { res -> handleResult(res) }
}

class Factory(private val messenger: BinaryMessenger) :
PlatformViewFactory(StandardMessageCodec.INSTANCE) {
override fun create(context: Context, viewId: Int, args: Any?): PlatformView {
@Suppress("UNCHECKED_CAST")
return SmileIDSmartSelfieCaptureView(
context,
viewId,
messenger,
args as Map<String, Any?>,
)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package com.smileidentity.flutter
package com.smileidentity.flutter.products.document

import android.content.Context
import androidx.compose.runtime.Composable
import com.smileidentity.SmileID
import com.smileidentity.compose.DocumentVerification
import com.smileidentity.flutter.results.DocumentCaptureResult
import com.smileidentity.flutter.utils.DocumentCaptureResultAdapter
import com.smileidentity.flutter.views.SmileComposablePlatformView
import com.smileidentity.flutter.views.SmileIDViewFactory
import com.smileidentity.results.SmileIDResult
import com.smileidentity.util.randomJobId
import com.smileidentity.util.randomUserId
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.StandardMessageCodec
import io.flutter.plugin.platform.PlatformView
import io.flutter.plugin.platform.PlatformViewFactory
import java.io.File
import kotlinx.collections.immutable.toImmutableMap
Expand All @@ -24,6 +24,16 @@ internal class SmileIDDocumentVerification private constructor(
) : SmileComposablePlatformView(context, VIEW_TYPE_ID, viewId, messenger, args) {
companion object {
const val VIEW_TYPE_ID = "SmileIDDocumentVerification"

fun createFactory(messenger: BinaryMessenger): PlatformViewFactory =
SmileIDViewFactory(messenger = messenger) { context, args, messenger, viewId ->
SmileIDDocumentVerification(
context = context,
viewId = viewId,
messenger = messenger,
args = args,
)
}
}

@Composable
Expand Down Expand Up @@ -80,17 +90,4 @@ internal class SmileIDDocumentVerification private constructor(
}
}
}

class Factory(private val messenger: BinaryMessenger) :
PlatformViewFactory(StandardMessageCodec.INSTANCE) {
override fun create(context: Context, viewId: Int, args: Any?): PlatformView {
@Suppress("UNCHECKED_CAST")
return SmileIDDocumentVerification(
context,
viewId,
messenger,
args as Map<String, Any?>,
)
}
}
}
Loading