diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/CommonViewModel.kt b/app/src/main/java/com/tari/android/wallet/ui/common/CommonViewModel.kt index 2c773fde9..f08827be7 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/common/CommonViewModel.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/common/CommonViewModel.kt @@ -13,6 +13,7 @@ import com.tari.android.wallet.application.deeplinks.DeepLink import com.tari.android.wallet.application.deeplinks.DeeplinkManager import com.tari.android.wallet.application.walletManager.WalletManager import com.tari.android.wallet.application.walletManager.doOnWalletRunning +import com.tari.android.wallet.data.ConnectionState import com.tari.android.wallet.data.ConnectionStateHandler import com.tari.android.wallet.data.sharedPrefs.CorePrefRepository import com.tari.android.wallet.data.sharedPrefs.network.NetworkPrefRepository @@ -44,6 +45,7 @@ import com.tari.android.wallet.util.extension.collectFlow import com.tari.android.wallet.util.extension.launchOnIo import com.tari.android.wallet.util.extension.launchOnMain import io.reactivex.disposables.CompositeDisposable +import kotlinx.coroutines.flow.StateFlow import yat.android.lib.YatIntegration import javax.inject.Inject @@ -98,7 +100,7 @@ open class CommonViewModel : ViewModel(), DialogHandler { val currentTheme = tariSettingsSharedRepository.currentTheme - val connectionState = connectionStateHandler.connectionState + val connectionState: StateFlow = connectionStateHandler.connectionState private val _backPressed = SingleLiveEvent() val backPressed: LiveData = _backPressed diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/HomeOverviewModel.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/HomeOverviewModel.kt index e33e4c496..d0ff9dec0 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/HomeOverviewModel.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/HomeOverviewModel.kt @@ -1,6 +1,6 @@ package com.tari.android.wallet.ui.screen.home.overview -import com.tari.android.wallet.data.ConnectionIndicatorState +import com.tari.android.wallet.data.ConnectionState import com.tari.android.wallet.data.tx.TxDto import com.tari.android.wallet.model.BalanceInfo import com.tari.android.wallet.util.extension.toMicroTari @@ -18,7 +18,7 @@ class HomeOverviewModel { val ticker: String, val networkName: String, val ffiVersion: String, - val connectionIndicatorState: ConnectionIndicatorState = ConnectionIndicatorState.Disconnected, + val connectionState: ConnectionState = ConnectionState(), val activeMinersCount: Int? = null, val activeMinersCountError: Boolean = false, diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/HomeOverviewScreen.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/HomeOverviewScreen.kt index ba2067dce..dd079e7da 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/HomeOverviewScreen.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/HomeOverviewScreen.kt @@ -27,6 +27,7 @@ import com.tari.android.wallet.ui.compose.components.TariPullToRefreshBox import com.tari.android.wallet.ui.compose.components.TariTextButton import com.tari.android.wallet.ui.screen.home.overview.widget.ActiveMinersCard import com.tari.android.wallet.ui.screen.home.overview.widget.BalanceInfoModal +import com.tari.android.wallet.ui.screen.home.overview.widget.BlockSyncChip import com.tari.android.wallet.ui.screen.home.overview.widget.EmptyTxList import com.tari.android.wallet.ui.screen.home.overview.widget.MainnetAnnounceModal import com.tari.android.wallet.ui.screen.home.overview.widget.RestoreSuccessModal @@ -77,7 +78,7 @@ fun HomeOverviewScreen( modifier = Modifier.weight(1f), networkName = uiState.networkName, ffiVersion = uiState.ffiVersion, - connectionIndicatorState = uiState.connectionIndicatorState, + connectionIndicatorState = uiState.connectionState.indicatorState, onVersionClick = onConnectionStatusClick, ) // TODO actions are not used yet @@ -158,13 +159,21 @@ fun HomeOverviewScreen( } } else { item { - Text( + Row( modifier = Modifier .padding(horizontal = 16.dp) .padding(top = 30.dp, bottom = 10.dp), - text = stringResource(R.string.home_tx_list_recent_activity), - style = TariDesignSystem.typography.headingXLarge, - ) + ) { + Text( + text = stringResource(R.string.home_tx_list_recent_activity), + style = TariDesignSystem.typography.headingXLarge, + ) + Spacer(Modifier.weight(1f)) + BlockSyncChip( + walletScannedHeight = uiState.connectionState.walletScannedHeight, + chainTip = uiState.connectionState.chainTip, + ) + } } items(uiState.txList.size) { index -> val txItem = uiState.txList[index] diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/HomeOverviewViewModel.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/HomeOverviewViewModel.kt index 1aeeb141c..922b3c234 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/HomeOverviewViewModel.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/HomeOverviewViewModel.kt @@ -31,7 +31,6 @@ import com.tari.android.wallet.util.extension.launchOnIo import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.update import java.time.LocalDate import javax.inject.Inject @@ -107,8 +106,8 @@ class HomeOverviewViewModel : CommonViewModel() { } } - collectFlow(connectionState.map { it.indicatorState }) { indicatorState -> - _uiState.update { it.copy(connectionIndicatorState = indicatorState) } + collectFlow(connectionState) { connectionState -> + _uiState.update { it.copy(connectionState = connectionState) } } launchOnIo { diff --git a/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/widget/BlockSyncChip.kt b/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/widget/BlockSyncChip.kt new file mode 100644 index 000000000..6b69806d5 --- /dev/null +++ b/app/src/main/java/com/tari/android/wallet/ui/screen/home/overview/widget/BlockSyncChip.kt @@ -0,0 +1,116 @@ +package com.tari.android.wallet.ui.screen.home.overview.widget + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.tari.android.wallet.R +import com.tari.android.wallet.ui.compose.PoppinsFontFamily +import com.tari.android.wallet.ui.compose.PreviewSecondarySurface +import com.tari.android.wallet.ui.compose.TariDesignSystem +import com.tari.android.wallet.ui.compose.components.TariProgressView +import com.tari.android.wallet.ui.screen.settings.themeSelector.TariTheme + +@Composable +fun BlockSyncChip( + walletScannedHeight: Int, + chainTip: Int, + modifier: Modifier = Modifier, +) { + Row( + modifier = modifier + .wrapContentSize(align = Alignment.CenterStart) + .height(26.dp) + .clip(TariDesignSystem.shapes.button) + .background(color = TariDesignSystem.colors.backgroundAccent) + .padding(horizontal = 6.dp), + horizontalArrangement = Arrangement.spacedBy(6.dp, Alignment.CenterHorizontally), + verticalAlignment = Alignment.CenterVertically, + ) { + val isSyncing = walletScannedHeight == 0 || walletScannedHeight != chainTip + + if (isSyncing) { + TariProgressView(Modifier.size(14.dp)) + } else { + Image( + painter = painterResource(id = R.drawable.vector_block_synced), + contentDescription = null, + ) + } + + if (isSyncing) { + Text( + text = stringResource(R.string.home_block_sync_syncing), + style = TextStyle( + fontSize = 11.sp, + lineHeight = 27.sp, + fontFamily = PoppinsFontFamily, + fontWeight = FontWeight(600), + color = TariDesignSystem.colors.textPrimary, + ), + ) + if (chainTip != 0) { + Text( + text = stringResource(R.string.home_block_sync_blocks_remaining, chainTip - walletScannedHeight), + style = TextStyle( + fontSize = 11.sp, + fontFamily = PoppinsFontFamily, + fontWeight = FontWeight(500), + color = TariDesignSystem.colors.textPrimary, + ), + ) + } + } else { + Text( + text = stringResource(R.string.home_block_sync_synced, chainTip), + style = TextStyle( + fontSize = 11.sp, + lineHeight = 27.sp, + fontFamily = PoppinsFontFamily, + fontWeight = FontWeight(600), + color = TariDesignSystem.colors.textPrimary, + ), + ) + } + } +} + +@Composable +@Preview +private fun BlockSyncChipPreview() { + PreviewSecondarySurface(TariTheme.Light) { + BlockSyncChip( + walletScannedHeight = 0, + chainTip = 0, + modifier = Modifier.padding(16.dp), + ) + + BlockSyncChip( + walletScannedHeight = 666, + chainTip = 1009, + modifier = Modifier.padding(16.dp), + ) + + BlockSyncChip( + walletScannedHeight = 1009, + chainTip = 1009, + modifier = Modifier.padding(16.dp), + ) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/vector_block_synced.xml b/app/src/main/res/drawable/vector_block_synced.xml new file mode 100644 index 000000000..2d1187d49 --- /dev/null +++ b/app/src/main/res/drawable/vector_block_synced.xml @@ -0,0 +1,17 @@ + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 177c85686..d13188d9c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -182,6 +182,9 @@ This is the amount you can use right now. Some rewards take time to unlock or confirm. Let\'s go! Watch The Trailer + Synced to block #%s + %s blocks remaining + Syncing Log in to Tari Universe