Updated on 2026-08-14

This commit is contained in:
Tangem 2023-09-13 15:51:40 +04:00
commit cfec7365b0
5 changed files with 38 additions and 23 deletions

View file

@ -1,6 +1,7 @@
package com.tangem.tap.features.details.redux
import com.tangem.core.ui.extensions.TextReference
import androidx.lifecycle.LifecycleCoroutineScope
import com.tangem.domain.apptheme.model.AppThemeMode
import com.tangem.domain.common.CardTypesResolver
import com.tangem.domain.models.scan.CardDTO
@ -72,6 +73,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.TangemError
import com.tangem.common.core.TangemSdkError
@ -193,7 +194,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()
@ -212,8 +217,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

@ -3,6 +3,7 @@ package com.tangem.tap.features.details.ui.appsettings
import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.lifecycle.lifecycleScope
import androidx.transition.TransitionInflater
import com.tangem.core.navigation.NavigationAction
import com.tangem.core.ui.screen.ComposeFragment
@ -38,7 +39,7 @@ internal class AppSettingsFragment : ComposeFragment(), StoreSubscriber<DetailsS
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.checkBiometricsStatus()
viewModel.checkBiometricsStatus(lifecycleScope)
}
override fun TransitionInflater.inflateTransitions(): Boolean {
@ -59,7 +60,7 @@ internal class AppSettingsFragment : ComposeFragment(), StoreSubscriber<DetailsS
override fun onResume() {
super.onResume()
viewModel.refreshBiometricsStatus()
viewModel.refreshBiometricsStatus(lifecycleScope)
}
override fun onStop() {

View file

@ -3,6 +3,7 @@ package com.tangem.tap.features.details.ui.appsettings
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.LifecycleCoroutineScope
import com.tangem.domain.apptheme.model.AppThemeMode
import com.tangem.tap.common.extensions.dispatchOnMain
import com.tangem.tap.common.redux.AppState
@ -30,12 +31,22 @@ internal class AppSettingsViewModel(private val store: Store<AppState>) {
)
}
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,
),
)
}
private fun buildItems(state: AppSettingsState): ImmutableList<AppSettingsScreenState.Item> {

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 {