@certiface/sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +966 -0
  3. package/RnSdk.podspec +27 -0
  4. package/android/build.gradle +86 -0
  5. package/android/gradle.properties +6 -0
  6. package/android/src/main/AndroidManifest.xml +2 -0
  7. package/android/src/main/java/br/com/oititec/rn/sdk/RnSdkModule.kt +128 -0
  8. package/android/src/main/java/br/com/oititec/rn/sdk/RnSdkPackage.kt +33 -0
  9. package/android/src/main/java/br/com/oititec/rn/sdk/executor/LivenessExevutor.kt +66 -0
  10. package/android/src/main/java/br/com/oititec/rn/sdk/factories/FacetecThemeFactory.kt +233 -0
  11. package/android/src/main/java/br/com/oititec/rn/sdk/factories/IProovThemeFactory.kt +176 -0
  12. package/android/src/main/java/br/com/oititec/rn/sdk/managers/AssetManager.kt +152 -0
  13. package/android/src/main/java/br/com/oititec/rn/sdk/model/Featues.kt +6 -0
  14. package/android/src/main/java/br/com/oititec/rn/sdk/processors/AssetProcessor.kt +179 -0
  15. package/android/src/main/java/br/com/oititec/rn/sdk/strategy/FacetecStrategy.kt +25 -0
  16. package/android/src/main/java/br/com/oititec/rn/sdk/strategy/IProovStrategy.kt +25 -0
  17. package/android/src/main/java/br/com/oititec/rn/sdk/strategy/LivenessProviderStrategy.kt +16 -0
  18. package/android/src/main/java/br/com/oititec/rn/sdk/theme/FacetecFonts.kt +85 -0
  19. package/android/src/main/java/br/com/oititec/rn/sdk/theme/IProovFonts.kt +52 -0
  20. package/android/src/main/java/br/com/oititec/rn/sdk/utils/AssetProcessor.kt +181 -0
  21. package/android/src/main/res/drawable/backhand_left.xml +20 -0
  22. package/android/src/main/res/drawable/backhand_right.xml +20 -0
  23. package/android/src/main/res/drawable/camera_icon.xml +14 -0
  24. package/android/src/main/res/drawable/close_icon.xml +11 -0
  25. package/android/src/main/res/drawable/error_icon.xml +11 -0
  26. package/android/src/main/res/drawable/neutral_face.xml +11 -0
  27. package/android/src/main/res/drawable/success_icon.xml +11 -0
  28. package/android/src/main/res/font/sixty.ttf +0 -0
  29. package/ios/Extensions/RnSDK+Callbacks.swift +62 -0
  30. package/ios/Extensions/UIColor+Hex.swift +39 -0
  31. package/ios/Resources/Media.xcassets/Contents.json +6 -0
  32. package/ios/Resources/Media.xcassets/shell.imageset/Contents.json +12 -0
  33. package/ios/Resources/Media.xcassets/shell.imageset/shell.png +0 -0
  34. package/ios/Resources/Media.xcassets/test.imageset/Contents.json +12 -0
  35. package/ios/Resources/Media.xcassets/test.imageset/arrow_forward_ios.png +0 -0
  36. package/ios/RnSdk.h +5 -0
  37. package/ios/RnSdk.mm +71 -0
  38. package/ios/RnSdkImpl.swift +91 -0
  39. package/ios/Utils/RnSdkBundle.swift +27 -0
  40. package/ios/Utils/ThemeFactory.swift +424 -0
  41. package/lib/module/@types/result.js +2 -0
  42. package/lib/module/@types/result.js.map +1 -0
  43. package/lib/module/@types/theme.js +41 -0
  44. package/lib/module/@types/theme.js.map +1 -0
  45. package/lib/module/NativeRnSdk.js +5 -0
  46. package/lib/module/NativeRnSdk.js.map +1 -0
  47. package/lib/module/index.js +33 -0
  48. package/lib/module/index.js.map +1 -0
  49. package/lib/module/package.json +1 -0
  50. package/lib/module/utils/AssetProcessor.js +78 -0
  51. package/lib/module/utils/AssetProcessor.js.map +1 -0
  52. package/lib/typescript/package.json +1 -0
  53. package/lib/typescript/src/@types/result.d.ts +17 -0
  54. package/lib/typescript/src/@types/result.d.ts.map +1 -0
  55. package/lib/typescript/src/@types/theme.d.ts +306 -0
  56. package/lib/typescript/src/@types/theme.d.ts.map +1 -0
  57. package/lib/typescript/src/NativeRnSdk.d.ts +9 -0
  58. package/lib/typescript/src/NativeRnSdk.d.ts.map +1 -0
  59. package/lib/typescript/src/index.d.ts +14 -0
  60. package/lib/typescript/src/index.d.ts.map +1 -0
  61. package/lib/typescript/src/utils/AssetProcessor.d.ts +8 -0
  62. package/lib/typescript/src/utils/AssetProcessor.d.ts.map +1 -0
  63. package/package.json +165 -0
  64. package/src/@types/result.ts +19 -0
  65. package/src/@types/theme.ts +346 -0
  66. package/src/NativeRnSdk.ts +18 -0
  67. package/src/index.tsx +54 -0
  68. package/src/utils/AssetProcessor.ts +114 -0
@@ -0,0 +1,176 @@
1
+ package br.com.oititec.rn.sdk.factories
2
+
3
+ import android.content.Context
4
+ import android.util.Log
5
+ import androidx.core.graphics.toColorInt
6
+ import br.com.oiti.designsystem.R
7
+ import br.com.oiti.domain.model.iproov.OrientationGPA
8
+ import br.com.oiti.domain.model.iproov.OrientationLA
9
+ import br.com.oiti.manager.exports.FilterTheme
10
+ import br.com.oiti.manager.exports.IProovDrawablesKey
11
+ import br.com.oiti.manager.exports.IProovFontsKey
12
+ import br.com.oiti.manager.exports.IProovTheme
13
+ import br.com.oiti.manager.exports.NaturalStyle
14
+ import br.com.oititec.rn.sdk.theme.IProovFonts
15
+ import br.com.oititec.rn.sdk.processors.AssetProcessor
16
+ import com.facebook.react.bridge.ReadableMap
17
+
18
+ object IProovThemeFactory {
19
+ private const val TAG = "IProovThemeFactory"
20
+
21
+ fun create(isCustom: Boolean, theme: ReadableMap? = null, context: Context? = null): IProovTheme =
22
+ if (isCustom) buildCustom(theme, context) else buildDefault()
23
+
24
+ private fun buildDefault() = IProovTheme.build {
25
+ setIsEnabledScreenShots(true)
26
+ }
27
+
28
+ private fun buildCustom(theme: ReadableMap? = null, context: Context? = null) = IProovTheme.build {
29
+
30
+ val iproovTheme = theme?.getMap("iproov")
31
+ val colors = iproovTheme?.getMap("colors")
32
+ val texts = iproovTheme?.getMap("texts")
33
+ val iproovFontsMap = iproovTheme?.getMap("fonts")
34
+
35
+ val iProovFonts = if (iproovFontsMap != null) {
36
+ IProovFonts(iproovFontsMap).apply()
37
+ } else {
38
+ mapOf(
39
+ IProovFontsKey.INSTRUCTIONS_TITLE_FONT to R.font.ubuntu_regular,
40
+ IProovFontsKey.INSTRUCTIONS_CAPTION_FONT to R.font.ubuntu_regular,
41
+ IProovFontsKey.INSTRUCTIONS_DOCUMENT_TYPES_INSTRUCTIONS_FONT to R.font.ubuntu_regular,
42
+ IProovFontsKey.INSTRUCTIONS_DOCUMENT_TIPS_INSTRUCTIONS_FONT to R.font.ubuntu_regular,
43
+ IProovFontsKey.INSTRUCTIONS_BUTTON_FONT to R.font.ubuntu_regular,
44
+ IProovFontsKey.PERMISSION_TITLE_FONT to R.font.ubuntu_regular,
45
+ IProovFontsKey.PERMISSION_CAPTION_FONT to R.font.ubuntu_regular,
46
+ IProovFontsKey.PERMISSION_BUTTON_FONT to R.font.ubuntu_regular,
47
+ IProovFontsKey.RESULT_MESSAGE_FONT to R.font.ubuntu_regular,
48
+ IProovFontsKey.RESULT_RETRY_BUTTON_FONT to R.font.ubuntu_regular,
49
+ )
50
+ }
51
+
52
+ setTitle(texts?.getString("title") ?: "Verificação Facial")
53
+ setTitleColor(colors?.getString("titleColor") ?: "#FFFFFF")
54
+ setHeaderBackgroundColor(colors?.getString("headerBackgroundColor") ?: "#121212")
55
+ setPromptTextColor(colors?.getString("promptTextColor") ?: "#FFFFFF")
56
+ setPromptBackgroundColor(colors?.getString("promptBackgroundColor") ?: "#1F1F1F")
57
+ setSurroundColor(colors?.getString("surroundColor") ?: "#00FF00")
58
+ setFontResource(R.font.ubuntu_regular)
59
+ setIsEnabledScreenShots(true)
60
+ setDisableExteriorEffects(false)
61
+ setTimeoutSecs(60)
62
+ setPromptRoundedCorners(true)
63
+ setFontsKey(iProovFonts)
64
+ setFilter(FilterTheme.Natural(NaturalStyle.CLEAR))
65
+
66
+ setOrientation(
67
+ gpa = OrientationGPA.PORTRAIT,
68
+ la = OrientationLA.PORTRAIT
69
+ )
70
+
71
+ setOvalColors(
72
+ ready = (colors?.getString("ovalReadyColor") ?: "#00FF00").toColorInt(),
73
+ notReady = (colors?.getString("ovalNotReadyColor") ?: "#FF0000").toColorInt(),
74
+ stroke = (colors?.getString("ovalStrokeColor") ?: "#FFFFFF").toColorInt(),
75
+ completed = (colors?.getString("ovalCompletedColor") ?: "#00FF00").toColorInt()
76
+ )
77
+
78
+ val instructionsTheme = theme?.getMap("instructions")
79
+ val instructionsColors = instructionsTheme?.getMap("colors")
80
+ val instructionsTexts = instructionsTheme?.getMap("texts")
81
+ val instructionsConfiguration = instructionsTheme?.getMap("configuration")
82
+ val showInstructionScreen = instructionsConfiguration?.getBoolean("showInstructionScreen") ?: true
83
+
84
+ Log.d(TAG, "🏭 Iniciando construção do tema IProov customizado...")
85
+ val iproovDrawables = AssetProcessor.processIProovAssets(theme)
86
+ Log.d(TAG, "📦 Assets processados: ${iproovDrawables.size} encontrados")
87
+
88
+ Log.d(TAG, "🎨 Assets encontrados para processamento: ${iproovDrawables.size}")
89
+ iproovDrawables.forEach { (key, value) ->
90
+ Log.d(TAG, " 📎 $key = '$value'")
91
+ }
92
+
93
+ if (iproovDrawables.isNotEmpty()) {
94
+ Log.d(TAG, "🎨 Configurando drawables customizados: ${iproovDrawables.size} assets")
95
+ setDrawablesKey(iproovDrawables)
96
+ } else {
97
+ Log.d(TAG, "📋 Nenhum drawable customizado encontrado, usando padrões")
98
+ }
99
+
100
+ setInstructionsTheme {
101
+ setShowInstructionScreen(showInstructionScreen)
102
+ setTitleText(instructionsTexts?.getString("titleText") ?: texts?.getString("instructionsTitleText") ?: "Teste title")
103
+ setTitleColor(instructionsColors?.getString("titleColor") ?: "#FFFFFF")
104
+ setCaptionText(instructionsTexts?.getString("captionText") ?: texts?.getString("instructionsCaptionText") ?: "teste caption.")
105
+ setCaptionColor(instructionsColors?.getString("captionColor") ?: "#AAAAAA")
106
+ setBackgroundColor(instructionsColors?.getString("backgroundColor") ?: "#1F1F1F")
107
+ setStatusBarColor(instructionsColors?.getString("statusBarColor") ?: "#1F1F1F")
108
+ setStatusBarIsDarkIcons(false)
109
+ setBottomSheetColor(instructionsColors?.getString("bottomSheetColor") ?: "#333333")
110
+ setBottomSheetCornerRadius(16f)
111
+ setContinueButtonText(instructionsTexts?.getString("continueButtonText") ?: texts?.getString("continueButtonText") ?: "Startar")
112
+ setContinueButtonColor(instructionsColors?.getString("continueButtonColor") ?: "#00FF00")
113
+ setContinueButtonTextColor(instructionsColors?.getString("continueButtonTextColor") ?: "#000000")
114
+
115
+ val contextImageName = iproovDrawables[IProovDrawablesKey.INSTRUCTIONS_CONTEXT_IMAGE] as? String
116
+ if (contextImageName != null && context != null) {
117
+ val resourceId = AssetProcessor.getDrawableResourceId(context, contextImageName)
118
+ if (resourceId != 0) {
119
+ Log.d(TAG, "✅ Usando context image customizado: $resourceId")
120
+ setContextImage(resourceId)
121
+ } else {
122
+ Log.w(TAG, "⚠️ Context image customizado não encontrado")
123
+ }
124
+ }
125
+ }
126
+
127
+ val permissionTheme = theme?.getMap("permission")
128
+ val permissionColors = permissionTheme?.getMap("colors")
129
+ val permissionTexts = permissionTheme?.getMap("texts")
130
+
131
+ setPermissionTheme {
132
+ setTitle(permissionTexts?.getString("title") ?: texts?.getString("permissionTitle") ?: "Permissões Necessárias")
133
+ setTitleColor(permissionColors?.getString("titleColor") ?: "#FFFFFF")
134
+ setBackgroundColor(permissionColors?.getString("backgroundColor") ?: "#1F1F1F")
135
+ setStatusBarColor(permissionColors?.getString("statusBarColor") ?: "#1F1F1F")
136
+ setStatusBarIsDarkIcons(false)
137
+ }
138
+
139
+ val processingTheme = theme?.getMap("processing")
140
+ val processingColors = processingTheme?.getMap("colors")
141
+
142
+ setProcessingTheme {
143
+ setBackgroundColor(processingColors?.getString("backgroundColor") ?: "#000000")
144
+ setLoadingDialogColor(processingColors?.getString("loadingDialogColor") ?: "#FFFFFF")
145
+ setStatusBarColor(processingColors?.getString("statusBarColor") ?: "#000000")
146
+ setStatusBarIsDarkIcons(true)
147
+ setLoadingIndicatorSize(100)
148
+ setLoadingIndicatorWidth(10)
149
+ }
150
+
151
+ val resultTheme = theme?.getMap("result")
152
+ val resultColors = resultTheme?.getMap("colors")
153
+ val resultTexts = resultTheme?.getMap("texts")
154
+
155
+ setResultTheme {
156
+ setSuccessBackgroundColor(resultColors?.getString("successBackgroundColor") ?: "#DFFFD6")
157
+ setSuccessIcon(R.drawable.success_icon)
158
+ setSuccessText(resultTexts?.getString("successText") ?: texts?.getString("successText") ?: "Verificação concluída com sucesso!")
159
+ setSuccessTextColor(resultColors?.getString("successTextColor") ?: "#0F9D58")
160
+
161
+ setStatusBarSuccessColor(resultColors?.getString("statusBarSuccessColor") ?: "#DFFFD6")
162
+ setStatusBarErrorColor(resultColors?.getString("statusBarErrorColor") ?: "#FFD6D6")
163
+ setStatusBarSuccessIsDarkIcons(true)
164
+ setStatusBarErrorIsDarkIcons(true)
165
+
166
+ setErrorBackgroundColor(resultColors?.getString("errorBackgroundColor") ?: "#FFD6D6")
167
+ setErrorIcon(R.drawable.error_icon)
168
+ setErrorText(resultTexts?.getString("errorText") ?: texts?.getString("errorText") ?: "Algo deu errado na verificação.")
169
+ setErrorTextColor(resultColors?.getString("errorTextColor") ?: "#D93025")
170
+
171
+ setRetryButtonColor(resultColors?.getString("retryButtonColor") ?: "#0F9D58")
172
+ setRetryButtonText(resultTexts?.getString("retryButtonText") ?: texts?.getString("retryButtonText") ?: "Tentar novamente")
173
+ setRetryButtonTextColor(resultColors?.getString("retryButtonTextColor") ?: "#FFFFFF")
174
+ }
175
+ }
176
+ }
@@ -0,0 +1,152 @@
1
+ package br.com.oititec.rn.sdk.managers
2
+
3
+ import android.content.Context
4
+ import android.util.Log
5
+ import br.com.oititec.rn.sdk.utils.AssetProcessor
6
+ import com.facebook.react.bridge.ReadableMap
7
+ import java.util.concurrent.ConcurrentHashMap
8
+
9
+ object AssetManager {
10
+ private const val TAG = "AssetManager"
11
+ private val processedAssets = ConcurrentHashMap<String, Int?>()
12
+ private var isInitialized = false
13
+
14
+ fun initialize(context: Context, theme: ReadableMap?) {
15
+ if (isInitialized) {
16
+ Log.d(TAG, "AssetManager already initialized")
17
+ return
18
+ }
19
+
20
+ Log.d(TAG, "Initializing AssetManager...")
21
+
22
+ theme?.let { processThemeAssets(context, it) }
23
+
24
+ isInitialized = true
25
+ Log.d(TAG, "AssetManager initialized successfully")
26
+ }
27
+
28
+ private fun processThemeAssets(context: Context, theme: ReadableMap) {
29
+ val assetProcessor = AssetProcessor(context)
30
+
31
+ val instructionsTheme = theme.getMap("instructions")
32
+ val instructionsAssets = instructionsTheme?.getMap("assets")
33
+
34
+ instructionsAssets?.let { assets ->
35
+ assets.getString("logo")?.let { logoBase64 ->
36
+ val logoKey = "instructions_logo"
37
+ Log.d(TAG, "Processing instructions logo asset: $logoKey")
38
+
39
+ val drawable = assetProcessor.processBase64ToDrawable(
40
+ logoBase64,
41
+ br.com.oiti.designsystem.R.drawable.error_icon
42
+ )
43
+
44
+ val resourceId = assetProcessor.createDynamicResourceId(drawable)
45
+
46
+ processedAssets[logoKey] = resourceId
47
+ Log.d(TAG, "Instructions logo processed successfully: ${resourceId != null}")
48
+ }
49
+ }
50
+
51
+ val iproovTheme = theme.getMap("iproov")
52
+ val iproovAssets = iproovTheme?.getMap("assets")
53
+
54
+ iproovAssets?.let { assets ->
55
+ assets.getString("logo")?.let { logoBase64 ->
56
+ val logoKey = "iproov_logo"
57
+ Log.d(TAG, "Processing iproov logo asset: $logoKey")
58
+
59
+ val drawable = assetProcessor.processBase64ToDrawable(
60
+ logoBase64,
61
+ br.com.oiti.designsystem.R.drawable.error_icon
62
+ )
63
+
64
+ val resourceId = assetProcessor.createDynamicResourceId(drawable)
65
+
66
+ processedAssets[logoKey] = resourceId
67
+ Log.d(TAG, "IProov logo processed successfully: ${resourceId != null}")
68
+ }
69
+
70
+ assets.getString("closeButton")?.let { closeButtonBase64 ->
71
+ val closeButtonKey = "iproov_close_button"
72
+ Log.d(TAG, "Processing iproov close button asset: $closeButtonKey")
73
+
74
+ val drawable = assetProcessor.processBase64ToDrawable(
75
+ closeButtonBase64,
76
+ br.com.oiti.designsystem.R.drawable.close_icon
77
+ )
78
+
79
+ val resourceId = assetProcessor.createDynamicResourceId(drawable)
80
+
81
+ processedAssets[closeButtonKey] = resourceId
82
+ Log.d(TAG, "IProov close button processed successfully: ${resourceId != null}")
83
+ }
84
+ }
85
+
86
+ val facetecTheme = theme.getMap("facetec")
87
+ val facetecAssets = facetecTheme?.getMap("assets")
88
+
89
+ facetecAssets?.let { assets ->
90
+ assets.getString("overlayBrandingImage")?.let { overlayBase64 ->
91
+ val overlayKey = "facetec_overlay_branding"
92
+ Log.d(TAG, "Processing facetec overlay branding asset: $overlayKey")
93
+
94
+ val drawable = assetProcessor.processBase64ToDrawable(
95
+ overlayBase64,
96
+ br.com.oiti.designsystem.R.drawable.neutral_face
97
+ )
98
+
99
+ val resourceId = assetProcessor.createDynamicResourceId(drawable)
100
+
101
+ processedAssets[overlayKey] = resourceId
102
+ Log.d(TAG, "Facetec overlay branding processed successfully: ${resourceId != null}")
103
+ }
104
+
105
+ assets.getString("cancelButtonCustomImage")?.let { cancelButtonBase64 ->
106
+ val cancelButtonKey = "facetec_cancel_button"
107
+ Log.d(TAG, "Processing facetec cancel button asset: $cancelButtonKey")
108
+
109
+ val drawable = assetProcessor.processBase64ToDrawable(
110
+ cancelButtonBase64,
111
+ br.com.oiti.designsystem.R.drawable.close_icon
112
+ )
113
+
114
+ val resourceId = assetProcessor.createDynamicResourceId(drawable)
115
+
116
+ processedAssets[cancelButtonKey] = resourceId
117
+ Log.d(TAG, "Facetec cancel button processed successfully: ${resourceId != null}")
118
+ }
119
+
120
+ assets.getString("resultScreenCustomActivityIndicatorImage")?.let { activityIndicatorBase64 ->
121
+ val activityIndicatorKey = "facetec_activity_indicator"
122
+ Log.d(TAG, "Processing facetec activity indicator asset: $activityIndicatorKey")
123
+
124
+ val drawable = assetProcessor.processBase64ToDrawable(
125
+ activityIndicatorBase64,
126
+ br.com.oiti.designsystem.R.drawable.success_icon
127
+ )
128
+
129
+ val resourceId = assetProcessor.createDynamicResourceId(drawable)
130
+
131
+ processedAssets[activityIndicatorKey] = resourceId
132
+ Log.d(TAG, "Facetec activity indicator processed successfully: ${resourceId != null}")
133
+ }
134
+ }
135
+ }
136
+
137
+ fun getProcessedAsset(key: String): Int? {
138
+ return processedAssets[key]
139
+ }
140
+
141
+ fun hasAsset(key: String): Boolean {
142
+ return processedAssets.containsKey(key)
143
+ }
144
+
145
+ fun clear() {
146
+ processedAssets.clear()
147
+ isInitialized = false
148
+ Log.d(TAG, "AssetManager cleared")
149
+ }
150
+
151
+ fun isReady(): Boolean = isInitialized
152
+ }
@@ -0,0 +1,6 @@
1
+ package br.com.oititec.rn.sdk.model
2
+
3
+ enum class Features(label: String) {
4
+ IProov("IProov"),
5
+ Facetec("Facetec")
6
+ }
@@ -0,0 +1,179 @@
1
+ package br.com.oititec.rn.sdk.processors
2
+
3
+ import android.content.Context
4
+ import android.util.Log
5
+ import br.com.oiti.manager.exports.FacetecDrawablesKey
6
+ import br.com.oiti.manager.exports.IProovDrawablesKey
7
+ import com.facebook.react.bridge.ReadableMap
8
+
9
+ object AssetProcessor {
10
+ private const val TAG = "AssetProcessor"
11
+
12
+ fun getDrawableResourceId(context: Context, drawableName: String): Int {
13
+ Log.d(TAG, "Tentando encontrar drawable: '$drawableName' no package: ${context.packageName}")
14
+ val resourceId = context.resources.getIdentifier(drawableName, "drawable", context.packageName)
15
+ if (resourceId != 0) {
16
+ Log.d(TAG, "✅ Drawable '$drawableName' encontrado com ID: $resourceId")
17
+ } else {
18
+ Log.w(TAG, "❌ Drawable '$drawableName' NÃO encontrado no package ${context.packageName}")
19
+ }
20
+ return resourceId
21
+ }
22
+
23
+ fun processFacetecAssets(theme: ReadableMap?): Map<FacetecDrawablesKey, Any> {
24
+ Log.d(TAG, "🔍 Iniciando processamento de assets do Facetec...")
25
+ val facetecDrawables = mutableMapOf<FacetecDrawablesKey, Any>()
26
+
27
+ if (theme == null) {
28
+ Log.w(TAG, "❌ Theme é null - nenhum asset será processado")
29
+ return facetecDrawables
30
+ }
31
+
32
+ val facetecTheme = theme.getMap("facetec")
33
+ val facetecAssets = facetecTheme?.getMap("assets")
34
+
35
+ val instructionsTheme = theme.getMap("instructions")
36
+ val instructionsAssets = instructionsTheme?.getMap("assets")
37
+
38
+ val permissionTheme = theme.getMap("permission")
39
+ val permissionAssets = permissionTheme?.getMap("assets")
40
+
41
+ Log.d(TAG, "📦 Facetec assets disponível: ${facetecAssets != null}")
42
+ Log.d(TAG, "📦 Instructions assets disponível: ${instructionsAssets != null}")
43
+ Log.d(TAG, "📦 Permission assets disponível: ${permissionAssets != null}")
44
+
45
+ facetecAssets?.getString("overlayBrandImage")?.let { assetName ->
46
+ Log.d(TAG, "✅ Encontrado overlayBrandImage: '$assetName'")
47
+ facetecDrawables[FacetecDrawablesKey.FACETEC_OVERLAY_SHOW_BRANDING_IMAGE] = assetName
48
+ } ?: Log.d(TAG, "⚠️ overlayBrandImage não encontrado em facetec.assets")
49
+
50
+ facetecAssets?.getString("cancelButtonIcon")?.let { assetName ->
51
+ Log.d(TAG, "✅ Encontrado cancelButtonIcon: '$assetName'")
52
+ facetecDrawables[FacetecDrawablesKey.FACETEC_CANCEL_BUTTON_CUSTOM_IMAGE] = assetName
53
+ } ?: Log.d(TAG, "⚠️ cancelButtonIcon não encontrado em facetec.assets")
54
+
55
+ facetecAssets?.getString("resultScreenCustomActivityIndicatorImage")?.let { assetName ->
56
+ Log.d(TAG, "✅ Encontrado resultScreenCustomActivityIndicatorImage: '$assetName'")
57
+ facetecDrawables[FacetecDrawablesKey.FACETEC_RESULT_CUSTOM_ACTIVITY_INDICATOR_IMAGE] = assetName
58
+ } ?: Log.d(TAG, "⚠️ resultScreenCustomActivityIndicatorImage não encontrado em facetec.assets")
59
+
60
+ instructionsAssets?.getString("firstInstructionIcon")?.let { assetName ->
61
+ Log.d(TAG, "✅ Encontrado firstInstructionIcon: '$assetName'")
62
+ facetecDrawables[FacetecDrawablesKey.INSTRUCTIONS_FIRST_INSTRUCTION_ICON] = assetName
63
+ } ?: Log.d(TAG, "⚠️ firstInstructionIcon não encontrado em instructions.assets")
64
+
65
+ instructionsAssets?.getString("secondInstructionIcon")?.let { assetName ->
66
+ Log.d(TAG, "✅ Encontrado secondInstructionIcon: '$assetName'")
67
+ facetecDrawables[FacetecDrawablesKey.INSTRUCTIONS_SECOND_INSTRUCTION_ICON] = assetName
68
+ } ?: Log.d(TAG, "⚠️ secondInstructionIcon não encontrado em instructions.assets")
69
+
70
+ instructionsAssets?.getString("contextImage")?.let { assetName ->
71
+ Log.d(TAG, "✅ Encontrado contextImage: '$assetName'")
72
+ facetecDrawables[FacetecDrawablesKey.INSTRUCTIONS_CONTEXT_IMAGE] = assetName
73
+ } ?: Log.d(TAG, "⚠️ contextImage não encontrado em instructions.assets")
74
+
75
+ instructionsAssets?.getString("backButtonIcon")?.let { assetName ->
76
+ Log.d(TAG, "✅ Encontrado instructions backButtonIcon: '$assetName'")
77
+ facetecDrawables[FacetecDrawablesKey.INSTRUCTIONS_BACK_BUTTON_IMG] = assetName
78
+ } ?: Log.d(TAG, "⚠️ backButtonIcon não encontrado em instructions.assets")
79
+
80
+ permissionAssets?.getString("cameraImage")?.let { assetName ->
81
+ Log.d(TAG, "✅ Encontrado cameraImage: '$assetName'")
82
+ facetecDrawables[FacetecDrawablesKey.PERMISSION_CAMERA_ICON] = assetName
83
+ } ?: Log.d(TAG, "⚠️ cameraImage não encontrado em permission.assets")
84
+
85
+ permissionAssets?.getString("backButtonIcon")?.let { assetName ->
86
+ Log.d(TAG, "✅ Encontrado permission backButtonIcon: '$assetName'")
87
+ facetecDrawables[FacetecDrawablesKey.PERMISSION_BACK_BUTTON_ICON] = assetName
88
+ } ?: Log.d(TAG, "⚠️ backButtonIcon não encontrado em permission.assets")
89
+
90
+ Log.d(TAG, "🏁 Processamento Facetec finalizado: ${facetecDrawables.size} assets encontrados")
91
+ facetecDrawables.forEach { (key, value) ->
92
+ Log.d(TAG, " 📎 $key = '$value'")
93
+ }
94
+ return facetecDrawables
95
+ }
96
+
97
+ fun processIProovAssets(theme: ReadableMap?): Map<IProovDrawablesKey, Any> {
98
+ Log.d(TAG, "🔍 Iniciando processamento de assets do IProov...")
99
+ val iproovDrawables = mutableMapOf<IProovDrawablesKey, Any>()
100
+
101
+ if (theme == null) {
102
+ Log.w(TAG, "❌ Theme é null - nenhum asset IProov será processado")
103
+ return iproovDrawables
104
+ }
105
+
106
+ val iproovTheme = theme.getMap("iproov")
107
+ val iproovAssets = iproovTheme?.getMap("assets")
108
+
109
+ val instructionsTheme = theme.getMap("instructions")
110
+ val instructionsAssets = instructionsTheme?.getMap("assets")
111
+
112
+ val permissionTheme = theme.getMap("permission")
113
+ val permissionAssets = permissionTheme?.getMap("assets")
114
+
115
+ val resultTheme = theme.getMap("result")
116
+ val resultAssets = resultTheme?.getMap("assets")
117
+
118
+ Log.d(TAG, "📦 IProov assets disponível: ${iproovAssets != null}")
119
+ Log.d(TAG, "📦 Instructions assets disponível: ${instructionsAssets != null}")
120
+ Log.d(TAG, "📦 Permission assets disponível: ${permissionAssets != null}")
121
+ Log.d(TAG, "📦 Result assets disponível: ${resultAssets != null}")
122
+
123
+ iproovAssets?.getString("logoImage")?.let { assetName ->
124
+ Log.d(TAG, "✅ Encontrado logoImage: '$assetName'")
125
+ iproovDrawables[IProovDrawablesKey.IPROOV_LOGO] = assetName
126
+ } ?: Log.d(TAG, "⚠️ logoImage não encontrado em iproov.assets")
127
+
128
+ iproovAssets?.getString("closeButtonIcon")?.let { assetName ->
129
+ Log.d(TAG, "✅ Encontrado closeButtonIcon: '$assetName'")
130
+ iproovDrawables[IProovDrawablesKey.IPROOV_CLOSE_BUTTON] = assetName
131
+ } ?: Log.d(TAG, "⚠️ closeButtonIcon não encontrado em iproov.assets")
132
+
133
+ instructionsAssets?.getString("firstInstructionIcon")?.let { assetName ->
134
+ Log.d(TAG, "✅ Encontrado firstInstructionIcon: '$assetName'")
135
+ iproovDrawables[IProovDrawablesKey.INSTRUCTIONS_FIRST_INSTRUCTION_ICON] = assetName
136
+ } ?: Log.d(TAG, "⚠️ firstInstructionIcon não encontrado em instructions.assets")
137
+
138
+ instructionsAssets?.getString("secondInstructionIcon")?.let { assetName ->
139
+ Log.d(TAG, "✅ Encontrado secondInstructionIcon: '$assetName'")
140
+ iproovDrawables[IProovDrawablesKey.INSTRUCTIONS_SECOND_INSTRUCTION_ICON] = assetName
141
+ } ?: Log.d(TAG, "⚠️ secondInstructionIcon não encontrado em instructions.assets")
142
+
143
+ instructionsAssets?.getString("contextImage")?.let { assetName ->
144
+ Log.d(TAG, "✅ Encontrado contextImage: '$assetName'")
145
+ iproovDrawables[IProovDrawablesKey.INSTRUCTIONS_CONTEXT_IMAGE] = assetName
146
+ } ?: Log.d(TAG, "⚠️ contextImage não encontrado em instructions.assets")
147
+
148
+ instructionsAssets?.getString("backButtonIcon")?.let { assetName ->
149
+ Log.d(TAG, "✅ Encontrado instructions backButtonIcon: '$assetName'")
150
+ iproovDrawables[IProovDrawablesKey.INSTRUCTIONS_BACK_BUTTON_IMG] = assetName
151
+ } ?: Log.d(TAG, "⚠️ backButtonIcon não encontrado em instructions.assets")
152
+
153
+ permissionAssets?.getString("cameraImage")?.let { assetName ->
154
+ Log.d(TAG, "✅ Encontrado cameraImage: '$assetName'")
155
+ iproovDrawables[IProovDrawablesKey.PERMISSION_CAMERA_ICON] = assetName
156
+ } ?: Log.d(TAG, "⚠️ cameraImage não encontrado em permission.assets")
157
+
158
+ permissionAssets?.getString("backButtonIcon")?.let { assetName ->
159
+ Log.d(TAG, "✅ Encontrado permission backButtonIcon: '$assetName'")
160
+ iproovDrawables[IProovDrawablesKey.PERMISSION_BACK_BUTTON_ICON] = assetName
161
+ } ?: Log.d(TAG, "⚠️ backButtonIcon não encontrado em permission.assets")
162
+
163
+ resultAssets?.getString("successImage")?.let { assetName ->
164
+ Log.d(TAG, "✅ Encontrado successImage: '$assetName'")
165
+ iproovDrawables[IProovDrawablesKey.RESULT_SUCCESS_ICON] = assetName
166
+ } ?: Log.d(TAG, "⚠️ successImage não encontrado em result.assets")
167
+
168
+ resultAssets?.getString("errorImage")?.let { assetName ->
169
+ Log.d(TAG, "✅ Encontrado errorImage: '$assetName'")
170
+ iproovDrawables[IProovDrawablesKey.RESULT_ERROR_ICON] = assetName
171
+ } ?: Log.d(TAG, "⚠️ errorImage não encontrado em result.assets")
172
+
173
+ Log.d(TAG, "🏁 Processamento IProov finalizado: ${iproovDrawables.size} assets encontrados")
174
+ iproovDrawables.forEach { (key, value) ->
175
+ Log.d(TAG, " 📎 $key = '$value'")
176
+ }
177
+ return iproovDrawables
178
+ }
179
+ }
@@ -0,0 +1,25 @@
1
+ package br.com.oititec.rn.sdk.strategy
2
+
3
+ import android.content.Context
4
+ import br.com.oiti.domain.callback.CertifaceResultCallback
5
+ import br.com.oiti.facetecsdk.domain.model.FacetecManagerOptions
6
+ import br.com.oiti.manager.exports.LivenessResult
7
+ import br.com.oiti.manager.main.CertifaceSDK
8
+ import br.com.oiti.manager.main.LivenessProvider
9
+ import br.com.oititec.rn.sdk.factories.FacetecThemeFactory
10
+ import com.facebook.react.bridge.ReadableMap
11
+
12
+ class FacetecStrategy : LivenessProviderStrategy {
13
+ override fun start(
14
+ context: Context,
15
+ appKey: String,
16
+ isCustom: Boolean,
17
+ theme: ReadableMap?,
18
+ callback: CertifaceResultCallback<LivenessResult>
19
+ ) {
20
+ val facetecTheme = FacetecThemeFactory.create(isCustom, theme, context)
21
+ val opts = FacetecManagerOptions(appKey, facetecTheme)
22
+ val manager = CertifaceSDK.createLivenessManager(LivenessProvider.FACETEC)
23
+ manager.start(opts, callback)
24
+ }
25
+ }
@@ -0,0 +1,25 @@
1
+ package br.com.oititec.rn.sdk.strategy
2
+
3
+ import android.content.Context
4
+ import br.com.oiti.domain.callback.CertifaceResultCallback
5
+ import br.com.oiti.iproov.domain.model.IProovManagerOptions
6
+ import br.com.oiti.manager.exports.LivenessResult
7
+ import br.com.oiti.manager.main.CertifaceSDK
8
+ import br.com.oiti.manager.main.LivenessProvider
9
+ import br.com.oititec.rn.sdk.factories.IProovThemeFactory
10
+ import com.facebook.react.bridge.ReadableMap
11
+
12
+ class IProovStrategy : LivenessProviderStrategy {
13
+ override fun start(
14
+ context: Context,
15
+ appKey: String,
16
+ isCustom: Boolean,
17
+ theme: ReadableMap?,
18
+ callback: CertifaceResultCallback<LivenessResult>
19
+ ) {
20
+ val iproovTheme = IProovThemeFactory.create(isCustom, theme, context)
21
+ val opts = IProovManagerOptions(appKey, iproovTheme)
22
+ val manager = CertifaceSDK.createLivenessManager(LivenessProvider.IPROOV)
23
+ manager.start(opts, callback)
24
+ }
25
+ }
@@ -0,0 +1,16 @@
1
+ package br.com.oititec.rn.sdk.strategy
2
+
3
+ import android.content.Context
4
+ import br.com.oiti.domain.callback.CertifaceResultCallback
5
+ import br.com.oiti.manager.exports.LivenessResult
6
+ import com.facebook.react.bridge.ReadableMap
7
+
8
+ interface LivenessProviderStrategy {
9
+ fun start(
10
+ context: Context,
11
+ appKey: String,
12
+ isCustom: Boolean,
13
+ theme: ReadableMap?,
14
+ callback: CertifaceResultCallback<LivenessResult>
15
+ )
16
+ }
@@ -0,0 +1,85 @@
1
+ package br.com.oititec.rn.sdk.theme
2
+
3
+ import br.com.oiti.manager.exports.FacetecFontsKey
4
+ import com.facebook.react.bridge.ReadableMap
5
+
6
+ class FacetecFonts(
7
+ private val instructionsFonts: ReadableMap?,
8
+ private val permissionFonts: ReadableMap?,
9
+ private val facetecFonts: ReadableMap?
10
+ ) {
11
+ private val instructionsTitleFont: String =
12
+ "fonts/" + (instructionsFonts?.getString("title")?.lowercase() ?: "ubuntu_regular") + ".ttf"
13
+
14
+ private val instructionsCaptionFont: String =
15
+ "fonts/" + (instructionsFonts?.getString("caption")?.lowercase() ?: "ubuntu_regular") + ".ttf"
16
+
17
+ private val instructionsFirstInstructionTitleFont: String =
18
+ "fonts/" + (instructionsFonts?.getString("firstInstructionTitle")?.lowercase() ?: "ubuntu_regular") + ".ttf"
19
+
20
+ private val instructionsSecondInstructionTitleFont: String =
21
+ "fonts/" + (instructionsFonts?.getString("secondInstructionTitle")?.lowercase() ?: "ubuntu_regular") + ".ttf"
22
+
23
+ private val instructionsContinueButtonFont: String =
24
+ "fonts/" + (instructionsFonts?.getString("continueButton")?.lowercase() ?: "ubuntu_regular") + ".ttf"
25
+
26
+ private val permissionTitleFont: String =
27
+ "fonts/" + (permissionFonts?.getString("title")?.lowercase() ?: "ubuntu_regular") + ".ttf"
28
+
29
+ private val permissionCaptionFont: String =
30
+ "fonts/" + (permissionFonts?.getString("caption")?.lowercase() ?: "ubuntu_regular") + ".ttf"
31
+
32
+ private val permissionButtonFont: String =
33
+ "fonts/" + (permissionFonts?.getString("checkPermissionButton")?.lowercase() ?: "ubuntu_regular") + ".ttf"
34
+
35
+ private val guidanceHeaderFont: String =
36
+ "fonts/" + (facetecFonts?.getString("guidanceHeader")?.lowercase() ?: "ubuntu_regular") + ".ttf"
37
+
38
+ private val guidanceSubtextFont: String =
39
+ "fonts/" + (facetecFonts?.getString("guidanceSubtext")?.lowercase() ?: "ubuntu_regular") + ".ttf"
40
+
41
+ private val guidanceButtonFont: String =
42
+ "fonts/" + (facetecFonts?.getString("guidanceButton")?.lowercase() ?: "ubuntu_regular") + ".ttf"
43
+
44
+ private val readyScreenHeaderFont: String =
45
+ "fonts/" + (facetecFonts?.getString("readyScreenHeader")?.lowercase() ?: "ubuntu_regular") + ".ttf"
46
+
47
+ private val readyScreenSubtextFont: String =
48
+ "fonts/" + (facetecFonts?.getString("readyScreenSubtext")?.lowercase() ?: "ubuntu_regular") + ".ttf"
49
+
50
+ private val retryScreenHeaderFont: String =
51
+ "fonts/" + (facetecFonts?.getString("retryScreenHeader")?.lowercase() ?: "ubuntu_regular") + ".ttf"
52
+
53
+ private val retryScreenSubtextFont: String =
54
+ "fonts/" + (facetecFonts?.getString("retryScreenSubtext")?.lowercase() ?: "ubuntu_regular") + ".ttf"
55
+
56
+ private val resultScreenMessageFont: String =
57
+ "fonts/" + (facetecFonts?.getString("resultScreenMessage")?.lowercase() ?: "ubuntu_regular") + ".ttf"
58
+
59
+ private val feedbackMessageFont: String =
60
+ "fonts/" + (facetecFonts?.getString("feedbackMessage")?.lowercase() ?: "ubuntu_regular") + ".ttf"
61
+
62
+ fun apply(): HashMap<FacetecFontsKey, String> {
63
+ return hashMapOf(
64
+ FacetecFontsKey.INSTRUCTIONS_TITLE_FONT to instructionsTitleFont,
65
+ FacetecFontsKey.INSTRUCTIONS_CAPTION_FONT to instructionsCaptionFont,
66
+ FacetecFontsKey.INSTRUCTIONS_DOCUMENT_TYPES_INSTRUCTIONS_FONT to instructionsFirstInstructionTitleFont,
67
+ FacetecFontsKey.INSTRUCTIONS_DOCUMENT_TIPS_INSTRUCTIONS_FONT to instructionsSecondInstructionTitleFont,
68
+ FacetecFontsKey.INSTRUCTIONS_BUTTON_FONT to instructionsContinueButtonFont,
69
+
70
+ FacetecFontsKey.PERMISSION_TITLE_FONT to permissionTitleFont,
71
+ FacetecFontsKey.PERMISSION_CAPTION_FONT to permissionCaptionFont,
72
+ FacetecFontsKey.PERMISSION_BUTTON_FONT to permissionButtonFont,
73
+
74
+ FacetecFontsKey.GUIDANCE_CUSTOMIZATION_HEADER_FONT to guidanceHeaderFont,
75
+ FacetecFontsKey.GUIDANCE_CUSTOMIZATION_SUBTEXT_FONT to guidanceSubtextFont,
76
+ FacetecFontsKey.GUIDANCE_CUSTOMIZATION_BUTTON_FONT to guidanceButtonFont,
77
+ FacetecFontsKey.GUIDANCE_CUSTOMIZATION_READY_SCREEN_HEADER_FONT to readyScreenHeaderFont,
78
+ FacetecFontsKey.GUIDANCE_CUSTOMIZATION_READY_SCREEN_SUBTEXT_FONT to readyScreenSubtextFont,
79
+ FacetecFontsKey.GUIDANCE_CUSTOMIZATION_RETRY_SCREEN_HEADER_FONT to retryScreenHeaderFont,
80
+ FacetecFontsKey.GUIDANCE_CUSTOMIZATION_RETRY_SCREEN_SUBTEXT_FONT to retryScreenSubtextFont,
81
+ FacetecFontsKey.RESULT_SCREEN_CUSTOMIZATION_MESSAGE_FONT to resultScreenMessageFont,
82
+ FacetecFontsKey.FEEDBACK_CUSTOMIZATION_TEXT_FONT to feedbackMessageFont,
83
+ )
84
+ }
85
+ }