Updated on 2026-08-14

This commit is contained in:
Tangem 2023-09-12 16:01:10 +04:00
parent ae60dc7b4e
commit 063f6ea5ad
5 changed files with 39 additions and 24 deletions

View file

@ -1,8 +1,9 @@
package com.tangem.tap.features.details.redux
import androidx.lifecycle.LifecycleCoroutineScope
import com.tangem.blockchain.common.Wallet
import com.tangem.domain.models.scan.CardDTO
import com.tangem.domain.common.CardTypesResolver
import com.tangem.domain.models.scan.CardDTO
import com.tangem.domain.models.scan.ScanResponse
import com.tangem.tap.common.entities.FiatCurrency
import org.rekotlin.Action
@ -64,6 +65,7 @@ sealed class DetailsAction : Action {
data class CheckBiometricsStatus(
val awaitStatusChange: Boolean,
val lifecycleCoroutineScope: LifecycleCoroutineScope,
) : AppSettings()
object EnrollBiometrics : AppSettings()

View file

@ -1,5 +1,6 @@
package com.tangem.tap.features.details.redux
import androidx.lifecycle.LifecycleCoroutineScope
import com.tangem.common.CompletionResult
import com.tangem.common.core.TangemSdkError
import com.tangem.common.doOnFailure
@ -216,7 +217,11 @@ class DetailsMiddleware {
}
}
is DetailsAction.AppSettings.CheckBiometricsStatus -> {
checkBiometricsStatus(action.awaitStatusChange, state)
checkBiometricsStatus(
awaitStatusChange = action.awaitStatusChange,
state = state,
lifecycleScope = action.lifecycleCoroutineScope,
)
}
is DetailsAction.AppSettings.EnrollBiometrics -> {
enrollBiometrics()
@ -232,8 +237,12 @@ class DetailsMiddleware {
* @param awaitStatusChange If true then start a new coroutine and check the biometric status every 100
* milliseconds until it changes
* */
private fun checkBiometricsStatus(awaitStatusChange: Boolean, state: DetailsState) {
scope.launch {
private fun checkBiometricsStatus(
awaitStatusChange: Boolean,
state: DetailsState,
lifecycleScope: LifecycleCoroutineScope,
) {
lifecycleScope.launch {
if (awaitStatusChange) {
while (state.appSettingsState.needEnrollBiometrics == tangemSdkManager.needEnrollBiometrics) {
delay(timeMillis = 100)

View file

@ -8,6 +8,7 @@ import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.platform.ComposeView
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.transition.TransitionInflater
import com.tangem.core.navigation.NavigationAction
import com.tangem.core.ui.res.TangemTheme
@ -27,7 +28,7 @@ class AppSettingsFragment : Fragment(), StoreSubscriber<DetailsState> {
val inflater = TransitionInflater.from(requireContext())
enterTransition = inflater.inflateTransition(R.transition.fade)
exitTransition = inflater.inflateTransition(R.transition.fade)
viewModel.checkBiometricsStatus()
viewModel.checkBiometricsStatus(lifecycleScope)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
@ -58,7 +59,7 @@ class AppSettingsFragment : Fragment(), StoreSubscriber<DetailsState> {
override fun onResume() {
super.onResume()
viewModel.refreshBiometricsStatus()
viewModel.refreshBiometricsStatus(lifecycleScope)
}
override fun onStop() {

View file

@ -1,5 +1,6 @@
package com.tangem.tap.features.details.ui.appsettings
import androidx.lifecycle.LifecycleCoroutineScope
import com.tangem.tap.common.extensions.dispatchOnMain
import com.tangem.tap.common.redux.AppState
import com.tangem.tap.features.details.redux.AppSetting
@ -32,11 +33,21 @@ class AppSettingsViewModel(private val store: Store<AppState>) {
store.dispatch(DetailsAction.AppSettings.SwitchPrivacySetting(enable = enable, setting = setting))
}
fun checkBiometricsStatus() {
store.dispatch(DetailsAction.AppSettings.CheckBiometricsStatus(awaitStatusChange = false))
fun checkBiometricsStatus(lifecycleScope: LifecycleCoroutineScope) {
store.dispatch(
DetailsAction.AppSettings.CheckBiometricsStatus(
awaitStatusChange = false,
lifecycleCoroutineScope = lifecycleScope,
),
)
}
fun refreshBiometricsStatus() {
store.dispatch(DetailsAction.AppSettings.CheckBiometricsStatus(awaitStatusChange = true))
fun refreshBiometricsStatus(lifecycleScope: LifecycleCoroutineScope) {
store.dispatch(
DetailsAction.AppSettings.CheckBiometricsStatus(
awaitStatusChange = true,
lifecycleCoroutineScope = lifecycleScope,
),
)
}
}

View file

@ -20,26 +20,18 @@ import javax.inject.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" }
get() = requireNotNull(value = _sdk?.get()) { "Impossible to get the TangemSdk when activity is destroyed" }
private var _sdk: TangemSdk? = null
/** Weak reference of context that uses to create [TangemSdk] */
private var contextRef: WeakReference<Context> = WeakReference(null)
private var _sdk: WeakReference<TangemSdk?>? = null
override fun onCreate(context: Context) {
contextRef = WeakReference(context)
_sdk = TangemSdk.initWithBiometrics(activity = context as FragmentActivity, config = config)
_sdk = WeakReference(TangemSdk.initWithBiometrics(activity = context as FragmentActivity, config = config))
}
override fun onDestroy(context: Context) {
/*
*/
if (contextRef.get() == context) {
_sdk = null
}
// Commented out to prevent crash on getting sdk when it's null.
// FIXME: We still should find the real cause and fix it properly.
// _sdk = null
}
private companion object {