diff --git a/IdentityVerification/IdentityVerificationKotlinExample/app/build.gradle b/IdentityVerification/IdentityVerificationKotlinExample/app/build.gradle index f7609ce..c4f3201 100644 --- a/IdentityVerification/IdentityVerificationKotlinExample/app/build.gradle +++ b/IdentityVerification/IdentityVerificationKotlinExample/app/build.gradle @@ -45,7 +45,7 @@ dependencies { testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' - implementation("com.ts.sdk:identityverification:1.0.+") + implementation("com.ts.sdk:identityverification:1.1.+") implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.google.code.gson:gson:2.9.0' diff --git a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/Constants.kt b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/Constants.kt index 121b81f..00b43c8 100644 --- a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/Constants.kt +++ b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/Constants.kt @@ -3,8 +3,8 @@ package com.transmitsecurity.idvsdkdemoapp class Constants { companion object { - const val CLIENT_ID = "client_id" - const val CLIENT_SECRET = "client_secret" + const val CLIENT_ID = "CLIENT_ID" + const val CLIENT_SECRET = "CLIENT_SECRET" } } \ No newline at end of file diff --git a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/MainActivity.kt b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/MainActivity.kt index f0dd567..931ff1c 100644 --- a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/MainActivity.kt +++ b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/MainActivity.kt @@ -11,63 +11,131 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment -import com.transmit.identityverification.TSIdentityVerification -import com.transmit.identityverification.ITSIdentityVerificationStatus -import com.transmit.identityverification.TSIdentityVerificationError -import com.transmit.identityverification.TSRecaptureReason - - +import com.transmit.identityverification.* import com.transmitsecurity.idvsdkdemoapp.fragments.* import com.transmitsecurity.idvsdkdemoapp.viewmodel.IdvViewModel - -class MainActivity : AppCompatActivity(), ITSIdentityVerificationStatus, +class MainActivity : AppCompatActivity(), ITSIdentityVerificationStatus,ITSFaceAuthenticationStatus, PreparationFragmentActions { + companion object { + private const val BASE_URL = "https://api.transmitsecurity.io/" + private const val START_SDK = 101 + private const val START_FACE_AUTH_SDK = 102 + } + private var accessToken :String?= null private lateinit var startToken :String + private var sessionIdVerification :String = "" + private var accessTokenFaceAuthentication :String?= null + private var startTokenFaceAuthentication :String = "" + private var sessionIdFaceAuthentication :String = "" + private var deviceSessionIdFaceAuthentication: String = "" + private var deviceSessionIdFaceAuthenticationResult: String = "" + private val viewModel: IdvViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { + savedInstanceState?.putString("WORKAROUND_FOR_BUG_19917_KEY", "WORKAROUND_FOR_BUG_19917_VALUE") super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) + + + setContentView(R.layout.activity_main) manageFragments(PreparationFragment()) + viewModel.accessToken.observe(this ) { newAccessToken -> accessToken=newAccessToken - viewModel.createSessionId("https://api.transmitsecurity.io/") + viewModel.createSessionId(BASE_URL) } viewModel.startToken.observe(this ) { newStartToken -> startToken=newStartToken - isCameraPermissionsGranted() + isCameraPermissionsGranted(START_SDK) + + } + + viewModel.sessionIdVerification.observe( + this + ) { newSessionId -> + sessionIdVerification = newSessionId } + viewModel.accessTokenFaceAuthentication.observe( + this + ) { newAccessToken -> + accessTokenFaceAuthentication = newAccessToken + viewModel.createSessionIdForFaceAuth(BASE_URL) + + } + viewModel.startTokenFaceAuthentication.observe( + this + ) { newStartToken -> + startTokenFaceAuthentication = newStartToken + } + viewModel.sessionIdFaceAuthentication.observe( + this + ) { newSessionIdFaceAuth -> + sessionIdFaceAuthentication = newSessionIdFaceAuth + viewModel.createDeviceSessionIdForFaceAuth( + BASE_URL, + "verification-session-reference",sessionIdVerification) + } + + + + viewModel.deviceSessionIdFaceAuthentication.observe( + this + ) { newDeviceSessionId -> + deviceSessionIdFaceAuthentication = newDeviceSessionId + isCameraPermissionsGranted(START_FACE_AUTH_SDK) + } + + viewModel.sessionIdFaceAuthenticationSessionResult.observe( + this + ) { newDeviceSessionId -> + deviceSessionIdFaceAuthenticationResult = newDeviceSessionId + } + + } override fun onStart() { super.onStart() TSIdentityVerification.registerForStatus(this) + TSIdentityVerification.registerForFaceAuthStatus(this) } - - private fun isCameraPermissionsGranted() { + private fun isCameraPermissionsGranted(requestCode: Int) { // Check if the camera permission is granted - if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { - // Camera permission granted, start Identity Verification here - TSIdentityVerification.start(this, startToken) - } else { - // Request camera permission - ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.CAMERA), 101) + if (ContextCompat.checkSelfPermission( + this, + android.Manifest.permission.CAMERA + ) == PackageManager.PERMISSION_GRANTED + ) { + if (requestCode == START_SDK) { + // Camera permission granted, start Identity Verification here + TSIdentityVerification.start(this, startToken) + } else if (requestCode == START_FACE_AUTH_SDK) { + TSIdentityVerification.startFaceAuth(this, deviceSessionIdFaceAuthentication) + } + }else { + // Request camera permission + ActivityCompat.requestPermissions( + this, + arrayOf(android.Manifest.permission.CAMERA), + requestCode + ) + } } - } + // Handle the result of the permission request override fun onRequestPermissionsResult( @@ -76,15 +144,18 @@ class MainActivity : AppCompatActivity(), ITSIdentityVerificationStatus, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == 101) { - if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Camera permission granted, start Identity Verification here TSIdentityVerification.start(this, startToken) - } else { + } + else if (requestCode == 102) { + // Camera permission granted, start Face Authentication here + TSIdentityVerification.startFaceAuth(this,deviceSessionIdFaceAuthentication) + }else { // Camera permission denied, handle unauthorized state Log.d("Camera permissions","Camera permissions denied") } } - } + override fun verificationStartCapturing() { Log.d("verificationDidReceiveStatus", "verificationCapturing") @@ -138,17 +209,62 @@ class MainActivity : AppCompatActivity(), ITSIdentityVerificationStatus, } - override fun start() { - viewModel.getAccessToken("https://api.transmitsecurity.io","client_credentials",Constants.CLIENT_ID, Constants.CLIENT_SECRET) + viewModel.getAccessToken(BASE_URL,"client_credentials",Constants.CLIENT_ID, Constants.CLIENT_SECRET) + + } + + + override fun startFaceAuth() { + viewModel.getAccessTokenForFaceAuth( + BASE_URL, + "client_credentials", + Constants.CLIENT_ID, Constants.CLIENT_SECRET) } + private fun manageFragments(fragment: Fragment){ val fragmentManager = supportFragmentManager val fragmentTransaction = fragmentManager.beginTransaction() val fragment = fragment fragmentTransaction.replace(R.id.fragmentContainer, fragment) - fragmentTransaction.commit() + fragmentTransaction.commitAllowingStateLoss() + } + + override fun faceAuthenticationStartCapturing() { + Log.d("faceAuthDidReceiveStatus", "faceAuthCapturing") + } -} + + override fun faceAuthenticationStartProcessing() { + Log.d("faceAuthDidReceiveStatus", "faceAuthProcessing") + manageFragments(FaceAuthProcessingFragment()) + + } + + override fun faceAuthenticationCompleted() { + Log.d("faceAuthDidReceiveStatus", "faceAuthProcessingCompleted") + manageFragments(CompleteFaceAuthFragment()) + } + + override fun faceAuthenticationCanceled() { + Log.d("faceAuthDidReceiveStatus", "faceAuthCanceled") + Toast.makeText(this,"Previous face authentication was canceled", LENGTH_SHORT).show() + + } + + override fun faceAuthenticationFail(error: TSIdentityVerificationError) { + Log.d("faceAuthDidFail", error.name) + when(error.name){ + "CameraPermissionRequired" ->manageFragments(RequiredCameraPermissionsFragment()) + "SdkDisabled" ->manageFragments(ErrorFragment()) + "SessionNotValid" ->manageFragments(ErrorFragment()) + "VerificationStatusError" ->manageFragments(ErrorFragment()) + + } + + + } + } + diff --git a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/MyApplication.kt b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/MyApplication.kt index f8153f9..8cf4227 100644 --- a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/MyApplication.kt +++ b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/MyApplication.kt @@ -11,5 +11,9 @@ open class MyApplication : Application(){ override fun onCreate() { super.onCreate() TSIdentityVerification.initialize(this,Constants.CLIENT_ID) + + + //initialize SDK using parameters from strings.xml + //TSIdentityVerification.initializeSDK(this) } } \ No newline at end of file diff --git a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/fragments/CompleteFaceAuthFragment.kt b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/fragments/CompleteFaceAuthFragment.kt new file mode 100644 index 0000000..84f020d --- /dev/null +++ b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/fragments/CompleteFaceAuthFragment.kt @@ -0,0 +1,33 @@ +package com.transmitsecurity.idvsdkdemoapp.fragments + +import android.graphics.Typeface +import com.transmitsecurity.idvsdkdemoapp.R + +class CompleteFaceAuthFragment:FirstFragment() { + override val title: String + get() = getString(R.string.face_auth_completion_title) + override val visibleBtn: Boolean + get() = true + override val visibleDrawing: Boolean + get() = true + override val subtitle: String + get() = "" + override val btnTxt: String + get() = getString(R.string.new_btn) + override val titleWeight: Typeface + get() = Typeface.create(Typeface.DEFAULT, Typeface.BOLD) + override val subTitleWeight: Typeface + get() = Typeface.create(Typeface.DEFAULT, Typeface.BOLD) + override val drawing: Int + get() = R.drawable.proccess_competion + override val visibleProgressBar: Boolean + get() = false + + override fun myClickListener() { + val newVerification = PreparationFragment() + val transaction = requireActivity().supportFragmentManager.beginTransaction() + transaction.replace(R.id.fragmentContainer, newVerification) + transaction.addToBackStack(null) + transaction.commit() + } +} \ No newline at end of file diff --git a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/fragments/FaceAuthProcessingFragment.kt b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/fragments/FaceAuthProcessingFragment.kt new file mode 100644 index 0000000..21dbf76 --- /dev/null +++ b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/fragments/FaceAuthProcessingFragment.kt @@ -0,0 +1,28 @@ +package com.transmitsecurity.idvsdkdemoapp.fragments + +import android.graphics.Typeface +import com.transmitsecurity.idvsdkdemoapp.R + +class FaceAuthProcessingFragment() : FirstFragment() { + override val title: String + get() = getString(R.string.face_auth_processing_title) + override val visibleBtn: Boolean + get() = false + override val subtitle: String + get() = getString(R.string.processing_sub_title) + override val btnTxt: String + get() ="" + override val titleWeight: Typeface + get() = Typeface.create(Typeface.DEFAULT,Typeface.BOLD) + override val subTitleWeight: Typeface + get() = Typeface.create(Typeface.DEFAULT, Typeface.BOLD) + override val visibleDrawing: Boolean + get() = false + override val drawing: Int + get() = R.drawable.proccess_competion + override val visibleProgressBar: Boolean + get() = true + + override fun myClickListener() { + } +} \ No newline at end of file diff --git a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/fragments/PreparationFragment.kt b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/fragments/PreparationFragment.kt index 1229cc5..21d3753 100644 --- a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/fragments/PreparationFragment.kt +++ b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/fragments/PreparationFragment.kt @@ -11,12 +11,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import com.transmit.identityverification.ui.InitializedActions.StartFaceAuth import com.transmitsecurity.idvsdkdemoapp.R import com.transmitsecurity.idvsdkdemoapp.databinding.PreparationLayoutBinding interface PreparationFragmentActions{ fun start() + fun startFaceAuth() } @@ -36,15 +38,24 @@ class PreparationFragment:Fragment() { (requireActivity() as? PreparationFragmentActions)?.start() } + binding.StartFaceAuthSDK.setOnClickListener { + (requireActivity() as? PreparationFragmentActions)?.startFaceAuth() + } + binding.StartSDK.isEnabled=false + binding.StartFaceAuthSDK.isEnabled=false binding.checkBox.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { binding.StartSDK.isEnabled = true binding.StartSDK.alpha= 1.0f + binding.StartFaceAuthSDK.isEnabled = true + binding.StartFaceAuthSDK.alpha= 1.0f } else { binding.StartSDK.isEnabled = false binding.StartSDK.alpha= 0.5f + binding.StartFaceAuthSDK.isEnabled = true + binding.StartFaceAuthSDK.alpha= 1.0f } } diff --git a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/network/MockServerProvider.kt b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/network/MockServerProvider.kt index 15654df..b7af726 100644 --- a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/network/MockServerProvider.kt +++ b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/network/MockServerProvider.kt @@ -1,6 +1,7 @@ package com.transmitsecurity.idvsdkdemoapp.network import com.transmitsecurity.idvsdkdemoapp.network.helper.ServiceBuilder +import com.transmitsecurity.idvsdkdemoapp.network.requests.* import retrofit2.Call import retrofit2.Callback import retrofit2.Response @@ -35,7 +36,7 @@ class MockServerProvider { } - fun createSession(baseUrl: String, accessToken: String, onResult: (CreateSessionResponse?) -> Unit){ + fun createSession(baseUrl: String, accessToken: String, onResult: (CreateSessionResponse?) -> Unit) { val retrofit = ServiceBuilder.buildService(baseUrl, CreateSessionService::class.java) retrofit.createSession("Bearer $accessToken", CreateSessionRequest()) .enqueue( @@ -43,13 +44,82 @@ class MockServerProvider { override fun onFailure(call: Call, t: Throwable) { onResult(null) } - override fun onResponse(call: Call, response: Response) { + + override fun onResponse( + call: Call, + response: Response + ) { val getAccessTokenResponse = response.body() onResult(getAccessTokenResponse) } } ) + } + + fun createFaceAuthSession(baseUrl: String, accessToken: String, reference: CreateFaceAuthSessionRequest.Reference, onResult: (CreateFaceAuthSessionRequest.CreateFaceAuthSessionResponse?) -> Unit){ + val retrofit = ServiceBuilder.buildService(baseUrl, CreateFaceAuthSessionRequest::class.java) + retrofit.createFaceAuthSession("Bearer $accessToken", CreateFaceAuthSessionRequest.CreateFaceAuthSessionRequest(reference)) + .enqueue( + object : Callback { + + override fun onFailure( + call: Call, + t: Throwable + ) { + onResult(null) + } + + override fun onResponse( + call: Call, + response: Response + ) { + val createFaceAuthSessionResponse = response.body() + onResult(createFaceAuthSessionResponse) + } + } + ) + } + + fun createFaceAuthImageSession(baseUrl: String, accessToken: String, reference: ReferenceImage, onResult: (CreateFaceAuthImageSessionResponse?) -> Unit){ + val retrofit = ServiceBuilder.buildService(baseUrl, CreateFaceAuthImageSessionService::class.java) + retrofit.createFaceAuthImageSession("Bearer $accessToken", CreateFaceAuthImageSessionRequest(reference)) + .enqueue( + object : Callback { + + override fun onFailure( + call: Call, + t: Throwable + ) { + onResult(null) + } + + override fun onResponse( + call: Call, + response: Response + ) { + val createFaceAuthImageSessionResponse = response.body() + onResult(createFaceAuthImageSessionResponse) + } + } + ) + } + + fun createFaceAuthSessionResult(baseUrl: String, accessToken: String, deviceSessionId:String, onResult: (CreateFaceAuthSessionResultResponse?) -> Unit){ + val retrofit = ServiceBuilder.buildService(baseUrl, CreateFaceAuthSessionResultRequest::class.java) + retrofit.createFaceAuthSessionResult("Bearer $accessToken", deviceSessionId ) + .enqueue( + object : Callback { + override fun onFailure(call: Call, t: Throwable) { + onResult(null) + } + override fun onResponse(call: Call, response: Response) { + val createFaceAuthSessionResultResponse = response.body() + onResult(createFaceAuthSessionResultResponse) + } + + } + ) + } } -} \ No newline at end of file diff --git a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/network/requests/CreateFaceAuthImageSessionRequest.kt b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/network/requests/CreateFaceAuthImageSessionRequest.kt new file mode 100644 index 0000000..d1df056 --- /dev/null +++ b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/network/requests/CreateFaceAuthImageSessionRequest.kt @@ -0,0 +1,18 @@ +package com.transmitsecurity.idvsdkdemoapp.network.requests + +import com.google.gson.annotations.SerializedName +import retrofit2.Call +import retrofit2.http.Body +import retrofit2.http.Header +import retrofit2.http.POST + +interface CreateFaceAuthImageSessionService { + @POST("/verify/api/v1/face-auth") + fun createFaceAuthImageSession(@Header("Authorization") authHeader: String, @Body createFaceAuthImageSessionRequest: CreateFaceAuthImageSessionRequest): Call +} + +data class ReferenceImage(@SerializedName("type") val type:String, @SerializedName("content") val content : String?, @SerializedName("format") val format: String?) + +data class CreateFaceAuthImageSessionRequest(@SerializedName("reference") val reference:ReferenceImage) + +data class CreateFaceAuthImageSessionResponse(@SerializedName("session_id") val sessionId: String, @SerializedName("device_session_id") val deviceSessionId: String) diff --git a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/network/requests/CreateFaceAuthSessionRequest.kt b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/network/requests/CreateFaceAuthSessionRequest.kt new file mode 100644 index 0000000..1bb8343 --- /dev/null +++ b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/network/requests/CreateFaceAuthSessionRequest.kt @@ -0,0 +1,18 @@ +package com.transmitsecurity.idvsdkdemoapp.network.requests + +import com.google.gson.annotations.SerializedName +import retrofit2.Call +import retrofit2.http.Body +import retrofit2.http.Header +import retrofit2.http.POST + +interface CreateFaceAuthSessionRequest { + @POST("/verify/api/v1/face-auth") + fun createFaceAuthSession(@Header("Authorization") authHeader: String, @Body createFaceAuthSessionRequest: CreateFaceAuthSessionRequest): Call + + data class Reference(@SerializedName("type") val type:String, @SerializedName("session_id") val sessionId: String?) + + data class CreateFaceAuthSessionRequest(@SerializedName("reference") val reference:Reference) + + data class CreateFaceAuthSessionResponse(@SerializedName("session_id") val sessionId: String, @SerializedName("device_session_id") val deviceSessionId: String) +} \ No newline at end of file diff --git a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/network/requests/CreateFaceAuthSessionResultRequest.kt b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/network/requests/CreateFaceAuthSessionResultRequest.kt new file mode 100644 index 0000000..aac176a --- /dev/null +++ b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/network/requests/CreateFaceAuthSessionResultRequest.kt @@ -0,0 +1,43 @@ +package com.transmitsecurity.idvsdkdemoapp.network.requests + +import com.google.gson.annotations.SerializedName +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.Path + +enum class Recommendation() { + @SerializedName("ALLOW") + Allow, + + @SerializedName("CHALLENGE") + Challenge, + + @SerializedName("DENY") + Deny, +} + +enum class SessionStatus(){ + @SerializedName("pending") + Pending, + + // Required images (document and selfie) are being added and validated + @SerializedName("capturing") + Capturing, + + // Verification is being processed after receiving all required images (document and selfie) + @SerializedName("processing") + Processing, + + // Verification process was completed (even if the checks didn't pass) + @SerializedName("complete") + Complete, + +} + +interface CreateFaceAuthSessionResultRequest { + @GET("/verify/api/v1/face-auth/{dsid}/result") + fun createFaceAuthSessionResult(@Header("Authorization") authHeader: String, @Path("dsid") deviceSessionId: String): Call +} + +data class CreateFaceAuthSessionResultResponse(@SerializedName("recommendation") val recommendation: Recommendation, @SerializedName("status") val status: SessionStatus) diff --git a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/viewmodel/IdvViewModel.kt b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/viewmodel/IdvViewModel.kt index 0aeef3b..9f23896 100644 --- a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/viewmodel/IdvViewModel.kt +++ b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/java/com/transmitsecurity/idvsdkdemoapp/viewmodel/IdvViewModel.kt @@ -5,6 +5,8 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.transmitsecurity.idvsdkdemoapp.network.GetAccessTokenRequest import com.transmitsecurity.idvsdkdemoapp.network.MockServerProvider +import com.transmitsecurity.idvsdkdemoapp.network.requests.CreateFaceAuthSessionRequest +import com.transmitsecurity.idvsdkdemoapp.network.requests.ReferenceImage class IdvViewModel : ViewModel(){ @@ -19,6 +21,38 @@ class IdvViewModel : ViewModel(){ val startToken: LiveData get() = _startToken + private val _sessionIdVerification = MutableLiveData() + val sessionIdVerification: LiveData + get() = _sessionIdVerification + + private val _accessTokenFaceAuthentication = MutableLiveData() + val accessTokenFaceAuthentication: LiveData + get() = _accessTokenFaceAuthentication + + private val _startTokenFaceAuthentication = MutableLiveData() + val startTokenFaceAuthentication: LiveData + get() = _startTokenFaceAuthentication + + private val _sessionIdFaceAuthentication = MutableLiveData() + val sessionIdFaceAuthentication: LiveData + get() = _sessionIdFaceAuthentication + + private val _sessionIdFaceAuthenticationSessionResult = MutableLiveData() + val sessionIdFaceAuthenticationSessionResult: LiveData + get() = _sessionIdFaceAuthenticationSessionResult + + private val _deviceSessionIdFaceAuthentication = MutableLiveData() + val deviceSessionIdFaceAuthentication: LiveData + get() = _deviceSessionIdFaceAuthentication + + private val _faceAuthenticationRecommendationResult = MutableLiveData() + val faceAuthenticationRecommendationResult: LiveData + get() = _faceAuthenticationRecommendationResult + + private val _faceAuthenticationStatusResult = MutableLiveData() + val faceAuthenticationStatusResult: LiveData + get() = _faceAuthenticationStatusResult + fun getAccessToken(baseUrl:String, grant_type:String,client_id:String,client_secret:String ){ val getAccessApi = MockServerProvider(); getAccessApi.getAccessToken(baseUrl, GetAccessTokenRequest(grant_type,client_id,client_secret)){ @@ -29,7 +63,57 @@ class IdvViewModel : ViewModel(){ fun createSessionId (baseUrl:String ){ val createSessionId = MockServerProvider(); createSessionId.createSession(baseUrl,accessToken.value?:"" ){ - it?.let { _startToken.value=it.startToken?: "" } + it?.let { _startToken.value=it.startToken?: "" + _sessionIdVerification .value=it.sessionId ?: ""} + } + } + + fun getAccessTokenForFaceAuth(baseUrl:String, grant_type:String, client_id:String, client_secret:String ){ + val getAccessApi = MockServerProvider(); + getAccessApi.getAccessToken(baseUrl, GetAccessTokenRequest(grant_type,client_id,client_secret)){ + it?.let { _accessTokenFaceAuthentication.value=it.accessToken?: "" } + } + } + + fun createSessionIdForFaceAuth (baseUrl:String ){ + val createSessionId = MockServerProvider(); + createSessionId.createSession(baseUrl,accessTokenFaceAuthentication.value?:"" ){ + it?.let { _startTokenFaceAuthentication.value=it.startToken?: "" + _sessionIdFaceAuthentication.value=it.sessionId ?: ""} + } + } + + fun createDeviceSessionIdForFaceAuth (baseUrl:String,type:String, sessionIdVerification:String) { + val createDeviceSessionId = MockServerProvider(); + createDeviceSessionId.createFaceAuthSession(baseUrl, accessTokenFaceAuthentication.value ?: "", + CreateFaceAuthSessionRequest.Reference(type, sessionIdVerification) + ) { + it?.let { + _sessionIdFaceAuthenticationSessionResult.value = it.sessionId ?: "" + _deviceSessionIdFaceAuthentication.value = it.deviceSessionId ?: "" + } + } + } + + fun createDeviceSessionIdForFaceAuthWithImage (baseUrl:String,type:String,image:String) { + val createDeviceSessionId = MockServerProvider(); + createDeviceSessionId.createFaceAuthImageSession(baseUrl, accessTokenFaceAuthentication.value ?: "", + ReferenceImage(type,image,"jpeg") ) { + it?.let { + _sessionIdFaceAuthenticationSessionResult.value = it.sessionId ?: "" + _deviceSessionIdFaceAuthentication.value = it.deviceSessionId ?: "" + } + } + } + + fun createFaceAuthSessionResult (baseUrl:String,deviceSessionIdFaceAuthentication:String) { + val createResult = MockServerProvider(); + createResult.createFaceAuthSessionResult(baseUrl, accessTokenFaceAuthentication.value ?: "", + deviceSessionIdFaceAuthentication ) { + it?.let { + _faceAuthenticationRecommendationResult.value = it.recommendation.name + _faceAuthenticationStatusResult.value = it.status.name + } } } } \ No newline at end of file diff --git a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/res/layout/preparation_layout.xml b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/res/layout/preparation_layout.xml index af227a1..24a5fde 100644 --- a/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/res/layout/preparation_layout.xml +++ b/IdentityVerification/IdentityVerificationKotlinExample/app/src/main/res/layout/preparation_layout.xml @@ -173,7 +173,7 @@ android:id="@+id/text5" android:layout_width="256dp" android:layout_height="36dp" - android:layout_marginTop="40dp" + android:layout_marginTop="30dp" android:fontFamily="@font/inter" android:gravity="top" android:text="@string/agreement" @@ -190,7 +190,7 @@ android:layout_width="327dp" android:layout_height="50dp" android:layout_marginStart="24dp" - android:layout_marginTop="30dp" + android:layout_marginTop="5dp" android:layout_marginEnd="24dp" android:layout_marginBottom="100dp" android:text="@string/Start_btn" @@ -200,6 +200,15 @@ app:layout_constraintTop_toBottomOf="@+id/text5" /> +