Updated on 2026-08-14

This commit is contained in:
Tangem 2019-11-08 11:11:18 +03:00
parent bfa7d5dbcd
commit 649cc98fd5
13 changed files with 106 additions and 49 deletions

View file

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id=":tangem-card-old" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="android-gradle" name="Android-Gradle">
<configuration>
<option name="GRADLE_PROJECT_PATH" value=":tangem-card-old" />
<option name="LAST_SUCCESSFUL_SYNC_AGP_VERSION" />
<option name="LAST_KNOWN_AGP_VERSION" />
</configuration>
</facet>
<facet type="java-gradle" name="Java-Gradle">
<configuration>
<option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
<option name="BUILDABLE" value="true" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7">
<output url="file://$MODULE_DIR$/build/classes/java/main" />
<output-test url="file://$MODULE_DIR$/build/classes/java/test" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<excludeFolder url="file://$MODULE_DIR$/.gradle" />
<excludeFolder url="file://$MODULE_DIR$/build" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" exported="" name="Gradle: prov-1.56.0.0" level="project" />
<orderEntry type="library" exported="" name="Gradle: core-1.56.0.0" level="project" />
<orderEntry type="library" exported="" name="Gradle: eddsa-0.3.0" level="project" />
</component>
</module>

View file

@ -2,13 +2,13 @@ package com.tangem.commands
import com.tangem.CardEnvironment
import com.tangem.common.apdu.CommandApdu
import com.tangem.common.apdu.Instruction
import com.tangem.common.apdu.ResponseApdu
import com.tangem.common.extentions.calculateSha256
import com.tangem.common.extentions.hexToBytes
import com.tangem.common.tlv.Tlv
import com.tangem.common.tlv.TlvMapper
import com.tangem.common.tlv.TlvTag
import com.tangem.enums.Instruction
import com.tangem.tasks.TaskError
class CheckWalletResponse(

View file

@ -2,10 +2,10 @@ package com.tangem.commands
import com.tangem.CardEnvironment
import com.tangem.common.apdu.CommandApdu
import com.tangem.common.apdu.Instruction
import com.tangem.common.apdu.ResponseApdu
import com.tangem.common.extentions.toInt
import com.tangem.common.tlv.TlvTag
import com.tangem.enums.Instruction
interface CommandResponse

View file

@ -2,13 +2,13 @@ package com.tangem.commands
import com.tangem.CardEnvironment
import com.tangem.common.apdu.CommandApdu
import com.tangem.common.apdu.Instruction
import com.tangem.common.apdu.ResponseApdu
import com.tangem.common.extentions.calculateSha256
import com.tangem.common.tlv.Tlv
import com.tangem.common.tlv.TlvMapper
import com.tangem.common.tlv.TlvTag
import com.tangem.data.SettingsMask
import com.tangem.enums.Instruction
import com.tangem.tasks.TaskError
import java.util.*

View file

@ -2,6 +2,7 @@ package com.tangem.commands
import com.tangem.CardEnvironment
import com.tangem.common.apdu.CommandApdu
import com.tangem.common.apdu.Instruction
import com.tangem.common.apdu.ResponseApdu
import com.tangem.common.extentions.calculateSha256
import com.tangem.common.extentions.hexToBytes
@ -9,7 +10,6 @@ import com.tangem.common.tlv.Tlv
import com.tangem.common.tlv.TlvMapper
import com.tangem.common.tlv.TlvTag
import com.tangem.crypto.sign
import com.tangem.enums.Instruction
import com.tangem.tasks.TaskError
class SignResponse(

View file

@ -1,4 +1,4 @@
package com.tangem.enums
package com.tangem.common.apdu
enum class Instruction(var code: Int) {
Unknown(0x00),

View file

@ -31,7 +31,7 @@ class ResponseApdu(val data: ByteArray) {
}
private fun decrypt(encryptionKey: ByteArray) {
TODO("not implemented")
}
}

View file

@ -1,4 +1,4 @@
package com.tangem.enums
package com.tangem.common.apdu
enum class StatusWord (val code: Int, val description: String){

View file

@ -38,7 +38,7 @@ internal class ScanTask : Task<ScanEvent>() {
curve = cardData.curve!!
walletPublickKey = cardData.walletPublicKey!!
} else {
delegate?.onTaskError()
onTaskCompleted(true)
callback(TaskEvent.Completion(TaskError.CardError()))
}
@ -53,16 +53,18 @@ internal class ScanTask : Task<ScanEvent>() {
checkWalletResponse.walletSignature,
curve)
if (verified) {
delegate?.onTaskCompleted()
onTaskCompleted()
callback(TaskEvent.Completion())
callback(TaskEvent.Event(ScanEvent.OnVerifyEvent(true)))
} else {
delegate?.onTaskError()
onTaskCompleted(true)
callback(TaskEvent.Completion(TaskError.VefificationFailed()))
}
}
is CompletionResult.Failure -> {
if (checkWalletEvent.error !is TaskError.UserCancelledError) delegate?.onTaskError()
if (checkWalletEvent.error !is TaskError.UserCancelledError) {
onTaskCompleted(true, checkWalletEvent.error)
}
callback(TaskEvent.Completion(checkWalletEvent.error))
}
}
@ -70,7 +72,9 @@ internal class ScanTask : Task<ScanEvent>() {
}
}
is CompletionResult.Failure -> {
if (readEvent.error !is TaskError.UserCancelledError) delegate?.onTaskError()
if (readEvent.error !is TaskError.UserCancelledError) {
onTaskCompleted(true, readEvent.error)
}
callback(TaskEvent.Completion(readEvent.error))
}
}

View file

@ -10,16 +10,18 @@ class SingleCommandTask<Event : CommandResponse>(
override fun onRun(cardEnvironment: CardEnvironment,
callback: (result: TaskEvent<Event>) -> Unit) {
sendCommand(commandSerializer, cardEnvironment) {
when (it) {
sendCommand(commandSerializer, cardEnvironment) { completionResult ->
when (completionResult) {
is CompletionResult.Success -> {
delegate?.onTaskCompleted()
callback(TaskEvent.Event(it.data))
onTaskCompleted()
callback(TaskEvent.Event(completionResult.data))
callback(TaskEvent.Completion())
}
is CompletionResult.Failure -> {
if (it.error !is TaskError.UserCancelledError) delegate?.onTaskError()
callback(TaskEvent.Completion(it.error))
if (completionResult.error !is TaskError.UserCancelledError) {
onTaskCompleted(true, completionResult.error)
}
callback(TaskEvent.Completion(completionResult.error))
}
}
}

View file

@ -7,7 +7,7 @@ import com.tangem.Log
import com.tangem.commands.CommandResponse
import com.tangem.commands.CommandSerializer
import com.tangem.common.CompletionResult
import com.tangem.enums.StatusWord
import com.tangem.common.apdu.StatusWord
abstract class Task<T> {
@ -22,8 +22,17 @@ abstract class Task<T> {
onRun(cardEnvironment, callback)
}
abstract fun onRun(cardEnvironment: CardEnvironment,
callback: (result: TaskEvent<T>) -> Unit)
protected fun onTaskCompleted(withError: Boolean = false, taskError: TaskError? = null) {
reader?.closeSession()
if (withError) {
delegate?.onTaskError(taskError)
} else {
delegate?.onTaskCompleted()
}
}
protected abstract fun onRun(cardEnvironment: CardEnvironment,
callback: (result: TaskEvent<T>) -> Unit)
protected fun <T : CommandResponse> sendCommand(
commandSerializer: CommandSerializer<T>,
@ -75,31 +84,9 @@ abstract class Task<T> {
}
}
sealed class TaskError(description: String? = null) : Exception(description) {
class UnknownStatus(sw: Int) : TaskError()
class MappingError : TaskError()
class GenericError(description: String? = null) : TaskError(description)
class UserCancelledError() : TaskError()
class Busy() : TaskError()
class ErrorProcessingCommand : TaskError()
class InvalidState : TaskError()
class InsNotSupported : TaskError()
class InvalidParams : TaskError()
class NeedEncryption : TaskError()
class NeedPause : TaskError()
class VefificationFailed : TaskError()
class CardError : TaskError()
class ReaderError() : TaskError()
class SerializeCommandError() : TaskError()
class CardIsMissing() : TaskError()
class EmptyHashes() : TaskError()
class TooMuchHashes() : TaskError()
class HashSizeMustBeEqual() : TaskError()
}
/**
* Returns in callback from tasks
*/
sealed class TaskEvent<T> {
class Event<T>(val data: T) : TaskEvent<T>()
class Completion<T>(val error: TaskError? = null) : TaskEvent<T>()

View file

@ -0,0 +1,30 @@
package com.tangem.tasks
/**
* An error class that covers typical errors that may occur when performing Tangem SDK tasks.
* Errors are got propagated back within callbacks.
*/
sealed class TaskError(description: String? = null) : Exception(description) {
class UnknownStatus(sw: Int) : TaskError()
class MappingError : TaskError()
class GenericError(description: String? = null) : TaskError(description)
class UserCancelledError() : TaskError()
class Busy() : TaskError()
class ErrorProcessingCommand : TaskError()
class InvalidState : TaskError()
class InsNotSupported : TaskError()
class InvalidParams : TaskError()
class NeedEncryption : TaskError()
class NeedPause : TaskError()
class VefificationFailed : TaskError()
class CardError : TaskError()
class ReaderError() : TaskError()
class SerializeCommandError() : TaskError()
class CardIsMissing() : TaskError()
class EmptyHashes() : TaskError()
class TooMuchHashes() : TaskError()
class HashSizeMustBeEqual() : TaskError()
}

View file

@ -47,7 +47,7 @@ class DefaultCardManagerDelegate(private val reader: NfcReader) : CardManagerDel
}
readingDialog?.setOnCancelListener {
reader.readingCancelled = true
// reader.closeSession()
reader.closeSession()
Log.i(this::class.simpleName!!, "readingCancelled is set to true")
}
readingDialog?.show()
@ -70,7 +70,6 @@ class DefaultCardManagerDelegate(private val reader: NfcReader) : CardManagerDel
}
override fun onTaskCompleted() {
reader.closeSession()
postUI {
readingDialog?.lTouchCard?.visibility = View.GONE
readingDialog?.flSecurityDelay?.visibility = View.GONE
@ -81,7 +80,6 @@ class DefaultCardManagerDelegate(private val reader: NfcReader) : CardManagerDel
}
override fun onTaskError(error: TaskError?) {
reader.closeSession()
postUI {
readingDialog?.lTouchCard?.visibility = View.GONE
readingDialog?.flSecurityDelay?.visibility = View.GONE