Updated on 2026-08-14
This commit is contained in:
parent
ee21ead663
commit
8fbc4951c1
4 changed files with 54 additions and 12 deletions
|
|
@ -7,8 +7,12 @@ import android.view.MenuItem
|
|||
import android.view.View
|
||||
import androidx.activity.OnBackPressedCallback
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.viewModels
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.flowWithLifecycle
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.transition.TransitionInflater
|
||||
|
|
@ -19,6 +23,7 @@ import com.badoo.mvicore.modelWatcher
|
|||
import com.tangem.core.analytics.Analytics
|
||||
import com.tangem.core.ui.fragments.setStatusBarColor
|
||||
import com.tangem.core.ui.utils.OneTouchClickListener
|
||||
import com.tangem.datasource.connection.NetworkConnectionManager
|
||||
import com.tangem.feature.swap.api.SwapFeatureToggleManager
|
||||
import com.tangem.feature.swap.domain.SwapInteractor
|
||||
import com.tangem.tap.MainActivity
|
||||
|
|
@ -47,6 +52,8 @@ import com.tangem.wallet.BuildConfig
|
|||
import com.tangem.wallet.R
|
||||
import com.tangem.wallet.databinding.FragmentWalletBinding
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.launch
|
||||
import javax.inject.Inject
|
||||
|
||||
@AndroidEntryPoint
|
||||
|
|
@ -58,6 +65,9 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), SafeStoreSubscriber<W
|
|||
@Inject
|
||||
lateinit var swapFeatureToggleManager: SwapFeatureToggleManager
|
||||
|
||||
@Inject
|
||||
lateinit var networkConnectionManager: NetworkConnectionManager
|
||||
|
||||
private lateinit var warningsAdapter: WarningMessagesAdapter
|
||||
|
||||
private val binding: FragmentWalletBinding by viewBinding(FragmentWalletBinding::bind)
|
||||
|
|
@ -75,6 +85,8 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), SafeStoreSubscriber<W
|
|||
}
|
||||
}
|
||||
|
||||
private val isNetworkConnectionError = mutableStateOf(false)
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setHasOptionsMenu(true)
|
||||
|
|
@ -98,6 +110,8 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), SafeStoreSubscriber<W
|
|||
|
||||
setStatusBarColor(R.color.background_secondary)
|
||||
|
||||
subscribeOnNetworkStateChanging()
|
||||
|
||||
store.subscribe(this) { state ->
|
||||
state.select { it.walletState }
|
||||
}
|
||||
|
|
@ -194,8 +208,7 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), SafeStoreSubscriber<W
|
|||
if (state.state != ProgressState.Loading &&
|
||||
state.state != ProgressState.Refreshing
|
||||
) {
|
||||
Analytics.send(Portfolio.Refreshed())
|
||||
store.dispatch(WalletAction.LoadData.Refresh)
|
||||
refreshWalletData()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -207,6 +220,11 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), SafeStoreSubscriber<W
|
|||
binding.toolbar.setNavigationIcon(navigationIconRes)
|
||||
}
|
||||
|
||||
private fun refreshWalletData() {
|
||||
Analytics.send(Portfolio.Refreshed())
|
||||
store.dispatch(WalletAction.LoadData.Refresh)
|
||||
}
|
||||
|
||||
private fun showWarningsIfPresent(warnings: List<WarningMessage>) {
|
||||
warningsAdapter.submitList(warnings)
|
||||
binding.rvWarningMessages.show(warnings.isNotEmpty())
|
||||
|
|
@ -215,13 +233,17 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), SafeStoreSubscriber<W
|
|||
private fun setupNoInternetHandling(state: WalletState) {
|
||||
if (state.state == ProgressState.Error) {
|
||||
if (state.error == ErrorType.NoInternetConnection) {
|
||||
isNetworkConnectionError.value = true
|
||||
binding.srlWallet.isRefreshing = false
|
||||
(activity as? MainActivity)?.showSnackbar(
|
||||
text = R.string.wallet_notification_no_internet,
|
||||
buttonTitle = R.string.common_retry,
|
||||
) { store.dispatch(WalletAction.LoadData) }
|
||||
} else {
|
||||
isNetworkConnectionError.value = false
|
||||
}
|
||||
} else {
|
||||
isNetworkConnectionError.value = false
|
||||
(activity as? MainActivity)?.dismissSnackbar()
|
||||
}
|
||||
}
|
||||
|
|
@ -247,6 +269,19 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), SafeStoreSubscriber<W
|
|||
}
|
||||
}
|
||||
|
||||
private fun subscribeOnNetworkStateChanging() {
|
||||
viewLifecycleOwner.lifecycleScope.launch {
|
||||
networkConnectionManager.isOnlineFlow
|
||||
.flowWithLifecycle(viewLifecycleOwner.lifecycle, Lifecycle.State.STARTED)
|
||||
.distinctUntilChanged()
|
||||
.collect { isOnline ->
|
||||
if (isOnline && isNetworkConnectionError.value) {
|
||||
refreshWalletData()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
return when (item.itemId) {
|
||||
R.id.details_menu -> {
|
||||
|
|
|
|||
|
|
@ -80,14 +80,6 @@ internal class WalletViewModel @Inject constructor(
|
|||
analyticsEventHandler.send(MainScreen.ScreenOpened())
|
||||
}
|
||||
|
||||
private fun launch() {
|
||||
val manager = store.state.globalState.userWalletsListManager
|
||||
if (manager != null) {
|
||||
bootstrapSelectedWalletStoresChanges(manager)
|
||||
}
|
||||
bootstrapShowSaveWalletIfNeeded()
|
||||
}
|
||||
|
||||
fun onBalanceLoaded(totalBalance: TotalFiatBalance?) {
|
||||
if (totalBalance != null) {
|
||||
walletAnalyticsEventsMapper.convert(totalBalance)?.let { balanceParam ->
|
||||
|
|
@ -100,6 +92,14 @@ internal class WalletViewModel @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private fun launch() {
|
||||
val manager = store.state.globalState.userWalletsListManager
|
||||
if (manager != null) {
|
||||
bootstrapSelectedWalletStoresChanges(manager)
|
||||
}
|
||||
bootstrapShowSaveWalletIfNeeded()
|
||||
}
|
||||
|
||||
@OptIn(FlowPreview::class)
|
||||
private fun bootstrapSelectedWalletStoresChanges(manager: UserWalletsListManager) {
|
||||
observeWalletStoresUpdatesJob = manager.selectedUserWallet
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ import dagger.hilt.android.qualifiers.ApplicationContext
|
|||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.SupervisorJob
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.launch
|
||||
import timber.log.Timber
|
||||
import javax.inject.Inject
|
||||
|
|
@ -35,12 +36,13 @@ internal class AndroidNetworkConnectionManager @Inject constructor(
|
|||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
) : NetworkConnectionManager {
|
||||
|
||||
override val isOnline: Boolean get() = _isOnline.value
|
||||
|
||||
private val _isOnline = MutableStateFlow(value = false)
|
||||
private val callbacks = NetworkConnectionManagerCallbacks()
|
||||
private val receiver = NetworkConnectionBroadcastReceiver()
|
||||
|
||||
override val isOnline: Boolean get() = _isOnline.value
|
||||
override val isOnlineFlow: StateFlow<Boolean> = _isOnline
|
||||
|
||||
init {
|
||||
(context as? Application)?.registerActivityLifecycleCallbacks(callbacks)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,13 @@
|
|||
package com.tangem.datasource.connection
|
||||
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
|
||||
/** Network connection manager */
|
||||
interface NetworkConnectionManager {
|
||||
|
||||
/** Connection status */
|
||||
val isOnline: Boolean
|
||||
|
||||
/** Connection status flow */
|
||||
val isOnlineFlow: StateFlow<Boolean>
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue