diff --git a/CHANGELOG.md b/CHANGELOG.md index cb6f6983..7249374e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,11 +9,12 @@ directly impact users rather than highlighting other key architectural updates.* ## [Unreleased] -### Fixed -- The app navigation has been improved to always behave the same for system, gesture, or top app bar back navigation actions. - ### Added - Proper ZEC amount abbreviation has been added across the entire app as described by the design document +- The new Hide Balances feature has been added to the Account, Send, and Balances screen. + +### Fixed +- The app navigation has been improved to always behave the same for system, gesture, or top app bar back navigation actions ### Fixed - The app authentication now correctly handles authentication success after a previous failed state diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Balance.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Balance.kt index efa0e7aa..086e7be4 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Balance.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/Balance.kt @@ -1,18 +1,24 @@ package co.electriccoin.zcash.ui.design.component +import androidx.compose.animation.animateContentSize import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.basicMarquee import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp import cash.z.ecc.android.sdk.model.MonetarySeparators import co.electriccoin.zcash.spackle.Twig +import co.electriccoin.zcash.ui.design.R import co.electriccoin.zcash.ui.design.theme.ZcashTheme import java.util.Locale @@ -24,6 +30,20 @@ private fun StyledBalanceComposablePreview() { Column { StyledBalance( balanceParts = ZecAmountTriple(main = "1,234.56789012"), + isHideBalances = false, + textStyles = + Pair( + ZcashTheme.extendedTypography.balanceWidgetStyles.first, + ZcashTheme.extendedTypography.balanceWidgetStyles.second + ), + modifier = Modifier + ) + + Spacer(modifier = Modifier.height(24.dp)) + + StyledBalance( + balanceParts = ZecAmountTriple(main = "1,234.56789012"), + isHideBalances = true, textStyles = Pair( ZcashTheme.extendedTypography.balanceWidgetStyles.first, @@ -41,52 +61,67 @@ private fun StyledBalanceComposablePreview() { * requirements. The function displays the balance within two parts. * * @param balanceParts [ZecAmountTriple] class that holds balance parts + * @param isHideBalances Flag referring about the balance being hidden or not + * @param hiddenBalancePlaceholder String holding the placeholder for the hidden balance * @param textStyles Styles for the first and second part of the balance * @param textColor Optional color to modify the default font color from [textStyles] * @param modifier Modifier to modify the Text UI element as needed */ @OptIn(ExperimentalFoundationApi::class) +@Suppress("LongParameterList") @Composable fun StyledBalance( balanceParts: ZecAmountTriple, textStyles: Pair, modifier: Modifier = Modifier, + isHideBalances: Boolean = false, + hiddenBalancePlaceholder: String = stringResource(id = R.string.hide_balance_placeholder), textColor: Color? = null, ) { - val balanceSplit = splitBalance(balanceParts) - val content = - buildAnnotatedString { - withStyle( - style = textStyles.first.toSpanStyle() - ) { - append(balanceSplit.first) + if (isHideBalances) { + buildAnnotatedString { + withStyle( + style = textStyles.first.toSpanStyle() + ) { + append(hiddenBalancePlaceholder) + } } - withStyle( - style = textStyles.second.toSpanStyle() - ) { - append(balanceSplit.second) + } else { + val balanceSplit = splitBalance(balanceParts) + + buildAnnotatedString { + withStyle( + style = textStyles.first.toSpanStyle() + ) { + append(balanceSplit.first) + } + withStyle( + style = textStyles.second.toSpanStyle() + ) { + append(balanceSplit.second) + } } } + val resultModifier = + Modifier + .basicMarquee() + .animateContentSize() + .then(modifier) + if (textColor != null) { Text( text = content, color = textColor, maxLines = 1, - modifier = - Modifier - .basicMarquee() - .then(modifier) + modifier = resultModifier ) } else { Text( text = content, maxLines = 1, - modifier = - Modifier - .basicMarquee() - .then(modifier) + modifier = resultModifier ) } } diff --git a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/TopAppBar.kt b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/TopAppBar.kt index 7c384a44..8c3634c4 100644 --- a/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/TopAppBar.kt +++ b/ui-design-lib/src/main/java/co/electriccoin/zcash/ui/design/component/TopAppBar.kt @@ -3,7 +3,6 @@ package co.electriccoin.zcash.ui.design.component import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope @@ -34,6 +33,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign @@ -51,7 +51,16 @@ import co.electriccoin.zcash.ui.design.theme.internal.TopAppBarColors private fun TopAppBarTextComposablePreview() { ZcashTheme(forceDarkMode = false) { BlankSurface { - SmallTopAppBar(titleText = "Screen A", backText = "Back") + SmallTopAppBar( + navigationAction = { + TopAppBarBackNavigation( + onBack = {}, + backText = "BACK", + backContentDescriptionText = "BACK" + ) + }, + titleText = "Screen A" + ) } } } @@ -61,7 +70,16 @@ private fun TopAppBarTextComposablePreview() { private fun TopAppBarTextDarkComposablePreview() { ZcashTheme(forceDarkMode = true) { BlankSurface { - SmallTopAppBar(titleText = "Screen A", backText = "Back") + SmallTopAppBar( + navigationAction = { + TopAppBarBackNavigation( + onBack = {}, + backText = "BACK", + backContentDescriptionText = "BACK" + ) + }, + titleText = "Screen A" + ) } } } @@ -72,8 +90,14 @@ private fun TopAppBarTextRestoringComposablePreview() { ZcashTheme(forceDarkMode = false) { BlankSurface { SmallTopAppBar( + navigationAction = { + TopAppBarBackNavigation( + onBack = {}, + backText = "BACK", + backContentDescriptionText = "BACK" + ) + }, titleText = "Screen A", - backText = "Back", subTitle = "[RESTORING YOUR WALLET…]" ) } @@ -86,9 +110,15 @@ private fun TopAppBarTextRestoringLongComposablePreview() { ZcashTheme(forceDarkMode = false) { BlankSurface { SmallTopAppBar( + navigationAction = { + TopAppBarBackNavigation( + onBack = {}, + backText = "BACK", + backContentDescriptionText = "BACK" + ) + }, + subTitle = "[RESTORING YOUR WALLET LONG TEXT…]", titleText = "Screen A", - backText = "Back", - subTitle = "[RESTORING YOUR WALLET LONG TEXT…]" ) } } @@ -99,7 +129,16 @@ private fun TopAppBarTextRestoringLongComposablePreview() { private fun TopAppBarLogoComposablePreview() { ZcashTheme(forceDarkMode = false) { BlankSurface { - SmallTopAppBar(showTitleLogo = true, backText = "Back") + SmallTopAppBar( + navigationAction = { + TopAppBarBackNavigation( + onBack = {}, + backText = "BACK", + backContentDescriptionText = "BACK" + ) + }, + showTitleLogo = true + ) } } } @@ -110,8 +149,14 @@ private fun TopAppBarLogoRestoringComposablePreview() { ZcashTheme(forceDarkMode = false) { BlankSurface { SmallTopAppBar( + navigationAction = { + TopAppBarBackNavigation( + onBack = {}, + backText = "BACK", + backContentDescriptionText = "BACK" + ) + }, showTitleLogo = true, - backText = "Back", subTitle = "[RESTORING YOUR WALLET…]" ) } @@ -124,8 +169,14 @@ private fun TopAppBarLogoRestoringDarkComposablePreview() { ZcashTheme(forceDarkMode = true) { BlankSurface { SmallTopAppBar( + navigationAction = { + TopAppBarBackNavigation( + onBack = {}, + backText = "BACK", + backContentDescriptionText = "BACK" + ) + }, showTitleLogo = true, - backText = "Back", subTitle = "[RESTORING YOUR WALLET…]" ) } @@ -157,7 +208,13 @@ private fun TopAppBarOneVisibleActionMenuComposablePreview() { BlankSurface { SmallTopAppBar( titleText = "Screen C", - backText = "Back", + navigationAction = { + TopAppBarBackNavigation( + onBack = {}, + backText = "BACK", + backContentDescriptionText = "BACK" + ) + }, regularActions = { TopBarOneVisibleActionMenuExample( actionCallback = {} @@ -175,12 +232,18 @@ private fun TopAppBarHamburgerMenuComposablePreview() { BlankSurface { SmallTopAppBar( titleText = "Screen D", - backText = "Back", hamburgerMenuActions = { TopBarHamburgerMenuExample( actionCallback = {} ) - } + }, + navigationAction = { + TopAppBarBackNavigation( + onBack = {}, + backText = "BACK", + backContentDescriptionText = "BACK" + ) + }, ) } } @@ -285,15 +348,61 @@ private fun TopBarOneVisibleActionMenuExample( ) } +@Composable +fun TopAppBarBackNavigation( + backContentDescriptionText: String? = null, + backIconVector: ImageVector = Icons.AutoMirrored.Filled.ArrowBack, + backText: String? = null, + onBack: () -> Unit +) { + Row( + modifier = + Modifier + .wrapContentSize() + .clip(RoundedCornerShape(ZcashTheme.dimens.regularRippleEffectCorner)) + .clickable { onBack() } + .padding(all = ZcashTheme.dimens.spacingMid), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = backIconVector, + contentDescription = backContentDescriptionText, + ) + + backText?.let { + Spacer(modifier = Modifier.size(size = ZcashTheme.dimens.spacingSmall)) + + Text(text = backText) + } + } +} + +@Composable +fun TopAppBarHideBalancesNavigation( + iconVector: ImageVector, + onClick: () -> Unit, + modifier: Modifier = Modifier, + contentDescription: String? = null, +) { + IconButton( + onClick = onClick, + modifier = modifier + ) { + Icon( + imageVector = iconVector, + contentDescription = contentDescription, + modifier = Modifier.size(24.dp) + ) + } +} + @Composable @Suppress("LongParameterList") fun GridBgSmallTopAppBar( modifier: Modifier = Modifier, - backContentDescriptionText: String? = null, - backText: String? = null, colors: TopAppBarColors = ZcashTheme.colors.topAppBarColors, hamburgerMenuActions: (@Composable RowScope.() -> Unit)? = null, - onBack: (() -> Unit)? = null, + navigationAction: @Composable () -> Unit = {}, regularActions: (@Composable RowScope.() -> Unit)? = null, subTitle: String? = null, showTitleLogo: Boolean = false, @@ -309,11 +418,9 @@ fun GridBgSmallTopAppBar( gridLineWidth = ZcashTheme.dimens.gridLineWidth ) ), - backContentDescriptionText = backContentDescriptionText, - backText = backText, colors = colors.copyColors(containerColor = Color.Transparent), hamburgerMenuActions = hamburgerMenuActions, - onBack = onBack, + navigationAction = navigationAction, regularActions = regularActions, subTitle = subTitle, showTitleLogo = showTitleLogo, @@ -322,15 +429,13 @@ fun GridBgSmallTopAppBar( } @Composable -@Suppress("LongParameterList", "LongMethod") +@Suppress("LongParameterList") @OptIn(ExperimentalMaterial3Api::class) fun SmallTopAppBar( modifier: Modifier = Modifier, - backContentDescriptionText: String? = null, - backText: String? = null, colors: TopAppBarColors = ZcashTheme.colors.topAppBarColors, hamburgerMenuActions: (@Composable RowScope.() -> Unit)? = null, - onBack: (() -> Unit)? = null, + navigationAction: @Composable () -> Unit = {}, regularActions: (@Composable RowScope.() -> Unit)? = null, subTitle: String? = null, showTitleLogo: Boolean = false, @@ -377,28 +482,7 @@ fun SmallTopAppBar( } }, navigationIcon = { - backText?.let { - Box( - modifier = - Modifier - .wrapContentSize() - .clip(RoundedCornerShape(ZcashTheme.dimens.regularRippleEffectCorner)) - .clickable { onBack?.run { onBack() } } - ) { - Row( - modifier = Modifier.padding(all = ZcashTheme.dimens.spacingDefault), - verticalAlignment = Alignment.CenterVertically - ) { - Icon( - imageVector = Icons.AutoMirrored.Filled.ArrowBack, - contentDescription = backContentDescriptionText, - tint = colors.navigationColor, - ) - Spacer(modifier = Modifier.size(size = ZcashTheme.dimens.spacingSmall)) - Text(text = backText.uppercase()) - } - } - } + navigationAction() }, actions = { regularActions?.invoke(this) diff --git a/ui-design-lib/src/main/res/ui/common/values/strings.xml b/ui-design-lib/src/main/res/ui/common/values/strings.xml index 1a035bc1..a1b06d5b 100644 --- a/ui-design-lib/src/main/res/ui/common/values/strings.xml +++ b/ui-design-lib/src/main/res/ui/common/values/strings.xml @@ -1,3 +1,4 @@ %1$s%2$s + ----- diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/about/view/AboutViewTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/about/view/AboutViewTest.kt index c9147422..8e550c6f 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/about/view/AboutViewTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/about/view/AboutViewTest.kt @@ -26,7 +26,7 @@ class AboutViewTest { assertEquals(0, testSetup.getOnBackCount()) - composeTestRule.onNodeWithText(getStringResource(R.string.about_back).uppercase()).also { + composeTestRule.onNodeWithText(getStringResource(R.string.back_navigation).uppercase()).also { it.assertExists() } @@ -61,7 +61,9 @@ class AboutViewTest { assertEquals(0, testSetup.getOnBackCount()) - composeTestRule.onNodeWithContentDescription(getStringResource(R.string.about_back_content_description)).also { + composeTestRule.onNodeWithContentDescription( + getStringResource(R.string.back_navigation_content_description) + ).also { it.performClick() } diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/AccountTestSetup.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/AccountTestSetup.kt index e41a8250..1d414807 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/AccountTestSetup.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/AccountTestSetup.kt @@ -24,6 +24,7 @@ class AccountTestSetup( val initialTransactionState: TransactionUiState = TransactionHistoryUiStateFixture.new() private val onSettingsCount = AtomicInteger(0) + private val onHideBalancesCount = AtomicInteger(0) private val onReceiveCount = AtomicInteger(0) private val onSendCount = AtomicInteger(0) private val onItemClickCount = AtomicInteger(0) @@ -44,6 +45,11 @@ class AccountTestSetup( return onSettingsCount.get() } + fun getOnHideBalancesCount(): Int { + composeTestRule.waitForIdle() + return onHideBalancesCount.get() + } + fun getOnReceiveCount(): Int { composeTestRule.waitForIdle() return onReceiveCount.get() @@ -61,31 +67,35 @@ class AccountTestSetup( @Composable @Suppress("TestFunctionName") - fun DefaultContent() { + fun DefaultContent(isHideBalances: Boolean) { Account( balanceState = BalanceStateFixture.new(), goSettings = { onSettingsCount.incrementAndGet() }, goBalances = {}, - transactionsUiState = initialTransactionState, + hideStatusDialog = {}, + onHideBalances = { + onHideBalancesCount.incrementAndGet() + }, + isHideBalances = isHideBalances, onTransactionItemAction = { onItemClickCount.incrementAndGet() }, - hideStatusDialog = {}, - showStatusDialog = null, onStatusClick = {}, + showStatusDialog = null, snackbarHostState = SnackbarHostState(), topAppBarSubTitleState = TopAppBarSubTitleState.None, + transactionsUiState = initialTransactionState, walletRestoringState = WalletRestoringState.NONE, walletSnapshot = WalletSnapshotFixture.new(), ) } - fun setDefaultContent() { + fun setDefaultContent(isHideBalances: Boolean = false) { composeTestRule.setContent { ZcashTheme { - DefaultContent() + DefaultContent(isHideBalances) } } } diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/history/HistoryTestSetup.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/history/HistoryTestSetup.kt index 9f3a226c..13502bf0 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/history/HistoryTestSetup.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/history/HistoryTestSetup.kt @@ -29,11 +29,12 @@ class HistoryTestSetup( composeTestRule.setContent { ZcashTheme { HistoryContainer( - transactionState = initialHistoryUiState, + isHideBalances = false, onStatusClick = {}, onTransactionItemAction = { onItemIdClickCount.incrementAndGet() }, + transactionState = initialHistoryUiState, walletRestoringState = WalletRestoringState.NONE, walletSnapshot = WalletSnapshotFixture.new() ) diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/integration/AccountViewIntegrationTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/integration/AccountViewIntegrationTest.kt index 2288de38..9813055f 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/integration/AccountViewIntegrationTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/integration/AccountViewIntegrationTest.kt @@ -40,7 +40,7 @@ class AccountViewIntegrationTest : UiTestPrerequisites() { val testSetup = newTestSetup(walletSnapshot) restorationTester.setContent { - testSetup.DefaultContent() + testSetup.DefaultContent(isHideBalances = false) } assertEquals(WalletSnapshotFixture.SAPLING_BALANCE, testSetup.getWalletSnapshot().saplingBalance) diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/view/AccountViewTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/view/AccountViewTest.kt index a9e0b029..37a7b2bc 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/view/AccountViewTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/account/view/AccountViewTest.kt @@ -10,6 +10,7 @@ import co.electriccoin.zcash.ui.design.component.CommonTag import co.electriccoin.zcash.ui.fixture.WalletSnapshotFixture import co.electriccoin.zcash.ui.screen.account.AccountTag import co.electriccoin.zcash.ui.screen.account.AccountTestSetup +import co.electriccoin.zcash.ui.screen.send.clickHideBalances import co.electriccoin.zcash.ui.screen.send.clickSettingsTopAppBarMenu import org.junit.Assert import org.junit.Rule @@ -49,11 +50,25 @@ class AccountViewTest : UiTestPrerequisites() { Assert.assertEquals(1, testSetup.getOnSettingsCount()) } - private fun newTestSetup(walletSnapshot: WalletSnapshot = WalletSnapshotFixture.new()) = - AccountTestSetup( - composeTestRule, - walletSnapshot = walletSnapshot, - ).apply { - setDefaultContent() - } + @Test + @MediumTest + fun hide_balances_btn_click_test() { + val testSetup = newTestSetup() + + Assert.assertEquals(0, testSetup.getOnHideBalancesCount()) + + composeTestRule.clickHideBalances() + + Assert.assertEquals(1, testSetup.getOnHideBalancesCount()) + } + + private fun newTestSetup( + walletSnapshot: WalletSnapshot = WalletSnapshotFixture.new(), + isHideBalances: Boolean = false + ) = AccountTestSetup( + composeTestRule, + walletSnapshot = walletSnapshot, + ).apply { + setDefaultContent(isHideBalances) + } } diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/balances/BalancesTestSetup.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/balances/BalancesTestSetup.kt index 97099c90..d95d16af 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/balances/BalancesTestSetup.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/balances/BalancesTestSetup.kt @@ -38,6 +38,8 @@ class BalancesTestSetup( onSettingsCount.incrementAndGet() }, hideStatusDialog = {}, + isHideBalances = false, + onHideBalances = {}, showStatusDialog = null, onStatusClick = {}, snackbarHostState = SnackbarHostState(), diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/exportdata/view/ExportPrivateDataViewTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/exportdata/view/ExportPrivateDataViewTest.kt index e7a3f3eb..f8c907c7 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/exportdata/view/ExportPrivateDataViewTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/exportdata/view/ExportPrivateDataViewTest.kt @@ -113,7 +113,7 @@ class ExportPrivateDataViewTest : UiTestPrerequisites() { } private fun ComposeContentTestRule.clickBack() { - onNodeWithContentDescription(getStringResource(R.string.support_back_content_description)).also { + onNodeWithContentDescription(getStringResource(R.string.back_navigation_content_description)).also { it.performClick() } } diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreViewTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreViewTest.kt index 6dc23a61..a4d8018d 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreViewTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreViewTest.kt @@ -311,7 +311,7 @@ class RestoreViewTest : UiTestPrerequisites() { assertEquals(0, testSetup.getOnBackCount()) composeTestRule.onNodeWithContentDescription( - getStringResource(R.string.restore_back_content_description) + getStringResource(R.string.back_navigation_content_description) ).also { it.performClick() } @@ -331,7 +331,7 @@ class RestoreViewTest : UiTestPrerequisites() { assertEquals(0, testSetup.getOnBackCount()) composeTestRule.onNodeWithContentDescription( - getStringResource(R.string.restore_back_content_description) + getStringResource(R.string.back_navigation_content_description) ).also { it.performClick() } diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/securitywarning/view/SecurityWarningViewTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/securitywarning/view/SecurityWarningViewTest.kt index 27848e8e..23717033 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/securitywarning/view/SecurityWarningViewTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/securitywarning/view/SecurityWarningViewTest.kt @@ -98,7 +98,7 @@ class SecurityWarningViewTest : UiTestPrerequisites() { } private fun ComposeContentTestRule.clickBack() { - onNodeWithContentDescription(getStringResource(R.string.support_back_content_description)).also { + onNodeWithContentDescription(getStringResource(R.string.back_navigation_content_description)).also { it.performClick() } } diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/seedrecovery/view/SeedRecoveryRecoveryViewTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/seedrecovery/view/SeedRecoveryRecoveryViewTest.kt index 26601ec2..ddf515a1 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/seedrecovery/view/SeedRecoveryRecoveryViewTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/seedrecovery/view/SeedRecoveryRecoveryViewTest.kt @@ -39,7 +39,7 @@ class SeedRecoveryRecoveryViewTest : UiTestPrerequisites() { assertEquals(0, testSetup.getOnCompleteCount()) assertEquals(0, testSetup.getOnBackCount()) - composeTestRule.onNodeWithContentDescription(getStringResource(R.string.seed_recovery_back_content_description)) + composeTestRule.onNodeWithContentDescription(getStringResource(R.string.back_navigation_content_description)) .also { it.assertExists() } @@ -86,7 +86,7 @@ class SeedRecoveryRecoveryViewTest : UiTestPrerequisites() { assertEquals(0, testSetup.getOnBackCount()) - composeTestRule.onNodeWithContentDescription(getStringResource(R.string.seed_recovery_back_content_description)) + composeTestRule.onNodeWithContentDescription(getStringResource(R.string.back_navigation_content_description)) .also { it.performClick() } diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/send/ComposeContentTestRuleExt.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/send/ComposeContentTestRuleExt.kt index e3147801..48863234 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/send/ComposeContentTestRuleExt.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/send/ComposeContentTestRuleExt.kt @@ -24,6 +24,12 @@ internal fun ComposeContentTestRule.clickSettingsTopAppBarMenu() { } } +internal fun ComposeContentTestRule.clickHideBalances() { + onNodeWithContentDescription(getStringResource(R.string.hide_balances_content_description)).also { + it.performClick() + } +} + internal fun ComposeContentTestRule.clickScanner() { onNodeWithContentDescription(getStringResource(R.string.send_scan_content_description)).also { it.performClick() diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/send/SendViewTestSetup.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/send/SendViewTestSetup.kt index 6437a63d..9014c7cc 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/send/SendViewTestSetup.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/send/SendViewTestSetup.kt @@ -114,6 +114,8 @@ class SendViewTestSetup( // TODO [#1194]: Cover Current balances UI widget with tests // TODO [#1194]: https://github.com/Electric-Coin-Company/zashi-android/issues/1194 }, + isHideBalances = false, + onHideBalances = {}, hasCameraFeature = hasCameraFeature, recipientAddressState = RecipientAddressState("", AddressType.Invalid()), onRecipientAddressChange = { diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/send/integration/SendViewIntegrationTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/send/integration/SendViewIntegrationTest.kt index 198c1ed2..a252cad8 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/send/integration/SendViewIntegrationTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/send/integration/SendViewIntegrationTest.kt @@ -75,6 +75,8 @@ class SendViewIntegrationTest { goBalances = {}, goSettings = {}, goSendConfirmation = {}, + isHideBalances = false, + onHideBalances = {}, hasCameraFeature = true, monetarySeparators = monetarySeparators, topAppBarSubTitleState = TopAppBarSubTitleState.None, diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/settings/view/SettingsViewTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/settings/view/SettingsViewTest.kt index 4c102f8e..06adf780 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/settings/view/SettingsViewTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/settings/view/SettingsViewTest.kt @@ -31,7 +31,7 @@ class SettingsViewTest : UiTestPrerequisites() { assertEquals(0, testSetup.getBackCount()) composeTestRule.onNodeWithContentDescription( - getStringResource(R.string.settings_back_content_description) + getStringResource(R.string.back_navigation_content_description) ).also { it.performClick() } diff --git a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/support/view/SupportViewTest.kt b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/support/view/SupportViewTest.kt index 44986a63..b62931ab 100644 --- a/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/support/view/SupportViewTest.kt +++ b/ui-lib/src/androidTest/java/co/electriccoin/zcash/ui/screen/support/view/SupportViewTest.kt @@ -116,7 +116,7 @@ class SupportViewTest : UiTestPrerequisites() { } private fun ComposeContentTestRule.clickBack() { - onNodeWithContentDescription(getStringResource(R.string.support_back_content_description)).also { + onNodeWithContentDescription(getStringResource(R.string.back_navigation_content_description)).also { it.performClick() } } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/compose/BalanceWidget.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/compose/BalanceWidget.kt index e356c954..39b7bc8b 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/compose/BalanceWidget.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/compose/BalanceWidget.kt @@ -1,6 +1,5 @@ package co.electriccoin.zcash.ui.common.compose -import androidx.compose.animation.animateContentSize import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -46,6 +45,7 @@ private fun BalanceWidgetPreview() { totalBalance = Zatoshi(1234567891234567L), spendableBalance = Zatoshi(1234567891234567L) ), + isHideBalances = false, isReferenceToBalances = true, onReferenceClick = {}, modifier = Modifier @@ -65,6 +65,26 @@ private fun BalanceWidgetNotAvailableYetPreview() { @Suppress("MagicNumber") BalanceWidget( balanceState = BalanceState.Loading(Zatoshi(0L)), + isHideBalances = false, + isReferenceToBalances = true, + onReferenceClick = {}, + modifier = Modifier + ) + } + } +} + +@Preview +@Composable +private fun BalanceWidgetHiddenAmountPreview() { + ZcashTheme(forceDarkMode = false) { + BlankSurface( + modifier = Modifier.fillMaxWidth() + ) { + @Suppress("MagicNumber") + BalanceWidget( + balanceState = BalanceState.Loading(Zatoshi(0L)), + isHideBalances = true, isReferenceToBalances = true, onReferenceClick = {}, modifier = Modifier @@ -86,6 +106,7 @@ sealed class BalanceState(open val totalBalance: Zatoshi) { fun BalanceWidget( balanceState: BalanceState, isReferenceToBalances: Boolean, + isHideBalances: Boolean, onReferenceClick: () -> Unit, modifier: Modifier = Modifier ) { @@ -96,12 +117,12 @@ fun BalanceWidget( .then(modifier), horizontalAlignment = Alignment.CenterHorizontally ) { - BalanceWidgetBigLineOnly(parts = balanceState.totalBalance.toZecStringFull().asZecAmountTriple()) + BalanceWidgetBigLineOnly( + isHideBalances = isHideBalances, + parts = balanceState.totalBalance.toZecStringFull().asZecAmountTriple() + ) - Row( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.animateContentSize() - ) { + Row(verticalAlignment = Alignment.CenterVertically) { if (isReferenceToBalances) { Reference( text = stringResource(id = co.electriccoin.zcash.ui.R.string.balance_widget_available), @@ -135,6 +156,7 @@ fun BalanceWidget( is BalanceState.Available -> { StyledBalance( balanceParts = balanceState.spendableBalance.toZecStringFull().asZecAmountTriple(), + isHideBalances = isHideBalances, textStyles = Pair( ZcashTheme.extendedTypography.balanceWidgetStyles.third, @@ -157,6 +179,7 @@ fun BalanceWidget( @Composable fun BalanceWidgetBigLineOnly( parts: ZecAmountTriple, + isHideBalances: Boolean, modifier: Modifier = Modifier ) { Row( @@ -165,6 +188,7 @@ fun BalanceWidgetBigLineOnly( ) { StyledBalance( balanceParts = parts, + isHideBalances = isHideBalances, textStyles = Pair( ZcashTheme.extendedTypography.balanceWidgetStyles.first, diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/test/CommonTag.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/test/CommonTag.kt index 1e85fb0f..412e8124 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/test/CommonTag.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/test/CommonTag.kt @@ -6,4 +6,5 @@ package co.electriccoin.zcash.ui.common.test object CommonTag { const val WALLET_BIRTHDAY = "wallet_birthday" const val SETTINGS_TOP_BAR_BUTTON = "settings_top_bar_button" + const val HIDE_BALANCES_TOP_BAR_BUTTON = "hide_balances_top_bar_button" } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/viewmodel/HomeViewModel.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/viewmodel/HomeViewModel.kt index f89f37a7..01594da5 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/viewmodel/HomeViewModel.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/common/viewmodel/HomeViewModel.kt @@ -13,6 +13,8 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.WhileSubscribed import kotlinx.coroutines.flow.emitAll +import kotlinx.coroutines.flow.filterNotNull +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch @@ -40,6 +42,29 @@ class HomeViewModel(application: Application) : AndroidViewModel(application) { setBooleanPreference(StandardPreferenceKeys.IS_RESTORING_INITIAL_WARNING_SEEN, true) } + /** + * A flow of the wallet balances visibility. + */ + val isHideBalances: StateFlow = booleanStateFlow(StandardPreferenceKeys.IS_HIDE_BALANCES) + + fun showOrHideBalances() { + viewModelScope.launch { + setBooleanPreference(StandardPreferenceKeys.IS_HIDE_BALANCES, isHideBalances.filterNotNull().first().not()) + } + } + + val configurationFlow: StateFlow = + AndroidConfigurationFactory.getInstance(application).getConfigurationFlow() + .stateIn( + viewModelScope, + SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT.inWholeMilliseconds), + null + ) + + // + // PRIVATE HELPERS + // + private fun booleanStateFlow(default: BooleanPreferenceDefault): StateFlow = flow { val preferenceProvider = StandardPreferenceSingleton.getInstance(getApplication()) @@ -50,14 +75,6 @@ class HomeViewModel(application: Application) : AndroidViewModel(application) { null ) - val configurationFlow: StateFlow = - AndroidConfigurationFactory.getInstance(application).getConfigurationFlow() - .stateIn( - viewModelScope, - SharingStarted.WhileSubscribed(ANDROID_STATE_FLOW_TIMEOUT.inWholeMilliseconds), - null - ) - private fun setBooleanPreference( default: BooleanPreferenceDefault, newState: Boolean diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/preference/StandardPreferenceKeys.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/preference/StandardPreferenceKeys.kt index aade63bf..a56a3f87 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/preference/StandardPreferenceKeys.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/preference/StandardPreferenceKeys.kt @@ -32,8 +32,6 @@ object StandardPreferenceKeys { val IS_KEEP_SCREEN_ON_DURING_SYNC = BooleanPreferenceDefault(PreferenceKey("is_keep_screen_on_during_sync"), true) - val IS_DETAILED_SYNC_STATUS = BooleanPreferenceDefault(PreferenceKey("is_detailed_sync_status"), false) - val IS_RESTORING_INITIAL_WARNING_SEEN = BooleanPreferenceDefault(PreferenceKey("IS_RESTORING_INITIAL_WARNING_SEEN"), false) @@ -70,4 +68,9 @@ object StandardPreferenceKeys { PreferenceKey("IS_SEND_FUNDS_AUTHENTICATION"), true ) + val IS_HIDE_BALANCES = + BooleanPreferenceDefault( + PreferenceKey("IS_HIDE_BALANCES"), + false + ) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/about/view/AboutView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/about/view/AboutView.kt index 4a653562..dbdc2c70 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/about/view/AboutView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/about/view/AboutView.kt @@ -44,6 +44,7 @@ import co.electriccoin.zcash.ui.common.model.TopAppBarSubTitleState import co.electriccoin.zcash.ui.common.model.VersionInfo import co.electriccoin.zcash.ui.design.component.BlankBgScaffold import co.electriccoin.zcash.ui.design.component.SmallTopAppBar +import co.electriccoin.zcash.ui.design.component.TopAppBarBackNavigation import co.electriccoin.zcash.ui.design.theme.ZcashTheme import co.electriccoin.zcash.ui.fixture.ConfigInfoFixture import co.electriccoin.zcash.ui.fixture.VersionInfoFixture @@ -119,9 +120,13 @@ private fun AboutTopAppBar( TopAppBarSubTitleState.None -> null }, titleText = stringResource(id = R.string.about_title).uppercase(), - backText = stringResource(id = R.string.about_back).uppercase(), - backContentDescriptionText = stringResource(R.string.about_back_content_description), - onBack = onBack, + navigationAction = { + TopAppBarBackNavigation( + backText = stringResource(id = R.string.back_navigation).uppercase(), + backContentDescriptionText = stringResource(R.string.back_navigation_content_description), + onBack = onBack + ) + }, regularActions = { if (versionInfo.isDebuggable && !versionInfo.isRunningUnderTestService) { DebugMenu(versionInfo, configInfo) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/account/AndroidAccount.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/account/AndroidAccount.kt index ea9a8a84..621bf724 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/account/AndroidAccount.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/account/AndroidAccount.kt @@ -20,6 +20,7 @@ import co.electriccoin.zcash.ui.common.compose.LocalActivity import co.electriccoin.zcash.ui.common.model.TopAppBarSubTitleState import co.electriccoin.zcash.ui.common.model.WalletRestoringState import co.electriccoin.zcash.ui.common.model.WalletSnapshot +import co.electriccoin.zcash.ui.common.viewmodel.HomeViewModel import co.electriccoin.zcash.ui.common.viewmodel.WalletViewModel import co.electriccoin.zcash.ui.design.component.CircularScreenProgressIndicator import co.electriccoin.zcash.ui.screen.account.model.TransactionUiState @@ -43,6 +44,8 @@ internal fun WrapAccount( val transactionHistoryViewModel by activity.viewModels() + val homeViewModel by activity.viewModels() + val synchronizer = walletViewModel.synchronizer.collectAsStateWithLifecycle().value val transactionsUiState = transactionHistoryViewModel.transactionUiState.collectAsStateWithLifecycle().value @@ -59,10 +62,14 @@ internal fun WrapAccount( val walletSnapshot = walletViewModel.walletSnapshot.collectAsStateWithLifecycle().value + val isHideBalances = homeViewModel.isHideBalances.collectAsStateWithLifecycle().value ?: false + WrapAccount( balanceState = balanceState, goBalances = goBalances, goSettings = goSettings, + isHideBalances = isHideBalances, + onHideBalances = { homeViewModel.showOrHideBalances() }, synchronizer = synchronizer, topAppBarSubTitleState = walletState, transactionHistoryViewModel = transactionHistoryViewModel, @@ -82,9 +89,11 @@ internal fun WrapAccount( balanceState: BalanceState, goBalances: () -> Unit, goSettings: () -> Unit, - transactionsUiState: TransactionUiState, + isHideBalances: Boolean, synchronizer: Synchronizer?, + onHideBalances: () -> Unit, topAppBarSubTitleState: TopAppBarSubTitleState, + transactionsUiState: TransactionUiState, transactionHistoryViewModel: TransactionHistoryViewModel, walletRestoringState: WalletRestoringState, walletSnapshot: WalletSnapshot? @@ -107,9 +116,11 @@ internal fun WrapAccount( } else { Account( balanceState = balanceState, + isHideBalances = isHideBalances, transactionsUiState = transactionsUiState, showStatusDialog = showStatusDialog.value, hideStatusDialog = { showStatusDialog.value = null }, + onHideBalances = onHideBalances, onStatusClick = { status -> when (status) { is StatusAction.Detailed -> showStatusDialog.value = status diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/account/view/AccountView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/account/view/AccountView.kt index befc4c8b..a4d2a644 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/account/view/AccountView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/account/view/AccountView.kt @@ -12,9 +12,11 @@ import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview import cash.z.ecc.android.sdk.model.Zatoshi import co.electriccoin.zcash.ui.R @@ -27,6 +29,7 @@ import co.electriccoin.zcash.ui.common.model.WalletSnapshot import co.electriccoin.zcash.ui.common.test.CommonTag import co.electriccoin.zcash.ui.design.component.BlankBgScaffold import co.electriccoin.zcash.ui.design.component.SmallTopAppBar +import co.electriccoin.zcash.ui.design.component.TopAppBarHideBalancesNavigation import co.electriccoin.zcash.ui.design.theme.ZcashTheme import co.electriccoin.zcash.ui.fixture.BalanceStateFixture import co.electriccoin.zcash.ui.fixture.WalletSnapshotFixture @@ -41,12 +44,14 @@ private fun HistoryLoadingComposablePreview() { ZcashTheme(forceDarkMode = false) { Account( balanceState = BalanceStateFixture.new(), + isHideBalances = false, goBalances = {}, goSettings = {}, hideStatusDialog = {}, - showStatusDialog = null, + onHideBalances = {}, onStatusClick = {}, onTransactionItemAction = {}, + showStatusDialog = null, snackbarHostState = SnackbarHostState(), topAppBarSubTitleState = TopAppBarSubTitleState.None, transactionsUiState = TransactionUiState.Loading, @@ -67,12 +72,14 @@ private fun HistoryListComposablePreview() { Zatoshi(123_000_000L), Zatoshi(123_000_000L) ), + isHideBalances = false, goBalances = {}, goSettings = {}, hideStatusDialog = {}, - showStatusDialog = null, + onHideBalances = {}, onStatusClick = {}, onTransactionItemAction = {}, + showStatusDialog = null, snackbarHostState = SnackbarHostState(), topAppBarSubTitleState = TopAppBarSubTitleState.None, transactionsUiState = TransactionUiState.Done(transactions = TransactionsFixture.new()), @@ -88,10 +95,12 @@ internal fun Account( balanceState: BalanceState, goBalances: () -> Unit, goSettings: () -> Unit, + isHideBalances: Boolean, hideStatusDialog: () -> Unit, - showStatusDialog: StatusAction.Detailed?, + onHideBalances: () -> Unit, onStatusClick: (StatusAction) -> Unit, onTransactionItemAction: (TrxItemAction) -> Unit, + showStatusDialog: StatusAction.Detailed?, snackbarHostState: SnackbarHostState, topAppBarSubTitleState: TopAppBarSubTitleState, transactionsUiState: TransactionUiState, @@ -101,6 +110,8 @@ internal fun Account( BlankBgScaffold( topBar = { AccountTopAppBar( + isHideBalances = isHideBalances, + onHideBalances = onHideBalances, onSettings = goSettings, subTitleState = topAppBarSubTitleState, ) @@ -111,6 +122,7 @@ internal fun Account( ) { paddingValues -> AccountMainContent( balanceState = balanceState, + isHideBalances = isHideBalances, goBalances = goBalances, onStatusClick = onStatusClick, onTransactionItemAction = onTransactionItemAction, @@ -137,6 +149,8 @@ internal fun Account( @Composable private fun AccountTopAppBar( + isHideBalances: Boolean, + onHideBalances: () -> Unit, onSettings: () -> Unit, subTitleState: TopAppBarSubTitleState ) { @@ -158,7 +172,22 @@ private fun AccountTopAppBar( contentDescription = stringResource(id = R.string.settings_menu_content_description) ) } - } + }, + navigationAction = { + TopAppBarHideBalancesNavigation( + contentDescription = stringResource(id = R.string.hide_balances_content_description), + iconVector = + ImageVector.vectorResource( + if (isHideBalances) { + R.drawable.ic_hide_balances_on + } else { + R.drawable.ic_hide_balances_off + } + ), + onClick = onHideBalances, + modifier = Modifier.testTag(CommonTag.HIDE_BALANCES_TOP_BAR_BUTTON) + ) + }, ) } @@ -167,10 +196,11 @@ private fun AccountTopAppBar( private fun AccountMainContent( balanceState: BalanceState, goBalances: () -> Unit, + isHideBalances: Boolean, + isWalletRestoringState: WalletRestoringState, onTransactionItemAction: (TrxItemAction) -> Unit, onStatusClick: (StatusAction) -> Unit, transactionState: TransactionUiState, - isWalletRestoringState: WalletRestoringState, walletSnapshot: WalletSnapshot, modifier: Modifier = Modifier, ) { @@ -183,6 +213,7 @@ private fun AccountMainContent( BalancesStatus( balanceState = balanceState, goBalances = goBalances, + isHideBalances = isHideBalances, modifier = Modifier .padding(horizontal = ZcashTheme.dimens.screenHorizontalSpacingRegular) @@ -191,6 +222,7 @@ private fun AccountMainContent( Spacer(modifier = Modifier.height(ZcashTheme.dimens.spacingLarge)) HistoryContainer( + isHideBalances = isHideBalances, onStatusClick = onStatusClick, onTransactionItemAction = onTransactionItemAction, transactionState = transactionState, @@ -204,6 +236,7 @@ private fun AccountMainContent( private fun BalancesStatus( balanceState: BalanceState, goBalances: () -> Unit, + isHideBalances: Boolean, modifier: Modifier = Modifier, ) { Column( @@ -217,6 +250,7 @@ private fun BalancesStatus( ) { BalanceWidget( balanceState = balanceState, + isHideBalances = isHideBalances, isReferenceToBalances = true, onReferenceClick = goBalances ) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/account/view/HistoryView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/account/view/HistoryView.kt index 65b2f3e9..2706aa21 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/account/view/HistoryView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/account/view/HistoryView.kt @@ -83,6 +83,7 @@ private fun ComposablePreview() { HistoryContainer( onTransactionItemAction = {}, onStatusClick = {}, + isHideBalances = false, transactionState = TransactionUiState.Loading, walletRestoringState = WalletRestoringState.SYNCING, walletSnapshot = WalletSnapshotFixture.new() @@ -98,6 +99,7 @@ private fun ComposableHistoryListPreview() { transactionState = TransactionUiState.Done(transactions = TransactionsFixture.new()), onTransactionItemAction = {}, onStatusClick = {}, + isHideBalances = false, walletRestoringState = WalletRestoringState.RESTORING, walletSnapshot = WalletSnapshotFixture.new() ) @@ -116,6 +118,7 @@ private val dateFormat: DateFormat by lazy { internal fun HistoryContainer( onStatusClick: (StatusAction) -> Unit, onTransactionItemAction: (TrxItemAction) -> Unit, + isHideBalances: Boolean, transactionState: TransactionUiState, walletRestoringState: WalletRestoringState, walletSnapshot: WalletSnapshot, @@ -167,6 +170,7 @@ internal fun HistoryContainer( is TransactionUiState.Prepared -> { HistoryList( transactions = transactionState.transactions, + isHideBalances = isHideBalances, onAction = onTransactionItemAction, ) } @@ -211,6 +215,7 @@ private fun EmptyTransactionHistory() { @Composable private fun HistoryList( transactions: ImmutableList, + isHideBalances: Boolean, onAction: (TrxItemAction) -> Unit, modifier: Modifier = Modifier ) { @@ -220,6 +225,7 @@ private fun HistoryList( items(transactions.size) { index -> HistoryItem( transaction = transactions[index], + isHideBalances = isHideBalances, onAction = onAction ) @@ -239,6 +245,7 @@ private fun ComposableHistoryListItemPreview() { BlankSurface { HistoryItem( onAction = {}, + isHideBalances = false, transaction = TransactionUiFixture.new() ) } @@ -253,6 +260,7 @@ private fun ComposableHistoryListItemExpandedPreview() { Column { HistoryItem( onAction = {}, + isHideBalances = false, transaction = TransactionUiFixture.new( overview = TransactionOverviewFixture.new().copy(isSentTransaction = true), @@ -261,6 +269,7 @@ private fun ComposableHistoryListItemExpandedPreview() { ) HistoryItem( onAction = {}, + isHideBalances = false, transaction = TransactionUiFixture.new( overview = TransactionOverviewFixture.new().copy(isSentTransaction = false), @@ -279,6 +288,7 @@ private fun ComposableHistoryListItemsPreview() { BlankSurface { HistoryItem( onAction = {}, + isHideBalances = false, transaction = TransactionUiFixture.new( messages = persistentListOf("Message 1", "Message 2", "Message 3"), @@ -295,6 +305,7 @@ const val ADDRESS_IN_TITLE_WIDTH_RATIO = 0.5f @Suppress("LongMethod") private fun HistoryItem( transaction: TransactionUi, + isHideBalances: Boolean, onAction: (TrxItemAction) -> Unit, modifier: Modifier = Modifier ) { @@ -373,6 +384,7 @@ private fun HistoryItem( Column { HistoryItemCollapsedMainPart( transaction = transaction, + isHideBalances = isHideBalances, typeText = typeText, textStyle = textStyle, textColor = textColor, @@ -417,6 +429,7 @@ private fun HistoryItemCollapsedMainPart( typeText: String, textStyle: TextStyle, textColor: Color, + isHideBalances: Boolean, onAction: (TrxItemAction) -> Unit, modifier: Modifier = Modifier, ) { @@ -475,6 +488,7 @@ private fun HistoryItemCollapsedMainPart( suffix = stringResource(id = R.string.general_etc) ).asZecAmountTriple(prefix) }, + isHideBalances = isHideBalances, textStyles = Pair( first = valueTextStyle, @@ -812,6 +826,8 @@ private fun HistoryItemTransactionFeePart( } else { StyledBalance( balanceParts = fee.toZecStringFull().asZecAmountTriple(), + // Fees are always visible + isHideBalances = false, textStyles = Pair( first = ZcashTheme.extendedTypography.transactionItemStyles.feeFirstPart, diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/advancedsettings/view/AdvancedSettingsView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/advancedsettings/view/AdvancedSettingsView.kt index 4058ad38..930bce3a 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/advancedsettings/view/AdvancedSettingsView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/advancedsettings/view/AdvancedSettingsView.kt @@ -23,6 +23,7 @@ import co.electriccoin.zcash.ui.design.MINIMAL_WEIGHT import co.electriccoin.zcash.ui.design.component.BlankBgScaffold import co.electriccoin.zcash.ui.design.component.PrimaryButton import co.electriccoin.zcash.ui.design.component.SmallTopAppBar +import co.electriccoin.zcash.ui.design.component.TopAppBarBackNavigation import co.electriccoin.zcash.ui.design.theme.ZcashTheme import co.electriccoin.zcash.ui.design.theme.ZcashTheme.dimens import co.electriccoin.zcash.ui.screen.advancedsettings.AdvancedSettingsTag @@ -97,9 +98,13 @@ private fun AdvancedSettingsTopAppBar( }, modifier = Modifier.testTag(AdvancedSettingsTag.ADVANCED_SETTINGS_TOP_APP_BAR), showTitleLogo = true, - backText = stringResource(id = R.string.advanced_settings_back).uppercase(), - backContentDescriptionText = stringResource(R.string.advanced_settings_back_content_description), - onBack = onBack, + navigationAction = { + TopAppBarBackNavigation( + backText = stringResource(id = R.string.back_navigation).uppercase(), + backContentDescriptionText = stringResource(R.string.back_navigation_content_description), + onBack = onBack + ) + } ) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/balances/AndroidBalances.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/balances/AndroidBalances.kt index c9db3d22..82828bd3 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/balances/AndroidBalances.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/balances/AndroidBalances.kt @@ -26,6 +26,7 @@ import co.electriccoin.zcash.ui.common.model.TopAppBarSubTitleState import co.electriccoin.zcash.ui.common.model.WalletRestoringState import co.electriccoin.zcash.ui.common.model.WalletSnapshot import co.electriccoin.zcash.ui.common.viewmodel.CheckUpdateViewModel +import co.electriccoin.zcash.ui.common.viewmodel.HomeViewModel import co.electriccoin.zcash.ui.common.viewmodel.WalletViewModel import co.electriccoin.zcash.ui.configuration.ConfigurationEntries import co.electriccoin.zcash.ui.configuration.RemoteConfig @@ -54,6 +55,8 @@ internal fun WrapBalances( val createTransactionsViewModel by activity.viewModels() + val homeViewModel by activity.viewModels() + val synchronizer = walletViewModel.synchronizer.collectAsStateWithLifecycle().value val walletSnapshot = walletViewModel.walletSnapshot.collectAsStateWithLifecycle().value @@ -64,6 +67,8 @@ internal fun WrapBalances( val walletState = walletViewModel.walletStateInformation.collectAsStateWithLifecycle().value + val isHideBalances = homeViewModel.isHideBalances.collectAsStateWithLifecycle().value ?: false + val checkUpdateViewModel by activity.viewModels { CheckUpdateViewModel.CheckUpdateViewModelFactory( activity.application, @@ -79,7 +84,9 @@ internal fun WrapBalances( checkUpdateViewModel = checkUpdateViewModel, goSettings = goSettings, goMultiTrxSubmissionFailure = goMultiTrxSubmissionFailure, + isHideBalances = isHideBalances, lifecycleScope = activity.lifecycleScope, + onHideBalances = { homeViewModel.showOrHideBalances() }, spendingKey = spendingKey, synchronizer = synchronizer, topAppBarSubTitleState = walletState, @@ -101,6 +108,8 @@ internal fun WrapBalances( goSettings: () -> Unit, goMultiTrxSubmissionFailure: () -> Unit, lifecycleScope: CoroutineScope, + isHideBalances: Boolean, + onHideBalances: () -> Unit, spendingKey: UnifiedSpendingKey?, synchronizer: Synchronizer?, topAppBarSubTitleState: TopAppBarSubTitleState, @@ -158,7 +167,9 @@ internal fun WrapBalances( Balances( balanceState = balanceState, isFiatConversionEnabled = isFiatConversionEnabled, + isHideBalances = isHideBalances, isUpdateAvailable = isUpdateAvailable, + onHideBalances = onHideBalances, onSettings = goSettings, isShowingErrorDialog = isShowingErrorDialog, setShowErrorDialog = setShowErrorDialog, diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/balances/view/BalancesView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/balances/view/BalancesView.kt index 3894dc45..e5ae4c90 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/balances/view/BalancesView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/balances/view/BalancesView.kt @@ -79,6 +79,7 @@ import co.electriccoin.zcash.ui.design.component.Reference import co.electriccoin.zcash.ui.design.component.Small import co.electriccoin.zcash.ui.design.component.SmallTopAppBar import co.electriccoin.zcash.ui.design.component.StyledBalance +import co.electriccoin.zcash.ui.design.component.TopAppBarHideBalancesNavigation import co.electriccoin.zcash.ui.design.theme.ZcashTheme import co.electriccoin.zcash.ui.fixture.BalanceStateFixture import co.electriccoin.zcash.ui.fixture.WalletSnapshotFixture @@ -94,11 +95,13 @@ private fun ComposableBalancesPreview() { Balances( balanceState = BalanceStateFixture.new(), isFiatConversionEnabled = false, + isHideBalances = false, isUpdateAvailable = false, isShowingErrorDialog = false, hideStatusDialog = {}, showStatusDialog = null, setShowErrorDialog = {}, + onHideBalances = {}, onSettings = {}, onShielding = {}, onStatusClick = {}, @@ -118,11 +121,13 @@ private fun ComposableBalancesShieldDarkPreview() { Balances( balanceState = BalanceStateFixture.new(), isFiatConversionEnabled = false, + isHideBalances = false, isUpdateAvailable = false, isShowingErrorDialog = true, hideStatusDialog = {}, showStatusDialog = null, setShowErrorDialog = {}, + onHideBalances = {}, onSettings = {}, onShielding = {}, onStatusClick = {}, @@ -153,14 +158,16 @@ private fun ComposableBalancesShieldErrorDialogPreview() { fun Balances( balanceState: BalanceState, isFiatConversionEnabled: Boolean, + isHideBalances: Boolean, isUpdateAvailable: Boolean, isShowingErrorDialog: Boolean, hideStatusDialog: () -> Unit, - showStatusDialog: StatusAction.Detailed?, - setShowErrorDialog: (Boolean) -> Unit, + onHideBalances: () -> Unit, onSettings: () -> Unit, onShielding: () -> Unit, onStatusClick: (StatusAction) -> Unit, + showStatusDialog: StatusAction.Detailed?, + setShowErrorDialog: (Boolean) -> Unit, shieldState: ShieldState, snackbarHostState: SnackbarHostState, topAppBarSubTitleState: TopAppBarSubTitleState, @@ -170,6 +177,8 @@ fun Balances( BlankBgScaffold( topBar = { BalancesTopAppBar( + isHideBalances = isHideBalances, + onHideBalances = onHideBalances, onSettings = onSettings, subTitleState = topAppBarSubTitleState, ) @@ -184,6 +193,7 @@ fun Balances( BalancesMainContent( balanceState = balanceState, isFiatConversionEnabled = isFiatConversionEnabled, + isHideBalances = isHideBalances, isUpdateAvailable = isUpdateAvailable, onShielding = onShielding, onStatusClick = onStatusClick, @@ -256,6 +266,8 @@ fun ShieldingErrorDialog( @Composable private fun BalancesTopAppBar( + isHideBalances: Boolean, + onHideBalances: () -> Unit, onSettings: () -> Unit, subTitleState: TopAppBarSubTitleState ) { @@ -279,6 +291,21 @@ private fun BalancesTopAppBar( ) } }, + navigationAction = { + TopAppBarHideBalancesNavigation( + contentDescription = stringResource(id = R.string.hide_balances_content_description), + iconVector = + ImageVector.vectorResource( + if (isHideBalances) { + R.drawable.ic_hide_balances_on + } else { + R.drawable.ic_hide_balances_off + } + ), + onClick = onHideBalances, + modifier = Modifier.testTag(CommonTag.HIDE_BALANCES_TOP_BAR_BUTTON) + ) + }, ) } @@ -287,6 +314,7 @@ private fun BalancesTopAppBar( private fun BalancesMainContent( balanceState: BalanceState, isFiatConversionEnabled: Boolean, + isHideBalances: Boolean, isUpdateAvailable: Boolean, onShielding: () -> Unit, onStatusClick: (StatusAction) -> Unit, @@ -307,6 +335,7 @@ private fun BalancesMainContent( BalanceWidget( balanceState = balanceState, + isHideBalances = isHideBalances, isReferenceToBalances = false, onReferenceClick = {} ) @@ -321,13 +350,15 @@ private fun BalancesMainContent( Spacer(modifier = Modifier.height(ZcashTheme.dimens.spacingDefault)) BalancesOverview( - walletSnapshot = walletSnapshot, isFiatConversionEnabled = isFiatConversionEnabled, + isHideBalances = isHideBalances, + walletSnapshot = walletSnapshot, ) Spacer(modifier = Modifier.height(ZcashTheme.dimens.spacingLarge)) TransparentBalancePanel( + isHideBalances = isHideBalances, onShielding = onShielding, shieldState = shieldState, walletSnapshot = walletSnapshot, @@ -366,6 +397,7 @@ const val DEFAULT_LESS_THAN_FEE = 100_000L @Composable fun TransparentBalancePanel( + isHideBalances: Boolean, onShielding: () -> Unit, shieldState: ShieldState, walletSnapshot: WalletSnapshot, @@ -383,6 +415,7 @@ fun TransparentBalancePanel( Spacer(modifier = Modifier.height(ZcashTheme.dimens.spacingDefault)) TransparentBalanceRow( + isHideBalances = isHideBalances, isProgressbarVisible = shieldState == ShieldState.Running, onHelpClick = { showHelpPanel = !showHelpPanel }, walletSnapshot = walletSnapshot @@ -428,6 +461,7 @@ fun TransparentBalancePanel( @Composable fun TransparentBalanceRow( + isHideBalances: Boolean, isProgressbarVisible: Boolean, onHelpClick: () -> Unit, walletSnapshot: WalletSnapshot, @@ -466,6 +500,7 @@ fun TransparentBalanceRow( Row(verticalAlignment = Alignment.CenterVertically) { StyledBalance( balanceParts = walletSnapshot.transparentBalance.toZecStringFull().asZecAmountTriple(), + isHideBalances = isHideBalances, textStyles = Pair( ZcashTheme.extendedTypography.balanceSingleStyles.first, @@ -526,18 +561,19 @@ fun TransparentBalanceHelpPanel(onHideHelpPanel: () -> Unit) { fun BalancesOverview( walletSnapshot: WalletSnapshot, isFiatConversionEnabled: Boolean, + isHideBalances: Boolean, ) { Column { - SpendableBalanceRow(walletSnapshot) + SpendableBalanceRow(isHideBalances, walletSnapshot) Spacer(modifier = Modifier.height(ZcashTheme.dimens.spacingDefault)) - ChangePendingRow(walletSnapshot) + ChangePendingRow(isHideBalances, walletSnapshot) Spacer(modifier = Modifier.height(ZcashTheme.dimens.spacingDefault)) // aka value pending - PendingTransactionsRow(walletSnapshot) + PendingTransactionsRow(isHideBalances, walletSnapshot) if (isFiatConversionEnabled) { val walletDisplayValues = @@ -574,7 +610,10 @@ fun BalancesOverview( const val TEXT_PART_WIDTH_RATIO = 0.6f @Composable -fun SpendableBalanceRow(walletSnapshot: WalletSnapshot) { +fun SpendableBalanceRow( + isHideBalances: Boolean, + walletSnapshot: WalletSnapshot +) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, @@ -588,6 +627,7 @@ fun SpendableBalanceRow(walletSnapshot: WalletSnapshot) { Row(verticalAlignment = Alignment.CenterVertically) { StyledBalance( balanceParts = walletSnapshot.spendableBalance().toZecStringFull().asZecAmountTriple(), + isHideBalances = isHideBalances, textStyles = Pair( ZcashTheme.extendedTypography.balanceSingleStyles.first, @@ -609,7 +649,10 @@ fun SpendableBalanceRow(walletSnapshot: WalletSnapshot) { } @Composable -fun ChangePendingRow(walletSnapshot: WalletSnapshot) { +fun ChangePendingRow( + isHideBalances: Boolean, + walletSnapshot: WalletSnapshot +) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, @@ -623,6 +666,7 @@ fun ChangePendingRow(walletSnapshot: WalletSnapshot) { Row(verticalAlignment = Alignment.CenterVertically) { StyledBalance( balanceParts = walletSnapshot.changePendingBalance().toZecStringFull().asZecAmountTriple(), + isHideBalances = isHideBalances, textStyles = Pair( ZcashTheme.extendedTypography.balanceSingleStyles.first, @@ -643,7 +687,10 @@ fun ChangePendingRow(walletSnapshot: WalletSnapshot) { } @Composable -fun PendingTransactionsRow(walletSnapshot: WalletSnapshot) { +fun PendingTransactionsRow( + isHideBalances: Boolean, + walletSnapshot: WalletSnapshot +) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, @@ -657,6 +704,7 @@ fun PendingTransactionsRow(walletSnapshot: WalletSnapshot) { Row(verticalAlignment = Alignment.CenterVertically) { StyledBalance( balanceParts = walletSnapshot.valuePendingBalance().toZecStringFull().asZecAmountTriple(), + isHideBalances = isHideBalances, textStyles = Pair( ZcashTheme.extendedTypography.balanceSingleStyles.first, diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/chooseserver/view/ChooseServerView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/chooseserver/view/ChooseServerView.kt index 9d7993ed..29eb080d 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/chooseserver/view/ChooseServerView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/chooseserver/view/ChooseServerView.kt @@ -45,6 +45,7 @@ import co.electriccoin.zcash.ui.design.component.FormTextField import co.electriccoin.zcash.ui.design.component.PrimaryButton import co.electriccoin.zcash.ui.design.component.RadioButton import co.electriccoin.zcash.ui.design.component.SmallTopAppBar +import co.electriccoin.zcash.ui.design.component.TopAppBarBackNavigation import co.electriccoin.zcash.ui.design.theme.ZcashTheme import co.electriccoin.zcash.ui.screen.chooseserver.ChooseServerTag import co.electriccoin.zcash.ui.screen.chooseserver.validateCustomServerValue @@ -233,9 +234,13 @@ private fun ChooseServerTopAppBar( }, modifier = Modifier.testTag(ChooseServerTag.CHOOSE_SERVER_TOP_APP_BAR), showTitleLogo = true, - backText = stringResource(id = R.string.choose_server_back).uppercase(), - backContentDescriptionText = stringResource(R.string.choose_server_back_content_description), - onBack = onBack, + navigationAction = { + TopAppBarBackNavigation( + backText = stringResource(id = R.string.back_navigation).uppercase(), + backContentDescriptionText = stringResource(R.string.back_navigation_content_description), + onBack = onBack + ) + } ) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/deletewallet/view/DeleteWalletView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/deletewallet/view/DeleteWalletView.kt index ae0a2220..e6da0d31 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/deletewallet/view/DeleteWalletView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/deletewallet/view/DeleteWalletView.kt @@ -28,6 +28,7 @@ import co.electriccoin.zcash.ui.design.component.GridBgScaffold import co.electriccoin.zcash.ui.design.component.GridBgSmallTopAppBar import co.electriccoin.zcash.ui.design.component.LabeledCheckBox import co.electriccoin.zcash.ui.design.component.PrimaryButton +import co.electriccoin.zcash.ui.design.component.TopAppBarBackNavigation import co.electriccoin.zcash.ui.design.component.TopScreenLogoTitle import co.electriccoin.zcash.ui.design.theme.ZcashTheme @@ -88,9 +89,13 @@ private fun DeleteWalletDataTopAppBar( TopAppBarSubTitleState.Restoring -> stringResource(id = R.string.restoring_wallet_label) TopAppBarSubTitleState.None -> null }, - backText = stringResource(R.string.delete_wallet_back).uppercase(), - backContentDescriptionText = stringResource(R.string.delete_wallet_back_content_description), - onBack = onBack, + navigationAction = { + TopAppBarBackNavigation( + backText = stringResource(id = R.string.back_navigation).uppercase(), + backContentDescriptionText = stringResource(R.string.back_navigation_content_description), + onBack = onBack + ) + } ) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/exportdata/view/ExportPrivateDataView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/exportdata/view/ExportPrivateDataView.kt index c9b992ee..9ff70e81 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/exportdata/view/ExportPrivateDataView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/exportdata/view/ExportPrivateDataView.kt @@ -30,6 +30,7 @@ import co.electriccoin.zcash.ui.design.component.GridBgScaffold import co.electriccoin.zcash.ui.design.component.GridBgSmallTopAppBar import co.electriccoin.zcash.ui.design.component.LabeledCheckBox import co.electriccoin.zcash.ui.design.component.PrimaryButton +import co.electriccoin.zcash.ui.design.component.TopAppBarBackNavigation import co.electriccoin.zcash.ui.design.component.TopScreenLogoTitle import co.electriccoin.zcash.ui.design.theme.ZcashTheme @@ -93,9 +94,13 @@ private fun ExportPrivateDataTopAppBar( TopAppBarSubTitleState.Restoring -> stringResource(id = R.string.restoring_wallet_label) TopAppBarSubTitleState.None -> null }, - backText = stringResource(R.string.export_data_back).uppercase(), - backContentDescriptionText = stringResource(R.string.export_data_back_content_description), - onBack = onBack, + navigationAction = { + TopAppBarBackNavigation( + backText = stringResource(id = R.string.back_navigation).uppercase(), + backContentDescriptionText = stringResource(R.string.back_navigation_content_description), + onBack = onBack + ) + }, ) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreView.kt index 5bb648f8..81515bc5 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/restore/view/RestoreView.kt @@ -73,6 +73,7 @@ import co.electriccoin.zcash.ui.design.component.GridBgScaffold import co.electriccoin.zcash.ui.design.component.GridBgSmallTopAppBar import co.electriccoin.zcash.ui.design.component.PrimaryButton import co.electriccoin.zcash.ui.design.component.Reference +import co.electriccoin.zcash.ui.design.component.TopAppBarBackNavigation import co.electriccoin.zcash.ui.design.component.TopScreenLogoTitle import co.electriccoin.zcash.ui.design.theme.ZcashTheme import co.electriccoin.zcash.ui.screen.restore.RestoreTag @@ -355,9 +356,13 @@ private fun RestoreSeedTopAppBar( ) { GridBgSmallTopAppBar( modifier = modifier, - backText = stringResource(id = R.string.restore_back).uppercase(), - backContentDescriptionText = stringResource(R.string.restore_back_content_description), - onBack = onBack, + navigationAction = { + TopAppBarBackNavigation( + backText = stringResource(id = R.string.back_navigation).uppercase(), + backContentDescriptionText = stringResource(R.string.back_navigation_content_description), + onBack = onBack + ) + }, regularActions = { ClearSeedMenuItem( onSeedClear = onClear @@ -373,9 +378,13 @@ private fun RestoreSeedBirthdayTopAppBar( ) { GridBgSmallTopAppBar( modifier = modifier, - backText = stringResource(id = R.string.restore_back).uppercase(), - backContentDescriptionText = stringResource(R.string.restore_back_content_description), - onBack = onBack, + navigationAction = { + TopAppBarBackNavigation( + backText = stringResource(id = R.string.back_navigation).uppercase(), + backContentDescriptionText = stringResource(R.string.back_navigation_content_description), + onBack = onBack + ) + }, ) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scan/view/ScanView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scan/view/ScanView.kt index be011977..0d191d76 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scan/view/ScanView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/scan/view/ScanView.kt @@ -71,6 +71,7 @@ import co.electriccoin.zcash.ui.design.component.BlankSurface import co.electriccoin.zcash.ui.design.component.SecondaryButton import co.electriccoin.zcash.ui.design.component.Small import co.electriccoin.zcash.ui.design.component.SmallTopAppBar +import co.electriccoin.zcash.ui.design.component.TopAppBarBackNavigation import co.electriccoin.zcash.ui.design.theme.ZcashTheme import co.electriccoin.zcash.ui.screen.scan.ScanTag import co.electriccoin.zcash.ui.screen.scan.model.ScanState @@ -284,15 +285,16 @@ private fun ScanTopAppBar( TopAppBarSubTitleState.Restoring -> stringResource(id = R.string.restoring_wallet_label) TopAppBarSubTitleState.None -> null }, - backText = + navigationAction = { if (showBack) { - stringResource(id = R.string.scan_back) - } else { - null - }, - backContentDescriptionText = stringResource(id = R.string.scan_back_content_description), + TopAppBarBackNavigation( + backText = stringResource(id = R.string.back_navigation).uppercase(), + backContentDescriptionText = stringResource(R.string.back_navigation_content_description), + onBack = onBack + ) + } + }, colors = ZcashTheme.colors.transparentTopAppBarColors, - onBack = onBack, ) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/securitywarning/view/SecurityWarningView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/securitywarning/view/SecurityWarningView.kt index a17cefb0..bb8eba16 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/securitywarning/view/SecurityWarningView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/securitywarning/view/SecurityWarningView.kt @@ -29,6 +29,7 @@ import co.electriccoin.zcash.ui.design.component.GridBgScaffold import co.electriccoin.zcash.ui.design.component.GridBgSmallTopAppBar import co.electriccoin.zcash.ui.design.component.LabeledCheckBox import co.electriccoin.zcash.ui.design.component.PrimaryButton +import co.electriccoin.zcash.ui.design.component.TopAppBarBackNavigation import co.electriccoin.zcash.ui.design.component.TopScreenLogoTitle import co.electriccoin.zcash.ui.design.theme.ZcashTheme import co.electriccoin.zcash.ui.fixture.VersionInfoFixture @@ -90,9 +91,13 @@ fun SecurityWarning( @Composable private fun SecurityWarningTopAppBar(onBack: () -> Unit) { GridBgSmallTopAppBar( - backText = stringResource(R.string.security_warning_back).uppercase(), - backContentDescriptionText = stringResource(R.string.security_warning_back_content_description), - onBack = onBack, + navigationAction = { + TopAppBarBackNavigation( + backText = stringResource(id = R.string.back_navigation).uppercase(), + backContentDescriptionText = stringResource(R.string.back_navigation_content_description), + onBack = onBack + ) + } ) } diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/seedrecovery/view/SeedRecoveryView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/seedrecovery/view/SeedRecoveryView.kt index 684eda73..ddbca811 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/seedrecovery/view/SeedRecoveryView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/seedrecovery/view/SeedRecoveryView.kt @@ -49,6 +49,7 @@ import co.electriccoin.zcash.ui.design.component.ChipGrid import co.electriccoin.zcash.ui.design.component.GridBgScaffold import co.electriccoin.zcash.ui.design.component.GridBgSmallTopAppBar import co.electriccoin.zcash.ui.design.component.PrimaryButton +import co.electriccoin.zcash.ui.design.component.TopAppBarBackNavigation import co.electriccoin.zcash.ui.design.component.TopScreenLogoTitle import co.electriccoin.zcash.ui.design.theme.ZcashTheme import co.electriccoin.zcash.ui.fixture.VersionInfoFixture @@ -127,9 +128,13 @@ private fun SeedRecoveryTopAppBar( TopAppBarSubTitleState.None -> null }, modifier = modifier, - backText = stringResource(id = R.string.seed_recovery_back).uppercase(), - backContentDescriptionText = stringResource(R.string.seed_recovery_back_content_description), - onBack = onBack, + navigationAction = { + TopAppBarBackNavigation( + backText = stringResource(id = R.string.back_navigation).uppercase(), + backContentDescriptionText = stringResource(R.string.back_navigation_content_description), + onBack = onBack + ) + }, regularActions = { if (versionInfo.isDebuggable && !versionInfo.isRunningUnderTestService) { DebugMenu( diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/AndroidSend.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/AndroidSend.kt index b75e9eae..7667e42c 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/AndroidSend.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/AndroidSend.kt @@ -24,6 +24,7 @@ import co.electriccoin.zcash.ui.common.compose.BalanceState import co.electriccoin.zcash.ui.common.compose.LocalActivity import co.electriccoin.zcash.ui.common.model.TopAppBarSubTitleState import co.electriccoin.zcash.ui.common.model.WalletSnapshot +import co.electriccoin.zcash.ui.common.viewmodel.HomeViewModel import co.electriccoin.zcash.ui.common.viewmodel.WalletViewModel import co.electriccoin.zcash.ui.design.component.CircularScreenProgressIndicator import co.electriccoin.zcash.ui.screen.send.ext.Saver @@ -50,6 +51,8 @@ internal fun WrapSend( val walletViewModel by activity.viewModels() + val homeViewModel by activity.viewModels() + val hasCameraFeature = activity.packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY) val synchronizer = walletViewModel.synchronizer.collectAsStateWithLifecycle().value @@ -66,8 +69,12 @@ internal fun WrapSend( val balanceState = walletViewModel.balanceState.collectAsStateWithLifecycle().value + val isHideBalances = homeViewModel.isHideBalances.collectAsStateWithLifecycle().value ?: false + WrapSend( balanceState = balanceState, + isHideBalances = isHideBalances, + onHideBalances = { homeViewModel.showOrHideBalances() }, sendArguments = sendArguments, synchronizer = synchronizer, walletSnapshot = walletSnapshot, @@ -88,6 +95,7 @@ internal fun WrapSend( @Composable internal fun WrapSend( balanceState: BalanceState, + isHideBalances: Boolean, goToQrScanner: () -> Unit, goBack: () -> Unit, goBalances: () -> Unit, @@ -95,6 +103,7 @@ internal fun WrapSend( goSendConfirmation: (ZecSend) -> Unit, hasCameraFeature: Boolean, monetarySeparators: MonetarySeparators, + onHideBalances: () -> Unit, sendArguments: SendArguments?, spendingKey: UnifiedSpendingKey?, synchronizer: Synchronizer?, @@ -181,6 +190,7 @@ internal fun WrapSend( } else { Send( balanceState = balanceState, + isHideBalances = isHideBalances, sendStage = sendStage, onCreateZecSend = { newZecSend -> scope.launch { @@ -199,6 +209,7 @@ internal fun WrapSend( } }, onBack = onBackAction, + onHideBalances = onHideBalances, onSettings = goSettings, recipientAddressState = recipientAddressState, onRecipientAddressChange = { diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/view/SendView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/view/SendView.kt index c4646c1c..86982cb7 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/view/SendView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/send/view/SendView.kt @@ -32,6 +32,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusDirection import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.layout.positionInRoot import androidx.compose.ui.platform.LocalContext @@ -39,6 +40,7 @@ import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction @@ -74,6 +76,7 @@ import co.electriccoin.zcash.ui.design.component.FormTextField import co.electriccoin.zcash.ui.design.component.PrimaryButton import co.electriccoin.zcash.ui.design.component.Small import co.electriccoin.zcash.ui.design.component.SmallTopAppBar +import co.electriccoin.zcash.ui.design.component.TopAppBarHideBalancesNavigation import co.electriccoin.zcash.ui.design.theme.ZcashTheme import co.electriccoin.zcash.ui.fixture.BalanceStateFixture import co.electriccoin.zcash.ui.fixture.WalletSnapshotFixture @@ -93,6 +96,7 @@ private fun PreviewSendForm() { sendStage = SendStage.Form, onCreateZecSend = {}, onBack = {}, + onHideBalances = {}, onSettings = {}, onQrScannerOpen = {}, goBalances = {}, @@ -105,7 +109,8 @@ private fun PreviewSendForm() { memoState = MemoState.new("Test message"), topAppBarSubTitleState = TopAppBarSubTitleState.None, walletSnapshot = WalletSnapshotFixture.new(), - balanceState = BalanceStateFixture.new() + balanceState = BalanceStateFixture.new(), + isHideBalances = false, ) } } @@ -118,6 +123,7 @@ private fun SendFormTransparentAddressPreview() { sendStage = SendStage.Form, onCreateZecSend = {}, onBack = {}, + onHideBalances = {}, onSettings = {}, onQrScannerOpen = {}, goBalances = {}, @@ -134,7 +140,8 @@ private fun SendFormTransparentAddressPreview() { memoState = MemoState.new("Test message"), topAppBarSubTitleState = TopAppBarSubTitleState.None, walletSnapshot = WalletSnapshotFixture.new(), - balanceState = BalanceStateFixture.new() + balanceState = BalanceStateFixture.new(), + isHideBalances = false, ) } } @@ -146,6 +153,8 @@ private fun SendFormTransparentAddressPreview() { @Composable fun Send( balanceState: BalanceState, + isHideBalances: Boolean, + onHideBalances: () -> Unit, sendStage: SendStage, onCreateZecSend: (ZecSend) -> Unit, onBack: () -> Unit, @@ -164,12 +173,15 @@ fun Send( ) { BlankBgScaffold(topBar = { SendTopAppBar( + isHideBalances = isHideBalances, + onHideBalances = onHideBalances, subTitleState = topAppBarSubTitleState, onSettings = onSettings ) }) { paddingValues -> SendMainContent( balanceState = balanceState, + isHideBalances = isHideBalances, walletSnapshot = walletSnapshot, onBack = onBack, sendStage = sendStage, @@ -197,6 +209,8 @@ fun Send( @Composable private fun SendTopAppBar( + isHideBalances: Boolean, + onHideBalances: () -> Unit, onSettings: () -> Unit, subTitleState: TopAppBarSubTitleState ) { @@ -219,6 +233,21 @@ private fun SendTopAppBar( ) } }, + navigationAction = { + TopAppBarHideBalancesNavigation( + contentDescription = stringResource(id = R.string.hide_balances_content_description), + iconVector = + ImageVector.vectorResource( + if (isHideBalances) { + R.drawable.ic_hide_balances_on + } else { + R.drawable.ic_hide_balances_off + } + ), + onClick = onHideBalances, + modifier = Modifier.testTag(CommonTag.HIDE_BALANCES_TOP_BAR_BUTTON) + ) + }, ) } @@ -226,6 +255,7 @@ private fun SendTopAppBar( @Composable private fun SendMainContent( balanceState: BalanceState, + isHideBalances: Boolean, walletSnapshot: WalletSnapshot, onBack: () -> Unit, goBalances: () -> Unit, @@ -246,6 +276,7 @@ private fun SendMainContent( SendForm( balanceState = balanceState, + isHideBalances = isHideBalances, walletSnapshot = walletSnapshot, recipientAddressState = recipientAddressState, onRecipientAddressChange = onRecipientAddressChange, @@ -278,6 +309,7 @@ private fun SendMainContent( @Composable private fun SendForm( balanceState: BalanceState, + isHideBalances: Boolean, walletSnapshot: WalletSnapshot, recipientAddressState: RecipientAddressState, onRecipientAddressChange: (String) -> Unit, @@ -311,6 +343,7 @@ private fun SendForm( BalanceWidget( balanceState = balanceState, + isHideBalances = isHideBalances, isReferenceToBalances = true, onReferenceClick = goBalances ) diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/sendconfirmation/view/SendConfirmationView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/sendconfirmation/view/SendConfirmationView.kt index fd3e15f1..28bf620e 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/sendconfirmation/view/SendConfirmationView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/sendconfirmation/view/SendConfirmationView.kt @@ -55,6 +55,7 @@ import co.electriccoin.zcash.ui.design.component.Small import co.electriccoin.zcash.ui.design.component.SmallTopAppBar import co.electriccoin.zcash.ui.design.component.StyledBalance import co.electriccoin.zcash.ui.design.component.Tiny +import co.electriccoin.zcash.ui.design.component.TopAppBarBackNavigation import co.electriccoin.zcash.ui.design.theme.ZcashTheme import co.electriccoin.zcash.ui.screen.sendconfirmation.SendConfirmationTag import co.electriccoin.zcash.ui.screen.sendconfirmation.model.SendConfirmationStage @@ -303,12 +304,13 @@ private fun SendConfirmationTopAppBar( SmallTopAppBar( subTitle = subTitle, titleText = stringResource(id = R.string.send_confirmation_multiple_error_title), - backText = stringResource(id = R.string.send_confirmation_multiple_error_back), - backContentDescriptionText = - stringResource( - id = R.string.send_confirmation_multiple_error_back_content_description - ), - onBack = onBack, + navigationAction = { + TopAppBarBackNavigation( + backText = stringResource(id = R.string.back_navigation).uppercase(), + backContentDescriptionText = stringResource(R.string.back_navigation_content_description), + onBack = onBack + ) + }, ) } } @@ -371,7 +373,11 @@ private fun SendConfirmationContent( Small(stringResource(R.string.send_confirmation_amount)) - BalanceWidgetBigLineOnly(parts = zecSend.amount.toZecStringFull().asZecAmountTriple()) + BalanceWidgetBigLineOnly( + parts = zecSend.amount.toZecStringFull().asZecAmountTriple(), + // We don't hide any balance in confirmation screen + isHideBalances = false + ) Spacer(modifier = Modifier.height(ZcashTheme.dimens.spacingDefault)) @@ -392,6 +398,8 @@ private fun SendConfirmationContent( // due to: "Smart cast to 'Proposal' is impossible, because 'zecSend.proposal' is a public API // property declared in different module. See more details on the Kotlin forum. balanceParts = zecSend.proposal!!.totalFeeRequired().toZecStringFull().asZecAmountTriple(), + // We don't hide any balance in confirmation screen + isHideBalances = false, textStyles = Pair( ZcashTheme.extendedTypography.balanceSingleStyles.first, diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/settings/view/SettingsView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/settings/view/SettingsView.kt index 49541a54..0e3d1229 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/settings/view/SettingsView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/settings/view/SettingsView.kt @@ -33,6 +33,7 @@ import co.electriccoin.zcash.ui.design.MINIMAL_WEIGHT import co.electriccoin.zcash.ui.design.component.BlankBgScaffold import co.electriccoin.zcash.ui.design.component.PrimaryButton import co.electriccoin.zcash.ui.design.component.SmallTopAppBar +import co.electriccoin.zcash.ui.design.component.TopAppBarBackNavigation import co.electriccoin.zcash.ui.design.theme.ZcashTheme import co.electriccoin.zcash.ui.design.theme.ZcashTheme.dimens import co.electriccoin.zcash.ui.screen.settings.SettingsTag @@ -128,9 +129,13 @@ private fun SettingsTopAppBar( }, modifier = Modifier.testTag(SettingsTag.SETTINGS_TOP_APP_BAR), showTitleLogo = true, - backText = stringResource(id = R.string.settings_back).uppercase(), - backContentDescriptionText = stringResource(R.string.settings_back_content_description), - onBack = onBack, + navigationAction = { + TopAppBarBackNavigation( + backText = stringResource(id = R.string.back_navigation).uppercase(), + backContentDescriptionText = stringResource(R.string.back_navigation_content_description), + onBack = onBack + ) + }, regularActions = { if (troubleshootingParameters.isEnabled) { TroubleshootingMenu( diff --git a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/view/SupportView.kt b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/view/SupportView.kt index e131b658..507d0ee2 100644 --- a/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/view/SupportView.kt +++ b/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/support/view/SupportView.kt @@ -38,6 +38,7 @@ import co.electriccoin.zcash.ui.design.component.FormTextField import co.electriccoin.zcash.ui.design.component.GridBgScaffold import co.electriccoin.zcash.ui.design.component.GridBgSmallTopAppBar import co.electriccoin.zcash.ui.design.component.PrimaryButton +import co.electriccoin.zcash.ui.design.component.TopAppBarBackNavigation import co.electriccoin.zcash.ui.design.theme.ZcashTheme @Preview @@ -141,9 +142,13 @@ private fun SupportTopAppBar( TopAppBarSubTitleState.None -> null }, titleText = stringResource(id = R.string.support_header), - backText = stringResource(id = R.string.support_back).uppercase(), - backContentDescriptionText = stringResource(R.string.support_back_content_description), - onBack = onBack, + navigationAction = { + TopAppBarBackNavigation( + backText = stringResource(id = R.string.back_navigation).uppercase(), + backContentDescriptionText = stringResource(R.string.back_navigation_content_description), + onBack = onBack + ) + }, ) } diff --git a/ui-lib/src/main/res/ui/about/values/strings.xml b/ui-lib/src/main/res/ui/about/values/strings.xml index ba784e67..33ca58ad 100644 --- a/ui-lib/src/main/res/ui/about/values/strings.xml +++ b/ui-lib/src/main/res/ui/about/values/strings.xml @@ -1,7 +1,5 @@ About - Back - Back Version %1$s App name: diff --git a/ui-lib/src/main/res/ui/advanced_settings/values/strings.xml b/ui-lib/src/main/res/ui/advanced_settings/values/strings.xml index a09af5cb..a048c4e9 100644 --- a/ui-lib/src/main/res/ui/advanced_settings/values/strings.xml +++ b/ui-lib/src/main/res/ui/advanced_settings/values/strings.xml @@ -1,7 +1,4 @@ - Back - Back - Recovery phrase Export private data Choose a server @@ -10,5 +7,4 @@ Delete %1$s (You will be asked to confirm on next screen) - diff --git a/ui-lib/src/main/res/ui/choose_server/values/strings.xml b/ui-lib/src/main/res/ui/choose_server/values/strings.xml index 70467845..ec5a354f 100644 --- a/ui-lib/src/main/res/ui/choose_server/values/strings.xml +++ b/ui-lib/src/main/res/ui/choose_server/values/strings.xml @@ -1,7 +1,4 @@ - Back - Back - Server default: %1$s custom diff --git a/ui-lib/src/main/res/ui/common/drawable/ic_hide_balances_off.xml b/ui-lib/src/main/res/ui/common/drawable/ic_hide_balances_off.xml new file mode 100644 index 00000000..3f9aed78 --- /dev/null +++ b/ui-lib/src/main/res/ui/common/drawable/ic_hide_balances_off.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/ui-lib/src/main/res/ui/common/drawable/ic_hide_balances_on.xml b/ui-lib/src/main/res/ui/common/drawable/ic_hide_balances_on.xml new file mode 100644 index 00000000..fde4655f --- /dev/null +++ b/ui-lib/src/main/res/ui/common/drawable/ic_hide_balances_on.xml @@ -0,0 +1,9 @@ + + + diff --git a/ui-lib/src/main/res/ui/common/values/strings.xml b/ui-lib/src/main/res/ui/common/values/strings.xml index ef000b58..25d98be8 100644 --- a/ui-lib/src/main/res/ui/common/values/strings.xml +++ b/ui-lib/src/main/res/ui/common/values/strings.xml @@ -2,12 +2,17 @@ zashi-ui + Back + Back + Unavailable - Zcash logo Open Settings Available Balance: + Hide balances + diff --git a/ui-lib/src/main/res/ui/delete_wallet/values/strings.xml b/ui-lib/src/main/res/ui/delete_wallet/values/strings.xml index 25241ee2..4545517d 100644 --- a/ui-lib/src/main/res/ui/delete_wallet/values/strings.xml +++ b/ui-lib/src/main/res/ui/delete_wallet/values/strings.xml @@ -1,7 +1,4 @@ - Back - Back - Delete %1$s @@ -23,5 +20,4 @@ Wallet deletion failed. Try it again, please. - diff --git a/ui-lib/src/main/res/ui/export_data/values/strings.xml b/ui-lib/src/main/res/ui/export_data/values/strings.xml index 1adec761..763d8c40 100644 --- a/ui-lib/src/main/res/ui/export_data/values/strings.xml +++ b/ui-lib/src/main/res/ui/export_data/values/strings.xml @@ -9,8 +9,6 @@ funds, only the ability to see what you do with your funds. Export private data I agree - Back - Back Share internal Zashi data with: Unable to find an application to share with. \ No newline at end of file diff --git a/ui-lib/src/main/res/ui/restore/values/strings.xml b/ui-lib/src/main/res/ui/restore/values/strings.xml index f511f3ce..c4d22b34 100644 --- a/ui-lib/src/main/res/ui/restore/values/strings.xml +++ b/ui-lib/src/main/res/ui/restore/values/strings.xml @@ -1,6 +1,4 @@ - Back - Back Clear Seed Enter secret recovery phrase @@ -14,5 +12,4 @@ Wallet birthday height (optional) Restore - diff --git a/ui-lib/src/main/res/ui/scan/values/strings.xml b/ui-lib/src/main/res/ui/scan/values/strings.xml index 0ef108d8..566eb201 100644 --- a/ui-lib/src/main/res/ui/scan/values/strings.xml +++ b/ui-lib/src/main/res/ui/scan/values/strings.xml @@ -1,6 +1,4 @@ - Back - Back Camera Cancel diff --git a/ui-lib/src/main/res/ui/security_warning/values/strings.xml b/ui-lib/src/main/res/ui/security_warning/values/strings.xml index ae9be6ab..4cae7ae0 100644 --- a/ui-lib/src/main/res/ui/security_warning/values/strings.xml +++ b/ui-lib/src/main/res/ui/security_warning/values/strings.xml @@ -1,7 +1,5 @@ Security warning: - Back - Back Zashi %1$s is a Zcash-only, shielded wallet — built by Zcashers for Zcashers. Zashi has been engineered for your diff --git a/ui-lib/src/main/res/ui/seed_recovery/values/strings.xml b/ui-lib/src/main/res/ui/seed_recovery/values/strings.xml index 4479997d..9951e17d 100644 --- a/ui-lib/src/main/res/ui/seed_recovery/values/strings.xml +++ b/ui-lib/src/main/res/ui/seed_recovery/values/strings.xml @@ -1,6 +1,4 @@ - Back - Back Your secret recovery phrase The following 24 words are the keys to your funds and are the only way to recover your funds if you get locked out or get a new device. Protect your ZEC by storing this phrase in a diff --git a/ui-lib/src/main/res/ui/send_confirmation/values/strings.xml b/ui-lib/src/main/res/ui/send_confirmation/values/strings.xml index 5b61dc24..070acdea 100644 --- a/ui-lib/src/main/res/ui/send_confirmation/values/strings.xml +++ b/ui-lib/src/main/res/ui/send_confirmation/values/strings.xml @@ -13,8 +13,6 @@ OK Transaction error - Back - Back Sending to this recipient required multiple transactions, but only some of them succeeded. Your funds are safe, but they need to be recovered with the help of Zashi team support. diff --git a/ui-lib/src/main/res/ui/settings/values/strings.xml b/ui-lib/src/main/res/ui/settings/values/strings.xml index 4eb18424..c45cf2a8 100644 --- a/ui-lib/src/main/res/ui/settings/values/strings.xml +++ b/ui-lib/src/main/res/ui/settings/values/strings.xml @@ -1,7 +1,4 @@ - Back - Back - Additional settings Rescan blockchain Background sync @@ -11,5 +8,4 @@ Send us feedback Advanced About - diff --git a/ui-lib/src/main/res/ui/support/values/strings.xml b/ui-lib/src/main/res/ui/support/values/strings.xml index 0950ae26..c0288536 100644 --- a/ui-lib/src/main/res/ui/support/values/strings.xml +++ b/ui-lib/src/main/res/ui/support/values/strings.xml @@ -1,7 +1,5 @@ Support - Back - Back How can we help? Send