class CafSmartAuthBridgeModule(private val reactContext: ReactApplicationContext) :
ReactContextBaseJavaModule(reactContext) {
@Nonnull
override fun getName(): String {
return CAF_SMART_AUTH_BRIDGE_MODULE
}
private fun build(mfaToken: String, faceAuthToken: String, settings: String): CafSmartAuth {
val smartAuthSettings = CafSmartAuthBridgeSettings(settings = settings)
return CafSmartAuth.CafBuilder(mfaToken, reactContext).apply {
setSdkPlatform(CafSdkPlatform.REACT_NATIVE)
smartAuthSettings.cafStage?.let { setStage(it) }
smartAuthSettings.emailUrl?.let { setEmailUrl(it) }
smartAuthSettings.phoneUrl?.let { setPhoneUrl(it) }
setFaceAuthenticatorSettings(
CafFaceAuthenticatorSettings(
faceAuthToken,
smartAuthSettings.faceAuthenticatorSettings?.loadingScreen,
smartAuthSettings.faceAuthenticatorSettings?.enableScreenCapture,
smartAuthSettings.faceAuthenticatorSettings?.filter
)
)
setThemeConfigurator(
CafThemeConfigurator(
lightTheme = smartAuthSettings.theme?.lightTheme ?: CafTheme(),
darkTheme = smartAuthSettings.theme?.darkTheme ?: CafTheme()
)
)
}.build()
}
private fun emitEvent(eventName: String, params: Any) {
reactApplicationContext
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
.emit(eventName, params)
}
private fun setupListener() = object : CafVerifyPolicyListener {
override fun onSuccess(
isAuthorized: Boolean,
attemptId: String?,
attestation: String?
) {
emitEvent(eventName = CAF_SMART_AUTH_SUCCESS_EVENT, params = WritableNativeMap().apply {
putBoolean(CAF_WRITABLE_MAP_IS_AUTHORIZED, isAuthorized)
putString(CAF_WRITABLE_MAP_ATTEMPT_ID, attemptId)
putString(CAF_WRITABLE_MAP_ATTESTATION, attestation)
})
}
override fun onPending(isAuthorized: Boolean, attestation: String) {
emitEvent(eventName = CAF_SMART_AUTH_PENDING_EVENT, params = WritableNativeMap().apply {
putBoolean(CAF_WRITABLE_MAP_IS_AUTHORIZED, isAuthorized)
putString(CAF_WRITABLE_MAP_ATTESTATION, attestation)
})
}
override fun onError(failure: CafFailure, message: String?) {
emitEvent(eventName = CAF_SMART_AUTH_ERROR_EVENT, params = WritableNativeMap().apply {
putString(CAF_WRITABLE_MAP_ERROR_MESSAGE, failure.message)
})
}
override fun onCancel() {
emitEvent(eventName = CAF_SMART_AUTH_CANCEL_EVENT, params = true)
}
override fun onLoading() {
emitEvent(eventName = CAF_SMART_AUTH_LOADING_EVENT, params = true)
}
override fun onLoaded() {
emitEvent(eventName = CAF_SMART_AUTH_LOADED_EVENT, params = true)
}
}
private fun requestPermission(permission: String, activity: Activity) {
if (ContextCompat.checkSelfPermission(
reactContext,
permission
) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(activity, arrayOf(permission), REQUEST_CODE)
}
}
@ReactMethod
fun startSmartAuth(
mfaToken: String,
faceAuthToken: String,
personId: String,
policyId: String,
jsonString: String
) {
Handler(Looper.getMainLooper()).post {
val smartAuth =
build(mfaToken = mfaToken, faceAuthToken = faceAuthToken, settings = jsonString)
smartAuth.verifyPolicy(personId, policyId, setupListener())
}
}
@ReactMethod
fun requestLocationPermissions(promise: Promise) {
val activity = currentActivity ?: return
Handler(Looper.getMainLooper()).post {
try {
requestPermission(
permission = Manifest.permission.ACCESS_FINE_LOCATION,
activity = activity
)
requestPermission(
permission = Manifest.permission.ACCESS_COARSE_LOCATION,
activity = activity
)
promise.resolve(true)
} catch (e: Exception) {
promise.reject(
PERMISSION_ERROR,
"$PERMISSION_ERROR_DESCRIPTION ${e.message}"
)
}
}
}
companion object {
private const val REQUEST_CODE = 1234
private const val CAF_SMART_AUTH_BRIDGE_MODULE = "CafSmartAuthBridgeModule"
private const val CAF_SMART_AUTH_SUCCESS_EVENT = "CafSmartAuth_Success"
private const val CAF_SMART_AUTH_PENDING_EVENT = "CafSmartAuth_Pending"
private const val CAF_SMART_AUTH_ERROR_EVENT = "CafSmartAuth_Error"
private const val CAF_SMART_AUTH_CANCEL_EVENT = "CafSmartAuth_Cancel"
private const val CAF_SMART_AUTH_LOADING_EVENT = "CafSmartAuth_Loading"
private const val CAF_SMART_AUTH_LOADED_EVENT = "CafSmartAuth_Loaded"
private const val CAF_WRITABLE_MAP_IS_AUTHORIZED = "isAuthorized"
private const val CAF_WRITABLE_MAP_ATTEMPT_ID = "attemptId"
private const val CAF_WRITABLE_MAP_ATTESTATION = "attestation"
private const val CAF_WRITABLE_MAP_ERROR_MESSAGE = "message"
private const val PERMISSION_ERROR = "PERMISSION_ERROR"
private const val PERMISSION_ERROR_DESCRIPTION = "Erro ao verificar as permissões de localização:"
}
}