From e0376c2791f0a1fb45519adbd2add10da62bd4a7 Mon Sep 17 00:00:00 2001 From: Rafael Muhamedzyanov Date: Thu, 11 Jan 2024 18:27:39 +0600 Subject: [PATCH] Add Used Change Addresses in Receive page --- .../depositcex/DepositAddressViewModel.kt | 2 + .../modules/depositcex/DepositCexFragment.kt | 4 +- .../modules/receive/ReceiveFragment.kt | 4 +- .../modules/receive/ReceiveModule.kt | 1 + .../receive/ui/ReceiveAddressScreen.kt | 4 +- .../modules/receive/ui/UsedAddressesScreen.kt | 74 +++++++++++++++---- .../viewmodels/ReceiveAddressViewModel.kt | 4 + app/src/main/res/values/strings.xml | 2 + 8 files changed, 76 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/io/horizontalsystems/bankwallet/modules/depositcex/DepositAddressViewModel.kt b/app/src/main/java/io/horizontalsystems/bankwallet/modules/depositcex/DepositAddressViewModel.kt index 806c05c0e6b..8ffb08ad403 100644 --- a/app/src/main/java/io/horizontalsystems/bankwallet/modules/depositcex/DepositAddressViewModel.kt +++ b/app/src/main/java/io/horizontalsystems/bankwallet/modules/depositcex/DepositAddressViewModel.kt @@ -38,6 +38,7 @@ class DepositAddressViewModel( viewState = viewState, address = address, usedAddresses = listOf(), + usedChangeAddresses = listOf(), uri = uri, networkName = networkName, watchAccount = watchAccount, @@ -80,6 +81,7 @@ class DepositAddressViewModel( viewState = viewState, address = address, usedAddresses = listOf(), + usedChangeAddresses = listOf(), uri = uri, networkName = networkName, watchAccount = watchAccount, diff --git a/app/src/main/java/io/horizontalsystems/bankwallet/modules/depositcex/DepositCexFragment.kt b/app/src/main/java/io/horizontalsystems/bankwallet/modules/depositcex/DepositCexFragment.kt index 0f7ee203b9c..fcd34095097 100644 --- a/app/src/main/java/io/horizontalsystems/bankwallet/modules/depositcex/DepositCexFragment.kt +++ b/app/src/main/java/io/horizontalsystems/bankwallet/modules/depositcex/DepositCexFragment.kt @@ -88,8 +88,8 @@ fun CexDepositScreen( type = "text/plain" }) }, - showUsedAddresses = { usedAddresses -> - viewModel.usedAddressesParams = UsedAddressesParams(cexAsset.name, usedAddresses) + showUsedAddresses = { usedAddresses, usedChangeAddresses -> + viewModel.usedAddressesParams = UsedAddressesParams(cexAsset.name, usedAddresses, usedChangeAddresses) navController.navigate(USED_ADDRESS_SCREEN) }, onBackPress = navigateBack(fragmentNavController, navController), diff --git a/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/ReceiveFragment.kt b/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/ReceiveFragment.kt index 141d47f0d88..09f133e4d2c 100644 --- a/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/ReceiveFragment.kt +++ b/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/ReceiveFragment.kt @@ -100,8 +100,8 @@ fun ReceiveScreen( type = "text/plain" }) }, - showUsedAddresses = { usedAddresses -> - viewModel.usedAddressesParams = UsedAddressesParams(walletNonNull.coin.name, usedAddresses) + showUsedAddresses = { usedAddresses, usedChangeAddresses -> + viewModel.usedAddressesParams = UsedAddressesParams(walletNonNull.coin.name, usedAddresses, usedChangeAddresses) navController.navigate(USED_ADDRESSES_SCREEN) }, onBackPress = navigateBack(fragmentNavController, navController), diff --git a/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/ReceiveModule.kt b/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/ReceiveModule.kt index 07137a7183b..77fab4f6d10 100644 --- a/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/ReceiveModule.kt +++ b/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/ReceiveModule.kt @@ -28,6 +28,7 @@ object ReceiveModule { val viewState: ViewState, val address: String, val usedAddresses: List, + val usedChangeAddresses: List, val uri: String, val networkName: String, val watchAccount: Boolean, diff --git a/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/ui/ReceiveAddressScreen.kt b/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/ui/ReceiveAddressScreen.kt index a5ca3f13c45..e69f61ccc4c 100644 --- a/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/ui/ReceiveAddressScreen.kt +++ b/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/ui/ReceiveAddressScreen.kt @@ -102,7 +102,7 @@ fun ReceiveAddressScreen( setAmount: (BigDecimal?) -> Unit, onErrorClick: () -> Unit = {}, onShareClick: (String) -> Unit, - showUsedAddresses: (List) -> Unit, + showUsedAddresses: (List, List) -> Unit, onBackPress: () -> Unit, closeModule: () -> Unit, ) { @@ -254,7 +254,7 @@ fun ReceiveAddressScreen( RowUniversal( modifier = Modifier.height(48.dp), onClick = { - showUsedAddresses.invoke(uiState.usedAddresses) + showUsedAddresses.invoke(uiState.usedAddresses, uiState.usedChangeAddresses) } ) { subhead2_grey( diff --git a/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/ui/UsedAddressesScreen.kt b/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/ui/UsedAddressesScreen.kt index db9a103cb04..c45fc7758d4 100644 --- a/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/ui/UsedAddressesScreen.kt +++ b/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/ui/UsedAddressesScreen.kt @@ -1,14 +1,21 @@ package io.horizontalsystems.bankwallet.modules.receive.ui +import androidx.annotation.StringRes +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.Scaffold import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -26,6 +33,8 @@ import io.horizontalsystems.bankwallet.ui.compose.components.HSpacer import io.horizontalsystems.bankwallet.ui.compose.components.HsBackButton import io.horizontalsystems.bankwallet.ui.compose.components.InfoText import io.horizontalsystems.bankwallet.ui.compose.components.RowUniversal +import io.horizontalsystems.bankwallet.ui.compose.components.TabItem +import io.horizontalsystems.bankwallet.ui.compose.components.Tabs import io.horizontalsystems.bankwallet.ui.compose.components.VSpacer import io.horizontalsystems.bankwallet.ui.compose.components.subhead2_grey import io.horizontalsystems.bankwallet.ui.compose.components.subhead2_leah @@ -35,14 +44,25 @@ import io.horizontalsystems.core.helpers.HudHelper data class UsedAddressesParams( val coinName: String, - val usedAddresses: List + val usedAddresses: List, + val usedChangeAddresses: List ) +enum class UsedAddressTab(@StringRes val titleResId: Int) { + ReceiveAddress(R.string.Balance_Receive_ReceiveAddresses), + ChangeAddress(R.string.Balance_Receive_ChangeAddresses); +} + +@OptIn(ExperimentalFoundationApi::class) @Composable fun UsedAddressScreen( params: UsedAddressesParams, onBackPress: () -> Unit ) { + val tabs = UsedAddressTab.values() + var selectedTab by remember { mutableStateOf(UsedAddressTab.ReceiveAddress) } + val pagerState = rememberPagerState(initialPage = selectedTab.ordinal) { tabs.size } + Scaffold( backgroundColor = ComposeAppTheme.colors.tyler, topBar = { @@ -51,7 +71,6 @@ fun UsedAddressScreen( navigationIcon = { HsBackButton(onClick = onBackPress) } - ) } ) { @@ -64,22 +83,51 @@ fun UsedAddressScreen( ) { InfoText(text = stringResource(id = R.string.Balance_Receive_UsedAddressesDescriptoin, params.coinName)) - Spacer(Modifier.height(12.dp)) - - CellUniversalLawrenceSection( - buildList { - for (item in params.usedAddresses) - add { - TransactionInfoAddressCell(index = item.index.toString(), address = item.address, explorerUrl = item.explorerUrl) - } + + VSpacer(12.dp) + + LaunchedEffect(key1 = selectedTab, block = { + pagerState.scrollToPage(selectedTab.ordinal) + }) + val tabItems = tabs.map { + TabItem(stringResource(id = it.titleResId), it == selectedTab, it) + } + Tabs(tabItems, onClick = { selectedTab = it }) + + VSpacer(12.dp) + + HorizontalPager( + state = pagerState, + userScrollEnabled = false + ) { page -> + when (tabs[page]) { + UsedAddressTab.ReceiveAddress -> AddressList(params.usedAddresses) + + UsedAddressTab.ChangeAddress -> AddressList(params.usedChangeAddresses) } - ) + } VSpacer(24.dp) } } } +@Composable +private fun AddressList(usedAddresses: List) { + CellUniversalLawrenceSection( + buildList { + for (item in usedAddresses) + add { + TransactionInfoAddressCell( + index = item.index.plus(1).toString(), + address = item.address, + explorerUrl = item.explorerUrl + ) + } + } + ) +} + @Composable fun TransactionInfoAddressCell( index: String, diff --git a/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/viewmodels/ReceiveAddressViewModel.kt b/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/viewmodels/ReceiveAddressViewModel.kt index 40ee12e6d22..1912ddb9b72 100644 --- a/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/viewmodels/ReceiveAddressViewModel.kt +++ b/app/src/main/java/io/horizontalsystems/bankwallet/modules/receive/viewmodels/ReceiveAddressViewModel.kt @@ -31,6 +31,7 @@ class ReceiveAddressViewModel( private var viewState: ViewState = ViewState.Loading private var address = "" private var usedAddresses: List = listOf() + private var usedChangeAddresses: List = listOf() private var uri = "" private var amount: BigDecimal? = null private var accountActive = true @@ -44,6 +45,7 @@ class ReceiveAddressViewModel( viewState = viewState, address = address, usedAddresses = usedAddresses, + usedChangeAddresses = usedChangeAddresses, uri = uri, networkName = networkName, watchAccount = watchAccount, @@ -104,6 +106,7 @@ class ReceiveAddressViewModel( if (adapter != null) { address = adapter.receiveAddress usedAddresses = adapter.usedAddresses(false) + usedChangeAddresses = adapter.usedAddresses(true) uri = getUri() accountActive = adapter.isAccountActive mainNet = adapter.isMainNet @@ -136,6 +139,7 @@ class ReceiveAddressViewModel( viewState = viewState, address = address, usedAddresses = usedAddresses, + usedChangeAddresses = usedChangeAddresses, uri = uri, networkName = networkName, watchAccount = watchAccount, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 55d010ff512..0893e810d54 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -382,6 +382,8 @@ Provide required Memo (Tag) and send only network-compatible tokens. Others will be lost. Used Addresses %s addresses change for privacy and security. Below a list of used addresses in this wallet. + Receive Addresses + Change Addresses Send