Updated on 2026-08-14

This commit is contained in:
Tangem 2023-07-14 16:28:43 +08:00
parent e0eafb4df9
commit bde99e272b
32 changed files with 384 additions and 184 deletions

1
data/card/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/build

View file

@ -0,0 +1,21 @@
plugins {
alias(deps.plugins.android.library)
alias(deps.plugins.kotlin.android)
alias(deps.plugins.kotlin.kapt)
alias(deps.plugins.hilt.android)
id("configuration")
}
android {
namespace = "com.tangem.data.card"
}
dependencies {
implementation(deps.hilt.android)
kapt(deps.hilt.kapt)
implementation(deps.tangem.card.android)
implementation(deps.tangem.card.core)
implementation(projects.domain.card)
implementation(projects.domain.models)
}

View file

@ -0,0 +1,53 @@
package com.tangem.data.card
import com.tangem.TangemSdk
import com.tangem.common.UserCodeType
import com.tangem.common.core.CardIdDisplayFormat
import com.tangem.common.core.UserCodeRequestPolicy
import com.tangem.data.card.sdk.CardSdkProvider
import com.tangem.domain.card.repository.CardSdkConfigRepository
import com.tangem.domain.models.scan.ProductType
/**
* Implementation of repository for managing with CardSDK config
*
* @property cardSdkProvider CardSDK instance provider
*
[REDACTED_AUTHOR]
*/
internal class DefaultCardSdkConfigRepository(
private val cardSdkProvider: CardSdkProvider,
) : CardSdkConfigRepository {
@Deprecated("Use CardSdkConfigRepository's methods instead of this property")
override val sdk: TangemSdk
get() = cardSdkProvider.sdk
override fun setAccessCodeRequestPolicy(isBiometricsRequestPolicy: Boolean) {
sdk.config.userCodeRequestPolicy = if (isBiometricsRequestPolicy) {
UserCodeRequestPolicy.AlwaysWithBiometrics(codeType = UserCodeType.AccessCode)
} else {
UserCodeRequestPolicy.Default
}
}
override fun isBiometricsRequestPolicy(): Boolean {
return with(sdk.config.userCodeRequestPolicy) {
this is UserCodeRequestPolicy.AlwaysWithBiometrics && codeType == UserCodeType.AccessCode
}
}
override fun resetCardIdDisplayFormat() {
sdk.config.cardIdDisplayFormat = CardIdDisplayFormat.Full
}
override fun updateCardIdDisplayFormat(productType: ProductType) {
sdk.config.cardIdDisplayFormat = when (productType) {
ProductType.Twins -> CardIdDisplayFormat.LastLuhn(numbers = 4)
ProductType.Note,
ProductType.Wallet,
ProductType.Start2Coin,
-> CardIdDisplayFormat.Full
}
}
}

View file

@ -0,0 +1,21 @@
package com.tangem.data.card.di
import com.tangem.data.card.DefaultCardSdkConfigRepository
import com.tangem.data.card.sdk.CardSdkProvider
import com.tangem.domain.card.repository.CardSdkConfigRepository
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
internal object CardDataModule {
@Provides
@Singleton
fun provideCardSdkConfigRepository(cardSdkProvider: CardSdkProvider): CardSdkConfigRepository {
return DefaultCardSdkConfigRepository(cardSdkProvider = cardSdkProvider)
}
}

View file

@ -0,0 +1,23 @@
package com.tangem.data.card.di
import com.tangem.data.card.sdk.CardSdkLifecycleObserver
import com.tangem.data.card.sdk.CardSdkProvider
import com.tangem.data.card.sdk.DefaultCardSdkProvider
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
internal interface CardSdkModule {
@Binds
@Singleton
fun provideCardSdkProvider(defaultCardSdkProvider: DefaultCardSdkProvider): CardSdkProvider
@Binds
@Singleton
fun providerCardSdkLifecycleObserver(defaultCardSdkProvider: DefaultCardSdkProvider): CardSdkLifecycleObserver
}

View file

@ -0,0 +1,17 @@
package com.tangem.data.card.sdk
import android.content.Context
/**
* Lifecycle observer for creating Card SDK instance
*
[REDACTED_AUTHOR]
*/
interface CardSdkLifecycleObserver {
/** Callback of creating activity [context] */
fun onCreate(context: Context)
/** Callback of destroying activity */
fun onDestroy()
}

View file

@ -0,0 +1,14 @@
package com.tangem.data.card.sdk
import com.tangem.TangemSdk
/**
* CardSDK instance provider
*
[REDACTED_AUTHOR]
*/
internal interface CardSdkProvider {
/** CardSDK instance */
val sdk: TangemSdk
}

View file

@ -0,0 +1,45 @@
package com.tangem.data.card.sdk
import android.content.Context
import androidx.fragment.app.FragmentActivity
import com.tangem.TangemSdk
import com.tangem.common.CardFilter
import com.tangem.common.card.FirmwareVersion
import com.tangem.common.core.Config
import com.tangem.sdk.extensions.initWithBiometrics
import javax.inject.Inject
import javax.inject.Singleton
/**
* Implementation of CardSDK instance provider
*
[REDACTED_AUTHOR]
*/
@Singleton
internal class DefaultCardSdkProvider @Inject constructor() : CardSdkProvider, CardSdkLifecycleObserver {
override val sdk: TangemSdk
get() = requireNotNull(value = _sdk) { "Impossible to get the TangemSdk when activity is destroyed" }
private var _sdk: TangemSdk? = null
override fun onCreate(context: Context) {
_sdk = TangemSdk.initWithBiometrics(activity = context as FragmentActivity, config = config)
}
override fun onDestroy() {
_sdk = null
}
private companion object {
val config = Config(
linkedTerminal = true,
allowUntrustedCards = true,
filter = CardFilter(
allowedCardTypes = FirmwareVersion.FirmwareType.values().toList(),
maxFirmwareVersion = FirmwareVersion(major = 4, minor = 52),
),
)
}
}