Updated on 2026-08-14
This commit is contained in:
parent
ae60dc7b4e
commit
063f6ea5ad
5 changed files with 39 additions and 24 deletions
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue