diff --git a/tangem-card-new/src/main/java/com/tangem/CardManager.kt b/tangem-card-new/src/main/java/com/tangem/CardManager.kt index 96cfb5bd03..e04cc98de3 100644 --- a/tangem-card-new/src/main/java/com/tangem/CardManager.kt +++ b/tangem-card-new/src/main/java/com/tangem/CardManager.kt @@ -9,10 +9,9 @@ import com.tangem.tasks.* class CardManager( private val reader: CardReader, - private val cardManagerDelegate: CardManagerDelegate? = null, - dataStorage: DataStorage? = null) { + private val cardManagerDelegate: CardManagerDelegate? = null) { - var isBusy = false + private var isBusy = false private set private val cardEnvironmentRepository = mutableMapOf() @@ -22,13 +21,13 @@ class CardManager( } fun scanCard(callback: (result: TaskEvent) -> Unit) { - val task = ScanTask(cardManagerDelegate, reader) + val task = ScanTask() runTask(task, callback = callback) } fun sign(hashes: Array, cardId: String, callback: (result: TaskEvent) -> Unit) { - var signCommand: SignCommand + val signCommand: SignCommand try { signCommand = SignCommand(hashes, cardId) } catch (error: Exception) { @@ -39,16 +38,34 @@ class CardManager( } return } - val task = SingleCommandTask(signCommand, cardManagerDelegate, reader) + val task = SingleCommandTask(signCommand) runTask(task, cardId, callback) } fun runTask(task: Task, cardId: String? = null, callback: (result: TaskEvent) -> Unit) { // AppExecutors.diskIO().execute { + + if (isBusy) { + callback(TaskEvent.Completion(TaskError.Busy())) + return + } + val environment = fetchCardEnvironment(cardId) isBusy = true - task.run(environment, callback) + + task.reader = reader + task.delegate = cardManagerDelegate + + task.run(environment) { + when (it) { + is TaskEvent.Event -> callback(it) + is TaskEvent.Completion -> { + isBusy = false + callback(it) + } + } + } // } } @@ -59,7 +76,7 @@ class CardManager( fun runCommand(commandSerializer: CommandSerializer, cardId: String? = null, callback: (result: TaskEvent) -> Unit) { - val task = SingleCommandTask(commandSerializer, cardManagerDelegate, reader) + val task = SingleCommandTask(commandSerializer) runTask(task, cardId, callback) } } \ No newline at end of file diff --git a/tangem-card-new/src/main/java/com/tangem/CardManagerDelegate.kt b/tangem-card-new/src/main/java/com/tangem/CardManagerDelegate.kt index 89973ad33d..7409e253fa 100644 --- a/tangem-card-new/src/main/java/com/tangem/CardManagerDelegate.kt +++ b/tangem-card-new/src/main/java/com/tangem/CardManagerDelegate.kt @@ -5,7 +5,6 @@ import com.tangem.tasks.TaskError interface CardManagerDelegate { fun showSecurityDelay(ms: Int) - fun hideSecurityDelay() fun requestPin(success: () -> String, error: (cardError: TaskError.CardError) -> TaskError.CardError) fun openNfcPopup() diff --git a/tangem-card-new/src/main/java/com/tangem/CardReader.kt b/tangem-card-new/src/main/java/com/tangem/CardReader.kt index b0a9772e15..2b45b88b6a 100644 --- a/tangem-card-new/src/main/java/com/tangem/CardReader.kt +++ b/tangem-card-new/src/main/java/com/tangem/CardReader.kt @@ -1,10 +1,11 @@ package com.tangem import com.tangem.common.CompletionResult +import com.tangem.common.apdu.CommandApdu import com.tangem.common.apdu.ResponseApdu interface CardReader { var readingActive: Boolean - fun sendApdu(apduSerialized: ByteArray, callback: (response: CompletionResult) -> Unit) + fun transceiveApdu(apdu: CommandApdu, callback: (response: CompletionResult) -> Unit) fun setStartSession() } \ No newline at end of file diff --git a/tangem-card-new/src/main/java/com/tangem/commands/CheckWalletCommand.kt b/tangem-card-new/src/main/java/com/tangem/commands/CheckWalletCommand.kt index b31101ef68..6f9356bcac 100644 --- a/tangem-card-new/src/main/java/com/tangem/commands/CheckWalletCommand.kt +++ b/tangem-card-new/src/main/java/com/tangem/commands/CheckWalletCommand.kt @@ -27,9 +27,9 @@ class CheckWalletCommand( override fun serialize(cardEnvironment: CardEnvironment): CommandApdu { val tlvData = listOf( - Tlv(TlvTag.Pin, TlvTag.Pin.code, cardEnvironment.pin1.calculateSha256()), - Tlv(TlvTag.CardId, TlvTag.CardId.code, cid.hexToBytes()), - Tlv(TlvTag.Challenge, TlvTag.Challenge.code, challenge) + Tlv(TlvTag.Pin, cardEnvironment.pin1.calculateSha256()), + Tlv(TlvTag.CardId, cid.hexToBytes()), + Tlv(TlvTag.Challenge, challenge) ) return CommandApdu(instructionCode, tlvData) diff --git a/tangem-card-new/src/main/java/com/tangem/commands/CommandSerializer.kt b/tangem-card-new/src/main/java/com/tangem/commands/CommandSerializer.kt index ad201a34a7..56dd5d5566 100644 --- a/tangem-card-new/src/main/java/com/tangem/commands/CommandSerializer.kt +++ b/tangem-card-new/src/main/java/com/tangem/commands/CommandSerializer.kt @@ -3,58 +3,23 @@ package com.tangem.commands import com.tangem.CardEnvironment import com.tangem.common.apdu.CommandApdu import com.tangem.common.apdu.ResponseApdu +import com.tangem.common.extentions.toInt +import com.tangem.common.tlv.TlvTag import com.tangem.enums.Instruction -import com.tangem.tasks.TaskError - -//interface TlvMappable { -// fun responseFromTlv(tlvList: List): CommandResponse? -//} interface CommandResponse -// : TlvMappable { -// -//} -abstract class CommandSerializer() { +abstract class CommandSerializer { abstract val instruction: Instruction abstract val instructionCode: Int abstract fun serialize(cardEnvironment: CardEnvironment): CommandApdu abstract fun deserialize(cardEnvironment: CardEnvironment, responseApdu: ResponseApdu): T? -} - -sealed class CommandEvent { - class Success(val response: Any) : CommandEvent() - class Failure(val taskError: TaskError) : CommandEvent() - class UserCancellation : CommandEvent() -} - -//class CheckWalletResponse( -// val cardId: String, -// val salt: ByteArray, -// val walletSignature: ByteArray -//) : CommandResponse, TlvMappable by CheckWalletResponse { -// -// companion object : TlvMappable { -// override fun responseFromTlv(tlvList: List): CommandResponse? { -// val mapper = TlvMapper(tlvList) -// -// return try { -// CheckWalletResponse( -// mapper.map(TlvTag.CardId), -// mapper.map(TlvTag.Salt), -// mapper.map(TlvTag.Signature) -// ) -// } catch (exception: TlvMapperException) { -// null -// } -// } -// -// } -//} - - - + fun deserializeSecurityDelay(responseApdu: ResponseApdu, cardEnvironment: CardEnvironment): Int? { + val tlv = responseApdu.getTlvData(cardEnvironment.encryptionKey) + return tlv?.find { it.tag == TlvTag.Pause }?.value?.toInt() + } +} \ No newline at end of file diff --git a/tangem-card-new/src/main/java/com/tangem/commands/ReadCardCommand.kt b/tangem-card-new/src/main/java/com/tangem/commands/ReadCardCommand.kt index 41e99c4b37..16cc9e4677 100644 --- a/tangem-card-new/src/main/java/com/tangem/commands/ReadCardCommand.kt +++ b/tangem-card-new/src/main/java/com/tangem/commands/ReadCardCommand.kt @@ -100,13 +100,10 @@ class ReadCardCommand : CommandSerializer() { override fun serialize(cardEnvironment: CardEnvironment): CommandApdu { - val tlvData = mutableListOf( - Tlv(TlvTag.Pin, TlvTag.Pin.code, cardEnvironment.pin1.calculateSha256()) - ) + val tlvData = mutableListOf(Tlv(TlvTag.Pin, cardEnvironment.pin1.calculateSha256())) cardEnvironment.terminalKeys?.let { - Tlv(TlvTag.TerminalPublicKey, - TlvTag.TerminalPublicKey.code, it.publicKey) + Tlv(TlvTag.TerminalPublicKey, it.publicKey) } return CommandApdu(instructionCode, tlvData) diff --git a/tangem-card-new/src/main/java/com/tangem/commands/SignCommand.kt b/tangem-card-new/src/main/java/com/tangem/commands/SignCommand.kt index 5893449400..1260749264 100644 --- a/tangem-card-new/src/main/java/com/tangem/commands/SignCommand.kt +++ b/tangem-card-new/src/main/java/com/tangem/commands/SignCommand.kt @@ -12,6 +12,14 @@ import com.tangem.crypto.sign import com.tangem.enums.Instruction import com.tangem.tasks.TaskError +class SignResponse( + val cardId: String, + val signature: ByteArray, + val remainingSignatures: Int, + val signedHashes: Int +) : CommandResponse + + class SignCommand(private val hashes: Array, private val cardId: String) : CommandSerializer() { @@ -34,12 +42,11 @@ class SignCommand(private val hashes: Array, private val cardId: Stri override fun serialize(cardEnvironment: CardEnvironment): CommandApdu { val tlvData = mutableListOf( - Tlv(TlvTag.Pin, TlvTag.Pin.code, cardEnvironment.pin1.calculateSha256()), - Tlv(TlvTag.Pin2, TlvTag.Pin2.code, cardEnvironment.pin2.calculateSha256()), - Tlv(TlvTag.CardId, TlvTag.CardId.code, cardId.hexToBytes()), - Tlv(TlvTag.TransactionOutHashSize, - TlvTag.TransactionOutHashSize.code, byteArrayOf(hashSizes.toByte())), - Tlv(TlvTag.TransactionOutHash, TlvTag.TransactionOutHash.code, dataToSign) + Tlv(TlvTag.Pin, cardEnvironment.pin1.calculateSha256()), + Tlv(TlvTag.Pin2, cardEnvironment.pin2.calculateSha256()), + Tlv(TlvTag.CardId, cardId.hexToBytes()), + Tlv(TlvTag.TransactionOutHashSize,byteArrayOf(hashSizes.toByte())), + Tlv(TlvTag.TransactionOutHash, dataToSign) ) addTerminalSignature(cardEnvironment, tlvData) @@ -50,9 +57,8 @@ class SignCommand(private val hashes: Array, private val cardId: Stri private fun addTerminalSignature(cardEnvironment: CardEnvironment, tlvData: MutableList) { cardEnvironment.terminalKeys?.let { val signedData = dataToSign.sign(it.privateKey) - tlvData.add(Tlv(TlvTag.TerminalTransactionSignature, - TlvTag.TerminalTransactionSignature.code, signedData)) - tlvData.add(Tlv(TlvTag.TerminalPublicKey, TlvTag.TerminalPublicKey.code, it.publicKey)) + tlvData.add(Tlv(TlvTag.TerminalTransactionSignature, signedData)) + tlvData.add(Tlv(TlvTag.TerminalPublicKey, it.publicKey)) } } @@ -67,11 +73,4 @@ class SignCommand(private val hashes: Array, private val cardId: Stri tlvMapper.map(TlvTag.SignedHashes) ) } -} - -class SignResponse( - val cardId: String, - val signature: ByteArray, - val remainingSignatures: Int, - val signedHashes: Int -) : CommandResponse \ No newline at end of file +} \ No newline at end of file diff --git a/tangem-card-new/src/main/java/com/tangem/common/apdu/CommandApdu.kt b/tangem-card-new/src/main/java/com/tangem/common/apdu/CommandApdu.kt index 103d88649e..1fee89160a 100644 --- a/tangem-card-new/src/main/java/com/tangem/common/apdu/CommandApdu.kt +++ b/tangem-card-new/src/main/java/com/tangem/common/apdu/CommandApdu.kt @@ -19,10 +19,14 @@ class CommandApdu( private val encryptionMode: EncryptionMode = EncryptionMode.NONE, private val encryptionKey: ByteArray? = null) { + val apduData: ByteArray - fun toBytes(): ByteArray { + init { + apduData = toBytes() + } -// var length = 4 // CLA, INS, P1, P2 + + private fun toBytes(): ByteArray { val data = if (tlvList.isNotEmpty()) { tlvList.toBytes() @@ -31,13 +35,6 @@ class CommandApdu( } val lc = data.size -// -// if (data.isNotEmpty()) { -// length += 1 // LC -// if (lc >= 256) -// length += 2 -// length += data.size // DATA -// } val byteStream = ByteArrayOutputStream() @@ -50,45 +47,13 @@ class CommandApdu( byteStream.write(data) } return byteStream.toByteArray() - -// val apdu = ByteArray(length) -// -// var index = 0 -// apdu[index] = cla -// index++ -// apdu[index] = instruction -// index++ -// apdu[index] = p1 -// index++ -// apdu[index] = p2 -// index++ -// if (lc != 0) { -// if (lc < 256) { -// apdu[index] = lc.toByte() -// index++ -// } else { -// apdu[index] = 0 -// index++ -// apdu[index] = (lc shr 8).toByte() -// index++ -// apdu[index] = (lc and 0xFF).toByte() -// index++ -// } -// -// System.arraycopy(data, 0, apdu, index, data.size) -// index += data.size -// } -// return apdu } private fun writeLength(stream: ByteArrayOutputStream, lc: Int) { -// if (lc < 256) { -// stream.write(lc) -// } else { - stream.write(0) - stream.write(lc shr 8) - stream.write(lc and 0xFF) -// } + + stream.write(0) + stream.write(lc shr 8) + stream.write(lc and 0xFF) } diff --git a/tangem-card-new/src/main/java/com/tangem/common/apdu/ResponseApdu.kt b/tangem-card-new/src/main/java/com/tangem/common/apdu/ResponseApdu.kt index c35b699505..8a4b7ba79f 100644 --- a/tangem-card-new/src/main/java/com/tangem/common/apdu/ResponseApdu.kt +++ b/tangem-card-new/src/main/java/com/tangem/common/apdu/ResponseApdu.kt @@ -5,8 +5,8 @@ import com.tangem.enums.Status class ResponseApdu(val data: ByteArray) { - val sw1: Int = 0x00FF and data[data.size - 2].toInt() - val sw2: Int = 0x00FF and data[data.size - 1].toInt() + private val sw1: Int = 0x00FF and data[data.size - 2].toInt() + private val sw2: Int = 0x00FF and data[data.size - 1].toInt() val sw: Int = sw1 shl 8 or sw2 diff --git a/tangem-card-new/src/main/java/com/tangem/common/tlv/Tlv.kt b/tangem-card-new/src/main/java/com/tangem/common/tlv/Tlv.kt index 7ccd7d11b2..2f58f5d3e8 100644 --- a/tangem-card-new/src/main/java/com/tangem/common/tlv/Tlv.kt +++ b/tangem-card-new/src/main/java/com/tangem/common/tlv/Tlv.kt @@ -3,53 +3,68 @@ package com.tangem.common.tlv import java.io.ByteArrayInputStream import java.io.IOException -class Tlv(val tag: TlvTag, val tagCode: Int, val value: ByteArray = byteArrayOf()) { +class Tlv { + + val tag: TlvTag + val value: ByteArray + val tagCode: Int + + constructor(tagCode: Int, value: ByteArray = byteArrayOf()) { + this.tag = TlvTag.byCode(tagCode) + this.tagCode = tagCode + this.value = value + } + + constructor(tag: TlvTag, value: ByteArray = byteArrayOf()) { + this.tag = tag + this.tagCode = tag.code + this.value = value + } -companion object { - fun tlvFromBytes(stream: ByteArrayInputStream): Tlv? { - val code = stream.read() - if (code == -1) return null - var len = stream.read() - if (len == -1) - throw IOException("Can't read TLV") - if (len == 0xFF) { - val lenH = stream.read() - if (lenH == -1) - throw IOException("Can't read TLV") - len = stream.read() + companion object { + fun tlvFromBytes(stream: ByteArrayInputStream): Tlv? { + val code = stream.read() + if (code == -1) return null + var len = stream.read() if (len == -1) throw IOException("Can't read TLV") - len = len or (lenH shl 8) - } - val value = ByteArray(len) - if (len > 0) { - if (len != stream.read(value)) { - throw IOException("Can't read TLV") + if (len == 0xFF) { + val lenH = stream.read() + if (lenH == -1) + throw IOException("Can't read TLV") + len = stream.read() + if (len == -1) + throw IOException("Can't read TLV") + len = len or (lenH shl 8) } - } - val tag = TlvTag.byCode(code) - return Tlv(tag, code, value) - } - - - - fun fromBytes(mData: ByteArray): List { - val tlvList = mutableListOf() - val stream = ByteArrayInputStream(mData) - var tlv: Tlv? = null - do { - try { - tlv = Tlv.tlvFromBytes(stream) - if (tlv != null) tlvList.add(tlv) - } catch (e: IOException) { - throw TlvMapperException("TLVError: " + e.message) + val value = ByteArray(len) + if (len > 0) { + if (len != stream.read(value)) { + throw IOException("Can't read TLV") + } } + val tag = TlvTag.byCode(code) + return if (tag == TlvTag.Unknown) Tlv(code, value) else Tlv(tag, value) + } - } while (tlv != null) - return tlvList + + fun fromBytes(mData: ByteArray): List { + val tlvList = mutableListOf() + val stream = ByteArrayInputStream(mData) + var tlv: Tlv? = null + do { + try { + tlv = Tlv.tlvFromBytes(stream) + if (tlv != null) tlvList.add(tlv) + } catch (e: IOException) { + throw TlvMapperException("TLVError: " + e.message) + } + + } while (tlv != null) + return tlvList + } } -} } diff --git a/tangem-card-new/src/main/java/com/tangem/tasks/ScanTask.kt b/tangem-card-new/src/main/java/com/tangem/tasks/ScanTask.kt index 9f964224e8..75c2b4c52b 100644 --- a/tangem-card-new/src/main/java/com/tangem/tasks/ScanTask.kt +++ b/tangem-card-new/src/main/java/com/tangem/tasks/ScanTask.kt @@ -1,8 +1,6 @@ package com.tangem.tasks import com.tangem.CardEnvironment -import com.tangem.CardManagerDelegate -import com.tangem.CardReader import com.tangem.commands.CheckWalletCommand import com.tangem.commands.EllipticCurve import com.tangem.commands.ReadCardCommand @@ -16,7 +14,7 @@ sealed class ScanEvent { } -internal class ScanTask(delegate: CardManagerDelegate? = null, reader: CardReader) : Task(delegate, reader) { +internal class ScanTask : Task() { private lateinit var readCardData: ReadCardResponse private lateinit var challenge: ByteArray diff --git a/tangem-card-new/src/main/java/com/tangem/tasks/SingleCommandTask.kt b/tangem-card-new/src/main/java/com/tangem/tasks/SingleCommandTask.kt index dd5b3b098d..a4952bbc89 100644 --- a/tangem-card-new/src/main/java/com/tangem/tasks/SingleCommandTask.kt +++ b/tangem-card-new/src/main/java/com/tangem/tasks/SingleCommandTask.kt @@ -1,15 +1,11 @@ package com.tangem.tasks import com.tangem.CardEnvironment -import com.tangem.CardManagerDelegate -import com.tangem.CardReader import com.tangem.commands.CommandResponse import com.tangem.commands.CommandSerializer class SingleCommandTask( - private val commandSerializer: CommandSerializer, - delegate: CardManagerDelegate? = null, - reader: CardReader) : Task(delegate, reader) { + private val commandSerializer: CommandSerializer) : Task() { override fun onRun(cardEnvironment: CardEnvironment, callback: (result: TaskEvent) -> Unit) { diff --git a/tangem-card-new/src/main/java/com/tangem/tasks/Task.kt b/tangem-card-new/src/main/java/com/tangem/tasks/Task.kt index 6d86e26ebf..c27c548cd5 100644 --- a/tangem-card-new/src/main/java/com/tangem/tasks/Task.kt +++ b/tangem-card-new/src/main/java/com/tangem/tasks/Task.kt @@ -7,17 +7,18 @@ import com.tangem.Log import com.tangem.commands.CommandResponse import com.tangem.commands.CommandSerializer import com.tangem.common.CompletionResult -import com.tangem.common.extentions.toInt -import com.tangem.common.tlv.TlvTag import com.tangem.enums.Status -abstract class Task(protected val delegate: CardManagerDelegate? = null, protected val reader: CardReader) { +abstract class Task { + + var delegate: CardManagerDelegate? = null + var reader: CardReader? = null fun run(cardEnvironment: CardEnvironment, callback: (result: TaskEvent) -> Unit) { delegate?.openNfcPopup() - reader.setStartSession() + reader?.setStartSession() Log.i(this::class.simpleName!!, "Nfc task is started") onRun(cardEnvironment, callback) @@ -34,8 +35,8 @@ abstract class Task(protected val delegate: CardManagerDelegate? = null, prot Log.i(this::class.simpleName!!, "Nfc command ${commandSerializer::class.simpleName!!} is initiated") - reader.sendApdu( - commandSerializer.serialize(cardEnvironment).toBytes()) { result -> + reader?.transceiveApdu( + commandSerializer.serialize(cardEnvironment)) { result -> when (result) { is CompletionResult.Success -> { @@ -61,10 +62,9 @@ abstract class Task(protected val delegate: CardManagerDelegate? = null, prot Status.InsNotSupported -> callback(TaskEvent.Completion(TaskError.InsNotSupported())) Status.NeedEncryption -> callback(TaskEvent.Completion(TaskError.NeedEncryption())) Status.NeedPause -> { - val tlv = responseApdu.getTlvData(cardEnvironment.encryptionKey) - val ms = tlv?.find { it.tag == TlvTag.Pause }?.value?.toInt() - if (ms != null) delegate?.showSecurityDelay(ms) - Log.i(this::class.simpleName!!, "Nfc command ${commandSerializer::class.simpleName!!} triggered security delay of $ms milliseconds") + val remainingTime = commandSerializer.deserializeSecurityDelay(responseApdu, cardEnvironment) + if (remainingTime != null) delegate?.showSecurityDelay(remainingTime) + Log.i(this::class.simpleName!!, "Nfc command ${commandSerializer::class.simpleName!!} triggered security delay of $remainingTime milliseconds") sendCommand(commandSerializer, cardEnvironment, callback) } } @@ -72,7 +72,7 @@ abstract class Task(protected val delegate: CardManagerDelegate? = null, prot is CompletionResult.Failure -> if (result.error is TaskError.UserCancelledError) { callback(TaskEvent.Completion(TaskError.UserCancelledError())) - reader.readingActive = false + reader?.readingActive = false } } @@ -85,6 +85,7 @@ sealed class TaskError(description: String? = null) : Exception(description) { class MappingError : TaskError() class GenericError(description: String? = null) : TaskError(description) class UserCancelledError() : TaskError() + class Busy(): TaskError() class ErrorProcessingCommand : TaskError() class InvalidState : TaskError() @@ -104,12 +105,6 @@ sealed class TaskError(description: String? = null) : Exception(description) { class HashSizeMustBeEqual() : TaskError() } -sealed class TaskResult { - data class Success(val resultData: Any) : TaskResult() - data class CommandCompleted(val resultData: Any) : TaskResult() - data class Error(val error: TaskError) : TaskResult() -} - sealed class TaskEvent { class Event(val data: T) : TaskEvent() class Completion(val error: TaskError? = null) : TaskEvent() diff --git a/tangem-sdk-new/src/main/java/com/tangem/tangem_sdk_new/BasicCardManagerDelegate.kt b/tangem-sdk-new/src/main/java/com/tangem/tangem_sdk_new/DefaultCardManagerDelegate.kt similarity index 88% rename from tangem-sdk-new/src/main/java/com/tangem/tangem_sdk_new/BasicCardManagerDelegate.kt rename to tangem-sdk-new/src/main/java/com/tangem/tangem_sdk_new/DefaultCardManagerDelegate.kt index 82a3ddab11..6fe36f3a39 100644 --- a/tangem-sdk-new/src/main/java/com/tangem/tangem_sdk_new/BasicCardManagerDelegate.kt +++ b/tangem-sdk-new/src/main/java/com/tangem/tangem_sdk_new/DefaultCardManagerDelegate.kt @@ -4,24 +4,23 @@ import androidx.fragment.app.FragmentActivity import com.google.android.material.bottomsheet.BottomSheetDialog import com.tangem.CardManagerDelegate import com.tangem.Log +import com.tangem.tasks.Task import com.tangem.tasks.TaskError import kotlinx.android.synthetic.main.layout_touch_card.* -class BasicCardManagerDelegate(private val activity: FragmentActivity, private val reader: NfcReader) : CardManagerDelegate { +class DefaultCardManagerDelegate(private val activity: FragmentActivity, private val reader: NfcReader) : CardManagerDelegate { private var dialog: BottomSheetDialog? = null + private var task: Task<*>? = null + override fun showSecurityDelay(ms: Int) { // activity.runOnUiThread{ // activity.tv_security_delay?.text = "Security delay. $ms left." // } } - override fun hideSecurityDelay() { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } - override fun requestPin(success: () -> String, error: (cardError: TaskError.CardError) -> TaskError.CardError) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } @@ -48,6 +47,7 @@ class BasicCardManagerDelegate(private val activity: FragmentActivity, private v } dialog?.setOnDismissListener { reader.readingCancelled = false + task = null Log.i(this::class.simpleName!!, "readingCancelled is set to true") } dialog?.show() @@ -56,6 +56,7 @@ class BasicCardManagerDelegate(private val activity: FragmentActivity, private v } override fun closeNfcPopup() { + task = null activity.runOnUiThread { dialog?.dismiss() } diff --git a/tangem-sdk-new/src/main/java/com/tangem/tangem_sdk_new/NfcReader.kt b/tangem-sdk-new/src/main/java/com/tangem/tangem_sdk_new/NfcReader.kt index 47e7ce5e78..8aae5f33a6 100644 --- a/tangem-sdk-new/src/main/java/com/tangem/tangem_sdk_new/NfcReader.kt +++ b/tangem-sdk-new/src/main/java/com/tangem/tangem_sdk_new/NfcReader.kt @@ -5,6 +5,7 @@ import android.nfc.tech.IsoDep import com.tangem.CardReader import com.tangem.Log import com.tangem.common.CompletionResult +import com.tangem.common.apdu.CommandApdu import com.tangem.common.apdu.ResponseApdu import com.tangem.tasks.TaskError @@ -18,7 +19,6 @@ class NfcReader : CardReader { } } override var readingActive = false - var startSession = false var readingCancelled = false set(value) { if (value) readingActive = false @@ -33,9 +33,8 @@ class NfcReader : CardReader { readingCancelled = false } - override fun sendApdu(apduSerialized: ByteArray, callback: (response: CompletionResult) -> Unit) { - data = apduSerialized -// readingActive = true + override fun transceiveApdu(apdu: CommandApdu, callback: (response: CompletionResult) -> Unit) { + data = apdu.apduData this.callback = callback if (isoDep != null) { try { @@ -61,18 +60,12 @@ class NfcReader : CardReader { } fun onTagDiscovered(tag: Tag?) { -// if (readingActive) { -// if (startSession) { -// connect() -// startSession = false -// } isoDep = IsoDep.get(tag) transceiveData() } private fun connect() { -// val timeout = isoDep?.timeout isoDep?.connect() isoDep?.close() isoDep?.connect() diff --git a/tangem-sdk-new/src/main/res/layout/layout_touch_card.xml b/tangem-sdk-new/src/main/res/layout/layout_touch_card.xml index 1cb313a80a..6ba9b2c053 100644 --- a/tangem-sdk-new/src/main/res/layout/layout_touch_card.xml +++ b/tangem-sdk-new/src/main/res/layout/layout_touch_card.xml @@ -5,7 +5,7 @@ android:layout_width="400dp" android:layout_height="250dp" android:gravity="center_vertical|center_horizontal" - tools:ignore="contentDescription"> + > @@ -11,7 +11,7 @@