Updated on 2026-08-14

This commit is contained in:
Tangem 2020-04-28 11:32:49 +00:00
commit b39d24b951
214 changed files with 1116 additions and 912 deletions

View file

@ -53,7 +53,7 @@
<string name="dialog_this_card_has_enforced_security_delay">This card has enforced security delay</string>
<string name="dialog_hold_card">Please hold the card firmly\n until the operation is completed…</string>
<string name="dialog_you_may_be_required_to_repeat">You may be required to repeat this operation a few times depending on the NFC performance of your smartphone.\n This is made for safety of your funds.</string>
<string name="alert_unknown_blockchain">This is a genuine Tangem card. Please follow instructions written on the card to install the official app.</string>
<string name="alert_unknown_blockchain">Uh oh!\nYour Tangem card was made to work with a different application. Please see the name and instructions on your card, and install the correct app.</string>
<!-- menu main -->
<string name="main_menu_manage_pin_1">Manage user PIN1…</string>

View file

@ -1 +1 @@
include ':app', ':tangem-sdk-old', ':server-android', ':tangem-card-old', ':tangem-core', ':tangem-sdk', ':tangem-demo', ':blockchain', ':blockchain-demo'
include ':app', ':tangem-sdk-old', ':server-android', ':tangem-card-old', ':tangem-core', ':tangem-sdk', ':tangem-devkit', ':blockchain', ':blockchain-demo'

View file

@ -0,0 +1,14 @@
package com.tangem
import com.tangem.common.extensions.CardType
import java.util.*
/**
* Filter that can be used to limit cards that can be interacted with in TangemSdk.
*
* @property allowedCardTypes Type of cards that are allowed to be interacted with in TangemSdk.
*/
data class CardFilter(
var allowedCardTypes: EnumSet<CardType> = EnumSet.allOf(CardType::class.java)
)

View file

@ -8,6 +8,7 @@ import com.tangem.common.CompletionResult
import com.tangem.common.apdu.CommandApdu
import com.tangem.common.apdu.ResponseApdu
import com.tangem.common.extensions.calculateSha256
import com.tangem.common.extensions.getType
import com.tangem.crypto.EncryptionHelper
import com.tangem.crypto.FastEncryptionHelper
import com.tangem.crypto.StrongEncryptionHelper
@ -20,7 +21,7 @@ interface CardSessionRunnable<T : CommandResponse> {
/**
* The starting point for custom business logic.
* Implement this interface and use [TangemSdk.startSession] to run.
* Implement this interface and use [TangemSdk.startSessionWithRunnable] to run.
* @param session run commands in this [CardSession].
* @param callback trigger the callback to complete the task.
*/
@ -136,6 +137,12 @@ class CardSession(
callback(CompletionResult.Failure(SessionError.WrongCard()))
return@run
}
val allowedCardTypes = environment.cardFilter.allowedCardTypes
if (!allowedCardTypes.contains(result.data.getType())) {
stopWithError(SessionError.WrongCardType())
callback(CompletionResult.Failure(SessionError.WrongCardType()))
return@run
}
environment.card = result.data
cardId = receivedCardId
callback(CompletionResult.Success(result.data))

View file

@ -18,16 +18,21 @@ class Config(
the correctness of Terminal_Transaction_Signature using previously stored Terminal_PublicKey
and, if correct, will skip security delay for the current SIGN operation.
*/
val linkedTerminal: Boolean = true,
var linkedTerminal: Boolean = true,
/**
* If not null, it will be used to validate Issuer data and issuer extra data.
* If null, issuerPublicKey from current card will be used.
*/
val issuerPublicKey: ByteArray? = null,
var issuerPublicKey: ByteArray? = null,
/**
* Level of encryption used in communication with a Tangem Card.
*/
val encryptionMode: EncryptionMode = EncryptionMode.NONE
var encryptionMode: EncryptionMode = EncryptionMode.NONE,
/**
* Filter that can be used to limit cards that can be interacted with in TangemSdk.
*/
val cardFilter: CardFilter = CardFilter()
)

View file

@ -20,7 +20,8 @@ data class SessionEnvironment(
val terminalKeys: KeyPair? = null,
var encryptionMode: EncryptionMode = EncryptionMode.NONE,
var encryptionKey: ByteArray? = null,
val cvc: ByteArray? = null
val cvc: ByteArray? = null,
var cardFilter: CardFilter
) {
fun setPin1(pin1: String) {

View file

@ -106,6 +106,13 @@ sealed class SessionError(val code: Int) : Exception() {
*/
class HashSizeMustBeEqual : SessionError(3005)
/**
* This error is returned when a user scans a card of a [com.tangem.common.extensions.CardType]
* that is not specified in [Config.allowedCards].
*/
class WrongCardType : SessionError(3006)
/**
* This error is returned when [com.tangem.TangemSdk] was called with a new [Task],
* while a previous [Task] is still in progress.

View file

@ -49,7 +49,7 @@ class TangemSdk(
* in the form of [Card] if the task was performed successfully or [SessionError] in case of an error.
*/
fun scanCard(initialMessage: Message? = null, callback: (result: CompletionResult<Card>) -> Unit) {
startSession(ScanTask(), null, initialMessage, callback)
startSessionWithRunnable(ScanTask(), null, initialMessage, callback)
}
/**
@ -72,7 +72,7 @@ class TangemSdk(
*/
fun sign(hashes: Array<ByteArray>, cardId: String, initialMessage: Message? = null,
callback: (result: CompletionResult<SignResponse>) -> Unit) {
startSession(SignCommand(hashes), cardId, initialMessage, callback)
startSessionWithRunnable(SignCommand(hashes), cardId, initialMessage, callback)
}
/**
@ -90,7 +90,7 @@ class TangemSdk(
*/
fun readIssuerData(cardId: String, initialMessage: Message? = null,
callback: (result: CompletionResult<ReadIssuerDataResponse>) -> Unit) {
startSession(ReadIssuerDataCommand(config.issuerPublicKey), cardId, initialMessage, callback)
startSessionWithRunnable(ReadIssuerDataCommand(config.issuerPublicKey), cardId, initialMessage, callback)
}
/**
@ -109,7 +109,7 @@ class TangemSdk(
*/
fun readIssuerExtraData(cardId: String,
callback: (result: CompletionResult<ReadIssuerExtraDataResponse>) -> Unit) {
startSession(ReadIssuerExtraDataCommand(config.issuerPublicKey), cardId, null, callback)
startSessionWithRunnable(ReadIssuerExtraDataCommand(config.issuerPublicKey), cardId, null, callback)
}
/**
@ -140,7 +140,7 @@ class TangemSdk(
issuerDataCounter,
config.issuerPublicKey
)
startSession(command, cardId, initialMessage, callback)
startSessionWithRunnable(command, cardId, initialMessage, callback)
}
/**
@ -179,7 +179,7 @@ class TangemSdk(
issuerDataCounter,
config.issuerPublicKey
)
startSession(command, cardId, initialMessage, callback)
startSessionWithRunnable(command, cardId, initialMessage, callback)
}
/**
@ -206,7 +206,7 @@ class TangemSdk(
callback: (result: CompletionResult<WriteUserDataResponse>) -> Unit
) {
val command = WriteUserDataCommand(userData, userProtectedData, userCounter, userProtectedCounter)
startSession(command, cardId, initialMessage, callback)
startSessionWithRunnable(command, cardId, initialMessage, callback)
}
/**
@ -228,7 +228,7 @@ class TangemSdk(
*/
fun readUserData(cardId: String, initialMessage: Message? = null,
callback: (result: CompletionResult<ReadUserDataResponse>) -> Unit) {
startSession(ReadUserDataCommand(), cardId, initialMessage, callback)
startSessionWithRunnable(ReadUserDataCommand(), cardId, initialMessage, callback)
}
/**
@ -250,7 +250,7 @@ class TangemSdk(
*/
fun createWallet(cardId: String, initialMessage: Message? = null,
callback: (result: CompletionResult<CreateWalletResponse>) -> Unit) {
startSession(CreateWalletTask(), cardId, initialMessage, callback)
startSessionWithRunnable(CreateWalletTask(), cardId, initialMessage, callback)
}
/**
@ -269,7 +269,7 @@ class TangemSdk(
*/
fun purgeWallet(cardId: String, initialMessage: Message? = null,
callback: (result: CompletionResult<PurgeWalletResponse>) -> Unit) {
startSession(PurgeWalletCommand(), cardId, initialMessage, callback)
startSessionWithRunnable(PurgeWalletCommand(), cardId, initialMessage, callback)
}
/**
@ -287,7 +287,7 @@ class TangemSdk(
* */
fun depersonalize(cardId: String, initialMessage: Message? = null,
callback: (result: CompletionResult<DepersonalizeResponse>) -> Unit) {
startSession(DepersonalizeCommand(), cardId, initialMessage, callback)
startSessionWithRunnable(DepersonalizeCommand(), cardId, initialMessage, callback)
}
/**
@ -313,7 +313,7 @@ class TangemSdk(
initialMessage: Message? = null,
callback: (result: CompletionResult<Card>) -> Unit) {
val command = PersonalizeCommand(config, issuer, manufacturer, acquirer)
startSession(command, null, initialMessage, callback)
startSessionWithRunnable(command, null, initialMessage, callback)
}
/**
@ -330,7 +330,7 @@ class TangemSdk(
* If null, default message will be used.
* @callback: Standard [TangemSdk] callback.
*/
fun <T : CommandResponse> startSession(
fun <T : CommandResponse> startSessionWithRunnable(
runnable: CardSessionRunnable<T>, cardId: String? = null, initialMessage: Message? = null,
callback: (result: CompletionResult<T>) -> Unit) {
val cardSession = CardSession(buildEnvironment(), reader, viewDelegate, cardId, initialMessage)
@ -349,8 +349,7 @@ class TangemSdk(
* @callback: At first, you should check that the [SessionError] is not null,
* then you can use the [CardSession] to interact with a card.
*/
fun <T : CommandResponse> startSession(
cardId: String? = null, initialMessage: Message? = null,
fun startSession(cardId: String? = null, initialMessage: Message? = null,
callback: (session: CardSession, error: SessionError?) -> Unit) {
val cardSession = CardSession(buildEnvironment(), reader, viewDelegate, cardId, initialMessage)
Thread().run { cardSession.start(callback) }
@ -367,7 +366,8 @@ class TangemSdk(
private fun buildEnvironment(): SessionEnvironment {
val terminalKeys = if (config.linkedTerminal) terminalKeysService?.getKeys() else null
return SessionEnvironment(
terminalKeys = terminalKeys
terminalKeys = terminalKeys,
cardFilter = config.cardFilter
)
}

View file

@ -0,0 +1,22 @@
package com.tangem.common.extensions
import com.tangem.commands.Card
fun Card.getType(): CardType {
val firmware = this.firmwareVersion ?: return CardType.Unknown
return when {
firmware.endsWith("d SDK") -> {
CardType.Sdk
}
firmware.endsWith("r") -> {
CardType.Release
}
else -> {
CardType.Unknown
}
}
}
enum class CardType {
Sdk, Release, Unknown
}

View file

@ -1,12 +0,0 @@
package com.tangem.tangemtest._arch.widget
import android.view.ViewGroup
import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget
/**
[REDACTED_AUTHOR]
*/
interface ItemWidgetBuilder {
fun build(item: BaseItem, parent: ViewGroup): ViewWidget?
}

View file

@ -1,15 +0,0 @@
package com.tangem.tangemtest._arch.widget.impl
import android.view.ViewGroup
import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
import com.tangem.tangemtest._arch.structure.abstraction.BaseItemViewModel
import com.tangem.tangemtest._arch.widget.abstraction.BaseViewWidget
/**
[REDACTED_AUTHOR]
*/
class StubWidget(id: Id, parent: ViewGroup) : BaseViewWidget(parent, BaseItem(id, BaseItemViewModel())) {
override fun getLayoutId(): Int = R.layout.w_empty
}

View file

@ -1,31 +0,0 @@
package com.tangem.tangemtest.ucase.domain.paramsManager.managers
import com.tangem.tangemtest._arch.structure.impl.EditTextItem
import com.tangem.tangemtest.ucase.domain.actions.DepersonalizeAction
import com.tangem.tangemtest.ucase.domain.actions.ScanAction
import com.tangem.tangemtest.ucase.domain.actions.SignAction
import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.SignScanConsequence
import com.tangem.tangemtest.ucase.variants.TlvId
/**
[REDACTED_AUTHOR]
*/
class ScanItemsManager : BaseItemsManager(ScanAction())
class DepersonalizeItemsManager : BaseItemsManager(DepersonalizeAction()) {
init {
setItems(listOf(EditTextItem(TlvId.CardId, null)))
}
}
class SignItemsManager : BaseItemsManager(SignAction()) {
init {
setItemChangeConsequences(SignScanConsequence())
setItems(listOf(
EditTextItem(TlvId.CardId, null),
EditTextItem(TlvId.TransactionOutHash, "Data used for hashing")
))
}
}

View file

@ -1,48 +0,0 @@
package com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence
import com.tangem.commands.Card
import com.tangem.commands.EllipticCurve
import com.tangem.common.extensions.calculateSha256
import com.tangem.common.extensions.calculateSha512
import com.tangem.common.extensions.toHexString
import com.tangem.tangemtest._arch.structure.PayloadHolder
import com.tangem.tangemtest._arch.structure.abstraction.Item
import com.tangem.tangemtest._arch.structure.abstraction.findItem
import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey
import com.tangem.tangemtest.ucase.tunnel.ActionView
import com.tangem.tangemtest.ucase.variants.TlvId
import ru.dev.gbixahue.eu4d.lib.android.global.threading.postUI
/**
[REDACTED_AUTHOR]
*
* The ParamsChangeConsequence class family modifies parameters depending on the state
* of the incoming parameter
*/
interface ItemsChangeConsequence {
fun affectChanges(payload: PayloadHolder, changedItem: Item, itemList: List<Item>): List<Item>?
}
class SignScanConsequence : ItemsChangeConsequence {
override fun affectChanges(payload: PayloadHolder, changedItem: Item, itemList: List<Item>): List<Item>? {
if (changedItem.id != TlvId.CardId) return null
val hashItem = itemList.findItem(TlvId.TransactionOutHash) ?: return null
val affectedItems = mutableListOf(hashItem)
val card = payload.remove(PayloadKey.card) as Card?
if (card == null) {
hashItem.restoreDefaultData()
postUI { (payload.get(PayloadKey.actionView) as? ActionView)?.enableActionFab(false) }
} else {
val dataForHashing = hashItem.getData() as? String ?: "Any data mother...s"
val hashedData = when (card.curve) {
EllipticCurve.Secp256k1 -> dataForHashing.calculateSha256()
EllipticCurve.Ed25519 -> dataForHashing.calculateSha512()
else -> return null
}
hashItem.setData(hashedData.toHexString())
}
return affectedItems.toList()
}
}

View file

@ -1,11 +0,0 @@
package com.tangem.tangemtest.ucase.variants
import com.tangem.tangemtest._arch.structure.Id
/**
[REDACTED_AUTHOR]
*/
enum class TlvId : Id {
CardId,
TransactionOutHash,
}

View file

@ -1,13 +0,0 @@
package com.tangem.tangemtest.ucase.variants.depersonalize.ui
import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
import com.tangem.tangemtest.ucase.domain.paramsManager.managers.DepersonalizeItemsManager
import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment
/**
[REDACTED_AUTHOR]
*/
class DepersonalizeActionFragment : BaseCardActionFragment() {
override val itemsManager: ItemsManager by lazy { DepersonalizeItemsManager() }
}

View file

@ -1,12 +0,0 @@
package com.tangem.tangemtest.ucase.variants.responses.item
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.abstraction.BaseItemViewModel
import com.tangem.tangemtest._arch.structure.abstraction.ItemViewModel
import com.tangem.tangemtest._arch.structure.abstraction.ViewState
import com.tangem.tangemtest._arch.structure.impl.TypedItem
open class TextHeaderItem(id: Id, viewModel: ItemViewModel) : TypedItem<String>(id, viewModel) {
constructor(id: Id, value: String? = null, viewState: ViewState = ViewState())
: this(id, BaseItemViewModel(value, viewState))
}

View file

@ -1,23 +0,0 @@
package com.tangem.tangemtest.ucase.variants.responses.ui.widget
import android.view.ViewGroup
import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
import com.tangem.tangemtest._arch.structure.impl.BoolItem
import com.tangem.tangemtest._arch.structure.impl.TextItem
import com.tangem.tangemtest._arch.widget.ItemWidgetBuilder
import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget
import com.tangem.tangemtest.ucase.variants.responses.item.TextHeaderItem
/**
[REDACTED_AUTHOR]
*/
class ResponseItemBuilder : ItemWidgetBuilder {
override fun build(item: BaseItem, parent: ViewGroup): ViewWidget? {
return when (item) {
is TextHeaderItem -> ResponseHeaderWidget(parent, item)
is TextItem -> ResponseTextWidget(parent, item)
is BoolItem -> CheckBoxWidget(parent, item)
else -> null
}
}
}

View file

@ -1,13 +0,0 @@
package com.tangem.tangemtest.ucase.variants.sign.ui
import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
import com.tangem.tangemtest.ucase.domain.paramsManager.managers.SignItemsManager
import com.tangem.tangemtest.ucase.ui.BaseCardActionFragment
/**
[REDACTED_AUTHOR]
*/
class SignActionFragment : BaseCardActionFragment() {
override val itemsManager: ItemsManager by lazy { SignItemsManager() }
}

View file

@ -1,170 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#008577"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

View file

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

View file

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View file

@ -6,7 +6,7 @@ android {
buildToolsVersion "29.0.3"
defaultConfig {
applicationId "com.tangem.tangemtest"
applicationId "com.tangem.devkit"
minSdkVersion 21
targetSdkVersion 29
versionCode 1

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tangem.tangemtest">
package="com.tangem.devkit">
<uses-feature
android:name="android.hardware.nfc"
@ -9,7 +9,7 @@
<application
android:name=".AppTangemDemo"
android:name="com.tangem.devkit.AppTangemDemo"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
@ -17,7 +17,7 @@
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name="._main.MainActivity">
<activity android:name="com.tangem.devkit._main.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
@ -48,7 +48,7 @@
android:resource="@xml/nfc_tech_filter" />
</activity>
<activity android:name=".TestUserDataActivity">
<activity android:name="com.tangem.devkit.TestUserDataActivity">
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -1,11 +1,11 @@
package com.tangem.tangemtest
package com.tangem.devkit
import android.app.Application
import android.content.Context
import android.content.SharedPreferences
import com.tangem.tangemtest._arch.structure.ILog
import com.tangem.tangemtest._arch.structure.ItemLogger
import com.tangem.tangemtest.commons.TangemLogger
import com.tangem.devkit._arch.structure.ILog
import com.tangem.devkit._arch.structure.ItemLogger
import com.tangem.devkit.commons.TangemLogger
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
/**

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest
package com.tangem.devkit
import android.content.Intent
import android.os.Bundle

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest
package com.tangem.devkit
import android.os.Bundle
import android.view.View

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest._arch
package com.tangem.devkit._arch
import android.util.Log
import androidx.annotation.MainThread

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest._arch.structure
package com.tangem.devkit._arch.structure
/**
[REDACTED_AUTHOR]

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest._arch.structure
package com.tangem.devkit._arch.structure
/**
[REDACTED_AUTHOR]

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest._arch.structure
package com.tangem.devkit._arch.structure
import ru.dev.gbixahue.eu4d.lib.android.global.log.Logger
import ru.dev.gbixahue.eu4d.lib.android.global.log.TagLogger

View file

@ -1,6 +1,6 @@
package com.tangem.tangemtest._arch.structure.abstraction
package com.tangem.devkit._arch.structure.abstraction
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.devkit._arch.structure.Id
/**
[REDACTED_AUTHOR]

View file

@ -1,6 +1,6 @@
package com.tangem.tangemtest._arch.structure.abstraction
package com.tangem.devkit._arch.structure.abstraction
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.devkit._arch.structure.Id
/**
[REDACTED_AUTHOR]

View file

@ -1,7 +1,7 @@
package com.tangem.tangemtest._arch.structure.abstraction
package com.tangem.devkit._arch.structure.abstraction
import com.tangem.tangemtest._arch.structure.ILog
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.devkit._arch.structure.ILog
import com.tangem.devkit._arch.structure.Id
/**
[REDACTED_AUTHOR]

View file

@ -1,8 +1,8 @@
package com.tangem.tangemtest._arch.structure.abstraction
package com.tangem.devkit._arch.structure.abstraction
import com.tangem.tangemtest._arch.structure.ILog
import com.tangem.tangemtest._arch.structure.Payload
import com.tangem.tangemtest._arch.structure.PayloadHolder
import com.tangem.devkit._arch.structure.ILog
import com.tangem.devkit._arch.structure.Payload
import com.tangem.devkit._arch.structure.PayloadHolder
/**

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest._arch.structure.abstraction
package com.tangem.devkit._arch.structure.abstraction
import ru.dev.gbixahue.eu4d.lib.kotlin.common.Converter

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest._arch.structure.abstraction
package com.tangem.devkit._arch.structure.abstraction
/**
[REDACTED_AUTHOR]

View file

@ -1,7 +1,7 @@
package com.tangem.tangemtest._arch.structure.impl
package com.tangem.devkit._arch.structure.impl
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.abstraction.*
import com.tangem.devkit._arch.structure.Id
import com.tangem.devkit._arch.structure.abstraction.*
/**
[REDACTED_AUTHOR]

View file

@ -0,0 +1,12 @@
package com.tangem.devkit._arch.widget
import android.view.ViewGroup
import com.tangem.devkit._arch.structure.abstraction.BaseItem
import com.tangem.devkit._arch.widget.abstraction.ViewWidget
/**
[REDACTED_AUTHOR]
*/
interface ItemWidgetBuilder {
fun build(item: BaseItem, parent: ViewGroup): ViewWidget?
}

View file

@ -1,12 +1,12 @@
package com.tangem.tangemtest._arch.widget
package com.tangem.devkit._arch.widget
import android.view.ViewGroup
import com.tangem.tangemtest._arch.structure.abstraction.BaseItem
import com.tangem.tangemtest._arch.structure.abstraction.Item
import com.tangem.tangemtest._arch.structure.abstraction.ItemGroup
import com.tangem.tangemtest._arch.widget.abstraction.ViewWidget
import com.tangem.tangemtest._arch.widget.impl.LinearGroupWidget
import com.tangem.tangemtest._arch.widget.impl.StubWidget
import com.tangem.devkit._arch.structure.abstraction.BaseItem
import com.tangem.devkit._arch.structure.abstraction.Item
import com.tangem.devkit._arch.structure.abstraction.ItemGroup
import com.tangem.devkit._arch.widget.abstraction.ViewWidget
import com.tangem.devkit._arch.widget.impl.LinearGroupWidget
import com.tangem.devkit._arch.widget.impl.StubWidget
/**
[REDACTED_AUTHOR]

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest._arch.widget.abstraction
package com.tangem.devkit._arch.widget.abstraction
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
@ -6,11 +6,11 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.ColorRes
import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.StringId
import com.tangem.tangemtest._arch.structure.StringResId
import com.tangem.tangemtest._arch.structure.abstraction.Item
import com.tangem.tangemtest._arch.structure.abstraction.ViewState
import com.tangem.devkit.R
import com.tangem.devkit._arch.structure.StringId
import com.tangem.devkit._arch.structure.StringResId
import com.tangem.devkit._arch.structure.abstraction.Item
import com.tangem.devkit._arch.structure.abstraction.ViewState
import ru.dev.gbixahue.eu4d.lib.android._android.views.colorFrom
import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder

View file

@ -1,9 +1,9 @@
package com.tangem.tangemtest._arch.widget.impl
package com.tangem.devkit._arch.widget.impl
import android.view.ViewGroup
import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.abstraction.ItemGroup
import com.tangem.tangemtest._arch.widget.abstraction.BaseViewWidget
import com.tangem.devkit.R
import com.tangem.devkit._arch.structure.abstraction.ItemGroup
import com.tangem.devkit._arch.widget.abstraction.BaseViewWidget
/**
[REDACTED_AUTHOR]

View file

@ -0,0 +1,15 @@
package com.tangem.devkit._arch.widget.impl
import android.view.ViewGroup
import com.tangem.devkit.R
import com.tangem.devkit._arch.structure.Id
import com.tangem.devkit._arch.structure.abstraction.BaseItem
import com.tangem.devkit._arch.structure.abstraction.BaseItemViewModel
import com.tangem.devkit._arch.widget.abstraction.BaseViewWidget
/**
[REDACTED_AUTHOR]
*/
class StubWidget(id: Id, parent: ViewGroup) : BaseViewWidget(parent, BaseItem(id, BaseItemViewModel())) {
override fun getLayoutId(): Int = R.layout.w_empty
}

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest._main
package com.tangem.devkit._main
import android.content.res.Resources
import android.os.Bundle
@ -12,7 +12,7 @@ import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupWithNavController
import com.tangem.tangemtest.R
import com.tangem.devkit.R
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
/**

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest._main
package com.tangem.devkit._main
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest._main.entryPoint
package com.tangem.devkit._main.entryPoint
import android.os.Bundle
import android.view.View
@ -7,13 +7,13 @@ import androidx.lifecycle.Observer
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.tangem.tangemtest.R
import com.tangem.tangemtest._main.MainViewModel
import com.tangem.tangemtest.extensions.view.beginDelayedTransition
import com.tangem.tangemtest.ucase.getDefaultNavigationOptions
import com.tangem.tangemtest.ucase.resources.ActionType
import com.tangem.tangemtest.ucase.resources.MainResourceHolder
import com.tangem.tangemtest.ucase.ui.BaseFragment
import com.tangem.devkit.R
import com.tangem.devkit._main.MainViewModel
import com.tangem.devkit.extensions.view.beginDelayedTransition
import com.tangem.devkit.ucase.getDefaultNavigationOptions
import com.tangem.devkit.ucase.resources.ActionType
import com.tangem.devkit.ucase.resources.MainResourceHolder
import com.tangem.devkit.ucase.ui.BaseFragment
import kotlinx.android.synthetic.main.fg_entry_point.*
/**

View file

@ -1,14 +1,14 @@
package com.tangem.tangemtest._main.entryPoint
package com.tangem.devkit._main.entryPoint
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.annotation.StringRes
import androidx.recyclerview.widget.RecyclerView
import com.tangem.tangemtest.R
import com.tangem.tangemtest.ucase.resources.ActionRes
import com.tangem.tangemtest.ucase.resources.ActionType
import com.tangem.tangemtest.ucase.resources.MainResourceHolder
import com.tangem.devkit.R
import com.tangem.devkit.ucase.resources.ActionRes
import com.tangem.devkit.ucase.resources.ActionType
import com.tangem.devkit.ucase.resources.MainResourceHolder
import ru.dev.gbixahue.eu4d.lib.android._android.views.inflate
import ru.dev.gbixahue.eu4d.lib.android._android.views.recycler_view.RvBaseAdapter
import ru.dev.gbixahue.eu4d.lib.android._android.views.recycler_view.RvBaseVH

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest.commons
package com.tangem.devkit.commons
/**
[REDACTED_AUTHOR]

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest.commons
package com.tangem.devkit.commons
import android.app.Activity
import android.app.Dialog

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest.commons
package com.tangem.devkit.commons
/**
[REDACTED_AUTHOR]

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest.commons
package com.tangem.devkit.commons
import ru.dev.gbixahue.eu4d.lib.android.global.log.TagLogger

View file

@ -1,10 +1,10 @@
package com.tangem.tangemtest.commons.view
package com.tangem.devkit.commons.view
import android.widget.TextView
import androidx.annotation.StringRes
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.StringId
import com.tangem.tangemtest._arch.structure.abstraction.SafeValueChanged
import com.tangem.devkit._arch.structure.Id
import com.tangem.devkit._arch.structure.StringId
import com.tangem.devkit._arch.structure.abstraction.SafeValueChanged
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest.extensions
package com.tangem.devkit.extensions
import android.content.Intent
import androidx.activity.ComponentActivity

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest.extensions
package com.tangem.devkit.extensions
import android.app.Application
import android.content.Context

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest.extensions
package com.tangem.devkit.extensions
/**
[REDACTED_AUTHOR]

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest.extensions.view
package com.tangem.devkit.extensions.view
import android.view.ViewGroup
import androidx.transition.AutoTransition

View file

@ -1,8 +1,8 @@
package com.tangem.tangemtest.ucase
package com.tangem.devkit.ucase
import androidx.navigation.NavOptions
import androidx.navigation.navOptions
import com.tangem.tangemtest.R
import com.tangem.devkit.R
/**
[REDACTED_AUTHOR]

View file

@ -1,14 +1,14 @@
package com.tangem.tangemtest.ucase.domain.actions
package com.tangem.devkit.ucase.domain.actions
import com.tangem.TangemSdk
import com.tangem.common.CompletionResult
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.Payload
import com.tangem.tangemtest._arch.structure.PayloadHolder
import com.tangem.tangemtest._arch.structure.abstraction.Item
import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.afterAction.AfterActionModification
import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence
import com.tangem.devkit._arch.structure.Id
import com.tangem.devkit._arch.structure.Payload
import com.tangem.devkit._arch.structure.PayloadHolder
import com.tangem.devkit._arch.structure.abstraction.Item
import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
import com.tangem.devkit.ucase.domain.paramsManager.triggers.afterAction.AfterActionModification
import com.tangem.devkit.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence
/**
[REDACTED_AUTHOR]

View file

@ -1,10 +1,10 @@
package com.tangem.tangemtest.ucase.domain.actions
package com.tangem.devkit.ucase.domain.actions
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.PayloadHolder
import com.tangem.tangemtest._arch.structure.abstraction.findItem
import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
import com.tangem.tangemtest.ucase.variants.TlvId
import com.tangem.devkit._arch.structure.Id
import com.tangem.devkit._arch.structure.PayloadHolder
import com.tangem.devkit._arch.structure.abstraction.findItem
import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
import com.tangem.devkit.ucase.variants.TlvId
/**
[REDACTED_AUTHOR]

View file

@ -1,19 +1,19 @@
package com.tangem.tangemtest.ucase.domain.actions
package com.tangem.devkit.ucase.domain.actions
import com.tangem.tangemtest._arch.structure.PayloadHolder
import com.tangem.tangemtest._arch.structure.abstraction.Item
import com.tangem.tangemtest._arch.structure.abstraction.findItem
import com.tangem.tangemtest._arch.structure.impl.EditTextItem
import com.tangem.tangemtest._arch.structure.impl.NumberItem
import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey
import com.tangem.tangemtest.ucase.tunnel.ActionView
import com.tangem.tangemtest.ucase.tunnel.ItemError
import com.tangem.tangemtest.ucase.variants.personalize.CardNumber
import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizationConfigConverter
import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizationConfigToCardConfig
import com.tangem.tangemtest.ucase.variants.personalize.dto.DefaultPersonalizationParams
import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig
import com.tangem.devkit._arch.structure.PayloadHolder
import com.tangem.devkit._arch.structure.abstraction.Item
import com.tangem.devkit._arch.structure.abstraction.findItem
import com.tangem.devkit._arch.structure.impl.EditTextItem
import com.tangem.devkit._arch.structure.impl.NumberItem
import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
import com.tangem.devkit.ucase.domain.paramsManager.PayloadKey
import com.tangem.devkit.ucase.tunnel.ActionView
import com.tangem.devkit.ucase.tunnel.ItemError
import com.tangem.devkit.ucase.variants.personalize.CardNumber
import com.tangem.devkit.ucase.variants.personalize.converter.PersonalizationConfigConverter
import com.tangem.devkit.ucase.variants.personalize.converter.PersonalizationConfigToCardConfig
import com.tangem.devkit.ucase.variants.personalize.dto.DefaultPersonalizationParams
import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
/**

View file

@ -1,8 +1,8 @@
package com.tangem.tangemtest.ucase.domain.actions
package com.tangem.devkit.ucase.domain.actions
import com.tangem.tangemtest._arch.structure.PayloadHolder
import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.afterAction.AfterScanModifier
import com.tangem.devkit._arch.structure.PayloadHolder
import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
import com.tangem.devkit.ucase.domain.paramsManager.triggers.afterAction.AfterScanModifier
/**
[REDACTED_AUTHOR]

View file

@ -1,10 +1,10 @@
package com.tangem.tangemtest.ucase.domain.actions
package com.tangem.devkit.ucase.domain.actions
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.PayloadHolder
import com.tangem.tangemtest._arch.structure.abstraction.findItem
import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
import com.tangem.tangemtest.ucase.variants.TlvId
import com.tangem.devkit._arch.structure.Id
import com.tangem.devkit._arch.structure.PayloadHolder
import com.tangem.devkit._arch.structure.abstraction.findItem
import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
import com.tangem.devkit.ucase.variants.TlvId
import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf
/**

View file

@ -1,12 +1,12 @@
package com.tangem.tangemtest.ucase.domain.paramsManager
package com.tangem.devkit.ucase.domain.paramsManager
import com.tangem.TangemSdk
import com.tangem.common.CompletionResult
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.Payload
import com.tangem.tangemtest._arch.structure.PayloadHolder
import com.tangem.tangemtest._arch.structure.abstraction.Item
import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence
import com.tangem.devkit._arch.structure.Id
import com.tangem.devkit._arch.structure.Payload
import com.tangem.devkit._arch.structure.PayloadHolder
import com.tangem.devkit._arch.structure.abstraction.Item
import com.tangem.devkit.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence
typealias ActionResponse = CompletionResult<*>
typealias AffectedList = List<Item>

View file

@ -1,18 +1,18 @@
package com.tangem.tangemtest.ucase.domain.paramsManager.managers
package com.tangem.devkit.ucase.domain.paramsManager.managers
import androidx.lifecycle.LifecycleObserver
import com.tangem.TangemSdk
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.Payload
import com.tangem.tangemtest._arch.structure.abstraction.Item
import com.tangem.tangemtest._arch.structure.abstraction.findItem
import com.tangem.tangemtest._arch.structure.abstraction.iterate
import com.tangem.tangemtest.ucase.domain.actions.Action
import com.tangem.tangemtest.ucase.domain.actions.AttrForAction
import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
import com.tangem.tangemtest.ucase.domain.paramsManager.AffectedItemsCallback
import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
import com.tangem.tangemtest.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence
import com.tangem.devkit._arch.structure.Id
import com.tangem.devkit._arch.structure.Payload
import com.tangem.devkit._arch.structure.abstraction.Item
import com.tangem.devkit._arch.structure.abstraction.findItem
import com.tangem.devkit._arch.structure.abstraction.iterate
import com.tangem.devkit.ucase.domain.actions.Action
import com.tangem.devkit.ucase.domain.actions.AttrForAction
import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
import com.tangem.devkit.ucase.domain.paramsManager.AffectedItemsCallback
import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
import com.tangem.devkit.ucase.domain.paramsManager.triggers.changeConsequence.ItemsChangeConsequence
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
/**

View file

@ -1,13 +1,13 @@
package com.tangem.tangemtest.ucase.domain.paramsManager.managers
package com.tangem.devkit.ucase.domain.paramsManager.managers
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.OnLifecycleEvent
import com.tangem.TangemSdk
import com.tangem.tangemtest.commons.Store
import com.tangem.tangemtest.ucase.domain.actions.PersonalizeAction
import com.tangem.tangemtest.ucase.domain.paramsManager.ActionCallback
import com.tangem.tangemtest.ucase.variants.personalize.converter.PersonalizationConfigConverter
import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig
import com.tangem.devkit.commons.Store
import com.tangem.devkit.ucase.domain.actions.PersonalizeAction
import com.tangem.devkit.ucase.domain.paramsManager.ActionCallback
import com.tangem.devkit.ucase.variants.personalize.converter.PersonalizationConfigConverter
import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
/**
[REDACTED_AUTHOR]

View file

@ -0,0 +1,32 @@
package com.tangem.devkit.ucase.domain.paramsManager.managers
import com.tangem.devkit._arch.structure.impl.EditTextItem
import com.tangem.devkit.ucase.domain.actions.DepersonalizeAction
import com.tangem.devkit.ucase.domain.actions.ScanAction
import com.tangem.devkit.ucase.domain.actions.SignAction
import com.tangem.devkit.ucase.domain.paramsManager.triggers.changeConsequence.CardIdConsequence
import com.tangem.devkit.ucase.variants.TlvId
/**
[REDACTED_AUTHOR]
*/
class ScanItemsManager : BaseItemsManager(ScanAction())
class DepersonalizeItemsManager : BaseItemsManager(DepersonalizeAction()) {
init {
setItemChangeConsequences(CardIdConsequence())
setItems(listOf(EditTextItem(TlvId.CardId, null)))
}
}
class SignItemsManager : BaseItemsManager(SignAction()) {
init {
setItemChangeConsequences(CardIdConsequence())
setItems(listOf(
EditTextItem(TlvId.CardId, null),
EditTextItem(TlvId.TransactionOutHash, "Data used for hashing")
))
}
}

View file

@ -1,8 +1,8 @@
package com.tangem.tangemtest.ucase.domain.paramsManager.triggers.afterAction
package com.tangem.devkit.ucase.domain.paramsManager.triggers.afterAction
import com.tangem.common.CompletionResult
import com.tangem.tangemtest._arch.structure.PayloadHolder
import com.tangem.tangemtest._arch.structure.abstraction.Item
import com.tangem.devkit._arch.structure.PayloadHolder
import com.tangem.devkit._arch.structure.abstraction.Item
/**
[REDACTED_AUTHOR]

View file

@ -1,15 +1,15 @@
package com.tangem.tangemtest.ucase.domain.paramsManager.triggers.afterAction
package com.tangem.devkit.ucase.domain.paramsManager.triggers.afterAction
import com.tangem.commands.Card
import com.tangem.commands.CardStatus
import com.tangem.common.CompletionResult
import com.tangem.tangemtest._arch.structure.PayloadHolder
import com.tangem.tangemtest._arch.structure.abstraction.Item
import com.tangem.tangemtest._arch.structure.abstraction.findItem
import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey
import com.tangem.tangemtest.ucase.tunnel.ActionView
import com.tangem.tangemtest.ucase.tunnel.CardError
import com.tangem.tangemtest.ucase.variants.TlvId
import com.tangem.devkit._arch.structure.PayloadHolder
import com.tangem.devkit._arch.structure.abstraction.Item
import com.tangem.devkit._arch.structure.abstraction.findItem
import com.tangem.devkit.ucase.domain.paramsManager.PayloadKey
import com.tangem.devkit.ucase.tunnel.ActionView
import com.tangem.devkit.ucase.tunnel.CardError
import com.tangem.devkit.ucase.variants.TlvId
import ru.dev.gbixahue.eu4d.lib.android.global.threading.postUI

View file

@ -0,0 +1,30 @@
package com.tangem.devkit.ucase.domain.paramsManager.triggers.changeConsequence
import com.tangem.devkit._arch.structure.PayloadHolder
import com.tangem.devkit._arch.structure.abstraction.Item
import com.tangem.devkit.ucase.domain.paramsManager.PayloadKey
import com.tangem.devkit.ucase.tunnel.ActionView
import com.tangem.devkit.ucase.variants.TlvId
import ru.dev.gbixahue.eu4d.lib.android.global.threading.postUI
/**
[REDACTED_AUTHOR]
*
* The ParamsChangeConsequence class family modifies parameters depending on the state
* of the incoming parameter
*/
interface ItemsChangeConsequence {
fun affectChanges(payload: PayloadHolder, changedItem: Item, itemList: List<Item>): List<Item>
}
class CardIdConsequence : ItemsChangeConsequence {
override fun affectChanges(payload: PayloadHolder, changedItem: Item, itemList: List<Item>): List<Item> {
val affectedList = mutableListOf<Item>()
if (changedItem.id != TlvId.CardId) return affectedList
val cidDataIsNull = changedItem.getData<String?>() == null
postUI { (payload.get(PayloadKey.actionView) as? ActionView)?.enableActionFab(!cidDataIsNull) }
return affectedList
}
}

View file

@ -1,9 +1,9 @@
package com.tangem.tangemtest.ucase.domain.responses
package com.tangem.devkit.ucase.domain.responses
import com.google.gson.*
import com.tangem.commands.*
import com.tangem.common.extensions.toHexString
import com.tangem.tangemtest.extensions.print
import com.tangem.devkit.extensions.print
import java.lang.reflect.Type
import java.text.DateFormat
import java.util.*

View file

@ -1,6 +1,6 @@
package com.tangem.tangemtest.ucase.resources
package com.tangem.devkit.ucase.resources
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.devkit._arch.structure.Id
/**
[REDACTED_AUTHOR]

View file

@ -1,14 +1,14 @@
package com.tangem.tangemtest.ucase.resources
package com.tangem.devkit.ucase.resources
import com.tangem.tangemtest.AppTangemDemo
import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.StringId
import com.tangem.tangemtest._arch.structure.StringResId
import com.tangem.tangemtest.ucase.resources.initializers.ActionResources
import com.tangem.tangemtest.ucase.resources.initializers.PersonalizationResources
import com.tangem.tangemtest.ucase.resources.initializers.ResponseResources
import com.tangem.tangemtest.ucase.resources.initializers.TlvResources
import com.tangem.devkit.AppTangemDemo
import com.tangem.devkit.R
import com.tangem.devkit._arch.structure.Id
import com.tangem.devkit._arch.structure.StringId
import com.tangem.devkit._arch.structure.StringResId
import com.tangem.devkit.ucase.resources.initializers.ActionResources
import com.tangem.devkit.ucase.resources.initializers.PersonalizationResources
import com.tangem.devkit.ucase.resources.initializers.ResponseResources
import com.tangem.devkit.ucase.resources.initializers.TlvResources
import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder
/**

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest.ucase.resources
package com.tangem.devkit.ucase.resources
/**
[REDACTED_AUTHOR]

View file

@ -1,10 +1,10 @@
package com.tangem.tangemtest.ucase.resources.initializers
package com.tangem.devkit.ucase.resources.initializers
import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest.ucase.resources.ActionRes
import com.tangem.tangemtest.ucase.resources.ActionType
import com.tangem.tangemtest.ucase.resources.ResourceHolder
import com.tangem.devkit.R
import com.tangem.devkit._arch.structure.Id
import com.tangem.devkit.ucase.resources.ActionRes
import com.tangem.devkit.ucase.resources.ActionType
import com.tangem.devkit.ucase.resources.ResourceHolder
/**
[REDACTED_AUTHOR]

View file

@ -1,10 +1,10 @@
package com.tangem.tangemtest.ucase.resources.initializers
package com.tangem.devkit.ucase.resources.initializers
import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest.ucase.resources.ResourceHolder
import com.tangem.tangemtest.ucase.resources.Resources
import com.tangem.tangemtest.ucase.variants.personalize.*
import com.tangem.devkit.R
import com.tangem.devkit._arch.structure.Id
import com.tangem.devkit.ucase.resources.ResourceHolder
import com.tangem.devkit.ucase.resources.Resources
import com.tangem.devkit.ucase.variants.personalize.*
import ru.dev.gbixahue.eu4d.lib.kotlin.common.TypedHolder
/**

View file

@ -1,12 +1,12 @@
package com.tangem.tangemtest.ucase.resources.initializers
package com.tangem.devkit.ucase.resources.initializers
import com.tangem.tangemtest.R
import com.tangem.tangemtest.ucase.resources.MainResourceHolder
import com.tangem.tangemtest.ucase.resources.Resources
import com.tangem.tangemtest.ucase.variants.responses.CardDataId
import com.tangem.tangemtest.ucase.variants.responses.CardId
import com.tangem.tangemtest.ucase.variants.responses.DepersonalizeId
import com.tangem.tangemtest.ucase.variants.responses.SignId
import com.tangem.devkit.R
import com.tangem.devkit.ucase.resources.MainResourceHolder
import com.tangem.devkit.ucase.resources.Resources
import com.tangem.devkit.ucase.variants.responses.CardDataId
import com.tangem.devkit.ucase.variants.responses.CardId
import com.tangem.devkit.ucase.variants.responses.DepersonalizeId
import com.tangem.devkit.ucase.variants.responses.SignId
/**
[REDACTED_AUTHOR]

View file

@ -1,9 +1,9 @@
package com.tangem.tangemtest.ucase.resources.initializers
package com.tangem.devkit.ucase.resources.initializers
import com.tangem.tangemtest.R
import com.tangem.tangemtest.ucase.resources.MainResourceHolder
import com.tangem.tangemtest.ucase.resources.Resources
import com.tangem.tangemtest.ucase.variants.TlvId
import com.tangem.devkit.R
import com.tangem.devkit.ucase.resources.MainResourceHolder
import com.tangem.devkit.ucase.resources.Resources
import com.tangem.devkit.ucase.variants.TlvId
/**
[REDACTED_AUTHOR]

View file

@ -1,6 +1,6 @@
package com.tangem.tangemtest.ucase.tunnel
package com.tangem.devkit.ucase.tunnel
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.devkit._arch.structure.Id
/**
[REDACTED_AUTHOR]

View file

@ -1,7 +1,7 @@
package com.tangem.tangemtest.ucase.tunnel
package com.tangem.devkit.ucase.tunnel
import com.google.android.material.snackbar.Snackbar
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.devkit._arch.structure.Id
interface SnackbarHolder {
fun showSnackbar(message: String, length: Int = Snackbar.LENGTH_SHORT)

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest.ucase.ui
package com.tangem.devkit.ucase.ui
import android.view.View
import androidx.annotation.UiThread
@ -9,17 +9,19 @@ import com.tangem.TangemSdk
import com.tangem.commands.Card
import com.tangem.commands.CommandResponse
import com.tangem.common.CompletionResult
import com.tangem.tangemtest._arch.SingleLiveEvent
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.Payload
import com.tangem.tangemtest._arch.structure.abstraction.Item
import com.tangem.tangemtest._arch.structure.abstraction.iterate
import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
import com.tangem.tangemtest.ucase.domain.responses.ResponseJsonConverter
import com.tangem.tangemtest.ucase.resources.ActionType
import com.tangem.tangemtest.ucase.tunnel.ViewScreen
import com.tangem.tangemtest.ucase.variants.personalize.converter.ItemTypes
import com.tangem.common.extensions.CardType
import com.tangem.devkit._arch.SingleLiveEvent
import com.tangem.devkit._arch.structure.Id
import com.tangem.devkit._arch.structure.Payload
import com.tangem.devkit._arch.structure.abstraction.Item
import com.tangem.devkit._arch.structure.abstraction.iterate
import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
import com.tangem.devkit.ucase.domain.responses.ResponseJsonConverter
import com.tangem.devkit.ucase.resources.ActionType
import com.tangem.devkit.ucase.tunnel.ViewScreen
import com.tangem.devkit.ucase.variants.personalize.converter.ItemTypes
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
import java.util.*
/**
[REDACTED_AUTHOR]
@ -43,6 +45,7 @@ class ActionViewModel(private val itemsManager: ItemsManager) : ViewModel(), Lif
fun setCardManager(tangemSdk: TangemSdk) {
this.tangemSdk = tangemSdk
this.tangemSdk.config.cardFilter.allowedCardTypes = EnumSet.of(CardType.Sdk)
}
@Deprecated("Events must be send directly from the Widget")

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest.ucase.ui
package com.tangem.devkit.ucase.ui
import android.os.Bundle
import android.view.LayoutInflater
@ -13,15 +13,15 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.tangem.TangemSdk
import com.tangem.commands.Card
import com.tangem.commands.CommandResponse
import com.tangem.devkit.R
import com.tangem.devkit._arch.structure.Id
import com.tangem.devkit._main.MainViewModel
import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
import com.tangem.devkit.ucase.domain.paramsManager.PayloadKey
import com.tangem.devkit.ucase.tunnel.ActionView
import com.tangem.devkit.ucase.tunnel.CardError
import com.tangem.devkit.ucase.ui.widgets.ParameterWidget
import com.tangem.tangem_sdk_new.extensions.init
import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._main.MainViewModel
import com.tangem.tangemtest.ucase.domain.paramsManager.ItemsManager
import com.tangem.tangemtest.ucase.domain.paramsManager.PayloadKey
import com.tangem.tangemtest.ucase.tunnel.ActionView
import com.tangem.tangemtest.ucase.tunnel.CardError
import com.tangem.tangemtest.ucase.ui.widgets.ParameterWidget
import ru.dev.gbixahue.eu4d.lib.android._android.views.enable
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest.ucase.ui
package com.tangem.devkit.ucase.ui
import android.os.Bundle
import android.view.LayoutInflater
@ -8,8 +8,8 @@ import androidx.fragment.app.Fragment
import androidx.navigation.NavOptions
import androidx.navigation.fragment.NavHostFragment.findNavController
import com.google.android.material.snackbar.Snackbar
import com.tangem.tangemtest.ucase.getDefaultNavigationOptions
import com.tangem.tangemtest.ucase.tunnel.SnackbarHolder
import com.tangem.devkit.ucase.getDefaultNavigationOptions
import com.tangem.devkit.ucase.tunnel.SnackbarHolder
import ru.dev.gbixahue.eu4d.lib.kotlin.common.LayoutHolder
/**

View file

@ -1,4 +1,4 @@
package com.tangem.tangemtest.ucase.ui.widgets
package com.tangem.devkit.ucase.ui.widgets
import android.text.Editable
import android.text.TextWatcher
@ -8,14 +8,14 @@ import android.widget.Button
import android.widget.TextView
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
import com.tangem.tangemtest.R
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.abstraction.Item
import com.tangem.tangemtest._arch.structure.impl.EditTextItem
import com.tangem.tangemtest.extensions.view.beginDelayedTransition
import com.tangem.tangemtest.ucase.resources.ActionType
import com.tangem.tangemtest.ucase.resources.MainResourceHolder
import com.tangem.tangemtest.ucase.resources.Resources
import com.tangem.devkit.R
import com.tangem.devkit._arch.structure.Id
import com.tangem.devkit._arch.structure.abstraction.Item
import com.tangem.devkit._arch.structure.impl.EditTextItem
import com.tangem.devkit.extensions.view.beginDelayedTransition
import com.tangem.devkit.ucase.resources.ActionType
import com.tangem.devkit.ucase.resources.MainResourceHolder
import com.tangem.devkit.ucase.resources.Resources
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
import ru.dev.gbixahue.eu4d.lib.kotlin.stringOf

View file

@ -0,0 +1,11 @@
package com.tangem.devkit.ucase.variants
import com.tangem.devkit._arch.structure.Id
/**
[REDACTED_AUTHOR]
*/
enum class TlvId : Id {
CardId,
TransactionOutHash,
}

View file

@ -0,0 +1,13 @@
package com.tangem.devkit.ucase.variants.depersonalize.ui
import com.tangem.devkit.ucase.domain.paramsManager.ItemsManager
import com.tangem.devkit.ucase.domain.paramsManager.managers.DepersonalizeItemsManager
import com.tangem.devkit.ucase.ui.BaseCardActionFragment
/**
[REDACTED_AUTHOR]
*/
class DepersonalizeActionFragment : BaseCardActionFragment() {
override val itemsManager: ItemsManager by lazy { DepersonalizeItemsManager() }
}

View file

@ -1,6 +1,6 @@
package com.tangem.tangemtest.ucase.variants.personalize
package com.tangem.devkit.ucase.variants.personalize
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.devkit._arch.structure.Id
/**
[REDACTED_AUTHOR]

View file

@ -1,13 +1,13 @@
package com.tangem.tangemtest.ucase.variants.personalize
package com.tangem.devkit.ucase.variants.personalize
import android.content.Context
import android.content.SharedPreferences
import androidx.core.content.edit
import com.google.gson.Gson
import com.tangem.tangemtest.AppTangemDemo
import com.tangem.tangemtest.commons.KeyedStore
import com.tangem.tangemtest.commons.Store
import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig
import com.tangem.devkit.AppTangemDemo
import com.tangem.devkit.commons.KeyedStore
import com.tangem.devkit.commons.Store
import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
class PersonalizationConfigStore(context: Context) : Store<PersonalizationConfig>, KeyedStore<PersonalizationConfig> {

View file

@ -1,10 +1,10 @@
package com.tangem.tangemtest.ucase.variants.personalize.converter
package com.tangem.devkit.ucase.variants.personalize.converter
import com.tangem.commands.EllipticCurve
import com.tangem.tangemtest._arch.structure.Id
import com.tangem.tangemtest._arch.structure.abstraction.KeyValue
import com.tangem.tangemtest.ucase.variants.personalize.*
import com.tangem.tangemtest.ucase.variants.personalize.dto.PersonalizationConfig
import com.tangem.devkit._arch.structure.Id
import com.tangem.devkit._arch.structure.abstraction.KeyValue
import com.tangem.devkit.ucase.variants.personalize.*
import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig
import ru.dev.gbixahue.eu4d.lib.kotlin.common.BaseTypedHolder
/**

Some files were not shown because too many files have changed in this diff Show more