diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt index 5782c7b0e2..1248e2537c 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsAction.kt @@ -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() diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt index 88614a197f..a672117ab2 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/DetailsMiddleware.kt @@ -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) diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsFragment.kt b/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsFragment.kt index 0f0e3de308..2be6f7b037 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsFragment.kt @@ -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 { 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 { override fun onResume() { super.onResume() - viewModel.refreshBiometricsStatus() + viewModel.refreshBiometricsStatus(lifecycleScope) } override fun onStop() { diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsViewModel.kt index 38323dcc3e..857ce03b4d 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/appsettings/AppSettingsViewModel.kt @@ -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) { 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, + ), + ) } } \ No newline at end of file diff --git a/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt b/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt index b536029bcb..c2c2a2dd19 100644 --- a/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt +++ b/data/card/src/main/java/com/tangem/data/card/sdk/DefaultCardSdkProvider.kt @@ -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 = WeakReference(null) + private var _sdk: WeakReference? = 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 {