Untitled
unknown
plain_text
a year ago
2.6 kB
17
Indexable
override fun detectCard(
onContactCardDetected: () -> Unit,
onContactlessEmvCardDetected: () -> Unit,
onBoomContactlessDetected: () -> Unit,
onTimeOut: () -> Unit,
onError: (errorCode: Int) -> Unit,
onCancelled: () -> Unit
) {
Timber.e("detectCard => Called")
if (this::scope.isInitialized && scope.isActive){
scope.cancel()
}
isDetect = false
job = SupervisorJob()
scope = CoroutineScope(Dispatchers.IO + job)
val timeoutJob = scope.launch {
delay(30000)
if (!isDetect) {
onTimeOut.invoke()
isDetect = true
closeHostCardIfApplicable()
scope.cancel()
}
}
//for card detection we use a timeout of 50 milliseconds
hostCard.activateNfc(onError, 50){
when (hostCard.readAidData()) {
ReadCardAidResult.IsBoom -> {
isDetect = true
scope.cancel()
onBoomContactlessDetected.invoke()
}
ReadCardAidResult.IsCard -> {
if (mShouldEnableEmvContactless) {
closeHostCardIfApplicable()
cardEntryModeUsed = CardEntryMode.NFC
isDetect = true
scope.cancel()
onContactlessEmvCardDetected.invoke()
}
}
ReadCardAidResult.OnError -> {
closeHostCardIfApplicable()
isDetect = true
scope.cancel()
onError.invoke(-11)
}
}
}
scope.launch {
try {
TelpoEmvManager.IccCloseReader()
if (TelpoEmvManager.IccOpenReader() != TelpoEmvManager.EMV_DEVICE_TRUE) {
onError.invoke(4)
}
while (!isDetect) {
if (isCardInserted()) {
closeHostCardIfApplicable()
isDetect = true
cardEntryModeUsed = CardEntryMode.ICC
onContactCardDetected.invoke()
scope.cancel()
}
}
} catch (e: Exception) {
Timber.e(e)
onError.invoke(-1)
} finally {
isDetect = true
timeoutJob.cancel()
this.cancel()
}
}
}Editor is loading...
Leave a Comment